changeset 8:9bfe38410155 draft

planemo upload for repository https://github.com/bgruening/galaxytools/tree/master/tools/bismark commit 51299fa62f0566a4a897b1c149db564631282fff
author bgruening
date Wed, 22 Aug 2018 08:09:42 -0400
parents fcadce4d9a06
children 1a88b0f2669f
files bismark2report_wrapper.py bismark2report_wrapper.xml bismark_bowtie2_wrapper.xml bismark_deduplicate/bismark_deduplicate_wrapper.py bismark_deduplicate/bismark_deduplicate_wrapper.xml bismark_deduplicate/deduplicate_bismark bismark_deduplicate_wrapper.py bismark_deduplicate_wrapper.xml bismark_mapping/bismark bismark_mapping/bismark_bowtie2_wrapper.xml bismark_mapping/bismark_genome_preparation bismark_mapping/bismark_wrapper.py bismark_methyl_extractor/bismark2bedGraph bismark_methyl_extractor/bismark_methylation_extractor bismark_methyl_extractor/bismark_methylation_extractor.py bismark_methyl_extractor/bismark_methylation_extractor.xml bismark_methyl_extractor/coverage2cytosine bismark_methylation_extractor.py bismark_methylation_extractor.xml bismark_pretty_report/bismark2report bismark_pretty_report/bismark2report_wrapper.py bismark_pretty_report/bismark2report_wrapper.xml bismark_pretty_report/bismark_sitrep.tpl bismark_wrapper.py documentation/Bismark_User_Guide.pdf documentation/readme.rst macros.xml new/bismark new/bismark_genome_preparation new/bismark_methylation_extractor old/bismark old/bismark_genome_preparation old/bismark_methylation_extractor test-data/bowtie1_singles_output_result1.bam test-data/bowtie1_singles_output_result2.bam test-data/bowtie1_singles_report_result1.txt test-data/bowtie1_singles_report_result2.txt test-data/bowtie1_singles_stdout_result1.txt test-data/bowtie1_singles_stdout_result2.txt test-data/bowtie1_singles_suppressed_reads_l_result2.txt test-data/bowtie1_singles_suppressed_reads_r_result2.txt test-data/bowtie1_singles_unmapped_reads_l_result2.txt test-data/bowtie1_singles_unmapped_reads_r_result2.txt test-data/bwa-mem-fastq1.fq test-data/bwa-mem-fastq2.fq test-data/bwa-mem-mt-genome.fa test-data/dedup_reads.bam test-data/dedup_report.txt test-data/input1.fq.gz test-data/mapped_reads.bam test-data/mapping_report.txt test-data/mm10.tiny.fa.gz test-data/output_html_report.html test-data/output_mbias_report.txt test-data/output_splitting_report.txt test-data/summary.txt tool_dependencies.xml
diffstat 47 files changed, 3642 insertions(+), 54267 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bismark2report_wrapper.py	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,71 @@
+#!/usr/bin/python
+
+import argparse
+import logging
+import subprocess
+import sys
+
+
+def stop_err(logger, msg):
+    logger.critical(msg)
+    sys.exit()
+
+
+def log_subprocess_output(logger, pipe):
+    for line in iter(pipe.readline, b''):
+        logger.debug(line.decode().rstrip())
+
+
+def get_arg():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--alignment_report', dest='alignment_report', action='store', metavar='alignment_report',
+                        type=str)
+    parser.add_argument('--dedup_report', dest='dedup_report', action='store', metavar='dedup_report', type=str)
+    parser.add_argument('--splitting_report', dest='splitting_report', action='store', metavar='splitting_report',
+                        type=str)
+    parser.add_argument('--mbias_report', dest='mbias_report', action='store', metavar='mbias_report', type=str)
+    parser.add_argument('--nucleotide_report', dest='nucleotide_report', action='store', metavar='nucleotide_report',
+                        type=str)
+    parser.add_argument('--output_html_report', dest='output_html_report', action='store', metavar='output_html_report',
+                        type=str)
+    parser.add_argument('--log_report', dest='log_report', action='store', metavar='log_report', type=str)
+    args = parser.parse_args()
+    return args
+
+
+def __main__():
+    args = get_arg()
+    logger = logging.getLogger('bismark_deduplicate_wrapper')
+    logger.setLevel(logging.DEBUG)
+    ch = logging.StreamHandler(sys.stdout)
+    if args.log_report:
+        ch.setLevel(logging.WARNING)
+        handler = logging.FileHandler(args.log_report)
+        handler.setLevel(logging.DEBUG)
+        logger.addHandler(handler)
+    else:
+        ch.setLevel(logging.DEBUG)
+    logger.addHandler(ch)
+
+    cmd = ['bismark2report', '--verbose', '--alignment_report', args.alignment_report,
+           '--output', args.output_html_report]
+
+    if args.dedup_report:
+        cmd.extend(['--dedup_report', args.dedup_report])
+    if args.splitting_report:
+        cmd.extend(['--splitting_report', args.splitting_report])
+    if args.mbias_report:
+        cmd.extend(['--mbias_report', args.mbias_report])
+    if args.nucleotide_report:
+        cmd.extend(['--nucleotide_report', args.nucleotide_report])
+
+    logger.info("Generating report with: '%s'", " ".join(cmd))
+    process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+    with process.stdout:
+        log_subprocess_output(logger, process.stdout)
+    exitcode = process.wait()
+    if exitcode != 0:
+        stop_err(logger, "Bismark pretty report error (also check the log file if any)!\n%s" % process.stderr)
+
+
+if __name__ == "__main__": __main__()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bismark2report_wrapper.xml	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,81 @@
+<tool id="bismark_pretty_report" name="Bismark Pretty Report" version="0.20.0" profile="17.01">
+    <description>Generates a graphical HTML report page from report outputs of Bismark</description>
+    <requirements>
+        <requirement type="package" version="0.20.0">bismark</requirement>
+        <requirement type="package" version="1.8">samtools</requirement>
+        <requirement type="package" version="2.3.4.2">bowtie2</requirement>
+    </requirements>
+    <command><![CDATA[
+        python '$__tool_directory__/bismark2report_wrapper.py'
+
+        --alignment_report '$alignment'
+
+        #if $additional_reports['dedup']:
+        	--dedup_report '$additional_reports["dedup"]'
+        #end if
+        #if $additional_reports['splitting']:
+            --splitting_report '$additional_reports["splitting"]'
+        #end if
+        #if $additional_reports['mbias']:
+            --mbias_report '$additional_reports["mbias"]'
+        #end if
+        #if $additional_reports['nucleotide']:
+            --nucleotide_report '$additional_reports["nucleotide"]'
+        #end if
+
+        --output_html_report '$output_html_report'
+
+        #if $separate_logfile:
+            --log_report '$log_report'
+        #end if
+]]>
+    </command>
+
+    <inputs>
+        <param name="alignment" type="data" format="txt" label="Submit a Bismark mapping report" optional="False"/>
+        <section name="additional_reports" title="Additional reports to include in the HTML page (optional)"
+                 expanded="True">
+            <param name="dedup" type="data" format="txt" label="Submit the corresponding Bismark deduplication report"
+                   optional="True" help="Optional output of the module *Bismark Deduplicate*"/>
+            <param name="splitting" type="data" format="txt" label="Submit the corresponding Bismark splitting report"
+                   optional="True" help="Optional output of the module *Bismark Methylation Extractor*"/>
+            <param name="mbias" type="data" format="txt" label="Submit the corresponding Bismark M-bias report"
+                   optional="True" help="Optional output of the module *Bismark Methylation Extractor*"/>
+            <param name="nucleotide" type="data" format="txt" label="Submit the corresponding Bismark nucleotide report"
+                   optional="True" help="Optional output of the module *Bismark Mapping*"/>
+        </section>
+        <param name="separate_logfile" type="boolean" truevalue="true" falsevalue="false" checked="False"
+               label="Create a separate logfile, otherwise logs are added to the dataset info."/>
+    </inputs>
+
+    <outputs>
+        <data name="output_html_report" format="html"
+              label="${tool.name} on ${on_string}: Download pretty html report"/>
+        <data name="log_report" format="txt" label="${tool.name} on ${on_string}: log report (tool stdout)">
+            <filter>( separate_logfile is True )</filter>
+        </data>
+    </outputs>
+
+    <tests>
+        <test>
+            <param name="alignment" value="mapping_report.txt" ftype="txt"/>
+            <param name="dedup" value="dedup_report.txt" ftype="txt"/>
+            <param name="splitting" value="output_splitting_report.txt" ftype="txt"/>
+            <param name="mbias" value="output_mbias_report.txt" ftype="txt"/>
+            <output name="output_html_report" file="output_html_report.html" ftype="html" lines_diff="8"/>
+        </test>
+    </tests>
+
+    <help>
+        <![CDATA[
+**What it does**
+
+    | This tool uses a Bismark alignment report to generate a graphical HTML report page.
+    | Optionally, further reports of the Bismark suite such as deduplication, methylation extractor splitting or M-bias reports can be specified as well.
+
+]]>
+    </help>
+    <citations>
+        <citation type="doi">10.1093/bioinformatics/btr167</citation>
+    </citations>
+</tool>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bismark_bowtie2_wrapper.xml	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,606 @@
+<tool id="bismark_bowtie2" name="Bismark Mapper" version="0.20.0" profile="18.01">
+    <description>Bisulfite reads mapper</description>
+    <requirements>
+        <requirement type="package" version="0.20.0">bismark</requirement>
+        <requirement type="package" version="1.8">samtools</requirement>
+        <requirement type="package" version="2.3.4.2">bowtie2</requirement>
+    </requirements>
+    <command><![CDATA[
+        python '$__tool_directory__/bismark_wrapper.py'
+
+        ## Change this to accommodate the number of threads you have available.
+        --num-threads "\${GALAXY_SLOTS:-4}"
+
+        ##
+        ## Bismark Genome Preparation, if desired.
+        ##
+
+        ## Handle reference file.
+        #if $refGenomeSource.genomeSource == "built_in_fasta":
+            --own-file '${refGenomeSource.built_in_fasta.fields.path}'
+        #else if $refGenomeSource.genomeSource == "history":
+            --own-file '$refGenomeSource["own_file"]'
+        #else:
+            --indexes-path '${refGenomeSource.built_in_indexes.fields.path}'
+        #end if
+
+        ##
+        ##  Input parameters
+        ##
+
+        #if $singlePaired.sPaired == "single":
+            --single-paired '$singlePaired.input_singles'
+
+            #if $singlePaired.input_singles.ext in ["fastq", "fastq.gz", "fastqillumina"]:
+                --phred64-quals
+                --fastq
+            #elif $singlePaired.input_singles.ext in ["fastqsanger", "fastqsanger.gz"]:
+                --fastq
+            #elif $singlePaired.input_singles.ext == "fasta":
+                --fasta
+            #end if
+        #else:
+            --mate-paired
+            #set $mate1 = list()
+            #set $mate2 = list()
+            #for $mate_pair in $singlePaired.mate_list
+                $mate1.append( str($mate_pair.input_mate1) )
+                $mate2.append( str($mate_pair.input_mate2) )
+            #end for
+
+            --mate1 #echo ','.join($mate1)
+            --mate2 #echo ','.join($mate2)
+
+            #for $mate_pair in $singlePaired.mate_list:
+                #if $mate_pair.input_mate1.ext == "fastqillumina":
+                    --phred64-quals
+                    --fastq
+                #elif $mate_pair.input_mate1.ext in "fastqsanger,fastqsanger.gz":
+                    --fastq
+                #elif $mate_pair.input_mate1.ext == "fasta":
+                    --fasta
+                #end if
+                #break
+            #end for
+
+            -I $singlePaired.minInsert
+            -X $singlePaired.maxInsert
+        #end if
+
+        #if $sort_bam:
+            --sort-bam
+        #end if
+
+        ## for now hardcode the value for the required memory per thread in --best mode
+        --chunkmbs 512
+
+
+        #if $params.settingsType == "custom":
+
+            ## default 20
+            --seed-len $params.seed_len
+            ## default 0
+            --seed-mismatches $params.seed_mismatches
+            ## default 15
+            --seed-extention-attempts $params.seed_extention_attempts
+            ## default 2
+            --max-reseed $params.max_reseed
+
+            ## default 70
+            ##--maqerr $params.maqerr
+
+            ## default unlimited
+            #if $params.qupto != 0:
+                --qupto $params.qupto
+            #end if
+            #if $params.skip_reads != 0:
+                --skip-reads $params.skip_reads
+            #end if
+
+            ## if set, disable the original behaviour
+            $params.no_mixed
+            ## if set, disable the original behaviour
+            $params.no_discordant
+
+            #if $params.bismark_stdout:
+                --stdout '$output_stdout'
+            #end if
+
+            #if $params.isReportOutput:
+                --output-report-file '$report_file'
+            #end if
+
+        #else:
+          --output-report-file '$report_file'
+        #end if
+
+      ##
+      ## Output parameters.
+      ##
+      --output '$output'
+      ##$suppress_header
+
+      #if str( $singlePaired.sPaired ) == "single"
+        #if $output_unmapped_reads_l
+          --output-unmapped-reads '$output_unmapped_reads_l'
+        #end if
+        #if $output_suppressed_reads_l
+          --output-suppressed-reads '$output_suppressed_reads_l'
+        #end if
+      #else
+        #if $output_unmapped_reads_l and $output_unmapped_reads_r
+          --output-unmapped-reads-l '$output_unmapped_reads_l'
+          --output-unmapped-reads-r '$output_unmapped_reads_r'
+        #end if
+        #if $output_suppressed_reads_l and $output_suppressed_reads_l
+          --output-suppressed-reads-l '$output_suppressed_reads_l'
+          --output-suppressed-reads-r '$output_suppressed_reads_r'
+        #end if
+      #end if
+
+]]>
+    </command>
+    <inputs>
+        <conditional name="refGenomeSource">
+            <param name="genomeSource" type="select"
+                   label="Will you select a reference genome from your history or use a built-in index?"
+                   help="Built-ins were indexed using default options">
+                <option value="built_in_indexes" selected="true">Use built-in Bismark indexes</option>
+                <option value="built_in_fasta">Generate Bismark indexes from built-in Reference Genome (fasta)</option>
+                <option value="history">Generate Bismark indexes from Genome (fasta) in your Galaxy history</option>
+            </param>
+            <when value="built_in_indexes">
+                <param name="built_in_indexes" type="select" label="Select Reference Genome (bismark indexes)"
+                       help="If your genome of interest is not listed, contact your Galaxy admin">
+                    <options from_data_table="bismark_indexes">
+                        <filter type="sort_by" column="name"/>
+                        <validator type="no_options" message="No indexes are available for the selected input dataset"/>
+                    </options>
+                </param>
+            </when>
+            <when value="built_in_fasta">
+                <param name="built_in_fasta" type="select" label="Select Reference Genome (fasta)">
+                    <options from_data_table="all_fasta">
+                        <filter type="sort_by" column="name"/>
+                        <validator type="no_options"
+                                   message="No genomes in fasta are available for the selected input dataset"/>
+                    </options>
+                </param>
+            </when>
+            <when value="history">
+                <param name="own_file" type="data" format="fasta" label="Select the reference genome"/>
+            </when>
+        </conditional>
+
+        <!-- Input Parameters -->
+        <conditional name="singlePaired">
+            <param name="sPaired" type="select" label="Is this library mate-paired?">
+                <option value="single">Single-end</option>
+                <option value="paired">Paired-end</option>
+            </param>
+            <when value="single">
+                <param name="input_singles" type="data"
+                       format="fastqsanger,fastqillumina,fastq,fasta,fastq.gz,fastqsanger.gz" label="FASTQ/FASTA file"
+                       help="FASTQ or FASTA files."/>
+            </when>
+            <when value="paired">
+                <repeat name="mate_list" title="Paired End Pairs" min="1">
+                    <param name="input_mate1" type="data"
+                           format="fastqsanger,fastqillumina,fastq,fasta,fastq.gz,fastqsanger.gz" label="Mate pair 1"
+                           help="FASTQ or FASTA files."/>
+                    <param name="input_mate2" type="data"
+                           format="fastqsanger,fastqillumina,fastq,fasta,fastq.gz,fastqsanger.gz" label="Mate pair 2"
+                           help="FASTQ or FASTA files."/>
+                </repeat>
+                <param name="minInsert" type="integer" value="0"
+                       label="Minimum insert size for valid paired-end alignments"/>
+                <param name="maxInsert" type="integer" value="500"
+                       label="Maximum insert size for valid paired-end alignments"/>
+            </when>
+        </conditional>
+
+        <param name="sort_bam" type="boolean" truevalue="true" falsevalue="false" checked="False"
+               label="Sort BAM file by chromosomal position (not compatibile with methylation extractor)"/>
+
+        <conditional name="params">
+            <param name="settingsType" type="select" label="Bismark settings to use"
+                   help="You can use the default settings or set custom values for any of Bismark's parameters.">
+                <option value="default">Use Defaults</option>
+                <option value="custom">Full parameter list</option>
+            </param>
+            <!-- Full/advanced params. -->
+            <when value="dafault"></when>
+            <when value="custom">
+                <!-- -N -->
+                <param name="seed_mismatches" type="integer" value="0"
+                       label="Number of mismatches to be allowed in a seed alignment during multiseed alignment"/>
+                <!-- -L -->
+                <param name="seed_len" type="integer" value="20"
+                       label="Length of the seed substrings to align during multiseed alignment"/>
+                <!--
+                <param name="maqerr" type="integer" value="70" label="Maximum permitted total of quality values at all mismatched read positions throughout the entire alignment, not just in the 'seed'." />
+                -->
+                <!-- -D -->
+                <param name="seed_extention_attempts" type="integer" value="15"
+                       label="How many consecutive seed extension attempts can fail before Bowtie 2 moves on"/>
+                <!-- -R -->
+                <param name="max_reseed" type="integer" value="2"
+                       label="Maximum number of times Bowtie 2 will re-seed reads with repetitive seeds"/>
+
+                <param name="qupto" type="integer" value="0"
+                       label="Only aligns the first N reads or read pairs from the input"
+                       help="Default is 0 and means 'no-limit'."/>
+                <param name="skip_reads" type="integer" value="0"
+                       label="Skip (i.e. do not align) the first N reads or read pairs from the input"/>
+
+                <param name="no_discordant" type="boolean" truevalue="--no-discordant" falsevalue="" checked="false"
+                       label="Disable looking for discordant alignments if it cannot find any concordant alignments (only for paired-end reads)"
+                       help=""/>
+                <param name="no_mixed" type="boolean" truevalue="--no-mixed" falsevalue="" checked="false"
+                       label="Disable Bowtie 2's behaviour to try to find alignments for the individual mates (only for paired-end reads"
+                       help=""/>
+
+                <param name="suppressed_read_file" type="boolean" truevalue="true" falsevalue="false" checked="false"
+                       label="Write ambiguous reads to an extra output file"
+                       help="Write all reads which produce more than one valid alignment with the same number of lowest mismatches or other reads that fail to align uniquely."/>
+                <param name="unmapped_read_file" type="boolean" truevalue="true" falsevalue="false" checked="false"
+                       label="Write all reads that could not be aligned to a file"/>
+                <!-- output Options -->
+                <param name="bismark_stdout" type="boolean" truevalue="true" falsevalue="false" checked="false"
+                       label="Write the bismark output and summary information to an extra file"/>
+                <param name="isReportOutput" type="boolean" truevalue="true" falsevalue="false" checked="true"
+                       label="Offer all report files concatenated in one file (Mapping Report)"/>
+
+                <!--end output options -->
+            </when>  <!-- full -->
+        </conditional>  <!-- params -->
+        <!--
+        <param name="suppress_header" type="boolean" truevalue="..suppress-header" falsevalue="" checked="false" label="Suppress the header in the output SAM file" help="Bowtie produces SAM with several lines of header information by default." />
+          -->
+    </inputs>
+
+
+    <outputs>
+        <data format="txt" name="report_file" label="${tool.name} on ${on_string}: mapping report">
+            <filter>
+                ((
+                params['settingsType'] == "default" or
+                ( params['settingsType'] == "custom" and
+                params['isReportOutput'] is True )
+                ))
+            </filter>
+        </data>
+        <data format="txt" name="output_stdout" label="${tool.name} on ${on_string}: Summary">
+            <filter>
+                ((
+                params['settingsType'] == "custom" and
+                params['bismark_stdout'] is True
+                ))
+            </filter>
+        </data>
+
+        <data format="qname_input_sorted.bam" name="output" label="${tool.name} on ${on_string}: mapped reads">
+            <actions>
+                <conditional name="refGenomeSource.genomeSource">
+                    <when value="built_in_indexes">
+                        <action type="metadata" name="dbkey">
+                            <option type="from_data_table" name="bismark_indexes" column="1" offset="0">
+                                <filter type="param_value" column="0" value="#" compare="startswith" keep="False"/>
+                                <filter type="param_value" ref="refGenomeSource.built_in_indexes" column="0"/>
+                            </option>
+                        </action>
+                    </when>
+                    <when value="generate_indexes">
+                        <action type="metadata" name="dbkey">
+                            <option type="from_data_table" name="all_fasta" column="1" offset="0">
+                                <filter type="param_value" column="0" value="#" compare="startswith" keep="False"/>
+                                <filter type="param_value" ref="refGenomeSource.generate_indexes" column="0"/>
+                            </option>
+                        </action>
+                    </when>
+                </conditional>
+            </actions>
+            <change_format>
+                <when input="sort_bam" value="true" format="bam"/>
+                <when input="sort_bam" value="false" format="qname_input_sorted.bam"/>
+            </change_format>
+        </data>
+
+        <data format="fastq" name="output_suppressed_reads_l"
+              label="${tool.name} on ${on_string}: suppressed reads (L)">
+            <filter>
+                ((
+                params['settingsType'] == "custom" and
+                params['suppressed_read_file'] is True
+                ))
+            </filter>
+            <actions>
+                <conditional name="singlePaired.sPaired">
+                    <when value="single">
+                        <action type="format">
+                            <option type="from_param" name="singlePaired.input_singles" param_attribute="ext"/>
+                        </action>
+                    </when>
+                </conditional>
+            </actions>
+        </data>
+
+        <data format="fastq" name="output_suppressed_reads_r"
+              label="${tool.name} on ${on_string}: suppressed reads (R)">
+            <filter>
+                ((
+                singlePaired['sPaired'] == "paired" and
+                params['settingsType'] == "custom" and
+                params['suppressed_read_file'] is True
+                ))
+            </filter>
+            <actions>
+                <conditional name="singlePaired.sPaired">
+                    <when value="single">
+                        <action type="format">
+                            <option type="from_param" name="singlePaired.input_singles" param_attribute="ext"/>
+                        </action>
+                    </when>
+                    <!--when value="paired">
+                        <action type="format">
+                          <option type="from_param" name="singlePaired.mate_list[0].input_mate1" param_attribute="ext" />
+                        </action>
+                    </when-->
+                </conditional>
+            </actions>
+        </data>
+
+        <!-- Outout unmapped reads -->
+        <data format="fastq" name="output_unmapped_reads_l" label="${tool.name} on ${on_string}: unmapped reads (L)">
+            <filter>
+                ((
+                params['settingsType'] == "custom" and
+                params['unmapped_read_file'] is True
+                ))
+            </filter>
+            <actions>
+                <conditional name="singlePaired.sPaired">
+                    <when value="single">
+                        <action type="format">
+                            <option type="from_param" name="singlePaired.input_singles" param_attribute="ext"/>
+                        </action>
+                    </when>
+                    <!--when value="paired">
+                        <action type="format">
+                          <option type="from_param" name="singlePaired.mate_list[0].input_mate1" param_attribute="ext" />
+                        </action>
+                    </when-->
+                </conditional>
+            </actions>
+        </data>
+        <data format="fastq" name="output_unmapped_reads_r" label="${tool.name} on ${on_string}: unmapped reads (R)">
+            <filter>
+                ((
+                singlePaired['sPaired'] == "paired" and
+                params['settingsType'] == "custom" and
+                params['unmapped_read_file'] is True
+                ))
+            </filter>
+            <actions>
+                <conditional name="singlePaired.sPaired">
+                    <when value="single">
+                        <action type="format">
+                            <option type="from_param" name="singlePaired.input_singles" param_attribute="ext"/>
+                        </action>
+                    </when>
+                    <!--when value="paired">
+                        <action type="format">
+                          <option type="from_param" name="singlePaired.mate_list[0].input_mate1" param_attribute="ext" />
+                        </action>
+                    </when-->
+                </conditional>
+            </actions>
+        </data>
+    </outputs>
+    <tests>
+        <test>
+            <param name="genomeSource" value="history"/>
+            <param name="own_file" value="mm10.tiny.fa.gz" />
+            <param name="sPaired" value="single"/>
+            <param name="input_singles" value="input1.fq.gz" ftype="fastqsanger"/>
+            <param name="sort_bam" value="false"/>
+            <param name="settingsType" value="custom"/>
+            <param name="suppressed_read_file" value="true"/>
+            <param name="unmapped_read_file" value="true"/>
+            <param name="bismark_stdout" value="true"/>
+            <param name="isReportOutput" value="true"/>
+
+            <output name="output_stdout" file="summary.txt" ftype="txt" lines_diff="80">
+                 <assert_contents>
+                     <has_text text="Sequences analysed in total:" />
+                     <has_text text="44115" />
+                     <has_text text="Mapping efficiency:" />
+                     <has_text text="1.3%" />
+                     <has_text text="Bismark run complete" />
+                 </assert_contents>
+            </output>
+            <output name="report_file" file="mapping_report.txt" ftype="txt" lines_diff="6"/>
+            <output name="output" file="mapped_reads.bam" ftype="qname_input_sorted.bam" lines_diff="14"/>
+        </test>
+    </tests>
+
+    <help>
+        <![CDATA[
+
+**What it does**
+
+  | Bismark_ is a bisulfite mapper and methylation caller. Bismark takes in FastA or FastQ files and aligns the reads to a specified bisulfite genome.
+  | Sequence reads are transformed into a bisulfite converted forward strand version (C->T conversion) or into a bisulfite treated reverse strand (G->A conversion of the forward strand).
+  | Each of these reads are then aligned to bisulfite treated forward strand index of a reference genome (C->T converted) and a bisulfite treated reverse strand index of the genome (G->A conversion of the forward strand, by doing this alignments will produce the same positions).
+  | These instances of Bowtie 2 are run in parallel. The sequence file(s) are then read in again sequence by sequence to pull out the original sequence from the genome and determine if there were any protected C's present or not.
+  |
+  | As of version 0.7.0 Bismark will only run 2 alignment threads for OT and OB in parallel, the 4 strand mode can be re-enabled by using non_directional mode.
+  |
+  | It is developed by Krueger F and Andrews SR. at the Babraham Institute. Krueger F, Andrews SR. (2011) Bismark: a flexible aligner and methylation caller for Bisulfite-Seq applications. Bioinformatics, 27, 1571-2.
+
+.. _Bismark: http://www.bioinformatics.babraham.ac.uk/projects/bismark/
+
+----
+
+**Know what you are doing**
+
+  .. class:: warningmark
+
+  | There is no such thing (yet) as an automated gearshift in short read mapping. It is all like stick-shift driving in San Francisco.
+  | In other words = running this tool with default parameters will probably not give you meaningful results.
+  | A way to deal with this is to **understand** the parameters by carefully reading the `documentation`__ and experimenting. Fortunately, Galaxy makes experimenting easy.
+  |
+
+  .. class:: warningmark
+
+  | Make sure all your input reads are in the correct and same format. If thats not the case please adjust/convert the filetype with galaxy's build-in converters.
+
+.. __: http://www.bioinformatics.babraham.ac.uk/projects/bismark/
+
+----
+
+**Input formats**
+
+  | Bismark accepts files in either Sanger FASTQ format (galaxy type *fastqsanger*), Illumina FASTQ format (galaxy type *fastqillumina*) or FASTA format (galaxy type *fasta*). Use the FASTQ Groomer to prepare your files.
+
+----
+
+**A Note on Built-in Reference Genomes**
+
+  | The default variant for all genomes is "Full", defined as all primary chromosomes (or scaffolds/contigs) including mitochondrial plus associated unmapped, plasmid, and other segments.
+  | When only one version of a genome is available in this tool, it represents the default "Full" variant. Some genomes will have more than one variant available.
+  | The "Canonical Male" or sometimes simply "Canonical" variant contains the primary chromosomes for a genome. For example a human "Canonical" variant contains chr1-chr22, chrX, chrY, and chrM. The "Canonical Female" variant contains the primary chromosomes excluding chrY.
+
+----
+
+**Outputs**
+
+* The final output of Bismark is in SAM format by default, and has the following columns::
+
+      Column  Description
+    --------  --------------------------------------------------------
+    1  QNAME  seq-ID
+    2  FLAG   this flag tries to take the strand a bisulfite read
+              originated from into account
+              (this is different from ordinary DNA alignment flags!)
+    3  RNAME  chromosome
+    4  POS    start position
+    5  MAPQ   always 255
+    6  CIGAR  extended CIGAR string
+    7  MRNM   Mate Reference sequence NaMe ('=' if same as RNAME)
+    8  MPOS   1-based Mate POSition
+    9  ISIZE  Inferred insert SIZE
+    10 SEQ    query SEQuence on the same strand as the reference
+    11 QUAL   Phred33 scale
+    12 NM-tag edit distance to the reference)
+    13 XX-tag base-by-base mismatches to the reference.
+              This does not include indels.
+    14 XM-tag methylation call string
+    15 XR-tag read conversion state for the alignment
+    16 XG-tag genome conversion state for the alignment
+
+
+  | Each read of paired-end alignments is written out in a separate line in the above format.
+  |
+
+* It looks like this (scroll sideways to see the entire example)::
+
+    QNAME	FLAG	RNAME	POS	MAPQ	CIAGR	MRNM	MPOS	ISIZE	SEQ	QUAL	OPT
+    HWI-EAS91_1_30788AAXX:1:1:1761:343	4	*	0	0	*	*	0	0	AAAAAAANNAAAAAAAAAAAAAAAAAAAAAAAAAAACNNANNGAGTNGNNNNNNNGCTTCCCACAGNNCTGG	hhhhhhh;;hhhhhhhhhhh^hOhhhhghhhfhhhgh;;h;;hhhh;h;;;;;;;hhhhhhghhhh;;Phhh
+    HWI-EAS91_1_30788AAXX:1:1:1578:331	4	*	0	0	*	*	0	0	GTATAGANNAATAAGAAAAAAAAAAATGAAGACTTTCNNANNTCTGNANNNNNNNTCTTTTTTCAGNNGTAG	hhhhhhh;;hhhhhhhhhhhhhhhhhhhhhhhhhhhh;;h;;hhhh;h;;;;;;;hhhhhhhhhhh;;hhVh
+
+----
+
+**Note on Bismark settings**
+
+  | All of the options have a default value. You can change any of them. If any Bismark function is missing please contact the tool author or your Galaxy admin.
+
+----
+
+**Bismark settings**
+
+* **If Paired-End Reads**
+
+  * **Minimum insert size for valid paired-end alignments**
+
+      | The minimum insert size for valid paired-end alignments. E.g. if -I 60 is specified and a paired-end alignment consists of two 20-bp alignments in the appropriate orientation with a 20-bp gap between them, that alignment is considered valid (as long as -X is also satisfied). A 19-bp gap would not be valid in that case. Default: 0.
+      |
+      | Alignment option *-I/--minins <INT>*
+
+
+  * **Maximum insert size for valid paired-end alignments**
+
+      |  The maximum insert size for valid paired-end alignments. E.g. if -X 100 is specified and a paired-end alignment consists of two 20-bp alignments in the proper orientation with a 60-bp gap between them, that alignment is considered valid (as long as -I is also satisfied). A 61-bp gap would not be valid in that case. Default: 500.
+      |
+      | Alignment option *-X/--maxins <INT>*
+
+
+* **Number of mismatches to be allowed in a seed alignment during multiseed alignment**
+
+    | Sets the number of mismatches to allowed in a seed alignment during multiseed alignment. Can be set to 0 or 1. Setting this higher makes alignment slower (often much slower) but increases sensitivity. Default: 0. This option is only available for Bowtie 2 (for Bowtie 1 see -n).
+    |
+    | Bowtie 2 Specific option *-N <INT>*
+
+* **Length of the seed substrings to align during multiseed alignment**
+
+    | Sets the length of the seed substrings to align during multiseed alignment. Smaller values make alignment slower but more senstive. Default: the --sensitive preset of Bowtie 2 is used by default, which sets -L to 20. This option is only available for Bowtie 2 (for Bowtie 1 see -l).
+    |
+    | Bowtie 2 Specific option *-L <INT>*
+
+
+* **How many consecutive seed extension attempts can fail before Bowtie 2 moves on**
+
+    | Up to <int> consecutive seed extension attempts can "fail" before Bowtie 2 moves on, using the alignments found so far. A seed extension "fails" if it does not yield a new best or a new second-best alignment. Default: 15.
+    |
+    | Bowtie 2 Effort option *-D <INT>*
+
+* **Maximum number of times Bowtie 2 will re-seed reads with repetitive seeds**
+
+    | <int> is the maximum number of times Bowtie 2 will "re-seed" reads with repetitive seeds. When "re-seeding," Bowtie 2 simply chooses a new set of reads (same length, same number of mismatches allowed) at different offsets and searches for more alignments. A read is considered to have repetitive seeds if the total number of seed hits divided by the number of seeds that aligned at least once is greater than 300. Default: 2.
+    |
+    | Bowtie 2 Effort option *-R <INT>*
+
+* **Only aligns the first N reads or read pairs from the input**
+
+    | Only aligns the first <int> reads or read pairs from the input. Default: no limit.
+    |
+    | Input option *-u/--upto <INT>*
+
+* **Skip (i.e. do not align) the first N reads or read pairs from the input**
+
+    | Input option *-s/--skip*
+
+* **Disable looking for discordant alignments if it cannot find any concordant alignments**
+
+    | Normally, Bowtie 2 looks for discordant alignments if it cannot find any concordant alignments. A discordant alignment is an alignment where both mates align uniquely, but that does not satisfy the paired-end constraints (--fr/--rf/--ff, -I, -X). This option disables that behavior and it is on by default.
+    |
+    | Bowtie 2 Paired-End option *--no-discordant*
+
+* **Disable Bowtie 2's behaviour to try to find alignments for the individual mates**
+
+    | This option disables Bowtie 2's behavior to try to find alignments for the individual mates if it cannot find a concordant or discordant alignment for a pair. This option is invariable and on by default.
+    |
+    | Bowtie 2 Paired-End option *--no-mixed*
+
+* **Write ambiguous reads to an extra output file**
+
+    | Write all reads which produce more than one valid alignment with the same number of lowest mismatches or other reads that fail to align uniquely to a file in the output directory. Written reads will appear as they did in the input, without any of the translation of quality values that may have taken place within Bowtie or Bismark. Paired-end reads will be written to two parallel files with _1 and _2 inserted in theit filenames, i.e. _ambiguous_reads_1.txt and _ambiguous_reads_2.txt. These reads are not written to the file specified with --un.
+    |
+    | Output option *--ambiguous*
+
+* **Write all reads that could not be aligned to a file**
+
+    | Write all reads that could not be aligned to a file in the output directory. Written reads will appear as they did in the input, without any translation of quality values that may have taken place within Bowtie or Bismark. Paired-end reads will be written to two parallel files with _1 and _2 inserted in their filenames, i.e. _unmapped_reads_1.txt and unmapped_reads_2.txt. Reads with more than one valid alignment with the same number of lowest mismatches (ambiguous mapping) are also written to _unmapped_reads.txt unless the option --ambiguous is specified as well.
+    |
+    | Output option *-un/--unmapped*
+
+* **Offer all report files concatenated in one file**
+
+    | Prints out a Bismark mapping report
+
+]]>
+    </help>
+    <citations>
+        <citation type="doi">10.1093/bioinformatics/btr167</citation>
+    </citations>
+</tool>
--- a/bismark_deduplicate/bismark_deduplicate_wrapper.py	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,66 +0,0 @@
-#!/usr/bin/python
-
-import argparse
-import os
-import re
-import shutil
-import subprocess
-import sys
-import tempfile
-import logging
-from glob import glob
-
-def cleanup_before_exit(tmp_dir):
-    if tmp_dir and os.path.exists(tmp_dir):
-        shutil.rmtree(tmp_dir)
-
-def get_arg():
-    parser = argparse.ArgumentParser()
-    parser.add_argument('--tool_dir', dest='tool_dir', action='store', nargs=1, metavar='tool_dir', type=str)
-    parser.add_argument('-p', action='store_true')
-    parser.add_argument('-s', action='store_true')
-    parser.add_argument('--input', dest='input', action='store', nargs=1, metavar='input', type=str)
-    parser.add_argument('--output_report', dest='output_report', action='store', nargs=1, metavar='output_report', type=str)
-    parser.add_argument('--output_bam', dest='output_bam', action='store', nargs=1, metavar='output_report', type=str)
-    parser.add_argument('--log_report', dest='log_report', action='store', nargs=1, metavar='log_filename', type=str)
-    args = parser.parse_args()
-    return args
-
-def __main__():
-    args = get_arg()
-
-    tmp_dir = tempfile.mkdtemp(prefix='tmp', suffix='')
-    os.chdir(tmp_dir)
-
-    if args.log_report:
-        logging.basicConfig(level=logging.INFO, filename=args.log_report[0], filemode="a+", format='%(message)s')
-    else:
-        logging.basicConfig(level=logging.INFO, filename=os.path.join(tmp_dir, 'log_report.txt'), filemode="a+", format='%(message)s')
-
-    default_reads_name = 'submitted_reads.bam'
-    os.symlink(args.input[0], default_reads_name)
-
-    if args.p is True:
-        sPaired = '-p'
-    if args.s is True:
-        sPaired = '-s'
-
-    cmd = 'perl %s %s duplicated_reads.bam --bam' % (os.path.join(args.tool_dir[0], 'deduplicate_bismark'), sPaired)
-    logging.info('COMMAND LINE:\n\n%s' % cmd)
-
-    proc = subprocess.Popen(['perl', os.path.join(args.tool_dir[0], 'deduplicate_bismark'), sPaired, default_reads_name, '--bam'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    proc_out, proc_err = proc.communicate()
-
-    logging.info("__________________________________________________________________\n")
-    logging.info("BISMARK DEDUPLICATE STDOUT:\n\n%s" % proc_out)
-    if proc_err:
-        logging.critical("__________________________________________________________________\n")
-        logging.critical("BISMARK DEDUPLICATE WARNING:\n\n%s" % proc_err)
-        sys.exit("Dedpulicate Bismark crashed with the folowing error message:\n%s" % proc_err)
-
-    shutil.move( glob('*deduplicated.bam')[0], args.output_bam[0] )
-    shutil.move( glob('*deduplication_report.txt')[0], args.output_report[0])
-
-    cleanup_before_exit(tmp_dir)
-
-if __name__=="__main__": __main__()
\ No newline at end of file
--- a/bismark_deduplicate/bismark_deduplicate_wrapper.xml	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,69 +0,0 @@
-<tool id="bismark_deduplicate" name="Bismark Deduplicate" version="0.16.3">
-
-    <description>Deduplicates reads mapped by Bismark</description>
-    <!--<version_command>bismark version</version_command>-->
-
-    <requirements>
-        <requirement type="package" version="0.1.19">samtools</requirement>
-        <requirement type="package" version="2.1.0">bowtie2</requirement>
-    </requirements>
-
-    <stdio>
-        <exit_code range="1:" />
-        <exit_code range=":-1" />
-        <regex match="Error:" />
-        <regex match="Exception:" />
-    </stdio>
-
-    <command interpreter="python">
-<![CDATA[
-        bismark_deduplicate_wrapper.py
-
-        --tool_dir "$__tool_directory__"
-
-        #if str ( $sPaired ) == "single":
-        	-s
-        #else
-        	-p
-        #end if
-
-        --input "$mapping_output"
-
-        --output_report "$output_report"
-        --output_bam "$output_bam"
-
-        ##--log_report "$log_report"
-]]>
-    </command>
-
-    <inputs>
-        <param name="sPaired" type="select" label="Is this library mate-paired?" format="bam">
-            <option value="single">Single-end</option>
-            <option value="paired">Paired-end</option>
-        </param>
-        <param name="mapping_output" type="data" format="bam, sam" label="Submit the resulting bam/sam file from Bismark bisulfite mapper" />
-    </inputs>
-
-    <outputs>
-        <data name="output_bam" format="bam" label="${tool.name} on ${on_string}: deduplicated mapped reads" />
-        <data name="output_report" format="txt" label="${tool.name} on ${on_string}: deduplication report"/>
-        <!--<data name="log_report" format="txt" label="${tool.name} on ${on_string}: log report (tool stdout)"/>-->
-    </outputs>
-
-    <help>
-<![CDATA[
-**What it does**
-
-	| This tool is supposed to remove alignments to the same position in the genome from the Bismark mapping output (both single and paired-end SAM files), which can arise by e.g. excessive PCR amplification. If sequences align to the same genomic position but on different strands they will be scored individually.
-	|
-	| Note that deduplication is not recommended for RRBS-type experiments!
-	|
-	| For single-end alignments only use the start-coordinate of a read will be used for deduplication.
-	| For paired-end alignments the start-coordinate of the first read and the end coordinate of the second read will be used for deduplication. 
-
-]]>
-  </help>
-  <citations>
-      <citation type="doi">10.1093/bioinformatics/btr167</citation>
-  </citations>
-</tool>
\ No newline at end of file
--- a/bismark_deduplicate/deduplicate_bismark	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1272 +0,0 @@
-#!/usr/bin/env perl
-use strict;
-use warnings;
-use Getopt::Long;
-
-
-### This script is supposed to remove alignments to the same position in the genome which can arise by e.g. PCR amplification
-### Paired-end alignments are considered a duplicate if both partner reasd start and end at the exact same position
-
-### May 13, 2013
-### Changed the single-end trimming behavior so that only the start coordinate will be used. This avoids duplicate reads that have been trimmed to a varying extent
-### Changed the way of determining the end of reads in SAM format to using the CIGAR string if the read contains InDels
-
-### 16 July 2013
-### Adding a new deduplication mode for barcoded RRBS-Seq
-
-### 27 Sept 2013
-### Added close statement for all output filehandles (which should probably have been there from the start...)
-
-### 8 Jan 2015
-### to detect paired-end command from the @PG line we are no requiring spaces before and after the -1 or -2
-
-### 09 Mar 2015
-### Removing newline characters also from the read conversion flag in case the tags had been reordered and are now present in the very last column
-
-### 19 08 2015
-### Hiding the option --representative from view to discourage people from using it (it was nearly always not what they wanted to do anyway). It should still work 
-### for alignments that do not contain any indels
-### Just for reference, here is the the text:
-### print "--representative\twill browse through all sequences and print out the sequence with the most representative (as in most frequent) methylation call for any given position. Note that this is very likely the most highly amplified PCR product for a given sequence\n\n";
-
-
-my $dedup_version = 'v0.16.3';
-
-my $help;
-my $representative;
-my $single;
-my $paired;
-my $global_single;
-my $global_paired;
-my $vanilla;
-my $samtools_path;
-my $bam;
-my $rrbs;
-my $version;
-
-my $command_line = GetOptions ('help' => \$help,
-			       'representative' => \$representative,
-			       's|single' => \$global_single,
-			       'p|paired' => \$global_paired,
-			       'vanilla' => \$vanilla,
-			       'samtools_path=s' => \$samtools_path,
-			       'bam' => \$bam,
-			       'barcode' => \$rrbs,
-			       'version' => \$version,
-			      );
-
-die "Please respecify command line options\n\n" unless ($command_line);
-
-if ($help){
-  print_helpfile();
-  exit;
-}
-
-if ($version){
-  print << "VERSION";
-
-                           Bismark Deduplication Module
-
-                          Deduplicator Version: $dedup_version
-              Copyright 2010-16 Felix Krueger, Babraham Bioinformatics
-                www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-
-VERSION
-    exit;
-  }
-
-
-
-my @filenames = @ARGV;
-
-unless (@filenames){
-  print "Please provide one or more Bismark output files for deduplication\n\n";
-  sleep (2);
-  print_helpfile();
-  exit;
-}
-
-
-### OPTIONS
-unless ($global_single or $global_paired){
-  if ($vanilla){
-    die "Please specify either -s (single-end) or -p (paired-end) for deduplication. Reading this information from the \@PG header line only works for SAM/BAM files\n\n";
-  }
-  warn "\nNeither -s (single-end) nor -p (paired-end) selected for deduplication. Trying to extract this information for each file separately from the \@PG line of the SAM/BAM file\n";
-}
-
-if ($global_paired){
-  if ($global_single){
-    die "Please select either -s for single-end files or -p for paired-end files, but not both at the same time!\n\n";
-  }
-  if ($vanilla){
-
-    if ($rrbs){
-      die "Barcode deduplication only works with Bismark SAM (or BAM) output (in attempt to phase out the vanilla format)\n";
-    }
-
-    warn "Processing paired-end custom Bismark output file(s):\n";
-    warn join ("\t",@filenames),"\n\n";
-  }
-  else{
-    warn "Processing paired-end Bismark output file(s) (SAM format):\n";
-    warn join ("\t",@filenames),"\n\n";
-  }
-}
-else{
-  if ($vanilla){
-    warn "Processing single-end custom Bismark output file(s):\n";
-    warn join ("\t",@filenames),"\n\n";
-  }
-  else{
-    warn "Processing single-end Bismark output file(s) (SAM format):\n";
-    warn join ("\t",@filenames),"\n\n";
-  }
-}
-
-### PATH TO SAMTOOLS
-if (defined $samtools_path){
-  # if Samtools was specified as full command
-  if ($samtools_path =~ /samtools$/){
-    if (-e $samtools_path){
-      # Samtools executable found
-    }
-    else{
-      die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-    }
-  }
-  else{
-    unless ($samtools_path =~ /\/$/){
-      $samtools_path =~ s/$/\//;
-    }
-    $samtools_path .= 'samtools';
-    if (-e $samtools_path){
-      # Samtools executable found
-    }
-    else{
-      die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-    }
-  }
-}
-# Check whether Samtools is in the PATH if no path was supplied by the user
-else{
-  if (!system "which samtools >/dev/null 2>&1"){ # STDOUT is binned, STDERR is redirected to STDOUT. Returns 0 if Samtools is in the PATH
-    $samtools_path = `which samtools`;
-    chomp $samtools_path;
-  }
-}
-
-if ($bam){
-  if (defined $samtools_path){
-    $bam = 1;
-  }
-  else{
-    warn "No Samtools found on your system, writing out a gzipped SAM file instead\n";
-    $bam = 2;
-  }
-}
-else{
-  $bam = 0;
-}
-
-
-if ($representative){
-  warn "\nIf there are several alignments to a single position in the genome the alignment with the most representative methylation call will be chosen (this might be the most highly amplified PCR product...)\n\n";
-  sleep (1);
-}
-elsif($rrbs){
-  warn "\nIf the input is a multiplexed sample with several alignments to a single position in the genome, only alignments with a unique barcode will be chosen)\n\n";
-  sleep (1);
-}
-else{ # default; random (=first) alignment
-  warn "\nIf there are several alignments to a single position in the genome the first alignment will be chosen. Since the input files are not in any way sorted this is a near-enough random selection of reads.\n\n";
-  sleep (1);
-}
-
-foreach my $file (@filenames){
-
-  if ($global_single){
-    $paired = 0;
-    $single = 1;
-  }
-  elsif($global_paired){
-    $paired = 1;
-    $single = 0;
-  }
-
-  unless($global_single or $global_paired){
-
-    warn "Trying to determine the type of mapping from the SAM header line\n"; sleep(1);
-
-    ### if the user did not specify whether the alignment file was single-end or paired-end we are trying to get this information from the @PG header line in the SAM/BAM file
-    if ($file =~ /\.gz$/){
-      open (DETERMINE,"gunzip -c $file |") or die "Unable to read from gzipped file $file: $!\n";
-    }
-    elsif ($file =~ /\.bam$/){
-      open (DETERMINE,"$samtools_path view -h $file |") or die "Unable to read from BAM file $file: $!\n";
-    }
-    else{
-      open (DETERMINE,$file) or die "Unable to read from $file: $!\n";
-    }
-    while (<DETERMINE>){
-      last unless (/^\@/);
-      if ($_ =~ /^\@PG/){
-	# warn "found the \@PG line:\n";
-	# warn "$_";
-	
-	if ($_ =~ /\s+-1\s+/ and $_ =~ /\s+-2\s+/){
-	  warn "Treating file as paired-end data (extracted from \@PG line)\n"; sleep(1);
-	  $paired = 1;
-	  $single = 0;
-	}
-	else{
-	  warn "Treating file as single-end data (extracted from \@PG line)\n"; sleep(1);
-	  $paired = 0;
-	  $single = 1;
-	}
-      }
-    }
-    close DETERMINE or warn "$!\n";
-  }
-
-  if ($file =~ /(\.bam$|\.sam$)/){
-      bam_isEmpty($file);
-  }
-  
-
-  ### OPTIONS
-  unless ($single or $paired){
-    die "Please specify either -s (single-end) or -p (paired-end) for deduplication, or provide a SAM/BAM file that contains the \@PG header line\n\n";
-  }
-
-  ### 
-  unless ($vanilla){
-    if ($paired){
-      test_positional_sorting($file);
-    }
-  }
-
-
-  ### writing to a report file
-  my $report = $file;
-
-  $report =~ s/\.gz$//;
-  $report =~ s/\.sam$//;
-  $report =~ s/\.bam$//;
-  $report =~ s/\.txt$//;
-  $report =~ s/$/.deduplication_report.txt/;
-
-  open (REPORT,'>',$report) or die "Failed to write to report file to $report: $!\n\n";
-
-
-  ### for representative methylation calls we need to discriminate between single-end and paired-end files as the latter have 2 methylation call strings
-  if($representative){
-    deduplicate_representative($file);
-  }
-
-  elsif($rrbs){
-    deduplicate_barcoded_rrbs($file);
-  }
-
-  ### as the default option we simply write out the first read for a position and discard all others. This is the fastest option
-  else{
-
-    my %unique_seqs;
-    my %positions;
-
-    if ($file =~ /\.gz$/){
-      open (IN,"gunzip -c $file |") or die "Unable to read from gzipped file $file: $!\n";
-    }
-    elsif ($file =~ /\.bam$/){
-      open (IN,"$samtools_path view -h $file |") or die "Unable to read from BAM file $file: $!\n";
-    }
-    else{
-      open (IN,$file) or die "Unable to read from $file: $!\n";
-    }
-
-    my $outfile = $file;
-    $outfile =~ s/\.gz$//;
-    $outfile =~ s/\.sam$//;
-    $outfile =~ s/\.bam$//;
-    $outfile =~ s/\.txt$//;
-
-    if ($vanilla){
-      $outfile =~ s/$/_deduplicated.txt/;
-    }
-    else{
-      if ($bam == 1){
-	$outfile =~ s/$/.deduplicated.bam/;
-      }
-      elsif ($bam == 2){
-	$outfile =~ s/$/.deduplicated.sam.gz/;
-      }
-      else{
-	$outfile =~ s/$/.deduplicated.sam/;
-      }
-    }
-    if ($bam == 1){
-      open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $outfile") or die "Failed to write to $outfile: $!\n";
-    }
-    elsif($bam == 2){ ### no Samtools found on system. Using GZIP compression instead
-      open (OUT,"| gzip -c - > $outfile") or die "Failed to write to $outfile: $!\n";
-    }
-
-    else{
-      open (OUT,'>',$outfile) or die "Unable to write to $outfile: $!\n";
-    }
-
-    ### need to proceed slightly differently for the custom Bismark and Bismark SAM output
-    if ($vanilla){
-      $_ = <IN>; # Bismark version header
-      print OUT; # Printing the Bismark version to the de-duplicated file again
-    }
-    my $count = 0;
-    my $unique_seqs = 0;
-    my $removed = 0;
-
-    while (<IN>){
-
-      if ($count == 0){
-	if ($_ =~ /^Bismark version:/){
-	  warn "The file appears to be in the custom Bismark and not SAM format. Please see option --vanilla!\n";
-	  sleep (2);
-	  print_helpfile();
-	  exit;
-	}
-      }
-
-      ### if this was a SAM file we ignore header lines
-      unless ($vanilla){
-	if (/^\@\w{2}\t/){
-	  print "skipping header line:\t$_";
-	  print OUT "$_"; # Printing the header lines again into the de-duplicated file
-	  next;
-	}
-      }
-
-      ++$count;
-      my $composite; # storing positional data. For single end data we are only using the start coordinate since the end might have been trimmed to different lengths
-
-      my ($strand,$chr,$start,$end,$cigar);
-      my $line1;
-
-      if ($vanilla){
-	($strand,$chr,$start,$end) = (split (/\t/))[1,2,3,4];
-      }
-      else{ # SAM format
-	($strand,$chr,$start,$cigar) = (split (/\t/))[1,2,3,5]; # we are assigning the FLAG value to $strand
-
-	### SAM single-end
-	if ($single){
-
-	  if ($strand == 0 ){
-	    ### read aligned to the forward strand. No action needed
-	  }
-	  elsif ($strand == 16){
-	    ### read is on reverse strand
-	
-	    $start -= 1; # only need to adjust this once
-	
-	    # for InDel free matches we can simply use the M number in the CIGAR string
-	    if ($cigar =~ /^(\d+)M$/){ # linear match
-	      $start += $1;
-	    }
-
-	    else{
-	      # parsing CIGAR string
-	      my @len = split (/\D+/,$cigar); # storing the length per operation
-	      my @ops = split (/\d+/,$cigar); # storing the operation
-	      shift @ops; # remove the empty first element
-	      die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-	      # warn "CIGAR string; $cigar\n";
-	      ### determining end position of a read
-	      foreach my $index(0..$#len){
-		if ($ops[$index] eq 'M'){  # standard matching bases
-		  $start += $len[$index];
-		  # warn "Operation is 'M', adding $len[$index] bp\n";
-		}
-		elsif($ops[$index] eq 'I'){ # insertions do not affect the end position
-		  # warn "Operation is 'I', next\n";
-		}
-		elsif($ops[$index] eq 'D'){ # deletions do affect the end position
-		  #  warn "Operation is 'D',adding $len[$index] bp\n";
-		  $start += $len[$index];
-		}
-		else{
-		  die "Found CIGAR operations other than M, I or D: '$ops[$index]'. Not allowed at the moment\n";
-		}
-	      }
-	    }
-	  }
-	  $composite = join (":",$strand,$chr,$start);
-	}
-	elsif($paired){
-
-	  ### storing the current line
-	  $line1 = $_;
-
-	  my $read_conversion;
-	  my $genome_conversion;
-
-	  while ( /(XR|XG):Z:([^\t]+)/g ) {
-	    my $tag = $1;
-	    my $value = $2;
-
-	    if ($tag eq "XR") {
-	      $read_conversion = $value;
-	      $read_conversion =~ s/\r//;
-	      chomp $read_conversion;
-	    } elsif ($tag eq "XG") {
-	      $genome_conversion = $value;
-	      $genome_conversion =~ s/\r//;
-	      chomp $genome_conversion;
-	    }
-	  }
-	  die "Failed to determine read and genome conversion from line: $line1\n\n" unless ($read_conversion and $read_conversion);
-
-	
-	  my $index;
-	  if ($read_conversion eq 'CT' and $genome_conversion eq 'CT') { ## original top strand
-	    $index = 0;
-	    $strand = '+';
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT') { ## complementary to original top strand
-	    $index = 1;
-	    $strand = '-';
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA') { ## complementary to original bottom strand
-	    $index = 2;
-	    $strand = '+';
-	  } elsif ($read_conversion eq 'CT' and $genome_conversion eq 'GA') { ## original bottom strand
-	    $index = 3;
-	    $strand = '-';
-	  } else {
-	    die "Unexpected combination of read and genome conversion: '$read_conversion' / '$genome_conversion'\n";
-	  }
-	
-	  # if the read aligns in forward orientation we can certainly use the start position of read 1, and only need to work out the end position of read 2	
-	  if ($index == 0 or $index == 2){
-	
-	    ### reading in the next line
-	    $_ = <IN>;
-	    # the only thing we need is the end position
-	    ($end,my $cigar_2) = (split (/\t/))[3,5];
-
-	    $end -= 1; # only need to adjust this once
-	
-	    # for InDel free matches we can simply use the M number in the CIGAR string
-	    if ($cigar_2 =~ /^(\d+)M$/){ # linear match
-	      $end += $1;
-	    }
-	    else{
-	      # parsing CIGAR string
-	      my @len = split (/\D+/,$cigar_2); # storing the length per operation
-	      my @ops = split (/\d+/,$cigar_2); # storing the operation
-	      shift @ops; # remove the empty first element
-	      die "CIGAR string contained a non-matching number of lengths and operations ($cigar_2)\n" unless (scalar @len == scalar @ops);
-	
-	      # warn "CIGAR string; $cigar_2\n";
-	      ### determining end position of the read
-	      foreach my $index(0..$#len){
-		if ($ops[$index] eq 'M'){  # standard matching bases
-		  $end += $len[$index];
-		  # warn "Operation is 'M', adding $len[$index] bp\n";
-		}
-		elsif($ops[$index] eq 'I'){ # insertions do not affect the end position
-		  # warn "Operation is 'I', next\n";
-		}
-		elsif($ops[$index] eq 'D'){ # deletions do affect the end position
-		  #  warn "Operation is 'D',adding $len[$index] bp\n";
-		  $end += $len[$index];
-		}
-		else{
-		  die "Found CIGAR operations other than M, I or D: '$ops[$index]'. Not allowed at the moment\n";
-		}
-	      }
-	    }
-	  }
-	  else{
-	    # else read 1 aligns in reverse orientation and we need to work out the end of the fragment first, and use the start of the next line
-
-	    $end = $start - 1; # need to adjust this only once
-	
-	    # for InDel free matches we can simply use the M number in the CIGAR string
-	    if ($cigar =~ /^(\d+)M$/){ # linear match
-	      $end += $1;
-	    }
-	    else{
-	      # parsing CIGAR string
-	      my @len = split (/\D+/,$cigar); # storing the length per operation
-	      my @ops = split (/\d+/,$cigar); # storing the operation
-	      shift @ops; # remove the empty first element
-	      die "CIGAR string contained a non-matching number of lengths and operations ($cigar)\n" unless (scalar @len == scalar @ops);
-	
-	      # warn "CIGAR string; $cigar\n";
-	      ### determining end position of the read
-	      foreach my $index(0..$#len){
-		if ($ops[$index] eq 'M'){  # standard matching bases
-		  $end += $len[$index];
-		  # warn "Operation is 'M', adding $len[$index] bp\n";
-		}
-		elsif($ops[$index] eq 'I'){ # insertions do not affect the end position
-		  # warn "Operation is 'I', next\n";
-		}
-		elsif($ops[$index] eq 'D'){ # deletions do affect the end position
-		  # warn "Operation is 'D',adding $len[$index] bp\n";
-		  $end += $len[$index];
-		}
-		else{
-		  die "Found CIGAR operations other than M, I or D: '$ops[$index]'. Not allowed at the moment\n";
-		}
-	      }
-	    }
-	
-	    ### reading in the next line
-	    $_ = <IN>;
-	    # the only thing we need is the start position
-	    ($start) = (split (/\t/))[3];
-	  }
-	  $composite = join (":",$strand,$chr,$start,$end);
-	}
-	
-	else{
-	  die "Input must be single or paired-end\n";
-	}
-      }
-
-      if (exists $unique_seqs{$composite}){
-	++$removed;
-	unless (exists $positions{$composite}){
-	  $positions{$composite}++;
-	}
-      }
-      else{
-	if ($paired){
-	  unless ($vanilla){
-	    print OUT "$line1"; # printing first paired-end line for SAM output
-	  }
-	}
-	print OUT "$_"; # printing single-end SAM alignment or second paired-end line
-	$unique_seqs{$composite}++;
-      }
-    }
-
-    my $percentage;
-    my $percentage_leftover;
-    my $leftover = $count - $removed;
-
-    unless ($count == 0){
-      $percentage = sprintf("%.2f",$removed/$count*100);
-      $percentage_leftover = sprintf("%.2f",$leftover/$count*100);
-    }
-    else{
-      $percentage = 'N/A';
-      $percentage_leftover = 'N/A';
-    }
-
-    warn "\nTotal number of alignments analysed in $file:\t$count\n";
-    warn "Total number duplicated alignments removed:\t$removed ($percentage%)\n";
-    warn "Duplicated alignments were found at:\t",scalar keys %positions," different position(s)\n\n";
-    warn "Total count of deduplicated leftover sequences: $leftover ($percentage_leftover% of total)\n\n";
-
-    print REPORT "\nTotal number of alignments analysed in $file:\t$count\n";
-    print REPORT "Total number duplicated alignments removed:\t$removed ($percentage%)\n";
-    print REPORT "Duplicated alignments were found at:\t",scalar keys %positions," different position(s)\n\n";
-    print REPORT "Total count of deduplicated leftover sequences: $leftover ($percentage_leftover% of total)\n\n";
-  }
-
-  close OUT or warn "Failed to close output filehandle: $!\n";
-  close REPORT or warn "Failed to close report filehandle: $!\n";
-
-}
-
-
-sub deduplicate_barcoded_rrbs{
-
-  my $file = shift;
-
-  my %unique_seqs;
-  my %positions;
-
-  if ($file =~ /\.gz$/){
-    open (IN,"gunzip -c $file |") or die "Unable to read from gzipped file $file: $!\n";
-  }
-  elsif ($file =~ /\.bam$/){
-    open (IN,"$samtools_path view -h $file |") or die "Unable to read from BAM file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Unable to read from $file: $!\n";
-  }
-
-  my $outfile = $file;
-  $outfile =~ s/\.gz$//;
-  $outfile =~ s/\.sam$//;
-  $outfile =~ s/\.bam$//;
-  $outfile =~ s/\.txt$//;
-
-  if ($vanilla){
-    $outfile =~ s/$/_dedup_RRBS.txt/;
-  }
-  else{
-    if ($bam == 1){
-      $outfile =~ s/$/.dedup_RRBS.bam/;
-    }
-    elsif ($bam == 2){
-      $outfile =~ s/$/.dedupRRBS.sam.gz/;
-    }
-    else{
-      $outfile =~ s/$/.dedup_RRBS.sam/;
-    }
-  }
-  if ($bam == 1){
-    open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  elsif($bam == 2){ ### no Samtools found on system. Using GZIP compression instead
-    open (OUT,"| gzip -c - > $outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  else{
-    open (OUT,'>',$outfile) or die "Unable to write to $outfile: $!\n";
-  }
-
-  ### This mode only supports Bismark SAM output
-  my $count = 0;
-  my $unique_seqs = 0;
-  my $removed = 0;
-
-  while (<IN>){
-
-    if ($count == 0){
-      if ($_ =~ /^Bismark version:/){
-	warn "The file appears to be in the custom Bismark and not SAM format. Please see option --vanilla!\n";
-	sleep (2);
-	print_helpfile();
-	exit;
-      }
-    }
-
-    ### if this was a SAM file we ignore header lines
-    if (/^\@\w{2}\t/){
-      warn "skipping SAM header line:\t$_";
-      print OUT; # Printing the header lines again into the de-duplicated file
-      next;
-    }
-
-    ++$count;
-    my $composite; # storing positional data. For single end data we are only using the start coordinate since the end might have been trimmed to different lengths
-    ### in this barcoded mode we also store the read barcode as additional means of assisting the deduplication
-    ### in effect the $composite string looks like this (separated by ':'):
-
-    ### FLAG:chromosome:start:barcode
-
-    my $end;
-    my $line1;
-
-    # SAM format
-    my ($id,$strand,$chr,$start,$cigar) = (split (/\t/))[0,1,2,3,5]; # we are assigning the FLAG value to $strand
-
-    $id =~ /:(\w+)$/;
-    my $barcode = $1;
-    unless ($barcode){
-      die "Failed to extract a barcode from the read ID (last element of each read ID needs to be the barcode sequence, e.g. ':CATG'\n\n";
-    }
-
-    ### SAM single-end
-    if ($single){
-
-      if ($strand == 0 ){
-	### read aligned to the forward strand. No action needed
-      }
-      elsif ($strand == 16){
-	### read is on reverse strand
-	
-	$start -= 1; # only need to adjust this once
-	
-	# for InDel free matches we can simply use the M number in the CIGAR string
-	if ($cigar =~ /^(\d+)M$/){ # linear match
-	  $start += $1;
-	}
-	else{
-	  # parsing CIGAR string
-	  my @len = split (/\D+/,$cigar); # storing the length per operation
-	  my @ops = split (/\d+/,$cigar); # storing the operation
-	  shift @ops; # remove the empty first element
-	  die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-	  # warn "CIGAR string; $cigar\n";
-	  ### determining end position of a read
-	  foreach my $index(0..$#len){
-	    if ($ops[$index] eq 'M'){  # standard matching bases
-	      $start += $len[$index];
-	      # warn "Operation is 'M', adding $len[$index] bp\n";
-	    }
-	    elsif($ops[$index] eq 'I'){ # insertions do not affect the end position
-	      # warn "Operation is 'I', next\n";
-	    }
-	    elsif($ops[$index] eq 'D'){ # deletions do affect the end position
-	      #  warn "Operation is 'D',adding $len[$index] bp\n";
-	      $start += $len[$index];
-	    }
-	    else{
-	      die "Found CIGAR operations other than M, I or D: '$ops[$index]'. Not allowed at the moment\n";
-	    }
-	  }
-	}
-      }
-
-      ### Here we take the barcode sequence into consideration
-      $composite = join (":",$strand,$chr,$start,$barcode);
-      # warn "$composite\n\n";
-      # sleep(1);
-    }
-    elsif($paired){
-
-      ### storing the current line
-      $line1 = $_;
-
-      my $read_conversion;
-      my $genome_conversion;
-
-      while ( /(XR|XG):Z:([^\t]+)/g ) {
-	my $tag = $1;
-	my $value = $2;
-	
-	if ($tag eq "XR") {
-	  $read_conversion = $value;
-	  $read_conversion =~ s/\r//;
-	  chomp $read_conversion;
-	}
-	elsif ($tag eq "XG") {
-	  $genome_conversion = $value;
-	  $genome_conversion =~ s/\r//;
-	  chomp $genome_conversion;
-	}
-      }
-      die "Failed to determine read and genome conversion from line: $line1\n\n" unless ($read_conversion and $read_conversion);
-
-	
-      my $index;
-      if ($read_conversion eq 'CT' and $genome_conversion eq 'CT') { ## original top strand
-	$index = 0;
-	$strand = '+';
-      } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT') { ## complementary to original top strand
-	$index = 1;
-	$strand = '-';
-      } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA') { ## complementary to original bottom strand
-	$index = 2;
-	$strand = '+';
-      } elsif ($read_conversion eq 'CT' and $genome_conversion eq 'GA') { ## original bottom strand
-	$index = 3;
-	$strand = '-';
-      } else {
-	die "Unexpected combination of read and genome conversion: '$read_conversion' / '$genome_conversion'\n";
-      }
-	
-      # if the read aligns in forward orientation we can certainly use the start position of read 1, and only need to work out the end position of read 2	
-      if ($index == 0 or $index == 2){
-	
-	### reading in the next line
-	$_ = <IN>;
-	# the only thing we need is the end position
-	($end,my $cigar_2) = (split (/\t/))[3,5];
-
-	$end -= 1; # only need to adjust this once
-	
-	# for InDel free matches we can simply use the M number in the CIGAR string
-	if ($cigar_2 =~ /^(\d+)M$/){ # linear match
-	  $end += $1;
-	}
-	else{
-	  # parsing CIGAR string
-	  my @len = split (/\D+/,$cigar_2); # storing the length per operation
-	  my @ops = split (/\d+/,$cigar_2); # storing the operation
-	  shift @ops; # remove the empty first element
-	  die "CIGAR string contained a non-matching number of lengths and operations ($cigar_2)\n" unless (scalar @len == scalar @ops);
-	
-	  # warn "CIGAR string; $cigar_2\n";
-	  ### determining end position of the read
-	  foreach my $index(0..$#len){
-	    if ($ops[$index] eq 'M'){  # standard matching bases
-	      $end += $len[$index];
-	      # warn "Operation is 'M', adding $len[$index] bp\n";
-	    }
-	    elsif($ops[$index] eq 'I'){ # insertions do not affect the end position
-	      # warn "Operation is 'I', next\n";
-	    }
-	    elsif($ops[$index] eq 'D'){ # deletions do affect the end position
-	      #  warn "Operation is 'D',adding $len[$index] bp\n";
-	      $end += $len[$index];
-	    }
-	    else{
-	      die "Found CIGAR operations other than M, I or D: '$ops[$index]'. Not allowed at the moment\n";
-	    }
-	  }
-	}
-      }
-      else{
-	# else read 1 aligns in reverse orientation and we need to work out the end of the fragment first, and use the start of the next line
-	
-	$end = $start - 1; # need to adjust this only once
-	
-	# for InDel free matches we can simply use the M number in the CIGAR string
-	if ($cigar =~ /^(\d+)M$/){ # linear match
-	  $end += $1;
-	}
-	else{
-	  # parsing CIGAR string
-	  my @len = split (/\D+/,$cigar); # storing the length per operation
-	  my @ops = split (/\d+/,$cigar); # storing the operation
-	  shift @ops; # remove the empty first element
-	  die "CIGAR string contained a non-matching number of lengths and operations ($cigar)\n" unless (scalar @len == scalar @ops);
-	
-	  # warn "CIGAR string; $cigar\n";
-	  ### determining end position of the read
-	  foreach my $index(0..$#len){
-	    if ($ops[$index] eq 'M'){  # standard matching bases
-	      $end += $len[$index];
-	      # warn "Operation is 'M', adding $len[$index] bp\n";
-	    }
-	    elsif($ops[$index] eq 'I'){ # insertions do not affect the end position
-	      # warn "Operation is 'I', next\n";
-	    }
-	    elsif($ops[$index] eq 'D'){ # deletions do affect the end position
-	      # warn "Operation is 'D',adding $len[$index] bp\n";
-	      $end += $len[$index];
-	    }
-	    else{
-	      die "Found CIGAR operations other than M, I or D: '$ops[$index]'. Not allowed at the moment\n";
-	    }
-	  }
-	}
-	
-	### reading in the next line
-	$_ = <IN>;
-	# the only thing we need is the start position
-	($start) = (split (/\t/))[3];
-      }
-
-      ### Here we take the barcode sequence into consideration
-      $composite = join (":",$strand,$chr,$start,$end,$barcode);
-    }
-    else{
-      die "Input must be single or paired-end\n";
-    }
-
-    if (exists $unique_seqs{$composite}){
-      ++$removed;
-      unless (exists $positions{$composite}){
-	$positions{$composite}++;
-      }
-    }
-    else{
-      if ($paired){
-	print OUT $line1; # printing first paired-end line for SAM output
-      }
-      print OUT; # printing single-end SAM alignment or second paired-end line
-      $unique_seqs{$composite}++;
-    }
-  }
-
-  my $percentage;
-  my $percentage_leftover;
-  my $leftover = $count - $removed;
-
-  unless ($count == 0){
-    $percentage = sprintf("%.2f",$removed/$count*100);
-    $percentage_leftover = sprintf("%.2f",$leftover/$count*100);
-  }
-  else{
-    $percentage = 'N/A';
-    $percentage_leftover = 'N/A';
-  }
-
-
-  warn "\nTotal number of alignments analysed in $file:\t$count\n";
-  warn "Total number duplicated alignments removed:\t$removed ($percentage%)\n";
-  warn "Duplicated alignments were found at:\t",scalar keys %positions," different position(s)\n\n";
-  warn "Total count of deduplicated leftover sequences: $leftover ($percentage_leftover% of total)\n\n";
-
-  print REPORT "\nTotal number of alignments analysed in $file:\t$count\n";
-  print REPORT "Total number duplicated alignments removed:\t$removed ($percentage%)\n";
-  print REPORT "Duplicated alignments were found at:\t",scalar keys %positions," different position(s)\n\n";
-  print REPORT "Total count of deduplicated leftover sequences: $leftover ($percentage_leftover% of total)\n\n";
-
-}
-
-sub bam_isEmpty{
-      
-    my $file = shift;
-
-    if ($file =~ /\.bam$/){
-	open (EMPTY,"$samtools_path view $file |") or die "Unable to read from BAM file $file: $!\n";
-    }
-    else{
-	open (EMPTY,$file) or die "Unable to read from $file: $!\n";
-    }
-    my $count = 0;
-    while (<EMPTY>){
-	if ($_){
-	    $count++;  # file contains data, fine.
-	}
-	last; # one line is enough
-    }
-
-    if ($count == 0){
-	die "\n### File appears to be empty, terminating deduplication process. Please make sure the input file has not been truncated. ###\n\n";
-    }
-    close EMPTY or warn "$!\n";
-}
-
-
-sub print_helpfile{
-  print "\n",'='x111,"\n";
-  print "\nThis script is supposed to remove alignments to the same position in the genome from the Bismark mapping output\n(both single and paired-end SAM files), which can arise by e.g. excessive PCR amplification. If sequences align\nto the same genomic position but on different strands they will be scored individually.\n\nNote that deduplication is not recommended for RRBS-type experiments!\n\nIn the default mode, the first alignment to a given position will be used irrespective of its methylation call\n(this is the fastest option, and as the alignments are not ordered in any way this is also near enough random).\n\n";
-  print "For single-end alignments only use the start coordinate of a read will be used for deduplication.\n\n";
-  print "For paired-end alignments the start-coordinate of the first read and the end coordinate of the second\nread will be used for deduplication. ";
-  print "This script expects the Bismark output to be in SAM format\n(Bismark v0.6.x or higher). To deduplicate the old custom Bismark output please specify '--vanilla'.\n\n";
-  print "*** Please note that for paired-end BAM files the deduplication script expects Read1 and Read2 to\nfollow each other in consecutive lines! If the file has been sorted by position make sure that you resort it\nby read name first (e.g. using samtools sort -n)  ***\n\n";
-
-  print '='x111,"\n\n";
-  print ">>> USAGE: ./deduplicate_bismark_alignment_output.pl [options] filename(s) <<<\n\n";
-
-  print "-s/--single\t\tdeduplicate single-end Bismark files (default format: SAM)\n";
-  print "-p/--paired\t\tdeduplicate paired-end Bismark files (default format: SAM)\n\n";
-  print "--vanilla\t\tThe input file is in the old custom Bismark format and not in SAM format\n\n";
-  print "--barcode\t\tIn addition to chromosome, start position and orientation this will also take a potential barcode into\n                        consideration while deduplicating. The barcode needs to be the last element of the read ID and separated\n                        by a ':', e.g.: MISEQ:14:000000000-A55D0:1:1101:18024:2858_1:N:0:CTCCT\n\n";
-  print "--bam\t\t\tThe output will be written out in BAM format instead of the default SAM format. This script will\n\t\t\tattempt to use the path to Samtools that was specified with '--samtools_path', or, if it hasn't\n\t\t\tbeen specified, attempt to find Samtools in the PATH. If no installation of Samtools can be found,\n\t\t\tthe SAM output will be compressed with GZIP instead (yielding a .sam.gz output file)\n\n";
-  print "--samtools_path\t\tThe path to your Samtools installation, e.g. /home/user/samtools/. Does not need to be specified\n\t\t\texplicitly if Samtools is in the PATH already\n\n";
-  print "--version\t\tPrint version information and exit\n";
-
-  print '='x111,"\n\n";
-
-  print "This script was last modified on November 04, 2015\n\n";
-}
-
-
-
-
-sub test_positional_sorting{
-
-  my $filename = shift;
-
-  print "\nNow testing Bismark result file $filename for positional sorting (which would be bad...)\t";
-  sleep(1);
-
-  if ($filename =~ /\.gz$/) {
-    open (TEST,"gunzip -c $filename |") or die "Can't open gzipped file $filename: $!\n";
-  }
-  elsif ($filename =~ /bam$/ ||  isBam($filename) ){ ### this would allow to read BAM files that do not end in *.bam
-    if ($samtools_path){
-      open (TEST,"$samtools_path view -h $filename |") or die "Can't open BAM file $filename: $!\n";
-    }
-    else{
-      die "Sorry couldn't find an installation of Samtools. Either specifiy an alternative path using the option '--samtools_path /your/path/', or use a SAM file instead\n\n";
-    }
-  }
-  else {
-    open (TEST,$filename) or die "Can't open file $filename: $!\n";
-  }
-
-  my $count = 0;
-
-  while (<TEST>) {
-    if (/^\@/) {	     # testing header lines if they contain the @SO flag (for being sorted)
-      if (/^\@SO/) {
-	die "SAM/BAM header line '$_' indicates that the Bismark aligment file has been sorted by chromosomal positions which is is incompatible with correct methylation extraction. Please use an unsorted file instead (e.g. use samtools sort -n)\n\n";
-      }
-      next;
-    }
-    $count++;
-
-    last if ($count > 100000); # else we test the first 100000 sequences if they start with the same read ID
-
-    my ($id_1) = (split (/\t/));
-
-    ### reading the next line which should be read 2
-    $_ = <TEST>;
-    my ($id_2) = (split (/\t/));
-    last unless ($id_2);
-    ++$count;
-
-    if ($id_1 eq $id_2){
-      ### ids are the same
-      next;
-    }
-    else{ ### in previous versions of Bismark we appended /1 and /2 to the read IDs for easier eyeballing which read is which. These tags need to be removed first
-      my $id_1_trunc = $id_1;
-      $id_1_trunc =~ s/\/1$//;
-      my $id_2_trunc = $id_2;
-      $id_2_trunc =~ s/\/2$//;
-
-      unless ($id_1_trunc eq $id_2_trunc){
-	die "\nThe IDs of Read 1 ($id_1) and Read 2 ($id_2) are not the same. This might be a result of sorting the paired-end SAM/BAM files by chromosomal position which is not compatible with correct methylation extraction. Please use an unsorted file instead (e.g. use samtools sort -n)\n\n";
-      }
-    }
-  }
-  #  close TEST or die $!; somehow fails on our cluster...
-  ### If it hasen't died so far then it seems the file is in the correct Bismark format (read 1 and read 2 of a pair directly following each other)
-  warn "...passed!\n";
-  sleep(1);
-
-}
-
-sub isBam{
-
-  my $filename = shift;
-
-  # reading the first line of the input file to see if it is a BAM file in disguise (i.e. a BAM file that does not end in *.bam which may be produced by Galaxy)
-  open (DISGUISE,"gunzip -c $filename |") or die "Failed to open filehandle DISGUISE for $filename\n\n";
-
-  ### when BAM files read through a gunzip -c stream they start with BAM...
-  my $bam_in_disguise = <DISGUISE>;
-  # warn "BAM in disguise: $bam_in_disguise\n\n";
-
-  if ($bam_in_disguise){
-    if ($bam_in_disguise =~ /^BAM/){
-      close (DISGUISE) or warn "Had trouble closing filehandle BAM in disguise: $!\n";
-      return 1;
-    }
-    else{
-      close (DISGUISE) or warn "Had trouble closing filehandle BAM in disguise: $!\n";
-     return 0;
-    }
-  }
-  else{
-    close (DISGUISE) or warn "Had trouble closing filehandle BAM in disguise: $!\n";
-    return 0;
-  }
-}
-
-
-
-
-
-#####################################
-
-### The following subroutine "deduplicate_representative" only works correctly for reads that do not contain any indels (as in only Bowtie1-based alignments). 
-### Please refrain from using it unless you want to test something out.
-
-#####################################
-
-sub deduplicate_representative {
-  my $file = shift;
-
-  my %positions;
-  my %unique_seqs;
-
-  my $count = 0;
-  my $unique_seqs = 0;
-  my $removed = 0;
-
-  ### going through the file first and storing all positions as well as their methylation call strings in a hash
-  if ($file =~ /\.gz$/){
-    open (IN,"gunzip -c $file |") or die "Unable to read from gzipped file $file: $!\n";
-  }
-  elsif ($file =~ /\.bam$/){
-    open (IN,"$samtools_path view -h $file |") or die "Unable to read from BAM file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Unable to read from $file: $!\n";
-  }
-
-  if ($single){
-
-    my $outfile = $file;
-    $outfile =~ s/\.gz$//;
-    $outfile =~ s/\.sam$//;
-    $outfile =~ s/\.bam$//;
-    $outfile =~ s/\.txt$//;
-
-    if ($vanilla){
-      $outfile =~ s/$/.deduplicated_to_representative_sequences.txt/;
-    }
-    else{
-      if ($bam == 1){
-	$outfile =~ s/$/.deduplicated_to_representative_sequences.bam/;
-      }
-      elsif ($bam == 2){
-	$outfile =~ s/$/.deduplicated_to_representative_sequences.sam.gz/;
-      }
-      else{
-	$outfile =~ s/$/.deduplicated_to_representative_sequences.sam/;
-      }
-    }
-
-    if ($bam == 1){
-      open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $outfile") or die "Failed to write to $outfile: $!\n";
-    }
-    elsif($bam == 2){ ### no Samtools found on system. Using GZIP compression instead
-      open (OUT,"| gzip -c - > $outfile") or die "Failed to write to $outfile: $!\n";
-    }
-    else{
-      open (OUT,'>',$outfile) or die "Unable to write to $outfile: $!\n";
-    }
-
-    warn "Reading and storing all alignment positions\n";
-
-    ### need to proceed slightly differently for the custom Bismark and Bismark SAM output
-    if ($vanilla){
-      $_ = <IN>; # Bismark version header
-      print OUT; # Printing the Bismark version to the de-duplicated file again
-    }
-
-    while (<IN>){
-
-      if ($count == 0){
-	if ($_ =~ /^Bismark version:/){
-	  warn "The file appears to be in the custom Bismark and not SAM format. Please see option --vanilla!\n";
-	  sleep (2);
-	  print_helpfile();
-	  exit;
-	}
-      }
-
-      ### if this was a SAM file we ignore header lines
-      unless ($vanilla){
-	if (/^\@\w{2}\t/){
-	  warn "skipping SAM header line:\t$_";
-	  print OUT; # Printing the header lines again into the de-duplicated file
-	  next;
-	}
-      }
-
-      my ($strand,$chr,$start,$end,$meth_call);
-
-      if ($vanilla){
-	($strand,$chr,$start,$end,$meth_call) = (split (/\t/))[1,2,3,4,7];
-      }
-      else{ # SAM format
-
-	($strand,$chr,$start,my $seq,$meth_call) = (split (/\t/))[1,2,3,9,13]; # we are assigning the FLAG value to $strand
-	### SAM single-end
-	$end = $start + length($seq) - 1;
-      }
-
-      my $composite = join (":",$strand,$chr,$start,$end);
-
-      $count++;
-      $positions{$composite}->{$meth_call}->{count}++;
-      $positions{$composite}->{$meth_call}->{alignment} = $_;
-    }
-    warn "Stored ",scalar keys %positions," different positions for $count sequences in total (+ and - alignments to the same position are scored individually)\n\n";
-    close IN or warn $!;
-  }
-
-  elsif ($paired){
-
-    ### we are going to concatenate both methylation call strings from the paired end file to form a joint methylation call string
-
-    my $outfile = $file;
-    if ($vanilla){
-      $outfile =~ s/$/_deduplicated_to_representative_sequences_pe.txt/;
-    }
-    else{
-      $outfile =~ s/$/_deduplicated_to_representative_sequences_pe.sam/;
-    }
-
-    open (OUT,'>',$outfile) or die "Unable to write to $outfile: $!\n";
-    warn "Reading and storing all alignment positions\n";
-
-    ### need to proceed slightly differently for the custom Bismark and Bismark SAM output
-    if ($vanilla){
-      $_ = <IN>; # Bismark version header
-      print OUT; # Printing the Bismark version to the de-duplicated file again
-    }
-
-    while (<IN>){
-
-      if ($count == 0){
-	if ($_ =~ /^Bismark version:/){
-	  warn "The file appears to be in the custom Bismark and not SAM format. Please see option --vanilla!\n";
-	  sleep (2);
-	  print_helpfile();
-	  exit;
-	}
-      }
-
-      ### if this was a SAM file we ignore header lines
-      unless ($vanilla){
-	if (/^\@\w{2}\t/){
-	  warn "skipping SAM header line:\t$_";
-	  print OUT; # Printing the header lines again into the de-duplicated file
-	  next;
-	}
-      }
-
-      my ($strand,$chr,$start,$end,$meth_call_1,$meth_call_2);
-      my $line1;
-
-      if ($vanilla){
-	($strand,$chr,$start,$end,$meth_call_1,$meth_call_2) = (split (/\t/))[1,2,3,4,7,10];
-      }
-      else{ # SAM paired-end format
-	
-	($strand,$chr,$start,$meth_call_1) = (split (/\t/))[1,2,3,13]; # we are assigning the FLAG value to $strand
-	
-	### storing the first line (= read 1 alignment)	
-	$line1 = $_;
-	
-	### reading in the next line
-	$_ = <IN>;
-	# we only need the end position and the methylation call
-	(my $pos,my $seq_2,$meth_call_2) = (split (/\t/))[3,9,13];
-	$end = $pos + length($seq_2) - 1;
-      }
-
-      my $composite = join (":",$strand,$chr,$start,$end);
-      $count++;
-      my $meth_call = $meth_call_1.$meth_call_2;
-
-      $positions{$composite}->{$meth_call}->{count}++;
-      if ($vanilla){
-	$positions{$composite}->{$meth_call}->{alignment} = $_;
-      }
-      else{ # SAM PAIRED-END
-	$positions{$composite}->{$meth_call}->{alignment_1} = $line1;
-	$positions{$composite}->{$meth_call}->{alignment_2} = $_;
-      }
-    }
-    warn "Stored ",scalar keys %positions," different positions for $count sequences in total (+ and - alignments to the same position are scored individually)\n\n";
-    close IN or warn $!;
-  }
-
-  ### PRINTING RESULTS
-
-  ### Now going through all stored positions and printing out the methylation call which is most representative, i.e. the one which occurred most often
-  warn "Now printing out alignments with the most representative methylation call(s)\n";
-
-  foreach my $pos (keys %positions){
-    foreach my $meth_call (sort { $positions{$pos}->{$b}->{count} <=> $positions{$pos}->{$a}->{count} }keys %{$positions{$pos}}){
-      if ($paired){
-	if ($vanilla){
-	  print OUT $positions{$pos}->{$meth_call}->{alignment};
-	}
-	else{
-	  print OUT $positions{$pos}->{$meth_call}->{alignment_1}; # SAM read 1
-	  print OUT $positions{$pos}->{$meth_call}->{alignment_2}; # SAM read 2
-	}
-      }
-      else{ # single-end
-	print OUT $positions{$pos}->{$meth_call}->{alignment};
-      }
-      $unique_seqs++;
-      last; ### exiting once we printed a sequence with the most frequent methylation call for a position
-    }
-  }
-
-  my $percentage;
-  unless ($count == 0){
-    $percentage = sprintf ("%.2f",$unique_seqs*100/$count);
-  }
-  else{
-    $percentage = 'N/A';
-  }
-
-  warn "\nTotal number of alignments analysed in $file:\t$count\n";
-  warn "Total number of representative alignments printed from $file in total:\t$unique_seqs ($percentage%)\n\n";
-  print REPORT "\nTotal number of alignments analysed in $file:\t$count\n";
-  print REPORT "Total number of representative alignments printed from $file in total:\t$unique_seqs ($percentage%)\n\n";
-
-}
-
-
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bismark_deduplicate_wrapper.py	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,81 @@
+#!/usr/bin/python
+
+import argparse
+import logging
+import os
+import shutil
+import subprocess
+import sys
+import signal
+import tempfile
+from glob import glob
+
+
+def stop_err(logger, msg):
+    logger.critical(msg)
+    sys.exit(1)
+
+
+def restore_sigpipe():
+    """
+    Needed to handle samtools view
+    """
+    signal.signal(signal.SIGPIPE, signal.SIG_DFL)
+
+
+def log_subprocess_output(logger, pipe):
+    for line in iter(pipe.readline, b''):
+        logger.debug(line.decode().rstrip())
+
+
+def get_arg():
+    parser = argparse.ArgumentParser()
+    parser.add_argument('--single_or_paired',  dest='single_or_paired')
+    parser.add_argument('--input', dest='input', metavar='input')
+    parser.add_argument('--output_report', dest='output_report', metavar='output_report')
+    parser.add_argument('--output_bam', dest='output_bam', metavar='output_report')
+    parser.add_argument('--log_report', dest='log_report', metavar='log_filename', type=str)
+    args = parser.parse_args()
+    return args
+
+
+def __main__():
+    args = get_arg()
+
+    logger = logging.getLogger('bismark_deduplicate_wrapper')
+    logger.setLevel(logging.DEBUG)
+    ch = logging.StreamHandler(sys.stdout)
+    if args.log_report:
+        ch.setLevel(logging.WARNING)
+        handler = logging.FileHandler(args.log_report)
+        handler.setLevel(logging.DEBUG)
+        logger.addHandler(handler)
+    else:
+        ch.setLevel(logging.DEBUG)
+    logger.addHandler(ch)
+
+    # ensure the input has a .bam suffix
+    tmp_dir = tempfile.mkdtemp(prefix='tmp', suffix='')
+    os.chdir(tmp_dir)
+    default_reads_name = 'submitted_reads.bam'
+    os.symlink(args.input, default_reads_name)
+
+    single_or_paired = '-s' if args.single_or_paired == 'single' else '-p'
+    cmd = ['deduplicate_bismark', single_or_paired, default_reads_name, '--bam']
+    logger.info("Deduplicating with: '%s'", " ".join(cmd))
+    process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT,
+                               preexec_fn=restore_sigpipe)
+    proc_out, proc_err = process.communicate()
+    logger.info(proc_out)
+    if process.returncode != 0:
+        stop_err(logger, "Bismark deduplication error (also check the log file if any)!\n%s" % proc_err)
+
+    deduplicated_out_name = 'submitted_reads.deduplicated.bam'
+    deduplicated_report_name = 'submitted_reads.deduplication_report.txt'
+    logger.debug("Moving '%s' to galaxy: '%s'.", deduplicated_out_name, args.output_bam)
+    shutil.move(deduplicated_out_name, args.output_bam )
+    logger.debug("Moving '%s' to galaxy: '%s'.", deduplicated_report_name, args.output_report)
+    shutil.move('submitted_reads.deduplication_report.txt', args.output_report)
+    logger.debug("Done.")
+
+if __name__=="__main__": __main__()
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bismark_deduplicate_wrapper.xml	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,66 @@
+<tool id="bismark_deduplicate" name="Bismark Deduplicate" version="0.20.0" profile="18.01">
+    <description>Deduplicates reads mapped by Bismark</description>
+    <requirements>
+        <requirement type="package" version="0.20.0">bismark</requirement>
+        <requirement type="package" version="1.8">samtools</requirement>
+        <requirement type="package" version="2.3.4.2">bowtie2</requirement>
+    </requirements>
+    <command><![CDATA[
+        python '$__tool_directory__/bismark_deduplicate_wrapper.py'
+
+        --single_or_paired $sPaired
+
+        --input '$mapping_output'
+        --output_report '$output_report'
+        --output_bam '$output_bam'
+        #if $separate_logfile:
+           --log_report '$log_report'
+        #end if
+]]>
+    </command>
+    <inputs>
+        <param name="sPaired" type="select" label="Is this library mate-paired?">
+            <option value="single">Single-end</option>
+            <option value="paired">Paired-end</option>
+        </param>
+        <param name="mapping_output" type="data" format="qname_input_sorted.bam,bam"
+               label="Submit the resulting bam/sam file from Bismark bisulfite mapper"/>
+        <param name="separate_logfile" type="boolean" truevalue="true" falsevalue="false" checked="False"
+               label="Create a separate logfile, otherwise logs are added to the dataset info."/>
+    </inputs>
+
+    <outputs>
+        <data name="output_bam" format="qname_sorted.bam"
+              label="${tool.name} on ${on_string}: deduplicated mapped reads"/>
+        <data name="output_report" format="txt" label="${tool.name} on ${on_string}: deduplication report"/>
+        <data name="log_report" format="txt" label="${tool.name} on ${on_string}: log report (tool stdout)">
+            <filter>( separate_logfile is True )</filter>
+        </data>
+    </outputs>
+
+    <tests>
+        <test>
+            <param name="sPaired" value="single"/>
+            <param name="mapping_output" value="mapped_reads.bam" ftype="qname_sorted.bam"/>
+            <output name="output_bam" file="dedup_reads.bam" ftype="qname_sorted.bam"/>
+            <output name="output_report" file="dedup_report.txt" ftype="txt"/>
+        </test>
+    </tests>
+
+    <help>
+        <![CDATA[
+**What it does**
+
+	| This tool is supposed to remove alignments to the same position in the genome from the Bismark mapping output (both single and paired-end SAM files), which can arise by e.g. excessive PCR amplification. If sequences align to the same genomic position but on different strands they will be scored individually.
+	|
+	| Note that deduplication is not recommended for RRBS-type experiments!
+	|
+	| For single-end alignments only use the start-coordinate of a read will be used for deduplication.
+	| For paired-end alignments the start-coordinate of the first read and the end coordinate of the second read will be used for deduplication.
+
+]]>
+    </help>
+    <citations>
+        <citation type="doi">10.1093/bioinformatics/btr167</citation>
+    </citations>
+</tool>
--- a/bismark_mapping/bismark	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,10220 +0,0 @@
-#!/usr/bin/env perl
-use strict;
-use warnings;
-use IO::Handle;
-use Cwd;
-$|++;
-use Getopt::Long;
-use FindBin qw($Bin);
-use lib "$Bin/../lib";
-
-## This program is Copyright (C) 2010-16, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-my $parent_dir = getcwd;
-my $bismark_version = 'v0.16.3';
-my $command_line = join (" ",@ARGV);
-
-
-### before processing the command line we will replace --solexa1.3-quals with --phred64-quals as the '.' in the option name will cause Getopt::Long to fail
-foreach my $arg (@ARGV){
-  if ($arg eq '--solexa1.3-quals'){
-    $arg = '--phred64-quals';
-  }
-}
-my @filenames;   # will be populated by processing the command line
-
-my ($genome_folder,$CT_index_basename,$GA_index_basename,$path_to_bowtie,$sequence_file_format,$bowtie_options,$directional,$unmapped,$ambiguous,$phred64,$solexa,$output_dir,$bowtie2,$vanilla,$sam_no_hd,$skip,$upto,$temp_dir,$non_bs_mm,$insertion_open,$insertion_extend,$deletion_open,$deletion_extend,$gzip,$bam,$samtools_path,$pbat,$prefix,$old_flag,$basename,$score_min_intercept,$score_min_slope,$bt2_large_index,$multicore,$rg_tag,$rg_id,$rg_sample,$ambig_bam,$cram,$cram_ref,$nucleotide_coverage,$dovetail) = process_command_line();
-
-my @fhs;         # stores alignment process names, bisulfite index location, bowtie filehandles and the number of times sequences produced an alignment
-my %chromosomes; # stores the chromosome sequences of the mouse genome
-my %SQ_order;    # stores the order of sequences in the reference. This is to produce SAM/BAM files with a known order of chromosomes
-my %counting;    # counting various events
-my $final_output_filename; # required for the nucleotide coverage report 
-my @pids; # storing the process IDs of child processes in parallel mode
-
-
-my $seqID_contains_tabs;
-my $verbose = 0;
-
-if ($multicore > 1){
-  warn "Running Bismark Parallel version. Number of parallel instances to be spawned: $multicore\n\n";
-}
-
-
-sub multi_process_handling{
-
-  my $offset = 1;
-  my $process_id;
-  if ($multicore > 1){
-
-    until ($offset == $multicore){
-      # warn "multicore: $multicore\noffset: $offset\n";
-      my $fork = fork;
-
-      if (defined $fork){
-	if ($fork != 0){
-	  $process_id = $fork;
-	  push @pids, $process_id;
-	  if ($offset < $multicore){
-	    ++$offset;
-	    # warn "I am the parent process, child pid: $fork\nIncrementing offset counter to: $offset\n\n";
-	  }
-	  else{
-	    # warn "Reached the number of maximum multicores. Proceeeding to processing...\n";
-	  }
-	}
-	elsif ($fork == 0){
-	  # warn "I am a child process, pid: $fork\nOffset counter is: $offset\nProceeding to processing...\n";
-	  $process_id = $fork;
-	  last;
-	}
-      }
-      else{
-	die "Forking unsuccessful. Proceeding using a single thread only\n";
-      }
-    }
-
-    # warn "\nThe Thread Identity\n===================\n";
-    if ($process_id){
-      # print "I am the parent process. My children are called:\n";
-      # print join ("\t",@pids),"\n";
-      # print "I am going to process the following line count: $offset\n\n";
-    }
-    elsif($process_id == 0){
-      # warn "I am a child process: Process ID: $process_id\n";
-      # warn "I am going to process the following line count: $offset\n\n";
-    }
-    else{
-      die "Process ID was: '$process_id'\n";
-    }
-  }
-  else{
-    warn "Single-core mode: setting pid to 1\n";
-    $process_id = 1;
-  }
-
-  return ($process_id,$offset);
-}
-
-
-sub subset_input_file_FastQ{
-
-  my ($filename,$process_id,$offset) = @_;
-
-  if ($filename =~ /gz$/){
-    open (OFFSET,"gunzip -c $filename |") or die "Couldn't read from file '$filename': $!\n";
-  }
-  else{
-    open (OFFSET,$filename) or die "Couldn't read from file '$filename': $!\n";
-  }
-
-  # warn "offset is $offset\n";
-  my $temp = $filename;
-  $temp .= ".temp.$offset";
-  $temp =~ s/^.*\///; # replacing everything upto and including the last /, i.e. removing file path information
-
-  if ($gzip){
-    $temp .= '.gz';
-    open (TEMPFQ,"| gzip -c - > ${temp_dir}${temp}") or die "Can't write to file ${temp_dir}${temp}: $!\n";
-  }
-  else{
-    open (TEMPFQ,'>',"${temp_dir}${temp}") or die "Failed to write output ${temp_dir}${temp}: $!\n";
-  }
-
-  my $line_count = 0;
-
-  while (1){
-    my $l1 = <OFFSET>;
-    my $l2 = <OFFSET>;
-    my $l3 = <OFFSET>;
-    my $l4 = <OFFSET>;
-
-    last unless ($l4);
-    ++$line_count;
-
-    if ( ($line_count - $offset)%$multicore == 0){
-      # warn "line count: $line_count\noffset: $offset\n";
-      # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-      # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-      print TEMPFQ "$l1$l2$l3$l4";
-    }
-    else{
-      # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-      next;
-    }
-  }
-
-  close OFFSET or warn $!;
-  close TEMPFQ or warn "Failed to close file handle TEMPFQ: $!\n";
-
-  warn "Finished subdividing $filename for PID: $process_id and offset $offset\n\n";
-
-  return ($temp); # returning the subset filename
-
-}
-
-sub subset_input_file_FastA{
-
-  my ($filename,$process_id,$offset) = @_;
-
-  if ($filename =~ /gz$/){
-    open (OFFSET,"gunzip -c $filename |") or die "Couldn't read from file '$filename': $!\n";
-  }
-  else{
-    open (OFFSET,$filename) or die "Couldn't read from file '$filename': $!\n";
-  }
-
-  # warn "offset is $offset\n";
-  my $temp = $filename;
-  $temp .= ".temp.$offset";
-  $temp =~ s/^.*\///; # replacing everything upto and including the last /, i.e. removing file path information
-
-  if ($gzip){
-    $temp .= '.gz';
-    open (TEMPFA,"| gzip -c - > ${temp_dir}${temp}") or die "Can't write to file ${temp_dir}${temp}: $!\n";
-  }
-  else{
-    open (TEMPFA,'>',"${temp_dir}${temp}") or die "Failed to write output ${temp_dir}${temp}: $!\n";
-  }
-
-  warn "Writing temporary infile to $temp\n";
-
-  my $line_count = 0;
-
-  while (1){
-    my $l1 = <OFFSET>;
-    my $l2 = <OFFSET>;
-
-    last unless ($l2);
-    ++$line_count;
-
-    if ( ($line_count - $offset)%$multicore == 0){
-      # warn "line count: $line_count\noffset: $offset\n";
-      # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-      # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-      print TEMPFA "$l1$l2";
-    }
-    else{
-      # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-      next;
-    }
-  }
-
-  close OFFSET or warn $!;
-  close TEMPFA or warn "Failed to close file handle TEMPFQ: $!\n";
-
-  warn "Finished subdividing $filename for PID: $process_id and offset $offset\n\n";
-
-  return ($temp); # returning the subset filename
-
-}
-
-#####
-#####
-
-foreach my $filename (@filenames){
-
-  my $original_filename = $filename;
-  my $original_filename_1;
-  my $original_filename_2;
-
-  chdir $parent_dir or die "Unable to move to initial working directory'$parent_dir' $!\n";
-  ### resetting the counting hash and fhs
-  reset_counters_and_fhs($filename);
-  @pids = ();
-  $seqID_contains_tabs = 0;
-
-  ### if 2 or more files are provided we can hold the genome in memory and don't need to read it in a second time
-  unless (%chromosomes){
-      my $cwd = getcwd; # storing the path of the current working directory
-      warn "Current working directory is: $cwd\n\n";
-      read_genome_into_memory($cwd);
-  }
-
-  ### As of version 0.14.0 we support multi-threading. In a first instance we accomplish this by
-  ### splitting the input file(s) into several smaller subfiles and merging the results back at
-  ### the end.
-
-  # get general settings (also for single-threaded use)
-  my ($pid,$offset) = multi_process_handling ();
-
-  my ($single_end,$paired_end);
-  ### PAIRED-END ALIGNMENTS
-  if ($filename =~ ','){
-      
-    $single_end = 0;
-    $paired_end = 1;
-
-    my ($C_to_T_infile_1,$G_to_A_infile_1); # to be made from mate1 file
-
-    $fhs[0]->{name} = 'CTread1GAread2CTgenome';
-    $fhs[1]->{name} = 'GAread1CTread2GAgenome';
-    $fhs[2]->{name} = 'GAread1CTread2CTgenome';
-    $fhs[3]->{name} = 'CTread1GAread2GAgenome';
-    warn "\nPaired-end alignments will be performed\n",'='x39,"\n\n";
-
-    my ($filename_1,$filename_2) = (split (/,/,$filename));
-    $original_filename_1 = $filename_1;
-    $original_filename_2 = $filename_2;
-
-    warn "The provided filenames for paired-end alignments are $filename_1 and $filename_2\n";
-
-    ### subsetting the input file(s)
-    unless ($multicore == 1){ # not needed in single-core mode
-      # warn "My PID: $pid\nMy offset: $offset\n";
-      if ($sequence_file_format eq 'FASTA'){
-	my $temp_filename_1 = subset_input_file_FastA($filename_1,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename_1< as new in-file 1 (instead of >$filename_1<)\n";
-	$filename_1 = "${temp_dir}$temp_filename_1";
-	
-	my $temp_filename_2 = subset_input_file_FastA($filename_2,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename_2< as new in-file 2 (instead of >$filename_2<)\n";
-	$filename_2 = "${temp_dir}$temp_filename_2";
-      }
-      else{ # FastQ format, default
-	my $temp_filename_1 = subset_input_file_FastQ($filename_1,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename_1< as new in-file 1 (instead of >$filename_1<)\n";
-	$filename_1 = "${temp_dir}$temp_filename_1";
-
-	my $temp_filename_2 = subset_input_file_FastQ($filename_2,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename_2< as new in-file 2 (instead of >$filename_2<)\n";
-	$filename_2 = "${temp_dir}$temp_filename_2";
-      }
-    }
-
-    ### additional variables only for paired-end alignments
-    my ($C_to_T_infile_2,$G_to_A_infile_2); # to be made from mate2 file
-
-    ### FastA format
-    if ($sequence_file_format eq 'FASTA'){
-      warn "Input files are in FastA format\n";
-
-      if ($directional){
-	($C_to_T_infile_1) = biTransformFastAFiles_paired_end ($filename_1,1); # also passing the read number
-	($G_to_A_infile_2) = biTransformFastAFiles_paired_end ($filename_2,2);
-
-	$fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	$fhs[1]->{inputfile_1} = undef;
-	$fhs[1]->{inputfile_2} = undef;
-	$fhs[2]->{inputfile_1} = undef;
-	$fhs[2]->{inputfile_2} = undef;
-	$fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-      }
-      else{
-	($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastAFiles_paired_end ($filename_1,1); # also passing the read number
-	($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastAFiles_paired_end ($filename_2,2);
-
-	$fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	$fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-      }
-
-      if ($bowtie2){
-	paired_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-      }
-      else{
-	paired_end_align_fragments_to_bisulfite_genome_fastA ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-      }
-    }
-
-    ### FastQ format
-    else{
-      warn "Input files are in FastQ format\n";
-      if ($directional){
-	if ($bowtie2){
-	  ($C_to_T_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	  ($G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	  $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	  $fhs[1]->{inputfile_1} = undef;
-	  $fhs[1]->{inputfile_2} = undef;
-	  $fhs[2]->{inputfile_1} = undef;
-	  $fhs[2]->{inputfile_2} = undef;
-	  $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	}
-	else{ # Bowtie 1 alignments
-	  if ($gzip){
-	    ($C_to_T_infile_1) = biTransformFastQFiles_paired_end_bowtie1_gzip ($filename_1,$filename_2); # passing both reads at the same time
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1; # this file contains both read 1 and read 2 in tab delimited format
-	    $fhs[0]->{inputfile_2} = undef; # no longer needed
-	    $fhs[1]->{inputfile_1} = undef;
-	    $fhs[1]->{inputfile_2} = undef;
-	    $fhs[2]->{inputfile_1} = undef;
-	    $fhs[2]->{inputfile_2} = undef;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1; # this file contains both read 1 and read 2 in tab delimited format
-	    $fhs[3]->{inputfile_2} = undef; # no longer needed
-	  }
-	  else{
-	    ($C_to_T_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	    ($G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	    $fhs[1]->{inputfile_1} = undef;
-	    $fhs[1]->{inputfile_2} = undef;
-	    $fhs[2]->{inputfile_1} = undef;
-	    $fhs[2]->{inputfile_2} = undef;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	  }
-	}
-      }
-      elsif($pbat){ # PBAT-Seq. This works for both Bowtie and Bowtie 2
-	### At the moment we are only performing alignments only with uncompressed FastQ files
-	($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	$fhs[0]->{inputfile_1} = undef;
-	$fhs[0]->{inputfile_2} = undef;
-	$fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[3]->{inputfile_1} = undef;
-	$fhs[3]->{inputfile_2} = undef;
-      }
-      else{
-	if ($bowtie2){
-	  ($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	  ($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	  $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	  $fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	  $fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	  $fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	  $fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	  $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	}
-	else{ # Bowtie 1 alignments
-	  if ($gzip){
-	    ($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end_bowtie1_gzip ($filename_1,$filename_2); # passing both reads at the same time
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[0]->{inputfile_2} = undef; # not needed for compressed temp files
-	    $fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[1]->{inputfile_2} = undef;
-	    $fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[2]->{inputfile_2} = undef;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[3]->{inputfile_2} = undef; # not needed for compressed temp files
-	  }
-	  else{ # uncompressed temp files
-	    ($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	    ($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	    $fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	    $fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	  }
-	}
-      }
-      if ($bowtie2){
-	paired_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-      }
-      else{
-       	paired_end_align_fragments_to_bisulfite_genome_fastQ ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);	
-      }
-    }
-    start_methylation_call_procedure_paired_ends($filename_1,$filename_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid);
-  }
-
-  ### Else we are performing SINGLE-END ALIGNMENTS
-  else{
-    warn "\nSingle-end alignments will be performed\n",'='x39,"\n\n";
-
-    $single_end = 1;
-    $paired_end = 0;
-
-    ### subsetting the input file(s)
-    unless ($multicore == 1){ # not needed in single-core mode
-      # warn "My PID: $pid\nMy offset: $offset\n";
-      if ($sequence_file_format eq 'FASTA'){
-	my $temp_filename = subset_input_file_FastA($filename,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename< as new in-file (instead of >$filename<)\n";
-	$filename = "${temp_dir}$temp_filename";
-      }
-      else{ # FastQ format, default
-	my $temp_filename = subset_input_file_FastQ($filename,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename< as new in-file (instead of >$filename<)\n";
-	$filename = "${temp_dir}$temp_filename";
-      }
-    }
-
-    ### Initialising bisulfite conversion filenames
-    my ($C_to_T_infile,$G_to_A_infile);
-
-    ### FastA format
-    if ($sequence_file_format eq 'FASTA'){
-      warn "Input file is in FastA format\n";
-      if ($directional){
-	($C_to_T_infile) = biTransformFastAFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-      }
-      else{
-	($C_to_T_infile,$G_to_A_infile) = biTransformFastAFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-	$fhs[2]->{inputfile} = $fhs[3]->{inputfile} = $G_to_A_infile;
-      }
-
-      ### Creating 4 different bowtie filehandles and storing the first entry
-      if ($bowtie2){
-	single_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 ($C_to_T_infile,$G_to_A_infile);
-      }
-      else{
-	single_end_align_fragments_to_bisulfite_genome_fastA ($C_to_T_infile,$G_to_A_infile);
-      }
-    }
-
-    ## FastQ format
-    else{
-      warn "Input file is in FastQ format\n";
-      if ($directional){
-	($C_to_T_infile) = biTransformFastQFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-      }
-      elsif($pbat){
-	($G_to_A_infile) = biTransformFastQFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $G_to_A_infile; # PBAT-Seq only uses the G to A converted files
-      }
-      else{
-	($C_to_T_infile,$G_to_A_infile) = biTransformFastQFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-	$fhs[2]->{inputfile} = $fhs[3]->{inputfile} = $G_to_A_infile;
-      }
-
-      ### Creating up to 4 different bowtie filehandles and storing the first entry
-      if ($pbat){
-	if ($bowtie2){ # as of version 0.10.2 we also support PBAT alignments for Bowtie 2
-	  single_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 (undef,$G_to_A_infile);
-	}
-	else{
-	  single_end_align_fragments_to_bisulfite_genome_fastQ (undef,$G_to_A_infile);
-	}
-      }
-      elsif ($bowtie2){
-	single_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 ($C_to_T_infile,$G_to_A_infile);
-      }
-      else{
-	single_end_align_fragments_to_bisulfite_genome_fastQ ($C_to_T_infile,$G_to_A_infile);
-      }
-    }
-
-    start_methylation_call_procedure_single_ends($filename,$C_to_T_infile,$G_to_A_infile,$pid);
-
-  }
-
-  ### MERGING AND DELETING TEMP FILES // TIDYING UP AFTER A MULTICORE PROCESS
-
-  if ($pid){ # only performing this for the parent process
-
-    if ($multicore > 1){
-
-      warn "Now waiting for all child processes to complete\n";
-
-      ### we need to ensure that we wait for all child processes to be finished before continuing
-      # warn "here are the child IDs: @pids\n";
-      # warn "Looping through the child process IDs:\n";
-
-      foreach my $id (@pids){
-	# print "$id\t";
-	my $kid = waitpid ($id,0);
-	# print "Returned: $kid\nExit status: $?\n";
-	unless ($? == 0){
-	  warn "\nChild process terminated with exit signal: '$?'\n\n";
-	}
-      }
-
-      # regenerating names for temporary files
-      my @temp_input;
-      my @temp_output;
-      my @temp_reports;
-      my @temp_unmapped_1;  # will store single end reads or R1 of paired-end
-      my @temp_unmapped_2;
-      my @temp_ambiguous_1; # will store single end reads or R1 of paired-end
-      my @temp_ambiguous_2;
-      my @temp_ambig_bam; 
-
-      for (1..$offset){
-
-	# Temp Input Files
-	if ($single_end){
-	  if ($gzip){
-	    push @temp_input, "${original_filename}.temp.${_}.gz";
-	  }
-	  else{
-	    push @temp_input, "${original_filename}.temp.${_}";
-	  }
-
-	}
-	elsif($paired_end){
-	  if ($gzip){
-	    push @temp_input, "${original_filename_1}.temp.${_}.gz";
-	    push @temp_input, "${original_filename_2}.temp.${_}.gz";
-	  }
-	  else{
-	    push @temp_input, "${original_filename_1}.temp.${_}";
-	    push @temp_input, "${original_filename_2}.temp.${_}";
-	  }
-	}
-
-	# if files had a prefix we need to specify it
-	my $add_prefix;
-	if (defined $prefix){
-	  $add_prefix = "${prefix}.";
-	}
-	else{
-	  $add_prefix = '';
-	}
-
-	# Temp Output Files
-	if ($single_end){
-	
-	  if ($bowtie2){
-	    if ($gzip){
-		push @temp_output,     "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_bismark_bt2.bam";
-		push @temp_reports,    "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_bismark_bt2_SE_report.txt";
-		push @temp_ambig_bam,  "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_bismark_bt2.ambig.bam";   # only for Bowtie 2 
-	    }
-	    else{
-		push @temp_output,     "${output_dir}${add_prefix}${original_filename}.temp.${_}_bismark_bt2.bam";
-		push @temp_reports,    "${output_dir}${add_prefix}${original_filename}.temp.${_}_bismark_bt2_SE_report.txt";
-		push @temp_ambig_bam,  "${output_dir}${add_prefix}${original_filename}.temp.${_}_bismark_bt2.ambig.bam";      # only for Bowtie 2 
-	    }
-	  }
-	  else{
-	    if ($gzip){
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_bismark.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_bismark_SE_report.txt";
-	    }
-	    else{
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename}.temp.${_}_bismark.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename}.temp.${_}_bismark_SE_report.txt";
-	    }
-	  }
-	
-	  if ($unmapped){
-	    if ($gzip){
-	      push @temp_unmapped_1,   "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_unmapped_reads.fq";
-	    }
-	    else{
-	      push @temp_unmapped_1,   "${output_dir}${add_prefix}${original_filename}.temp.${_}_unmapped_reads.fq";
-  	    }
-	  }
-
-	  if ($ambiguous){
-	    if ($gzip){
-	      push @temp_ambiguous_1,  "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_ambiguous_reads.fq";
-	    }
-	    else{
-	      push @temp_ambiguous_1,  "${output_dir}${add_prefix}${original_filename}.temp.${_}_ambiguous_reads.fq";
-	    }
-	  }
-	
-	}
-	elsif($paired_end){
-	  if ($bowtie2){
-	    if ($gzip){
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_bismark_bt2_pe.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_bismark_bt2_PE_report.txt";
-	      push @temp_ambig_bam,  "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_bismark_bt2_pe.ambig.bam";      # only for Bowtie 2 
-	    }
-	    else{
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_bismark_bt2_pe.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_bismark_bt2_PE_report.txt";
-	      push @temp_ambig_bam,  "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_bismark_bt2_pe.ambig.bam";         # only for Bowtie 2 
-	    }
-	  }
-	  else{
-	    if ($gzip){
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_bismark_pe.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_bismark_PE_report.txt";
-	    }
-	    else{
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_bismark_pe.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_bismark_PE_report.txt";
-	    }
-	  }
-
-	  if ($unmapped){
-	    if ($gzip){
-	      push @temp_unmapped_1,   "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_unmapped_reads_1.fq";
-	      push @temp_unmapped_2,   "${output_dir}${add_prefix}${original_filename_2}.temp.${_}.gz_unmapped_reads_2.fq";
-	    }
-	    else{
-	      push @temp_unmapped_1,   "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_unmapped_reads_1.fq";
-	      push @temp_unmapped_2,   "${output_dir}${add_prefix}${original_filename_2}.temp.${_}_unmapped_reads_2.fq";
-	    }
-	  }
-
-	  if ($ambiguous){
-	    if ($gzip){
-	      push @temp_ambiguous_1,   "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_ambiguous_reads_1.fq";
-	      push @temp_ambiguous_2,   "${output_dir}${add_prefix}${original_filename_2}.temp.${_}.gz_ambiguous_reads_2.fq";
-	    }
-	    else{
-	      push @temp_ambiguous_1,   "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_ambiguous_reads_1.fq";
-	      push @temp_ambiguous_2,   "${output_dir}${add_prefix}${original_filename_2}.temp.${_}_ambiguous_reads_2.fq";
-	    }
-	  }
-	
-	}
-      }
-
-      warn "\n\nRight, cleaning up now...\n\n";
-
-      # deleting temp files;
-      warn "Deleting temporary sequence files...\n";
-      foreach my $temp (@temp_input){
-	#print "$temp\t";
-	$temp =~ s/.*\///; # deleting path information
-	print "${temp_dir}${temp}\t";
-	unlink "${temp_dir}${temp}" or warn "Failed to delete temporary FastQ file ${temp_dir}$temp: $!\n";
-      }
-      print "\n\n";
-
-      # merging temp BAM files
-      if ($single_end){
-	merge_individual_BAM_files(\@temp_output,$original_filename,$single_end);
-      }
-      else{
-	merge_individual_BAM_files(\@temp_output,$original_filename_1,$single_end);
-      }
-      
-      # deleting temp BAM files
-      warn "Deleting temporary BAM files...\n";
-      foreach my $temp (@temp_output){
-	  # print "$temp\t";
-	  $temp =~ s/.*\///; # deleting path information
-	  print "${output_dir}${temp}\t";
-	  unlink "${output_dir}${temp}" or warn "Failed to delete temporary BAM file ${output_dir}${temp}: $!\n";
-      }
-      print "\n\n";
-      
-      ### AMBIGUOUS BAM files
-      if ($ambig_bam){
-
-	  # merging temp AMBIG BAM files
-	  if ($single_end){
-	      merge_individual_ambig_BAM_files(\@temp_ambig_bam,$original_filename,$single_end);
-	  }
-	  else{
-	      merge_individual_ambig_BAM_files(\@temp_ambig_bam,$original_filename_1,$single_end);
-	  }
-	  
-	  # deleting temp BAM files
-	  warn "Deleting temporary ambiguous BAM files...\n";
-	  foreach my $temp (@temp_ambig_bam){
-	      # print "$temp\t";
-	      $temp =~ s/.*\///; # deleting path information
-	      print "${output_dir}${temp}\t";
-	      unlink "${output_dir}${temp}" or warn "Failed to delete temporary ambiguous BAM file ${output_dir}${temp}: $!\n";
-	  }
-	  print "\n\n";
-      }
-
-      if ($unmapped){
-	if ($single_end){
-	  merge_individual_unmapped_files(\@temp_unmapped_1,$original_filename,$single_end);
-	}
-	else{
-	  merge_individual_unmapped_files(\@temp_unmapped_1,$original_filename_1,$single_end,'_1');
-	  merge_individual_unmapped_files(\@temp_unmapped_2,$original_filename_2,$single_end,'_2');
-	}
-
-	# deleting temp unmapped files
-	warn "Deleting temporary unmapped files...\n";
-	foreach my $temp (@temp_unmapped_1){
-	  print "$temp\t";
-	  unlink "${output_dir}${temp}" or warn "Failed to delete temporary unmapped FastQ file ${output_dir}$temp: $!\n";
-	}
-	if ($paired_end){
-	  foreach my $temp (@temp_unmapped_2){
-	    print "$temp\t";
-	    unlink "${output_dir}${temp}" or warn "Failed to delete temporary unmapped FastQ file ${output_dir}$temp: $!\n";
-	  }
-	}
-	print "\n\n";
-
-      }
-
-      if ($ambiguous){
-	if ($single_end){
-	  merge_individual_ambiguous_files(\@temp_ambiguous_1,$original_filename,$single_end);
-	}
-	else{
-	  merge_individual_ambiguous_files(\@temp_ambiguous_1,$original_filename_1,$single_end,'_1');
-	  merge_individual_ambiguous_files(\@temp_ambiguous_2,$original_filename_2,$single_end,'_2');
-	}
-
-	# deleting temp ambiguous files
-	warn "Deleting temporary ambiguous files...\n";
-	foreach my $temp (@temp_ambiguous_1){
-	  print "$temp\t";
-	  unlink "${output_dir}${temp}" or warn "Failed to delete temporary ambiguous FastQ file ${output_dir}$temp: $!\n";
-	}
-
-	if ($paired_end){
-	  foreach my $temp (@temp_ambiguous_2){
-	    print "$temp\t";
-	    unlink "${output_dir}${temp}" or warn "Failed to delete temporary ambiguous FastQ file ${output_dir}$temp: $!\n";
-	  }
-	}
-	print "\n\n";
-      }
-
-      # resetting the counters once more so we can add all data from all temporary reports
-      reset_counters_and_fhs($original_filename);
-
-      ### Merging the Bismark mapping report files
-      if ($single_end){
-	merge_individual_mapping_reports(\@temp_reports,$original_filename,$single_end);
-	print_final_analysis_report_single_end('mock_file1','mock_file_2','mock_pid','mergeThis');
-      }
-      else{
-	merge_individual_mapping_reports(\@temp_reports,$original_filename_1,$single_end,$original_filename_2);
-	print_final_analysis_report_paired_ends('mock_file1','mock_file_2','mock_file3','mock_file_4','mock_pid','mergeThis');
-      }
-
-      # deleting temp report files
-      warn "Deleting temporary report files...\n";
-      foreach my $temp (@temp_reports){
-	print "$temp\t";
-	unlink "${output_dir}${temp}" or warn "Failed to delete temporary report file $output_dir$temp: $!\n";
-      }
-      print "\n\n";
-
-    }
-
-  }
-
-  if ($pid){ # only for the Parent
-    warn "\n====================\nBismark run complete\n====================\n\n";
-
-    if ($nucleotide_coverage){
-	warn "Now calculating observed and expected nucleotide coverage statistics... \n\n";
-	if ($final_output_filename =~ /(bam|cram)|/){
-	    my @args;
-	    push @args, "--genome $genome_folder";
-	    push @args, "--dir '$output_dir'";
-	    push @args, "--samtools_path $samtools_path";
-	    push @args, $final_output_filename;
-	    print "@args","\n"; sleep(3);
-	    
-	    system ("$Bin/bam2nuc @args");
-	    warn "Finished bam2nuc calculation ...\n\n";
-	   
-	}
-	else{
-	    warn "Nucleotide coverage statistics are currently only available for BAM or CRAM files\n\n";
-	}
-    }
-    
-  }
-
-}
-
-sub merge_individual_mapping_reports{
-
-  my ($temp_reports,$original_filename_1,$single_end,$original_filename_2) = @_;
-  my $report_file = $original_filename_1;
-  $report_file =~ s/.*\///; # removing path information
-  $report_file =~ s/(\.fastq\.gz|\.fq\.gz|\.fastq|\.fq)$//; # attempting to remove fastq.gz etc to make filename a little shorter
- 
-  if ($prefix){
-    $report_file = "${prefix}.${report_file}";
-  }
-
-  if ($basename){ # Output file basename is set using the -B argument
-    $report_file = ${basename};
-  }
-
-  if ($single_end){
-    if ($bowtie2){
-      $report_file .= '_bismark_bt2_SE_report.txt';
-    }
-    else{
-      $report_file .= '_bismark_SE_report.txt';
-    }
-  }
-  else{
-    if ($bowtie2){
-      $report_file .= '_bismark_bt2_PE_report.txt';
-    }
-    else{
-      $report_file .= '_bismark_PE_report.txt';
-    }
-  }
-  warn "Writing report to ${output_dir}${report_file}\n";
-  open (REPORT,'>',"$output_dir$report_file") or die "Failed to write to ${output_dir}${report_file}: $!\n";
-
-  foreach my $temp(@$temp_reports){
-    $temp =~ s/.*\///; # removing path information
-  }
-
-  warn "Now merging temporary reports @$temp_reports into >>> ${output_dir}${report_file} <<<\n";
-
-  if ($single_end){
-    print REPORT "Bismark report for: $original_filename_1 (version: $bismark_version)\n";
-  }
-  else{ # paired-end
-    print REPORT "Bismark report for: $original_filename_1 and $original_filename_2 (version: $bismark_version)\n";
-  }
-
-
-  my $first = 0;
-
-  foreach my $temp(@$temp_reports){
-    # $temp =~ s/.*\///; # removing path information
-
-    warn "Merging from file >> $temp <<\n";
-    open (IN,"${output_dir}${temp}") or die "Failed to read from temporary mapping report '${output_dir}${temp}'\n";
-
-    ### this is printing the first couple of lines
-    while (<IN>){
-      chomp;
-      if ($_ =~ /^Bismark report/){
-	next;
-      }
-
-      unless ($first){ # only happens for the first run we are processing
-	if ($_ =~ /^Final Alignment/){
-	  ++$first;
-	  last;
-	}
-	else{
-	  print REPORT "$_\n";
-	}
-      }
-    }
-    close IN or warn "Failed to close filehandle\n";
-
-    ### Simon says: You are going to regret this in the future. Just for the record. He might be right...
-    read_alignment_report($temp,$single_end);
-
-  }
-  warn "\n";
-
-}
-
-sub read_alignment_report{
-  my ($report,$single_end) = @_;
-
-  my $unique;
-  my $no_aln;
-  my $multiple;
-  my $no_genomic;
-  my $total_seqs;
-  my $bismark_version;
-  my $input_filename;
-
-  my $unique_text;
-  my $no_aln_text;
-  my $multiple_text;
-  my $total_seq_text;
-
-  my $total_C_count;
-  my ($meth_CpG,$meth_CHG,$meth_CHH,$meth_unknown);
-  my ($unmeth_CpG,$unmeth_CHG,$unmeth_CHH,$unmeth_unknown);
-
-  my $number_OT;
-  my $number_CTOT;
-  my $number_CTOB;
-  my $number_OB;
-
-  open (ALN,"${output_dir}${report}") or die "Failed to read from temporary mapping report '$output_dir$report'\n";
-
-  while (<ALN>){
-    chomp;
-
-    ### General Alignment stats
-    if ($_ =~ /^Sequence pairs analysed in total:/ ){ ## Paired-end
-      (undef,$total_seqs) = split /\t/;
-      # warn "Total paired seqs: >> $total_seqs <<\n";
-    }
-    elsif ($_ =~ /^Sequences analysed in total:/ ){   ## Single-end
-      (undef,$total_seqs) = split /\t/;
-      # warn "total single-end seqs >> $total_seqs <<\n";
-    }
-
-    elsif($_ =~ /^Number of paired-end alignments with a unique best hit:/){ ## Paired-end
-      (undef,$unique) = split /\t/;
-      # warn "Unique PE>> $unique <<\n";
-    }
-    elsif($_ =~ /^Number of alignments with a unique best hit from/){        ## Single-end
-      (undef,$unique) = split /\t/;
-      # warn "Unique SE>> $unique <<\n";
-    }
-
-    elsif($_ =~ /^Sequence pairs with no alignments under any condition:/){  ## Paired-end
-      (undef,$no_aln) = split /\t/;
-      # warn "No alignment PE >> $no_aln <<\n";
-    }
-    elsif($_ =~ /^Sequences with no alignments under any condition:/){  ## Single-end
-      (undef,$no_aln) = split /\t/;
-      # warn "No alignments SE>> $no_aln <<\n";
-    }
-
-    elsif($_ =~ /^Sequence pairs did not map uniquely:/){ ## Paired-end
-      (undef,$multiple) = split /\t/;
-      # warn "Multiple alignments PE >> $multiple <<\n";
-    }
-    elsif($_ =~ /^Sequences did not map uniquely:/){ ## Single-end
-      (undef,$multiple) = split /\t/;
-      # warn "Multiple alignments SE >> $multiple <<\n";
-    }
-
-    elsif($_ =~ /^Sequence pairs which were discarded because genomic sequence could not be extracted:/){ ## Paired-end
-      (undef,$no_genomic) = split /\t/;
-      # warn "No genomic sequence PE >> $no_genomic <<\n";
-    }
-    elsif($_ =~ /^Sequences which were discarded because genomic sequence could not be extracted:/){ ## Single-end
-      (undef,$no_genomic) = split /\t/;
-      # warn "No genomic sequence SE>> $no_genomic <<\n";
-    }
-
-    ### Context Methylation
-    elsif($_ =~ /^Total number of C/ ){
-      (undef,$total_C_count) = split /\t/;
-      # warn "Total number C >> $total_C_count <<\n";
-    }
-
-    elsif($_ =~ /^Total methylated C\'s in CpG context:/ ){
-      (undef,$meth_CpG) = split /\t/;
-      # warn "meth CpG >> $meth_CpG <<\n" ;
-    }
-    elsif($_ =~ /^Total methylated C\'s in CHG context:/ ){
-      (undef,$meth_CHG) = split /\t/;
-      # warn "meth CHG >> $meth_CHG <<\n" ;
-    }
-    elsif($_ =~ /^Total methylated C\'s in CHH context:/ ){
-      (undef,$meth_CHH) = split /\t/;
-      # warn "meth CHH >> $meth_CHH <<\n" ;
-    }
-    elsif($_ =~ /^Total methylated C\'s in Unknown context:/ ){
-      (undef,$meth_unknown) = split /\t/;
-      # warn "meth Unknown >> $meth_unknown <<\n" ;
-    }
-
-    elsif($_ =~ /^Total unmethylated C\'s in CpG context:/ or $_ =~ /^Total C to T conversions in CpG context:/){
-      (undef,$unmeth_CpG) = split /\t/;
-      # warn "unmeth CpG >> $unmeth_CpG <<\n" ;
-    }
-    elsif($_ =~ /^Total unmethylated C\'s in CHG context:/ or $_ =~ /^Total C to T conversions in CHG context:/){
-      (undef,$unmeth_CHG) = split /\t/;
-      # warn "unmeth CHG >> $unmeth_CHG <<\n" ;
-    }
-    elsif($_ =~ /^Total unmethylated C\'s in CHH context:/ or $_ =~ /^Total C to T conversions in CHH context:/){
-      (undef,$unmeth_CHH) = split /\t/;
-      # warn "unmeth CHH >> $unmeth_CHH <<\n";
-    }
-    elsif($_ =~ /^Total unmethylated C\'s in Unknown context:/ or $_ =~ /^Total C to T conversions in Unknown context:/){
-      (undef,$unmeth_unknown) = split /\t/;
-      # warn "unmeth Unknown >> $unmeth_unknown <<\n" ;
-    }
-
-    ### Strand Origin
-
-    elsif($_ =~ /^CT\/GA\/CT:/ ){             ## Paired-end
-      (undef,$number_OT) = split /\t/;
-      # warn "Number OT PE>> $number_OT <<\n" ;
-    }
-    elsif($_ =~ /^CT\/CT:/ ){                 ## Single-end
-      (undef,$number_OT) = split /\t/;
-      # warn "Number OT SE>> $number_OT <<\n" ;
-    }
-
-    elsif($_ =~ /^GA\/CT\/CT:/ ){             ## Paired-end
-      (undef,$number_CTOT) = split /\t/;
-      # warn "Number CTOT PE >> $number_CTOT <<\n" ;
-    }
-    elsif($_ =~ /^GA\/CT:/ ){                 ## Single-end
-      (undef,$number_CTOT) = split /\t/;
-      # warn "Number CTOT SE >> $number_CTOT <<\n" ;
-    }
-
-    elsif($_ =~ /^GA\/CT\/GA:/ ){             ## Paired-end
-      (undef,$number_CTOB) = split /\t/;
-      # warn "Number CTOB PE >> $number_CTOB <<\n" ;
-    }
-    elsif($_ =~ /^GA\/GA:/ ){                 ## Single-end
-      (undef,$number_CTOB) = split /\t/;
-      # warn "Number CTOB SE >> $number_CTOB <<\n";
-    }
-
-    elsif($_ =~ /^CT\/GA\/GA:/ ){             ## Paired-end
-      (undef,$number_OB) = split /\t/;
-      # warn "Number OB PE >> $number_OB <<\n";
-    }
-    elsif($_ =~ /^CT\/GA:/ ){                 ## Single-end
-      (undef,$number_OB) = split /\t/;
-      # warn "Number OB SE >> $number_OB <<\n";
-    }
-  }
-
-  $counting{sequences_count}                               += $total_seqs;
-  $counting{unique_best_alignment_count}                   += $unique;
-  $counting{no_single_alignment_found}                     += $no_aln;
-  $counting{unsuitable_sequence_count}                     += $multiple;
-  $counting{genomic_sequence_could_not_be_extracted_count} += $no_genomic;
-
-  $counting{total_meCHH_count}                             += $meth_CHH;
-  $counting{total_meCHG_count}                             += $meth_CHG;
-  $counting{total_meCpG_count}                             += $meth_CpG;
-  if ($bowtie2){
-    $counting{total_meC_unknown_count}                     += $meth_unknown;
-  }
-
-  $counting{total_unmethylated_CHH_count}                  += $unmeth_CHH;
-  $counting{total_unmethylated_CHG_count}                  += $unmeth_CHG;
-  $counting{total_unmethylated_CpG_count}                  += $unmeth_CpG;
-  if ($bowtie2){
-    $counting{total_unmethylated_C_unknown_count}          += $unmeth_unknown;
-  }
-
-  if ($single_end){
-    $counting{CT_CT_count}    += $number_OT;
-    $counting{CT_GA_count}    += $number_OB;
-    $counting{GA_CT_count}    += $number_CTOT;
-    $counting{GA_GA_count}    += $number_CTOB;
-  }
-  else{
-    # paired-end
-    $counting{GA_CT_CT_count} += $number_CTOT;
-    $counting{CT_GA_CT_count} += $number_OT;
-    $counting{GA_CT_GA_count} += $number_CTOB;
-    $counting{CT_GA_GA_count} += $number_OB;
-  }
-}
-
-sub merge_individual_ambiguous_files{
-
-  my ($temp_ambiguous,$original_filename,$single_end,$paired_information) = @_;
-  my $ambiguous_file = $original_filename;
-  $ambiguous_file =~ s/.*\///; # removing path information
-
-  if ($prefix){
-    $ambiguous_file = "${prefix}.${ambiguous_file}";
-  }
-
-  if ($single_end){
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file = "${basename}_ambiguous_reads.fq.gz";
-      }
-      else{
-	$ambiguous_file = "${basename}_ambiguous_reads.fa.gz";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file =~ s/$/_ambiguous_reads.fq.gz/;
-      }
-      else{
-	$ambiguous_file =~ s/$/_ambiguous_reads.fa.gz/;
-      }
-    }
-  }
-  else{ # paired-end
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file = "${basename}_ambiguous_reads${paired_information}.fq.gz";
-      }
-      else{
-	$ambiguous_file = "${basename}_ambiguous_reads${paired_information}.fa.gz";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file =~ s/$/_ambiguous_reads${paired_information}.fq.gz/;
-      }
-      else{
-	$ambiguous_file =~ s/$/_ambiguous_reads${paired_information}.fa.gz/;
-      }
-    }
-  }
-
-  foreach my $temp(@$temp_ambiguous){
-    $temp =~ s/.*\///; # removing path information
-  }
-
-  open (AMBIGUOUS,"| gzip -c - > $output_dir$ambiguous_file") or die "Failed to write to $ambiguous_file: $!\n";
-  warn "Now merging ambiguous sequences @$temp_ambiguous into >>> $output_dir$ambiguous_file <<<\n";
-
-  foreach my $temp(@$temp_ambiguous){
-    warn "Merging from file >> $temp <<\n";
-    if ($temp =~ /gz$/){
-      open (IN,"gunzip -c ${output_dir}$temp |") or die "Failed to read from ambiguous temp file '${output_dir}$temp'\n";
-    }
-    else{
-      open (IN,"${output_dir}$temp") or die "Failed to read from ambiguous temp file '${output_dir}$temp'\n";
-    }
-
-    while (<IN>){
-      print AMBIGUOUS;
-    }
-    close IN or warn "Failed to close filehandle\n";
-  }
-  warn "\n";
-
-  close AMBIGUOUS or warn "Failed to close output filehandle AMBIGUOUS\n\n";
-}
-
-
-sub merge_individual_unmapped_files{
-
-  my ($temp_unmapped,$original_filename,$single_end,$paired_information) = @_;
-  my $unmapped_file = $original_filename;
-  $unmapped_file =~ s/.*\///; # removing path information
-
-  if ($prefix){
-    $unmapped_file = "${prefix}.${unmapped_file}";
-  }
-
-  if ($single_end){
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file = "${basename}_unmapped_reads.fq.gz";
-      }
-      else{
-	$unmapped_file = "${basename}_unmapped_reads.fa.gz";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file =~ s/$/_unmapped_reads.fq.gz/;
-      }
-      else{
-	$unmapped_file =~ s/$/_unmapped_reads.fa.gz/;
-      }
-    }
-  }
-  else{ # paired-end
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file = "${basename}_unmapped_reads${paired_information}.fq.gz";
-      }
-      else{
-	$unmapped_file = "${basename}_unmapped_reads${paired_information}.fa.gz";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file =~ s/$/_unmapped_reads${paired_information}.fq.gz/;
-      }
-      else{
-	$unmapped_file =~ s/$/_unmapped_reads${paired_information}.fa.gz/;
-      }
-    }
-  }
-
-  foreach my $temp(@$temp_unmapped){
-    $temp =~ s/.*\///; # removing path information
-  }
-
-  open (UNMAPPED,"| gzip -c - > ${output_dir}${unmapped_file}") or die "Failed to write to ${output_dir}${unmapped_file}: $!\n";
-  warn "Now merging unmapped sequences @$temp_unmapped into >>> ${output_dir}${unmapped_file} <<<\n";
-
-  foreach my $temp(@$temp_unmapped){
-    warn "Merging from file >> $temp <<\n";
-    if ($temp =~ /gz$/){
-      open (IN,"gunzip -c ${output_dir}${temp} |") or die "Failed to read from unmapped temp file '${output_dir}$temp'\n";
-    }
-    else{
-      open (IN,"${output_dir}${temp}") or die "Failed to read from unmapped temp file '${output_dir}${temp}'\n";
-    }
-
-    while (<IN>){
-      print UNMAPPED;
-    }
-    close IN or warn "Failed to close filehandle\n";
-  }
-  warn "\n";
-
-  close UNMAPPED or warn "Failed to close output filehandle UNMAPPED\n\n";
-}
-
-
-sub merge_individual_BAM_files{
-
-  my ($tempbam,$original_filename,$single_end) = @_;
-  my $merged_name = $original_filename;
-  
-  #warn "merged name is: $merged_name\n";
-  $merged_name =~ s/.*\///; # deleting path information
-  # warn "merged name is: $merged_name\n";
-  $merged_name =~ s/(\.fastq\.gz|\.fq\.gz|\.fastq|\.fq)$//; # attempting to remove fastq.gz etc to make filename a little shorter
-  # warn "merged name is: $merged_name\n"; sleep(5);
-  
-  foreach my $temp_bam(@$tempbam){
-    $temp_bam =~ s/.*\///; # deleting path information
-  }
-
-  if ($prefix){
-    $merged_name = "$prefix.$merged_name";
-  }
-
-  if ($single_end){
-    if ($bowtie2){ # BAM format is the default for Bowtie 2
-      $merged_name .= '_bismark_bt2.bam';
-    }
-    else{          # BAM is the default output
-      $merged_name .= '_bismark.bam';
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      $merged_name = "${basename}.bam";
-    }
-  }
-  else{
-    if ($bowtie2){ # BAM format is the default for Bowtie 2
-      $merged_name .= '_bismark_bt2_pe.bam';
-    }
-    else{          # BAM is the default output
-      $merged_name .= '_bismark_pe.bam';
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      $merged_name = "${basename}_pe.bam";
-    }
-  }
-  
-
-  if ($cram){
-      $merged_name =~ s/bam$/cram/;
-      warn "At this stage we write out a single CRAM file and delete all temporary BAM files\n";
-      warn "Now merging BAM files @$tempbam into >>> $merged_name <<<\n";
-      $final_output_filename = "${output_dir}${merged_name}";
-      
-      open (OUT,"| $samtools_path view -h -C -T $cram_ref 2>/dev/null - > ${output_dir}${merged_name}") or die "Failed to write to CRAM file $merged_name: $!\nPlease note that this option requires Samtools version 1.2 or higher!\n\n";
-  }
-  else{
-      $final_output_filename = "${output_dir}${merged_name}";
-      warn "Now merging BAM files @$tempbam into >>> $merged_name <<<\n";
-      open (OUT,"| $samtools_path view -bSh 2>/dev/null - > ${output_dir}${merged_name}") or die "Failed to write to $merged_name: $!\n";
-  }  
-
-  my $first = 0;
-  
-  foreach my $temp_bam(@$tempbam){
-    # $temp_bam =~ s/.*\///; # deleting path information
-
-    warn "Merging from file >> $temp_bam <<\n";
-
-    if ($first > 0){
-      open (IN,"$samtools_path view ${output_dir}${temp_bam} |") or die "Failed to read from BAM file ${output_dir}${temp_bam}\n";
-    }
-    else{ # only for the first file we print the header as well
-      open (IN,"$samtools_path view -h ${output_dir}${temp_bam} |") or die "Failed to read from BAM file ${output_dir}${temp_bam}\n";
-    }
-
-    while (<IN>){
-      print OUT;
-    }
-    close IN or warn "Failed to close filehandle\n";
-    ++$first;
-  }
-  warn "\n";
-
-  close OUT or warn "Failed to close output filehandle\n\n";
-  
-}
-
-
-sub merge_individual_ambig_BAM_files{
-    
-    my ($tempbam,$original_filename,$single_end) = @_;
-    my $merged_name = $original_filename;
-    
-    # warn "merged name is: $merged_name\n";
-    $merged_name =~ s/.*\///; # deleting path information
-    # warn "merged name is: $merged_name\n"; sleep(1);
-
-    foreach my $temp_bam(@$tempbam){
-	$temp_bam =~ s/.*\///; # deleting path information
-    }
-    
-    if ($prefix){
-	$merged_name = "$prefix.$merged_name";
-    }
-    
-    if ($single_end){
-	if ($bowtie2){ # BAM format is the default for Bowtie 2
-	    $merged_name .= '_bismark_bt2.ambig.bam';
-	}
-	
-	if ($basename){ # Output file basename is set using the -B argument
-	    $merged_name = "${basename}.ambig.bam";
-	}
-    }
-    else{
-	if ($bowtie2){ # BAM format is the default for Bowtie 2
-	    $merged_name .= '_bismark_bt2_pe.ambig.bam';
-	}
-	
-	if ($basename){ # Output file basename is set using the -B argument
-	    $merged_name = "${basename}_pe.ambig.bam";
-	}
-    }
-
-    warn "Now merging ambiguous BAM files @$tempbam into >>> $merged_name <<<\n";
-    open (OUT,"| $samtools_path view -bSh 2>/dev/null - > ${output_dir}${merged_name}") or die "Failed to write to $merged_name: $!\n";
-    my $first = 0;
-    
-    foreach my $temp_bam(@$tempbam){
-	# $temp_bam =~ s/.*\///; # deleting path information
-	
-	warn "Merging from file >> $temp_bam <<\n";
-	
-	if ($first > 0){
-	    open (IN,"$samtools_path view ${output_dir}${temp_bam} |") or die "Failed to read from BAM file ${output_dir}${temp_bam}\n";
-	}
-	else{ # only for the first file we print the header as well
-	    open (IN,"$samtools_path view -h ${output_dir}${temp_bam} |") or die "Failed to read from BAM file ${output_dir}${temp_bam}\n";
-	}
-
-	while (<IN>){
-	    print OUT;
-	}
-	close IN or warn "Failed to close filehandle\n";
-	++$first;
-    }
-    warn "\n";
-    
-    close OUT or warn "Failed to close output filehandle\n\n";
-}
-
-sub start_methylation_call_procedure_single_ends {
-  my ($sequence_file,$C_to_T_infile,$G_to_A_infile,$pid) = @_;
-  my ($dir,$filename);
-
-  if ($sequence_file =~ /\//){
-    ($dir,$filename) = $sequence_file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $sequence_file;
-  }
-
-  ### printing all alignments to a results file
-  my $outfile = $filename;
-  # warn "Outfile: $outfile\n";
-  $outfile =~ s/(\.fastq\.gz|\.fq\.gz|\.fastq|\.fq)$//; # attempting to remove fastq.gz etc to make filename a little shorter
-  # warn "Outfile: $outfile\n";sleep(5);
-  
-  if ($prefix){
-    $outfile = "$prefix.$outfile";
-  }
-  if ($bowtie2){ # SAM format is the default for Bowtie 2
-    $outfile =~ s/$/_bismark_bt2.sam/;
-  }
-  elsif ($vanilla){ # vanilla custom Bismark output single-end output (like Bismark versions 0.5.X)
-    $outfile =~ s/$/_bismark.txt/;
-  }
-  else{ # SAM is the default output
-    $outfile =~ s/$/_bismark.sam/;
-  }
-
-  if ($basename){ # Output file basename is set using the -B argument
-    $outfile = "${basename}.sam";
-  }
-
-  $bam = 0 unless (defined $bam);
-  
-  if ($ambig_bam){
-      my $ambig_bam_out = $outfile;
-      $ambig_bam_out =~ s/sam$/ambig.bam/;
-      warn "Ambiguous BAM output: $ambig_bam_out\n";
-      open (AMBIBAM,"| $samtools_path view -bSh 2>/dev/null - > $output_dir$ambig_bam_out") or die "Failed to write to $ambig_bam_out: $!\n";
-  }
-
-  if ($cram){ ### Samtools is installed, writing out CRAM directly. This qill require Samtools version 1.2 or higher!
-      ### for multicore processing we write out BAM files by default and merge them together as a single CRAM file in the merging step later on.
-      ### This avoids having to change all the the file endings on the way
-      if($multicore > 1){
-	  $outfile =~ s/sam$/bam/;
-	  open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-      }
-      else{ # single-core mode
-	  $outfile =~ s/sam$/cram/;
-	  $final_output_filename = "${output_dir}${outfile}";
-	  open (OUT,"| $samtools_path view -h -C -T $cram_ref 2>/dev/null - > $output_dir$outfile") or die "Failed to write to CRAM file $outfile: $!\nPlease note that this option requires Samtools version 1.2 or higher!\n\n";
-      }
-  }
-  elsif($bam == 1){ ### Samtools is installed, writing out BAM directly
-      $outfile =~ s/sam$/bam/;
-      $final_output_filename = "${output_dir}${outfile}";
-      open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  elsif($bam == 2){ ### no Samtools found on system. Using GZIP compression instead
-      $outfile .= '.gz';
-      open (OUT,"| gzip -c - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  else{ # uncompressed ouput, default
-      open (OUT,'>',"$output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  warn "\n>>> Writing bisulfite mapping results to $output_dir$outfile <<<\n\n";
-
- 
-  sleep(1);
-  
-  if ($vanilla){
-    print OUT "Bismark version: $bismark_version\n";
-  }
-
-  ### printing alignment and methylation call summary to a report file
-  my $reportfile = $filename;
-  $reportfile =~ s/(\.fastq\.gz|\.fq\.gz|\.fastq|\.fq)$//; # attempting to remove fastq.gz etc to make filename a little shorter
-
-  if ($prefix){
-    $reportfile = "$prefix.$reportfile";
-  }
-  if ($bowtie2){
-    $reportfile =~ s/$/_bismark_bt2_SE_report.txt/;
-  }
-  else{
-    $reportfile =~ s/$/_bismark_SE_report.txt/;
-  }
-
-  if ($basename){ # Output file basename is set using the -B argument
-    $reportfile = "${basename}_SE_report.txt";
-  }
-
-  open (REPORT,'>',"$output_dir$reportfile") or die "Failed to write to $reportfile: $!\n";
-  print REPORT "Bismark report for: $sequence_file (version: $bismark_version)\n";
-
-  if ($unmapped){
-    my $unmapped_file = $filename;
-    if ($prefix){
-      $unmapped_file = "$prefix.$unmapped_file";
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file = "${basename}_unmapped_reads.fq";
-      }
-      else{
-	$unmapped_file = "${basename}_unmapped_reads.fa";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file =~ s/$/_unmapped_reads.fq/;
-      }
-      else{
-	$unmapped_file =~ s/$/_unmapped_reads.fa/;
-      }
-    }
-
-    if ($multicore > 1){ # multicore runs already output gzipped unmapped files
-      open (UNMAPPED,'>',"$output_dir$unmapped_file") or die "Failed to write to $unmapped_file: $!\n";
-    }
-    else{
-      $unmapped_file .= '.gz';
-      open (UNMAPPED,"| gzip -c - > $output_dir$unmapped_file") or die "Failed to write to $unmapped_file: $!\n";
-    }
-    warn "Unmapped sequences will be written to $output_dir$unmapped_file\n";
-  }
-
-  if ($ambiguous){
-    my $ambiguous_file = $filename;
-
-    if ($prefix){
-      $ambiguous_file = "$prefix.$ambiguous_file";
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file =  "${basename}_ambiguous_reads.fq";
-      }
-      else{
-	$ambiguous_file =  "${basename}_ambiguous_reads.fa";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file =~ s/$/_ambiguous_reads.fq/;
-      }
-      else{
-	$ambiguous_file =~ s/$/_ambiguous_reads.fa/;
-      }
-    }
-
-    if ($multicore > 1){ # multicore runs already output gzipped amobiguous files
-      open (AMBIG,'>',"$output_dir$ambiguous_file") or die "Failed to write to $ambiguous_file: $!\n";
-    }
-    else{
-      $ambiguous_file .= '.gz';
-      open (AMBIG,"| gzip -c - > $output_dir$ambiguous_file") or die "Failed to write to $ambiguous_file: $!\n";
-    }
-    warn "Ambiguously mapping sequences will be written to $output_dir$ambiguous_file\n";
-  }
-
-  if ($directional){
-      print REPORT "Option '--directional' specified (default mode): alignments to complementary strands (CTOT, CTOB) were ignored (i.e. not performed)\n";
-  }
-  elsif ($pbat){
-      print REPORT "Option '--pbat' specified: alignments to original strands (OT and OB) strands were ignored (i.e. not performed)\n";
-  }
-  else{
-      print REPORT "Option '--non_directional' specified: alignments to all strands were being performed (OT, OB, CTOT, CTOB)\n";
-  }
-  
-  if ($bowtie2){
-      print REPORT "Bismark was run with Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-      print REPORT "Bismark was run with Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  
-  unless ($vanilla or $sam_no_hd){
-      generate_SAM_header();
-  }
-  
-  ### Input file is in FastA format
-  if ($sequence_file_format eq 'FASTA'){
-    process_single_end_fastA_file_for_methylation_call($sequence_file,$C_to_T_infile,$G_to_A_infile,$pid);
-  }
-  ### Input file is in FastQ format
-  else{
-    process_single_end_fastQ_file_for_methylation_call($sequence_file,$C_to_T_infile,$G_to_A_infile,$pid);
-  }
-}
-
-sub start_methylation_call_procedure_paired_ends {
-  my ($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid) = @_;
-  my ($dir_1,$filename_1);
-    
-  if ($sequence_file_1 =~ /\//){
-      ($dir_1,$filename_1) = $sequence_file_1 =~ m/(.*\/)(.*)$/;
-  }
-  else{
-      $filename_1 = $sequence_file_1;
-  }
-  
-  my ($dir_2,$filename_2);
-
-  if  ($sequence_file_2 =~ /\//){
-    ($dir_2,$filename_2) = $sequence_file_2 =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename_2 = $sequence_file_2;
-  }
-
-  ### printing all alignments to a results file
-  my $outfile = $filename_1;
-  # warn "Outfile: $outfile\n";
-  $outfile =~ s/(\.fastq\.gz|\.fq\.gz|\.fastq|\.fq)$//; # attempting to remove fastq.gz etc to make filename a little shorter
-  # warn "Outfile: $outfile\n";sleep(5);
-
-  if ($prefix){
-    $outfile = "$prefix.$outfile";
-  }
-  if ($bowtie2){ # SAM format is the default Bowtie 2 output
-    $outfile =~ s/$/_bismark_bt2_pe.sam/;
-  }
-  elsif ($vanilla){ # vanilla custom Bismark paired-end output (like Bismark versions 0.5.X)
-    $outfile =~ s/$/_bismark_pe.txt/;
-  }
-  else{ # SAM format is the default Bowtie 1 output
-    $outfile =~ s/$/_bismark_pe.sam/;
-  }
-
-
-  if ($basename){ # Output file basename is set using the -B argument
-    $outfile = "${basename}_pe.sam";
-  }
-  
-  if ($ambig_bam){
-      my $ambig_bam_out = $outfile;
-      $ambig_bam_out =~ s/sam$/ambig.bam/;
-      warn "Ambiguous BAM output: $ambig_bam_out\n";
-      open (AMBIBAM,"| $samtools_path view -bSh 2>/dev/null - > $output_dir$ambig_bam_out") or die "Failed to write to $ambig_bam_out: $!\n";
-  }
-  
-  $bam = 0 unless (defined $bam);
-  
-  if ($cram){ ### Samtools is installed, writing out CRAM directly. This qill require Samtools version 1.2 or higher!
-      if ($multicore > 1){
-	  $outfile =~ s/sam$/bam/;
-	  open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-      }
-      else{ # single-core mode
-	  $outfile =~ s/sam$/cram/;
-	  $final_output_filename = "${output_dir}${outfile}";	  
-	  open (OUT,"| $samtools_path view -h -C -T $cram_ref 2>/dev/null - > $output_dir$outfile") or die "Failed to write to CRAM file $outfile: $!\nPlease note that this option requires Samtools version 1.2 or higher!\n\n";
-      }
-  }
-  elsif ($bam == 1){ ### Samtools is installed, writing out BAM directly
-      $outfile =~ s/sam$/bam/;
-      $final_output_filename = "${output_dir}${outfile}";	  
-      open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  elsif($bam == 2){ ### no Samtools found on system. Using GZIP compression instead
-      $outfile .= '.gz';
-      open (OUT,"| gzip -c - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  else{ # uncompressed ouput, default
-      open (OUT,'>',"$output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-
-  warn "\n>>> Writing bisulfite mapping results to $outfile <<<\n\n";
-  sleep(1);
-
-  if ($vanilla){
-    print OUT "Bismark version: $bismark_version\n";
-  }
-
-  ### printing alignment and methylation call summary to a report file
-  my $reportfile = $filename_1;
-  $reportfile =~ s/(\.fastq\.gz|\.fq\.gz|\.fastq|\.fq)$//; # attempting to remove fastq.gz etc to make filename a little shorter
-
-  if ($prefix){
-    $reportfile = "$prefix.$reportfile";
-  }
-
-  if ($bowtie2){
-    $reportfile =~ s/$/_bismark_bt2_PE_report.txt/;
-  }
-  else{
-    $reportfile =~ s/$/_bismark_PE_report.txt/;
-  }
-
-  if ($basename){ # Output file basename is set using the -B argument
-    $reportfile = "${basename}_PE_report.txt";
-  }
-
-  open (REPORT,'>',"$output_dir$reportfile") or die "Failed to write to $reportfile: $!\n";
-  print REPORT "Bismark report for: $sequence_file_1 and $sequence_file_2 (version: $bismark_version)\n";
-
-  if ($bowtie2){
-    print REPORT "Bismark was run with Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n";
-  }
-  else{
-    print REPORT "Bismark was run with Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n";
-  }
-
-
-  ### Unmapped read output
-  if ($unmapped){
-    my $unmapped_1 = $filename_1;
-    my $unmapped_2 = $filename_2;
-
-    if ($prefix){
-      $unmapped_1 = "$prefix.$unmapped_1";
-      $unmapped_2 = "$prefix.$unmapped_2";
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_1 = "${basename}_unmapped_reads_1.fq";
-	$unmapped_2 = "${basename}_unmapped_reads_2.fq";
-      }
-      else{
-	$unmapped_1 = "${basename}_unmapped_reads_1.fa";
-	$unmapped_2 = "${basename}_unmapped_reads_2.fa";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_1 =~ s/$/_unmapped_reads_1.fq/;
-	$unmapped_2 =~ s/$/_unmapped_reads_2.fq/;
-      }
-      else{
-	$unmapped_1 =~ s/$/_unmapped_reads_1.fa/;
-	$unmapped_2 =~ s/$/_unmapped_reads_2.fa/;
-      }
-    }
-
-    if ($multicore > 1){ # unmapped files are merged into .gz files in multicore runs anyway
-      open (UNMAPPED_1,'>',"$output_dir$unmapped_1") or die "Failed to write to $unmapped_1: $!\n";
-      open (UNMAPPED_2,'>',"$output_dir$unmapped_2") or die "Failed to write to $unmapped_2: $!\n";
-    }
-    else{
-      $unmapped_1 .= '.gz';
-      $unmapped_2 .= '.gz';
-      open (UNMAPPED_1,"| gzip -c - > $output_dir$unmapped_1") or die "Failed to write to $unmapped_1: $!\n";
-      open (UNMAPPED_2,"| gzip -c - > $output_dir$unmapped_2") or die "Failed to write to $unmapped_2: $!\n";
-    }
-    warn "Unmapped sequences will be written to $unmapped_1 and $unmapped_2\n";
-  }
-
-  if ($ambiguous){
-    my $amb_1 = $filename_1;
-    my $amb_2 = $filename_2;
-
-    if ($prefix){
-      $amb_1 = "$prefix.$amb_1";
-      $amb_2 = "$prefix.$amb_2";
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$amb_1 = "${basename}_ambiguous_reads_1.fq";
-	$amb_2 = "${basename}_ambiguous_reads_2.fq";
-      }
-      else{
-	$amb_1 = "${basename}_ambiguous_reads_1.fa";
-	$amb_2 = "${basename}_ambiguous_reads_2.fa";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$amb_1 =~ s/$/_ambiguous_reads_1.fq/;
-	$amb_2 =~ s/$/_ambiguous_reads_2.fq/;
-      }
-      else{
-	$amb_1 =~ s/$/_ambiguous_reads_1.fa/;
-	$amb_2 =~ s/$/_ambiguous_reads_2.fa/;
-      }
-    }
-
-    if ($multicore > 1){ # ambiguous files are merged into .gz files in multicore runs anyway
-      open (AMBIG_1,'>',"$output_dir$amb_1") or die "Failed to write to $amb_1: $!\n";
-      open (AMBIG_2,'>',"$output_dir$amb_2") or die "Failed to write to $amb_2: $!\n";
-    }
-    else{
-      $amb_1 .= '.gz';
-      $amb_2 .= '.gz';
-      open (AMBIG_1,"| gzip -c - > $output_dir$amb_1") or die "Failed to write to $amb_1: $!\n";
-      open (AMBIG_2,"| gzip -c - > $output_dir$amb_2") or die "Failed to write to $amb_2: $!\n";
-    }
-    warn "Ambiguously mapping sequences will be written to $amb_1 and $amb_2\n";
-  }
-
-  if ($directional){
-    print REPORT "Option '--directional' specified (default mode): alignments to complementary strands (CTOT, CTOB) were ignored (i.e. not performed)\n\n";
-  }
-  elsif ($pbat){
-    print REPORT "Option '--pbat' specified: alignments to original strands (OT, OB) were ignored (i.e. not performed)\n\n";
-  }
-  else{
-    print REPORT "Option '--non_directional' specified: alignments to all strands were being performed (OT, OB, CTOT, CTOB)\n\n";
-  }
-
-
-
-  unless ($vanilla or $sam_no_hd){
-    generate_SAM_header();
-  }
-
-  ### Input files are in FastA format
-  if ($sequence_file_format eq 'FASTA'){
-    process_fastA_files_for_paired_end_methylation_calls($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid);
-  }
-  ### Input files are in FastQ format
-  else{
-    process_fastQ_files_for_paired_end_methylation_calls($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid);
-  }
-}
-
-sub print_final_analysis_report_single_end{
-  my ($C_to_T_infile,$G_to_A_infile,$pid,$merge_multi) = @_;
-
-  if ($merge_multi){
-    warn "Printing a final merged alignment report for all individual sub-reports\n\n";
-  }
-  else{
-    ### All sequences from the original sequence file have been analysed now
-    ### deleting temporary C->T or G->A infiles
-
-    if ($directional){
-      my $deletion_successful =  unlink "$temp_dir$C_to_T_infile";
-      if ($deletion_successful == 1){
-	warn "\nSuccessfully deleted the temporary file $temp_dir$C_to_T_infile\n\n";
-      }
-      else{
-	warn "Could not delete temporary file $C_to_T_infile properly $!\n";
-      }
-    }
-    elsif ($pbat){
-      my $deletion_successful =  unlink "$temp_dir$G_to_A_infile";
-      if ($deletion_successful == 1){
-	warn "\nSuccessfully deleted the temporary file $temp_dir$G_to_A_infile\n\n";
-      }
-      else{
-	warn "Could not delete temporary file $G_to_A_infile properly $!\n";
-      }
-    }
-    else{
-      my $deletion_successful =  unlink "$temp_dir$C_to_T_infile","$temp_dir$G_to_A_infile";
-      if ($deletion_successful == 2){
-	warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile and $temp_dir$G_to_A_infile\n\n";
-      }
-      else{
-	warn "Could not delete temporary files properly $!\n";
-      }
-    }
-  }
-
-  ### printing a final report for the alignment procedure
-  print REPORT "Final Alignment report\n",'='x22,"\n";
-  warn "Final Alignment report\n",'='x22,"\n";
-  #  foreach my $index (0..$#fhs){
-  #    print "$fhs[$index]->{name}\n";
-  #    print "$fhs[$index]->{seen}\talignments on the correct strand in total\n";
-  #    print "$fhs[$index]->{wrong_strand}\talignments were discarded (nonsensical alignments)\n\n";
-  #  }
-
-  ### printing a final report for the methylation call procedure
-  warn "Sequences analysed in total:\t$counting{sequences_count}\n";
-  print REPORT "Sequences analysed in total:\t$counting{sequences_count}\n";
-  my $percent_alignable_sequences;
-
-  if ($counting{sequences_count} == 0){
-    $percent_alignable_sequences = 0;
-  }
-  else{
-    $percent_alignable_sequences = sprintf ("%.1f",$counting{unique_best_alignment_count}*100/$counting{sequences_count});
-  }
-
-  warn "Number of alignments with a unique best hit from the different alignments:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequences}%\n\n";
-  print REPORT "Number of alignments with a unique best hit from the different alignments:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequences}%\n";
-
-  ### percentage of low complexity reads overruled because of low complexity (thereby creating a bias for highly methylated reads),
-  ### only calculating the percentage if there were any overruled alignments
-  if ($counting{low_complexity_alignments_overruled_count}){
-    my $percent_overruled_low_complexity_alignments = sprintf ("%.1f",$counting{low_complexity_alignments_overruled_count}*100/$counting{sequences_count});
-    #   print REPORT "Number of low complexity alignments which were overruled to have a unique best hit rather than discarding them:\t$counting{low_complexity_alignments_overruled_count}\t(${percent_overruled_low_complexity_alignments}%)\n";
-  }
-
-  print "Sequences with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print "Sequences did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print "Sequences which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print "Number of sequences with unique best (first) alignment came from the bowtie output:\n";
-  print join ("\n","CT/CT:\t$counting{CT_CT_count}\t((converted) top strand)","CT/GA:\t$counting{CT_GA_count}\t((converted) bottom strand)","GA/CT:\t$counting{GA_CT_count}\t(complementary to (converted) top strand)","GA/GA:\t$counting{GA_GA_count}\t(complementary to (converted) bottom strand)"),"\n\n";
-
-  print REPORT "Sequences with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print REPORT "Sequences did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print REPORT "Sequences which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print REPORT "Number of sequences with unique best (first) alignment came from the bowtie output:\n";
-  print REPORT join ("\n","CT/CT:\t$counting{CT_CT_count}\t((converted) top strand)","CT/GA:\t$counting{CT_GA_count}\t((converted) bottom strand)","GA/CT:\t$counting{GA_CT_count}\t(complementary to (converted) top strand)","GA/GA:\t$counting{GA_GA_count}\t(complementary to (converted) bottom strand)"),"\n\n";
-
-  if ($directional){
-    print "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-    print REPORT "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-  }
-
-  ### detailed information about Cs analysed
-  warn "Final Cytosine Methylation Report\n",'='x33,"\n";
-  my $total_number_of_C = $counting{total_meCHH_count}+$counting{total_meCHG_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CpG_count};
-  warn "Total number of C's analysed:\t$total_number_of_C\n\n";
-  warn "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  warn "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  warn "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    warn "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n";
-  }
-  warn "\n";
-
-  warn "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  warn "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  warn "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    warn "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n";
-  }
-  warn "\n";
-
-  print REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-  print REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-  print REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  print REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  print REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n";
-  }
-  print REPORT "\n";
-
-  print REPORT "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  print REPORT "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  print REPORT "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n";
-  }
-  print REPORT "\n";
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meC_unknown;
-  if (($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}) > 0){
-    $percent_meC_unknown = sprintf("%.1f",100*$counting{total_meC_unknown_count}/($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}));
-  }
-
-
-  ### printing methylated CpG percentage if applicable
-  if ($percent_meCpG){
-    warn "C methylated in CpG context:\t${percent_meCpG}%\n";
-    print REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (CHG context) if applicable
-  if ($percent_meCHG){
-    warn "C methylated in CHG context:\t${percent_meCHG}%\n";
-    print REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (CHH context) if applicable
-  if ($percent_meCHH){
-    warn "C methylated in CHH context:\t${percent_meCHH}%\n";
-    print REPORT "C methylated in CHH context:\t${percent_meCHH}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (Unknown C context) if applicable
-  if ($bowtie2){
-    if ($percent_meC_unknown){
-      warn "C methylated in Unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-      print REPORT "C methylated in Unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in Unknown context (CN or CHN) if value was 0\n";
-      print REPORT "Can't determine percentage of methylated Cs in Unknown context (CN or CHN) if value was 0\n";
-    }
-  }
-  print REPORT "\n\n";
-  warn "\n\n";
-
-  if ($seqID_contains_tabs){
-    warn "The sequence IDs in the provided file contain tab-stops which might prevent sequence alignments. If this happened, please replace all tab characters within the seqID field with spaces before running Bismark.\n\n";
-    print REPORT "The sequence IDs in the provided file contain tab-stops which might prevent sequence alignments. If this happened, please replace all tab characters within the seqID field with spaces before running Bismark.\n\n";
-  }
-}
-
-
-sub print_final_analysis_report_paired_ends{
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid,$merge_multi) = @_;
-
-  if ($merge_multi){
-    warn "Printing a final merged alignment report for all individual sub-reports\n\n";
-  }
-  else{
-    ### All sequences from the original sequence file have been analysed now, therefore deleting temporary C->T or G->A infiles
-    if ($directional){
-      if ($G_to_A_infile_2){
-	my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1","$temp_dir$G_to_A_infile_2";
-	if ($deletion_successful == 2){
-	  warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile_1 and $temp_dir$G_to_A_infile_2\n\n";
-	}
-	else{
-	  warn "Could not delete temporary files $temp_dir$C_to_T_infile_1 and $temp_dir$G_to_A_infile_2 properly: $!\n";
-	}
-      }
-      else{ # for paired-end FastQ infiles with Bowtie1 there is only one file to delete
-	my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1";
-	if ($deletion_successful == 1){
-	  warn "\nSuccessfully deleted the temporary file $temp_dir$C_to_T_infile_1\n\n";
-	}
-	else{
-	  warn "Could not delete temporary file $temp_dir$C_to_T_infile_1 properly: $!\n";
-	}
-      }
-    }
-    else{
-      if ($G_to_A_infile_2 and $C_to_T_infile_2){
-	my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1","$temp_dir$G_to_A_infile_1","$temp_dir$C_to_T_infile_2","$temp_dir$G_to_A_infile_2";
-	if ($deletion_successful == 4){
-	  warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile_1, $temp_dir$G_to_A_infile_1, $temp_dir$C_to_T_infile_2 and $temp_dir$G_to_A_infile_2\n\n";
-	}
-	else{
-	  warn "Could not delete temporary files properly: $!\n";
-	}
-      }
-      else{ # for paired-end FastQ infiles with Bowtie1 there are only two files to delete
-	my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1","$temp_dir$G_to_A_infile_1";
-	if ($deletion_successful == 2){
-	  warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile_1 and $temp_dir$G_to_A_infile_1\n\n";
-	}
-	else{
-	  warn "Could not delete temporary files properly: $!\n";
-	}
-      }
-    }
-  }
-
-  ### printing a final report for the alignment procedure
-  warn "Final Alignment report\n",'='x22,"\n";
-  print REPORT "Final Alignment report\n",'='x22,"\n";
-  #  foreach my $index (0..$#fhs){
-  #    print "$fhs[$index]->{name}\n";
-  #    print "$fhs[$index]->{seen}\talignments on the correct strand in total\n";
-  #    print "$fhs[$index]->{wrong_strand}\talignments were discarded (nonsensical alignments)\n\n";
-  #  }
-
-  ### printing a final report for the methylation call procedure
-  warn "Sequence pairs analysed in total:\t$counting{sequences_count}\n";
-  print REPORT "Sequence pairs analysed in total:\t$counting{sequences_count}\n";
-
-  my $percent_alignable_sequence_pairs;
-  if ($counting{sequences_count} == 0){
-    $percent_alignable_sequence_pairs = 0;
-  }
-  else{
-    $percent_alignable_sequence_pairs = sprintf ("%.1f",$counting{unique_best_alignment_count}*100/$counting{sequences_count});
-  }
-  print "Number of paired-end alignments with a unique best hit:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequence_pairs}%\n\n";
-  print REPORT "Number of paired-end alignments with a unique best hit:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequence_pairs}% \n";
-
-  print "Sequence pairs with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print "Sequence pairs did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print "Sequence pairs which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print "Number of sequence pairs with unique best (first) alignment came from the bowtie output:\n";
-  print join ("\n","CT/GA/CT:\t$counting{CT_GA_CT_count}\t((converted) top strand)","GA/CT/CT:\t$counting{GA_CT_CT_count}\t(complementary to (converted) top strand)","GA/CT/GA:\t$counting{GA_CT_GA_count}\t(complementary to (converted) bottom strand)","CT/GA/GA:\t$counting{CT_GA_GA_count}\t((converted) bottom strand)"),"\n\n";
-
-
-  print REPORT "Sequence pairs with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print REPORT "Sequence pairs did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print REPORT "Sequence pairs which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print REPORT "Number of sequence pairs with unique best (first) alignment came from the bowtie output:\n";
-  print REPORT join ("\n","CT/GA/CT:\t$counting{CT_GA_CT_count}\t((converted) top strand)","GA/CT/CT:\t$counting{GA_CT_CT_count}\t(complementary to (converted) top strand)","GA/CT/GA:\t$counting{GA_CT_GA_count}\t(complementary to (converted) bottom strand)","CT/GA/GA:\t$counting{CT_GA_GA_count}\t((converted) bottom strand)"),"\n\n";
-  ### detailed information about Cs analysed
-
-  if ($directional){
-    print "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-    print REPORT "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-  }
-
-  warn "Final Cytosine Methylation Report\n",'='x33,"\n";
-  print REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-  my $total_number_of_C = $counting{total_meCHG_count}+ $counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-  warn "Total number of C's analysed:\t$total_number_of_C\n\n";
-  warn "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  warn "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  warn "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    warn "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n";
-  }
-  warn "\n";
-
-  warn "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  warn "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  warn "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    warn "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n";
-  }
-  warn "\n";
-
-  print REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-  print REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  print REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  print REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n\n";
-  }
-  print REPORT "\n";
-
-  print REPORT "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  print REPORT "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  print REPORT "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n\n";
-  }
-  print REPORT "\n";
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meC_unknown;
-  if (($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}) > 0){
-    $percent_meC_unknown = sprintf("%.1f",100*$counting{total_meC_unknown_count}/($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}));
-  }
-
-
-  ### printing methylated CpG percentage if applicable
-  if ($percent_meCpG){
-    warn "C methylated in CpG context:\t${percent_meCpG}%\n";
-    print REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage in CHG context if applicable
-  if ($percent_meCHG){
-    warn "C methylated in CHG context:\t${percent_meCHG}%\n";
-    print REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage in CHH context if applicable
-  if ($percent_meCHH){
-    warn "C methylated in CHH context:\t${percent_meCHH}%\n";
-    print REPORT "C methylated in CHH context:\t${percent_meCHH}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (Unknown C context) if applicable
-  if ($bowtie2){
-    if ($percent_meC_unknown){
-      warn "C methylated in unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-      print REPORT "C methylated in unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in unknown context (CN or CHN) if value was 0\n";
-      print REPORT "Can't determine percentage of methylated Cs in unknown context (CN or CHN) if value was 0\n";
-    }
-  }
-  print REPORT "\n\n";
-  warn "\n\n";
-
-}
-
-sub process_single_end_fastA_file_for_methylation_call{
-  my ($sequence_file,$C_to_T_infile,$G_to_A_infile,$pid) = @_;
-  ### this is a FastA sequence file; we need the actual sequence to compare it against the genomic sequence in order to make a methylation call.
-  ### Now reading in the sequence file sequence by sequence and see if the current sequence was mapped to one (or both) of the converted genomes in either
-  ### the C->T or G->A version
-
-  ### gzipped version of the infile
-  if ($sequence_file =~ /\.gz$/){
-    open (IN,"gunzip -c $sequence_file |") or die $!;
-  }
-  else{
-    open (IN,$sequence_file) or die $!;
-  }
-
-  my $count = 0;
-
-  warn "\nReading in the sequence file $sequence_file\n";
-  while (1) {
-    # last if ($counting{sequences_count} > 100);
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    last unless ($identifier and $sequence);
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequences so far\n";
-    }
-    chomp $sequence;
-    chomp $identifier;
-
-    $identifier =~ s/^>//; # deletes the > at the beginning of FastA headers
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_single_end_bowtie2 (uc$sequence,$identifier);
-    }
-    else{
-      $return = check_bowtie_results_single_end(uc$sequence,$identifier); # default Bowtie 1
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequence to ambiguous.out if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      print AMBIG ">$identifier\n";	
-      print AMBIG "$sequence\n";
-    }
-
-    # print the sequence to <unmapped.out> file if --un was specified
-    elsif ($unmapped and $return == 1){
-      print UNMAPPED ">$identifier\n";	
-      print UNMAPPED "$sequence\n";
-    }
-  }
-  print "Processed $counting{sequences_count} sequences in total\n\n";
- 
-  close OUT or warn "Failed to close filehandle OUT: $!\n";
-  
-  print_final_analysis_report_single_end($C_to_T_infile,$G_to_A_infile,$pid);
-
-}
-
-sub process_single_end_fastQ_file_for_methylation_call{
-
-  my ($sequence_file,$C_to_T_infile,$G_to_A_infile,$pid) = @_;
-
-  ### this is the Illumina sequence file; we need the actual sequence to compare it against the genomic sequence in order to make a methylation call.
-  ### Now reading in the sequence file sequence by sequence and see if the current sequence was mapped to one (or both) of the converted genomes in either
-  ### the C->T or G->A version
-
-  ### gzipped version of the infile
-  if ($sequence_file =~ /\.gz$/){
-    open (IN,"gunzip -c $sequence_file |") or die $!;
-  }
-  else{
-    open (IN,$sequence_file) or die $!;
-  }
-
-  my $count = 0;
-
-  warn "\nReading in the sequence file $sequence_file\n";
-  while (1) {
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    my $identifier_2 = <IN>;
-    my $quality_value = <IN>;
-    last unless ($identifier and $sequence and $identifier_2 and $quality_value);
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequences so far\n";
-    }
-    chomp $sequence;
-    chomp $identifier;
-    chomp $quality_value;
-
-    $identifier =~ s/^\@//;  # deletes the @ at the beginning of Illumin FastQ headers
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_single_end_bowtie2 (uc$sequence,$identifier,$quality_value);
-    }
-    else{
-      $return = check_bowtie_results_single_end(uc$sequence,$identifier,$quality_value); # default Bowtie 1
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequence to ambiguous.out if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      print AMBIG "\@$identifier\n";	
-      print AMBIG "$sequence\n";
-      print AMBIG $identifier_2;	
-      print AMBIG "$quality_value\n";
-    }
-
-    # print the sequence to <unmapped.out> file if --un was specified
-    elsif ($unmapped and $return == 1){
-      print UNMAPPED "\@$identifier\n";	
-      print UNMAPPED "$sequence\n";
-      print UNMAPPED $identifier_2;	
-      print UNMAPPED "$quality_value\n";
-    }
-  }
-  print "Processed $counting{sequences_count} sequences in total\n\n";
-
-  close OUT or warn "Failed to close filehandle OUT: $!\n";
-
-  print_final_analysis_report_single_end($C_to_T_infile,$G_to_A_infile,$pid);
-  if ($ambig_bam){
-      close AMBIBAM or warn "Had trouble closing filehandle AMBIBAM: $!\n";
-  }
-}
-
-sub process_fastA_files_for_paired_end_methylation_calls{
-  my ($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid) = @_;
-  ### Processing the two FastA sequence files; we need the actual sequences of both reads to compare them against the genomic sequence in order to
-  ### make a methylation call. The sequence idetifier per definition needs to be the same for a sequence pair used for paired-end mapping.
-  ### Now reading in the sequence files sequence by sequence and see if the current sequences produced an alignment to one (or both) of the
-  ### converted genomes (either the C->T or G->A version)
-
-  ### gzipped version of the infiles
-  if ($sequence_file_1 =~ /\.gz$/ and $sequence_file_2 =~ /\.gz$/){
-    open (IN1,"gunzip -c $sequence_file_1 |") or die "Failed to open gunzip -c pipe to $sequence_file_1 $!\n";
-    open (IN2,"gunzip -c $sequence_file_2 |") or die "Failed to open gunzip -c pipe to $sequence_file_2 $!\n";
-  }
-  else{
-    open (IN1,$sequence_file_1) or die $!;
-    open (IN2,$sequence_file_2) or die $!;
-  }
-
-  warn "\nReading in the sequence files $sequence_file_1 and $sequence_file_2\n";
-  ### Both files are required to have the exact same number of sequences, therefore we can process the sequences jointly one by one
-
-  my $count = 0;
-
-  while (1) {
-    # reading from the first input file
-    my $identifier_1 = <IN1>;
-    my $sequence_1 = <IN1>;
-    # reading from the second input file
-    my $identifier_2 = <IN2>;
-    my $sequence_2 = <IN2>;
-    last unless ($identifier_1 and $sequence_1 and $identifier_2 and $sequence_2);
-
-    $identifier_1 = fix_IDs($identifier_1); # this is to avoid problems with truncated read ID when they contain white spaces
-    $identifier_2 = fix_IDs($identifier_2);
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequence pairs so far\n";
-    }
-    my $orig_identifier_1 = $identifier_1;
-    my $orig_identifier_2 = $identifier_2;
-
-    chomp $sequence_1;
-    chomp $identifier_1;
-    chomp $sequence_2;
-    chomp $identifier_2;
-
-    $identifier_1 =~ s/^>//; # deletes the > at the beginning of FastA headers
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_paired_ends_bowtie2 (uc$sequence_1,uc$sequence_2,$identifier_1);
-    }
-    else{
-      $return = check_bowtie_results_paired_ends (uc$sequence_1,uc$sequence_2,$identifier_1);
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequences to ambiguous_1 and _2 if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      print AMBIG_1 $orig_identifier_1;	
-      print AMBIG_1 "$sequence_1\n";
-      print AMBIG_2 $orig_identifier_2;	
-      print AMBIG_2 "$sequence_2\n";
-    }
-
-    # print the sequences to unmapped_1.out and unmapped_2.out if --un was specified
-    elsif ($unmapped and $return == 1){
-      print UNMAPPED_1 $orig_identifier_1;	
-      print UNMAPPED_1 "$sequence_1\n";
-      print UNMAPPED_2 $orig_identifier_2;	
-      print UNMAPPED_2 "$sequence_2\n";
-    }
-  }
-
-  warn "Processed $counting{sequences_count} sequences in total\n\n";
-
-  close OUT or die $!;
-
-  print_final_analysis_report_paired_ends($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid);
-
-}
-
-sub process_fastQ_files_for_paired_end_methylation_calls{
-  my ($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid) = @_;
-  ### Processing the two Illumina sequence files; we need the actual sequence of both reads to compare them against the genomic sequence in order to
-  ### make a methylation call. The sequence identifier per definition needs to be same for a sequence pair used for paired-end alignments.
-  ### Now reading in the sequence files sequence by sequence and see if the current sequences produced a paired-end alignment to one (or both)
-  ### of the converted genomes (either C->T or G->A version)
-
-  ### gzipped version of the infiles
-  if ($sequence_file_1 =~ /\.gz$/ and $sequence_file_2 =~ /\.gz$/){
-    open (IN1,"gunzip -c $sequence_file_1 |") or die "Failed to open gunzip -c pipe to $sequence_file_1 $!\n";
-    open (IN2,"gunzip -c $sequence_file_2 |") or die "Failed to open gunzip -c pipe to $sequence_file_2 $!\n";
-  }
-  else{
-    open (IN1,$sequence_file_1) or die $!;
-    open (IN2,$sequence_file_2) or die $!;
-  }
-
-  my $count = 0;
-
-  warn "\nReading in the sequence files $sequence_file_1 and $sequence_file_2\n";
-  ### Both files are required to have the exact same number of sequences, therefore we can process the sequences jointly one by one
-  while (1) {
-    # reading from the first input file
-    my $identifier_1 = <IN1>;
-    my $sequence_1 = <IN1>;
-    my $ident_1 = <IN1>;         # not needed
-    my $quality_value_1 = <IN1>; # not needed
-    # reading from the second input file
-    my $identifier_2 = <IN2>;
-    my $sequence_2 = <IN2>;
-    my $ident_2 = <IN2>;         # not needed
-    my $quality_value_2 = <IN2>; # not needed
-    last unless ($identifier_1 and $sequence_1 and $quality_value_1 and $identifier_2 and $sequence_2 and $quality_value_2);
-    $identifier_1 = fix_IDs($identifier_1); # this is to avoid problems with truncated read ID when they contain white spaces
-    $identifier_2 = fix_IDs($identifier_2);
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequence pairs so far\n";
-    }
-
-    my $orig_identifier_1 = $identifier_1;
-    my $orig_identifier_2 = $identifier_2;
-
-    chomp $sequence_1;
-    chomp $identifier_1;
-    chomp $sequence_2;
-    chomp $identifier_2;
-    chomp $quality_value_1;
-    chomp $quality_value_2;
-
-    $identifier_1 =~ s/^\@//;  # deletes the @ at the beginning of the FastQ ID
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_paired_ends_bowtie2 (uc$sequence_1,uc$sequence_2,$identifier_1,$quality_value_1,$quality_value_2);
-    }
-    else{
-      $return = check_bowtie_results_paired_ends (uc$sequence_1,uc$sequence_2,$identifier_1,$quality_value_1,$quality_value_2);
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequences to ambiguous_1 and _2 if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      # seq_1
-      print AMBIG_1 $orig_identifier_1;	
-      print AMBIG_1 "$sequence_1\n";
-      print AMBIG_1 $ident_1;	
-      print AMBIG_1 "$quality_value_1\n";
-	# seq_2
-      print AMBIG_2 $orig_identifier_2;	
-      print AMBIG_2 "$sequence_2\n";
-      print AMBIG_2 $ident_2;	
-      print AMBIG_2 "$quality_value_2\n";
-    }
-
-    # print the sequences to unmapped_1.out and unmapped_2.out if --un was specified
-    elsif ($unmapped and $return == 1){
-      # seq_1
-      print UNMAPPED_1 $orig_identifier_1;	
-      print UNMAPPED_1 "$sequence_1\n";
-      print UNMAPPED_1 $ident_1;	
-      print UNMAPPED_1 "$quality_value_1\n";
-      # seq_2
-      print UNMAPPED_2 $orig_identifier_2;	
-      print UNMAPPED_2 "$sequence_2\n";
-      print UNMAPPED_2 $ident_2;	
-      print UNMAPPED_2 "$quality_value_2\n";
-    }
-  }
-
-  warn "Processed $counting{sequences_count} sequences in total\n\n";
-
-  close OUT or warn "Failed to close filehandle OUT: $!\n\n";
-  if ($ambig_bam){
-      close AMBIBAM or warn "Had trouble closing filehandle AMBIBAM: $!\n\n";
-  }
-
-  print_final_analysis_report_paired_ends($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid);
-
-}
-
-sub check_bowtie_results_single_end{
-  my ($sequence,$identifier,$quality_value) = @_;
-
-  unless ($quality_value){ # FastA sequences get assigned a quality value of Phred 40 throughout
-    $quality_value = 'I'x(length$sequence);
-  }
-
-  my %mismatches = ();
-  ### reading from the bowtie output files to see if this sequence aligned to a bisulfite converted genome
-  foreach my $index (0..$#fhs){
-
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line} and defined $fhs[$index]->{last_seq_id});
-    ### if the sequence we are currently looking at produced an alignment we are doing various things with it
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-      ###############################################################
-      ### STEP I Now processing the alignment stored in last_line ###
-      ###############################################################
-      my $valid_alignment_found_1 = decide_whether_single_end_alignment_is_valid($index,$identifier);
-      ### sequences can fail at this point if there was only 1 seq in the wrong orientation, or if there were 2 seqs, both in the wrong orientation
-      ### we only continue to extract useful information about this alignment if 1 was returned
-      if ($valid_alignment_found_1 == 1){
-	### Bowtie outputs which made it this far are in the correct orientation, so we can continue to analyse the alignment itself
-	### need to extract the chromosome number from the bowtie output (which is either XY_cf (complete forward) or XY_cr (complete reverse)
-	my ($id,$strand,$mapped_chromosome,$position,$bowtie_sequence,$mismatch_info) = (split (/\t/,$fhs[$index]->{last_line},-1))[0,1,2,3,4,7];
-
-	unless($mismatch_info){
-	  $mismatch_info = '';
-	}
-
-	chomp $mismatch_info;
-	my $chromosome;
-	if ($mapped_chromosome =~ s/_(CT|GA)_converted$//){
-	  $chromosome = $mapped_chromosome;
-	}
-	else{
-	  die "Chromosome number extraction failed for $mapped_chromosome\n";
-	}
-	### Now extracting the number of mismatches to the converted genome
-	my $number_of_mismatches;
-	if ($mismatch_info eq ''){
-	  $number_of_mismatches = 0;
-	}
-	elsif ($mismatch_info =~ /^\d/){
-	  my @mismatches = split (/,/,$mismatch_info);
-	  $number_of_mismatches = scalar @mismatches;
-	}
-	else{
-	  die "Something weird is going on with the mismatch field:\t>>> $mismatch_info <<<\n";
-	}
-	### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	my $alignment_location = join (":",$chromosome,$position);
-	### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	### strand) were methylated and therefore protected. It is not needed to overwrite the same positional entry with a second entry for the same
-	### location (the genomic sequence extraction and methylation would not be affected by this, only the thing which would change is the index
-	### number for the found alignment)
-	unless (exists $mismatches{$number_of_mismatches}->{$alignment_location}){
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{seq_id}=$id;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{bowtie_sequence}=$bowtie_sequence;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{index}=$index;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{position}=$position;
-	}
-	$number_of_mismatches = undef;
-	##################################################################################################################################################
-	### STEP II Now reading in the next line from the bowtie filehandle. The next alignment can either be a second alignment of the same sequence or a
-	### a new sequence. In either case we will store the next line in @fhs ->{last_line}. In case the alignment is already the next entry, a 0 will
-	### be returned as $valid_alignment_found and it will then be processed in the next round only.
-	##################################################################################################################################################
-	my $newline = $fhs[$index]->{fh}-> getline();
-	if ($newline){
-	  my ($seq_id) = split (/\t/,$newline);
-	  $fhs[$index]->{last_seq_id} = $seq_id;
-	  $fhs[$index]->{last_line} = $newline;
-	}
-	else {
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of bowtie output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line} = undef;
-	  next;
-	}	
-	my $valid_alignment_found_2 = decide_whether_single_end_alignment_is_valid($index,$identifier);
-	### we only continue to extract useful information about this second alignment if 1 was returned
-	if ($valid_alignment_found_2 == 1){
-	  ### If the second Bowtie output made it this far it is in the correct orientation, so we can continue to analyse the alignment itself
-	  ### need to extract the chromosome number from the bowtie output (which is either XY_cf (complete forward) or XY_cr (complete reverse)
-	  my ($id,$strand,$mapped_chromosome,$position,$bowtie_sequence,$mismatch_info) = (split (/\t/,$fhs[$index]->{last_line},-1))[0,1,2,3,4,7];
-	  unless($mismatch_info){
-	    $mismatch_info = '';
-	  }	
-	  chomp $mismatch_info;
-
-	  my $chromosome;	
-	  if ($mapped_chromosome =~ s/_(CT|GA)_converted$//){
-	    $chromosome = $mapped_chromosome;
-	  }
-	  else{
-	    die "Chromosome number extraction failed for $mapped_chromosome\n";
-	  }
-
-	  ### Now extracting the number of mismatches to the converted genome
-	  my $number_of_mismatches;
-	  if ($mismatch_info eq ''){
-	    $number_of_mismatches = 0;
-	  }
-	  elsif ($mismatch_info =~ /^\d/){
-	    my @mismatches = split (/,/,$mismatch_info);
-	    $number_of_mismatches = scalar @mismatches;
-	  }
-	  else{
-	    die "Something weird is going on with the mismatch field\n";
-	  }
-	  ### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	  ### extracting the chromosome number from the bowtie output (see above)
-	  my $alignment_location = join (":",$chromosome,$position);
-	  ### In the special case that two differently converted sequences align against differently converted genomes, but to the same position
-	  ### with the same number of mismatches (or perfect matches), the chromosome, position and number of mismatches are the same. In this
-	  ### case we are not writing the same entry out a second time.
-	  unless (exists $mismatches{$number_of_mismatches}->{$alignment_location}){
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{seq_id}=$id;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{bowtie_sequence}=$bowtie_sequence;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{index}=$index;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{position}=$position;
-	  }
-	  ####################################################################################################################################
-	  #### STEP III Now reading in one more line which has to be the next alignment to be analysed. Adding it to @fhs ->{last_line}    ###
-	  ####################################################################################################################################
-	  $newline = $fhs[$index]->{fh}-> getline();
-	  if ($newline){
-	    my ($seq_id) = split (/\t/,$newline);
-	    die "The same seq ID occurred more than twice in a row\n" if ($seq_id eq $identifier);
-	    $fhs[$index]->{last_seq_id} = $seq_id;
-	    $fhs[$index]->{last_line} = $newline;
-	    next;
-	  }	
-	  else {
-	    # assigning undef to last_seq_id and last_line and jumping to the next index (end of bowtie output)
-	    $fhs[$index]->{last_seq_id} = undef;
-	    $fhs[$index]->{last_line} = undef;
-	    next;
-	  }
-	  ### still within the 2nd sequence in correct orientation found	
-	}
-	### still withing the 1st sequence in correct orientation found
-      }
-      ### still within the if (last_seq_id eq identifier) condition
-    }
-    ### still within foreach index loop
-  }
-  ### if there was not a single alignment found for a certain sequence we will continue with the next sequence in the sequence file
-  unless(%mismatches){
-    $counting{no_single_alignment_found}++;
-    if ($unmapped){
-      return 1; ### We will print this sequence out as unmapped sequence if --un unmapped.out has been specified
-    }
-    else{
-      return;
-    }
-  }
-  #######################################################################################################################################################
-  #######################################################################################################################################################
-  ### We are now looking if there is a unique best alignment for a certain sequence. This means we are sorting in ascending order and look at the     ###
-  ### sequence with the lowest amount of mismatches. If there is only one single best position we are going to store the alignment information in the ###
-  ### meth_call variables, if there are multiple hits with the same amount of (lowest) mismatches we are discarding the sequence altogether           ###
-  #######################################################################################################################################################
-  #######################################################################################################################################################
-  ### Going to use the variable $sequence_fails as a memory if a sequence could not be aligned uniquely (set to 1 then)
-  my $sequence_fails = 0;
-  ### Declaring an empty hash reference which will store all information we need for the methylation call
-  my $methylation_call_params; # hash reference!
-  ### sorting in ascending order
-  foreach my $mismatch_number (sort {$a<=>$b} keys %mismatches){
-
-    ### if there is only 1 entry in the hash with the lowest number of mismatches we accept it as the best alignment
-    if (scalar keys %{$mismatches{$mismatch_number}} == 1){
-      for my $unique_best_alignment (keys %{$mismatches{$mismatch_number}}){
-	$methylation_call_params->{$identifier}->{bowtie_sequence} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence};
-	$methylation_call_params->{$identifier}->{chromosome} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{chromosome};
-	$methylation_call_params->{$identifier}->{position} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{position};
-	$methylation_call_params->{$identifier}->{index} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{index};
-    	$methylation_call_params->{$identifier}->{number_of_mismatches} = $mismatch_number;
-      }
-    }
-    elsif (scalar keys %{$mismatches{$mismatch_number}} == 3){
-      ### If there are 3 sequences with the same number of lowest mismatches we can discriminate 2 cases: (i) all 3 alignments are unique best hits and
-      ### come from different alignments processes (== indices) or (ii) one sequence alignment (== index) will give a unique best alignment, whereas a
-      ### second one will produce 2 (or potentially many) alignments for the same sequence but in a different conversion state or against a different genome
-      ### version (or both). This becomes especially relevant for highly converted sequences in which all Cs have been converted to Ts in the bisulfite
-      ### reaction. E.g.
-      ### CAGTCACGCGCGCGCG will become
-      ### TAGTTATGTGTGTGTG in the CT transformed version, which will ideally still give the correct alignment in the CT->CT alignment condition.
-      ### If the same read will then become G->A transformed as well however, the resulting sequence will look differently and potentially behave
-      ### differently in a GA->GA alignment and this depends on the methylation state of the original sequence!:
-      ### G->A conversion:
-      ### highly methylated: CAATCACACACACACA
-      ### highly converted : TAATTATATATATATA <== this sequence has a reduced complexity (only 2 bases left and not 3), and it is more likely to produce
-      ### an alignment with a low complexity genomic region than the one above. This would normally lead to the entire sequence being kicked out as the
-      ### there will be 3 alignments with the same number of lowest mismatches!! This in turn means that highly methylated and thereby not converted
-      ### sequences are more likely to pass the alignment step, thereby creating a bias for methylated reads compared to their non-methylated counterparts.
-      ### We do not want any bias, whatsover. Therefore if we have 1 sequence producing a unique best alignment and the second and third conditions
-      ### producing alignments only after performing an additional (theoretical) conversion we want to keep the best alignment with the lowest number of
-      ### additional transliterations performed. Thus we want to have a look at the level of complexity of the sequences producing the alignment.
-      ### In the above example the number of transliterations required to transform the actual sequence
-      ### to the C->T version would be TAGTTATGTGTGTGTG -> TAGTTATGTGTGTGTG = 0; (assuming this gives the correct alignment)
-      ### in the G->A case it would be TAGTTATGTGTGTGTG -> TAATTATATATATATA = 6; (assuming this gives multiple wrong alignments)
-      ### if the sequence giving a unique best alignment required a lower number of transliterations than the second best sequence yielding alignments
-      ### while requiring a much higher number of transliterations, we are going to accept the unique best alignment with the lowest number of performed
-      ### transliterations. As a threshold which does scale we will start with the number of tranliterations of the lowest best match x 2 must still be
-      ### smaller than the number of tranliterations of the second best sequence. Everything will be flagged with $sequence_fails = 1 and discarded.
-      my @three_candidate_seqs;
-      foreach my $composite_location (keys (%{$mismatches{$mismatch_number}}) ){
-	my $transliterations_performed;
-	if ($mismatches{$mismatch_number}->{$composite_location}->{index} == 0 or $mismatches{$mismatch_number}->{$composite_location}->{index} == 1){
-	  $transliterations_performed = determine_number_of_transliterations_performed($sequence,'CT');
-	}
-	elsif ($mismatches{$mismatch_number}->{$composite_location}->{index} == 2 or $mismatches{$mismatch_number}->{$composite_location}->{index} == 3){
-	  $transliterations_performed = determine_number_of_transliterations_performed($sequence,'GA');
-	}
-	else{
-	  die "unexpected index number range $!\n";
-	}
-	push @three_candidate_seqs,{
-				    index =>$mismatches{$mismatch_number}->{$composite_location}->{index},
-				    bowtie_sequence => $mismatches{$mismatch_number}->{$composite_location}->{bowtie_sequence},
-				    mismatch_number => $mismatch_number,
-				    chromosome => $mismatches{$mismatch_number}->{$composite_location}->{chromosome},
-				    position => $mismatches{$mismatch_number}->{$composite_location}->{position},
-				    seq_id => $mismatches{$mismatch_number}->{$composite_location}->{seq_id},
-				    transliterations_performed => $transliterations_performed,
-				   };
-      }
-      ### sorting in ascending order for the lowest number of transliterations performed
-      @three_candidate_seqs = sort {$a->{transliterations_performed} <=> $b->{transliterations_performed}} @three_candidate_seqs;
-      my $first_array_element = $three_candidate_seqs[0]->{transliterations_performed};
-      my $second_array_element = $three_candidate_seqs[1]->{transliterations_performed};
-      my $third_array_element = $three_candidate_seqs[2]->{transliterations_performed};
-      # print "$first_array_element\t$second_array_element\t$third_array_element\n";
-      if (($first_array_element*2) < $second_array_element){
-	$counting{low_complexity_alignments_overruled_count}++;
-	### taking the index with the unique best hit and over ruling low complexity alignments with 2 hits
-	$methylation_call_params->{$identifier}->{bowtie_sequence} = $three_candidate_seqs[0]->{bowtie_sequence};
-	$methylation_call_params->{$identifier}->{chromosome} = $three_candidate_seqs[0]->{chromosome};
-	$methylation_call_params->{$identifier}->{position} = $three_candidate_seqs[0]->{position};
-	$methylation_call_params->{$identifier}->{index} = $three_candidate_seqs[0]->{index};
-	$methylation_call_params->{$identifier}->{number_of_mismatches} = $mismatch_number;
-	# print "Overruled low complexity alignments! Using $first_array_element and disregarding $second_array_element and $third_array_element\n";
-      }
-      else{
-	$sequence_fails = 1;
-      }
-    }
-    else{
-      $sequence_fails = 1;
-    }
-    ### after processing the alignment with the lowest number of mismatches we exit
-    last;
-  }
-  ### skipping the sequence completely if there were multiple alignments with the same amount of lowest mismatches found at different positions
-  if ($sequence_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-    if ($ambiguous){
-      return 2; # => exits to next sequence, and prints it out to multiple_alignments.out if --ambiguous has been specified
-    }
-    if ($unmapped){
-      return 1; # => exits to next sequence, and prints it out to unmapped.out if --un has been specified
-    }
-    else{
-      return 0; # => exits to next sequence (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 2) or ($methylation_call_params->{$identifier}->{index} == 3) ){
-      #    warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence has not been rejected so far it will have a unique best alignment
-  $counting{unique_best_alignment_count}++;
-  extract_corresponding_genomic_sequence_single_end($identifier,$methylation_call_params);
-
-  ### check test to see if the genomic sequence we extracted has the same length as the observed sequence+2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence}) != length($sequence)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  ### otherwise we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call} = methylation_call($identifier,$sequence,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence},$methylation_call_params->{$identifier}->{read_conversion});
-
-  print_bisulfite_mapping_result_single_end($identifier,$sequence,$methylation_call_params,$quality_value);
-  return 0; ## otherwise 1 will be returned by default, which would print the sequence to unmapped.out
-}
-
-sub check_bowtie_results_single_end_bowtie2{
-  my ($sequence,$identifier,$quality_value) = @_;
-
-  unless ($quality_value){ # FastA sequences get assigned a quality value of Phred 40 throughout
-    $quality_value = 'I'x(length$sequence);
-  }
-
-  # as of version Bowtie 2 2.0.0 beta7, when input reads are unpaired, Bowtie 2 no longer removes the trailing /1 or /2 from the read name.
-  # $identifier =~ s/\/[1234567890]+$//; # some sequencers don't just have /1 or /2 at the end of read IDs
-  # print "sequence $sequence\nid $identifier\nquality: '$quality_value'\n";
-  
-  my $alignment_ambiguous = 0;
-  my $first_ambig_alignment; # storing the first ambiguous alignment so it can be written out in case '--ambig_bam' was specified
-  my $best_AS_so_far;   ## we need to keep a memory of the best alignment score so far
-  my $amb_same_thread = 0;   ## if a reads primary and secondary alignments have the same alignment score we set this to true.
-
-  my %alignments = ();
-
-  ### reading from the Bowtie 2 output filehandles
-  foreach my $index (0..$#fhs){
-    #  print "Index: $index\n";
-    #   print "$fhs[$index]->{last_line}\n";
-    #   print "$fhs[$index]->{last_seq_id}\n";
-    # sleep (1);
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line} and defined $fhs[$index]->{last_seq_id});
-
-    ### if the sequence we are currently looking at produced an alignment we are doing various things with it
-    # print "last seq id: $fhs[$index]->{last_seq_id} and identifier: $identifier\n";
-
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-      #  SAM format specifications for Bowtie 2
-      #  (1) Name of read that aligned
-      #  (2) Sum of all applicable flags. Flags relevant to Bowtie are:
-      #        1 The read is one of a pair
-      #        2 The alignment is one end of a proper paired-end alignment
-      #        4 The read has no reported alignments
-      #        8 The read is one of a pair and has no reported alignments
-      #       16 The alignment is to the reverse reference strand
-      #       32 The other mate in the paired-end alignment is aligned to the reverse reference strand
-      #       64 The read is mate 1 in a pair
-      #      128 The read is mate 2 in a pair
-      #      256 The read has multiple mapping states
-      #  (3) Name of reference sequence where alignment occurs (unmapped reads have a *)
-      #  (4) 1-based offset into the forward reference strand where leftmost character of the alignment occurs (0 for unmapped reads)
-      #  (5) Mapping quality (255 means MAPQ is not available)
-      #  (6) CIGAR string representation of alignment (* if unavailable)
-      #  (7) Name of reference sequence where mate's alignment occurs. Set to = if the mate's reference sequence is the same as this alignment's, or * if there is no mate.
-      #  (8) 1-based offset into the forward reference strand where leftmost character of the mate's alignment occurs. Offset is 0 if there is no mate.
-      #  (9) Inferred fragment size. Size is negative if the mate's alignment occurs upstream of this alignment. Size is 0 if there is no mate.
-      # (10) Read sequence (reverse-complemented if aligned to the reverse strand)
-      # (11) ASCII-encoded read qualities (reverse-complemented if the read aligned to the reverse strand). The encoded quality values are on the Phred quality scale and the encoding is ASCII-offset by 33 (ASCII char !), similarly to a FASTQ file.
-      # (12) Optional fields. Fields are tab-separated. bowtie2 outputs zero or more of these optional fields for each alignment, depending on the type of the alignment:
-      # AS:i:<N> Alignment score. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if SAM record is for an aligned read.
-      # XS:i:<N> Alignment score for second-best alignment. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if the SAM record is for an aligned read and more than one alignment was found for the read.
-      # YS:i:<N> Alignment score for opposite mate in the paired-end alignment. Only present if the SAM record is for a read that aligned as part of a paired-end alignment.
-      # XN:i:<N> The number of ambiguous bases in the reference covering this alignment. Only present if SAM record is for an aligned read.
-      # XM:i:<N> The number of mismatches in the alignment. Only present if SAM record is for an aligned read.
-      # XO:i:<N> The number of gap opens, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # XG:i:<N> The number of gap extensions, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # NM:i:<N> The edit distance; that is, the minimal number of one-nucleotide edits (substitutions, insertions and deletions) needed to transform the read string into the reference string. Only present if SAM record is for an aligned read.
-      # YF:Z:<N> String indicating reason why the read was filtered out. See also: Filtering. Only appears for reads that were filtered out.
-      # MD:Z:<S> A string representation of the mismatched reference bases in the alignment. See SAM format specification for details. Only present if SAM record is for an aligned read.
-
-      my ($id,$flag,$mapped_chromosome,$position,$mapping_quality,$cigar,$bowtie_sequence,$qual) = (split (/\t/,$fhs[$index]->{last_line}))[0,1,2,3,4,5,9,10];
-
-      ### If a sequence has no reported alignments there will be a single output line with a bit-wise flag value of 4. We can store the next alignment and move on to the next Bowtie 2 instance
-      if ($flag == 4){
-	## reading in the next alignment, which must be the next sequence
-	my $newline = $fhs[$index]->{fh}-> getline();
-	if ($newline){
-	  chomp $newline;
-	  my ($seq_id) = split (/\t/,$newline);
-	  $fhs[$index]->{last_seq_id} = $seq_id;
-	  $fhs[$index]->{last_line} = $newline;
-	  if ($seq_id eq $identifier){
-	    die "Sequence with ID $identifier did not produce any alignment, but next seq-ID was also $fhs[$index]->{last_seq_id}!\n";
-	  }
-	  next; # next instance
-	}
-	else{
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line} = undef;
-	  next;
-	}
-      }
-
-      # if there are one or more proper alignments we can extract the chromosome number
-      my $chromosome;
-      if ($mapped_chromosome =~ s/_(CT|GA)_converted$//){
-	$chromosome = $mapped_chromosome;
-      }
-      else{
-	die "Chromosome number extraction failed for $mapped_chromosome\n";
-      }
-
-      ### We will use the optional field to determine the best alignment. Later on we extract the number of mismatches and/or indels from the CIGAR string
-      my ($alignment_score,$second_best,$MD_tag);
-      my @fields = split (/\t/,$fhs[$index]->{last_line});
-
-      foreach (11..$#fields){
-	  if ($fields[$_] =~ /AS:i:(.*)/){
-	      $alignment_score = $1;
-	  }
-	  elsif ($fields[$_] =~ /XS:i:(.*)/){
-	      $second_best = $1;
-	  }
-	  elsif ($fields[$_] =~ /MD:Z:(.*)/){
-	      $MD_tag = $1;
-	  }
-      }
-      
-      my $overwrite = 0; # If we get 2 alignments to the very same position, e.g. to OT with and AS of -156 and to CTOB with and AS of 0 we need the latter to trump the former, else
-      # the read will be assigned to the wrong strand which may result in incorrect methylation calls.
-      # this was brought to our attention by Sylvain Foret (ANU Canberra), 13 April 2016
-      
-      if (!defined $best_AS_so_far){
-	  $best_AS_so_far = $alignment_score;
-	  $overwrite++;
-	  # warn "First alignment score, setting \$best_AS_so_far to $best_AS_so_far\n";
-	  if ($ambig_bam){ # also setting the first_ambig_alignment
-	      $first_ambig_alignment = $fhs[$index]->{last_line};
-	      $first_ambig_alignment =~ s/_(CT|GA)_converted//;
-	      # warn "$first_ambig_alignment\n"; sleep(1);
-	  }	
-      }
-      else{
-	  if ($alignment_score >= $best_AS_so_far){ # AS are generally negative with a maximum of 0;
-	      # 19 07 2016: changed this to >= so that equally good alignments are also added. Ambiguous alignments from different threads will be identified later on
-	      $best_AS_so_far = $alignment_score;
-	      $overwrite++;
-	      # warn "Found better or equal alignment score ($alignment_score), setting \$best_AS_so_far to $best_AS_so_far\n";
-	      
-	      # 22 07 2016: resetting the ambiguous score within same thread only if the current alignment is really better than the previous one
-	      if ($alignment_score > $best_AS_so_far){
-		  # warn "Resetting amb within thread value to 0\n";
-		  $amb_same_thread = 0;
-		  
-		  if ($ambig_bam){ # also setting a new first_ambig_alignment
-		      $first_ambig_alignment = $fhs[$index]->{last_line};
-		      $first_ambig_alignment =~ s/_(CT|GA)_converted//;
-		      # warn "$first_ambig_alignment\n"; sleep(1);
-		  }
-	      }
-	  }
-	  else{
-	      # warn "Current alignment (AS $alignment_score) isn't better than the best so far ($best_AS_so_far). Not changing anything\n";
-	  }
-      }
-      
-      # warn "First  best alignment_score is: '$alignment_score'\n";
-      # warn "MD tag is: '$MD_tag'\n";
-      die "Failed to extract alignment score ($alignment_score) and MD tag ($MD_tag) from line $fhs[$index]->{last_line}!\n" unless (defined $alignment_score and defined $MD_tag);
-      
-      if (defined $second_best){
-	  # warn "second best alignment_score is: '$second_best'\n\n";
-	  
-	  # If the first alignment score is the same as the alignment score of the second best hit we keep a memory of this
-	  if ($alignment_score == $second_best){
-	      
-	      # checking to see if this read produced the best alignment
-	      if ($alignment_score == $best_AS_so_far){  # yes this read is the best one so far, however it is ambiguous
-		  # warn "Read is ambiguous within the same thread, or otherwise as good as the best one so far. Setting \$amb_same_thread to 1 for currently best AS: $best_AS_so_far\n";
-		  $amb_same_thread = 1;
-	      }
-	      else{
-		  # warn "This read has a worse alignments score than the best alignment so far and will be ignored even though it is ambiguous in itself\n";
-	      }
-	      
-	      ### if there is a better alignment later on -> fine. If not, the read will get booted altogether
-	      
-	      ## need to read and discard all additional ambiguous reads until we reach the next sequence
-	      until ($fhs[$index]->{last_seq_id} ne $identifier){
-		  my $newline = $fhs[$index]->{fh}-> getline();
-		  if ($newline){
-		      chomp $newline;
-		      my ($seq_id) = split (/\t/,$newline);
-		      $fhs[$index]->{last_seq_id} = $seq_id;
-		      $fhs[$index]->{last_line} = $newline;
-		  }
-		  else{
-		      # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-		      $fhs[$index]->{last_seq_id} = undef;
-		      $fhs[$index]->{last_line} = undef;
-		      last; # break free in case we have reached the end of the alignment output
-		  }
-	      }
-	      #  warn "Index: $index\tThe current Seq-ID is $identifier, skipped all ambiguous sequences until the next ID which is: $fhs[$index]->{last_seq_id}\n";
-	  }
-	  else{ # the next best alignment has a lower alignment score than the current read, so we can safely store the current alignment
-	      
-	      my $alignment_location = join (":",$chromosome,$position);
-	      
-	      ### If a sequence aligns to exactly the same location with a perfect match twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	      ### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
-	      ### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
-	      ### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 1, i.e. OT and OB 
-	      
-	      if ($overwrite){
-		  $alignments{$alignment_location}->{seq_id} = $id; 
-		  $alignments{$alignment_location}->{alignment_score} = $alignment_score;
-		  $alignments{$alignment_location}->{alignment_score_second_best} = $second_best;
-		  $alignments{$alignment_location}->{bowtie_sequence} = $bowtie_sequence;
-		  $alignments{$alignment_location}->{index} = $index;
-		  $alignments{$alignment_location}->{chromosome} = $chromosome;
-		  $alignments{$alignment_location}->{position} = $position;
-		  $alignments{$alignment_location}->{CIGAR} = $cigar;
-		  $alignments{$alignment_location}->{MD_tag} = $MD_tag;
-	      }
-	      
-	      ### now reading and discarding all (inferior) alignments of this sequencing read until we hit the next sequence
-	      until ($fhs[$index]->{last_seq_id} ne $identifier){
-		  my $newline = $fhs[$index]->{fh}-> getline();
-		  if ($newline){
-		      chomp $newline;
-		      my ($seq_id) = split (/\t/,$newline);
-		      $fhs[$index]->{last_seq_id} = $seq_id;
-		      $fhs[$index]->{last_line} = $newline;
-		  }
-		  else{
-		      # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-		      $fhs[$index]->{last_seq_id} = undef;
-		      $fhs[$index]->{last_line} = undef;
-		      last; # break free in case we have reached the end of the alignment output
-		  }
-	      }
-	      #  warn "Index: $index\tThe current Seq-ID is $identifier, skipped all ambiguous sequences until the next ID which is: $fhs[$index]->{last_seq_id}\n";
-	  }
-      }
-      else{ # there is no second best hit, so we can just store this one and read in the next sequence
-
-	  my $alignment_location = join (":",$chromosome,$position);
-	  # warn "There is no second best hit. Overwrite status: $overwrite\n";
-	  ### If a sequence aligns to exactly the same location with a perfect match twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	  ### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
-	  ### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
-	  ### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 1, i.e. OT and OB 
-	  
-	  if ($overwrite){
-	      $alignments{$alignment_location}->{seq_id} = $id; 
-	      $alignments{$alignment_location}->{alignment_score} = $alignment_score;
-	      $alignments{$alignment_location}->{alignment_score_second_best} = undef;
-	      $alignments{$alignment_location}->{bowtie_sequence} = $bowtie_sequence;
-	      $alignments{$alignment_location}->{index} = $index;
-	      $alignments{$alignment_location}->{chromosome} = $chromosome;
-	      $alignments{$alignment_location}->{position} = $position;
-	      $alignments{$alignment_location}->{MD_tag} = $MD_tag;
-	      $alignments{$alignment_location}->{CIGAR} = $cigar;
-	  }
-	  
-	  my $newline = $fhs[$index]->{fh}-> getline();
-	  if ($newline){
-	      chomp $newline;
-	      my ($seq_id) = split (/\t/,$newline);
-	      $fhs[$index]->{last_seq_id} = $seq_id;
-	      $fhs[$index]->{last_line} = $newline;
-	      if ($seq_id eq $identifier){
-		  die "Sequence with ID $identifier did not have a second best alignment, but next seq-ID was also $fhs[$index]->{last_seq_id}!\n";
-	      }
-	  }
-	  else{
-	      # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line} = undef;
-	  }
-      }
-    }
-  }
-  
-  ### If there were several equally good alignments for the best alignment score we will boot the read
-  if ($amb_same_thread){
-      $alignment_ambiguous = 1;
-      # warn "\$alignment_ambiguous now: $alignment_ambiguous\n";
-  }
-  else{
-      # warn "alignment won't be considered ambiguous. This time....\n";
-  }
-
-  ### if the read produced several ambiguous alignments already now can returning already now. If --ambiguous or --unmapped was specified the read sequence will be printed out.
-  if ($alignment_ambiguous == 1){
-      $counting{unsuitable_sequence_count}++;
-      ### report that the sequence has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-      # my $ambiguous_read_output = join("\t",$identifier,'256','*','0','0','*','*','0','0',$sequence,$quality_value);
-      # print "$ambiguous_read_output\n";
-
-      if ($ambig_bam){ 
-	  # warn "Sequence is ambiguous, printing out BAM file:\n";
-	  print AMBIBAM "$first_ambig_alignment\n";
-      }  
-
-      if ($ambiguous){
-	  return 2; # => exits to next sequence, and prints it out to _ambiguous_reads.txt if '--ambiguous' was specified
-      }
-      elsif ($unmapped){
-	  return 1; # => exits to next sequence, and prints it out to _unmapped_reads.txt if '--unmapped' but not '--ambiguous' was specified
-      }
-      else{
-	  return 0;
-      }
-  }
-
-  ### if there was no alignment found for a certain sequence at all we continue with the next sequence in the sequence file
-  unless(%alignments){
-    $counting{no_single_alignment_found}++;
-    # my $unmapped_read_output = join("\t",$identifier,'4','*','0','0','*','*','0','0',$sequence,$quality_value);
-    # print  "$unmapped_read_output\n";
-    if ($unmapped){
-      return 1; # => exits to next sequence, and prints it out to _unmapped_reads.txt if '--unmapped' was specified
-    }
-    else{
-      return 0; # default
-    }
-  }
-
-  #######################################################################################################################################################
-
-  ### If the sequence was not rejected so far we are now looking if there is a unique best alignment among all alignment instances. If there is only one
-  ### single best position we are going to store the alignment information in the $meth_call variable. If there are multiple hits with the same (highest)
-  ### alignment score we are discarding the sequence altogether.
-  ### For end-to-end alignments the maximum alignment score can be 0, each mismatch can receive penalties up to 6, and each gap receives penalties for
-  ### opening (5) and extending (3 per bp) the gap.
-
-  #######################################################################################################################################################
-
-  my $methylation_call_params; # hash reference which will store all information we need for the methylation call
-  my $sequence_fails = 0; # Going to use $sequence_fails as a 'memory' if a sequence could not be aligned uniquely (set to 1 then)
-
-  ### print contents of %alignments for debugging
-  #   if (scalar keys %alignments > 1){
-  #     print "\n******\n";
-  #     foreach my $alignment_location (sort {$a cmp $b} keys %alignments){
-  #       print "Loc:  $alignment_location\n";
-  #       print "ID:   $alignments{$alignment_location}->{seq_id}\n";
-  #       print "AS:   $alignments{$alignment_location}->{alignment_score}\n";
-  #       print "Seq:  $alignments{$alignment_location}->{bowtie_sequence}\n";
-  #       print "Index $alignments{$alignment_location}->{index}\n";
-  #       print "Chr:  $alignments{$alignment_location}->{chromosome}\n";
-  #       print "pos:  $alignments{$alignment_location}->{position}\n";
-  #       print "MD:   $alignments{$alignment_location}->{MD_tag}\n\n";
-  #     }
-  #     print "\n******\n";
-  #   }
-
-  ### if there is only 1 entry in the hash with we accept it as the best alignment
-  if (scalar keys %alignments == 1){
-    for my $unique_best_alignment (keys %alignments){
-      $methylation_call_params->{$identifier}->{bowtie_sequence} = $alignments{$unique_best_alignment}->{bowtie_sequence};
-      $methylation_call_params->{$identifier}->{chromosome}      = $alignments{$unique_best_alignment}->{chromosome};
-      $methylation_call_params->{$identifier}->{position}        = $alignments{$unique_best_alignment}->{position};
-      $methylation_call_params->{$identifier}->{index}           = $alignments{$unique_best_alignment}->{index};
-      $methylation_call_params->{$identifier}->{alignment_score} = $alignments{$unique_best_alignment}->{alignment_score};
-      $methylation_call_params->{$identifier}->{alignment_score_second_best} = $alignments{$unique_best_alignment}->{alignment_score_second_best};
-      $methylation_call_params->{$identifier}->{MD_tag}          = $alignments{$unique_best_alignment}->{MD_tag};
-      $methylation_call_params->{$identifier}->{CIGAR}           = $alignments{$unique_best_alignment}->{CIGAR};
-    }
-  }
-
-  ### otherwise we are going to find out if there is a best match among the multiple alignments, or whether there are 2 or more equally good alignments (in which case
-  ### we boot the sequence altogether
-  elsif (scalar keys %alignments >= 2  and scalar keys %alignments <= 4){
-    my $best_alignment_score;
-    my $best_alignment_location;
-    foreach my $alignment_location (sort {$alignments{$b}->{alignment_score} <=> $alignments{$a}->{alignment_score}} keys %alignments){
-      # print "$alignments{$alignment_location}->{alignment_score}\n";
-      unless (defined $best_alignment_score){
-	$best_alignment_score = $alignments{$alignment_location}->{alignment_score};
-	$best_alignment_location = $alignment_location;
-	# print "setting best alignment score: $best_alignment_score\n";
-      }
-      else{
-	### if the second best alignment has the same alignment score as the first one, the sequence will get booted
-	if ($alignments{$alignment_location}->{alignment_score} == $best_alignment_score){
-	  # warn "Same alignment score, the sequence will get booted!\n";
-	  $sequence_fails = 1;
-	  last; # exiting after the second alignment since we know that the sequence has ambiguous alignments
-	}
-	### else we are going to store the best alignment for further processing
-	else{
-	  $methylation_call_params->{$identifier}->{bowtie_sequence} = $alignments{$best_alignment_location}->{bowtie_sequence};
-	  $methylation_call_params->{$identifier}->{chromosome}      = $alignments{$best_alignment_location}->{chromosome};
-	  $methylation_call_params->{$identifier}->{position}        = $alignments{$best_alignment_location}->{position};
-	  $methylation_call_params->{$identifier}->{index}           = $alignments{$best_alignment_location}->{index};
-	  $methylation_call_params->{$identifier}->{alignment_score} = $alignments{$best_alignment_location}->{alignment_score};
-	  $methylation_call_params->{$identifier}->{MD_tag}          = $alignments{$best_alignment_location}->{MD_tag};
-	  $methylation_call_params->{$identifier}->{CIGAR}           = $alignments{$best_alignment_location}->{CIGAR};
-	  if (defined $alignments{$best_alignment_location}->{alignment_score_second_best} and $alignments{$best_alignment_location}-> {alignment_score_second_best} > $alignments{$alignment_location}->{alignment_score}) {
-	    $methylation_call_params->{$identifier}->{alignment_score_second_best} = $alignments{$best_alignment_location}->{alignment_score_second_best};
-	  }
-	  else {
-	    $methylation_call_params->{$identifier}->{alignment_score_second_best} = $alignments{$alignment_location}->{alignment_score};
-	  }
-	  last; # exiting after processing the second alignment since the sequence produced a unique best alignment
-	}
-      }
-    }
-  }
-  else{
-    die "There are too many potential hits for this sequence (1-4 expected, but found: ",scalar keys %alignments,")\n";;
-  }
-
-  ### skipping the sequence completely if there were multiple alignments with the same best alignment score at different positions
-  if ($sequence_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-
-    ### report that the sequence has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-    # my $ambiguous_read_output = join("\t",$identifier,'256','*','0','0','*','*','0','0',$sequence,$quality_value);
-    # print OUT "$ambiguous_read_output\n";
-
-    if ($ambiguous){
-      return 2; # => exits to next sequence, and prints it out (in FastQ format) to _ambiguous_reads.txt if '--ambiguous' was specified
-    }
-    elsif ($unmapped){
-      return 1; # => exits to next sequence, and prints it out (in FastQ format) to _unmapped_reads.txt if '--unmapped' but not '--ambiguous' was specified
-    }
-    else{
-      return 0; # => exits to next sequence (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 2) or ($methylation_call_params->{$identifier}->{index} == 3) ){
-      # warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence has not been rejected so far it has a unique best alignment
-  $counting{unique_best_alignment_count}++;
-
-  ### Now we need to extract a genomic sequence that exactly corresponds to the reported alignment. This potentially means that we need to deal with insertions or deletions as well
-  extract_corresponding_genomic_sequence_single_end_bowtie2 ($identifier,$methylation_call_params);
-
-  ### check test to see if the genomic sequence we extracted has the same length as the observed sequence+2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence}) != length($sequence)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  # Compute MAPQ value
-  $methylation_call_params->{$identifier}->{mapq} = calc_mapq (length($sequence), undef,
-							       $methylation_call_params->{$identifier}->{alignment_score},
-							       $methylation_call_params->{$identifier}->{alignment_score_second_best});
-
-
-
-  ### otherwise we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call} = methylation_call($identifier,$sequence,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence},$methylation_call_params->{$identifier}->{read_conversion});
-  print_bisulfite_mapping_result_single_end_bowtie2 ($identifier,$sequence,$methylation_call_params,$quality_value);
-  return 0; ## if a sequence got this far we do not want to print it to unmapped or ambiguous.out
-}
-
-
-sub determine_number_of_transliterations_performed{
-  my ($sequence,$read_conversion) = @_;
-  my $number_of_transliterations;
-  if ($read_conversion eq 'CT'){
-    $number_of_transliterations = $sequence =~ tr/C/T/;
-  }
-  elsif ($read_conversion eq 'GA'){
-    $number_of_transliterations = $sequence =~ tr/G/A/;
-  }
-  else{
-    die "Read conversion mode of the read was not specified $!\n";
-  }
-  return $number_of_transliterations;
-}
-
-sub decide_whether_single_end_alignment_is_valid{
-  my ($index,$identifier) = @_;
-
-  # extracting from Bowtie 1 format
-  my ($id,$strand) = (split (/\t/,$fhs[$index]->{last_line}))[0,1];
-
-  ### ensuring that the entry is the correct sequence
-  if (($id eq $fhs[$index]->{last_seq_id}) and ($id eq $identifier)){
-    ### checking the orientation of the alignment. We need to discriminate between 8 different conditions, however only 4 of them are theoretically
-    ### sensible alignments
-    my $orientation = ensure_sensical_alignment_orientation_single_end ($index,$strand);
-    ### If the orientation was correct can we move on
-    if ($orientation == 1){
-      return 1; ### 1st possibility for a sequence to pass
-    }
-    ### If the alignment was in the wrong orientation we need to read in a new line
-    elsif($orientation == 0){
-      my $newline = $fhs[$index]->{fh}->getline();
-      if ($newline){
-		($id,$strand) = (split (/\t/,$newline))[0,1];
-		
-	### ensuring that the next entry is still the correct sequence
-	if ($id eq $identifier){
-	  ### checking orientation again
-	  $orientation = ensure_sensical_alignment_orientation_single_end ($index,$strand);
-	  ### If the orientation was correct can we move on
-	  if ($orientation == 1){
-	    $fhs[$index]->{last_seq_id} = $id;
-	    $fhs[$index]->{last_line} = $newline;
-	    return 1; ### 2nd possibility for a sequence to pass
-	  }
-	  ### If the alignment was in the wrong orientation again we need to read in yet another new line and store it in @fhs
-	  elsif ($orientation == 0){
-	    $newline = $fhs[$index]->{fh}->getline();
-	    if ($newline){
-	      my ($seq_id) = split (/\t/,$newline);
-	      ### check if the next line still has the same seq ID (must not happen), and if not overwrite the current seq-ID and bowtie output with
-	      ### the same fields of the just read next entry
-	      die "Same seq ID 3 or more times in a row!(should be 2 max) $!" if ($seq_id eq $identifier);
-	      $fhs[$index]->{last_seq_id} = $seq_id;
-	      $fhs[$index]->{last_line} = $newline;
-	      return 0; # not processing anything this round as the alignment currently stored in last_line was in the wrong orientation
-	    }
-	    else{
-	      # assigning undef to last_seq_id and last_line (end of bowtie output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line} = undef;
-	      return 0; # not processing anything as the alignment currently stored in last_line was in the wrong orientation
-	    }
-	  }
-	  else{
-	    die "The orientation of the alignment must be either correct or incorrect\n";
-	  }
-	}
-	### the sequence we just read in is already the next sequence to be analysed -> store it in @fhs
-	else{
-	  $fhs[$index]->{last_seq_id} = $id;
-	  $fhs[$index]->{last_line} = $newline;
-	  return 0; # processing the new alignment result only in the next round
-	}
-      }
-      else {
-	# assigning undef to last_seq_id and last_line (end of bowtie output)
-	$fhs[$index]->{last_seq_id} = undef;
-	$fhs[$index]->{last_line} = undef;
-	return 0; # not processing anything as the alignment currently stored in last_line was in the wrong orientation
-      }
-    }
-    else{
-      die "The orientation of the alignment must be either correct or incorrect\n";
-    }
-  }
-  ### the sequence stored in @fhs as last_line is already the next sequence to be analysed -> analyse next round
-  else{
-    return 0;
-  }
-}
-#########################
-### BOWTIE 1 | PAIRED-END
-#########################
-
-sub check_bowtie_results_paired_ends{
-  my ($sequence_1,$sequence_2,$identifier,$quality_value_1,$quality_value_2) = @_;
-
-  ### quality values are not given for FastA files, so they are initialised with a Phred quality of 40
-  unless ($quality_value_1){
-    $quality_value_1 = 'I'x(length$sequence_1);
-  }
-  unless ($quality_value_2){
-    $quality_value_2 = 'I'x(length$sequence_2);
-  }
-
-  #  warn "$identifier\n$fhs[0]->{last_seq_id}\n$fhs[1]->{last_seq_id}\n$fhs[2]->{last_seq_id}\n$fhs[3]->{last_seq_id}\n\n";
-  #  sleep (1);
-  my %mismatches = ();
-  ### reading from the bowtie output files to see if this sequence pair aligned to a bisulfite converted genome
-
-
-  ### for paired end reads we are reporting alignments to the OT strand first (index 0), then the OB strand (index 3!!), similiar to the single end way.
-  ### alignments to the complementary strands are reported afterwards (CTOT got index 1, and CTOB got index 2).
-  ### This is needed so that alignments which either contain no single C or G or reads which contain only protected Cs are reported to the original strands (OT and OB)
-  ### Before the complementary strands. Remember that it does not make any difference for the methylation calls, but it will matter if alignment to the complementary
-  ### strands are not being reported by specifying --directional
-
-  foreach my $index (0,3,1,2){
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line_1} and $fhs[$index]->{last_line_2} and defined $fhs[$index]->{last_seq_id});
-    ### if the sequence pair we are currently looking at produced an alignment we are doing various things with it
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-      # print "$identifier\n$fhs[$index]->{last_seq_id}\n\n";
-
-      ##################################################################################
-      ### STEP I Processing the entry which is stored in last_line_1 and last_line_2 ###
-      ##################################################################################
-      my $valid_alignment_found = decide_whether_paired_end_alignment_is_valid($index,$identifier);
-      ### sequences can fail at this point if there was only 1 alignment in the wrong orientation, or if there were 2 aligments both in the wrong
-      ### orientation. We only continue to extract useful information about this alignment if 1 was returned
-      if ($valid_alignment_found == 1){
-	### Bowtie outputs which made it this far are in the correct orientation, so we can continue to analyse the alignment itself.
-	### we store the useful information in %mismatches
-	my ($id_1,$strand_1,$mapped_chromosome_1,$position_1,$bowtie_sequence_1,$mismatch_info_1) = (split (/\t/,$fhs[$index]->{last_line_1},-1))[0,1,2,3,4,7];
-	my ($id_2,$strand_2,$mapped_chromosome_2,$position_2,$bowtie_sequence_2,$mismatch_info_2) = (split (/\t/,$fhs[$index]->{last_line_2},-1))[0,1,2,3,4,7];
-	chomp $mismatch_info_1;
-	chomp $mismatch_info_2;
-	
-	### need to extract the chromosome number from the bowtie output (which is either XY_CT_converted or XY_GA_converted
-	my ($chromosome_1,$chromosome_2);
-	if ($mapped_chromosome_1 =~ s/_(CT|GA)_converted$//){
-	  $chromosome_1 = $mapped_chromosome_1;
-	}	
-	else{
-	  die "Chromosome number extraction failed for $mapped_chromosome_1\n";
-	}
-	if ($mapped_chromosome_2 =~ s/_(CT|GA)_converted$//){
-	  $chromosome_2 = $mapped_chromosome_2;
-	}
-	else{
-	  die "Chromosome number extraction failed for $mapped_chromosome_2\n";
-	}
-	
-	### Now extracting the number of mismatches to the converted genome
-	my $number_of_mismatches_1;
-	my $number_of_mismatches_2;
-	if ($mismatch_info_1 eq ''){
-	  $number_of_mismatches_1 = 0;
-	}
-	elsif ($mismatch_info_1 =~ /^\d/){
-	  my @mismatches = split (/,/,$mismatch_info_1);
-	  $number_of_mismatches_1 = scalar @mismatches;
-	}
-	else{
-	  die "Something weird is going on with the mismatch field\n";
-	}
-	if ($mismatch_info_2 eq ''){
-	  $number_of_mismatches_2 = 0;
-	}
-	elsif ($mismatch_info_2 =~ /^\d/){
-	  my @mismatches = split (/,/,$mismatch_info_2);
-	  $number_of_mismatches_2 = scalar @mismatches;
-	}
-	else{
-	  die "Something weird is going on with the mismatch field\n";
-	}
-	### To decide whether a sequence pair has a unique best alignment we will look at the lowest sum of mismatches from both alignments
-	my $sum_of_mismatches = $number_of_mismatches_1+$number_of_mismatches_2;
-	### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	die "Position 1 is higher than position 2" if ($position_1 > $position_2);
-	die "Paired-end alignments need to be on the same chromosome\n" unless ($chromosome_1 eq $chromosome_2);
-	my $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	### strand) were methylated and therefore protected. It is not needed to overwrite the same positional entry with a second entry for the same
-	### location (the genomic sequence extraction and methylation would not be affected by this, only the thing which would change is the index
-	### number for the found alignment)
-	unless (exists $mismatches{$sum_of_mismatches}->{$alignment_location}){
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{seq_id}=$id_1; # either is fine
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_1}=$bowtie_sequence_1;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_2}=$bowtie_sequence_2;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{index}=$index;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome_1; # either is fine
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_1}=$position_1;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_2}=$position_2;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_1} = $number_of_mismatches_1;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_2} = $number_of_mismatches_2;
-	}
-	###################################################################################################################################################
-	### STEP II Now reading in the next 2 lines from the bowtie filehandle. If there are 2 next lines in the alignments filehandle it can either    ###
-	### be a second alignment of the same sequence pair or a new sequence pair. In any case we will just add it to last_line_1 and last_line _2.    ###
-	### If it is the alignment of the next sequence pair, 0 will be returned as $valid_alignment_found, so it will not be processed any further in  ###
-	### this round                                                                                                                                  ###
-	###################################################################################################################################################
-	my $newline_1 = $fhs[$index]->{fh}-> getline();
-	my $newline_2 = $fhs[$index]->{fh}-> getline();
-
-	if ($newline_1 and $newline_2){
-	  my ($seq_id_1) = split (/\t/,$newline_1);
-	  my ($seq_id_2) = split (/\t/,$newline_2);
-	
-	  if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-	    $fhs[$index]->{last_seq_id} = $seq_id_1;
-	  }
-	  elsif ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-	    $fhs[$index]->{last_seq_id} = $seq_id_2;
-	  }
-	  else{
-	    die "Either read 1 or read 2 needs to end on '/1'\n";
-	  }
-	
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-	}
-	else {
-	  # assigning undef to last_seq_id and both last_lines and jumping to the next index (end of bowtie output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line_1} = undef;
-	  $fhs[$index]->{last_line_2} = undef;
-	  next; # jumping to the next index
-	}
-	### Now processing the entry we just stored in last_line_1 and last_line_2
-	$valid_alignment_found = decide_whether_paired_end_alignment_is_valid($index,$identifier);
-	### only processing the alignment further if 1 was returned. 0 will be returned either if the alignment is already the next sequence pair to
-	### be analysed or if it was a second alignment of the current sequence pair but in the wrong orientation
-	if ($valid_alignment_found == 1){
-	  ### we store the useful information in %mismatches
-	  ($id_1,$strand_1,$mapped_chromosome_1,$position_1,$bowtie_sequence_1,$mismatch_info_1) = (split (/\t/,$fhs[$index]->{last_line_1}))[0,1,2,3,4,7];
-	  ($id_2,$strand_2,$mapped_chromosome_2,$position_2,$bowtie_sequence_2,$mismatch_info_2) = (split (/\t/,$fhs[$index]->{last_line_2}))[0,1,2,3,4,7];
-	  chomp $mismatch_info_1;
-	  chomp $mismatch_info_2;
-	  ### need to extract the chromosome number from the bowtie output (which is either _CT_converted or _GA_converted)
-	  if ($mapped_chromosome_1 =~ s/_(CT|GA)_converted$//){
-	    $chromosome_1 = $mapped_chromosome_1;
-	  }	
-	  else{
-	    die "Chromosome number extraction failed for $mapped_chromosome_1\n";
-	  }
-	  if ($mapped_chromosome_2 =~ s/_(CT|GA)_converted$//){
-	    $chromosome_2 = $mapped_chromosome_2;
-	  }
-	  else{
-	    die "Chromosome number extraction failed for $mapped_chromosome_2\n";
-	  }
-	
-	  $number_of_mismatches_1='';
-	  $number_of_mismatches_2='';
-	  ### Now extracting the number of mismatches to the converted genome
-	  if ($mismatch_info_1 eq ''){
-	    $number_of_mismatches_1 = 0;
-	  }
-	  elsif ($mismatch_info_1 =~ /^\d/){
-	    my @mismatches = split (/,/,$mismatch_info_1);
-	    $number_of_mismatches_1 = scalar @mismatches;
-	  }
-	  else{
-	    die "Something weird is going on with the mismatch field\n";
-	  }
-	  if ($mismatch_info_2 eq ''){
-	    $number_of_mismatches_2 = 0;
-	  }
-	  elsif ($mismatch_info_2 =~ /^\d/){
-	    my @mismatches = split (/,/,$mismatch_info_2);
-	    $number_of_mismatches_2 = scalar @mismatches;
-	  }
-	  else{
-	    die "Something weird is going on with the mismatch field\n";
-	  }
-	  ### To decide whether a sequence pair has a unique best alignment we will look at the lowest sum of mismatches from both alignments
-	  $sum_of_mismatches = $number_of_mismatches_1+$number_of_mismatches_2;
-	  ### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	  die "position 1 is greater than position 2" if ($position_1 > $position_2);
-	  die "Paired-end alignments need to be on the same chromosome\n" unless ($chromosome_1 eq $chromosome_2);
-	  $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	  ### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	  ### strand) were methylated and therefore protected. It is not needed to overwrite the same positional entry with a second entry for the same
-	  ### location (the genomic sequence extraction and methylation would not be affected by this, only the thing which would change is the index
-	  ### number for the found alignment)
-	  unless (exists $mismatches{$sum_of_mismatches}->{$alignment_location}){
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{seq_id}=$id_1; # either is fine
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_1}=$bowtie_sequence_1;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_2}=$bowtie_sequence_2;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{index}=$index;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome_1; # either is fine
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_1}=$position_1;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_2}=$position_2;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_1} = $number_of_mismatches_1;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_2} = $number_of_mismatches_2;
-	  }
-	  ###############################################################################################################################################
-	  ### STEP III Now reading in two more lines. These have to be the next entry and we will just add assign them to last_line_1 and last_line_2 ###
-	  ###############################################################################################################################################
-	  $newline_1 = $fhs[$index]->{fh}-> getline();
-	  $newline_2 = $fhs[$index]->{fh}-> getline();
-
-	  if ($newline_1 and $newline_2){
-	    my ($seq_id_1) = split (/\t/,$newline_1);
-	    my ($seq_id_2) = split (/\t/,$newline_2);
-
-	    if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-	      $fhs[$index]->{last_seq_id} = $seq_id_1;
-	    }
-	    if ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-	      $fhs[$index]->{last_seq_id} = $seq_id_2;
-	    }
-	    $fhs[$index]->{last_line_1} = $newline_1;
-	    $fhs[$index]->{last_line_2} = $newline_2;
-	  }
-	  else {
-	    # assigning undef to last_seq_id and both last_lines and jumping to the next index (end of bowtie output)
-	    $fhs[$index]->{last_seq_id} = undef;
-	    $fhs[$index]->{last_line_1} = undef;
-	    $fhs[$index]->{last_line_2} = undef;
-	    next; # jumping to the next index
-	  }
-	  ### within the 2nd sequence pair alignment in correct orientation found
-	}
-	### within the 1st sequence pair alignment in correct orientation found
-      }
-      ### still within the (last_seq_id eq identifier) condition
-    }
-    ### still within foreach index loop
-  }
-  ### if there was no single alignment found for a certain sequence we will continue with the next sequence in the sequence file
-  unless(%mismatches){
-    $counting{no_single_alignment_found}++;
-    return 1; ### We will print this sequence out as unmapped sequence if --un unmapped.out has been specified
-  }
-  ### Going to use the variable $sequence_pair_fails as a 'memory' if a sequence could not be aligned uniquely (set to 1 then)
-  my $sequence_pair_fails = 0;
-  ### Declaring an empty hash reference which will store all information we need for the methylation call
-  my $methylation_call_params; # hash reference!
-  ### We are now looking if there is a unique best alignment for a certain sequence. This means we are sorting in ascending order and look at the
-  ### sequence with the lowest amount of mismatches. If there is only one single best position we are going to store the alignment information in the
-  ### meth_call variables, if there are multiple hits with the same amount of (lowest) mismatches we are discarding the sequence altogether
-  foreach my $mismatch_number (sort {$a<=>$b} keys %mismatches){
-    #dev print "Number of mismatches: $mismatch_number\t$identifier\t$sequence_1\t$sequence_2\n";
-    foreach my $entry (keys (%{$mismatches{$mismatch_number}}) ){
-      #dev print "$mismatch_number\t$entry\t$mismatches{$mismatch_number}->{$entry}->{index}\n";
-      # print join("\t",$mismatch_number,$mismatches{$mismatch_number}->{$entry}->{seq_id},$sequence,$mismatches{$mismatch_number}->{$entry}->{bowtie_sequence},$mismatches{$mismatch_number}->{$entry}->{chromosome},$mismatches{$mismatch_number}->{$entry}->{position},$mismatches{$mismatch_number}->{$entry}->{index}),"\n";
-    }
-    if (scalar keys %{$mismatches{$mismatch_number}} == 1){
-      #  print "Unique best alignment for sequence pair $sequence_1\t$sequence_1\n";
-      for my $unique_best_alignment (keys %{$mismatches{$mismatch_number}}){
-	$methylation_call_params->{$identifier}->{seq_id} = $identifier;
- 	$methylation_call_params->{$identifier}->{bowtie_sequence_1} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence_1};
-	$methylation_call_params->{$identifier}->{bowtie_sequence_2} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence_2};
-       	$methylation_call_params->{$identifier}->{chromosome} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{chromosome};
-      	$methylation_call_params->{$identifier}->{start_seq_1} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{start_seq_1};
-	$methylation_call_params->{$identifier}->{start_seq_2} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{start_seq_2};
-	$methylation_call_params->{$identifier}->{alignment_end} = ($mismatches{$mismatch_number}->{$unique_best_alignment}->{start_seq_2}+length($mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence_2}));
-	$methylation_call_params->{$identifier}->{index} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{index};
-     	$methylation_call_params->{$identifier}->{number_of_mismatches_1} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{number_of_mismatches_1};
-	$methylation_call_params->{$identifier}->{number_of_mismatches_2} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{number_of_mismatches_2};
-      }
-    }
-    else{
-      $sequence_pair_fails = 1;
-    }
-    ### after processing the alignment with the lowest number of mismatches we exit
-    last;
-  }
-  ### skipping the sequence completely if there were multiple alignments with the same amount of lowest mismatches found at different positions
-  if ($sequence_pair_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-    if ($ambiguous){
-      return 2; # => exits to next sequence pair, and prints both seqs out to multiple_alignments_1 and -2 if --ambiguous has been specified
-    }
-    if ($unmapped){
-      return 1; # => exits to next sequence pair, and prints both seqs out to unmapped_1 and _2  if --un has been specified
-    }
-    else{
-      return 0; # => exits to next sequence (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 1) or ($methylation_call_params->{$identifier}->{index} == 2) ){
-      #    warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence has not been rejected so far it does have a unique best alignment
-  $counting{unique_best_alignment_count}++;
-  extract_corresponding_genomic_sequence_paired_ends($identifier,$methylation_call_params);
-
-  ### check test to see if the genomic sequences we extracted has the same length as the observed sequences +2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1}) != length($sequence_1)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{start_seq_1}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2}) != length($sequence_2)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{start_seq_2}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  ### otherwise we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call_1} = methylation_call($identifier,$sequence_1,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1},$methylation_call_params->{$identifier}->{read_conversion_1});
-  $methylation_call_params->{$identifier}->{methylation_call_2} = methylation_call($identifier,$sequence_2,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2},$methylation_call_params->{$identifier}->{read_conversion_2});
-
-  print_bisulfite_mapping_results_paired_ends($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2);
-  return 0; ## otherwise 1 will be returned by default, which would print the sequence pair to unmapped_1 and _2
-}
-
-#########################
-### BOWTIE 2 | PAIRED-END
-#########################
-
-sub check_bowtie_results_paired_ends_bowtie2{
-  my ($sequence_1,$sequence_2,$identifier,$quality_value_1,$quality_value_2) = @_;
-
-  ### quality values are not given for FastA files, so they are initialised with a Phred quality of 40
-  unless ($quality_value_1){
-    $quality_value_1 = 'I'x(length$sequence_1);
-  }
-
-  unless ($quality_value_2){
-    $quality_value_2 = 'I'x(length$sequence_2);
-  }
-  # print "$identifier\n$fhs[0]->{last_seq_id}\n$fhs[1]->{last_seq_id}\n$fhs[2]->{last_seq_id}\n$fhs[3]->{last_seq_id}\n\n";
-
-  my %alignments;
-  my $alignment_ambiguous = 0;
-
-  my $first_ambig_alignment_line1; # storing the first ambiguous alignment so it can be written out in case '--ambig_bam' was specified R1
-  my $first_ambig_alignment_line2; # R2
-
-  my $best_AS_so_far;   ## we need to keep a memory of the best alignment score so far
-  my $amb_same_thread = 0;   ## if a read's primary and secondary alignments have the same alignment score we set this to true.
-
-  ### reading from the Bowtie 2 output filehandles
-
-  ### for paired end reads we are reporting alignments to the OT strand first (index 0), then the OB strand (index 3!!), similiar to the single end way.
-  ### alignments to the complementary strands are reported afterwards (CTOT got index 1, and CTOB got index 2).
-  ### This is needed so that alignments which either contain no single C or G or reads which contain only protected Cs are reported to the original strands (OT and OB)
-  ### Before the complementary strands. Remember that it does not make any difference for the methylation calls, but it will matter if alignments to the complementary
-  ### strands are not being reported when '--directional' is specified
-
-  foreach my $index (0,3,1,2){
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line_1} and $fhs[$index]->{last_line_2} and defined $fhs[$index]->{last_seq_id});
-
-    ### if the sequence pair we are currently looking at produced an alignment we are doing various things with it
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-	
-	my ($id_1,$flag_1,$mapped_chromosome_1,$position_1,$mapping_quality_1,$cigar_1,$bowtie_sequence_1,$qual_1) = (split (/\t/,$fhs[$index]->{last_line_1}))[0,1,2,3,4,5,9,10];
-	my ($id_2,$flag_2,$mapped_chromosome_2,$position_2,$mapping_quality_2,$cigar_2,$bowtie_sequence_2,$qual_2) = (split (/\t/,$fhs[$index]->{last_line_2}))[0,1,2,3,4,5,9,10];
-      #  print "Index: $index\t$fhs[$index]->{last_line_1}\n";
-      #  print "Index: $index\t$fhs[$index]->{last_line_2}\n";	
-      #  print join ("\t",$id_1,$flag_1,$mapped_chromosome_1,$position_1,$mapping_quality_1,$cigar_1,$bowtie_sequence_1,$qual_1),"\n";
-      #  print join ("\t",$id_2,$flag_2,$mapped_chromosome_2,$position_2,$mapping_quality_2,$cigar_2,$bowtie_sequence_2,$qual_2),"\n";
-      $id_1 =~ s/\/1$//;
-      $id_2 =~ s/\/2$//;
-
-      #  SAM format specifications for Bowtie 2
-      #  (1) Name of read that aligned
-      #  (2) Sum of all applicable flags. Flags relevant to Bowtie are:
-      #        1 The read is one of a pair
-      #        2 The alignment is one end of a proper paired-end alignment
-      #        4 The read has no reported alignments
-      #        8 The read is one of a pair and has no reported alignments
-      #       16 The alignment is to the reverse reference strand
-      #       32 The other mate in the paired-end alignment is aligned to the reverse reference strand
-      #       64 The read is mate 1 in a pair
-      #      128 The read is mate 2 in a pair
-      #      256 The read has multiple mapping states
-      #  (3) Name of reference sequence where alignment occurs (unmapped reads have a *)
-      #  (4) 1-based offset into the forward reference strand where leftmost character of the alignment occurs (0 for unmapped reads)
-      #  (5) Mapping quality (255 means MAPQ is not available)
-      #  (6) CIGAR string representation of alignment (* if unavailable)
-      #  (7) Name of reference sequence where mate's alignment occurs. Set to = if the mate's reference sequence is the same as this alignment's, or * if there is no mate.
-      #  (8) 1-based offset into the forward reference strand where leftmost character of the mate's alignment occurs. Offset is 0 if there is no mate.
-      #  (9) Inferred fragment size. Size is negative if the mate's alignment occurs upstream of this alignment. Size is 0 if there is no mate.
-      # (10) Read sequence (reverse-complemented if aligned to the reverse strand)
-      # (11) ASCII-encoded read qualities (reverse-complemented if the read aligned to the reverse strand). The encoded quality values are on the Phred quality scale and the encoding is ASCII-offset by 33 (ASCII char !), similarly to a FASTQ file.
-      # (12) Optional fields. Fields are tab-separated. bowtie2 outputs zero or more of these optional fields for each alignment, depending on the type of the alignment:
-      # AS:i:<N> Alignment score. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if SAM record is for an aligned read.
-      # XS:i:<N> Alignment score for second-best alignment. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if the SAM record is for an aligned read and more than one alignment was found for the read.
-      # YS:i:<N> Alignment score for opposite mate in the paired-end alignment. Only present if the SAM record is for a read that aligned as part of a paired-end alignment.
-      # XN:i:<N> The number of ambiguous bases in the reference covering this alignment. Only present if SAM record is for an aligned read.
-      # XM:i:<N> The number of mismatches in the alignment. Only present if SAM record is for an aligned read.
-      # XO:i:<N> The number of gap opens, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # XG:i:<N> The number of gap extensions, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # NM:i:<N> The edit distance; that is, the minimal number of one-nucleotide edits (substitutions, insertions and deletions) needed to transform the read string into the reference string. Only present if SAM record is for an aligned read.
-      # YF:Z:<N> String indicating reason why the read was filtered out. See also: Filtering. Only appears for reads that were filtered out.
-      # MD:Z:<S> A string representation of the mismatched reference bases in the alignment. See SAM format specification for details. Only present if SAM record is for an aligned read.
-
-      ### If a sequence has no reported alignments there will be a single output line per sequence with a bit-wise flag value of 77 for read 1 (1+4+8+64), or 141 for read 2 (1+4+8+128).
-      ### We can store the next alignment and move on to the next Bowtie 2 instance
-      if ($flag_1 == 77 and $flag_2 == 141){
-	## reading in the next alignment, which must be the next sequence
-	my $newline_1 = $fhs[$index]->{fh}-> getline();
-	my $newline_2 = $fhs[$index]->{fh}-> getline();
-	
-	if ($newline_1 and $newline_2){
-	  chomp $newline_1;
-	  chomp $newline_2;
-	  my ($seq_id_1) = split (/\t/,$newline_1);
-	  my ($seq_id_2) = split (/\t/,$newline_2);
-	  $seq_id_1 =~ s/\/1$//;
-	  $seq_id_2 =~ s/\/2$//;
-	  $fhs[$index]->{last_seq_id} = $seq_id_1;
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-
-	  #  print "current sequence ($identifier) did not map, reading in next sequence\n";
-	  #  print "$index\t$fhs[$index]->{last_seq_id}\n";
-	  #  print "$index\t$fhs[$index]->{last_line_1}\n";
-	  #  print "$index\t$fhs[$index]->{last_line_2}\n";
-	  next; # next instance
-	}
-	else{
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line_1} = undef;
-	  $fhs[$index]->{last_line_2} = undef;
-	  next;
-	}
-      }
-
-	### If there are one or more proper alignments we can extract the chromosome number
-	my ($chromosome_1,$chromosome_2);
-	if ($mapped_chromosome_1 =~ s/_(CT|GA)_converted$//){
-	    $chromosome_1 = $mapped_chromosome_1;
-	}	
-	else{
-	    die "Chromosome number extraction failed for $mapped_chromosome_1\n";
-	}
-	if ($mapped_chromosome_2 =~ s/_(CT|GA)_converted$//){
-	    $chromosome_2 = $mapped_chromosome_2;
-	}
-	else{
-	    die "Chromosome number extraction failed for $mapped_chromosome_2\n";
-	}
-
-	die "Paired-end alignments need to be on the same chromosome\n" unless ($chromosome_1 eq $chromosome_2);
-
-	### We will use the optional fields to determine the best alignments. Later on we extract the number of mismatches and/or indels from the CIGAR string
-	my ($alignment_score_1,$alignment_score_2,$second_best_1,$second_best_2,$MD_tag_1,$MD_tag_2);
-	
-	my @fields_1 = split (/\t/,$fhs[$index]->{last_line_1});
-	my @fields_2 = split (/\t/,$fhs[$index]->{last_line_2});
-	
-	foreach (11..$#fields_1){
-	    if ($fields_1[$_] =~ /AS:i:(.*)/){
-		$alignment_score_1 = $1;
-	    }
-	    elsif ($fields_1[$_] =~ /XS:i:(.*)/){
-		$second_best_1 = $1;
-	    }
-	    elsif ($fields_1[$_] =~ /MD:Z:(.*)/){
-		$MD_tag_1 = $1;
-	    }
-	}
-	
-	foreach (11..$#fields_2){
-	    if ($fields_2[$_] =~ /AS:i:(.*)/){
-		$alignment_score_2 = $1;
-	    }
-	    elsif ($fields_2[$_] =~ /XS:i:(.*)/){
-		$second_best_2 = $1;
-	    }
-	    elsif ($fields_2[$_] =~ /MD:Z:(.*)/){
-		$MD_tag_2 = $1;
-	    }
-	}
-	
-	die "Failed to extract alignment score 1 ($alignment_score_1) and MD tag ($MD_tag_1)!\nlast alignment 1: $fhs[$index]->{last_line_1}\nlast alignment 2: $fhs[$index]->{last_line_2}\n" unless (defined $alignment_score_1 and defined $MD_tag_1);
-	die "Failed to extract alignment score 2 ($alignment_score_2) and MD tag ($MD_tag_2)!\nlast alignment 1: $fhs[$index]->{last_line_1}\nlast alignment 2: $fhs[$index]->{last_line_2}\n" unless (defined $alignment_score_2 and defined $MD_tag_2);
-	
-	# warn "First read 1 alignment score is: '$alignment_score_1'\n";
-	# warn "First read 2 alignment score is: '$alignment_score_2'\n";
-	# warn "MD tag 1 is: '$MD_tag_1'\n";
-	# warn "MD tag 2 is: '$MD_tag_2'\n";
-	
-	### To decide whether a sequence pair has a unique best alignment we will look at the highest sum of alignment scores from both alignments
-	my $sum_of_alignment_scores_1 = $alignment_score_1 + $alignment_score_2 ;
-	# warn "sum of alignment scores: $sum_of_alignment_scores_1\n\n"; sleep(1);
-
-	my $overwrite = 0; # If there are 2 alternative alignments to the same position, e.g. OT with 50 mismatches and CTOB with 0 mismatches, the CTOB one trumps the OT one.
-	# introduced 13 April 2016 as a suggestion by Sylvain Foret, ANU Canberra
-	
-	if (!defined $best_AS_so_far){
-	    $overwrite = 1;
-	    $best_AS_so_far = $sum_of_alignment_scores_1;
-	    # warn "First alignment score, setting \$best_AS_so_far to $best_AS_so_far\n";
-	    if ($ambig_bam){ # also setting the first_ambig_alignment
-		# Read 1
-		$first_ambig_alignment_line1 = $fhs[$index]->{last_line_1};
-		$first_ambig_alignment_line1 =~ s/_(CT|GA)_converted//;
-		# Read 2
-		$first_ambig_alignment_line2 = $fhs[$index]->{last_line_2};
-		$first_ambig_alignment_line2 =~ s/_(CT|GA)_converted//;
-		# warn "$first_ambig_alignment_line1\n$first_ambig_alignment_line2\n\n"; sleep(1);
-	    }
-	}
-	else{
-	    if ($sum_of_alignment_scores_1 >= $best_AS_so_far){ # AS are generally negative with a maximum of 0
-		# 19 07 2016 Changed to >= so that equally good alignments to different positions get added as well. Ambiguous alignments are identified and removed later.
-		$best_AS_so_far = $sum_of_alignment_scores_1;
-		$overwrite = 1;
-		
-		# warn "Found better or equal sum of alignment scores ($sum_of_alignment_scores_1), setting \$best_AS_so_far to $best_AS_so_far\n";
-		# resetting the ambiguous within thread memory (if applicable at all) only if the current alignment is really better than the previous one.
-		# 22 07 2016: ambiguous score within same thread only resets if the current alignment is really better than the previous one
-		if ($sum_of_alignment_scores_1 > $best_AS_so_far){
-		    # warn "Resetting amb within thread value to 0\n";
-		    $amb_same_thread = 0;
-		    
-		    if ($ambig_bam){ # also setting a new first_ambig_alignment
-			# Read 1
-			$first_ambig_alignment_line1 = $fhs[$index]->{last_line_1};
-			$first_ambig_alignment_line1 =~ s/_(CT|GA)_converted//;
-			# Read 2
-			$first_ambig_alignment_line2 = $fhs[$index]->{last_line_2};
-			$first_ambig_alignment_line2 =~ s/_(CT|GA)_converted//;
-			# warn "$first_ambig_alignment_line1\n$first_ambig_alignment_line2\n\n"; sleep(1);
-		    }
-		}
-	    }
-	    else{
-		# warn "current alignment (AS $sum_of_alignment_scores) isn't better than the best so far ($best_AS_so_far). Not changing anything\n";
-	    }
-	}
-
-	if (defined $second_best_1 and defined $second_best_2){
-	    my $sum_of_alignment_scores_second_best = $second_best_1 + $second_best_2;
-	    # warn "Second best alignment_score_1 is: '$second_best_1'\n";
-	    # warn "Second best alignment_score_2 is: '$second_best_2'\n";
-	    # warn "Second best alignment sum of alignment scores is: '$sum_of_alignment_scores_second_best'\n";
-	    
-	    # If the first alignment score for the first read pair is the same as the alignment score of the second best hit we we keep a memory of this
-	    if ($sum_of_alignment_scores_1 == $sum_of_alignment_scores_second_best){
-		
-		# checking to see if this read pair produced the best alignment
-		if ($sum_of_alignment_scores_1 == $best_AS_so_far){  # yes this is the best read pair so far, either within the thread or between threads, however it is ambiguous
-		    # warn "Read pair is ambiguous within the same thread, or otherwise as good as the best one so far. Setting \$amb_same_thread to 1 for currently best AS: $best_AS_so_far\n";
-		    $amb_same_thread = 1;
-		}
-		else{
-		    # warn "This read pair has a worse alignment score than the best alignment so far and will be ignored even though it is ambiguous in itself\n";
-		}
-		
-		### if there is a better alignment later on -> fine. If not, the read will get booted altogether one way or another
-
-		## need to read and discard all additional ambiguous reads until we reach the next sequence
-		until ($fhs[$index]->{last_seq_id} ne $identifier){
-		    my $newline_1 = $fhs[$index]->{fh}-> getline();
-		    my $newline_2 = $fhs[$index]->{fh}-> getline();
-		    if ($newline_1 and $newline_2){
-			chomp $newline_1;
-			chomp $newline_2;
-			my ($seq_id_1) = split (/\t/,$newline_1);
-			my ($seq_id_2) = split (/\t/,$newline_2);
-			$seq_id_1 =~ s/\/1$//;
-			$seq_id_2 =~ s/\/2$//;
-			# print "New Seq IDs:\t$seq_id_1\t$seq_id_2\n";
-
-			$fhs[$index]->{last_seq_id} = $seq_id_1;
-			$fhs[$index]->{last_line_1} = $newline_1;
-			$fhs[$index]->{last_line_2} = $newline_2;
-		    }
-		    else{
-			# assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-			$fhs[$index]->{last_seq_id} = undef;
-			$fhs[$index]->{last_line_1} = undef;
-			$fhs[$index]->{last_line_2} = undef;
-			last; # break free if the end of the alignment output was reached
-		    }
-		}
-		#  if ($fhs[$index]->{last_seq_id}){
-		#    warn "Index: $index\tThis Seq-ID is $identifier, skipped all ambiguous sequences until the next ID which is: $fhs[$index]->{last_seq_id}\n";
-		#  }
-	    }
-	    else{ # the next best alignment has a lower alignment score than the current read, so we can safely store the current alignment
-		
-		my $alignment_location;
-		if ($position_1 <= $position_2){
-		    $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-		}
-		elsif($position_2 < $position_1){	
-		    $alignment_location = join(":",$chromosome_1,$position_2,$position_1);
-		}
-		
-		### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-		### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
-		### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
-		### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 3, i.e. OT and OB 
-		
-		if ($overwrite){ # see comment above at "my $overwrite = ..."
-		    #unless (exists $alignments{$alignment_location}){
-		    $alignments{$alignment_location}->{seq_id} = $id_1;
-		    $alignments{$alignment_location}->{alignment_score_1} = $alignment_score_1;
-		    $alignments{$alignment_location}->{alignment_score_2} = $alignment_score_2;
-		    $alignments{$alignment_location}->{sum_of_alignment_scores} = $sum_of_alignment_scores_1;
-		    $alignments{$alignment_location}->{sum_of_alignment_scores_second_best} = $sum_of_alignment_scores_second_best;
-		    $alignments{$alignment_location}->{bowtie_sequence_1} = $bowtie_sequence_1;
-		    $alignments{$alignment_location}->{bowtie_sequence_2} = $bowtie_sequence_2;
-		    $alignments{$alignment_location}->{index} = $index;
-		    $alignments{$alignment_location}->{chromosome} = $chromosome_1; # either is fine
-		    $alignments{$alignment_location}->{position_1} = $position_1;
-		    $alignments{$alignment_location}->{position_2} = $position_2;
-		    $alignments{$alignment_location}->{mismatch_info_1} = $MD_tag_1;
-		    $alignments{$alignment_location}->{mismatch_info_2} = $MD_tag_2;
-		    $alignments{$alignment_location}->{CIGAR_1} = $cigar_1;
-		    $alignments{$alignment_location}->{CIGAR_2} = $cigar_2;
-		    $alignments{$alignment_location}->{flag_1} = $flag_1;
-		    $alignments{$alignment_location}->{flag_2} = $flag_2;
-		    # warn "added best of several alignments to \%alignments hash\n";
-		}
-		
-		### now reading and discarding all (inferior) alignments of this read pair until we hit the next sequence
-		until ($fhs[$index]->{last_seq_id} ne $identifier){
-		    my $newline_1 = $fhs[$index]->{fh}-> getline();
-		    my $newline_2 = $fhs[$index]->{fh}-> getline();
-		    if ($newline_1 and $newline_2){
-			chomp $newline_1;
-			chomp $newline_2;
-			my ($seq_id_1) = split (/\t/,$newline_1);
-			my ($seq_id_2) = split (/\t/,$newline_2);
-			$seq_id_1 =~ s/\/1$//;
-			$seq_id_2 =~ s/\/2$//;
-			# print "New Seq IDs:\t$seq_id_1\t$seq_id_2\n";
-			
-			$fhs[$index]->{last_seq_id} = $seq_id_1;
-			$fhs[$index]->{last_line_1} = $newline_1;
-			$fhs[$index]->{last_line_2} = $newline_2;
-		    }
-		    else{
-			# assigning undef to last_seq_id and last_line_1 and _2 and jumping to the next index (end of Bowtie 2 output)
-			$fhs[$index]->{last_seq_id} = undef;
-			$fhs[$index]->{last_line_1} = undef;
-			$fhs[$index]->{last_line_2} = undef;
-			last; # break free if the end of the alignment output was reached
-		    }
-		}
-		# if($fhs[$index]->{last_seq_id}){
-		#   warn "Index: $index\tThis Seq-ID is $identifier, skipped all other alignments until the next ID was reached which is: $fhs[$index]->{last_seq_id}\n";
-		# }
-	    }	
-	}
-	else{ # there is no second best hit, so we can just store this one and read in the next sequence
-	    
-	    my $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	    # print "$alignment_location\n";
-	    ### If a sequence aligns to exactly the same location with a perfect match twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	    ### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
-	    ### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
-	    ### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 3, i.e. OT and OB
-	    
-	    #unless (exists $alignments{$alignment_location}){ # see comment above at my $overwrite = ...
-	    if ($overwrite){
-		$alignments{$alignment_location}->{seq_id} = $id_1;
-		$alignments{$alignment_location}->{alignment_score_1} = $alignment_score_1;
-		$alignments{$alignment_location}->{alignment_score_2} = $alignment_score_2;
-		$alignments{$alignment_location}->{sum_of_alignment_scores} = $sum_of_alignment_scores_1;
-		$alignments{$alignment_location}->{sum_of_alignment_scores_second_best} = undef;
-		$alignments{$alignment_location}->{bowtie_sequence_1} = $bowtie_sequence_1;
-		$alignments{$alignment_location}->{bowtie_sequence_2} = $bowtie_sequence_2;
-		$alignments{$alignment_location}->{index} = $index;
-		$alignments{$alignment_location}->{chromosome} = $chromosome_1; # either is fine
-		$alignments{$alignment_location}->{position_1} = $position_1;
-		$alignments{$alignment_location}->{position_2} = $position_2;
-		$alignments{$alignment_location}->{mismatch_info_1} = $MD_tag_1;
-		$alignments{$alignment_location}->{mismatch_info_2} = $MD_tag_2;
-		$alignments{$alignment_location}->{CIGAR_1} = $cigar_1;
-		$alignments{$alignment_location}->{CIGAR_2} = $cigar_2;
-		$alignments{$alignment_location}->{flag_1} = $flag_1;
-		$alignments{$alignment_location}->{flag_2} = $flag_2;
-		# warn "added unique alignment to \%alignments hash\n";
-	    }
-	    
-	    # Now reading and storing the next read pair
-	    my $newline_1 = $fhs[$index]->{fh}-> getline();
-	    my $newline_2 = $fhs[$index]->{fh}-> getline();
-	    if ($newline_1 and $newline_2){
-		chomp $newline_1;
-		chomp $newline_2;
-		# print "$newline_1\n";
-		# print "$newline_2\n";
-		my ($seq_id_1) = split (/\t/,$newline_1);
-		my ($seq_id_2) = split (/\t/,$newline_2);
-		$seq_id_1 =~ s/\/1$//;
-		$seq_id_2 =~ s/\/2$//;
-		# print "New Seq IDs:\t$seq_id_1\t$seq_id_2\n";
-		
-		$fhs[$index]->{last_seq_id} = $seq_id_1;
-		$fhs[$index]->{last_line_1} = $newline_1;
-		$fhs[$index]->{last_line_2} = $newline_2;
-		
-		if ($seq_id_1 eq $identifier){
-		    die "Sequence with ID $identifier did not have a second best alignment, but next seq-ID was also $fhs[$index]->{last_seq_id}!\n";
-		}
-	    }
-	    else{
-		# assigning undef to last_seq_id and last_line_1 and _2 and jumping to the next index (end of Bowtie 2 output)
-		$fhs[$index]->{last_seq_id} = undef;
-		$fhs[$index]->{last_line_1} = undef;
-		$fhs[$index]->{last_line_2} = undef;
-	    }
-	}
-    }
-  }
-
-  ### If there were several equally good alignments for the best alignment score we will boot the read
-  if ($amb_same_thread){
-      # warn "\$alignment_ambiguous now: $alignment_ambiguous\n";
-      $alignment_ambiguous = 1;
-      # warn "\$alignment_ambiguous now: $alignment_ambiguous\n";
-  }
-  else{
-      # warn "alignment won't be considered ambiguous. This time....\n";
-  }
-  
-
-  ### if the read produced several ambiguous alignments for a single instance of Bowtie 2 we can return already now. If --ambiguous was specified the read sequence will be printed out in FastQ format
-  if ($alignment_ambiguous == 1){
-      $counting{unsuitable_sequence_count}++;
-      ### report that the sequence pair has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-      #  my $ambiguous_read_1 = join("\t",$identifier.'/1','256','*','0','0','*','*','0','0',$sequence_1,$quality_value_1);
-      #  my $ambiguous_read_2 = join("\t",$identifier.'/2','256','*','0','0','*','*','0','0',$sequence_2,$quality_value_2);
-      #  print "$ambiguous_read_1\n";
-      #  print "$ambiguous_read_2\n";
-      
-      if ($ambig_bam){ 
-	  # warn "Sequence is ambiguous, printing out to ambiguous BAM file:\n";
-	  # replacing the first /1\t in the ID of R1 
-	  # warn "Was\n$first_ambig_alignment_line1\n$first_ambig_alignment_line2\n";
-	  $first_ambig_alignment_line1 =~ s/\/1\t/\t/;
- 	  $first_ambig_alignment_line2 =~ s/\/2\t/\t/;
-	  # warn "Is:\n$first_ambig_alignment_line1\n$first_ambig_alignment_line2\n\n";
-	  
-	  print AMBIBAM "$first_ambig_alignment_line1\n$first_ambig_alignment_line2\n";
-   	  # print "$first_ambig_alignment_line1\n$first_ambig_alignment_line2\n";
-      }  
-      
-      if ($ambiguous){
-	  return 2; # => exits to next sequence pair, and prints it out to _ambiguous_reads_1.txt and _ambiguous_reads_2.txt if '--ambiguous' was specified
-      }
-      elsif ($unmapped){
-	  return 1; # => exits to next sequence pair, and prints it out to _unmapped_reads_1.txt and _unmapped_reads_2.txt if '--unmapped' but not '--ambiguous' was specified
-      }
-      else{
-	  return 0;
-      }
-  }
-
-  ### if no alignment was found for a certain sequence at all we continue with the next sequence in the sequence file
-  unless (%alignments){
-    $counting{no_single_alignment_found}++;
-
-    # my $unmapped_read_1 = join("\t",$identifier.'/1','77','*','0','0','*','*','0','0',$sequence_1,$quality_value_1);
-    # my $unmapped_read_2 = join("\t",$identifier.'/2','141','*','0','0','*','*','0','0',$sequence_2,$quality_value_2);
-    # print "$unmapped_read_1\n";
-    # print "$unmapped_read_2\n";
-    if ($unmapped){
-      return 1; # => exits to next sequence pair, and prints it out to _unmapped_reads_1.txt and _unmapped_read_2.txt if '--unmapped' was specified
-    }
-    else{
-      return 0;
-    }
-  }
-
-  #######################################################################################################################################################
-
-  ### If the sequence pair was not rejected so far we are now looking if there is a unique best alignment among all alignment instances. If there is only one
-  ### single best position we are going to store the alignment information in the $meth_call variable. If there are multiple hits with the same (highest)
-  ### alignment score we are discarding the sequence pair altogether.
-  ### For end-to-end alignments the maximum alignment score is 0, each mismatch receives a penalty of 6, and each gap receives penalties for opening (5)
-  ### and extending (3 per bp) the gap.
-
-  #######################################################################################################################################################
-
-  ### Declaring an empty hash reference which will store all information we need for the methylation call
-  my $methylation_call_params; # hash reference
-  my $sequence_pair_fails = 0; # using $sequence_pair_fails as a 'memory' if a sequence could not be aligned uniquely (set to 1 then)
-
-  ### print contents of %alignments for debugging
-  ##  if (scalar keys %alignments >= 1){
-  #     print "\n******\n";
-  #     foreach my $alignment_location (sort {$a cmp $b} keys %alignments){
-  #       print "Loc:  $alignment_location\n";
-  #       print "ID:      $alignments{$alignment_location}->{seq_id}\n";
-  #       print "AS_1:    $alignments{$alignment_location}->{alignment_score_1}\n";
-  #       print "AS_2:    $alignments{$alignment_location}->{alignment_score_2}\n";
-  #       print "Seq_1:   $alignments{$alignment_location}->{bowtie_sequence_1}\n";
-  #       print "Seq_2:   $alignments{$alignment_location}->{bowtie_sequence_2}\n";
-  #       print "Index    $alignments{$alignment_location}->{index}\n";
-  #       print "Chr:     $alignments{$alignment_location}->{chromosome}\n";
-  #       print "Pos_1:   $alignments{$alignment_location}->{position_1}\n";
-  #       print "Pos_2:   $alignments{$alignment_location}->{position_2}\n";
-  #       print "CIGAR_1: $alignments{$alignment_location}->{CIGAR_1}\n";
-  #       print "CIGAR_2: $alignments{$alignment_location}->{CIGAR_2}\n";
-  #       print "MD_1:    $alignments{$alignment_location}->{mismatch_info_1}\n";
-  #       print "MD_2:    $alignments{$alignment_location}->{mismatch_info_2}\n";
-  #       print "Flag 1:  $alignments{$alignment_location}->{flag_1}\n";
-  #       print "Flag 2:  $alignments{$alignment_location}->{flag_2}\n";
-  #    }
-  #    print "\n******\n";
-  #  }
-
-  ### if there is only 1 entry in the %alignments hash we accept it as the best alignment
-  if (scalar keys %alignments == 1){
-    for my $unique_best_alignment (keys %alignments){
-      $methylation_call_params->{$identifier}->{bowtie_sequence_1} = $alignments{$unique_best_alignment}->{bowtie_sequence_1};
-      $methylation_call_params->{$identifier}->{bowtie_sequence_2} = $alignments{$unique_best_alignment}->{bowtie_sequence_2};
-      $methylation_call_params->{$identifier}->{chromosome}        = $alignments{$unique_best_alignment}->{chromosome};
-      $methylation_call_params->{$identifier}->{position_1}        = $alignments{$unique_best_alignment}->{position_1};
-      $methylation_call_params->{$identifier}->{position_2}        = $alignments{$unique_best_alignment}->{position_2};
-      $methylation_call_params->{$identifier}->{index}             = $alignments{$unique_best_alignment}->{index};
-      $methylation_call_params->{$identifier}->{alignment_score_1} = $alignments{$unique_best_alignment}->{alignment_score_1};
-      $methylation_call_params->{$identifier}->{alignment_score_2} = $alignments{$unique_best_alignment}->{alignment_score_2};
-      $methylation_call_params->{$identifier}->{sum_of_alignment_scores} = $alignments{$unique_best_alignment}->{sum_of_alignment_scores};
-      $methylation_call_params->{$identifier}->{sum_of_alignment_scores_second_best} = $alignments{$unique_best_alignment}->{sum_of_alignment_scores_second_best};
-      $methylation_call_params->{$identifier}->{mismatch_info_1}   = $alignments{$unique_best_alignment}->{mismatch_info_1};
-      $methylation_call_params->{$identifier}->{mismatch_info_2}   = $alignments{$unique_best_alignment}->{mismatch_info_2};
-      $methylation_call_params->{$identifier}->{CIGAR_1}           = $alignments{$unique_best_alignment}->{CIGAR_1};
-      $methylation_call_params->{$identifier}->{CIGAR_2}           = $alignments{$unique_best_alignment}->{CIGAR_2};
-      $methylation_call_params->{$identifier}->{flag_1}            = $alignments{$unique_best_alignment}->{flag_1};
-      $methylation_call_params->{$identifier}->{flag_2}            = $alignments{$unique_best_alignment}->{flag_2};
-    }
-  }
-
-  ### otherwise we are going to find out if there is a best match among the multiple alignments, or whether there are 2 or more equally good alignments (in which case
-  ### we boot the sequence pair altogether)
-  elsif (scalar keys %alignments >= 2  and scalar keys %alignments <= 4){
-    my $best_sum_of_alignment_scores;
-    my $best_alignment_location;
-    foreach my $alignment_location (sort {$alignments{$b}->{sum_of_alignment_scores} <=> $alignments{$a}->{sum_of_alignment_scores}} keys %alignments){
-	
-	# warn "$alignments{$alignment_location}->{sum_of_alignment_scores}\n"; sleep(1);
-	
-	unless (defined $best_sum_of_alignment_scores){
-	    $best_sum_of_alignment_scores = $alignments{$alignment_location}->{sum_of_alignment_scores};
-	    $best_alignment_location = $alignment_location;
-	    # print "setting best alignment score to: $best_sum_of_alignment_scores\n";
-	}
-	else{
-	    ### if the second best alignment has the same sum of alignment scores as the first one, the sequence pair will get booted
-	    if ($alignments{$alignment_location}->{sum_of_alignment_scores} == $best_sum_of_alignment_scores){
-		# warn "Same sum of alignment scores for 2 different alignments, the sequence pair will get booted!\n";
-		$sequence_pair_fails = 1;
-		last; # exiting since we know that the sequence has ambiguous alignments
-	    }
-	    ### else we are going to store the best alignment for further processing
-	    else{
-		$methylation_call_params->{$identifier}->{bowtie_sequence_1} = $alignments{$best_alignment_location}->{bowtie_sequence_1};
-		$methylation_call_params->{$identifier}->{bowtie_sequence_2} = $alignments{$best_alignment_location}->{bowtie_sequence_2};
-		$methylation_call_params->{$identifier}->{chromosome}        = $alignments{$best_alignment_location}->{chromosome};
-		$methylation_call_params->{$identifier}->{position_1}        = $alignments{$best_alignment_location}->{position_1};
-		$methylation_call_params->{$identifier}->{position_2}        = $alignments{$best_alignment_location}->{position_2};
-		$methylation_call_params->{$identifier}->{index}             = $alignments{$best_alignment_location}->{index};
-		$methylation_call_params->{$identifier}->{alignment_score_1} = $alignments{$best_alignment_location}->{alignment_score_1};
-		$methylation_call_params->{$identifier}->{alignment_score_2} = $alignments{$best_alignment_location}->{alignment_score_2};
-		$methylation_call_params->{$identifier}->{sum_of_alignment_scores} = $alignments{$best_alignment_location}->{sum_of_alignment_scores};
-		$methylation_call_params->{$identifier}->{mismatch_info_1}   = $alignments{$best_alignment_location}->{mismatch_info_1};
-		$methylation_call_params->{$identifier}->{mismatch_info_2}   = $alignments{$best_alignment_location}->{mismatch_info_2};
-		$methylation_call_params->{$identifier}->{CIGAR_1}           = $alignments{$best_alignment_location}->{CIGAR_1};
-		$methylation_call_params->{$identifier}->{CIGAR_2}           = $alignments{$best_alignment_location}->{CIGAR_2};
-		$methylation_call_params->{$identifier}->{flag_1}            = $alignments{$best_alignment_location}->{flag_1};
-		$methylation_call_params->{$identifier}->{flag_2}            = $alignments{$best_alignment_location}->{flag_2};
-
-		if (defined $alignments{$best_alignment_location}->{sum_of_alignment_scores_second_best} and ( $alignments{$best_alignment_location}->{sum_of_alignment_scores_second_best} > $alignments{$alignment_location}->{sum_of_alignment_scores} )) {
-		    $methylation_call_params->{$identifier}->{sum_of_alignment_scores_second_best} = $alignments{$best_alignment_location}->{sum_of_alignment_scores_second_best};
-		}
-		else {
-		    $methylation_call_params->{$identifier}->{sum_of_alignment_scores_second_best} = $alignments{$alignment_location}->{sum_of_alignment_scores};
-		}
-		
-		last; # exiting since the sequence produced a unique best alignment
-	    }
-	}
-    }
-  }
-  else{
-      die "There are too many potential hits for this sequence pair (1-4 expected, but found: '",scalar keys %alignments,"')\n";;
-  }
-
-  ### skipping the sequence completely if there were multiple alignments with the same best sum of alignment scores at different positions
-  if ($sequence_pair_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-
-    ### report that the sequence has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-    # my $ambiguous_read_1 = join("\t",$identifier.'/1','256','*','0','0','*','*','0','0',$sequence_1,$quality_value_1);
-    # my $ambiguous_read_2 = join("\t",$identifier.'/2','256','*','0','0','*','*','0','0',$sequence_2,$quality_value_2);
-    # warn "$ambiguous_read_1\n";
-    # warn "$ambiguous_read_2\n";
-
-    if ($ambiguous){
-      return 2; # => exits to next sequence pair, and prints it out (in FastQ format) to _ambiguous_reads_1.txt and _ambiguous_reads_2.txt if '--ambiguous' was specified
-      }
-    elsif ($unmapped){
-      return 1; # => exits to next sequence pair, and prints it out (in FastQ format) to _unmapped_reads_1.txt and _unmapped_reads_2.txt if '--unmapped' but not '--ambiguous' was specified
-    }
-    else{
-      return 0; # => exits to next sequence pair (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 1) or ($methylation_call_params->{$identifier}->{index} == 2) ){
-      #    warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence pair has not been rejected so far it does have a unique best alignment
-  $counting{unique_best_alignment_count}++;
-  extract_corresponding_genomic_sequence_paired_ends_bowtie2($identifier,$methylation_call_params);
-
-  ### check to see if the genomic sequences we extracted has the same length as the observed sequences +2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1}) != length($sequence_1)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position_1}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2}) != length($sequence_2)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position_2}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  ### Compute MAPQ value
-  $methylation_call_params->{$identifier}->{mapq} = calc_mapq (length($sequence_1), length($sequence_2),
-                                                                           $methylation_call_params->{$identifier}->{sum_of_alignment_scores},
-                                                                           $methylation_call_params->{$identifier}->{sum_of_alignment_scores_second_best});
-
-
-  ### now we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call_1} = methylation_call($identifier,$sequence_1,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1},$methylation_call_params->{$identifier}->{read_conversion_1});
-  $methylation_call_params->{$identifier}->{methylation_call_2} = methylation_call($identifier,$sequence_2,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2},$methylation_call_params->{$identifier}->{read_conversion_2});
-  # warn "$methylation_call_params->{$identifier}->{read_conversion_2}\n";
-  # warn "  $sequence_2\n";
-  # warn "$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2}\n";
-  # warn "  $methylation_call_params->{$identifier}->{methylation_call_2}\n";
-
-  print_bisulfite_mapping_results_paired_ends_bowtie2($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2);
-  return 0; ## otherwise 1 will be returned by default, which would print the sequence pair to unmapped_1 and _2
-}
-
-###
-
-# Compute MAPQ value for a read or read pair as in Bowtie2-2.2.2 (specifically, V2 of the MAPQ calculator: "class BowtieMapq2")
-# assuming end-to-end alignment with the default calculation of the minimum alignment score
-
-sub calc_mapq {
-  my ($read1Len, $read2Len, $AS_best, $AS_secBest) = @_;
-
-  my $scMin = $score_min_intercept + $score_min_slope * $read1Len;
-  ### read2Len is only defined for paired-end reads, so for single-end mode we can just a score min value for read 1
-  if (defined $read2Len){
-    $scMin   += $score_min_intercept + $score_min_slope * $read2Len;
-  }
-
-  my $diff = abs$scMin; # scores can vary by up to this much (since max AS is 0 for end-to-end alignment)
-  my $bestOver = $AS_best - $scMin;
-
-  if (!defined $AS_secBest) {
-    if    ($bestOver >= $diff * 0.8) { return 42; }
-    elsif ($bestOver >= $diff * 0.7) { return 40; }
-    elsif ($bestOver >= $diff * 0.6) { return 24; }
-    elsif ($bestOver >= $diff * 0.5) { return 23; }
-    elsif ($bestOver >= $diff * 0.4) { return  8; }
-    elsif ($bestOver >= $diff * 0.3) { return  3; }
-    else                             { return  0; }
-  } else {
-    my $bestDiff = abs(abs($AS_best) - abs($AS_secBest));
-    if ($bestDiff >= $diff * 0.9) {
-      if ($bestOver == $diff) {
-	return 39;
-      } else {
-	return 33;
-      }
-    } elsif ($bestDiff >= $diff * 0.8) {
-      if ($bestOver == $diff) {
-	return 38;
-      } else {
-	return 27;
-      }
-    } elsif ($bestDiff >= $diff * 0.7) {
-      if ($bestOver == $diff) {
-	return 37;
-      } else {
-	return 26;
-      }
-    } elsif ($bestDiff >= $diff * 0.6) {
-      if ($bestOver == $diff) {
-	return 36;
-      } else {
-	return 22;
-      }
-    } elsif ($bestDiff >= $diff * 0.5) {
-      if ($bestOver == $diff) {
-	return 35;
-      } elsif ($bestOver >= $diff * 0.84) {
-	return 25;
-      } elsif ($bestOver >= $diff * 0.68) {
-	return 16;
-      } else {
-	return 5;
-      }
-    } elsif ($bestDiff >= $diff * 0.4) {
-      if ($bestOver == $diff) {
-	return 34;
-      } elsif ($bestOver >= $diff * 0.84) {
-	return 21;
-      } elsif ($bestOver >= $diff * 0.68) {
-	return 14;
-      } else {
-	return 4;
-      }
-    } elsif ($bestDiff >= $diff * 0.3) {
-      if ($bestOver == $diff) {
-	return 32;
-      } elsif ($bestOver >= $diff * 0.88) {
-	return 18;
-      } elsif ($bestOver >= $diff * 0.67) {
-	return 15;
-      } else {
-	return 3;
-      }
-    } elsif ($bestDiff >= $diff * 0.2) {
-      if ($bestOver == $diff) {
-	return 31;
-      } elsif ($bestOver >= $diff * 0.88) {
-	return 17;
-      } elsif ($bestOver >= $diff * 0.67) {
-	return 11;
-      } else {
-	return 0;
-      }
-    } elsif ($bestDiff >= $diff * 0.1) {
-      if ($bestOver == $diff) {
-	return 30;
-      } elsif ($bestOver >= $diff * 0.88) {
-	return 12;
-      } elsif ($bestOver >= $diff * 0.67) {
-	return 7;
-      } else {
-	return 0;
-      }
-    } elsif ($bestDiff > 0) {
-      if ($bestOver >= $diff * 0.67) {
-	return 6;
-      } else {
-	return 2;
-      }
-    } else {
-      if ($bestOver >= $diff * 0.67) {
-	return 1;
-      } else {
-	return 0;
-      }
-    }
-  }
-}
-
-
-###
-
-sub decide_whether_paired_end_alignment_is_valid{
-  my ($index,$identifier) = @_;
-  my ($id_1,$strand_1,$mapped_chromosome_1,$position_1,$bowtie_sequence_1,$mismatch_info_1) = (split (/\t/,$fhs[$index]->{last_line_1},-1))[0,1,2,3,4,7];
-  my ($id_2,$strand_2,$mapped_chromosome_2,$position_2,$bowtie_sequence_2,$mismatch_info_2) = (split (/\t/,$fhs[$index]->{last_line_2},-1))[0,1,2,3,4,7];
-  chomp $mismatch_info_1;
-  chomp $mismatch_info_2;
-  my $seq_id_1 = $id_1;
-  my $seq_id_2 = $id_2;
-  $seq_id_1 =~ s/\/1$//; # removing the read /1
-  $seq_id_2 =~ s/\/1$//; # removing the read /1
-
-  ### ensuring that the current entry is the correct sequence
-  if ($seq_id_1 eq $identifier or $seq_id_2 eq $identifier){
-    ### checking the orientation of the alignment. We need to discriminate between 8 different conditions, however only 4 of them are theoretically
-    ### sensible alignments
-    my $orientation = ensure_sensical_alignment_orientation_paired_ends ($index,$id_1,$strand_1,$id_2,$strand_2);
-    ### If the orientation was correct can we move on
-    if ($orientation == 1){
-      return 1; ### 1st possibility for A SEQUENCE-PAIR TO PASS
-    }
-    ### If the alignment was in the wrong orientation we need to read in two new lines
-    elsif($orientation == 0){
-      my $newline_1 = $fhs[$index]->{fh}->getline();
-      my $newline_2 = $fhs[$index]->{fh}->getline();
-      if ($newline_1 and $newline_2){
-	### extract detailed information about the alignment again (from $newline_1 and $newline_2 this time)
-	($id_1,$strand_1) = (split (/\t/,$newline_1))[0,1];
-	($id_2,$strand_2) = (split (/\t/,$newline_2))[0,1];
-
-	my $seqid;
-	$seq_id_1 = $id_1;
-	$seq_id_2 = $id_2;
-	# we need to capture the first read (ending on /1)
-	if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-	  $seqid = $seq_id_1;
-	}
-	elsif ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-	  $seqid = $seq_id_2;
-	}
-	else{
-	  die "One of the two reads needs to end on /1!!";
-	}
-	
-	### ensuring that the next entry is still the correct sequence
-	if ($seq_id_1 eq $identifier or  $seq_id_2 eq $identifier){
-	  ### checking orientation again
-	  $orientation = ensure_sensical_alignment_orientation_paired_ends ($index,$id_1,$strand_1,$id_2,$strand_2);
-	  ### If the orientation was correct can we move on
-	  if ($orientation == 1){
-	    ### Writing the current sequence to last_line_1 and last_line_2
-	    $fhs[$index]->{last_seq_id} = $seqid;
-	    $fhs[$index]->{last_line_1} = $newline_1;
-	    $fhs[$index]->{last_line_2} = $newline_2;
-	    return 1; ### 2nd possibility for a SEQUENCE-PAIR TO PASS
-	  }
-	  ### If the alignment was in the wrong orientation again we need to read in yet another 2 new lines and store them in @fhs (this must be
-	  ### the next entry)
-	  elsif ($orientation == 0){
-	    $newline_1 = $fhs[$index]->{fh}->getline();
-	    $newline_2 = $fhs[$index]->{fh}->getline();
-	    if ($newline_1 and $newline_2){
-	      ($seq_id_1) = split (/\t/,$newline_1);
-	      ($seq_id_2) = split (/\t/,$newline_2);
-	
-	      $seqid = '';
-	      if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-		$seqid = $seq_id_1;
-	      }
-	      elsif ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-		$seqid = $seq_id_2;
-	      }
-	      else{
-		die "One of the two reads needs to end on /1!!";
-	      }
-	
-	      ### check if the next 2 lines still have the same seq ID (must not happen), and if not overwrite the current seq-ID and bowtie output with
-	      ### the same fields of the just read next entry
-	      die "Same seq ID 3 or more times in a row!(should be 2 max)" if ($seqid eq $identifier);
-	      $fhs[$index]->{last_seq_id} = $seqid;
-	      $fhs[$index]->{last_line_1} = $newline_1;
-	      $fhs[$index]->{last_line_2} = $newline_2;
-	      return 0; # not processing anything this round as the alignment currently stored in last_line_1 and _2 was in the wrong orientation
-	    }
-	    else {
-	      ### assigning undef to last_seq_id and last_line (end of bowtie output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line_1} = undef;
-	      $fhs[$index]->{last_line_2} = undef;
-	      return 0; # not processing anything as the alignment currently stored in last_line_1 and _2 was in the wrong orientation
-	    }
-	  }
-	  else{
-	    die "The orientation of the alignment must be either correct or incorrect\n";
-	  }
-	}
-	### the sequence pair we just read in is already the next sequence pair to be analysed -> store it in @fhs
-	else{
-	  $fhs[$index]->{last_seq_id} = $seqid;
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-	  return 0; # processing the new alignment result only in the next round
-	}
-      }
-      else {
-	# assigning undef to last_seq_id and both last_lines (end of bowtie output)
-	$fhs[$index]->{last_seq_id} = undef;
-	$fhs[$index]->{last_line_1} = undef;
-	$fhs[$index]->{last_line_2} = undef;
-	return 0; # not processing anything as the alignment currently stored in last_line_1 and _2 was in the wrong orientation
-      }
-    }
-    else{
-      die "The orientation of the alignment must be either correct or incorrect\n";
-    }
-  }
-  ### the sequence pair stored in @fhs as last_line_1 and last_line_2 is already the next sequence pair to be analysed -> analyse next round
-  else{
-    return 0;
-  }
-}
-
-### EXTRACT GENOMIC SEQUENCE | BOWTIE 1 | PAIRED-END
-
-sub extract_corresponding_genomic_sequence_paired_ends {
-  my ($sequence_identifier,$methylation_call_params) = @_;
-  ### A bisulfite sequence pair for 1 location in the genome can theoretically be on any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-  my $alignment_read_1;
-  my $alignment_read_2;
-  my $read_conversion_info_1;
-  my $read_conversion_info_2;
-  my $genome_conversion;
-
-  ### Now extracting the same sequence from the mouse genomic sequence, +2 extra bases at oone of the ends so that we can also make a CpG, CHG or CHH methylation call
-  ### if the C happens to be at the first or last position of the actually observed sequence
-  my $non_bisulfite_sequence_1;
-  my $non_bisulfite_sequence_2;
-
-  ### all alignments reported by bowtie have the + alignment first and the - alignment as the second one irrespective of whether read 1 or read 2 was
-  ### the + alignment. We however always read in sequences read 1 then read 2, so if read 2 is the + alignment we need to swap the extracted genomic
-  ### sequences around!
-  ### results from CT converted read 1 plus GA converted read 2 vs. CT converted genome (+/- orientation alignments are reported only)
-  if ($methylation_call_params->{$sequence_identifier}->{index} == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_GA_CT_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'CT';
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is read 1)
-    ### for hits on the forward strand we need to capture 2 extra bases at the 3' end
-
-    $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{start_seq_1},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ##CHH change
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is read 2)
-    ### As the second conversion is GA we need to capture 1 base 3', so that it is a 5' base after reverse complementation
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{start_seq_2}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+1){ ## CHH change to +1
-
-      $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2}),length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2);
-      ### the reverse strand sequence needs to be reverse complemented
-      $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-    }
-    else{
-       $non_bisulfite_sequence_2 = '';
-     }
-   }
-
-   ### results from GA converted read 1 plus CT converted read 2 vs. GA converted genome (+/- orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 1){
-    ### [Index 1, sequence originated from complementary to (converted) reverse strand]
-    $counting{GA_CT_GA_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'GA';
-
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is read 1)
-    ### as we need to make the methylation call for the base 5' of the first base (GA conversion!) we need to capture 2 extra bases at the 5' end
-    if ($methylation_call_params->{$sequence_identifier}->{start_seq_1}-1 > 0){ ## CHH change to -1
-      $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{start_seq_1}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ### CHH change to -2/+2
-    }
-    else{
-      $non_bisulfite_sequence_1 = '';
-    }
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is read 2)
-    ### As we are doing a CT comparison for the reverse strand we are taking 2 bases extra at the 5' end, so it is a 3' base after reverse complementation
-    $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2})-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2); ### CHH change to -2/+2
-    ### the reverse strand sequence needs to be reverse complemented
-    $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-  }
-
-  ### results from GA converted read 1 plus CT converted read 2 vs. CT converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 2){
-    ### [Index 2, sequence originated from the complementary to (converted) forward strand]
-    $counting{GA_CT_CT_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'CT';
-
-    ### Here we switch the sequence information round!!  non_bisulfite_sequence_1 will later correspond to the read 1!!!!
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is READ 2), read 1 is in - orientation on the reverse strand
-    ### As read 1 is GA converted we need to capture 2 extra 3' bases which will be 2 extra 5' base after reverse complementation
-    $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2}),length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2); ### CHH change to +2
-    ### the reverse strand sequence needs to be reverse complemented
-    $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is READ 1)
-    ### non_bisulfite_sequence_2 will later correspond to the read 2!!!!
-    ### Read 2 is CT converted so we need to capture 2 extra 3' bases
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > ($methylation_call_params->{$sequence_identifier}->{start_seq_1})+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+1){ ## CHH change to +1
-      $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_1}),length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ## CHH changed from +1 to +2
-    }
-    else{
-      $non_bisulfite_sequence_2 = '';
-    }
-  }
-
-  ### results from CT converted read 1 plus GA converted read 2 vs. GA converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 3){
-    ### [Index 3, sequence originated from the (converted) reverse strand]
-    $counting{CT_GA_GA_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'GA';
-
-    ### Here we switch the sequence information round!!  non_bisulfite_sequence_1 will later correspond to the read 1!!!!
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is READ 2), read 1 is in - orientation on the reverse strand
-    ### As read 1 is CT converted we need to capture 2 extra 5' bases which will be 2 extra 3' base after reverse complementation
-    if ( ($methylation_call_params->{$sequence_identifier}->{start_seq_2}-1) > 0){ ## CHH changed to -1
-      $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2})-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2); ### CHH changed to -2/+2
-      ### the reverse strand sequence needs to be reverse complemented
-      $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-    }
-    else{
-      $non_bisulfite_sequence_1 = '';
-    }
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is READ 1)
-    ### non_bisulfite_sequence_2 will later correspond to the read 2!!!!
-    ### Read 2 is GA converted so we need to capture 2 extra 5' bases
-    $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_1})-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ### CHH changed to -2/+2
-  }
-  else{
-    die "Too many bowtie result filehandles\n";
-  }
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_1} = $alignment_read_1;
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_2} = $alignment_read_2;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_1} = $read_conversion_info_1;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_2} = $read_conversion_info_2;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-}
-
-### EXTRACT GENOMIC SEQUENCE BOWTIE 2 | PAIRED-END
-
-sub extract_corresponding_genomic_sequence_paired_ends_bowtie2{
-  my ($sequence_identifier,$methylation_call_params) = @_;
-  ### A bisulfite sequence pair for 1 location in the genome can theoretically be on any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-
-  my $cigar_1 = $methylation_call_params->{$sequence_identifier}->{CIGAR_1};
-  my $cigar_2 = $methylation_call_params->{$sequence_identifier}->{CIGAR_2};
-  my $flag_1 =  $methylation_call_params->{$sequence_identifier}->{flag_1};
-  my $flag_2 =  $methylation_call_params->{$sequence_identifier}->{flag_2};
-
-  my $contains_deletion_1 = 0;
-  my $contains_deletion_2 = 0;
-  if ($cigar_1 =~ /D/){
-    $contains_deletion_1 = 1;
-    if ($verbose){ warn "$cigar_1\n$methylation_call_params->{$sequence_identifier}->{mismatch_info_1}\n";}
-  }
-  if ($cigar_2 =~ /D/){
-    $contains_deletion_2 = 1;
-    if ($verbose){ warn "$cigar_2\n$methylation_call_params->{$sequence_identifier}->{mismatch_info_2}\n";}
-  }
-
-  # warn "$cigar_1\t$cigar_2\t$flag_1\t$flag_2\n";
-  ### We are now extracting the corresponding genomic sequence, +2 extra bases at the end (or start) so that we can also make a CpG methylation call and
-  ### in addition make differential calls for Cs in CHG or CHH context if the C happens to be at the last (or first)  position of the actually observed sequence
-
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-  my $alignment_read_1;
-  my $alignment_read_2;
-  my $read_conversion_info_1;
-  my $read_conversion_info_2;
-  my $genome_conversion;
-
-  ### Now extracting the same sequence from the mouse genomic sequence, +2 extra bases at one of the ends so that we can also make a CpG, CHG or CHH methylation call
-  ### if the C happens to be at the last position of the actually observed sequence
-  my $non_bisulfite_sequence_1 = '';
-  my $non_bisulfite_sequence_2 = '';
-  my $genomic_seq_for_MD_tag_1 = ''; # this sequence contains potential deletions in the genome as well so that we can generate a proper MD tag for the SAM output
-  my $genomic_seq_for_MD_tag_2 = '';
-
-  ### Positions in SAM format are 1 based, so we need to subract 1 when getting substrings
-  my $pos_1 = $methylation_call_params->{$sequence_identifier}->{position_1}-1;
-  my $pos_2 = $methylation_call_params->{$sequence_identifier}->{position_2}-1;
-
-  # parsing CIGAR 1 string
-  my @len_1 = split (/\D+/,$cigar_1); # storing the length per operation
-  my @ops_1 = split (/\d+/,$cigar_1); # storing the operation
-  shift @ops_1; # remove the empty first element
-  die "CIGAR 1 string contained a non-matching number of lengths and operations\n" unless (scalar @len_1 == scalar @ops_1);
-  # parsing CIGAR 2 string
-  my @len_2 = split (/\D+/,$cigar_2); # storing the length per operation
-  my @ops_2 = split (/\d+/,$cigar_2); # storing the operation
-  shift @ops_2; # remove the empty first element
-  die "CIGAR 2 string contained a non-matching number of lengths and operations\n" unless (scalar @len_2 == scalar @ops_2);
-
-  my $indels_1 = 0; # adding these to the hemming distance value (needed for the NM field in the final SAM output
-  my $indels_2 = 0;
-
-  ### Extracting read 1 genomic sequence ###
-
-  # extracting 2 additional bp at the 5' end (read 1)
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 1) or ($methylation_call_params->{$sequence_identifier}->{index} == 3) ){
-    # checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless ( ($pos_1-2) > 0){# exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag_1} = $genomic_seq_for_MD_tag_1;
-      return;
-    }
-    $non_bisulfite_sequence_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1-2,2);
-  }
-
-  foreach (0..$#len_1){
-    if ($ops_1[$_] eq 'M'){
-      # extracting genomic sequence
-      $non_bisulfite_sequence_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1,$len_1[$_]);
-      if ($contains_deletion_1){
-	$genomic_seq_for_MD_tag_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1,$len_1[$_]);
-      }
-      #   warn "$non_bisulfite_sequence_1\n";
-      # adjusting position
-      $pos_1 += $len_1[$_];
-    }
-    elsif ($ops_1[$_] eq 'I'){ # insertion in the read sequence
-      # we simply add padding Xs instead of finding genomic sequence. This will not be used to infer methylation calls, and we can later ignore it for the generation of the MD;Z: tag
-      $non_bisulfite_sequence_1 .= 'X' x $len_1[$_];
-      if ($contains_deletion_1){
-	$genomic_seq_for_MD_tag_1 .= 'X' x $len_1[$_];
-      }
-      # warn "$non_bisulfite_sequence_1\n";
-      # position doesn't need adjusting
-
-      ### 03 06 2014: In fact we don't need to add anything to the hemming distance for insertions since we use padding Xs which will fail a base by base comparison in hemming_dist()
-      # indels_1 += $len_1[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif ($ops_1[$_] eq 'D'){ # deletion in the read sequence
-      # we do not add any genomic sequence but only adjust the position
-      # we do however need to add the genomic sequence to $genomic_seq_for_MD-tag so we can create a proper MD tag later
-      if ($contains_deletion_1){
-	$genomic_seq_for_MD_tag_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1,$len_1[$_]);
-      }
-      #     warn "Just adjusting the position by: ",$len_1[$_],"bp\n";
-      $pos_1 += $len_1[$_];
-      $indels_1 += $len_1[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif($cigar_1 =~ tr/[NSHPX=]//){ # if these (for standard mapping) illegal characters exist we die
-      die "The CIGAR 1 string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-    }
-    else{
-      die "The CIGAR 1 string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-    }
-  }
-
-  ### 3' end of read 1
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 0) or ($methylation_call_params->{$sequence_identifier}->{index} == 2) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) >= $pos_1+2){# exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      return;
-    }
-
-    $non_bisulfite_sequence_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1,2);
-  }
-
-
-  ### Extracting read 2 genomic sequence ###
-
-  ### 5' end of read 2
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 1) or ($methylation_call_params->{$sequence_identifier}->{index} == 3) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless ( ($pos_2-2) >= 0){# exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-      $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag_2} = $genomic_seq_for_MD_tag_2;
-      return;
-    }
-    $non_bisulfite_sequence_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2-2,2);
-  }
-
-  foreach (0..$#len_2){
-    if ($ops_2[$_] eq 'M'){
-      # extracting genomic sequence
-      $non_bisulfite_sequence_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2,$len_2[$_]);
-      if ($contains_deletion_2){
-	$genomic_seq_for_MD_tag_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2,$len_2[$_]);
-      }
-      # warn "$non_bisulfite_sequence_2\n";
-      # adjusting position
-      $pos_2 += $len_2[$_];
-    }
-    elsif ($ops_2[$_] eq 'I'){ # insertion in the read sequence
-      # we simply add padding Xs instead of finding genomic sequence. This will not be used to infer methylation calls and we can ignore this later during the generation of the MD:Z: tag
-      $non_bisulfite_sequence_2 .= 'X' x $len_2[$_];
-      if ($contains_deletion_2){
-	$genomic_seq_for_MD_tag_2 .= 'X' x $len_2[$_];
-      }
-      # warn "$non_bisulfite_sequence_2\n";
-      # position doesn't need adjusting
-
-      ### 03 06 2014: In fact we don't need to add anything to the hemming distance for insertions since we use padding Xs which will fail a base by base comparison in hemming_dist()
-      # $indels_2 += $len_2[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif ($ops_2[$_] eq 'D'){ # deletion in the read sequence
-      # we do not add any genomic sequence but only adjust the position
-      # we do however need to add the genomic sequence to $genomic_seq_for_MD-tag so we can create a proper MD tag later
-      if ($contains_deletion_2){
-	$genomic_seq_for_MD_tag_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2,$len_2[$_]);
-      }
-      # warn "Just adjusting the position by: ",$len_2[$_],"bp\n";
-      $pos_2 += $len_2[$_];
-      $indels_2 += $len_2[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif($cigar_2 =~ tr/[NSHPX=]//){ # if these (for standard mapping) illegal characters exist we die
-      die "The CIGAR 2 string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-    }
-    else{
-      die "The CIGAR 2 string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-    }
-  }
-
-  ### 3' end of read 2
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 0) or ($methylation_call_params->{$sequence_identifier}->{index} == 2) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) >= $pos_2+2){# exiting with en empty genomic sequence otherwise
-      # need to set read 1 as well now to prevent warning
-      #  warn "'$non_bisulfite_sequence_1'\n'$non_bisulfite_sequence_2'\n\n";
-      #  sleep(5);
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-      return;
-    }
-    $non_bisulfite_sequence_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2,2);
-  }
-
-  ### all paired-end alignments reported by Bowtie 2 have the Read 1 alignment first and the Read 2 alignment as the second one irrespective of whether read 1 or read 2 was
-  ### the + alignment. We also read in sequences read 1 then read 2 so they should correspond perfectly
-
-  ### results from CT converted read 1 plus GA converted read 2 vs. CT converted genome (+/- orientation alignments are reported only)
-  if ($methylation_call_params->{$sequence_identifier}->{index} == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_GA_CT_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'CT';
-    ### Read 1 is always the forward hit
-    ### Read 2 is will always on the reverse strand, so it needs to be reverse complemented
-    $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-    if ($contains_deletion_2){
-      $genomic_seq_for_MD_tag_2 = reverse_complement($genomic_seq_for_MD_tag_2);
-    }
-  }
-
-  ### results from GA converted read 1 plus CT converted read 2 vs. GA converted genome (+/- orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 1){
-    ### [Index 1, sequence originated from complementary to (converted) bottom strand]
-    $counting{GA_CT_GA_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'GA';
-    ### Read 1 is always the forward hit
-    ### Read 2 is will always on the reverse strand, so it needs to be reverse complemented
-    $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-    if ($contains_deletion_2){
-      $genomic_seq_for_MD_tag_2 = reverse_complement($genomic_seq_for_MD_tag_2);
-    }
-  }
-
-  ### results from GA converted read 1 plus CT converted read 2 vs. CT converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 2){
-    ### [Index 2, sequence originated from the complementary to (converted) top strand]
-    $counting{GA_CT_CT_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'CT';
-
-    ### Read 1 (the reverse strand) genomic sequence needs to be reverse complemented
-    $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-    if ($contains_deletion_1){
-      $genomic_seq_for_MD_tag_1 = reverse_complement($genomic_seq_for_MD_tag_1);
-    }
-  }
-
-  ### results from CT converted read 1 plus GA converted read 2 vs. GA converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 3){
-    ### [Index 3, sequence originated from the (converted) reverse strand]
-    $counting{CT_GA_GA_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'GA';
-    ### Read 1 (the reverse strand) genomic sequence needs to be reverse complemented
-    $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-    if ($contains_deletion_1){
-      $genomic_seq_for_MD_tag_1 = reverse_complement($genomic_seq_for_MD_tag_1);
-    }
-  }
-  else{
-    die "Too many bowtie result filehandles\n";
-  }
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_1} = $alignment_read_1;
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_2} = $alignment_read_2;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_1} = $read_conversion_info_1;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_2} = $read_conversion_info_2;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-  $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag_1} = $genomic_seq_for_MD_tag_1;
-  $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag_2} = $genomic_seq_for_MD_tag_2;
-  
-  ## the end position of a read is stored in $pos
-  $methylation_call_params->{$sequence_identifier}->{end_position_1} = $pos_1;
-  $methylation_call_params->{$sequence_identifier}->{end_position_2} = $pos_2;
-  $methylation_call_params->{$sequence_identifier}->{indels_1} = $indels_1;
-  $methylation_call_params->{$sequence_identifier}->{indels_2} = $indels_2;
-}
-
-##########################################
-### PRINT SINGLE END RESULTS: Bowtie 1 ###
-##########################################
-
-sub print_bisulfite_mapping_result_single_end{
-  my ($identifier,$sequence,$methylation_call_params,$quality_value)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value = convert_phred64_quals_to_phred33($quality_value);
-  }
-  elsif ($solexa){
-    $quality_value = convert_solexa_quals_to_phred33($quality_value);
-  }
-
-  ### We will add +1 bp to the starting position of single-end reads, as Bowtie 1 reports the index and not the bp position. 
-  $methylation_call_params->{$identifier}->{position} += 1;
-	
-  ### writing every uniquely mapped read and its methylation call to the output file
-  if ($vanilla){
-    my $bowtie1_output = join("\t",$identifier,$methylation_call_params->{$identifier}->{alignment_strand},$methylation_call_params->{$identifier}->{chromosome},$methylation_call_params->{$identifier}->{position},$methylation_call_params->{$identifier}->{end_position},$sequence,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence},$methylation_call_params->{$identifier}->{methylation_call},$methylation_call_params->{$identifier}->{read_conversion},$methylation_call_params->{$identifier}->{genome_conversion},$quality_value);
-    print OUT "$bowtie1_output\n";
-  }
-  else{ # SAM output, default since Bismark v1.0.0
-    single_end_SAM_output($identifier,$sequence,$methylation_call_params,$quality_value); # at the end of the script
-  }
-}
-
-##########################################
-### PRINT SINGLE END RESULTS: Bowtie 2 ###
-##########################################
-
-sub print_bisulfite_mapping_result_single_end_bowtie2{
-  my ($identifier,$sequence,$methylation_call_params,$quality_value)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value = convert_phred64_quals_to_phred33($quality_value);
-  }
-  elsif ($solexa){
-    $quality_value = convert_solexa_quals_to_phred33($quality_value);
-  }
-
-  ### writing every mapped read and its methylation call to the SAM output file (unmapped and ambiguous reads were already printed)
-	single_end_SAM_output($identifier,$sequence,$methylation_call_params,$quality_value); # at the end of the script
-}
-
-##########################################
-### PRINT PAIRED END ESULTS: Bowtie 1  ###
-##########################################
-
-sub print_bisulfite_mapping_results_paired_ends{
-  my ($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value_1 = convert_phred64_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_phred64_quals_to_phred33($quality_value_2);
-  }
-  elsif ($solexa){
-    $quality_value_1 = convert_solexa_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_solexa_quals_to_phred33($quality_value_2);
-  }
-
-  ### We will add +1 bp to the start position of paired-end reads, as Bowtie 1 reports the index and not the bp position. (End position is already 1-based)
-  $methylation_call_params->{$identifier}->{start_seq_1} += 1;
-
-  ### writing every single aligned read and its methylation call to the output file
-  if ($vanilla){	
-    my $bowtie1_output_paired_end = join("\t",$identifier,$methylation_call_params->{$identifier}->{alignment_read_1},$methylation_call_params->{$identifier}->{chromosome},$methylation_call_params->{$identifier}->{start_seq_1},$methylation_call_params->{$identifier}->{alignment_end},$sequence_1,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1},$methylation_call_params->{$identifier}->{methylation_call_1},$sequence_2,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2},$methylation_call_params->{$identifier}->{methylation_call_2},$methylation_call_params->{$identifier}->{read_conversion_1},$methylation_call_params->{$identifier}->{genome_conversion},$quality_value_1,$quality_value_2);
-    print OUT "$bowtie1_output_paired_end\n";
-  }
-  else{ # SAM output, default since Bismark v1.0.0
-    paired_end_SAM_output($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2); # at the end of the script
-  }
-
-}
-
-##########################################
-### PRINT PAIRED END ESULTS: Bowtie 2  ###
-##########################################
-
-sub print_bisulfite_mapping_results_paired_ends_bowtie2{
-  my ($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value_1 = convert_phred64_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_phred64_quals_to_phred33($quality_value_2);
-  }
-  elsif ($solexa){
-    $quality_value_1 = convert_solexa_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_solexa_quals_to_phred33($quality_value_2);
-  }
-
-  ### writing every single aligned read and its methylation call to the output file  (unmapped and ambiguous reads were already printed)
-  paired_end_SAM_output($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2); # at the end of the script
-
-}
-	
-	
-sub convert_phred64_quals_to_phred33{
-
-  my $qual = shift;
-  my @quals = split (//,$qual);
-  my @new_quals;
-
-  foreach my $index (0..$#quals){
-    my $phred_score = convert_phred64_quality_string_into_phred_score ($quals[$index]);
-    my $phred33_quality_string = convert_phred_score_into_phred33_quality_string ($phred_score);
-    $new_quals[$index] = $phred33_quality_string;
-  }
-
-  my $phred33_quality = join ("",@new_quals);
-  return $phred33_quality;
-}
-
-sub convert_solexa_quals_to_phred33{
-
-  my $qual = shift;
-  my @quals = split (//,$qual);
-  my @new_quals;
-
-  foreach my $index (0..$#quals){
-    my $phred_score = convert_solexa_pre1_3_quality_string_into_phred_score ($quals[$index]);
-    my $phred33_quality_string = convert_phred_score_into_phred33_quality_string ($phred_score);
-    $new_quals[$index] = $phred33_quality_string;
-  }
-
-  my $phred33_quality = join ("",@new_quals);
-  return $phred33_quality;
-}
-
-sub convert_phred_score_into_phred33_quality_string{
-  my $qual = shift;
-  $qual = chr($qual+33);
-  return $qual;
-}
-
-sub convert_phred64_quality_string_into_phred_score{
-  my $string = shift;
-  my $qual = ord($string)-64;
-  return $qual;
-}
-
-sub convert_solexa_pre1_3_quality_string_into_phred_score{
-  ### We will just use 59 as the offset here as all Phred Scores between 10 and 40 look exactly the same, there is only a minute difference for values between 0 and 10
-  my $string = shift;
-  my $qual = ord($string)-59;
-  return $qual;
-}
-
-
-sub extract_corresponding_genomic_sequence_single_end {
-  my ($sequence_identifier,$methylation_call_params) = @_;
-  ### A bisulfite sequence for 1 location in the genome can theoretically be any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-  my $alignment_strand;
-  my $read_conversion_info;
-  my $genome_conversion;
-  ### Also extracting the corresponding genomic sequence, +2 extra bases at the end so that we can also make a CpG methylation call and
-  ### in addition make differential calls for Cs non-CpG context, which will now be divided into CHG and CHH methylation,
-  ### if the C happens to be at the last position of the actually observed sequence
-  my $non_bisulfite_sequence;
-  ### depending on the conversion we want to make need to capture 1 extra base at the 3' end
-
-  my $pbat_index_modifier = 0;
-
-  if ($pbat){
-    $pbat_index_modifier += 2; # (we are simply not running indexes 0 or 1!
-  }
-
-  ### results from CT converted read vs. CT converted genome (+ orientation alignments are reported only)
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_CT_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'CT';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+1){ ## CHH changed to +1
-      ### + 2 extra base at the 3' end
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to +2
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from CT converted reads vs. GA converted genome (- orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 1){
-    ### [Index 1, sequence originated from (converted) reverse strand]
-    $counting{CT_GA_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'GA';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if ($methylation_call_params->{$sequence_identifier}->{position}-2 >= 0){ ## CHH changed to -2 # 02 02 2012 Changed this to >= from >
-      ### Extracting 2 extra 5' bases on forward strand which will become 2 extra 3' bases after reverse complementation
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to -2/+2
-      ## reverse complement!
-      $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from GA converted reads vs. CT converted genome (- orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 2){
-    ### [Index 2, sequence originated from complementary to (converted) forward strand]
-    $counting{GA_CT_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'CT';
-
-    ### +2 extra bases on the forward strand 3', which will become 2 extra 5' bases after reverse complementation
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+1){ ## changed to +1 on 02 02 2012
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to +2
-      ## reverse complement!
-      $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from GA converted reads vs. GA converted genome (+ orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 3){
-    ### [Index 3, sequence originated from complementary to (converted) reverse strand]
-    $counting{GA_GA_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'GA';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if ($methylation_call_params->{$sequence_identifier}->{position}-2 >= 0){ ## CHH changed to +2 # 02 02 2012 Changed this to >= from >
-      ### +2 extra base at the 5' end as we are nominally checking the converted reverse strand
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to -2/+2
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-  else{
-    die "Too many bowtie result filehandles\n";
-  }
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_strand} = $alignment_strand;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion} = $read_conversion_info;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-
-  ### at this point we can also determine the end position of a read
-  $methylation_call_params->{$sequence_identifier}->{end_position} = $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence});
-}
-
-
-sub extract_corresponding_genomic_sequence_single_end_bowtie2{
-  my ($sequence_identifier,$methylation_call_params) = @_;
-
-  my $MD_tag = $methylation_call_params->{$sequence_identifier}->{MD_tag};
-  my $cigar  = $methylation_call_params->{$sequence_identifier}->{CIGAR};
-
-  my $contains_deletion = 0;
-  if ($cigar =~ /D/){
-    $contains_deletion = 1;
-    # warn "$cigar\n$MD_tag\n";
-  }
-  ### A bisulfite sequence for 1 location in the genome can theoretically be any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-  my $alignment_strand;
-  my $read_conversion_info;
-  my $genome_conversion;
-
-  ### We are now extracting the corresponding genomic sequence, +2 extra bases at the end (or start) so that we can also make a CpG methylation call and
-  ### in addition make differential calls for Cs in CHG or CHH context if the C happens to be at the last (or first)  position of the actually observed sequence
-  my $non_bisulfite_sequence = '';
-  my $genomic_seq_for_MD_tag = ''; # this sequence contains potential deletions in the genome as well so that we can generate a proper MD tag for the SAM output
-
-  ### Positions in SAM format are 1 based, so we need to subract 1 when getting substrings
-  my $pos = $methylation_call_params->{$sequence_identifier}->{position}-1;
-
-  # parsing CIGAR string
-  my @len = split (/\D+/,$cigar); # storing the length per operation
-  my @ops = split (/\d+/,$cigar); # storing the operation
-  shift @ops; # remove the empty first element
-  die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-  my $pbat_index_modifier = 0;
-
-  if ($pbat){
-    $pbat_index_modifier += 2; # (we are simply not running indexes 0 or 1!
-  }
-
-  ### If the sequence aligns best as CT converted reads vs. GA converted genome (OB, index 1) or GA converted reads vs. GA converted genome (CTOB, index 3)
-  if ( (($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 1) or (($methylation_call_params->{$sequence_identifier}->{index}  + $pbat_index_modifier) == 3) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless ( ($pos-2) >= 0){ # exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-      $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag} = $genomic_seq_for_MD_tag;
-      return;
-    }
-    $non_bisulfite_sequence .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos-2,2);
-  }
-
-  my $indels = 0;	
-
-  foreach (0..$#len){
-    if ($ops[$_] eq 'M'){
-      #extracting genomic sequence
-      $non_bisulfite_sequence .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos,$len[$_]);
-      if ($contains_deletion){
-	$genomic_seq_for_MD_tag .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos,$len[$_]);
-      }
-      # adjusting position
-      $pos += $len[$_];
-    }
-    elsif ($ops[$_] eq 'I'){ # insertion in the read sequence
-      # we simply add padding Xs instead of finding genomic sequence. This will not be used to infer methylation calls and we can later ignore it better during the generation of the MD:Z-tag
-      $non_bisulfite_sequence .= 'X' x $len[$_];
-      if ($contains_deletion){
-	$genomic_seq_for_MD_tag .= 'X' x $len[$_];
-      }
-      # warn "$non_bisulfite_sequence\n";
-      # position doesn't need to be adjusting
-
-      ### 03 06 2014: In fact we don't need to add anything to the hemming distance for insertions since we use padding Xs which will fail the base by base comparison in hemming_dist()
-      # $indels += $len[$_]; # adding this to $indels so we can determine the hemming distance for the SAM output (= single-base substitutions (mismatches, insertions, deletions)
-    }
-    elsif ($ops[$_] eq 'D'){ # deletion in the read sequence
-      # we do not add any genomic sequence but only adjust the position
-
-      # we do however add the genomic sequence to the $genomic_sequence for MD-tag determination if the CIGAR string contained a deletion
-      if ($contains_deletion){
-	$genomic_seq_for_MD_tag .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos,$len[$_]);
-      }
-      $pos += $len[$_];
-      $indels += $len[$_]; # adding this to $indels so we can determine the hemming distance for the SAM output (= single-base substitutions (mismatches, insertions, deletions)
-    }
-    elsif($cigar =~ tr/[NSHPX=]//){ # if these (for standard mapping) illegal characters exist we die
-      die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-    }
-    else{
-      die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-    }
-  }
-
-  ### If the sequence aligns best as CT converted reads vs. CT converted genome (OT, index 0) or GA converted reads vs. CT converted genome (CTOT, index 2)
-  if ( ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 0) or ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 2) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) >= $pos+2){ # exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-      $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag} = $genomic_seq_for_MD_tag;
-      return;
-    }
-    $non_bisulfite_sequence .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos,2);
-    # print "$methylation_call_params->{$sequence_identifier}->{bowtie_sequence}\n$non_bisulfite_sequence\n";
-  }
-
-
-  ### results from CT converted read vs. CT converted genome (+ orientation alignments are reported only)
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_CT_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'CT';
-  }
-
-  ### results from CT converted reads vs. GA converted genome (- orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 1){
-    ### [Index 1, sequence originated from (converted) reverse strand]
-    $counting{CT_GA_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'GA';
-
-    ### reverse complement!
-    $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    if ($contains_deletion){
-      $genomic_seq_for_MD_tag = reverse_complement($genomic_seq_for_MD_tag);
-    }
-  }
-
-  ### results from GA converted reads vs. CT converted genome (- orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 2){
-    ### [Index 2, sequence originated from complementary to (converted) forward strand]
-    $counting{GA_CT_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'CT';
-
-    ### reverse complement!
-    $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    if ($contains_deletion){
-      $genomic_seq_for_MD_tag = reverse_complement($genomic_seq_for_MD_tag);
-    }
-  }
-
-  ### results from GA converted reads vs. GA converted genome (+ orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 3){
-    ### [Index 3, sequence originated from complementary to (converted) reverse strand]
-    $counting{GA_GA_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'GA';
-
-  }
-  else{
-    die "Too many Bowtie 2 result filehandles\n";
-  }
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_strand} = $alignment_strand;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion} = $read_conversion_info;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-  $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag} = $genomic_seq_for_MD_tag;
-
-  # if ($contains_deletion){
-  #   warn "non-bis: $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence}\n";
-  #   warn "MD-seq:  $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag}\n";
-  # }
-
-  ### the end position of a read is stored in $pos
-  $methylation_call_params->{$sequence_identifier}->{end_position} = $pos;
-  $methylation_call_params->{$sequence_identifier}->{indels} = $indels;
-}
-
-### METHYLATION CALL
-
-sub methylation_call{
-  my ($identifier,$sequence_actually_observed,$genomic_sequence,$read_conversion) = @_;
-  ### splitting both the actually observed sequence and the genomic sequence up into single bases so we can compare them one by one
-  my @seq = split(//,$sequence_actually_observed);
-  my @genomic = split(//,$genomic_sequence);
-  #  print join ("\n",$identifier,$sequence_actually_observed,$genomic_sequence,$read_conversion),"\n";
-  ### Creating a match-string with different characters for non-cytosine bases (disregarding mismatches here), methyl-Cs or non-methyl Cs in either
-  ### CpG, CHH or CHG context
-
-  #################################################################
-  ### . for bases not involving cytosines                       ###
-  ### X for methylated C in CHG context (was protected)         ###
-  ### x for not methylated C in CHG context (was converted)     ###
-  ### H for methylated C in CHH context (was protected)         ###
-  ### h for not methylated C in CHH context (was converted)     ###
-  ### Z for methylated C in CpG context (was protected)         ###
-  ### z for not methylated C in CpG context (was converted)     ###
-  ### U for methylated C in unknown context (was protected)     ###
-  ### u for not methylated C in unknwon context (was converted) ###
-  #################################################################
-
-  my @match =();
-  warn "length of \@seq: ",scalar @seq,"\tlength of \@genomic: ",scalar @genomic,"\n" unless (scalar @seq eq (scalar@genomic-2)); ## CHH changed to -2
-  my $methyl_CHH_count = 0;
-  my $methyl_CHG_count = 0;
-  my $methyl_CpG_count = 0;
-  my $methyl_C_unknown_count = 0;
-  my $unmethylated_CHH_count = 0;
-  my $unmethylated_CHG_count = 0;
-  my $unmethylated_CpG_count = 0;
-  my $unmethylated_C_unknown_count = 0;
-
-  if ($read_conversion eq 'CT'){
-    for my $index (0..$#seq) {
-      if ($seq[$index] eq $genomic[$index]) {
-	### The residue can only be a C if it was not converted to T, i.e. protected my methylation
-	if ($genomic[$index] eq 'C') {
-	  ### If the residue is a C we want to know if it was in CpG context or in any other context
-	  my $downstream_base = $genomic[$index+1];
-	
-	  if ($downstream_base eq 'G'){
-	    ++$methyl_CpG_count;
-	    push @match,'Z'; # protected C, methylated, in CpG context
-	  }
-	  elsif ($downstream_base eq 'N'){ # if the downstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$methyl_C_unknown_count;
-	    push @match,'U'; # protected C, methylated, in Unknown context
-	  }	
-	  else {
-	    ### C in not in CpG-context, determining the second downstream base context
-	    my $second_downstream_base = $genomic[$index+2];
-	
-	    if ($second_downstream_base eq 'G'){
-	      ++$methyl_CHG_count;
-	      push @match,'X'; # protected C, methylated, in CHG context
-	    }
-	    elsif ($second_downstream_base eq 'N'){
-	      ++$methyl_C_unknown_count; # if the second downstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'U'; # protected C, methylated, in Unknown context
-	    }
-	    else{
-	      ++$methyl_CHH_count;
-	      push @match,'H'; # protected C, methylated, in CHH context
-	    }
-	  }
-	}
-	else {
-	  push @match, '.';
-	}
-      }
-      elsif ($seq[$index] ne $genomic[$index]) {
-	### for the methylation call we are only interested in mismatches involving cytosines (in the genomic sequence) which were converted into Ts
-	### in the actually observed sequence
-	if ($genomic[$index] eq 'C' and $seq[$index] eq 'T') {
-	  ### If the residue was converted to T we want to know if it was in CpG, CHG or CHH  context
-	  my $downstream_base = $genomic[$index+1];
-	
-	  if ($downstream_base eq 'G'){
-	    ++$unmethylated_CpG_count;
-	    push @match,'z'; # converted C, not methylated, in CpG context
-	  }
-	  elsif ($downstream_base eq 'N'){ # if the downstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$unmethylated_C_unknown_count;
-	    push @match,'u'; # converted C, not methylated, in Unknown context
-	  }
-	  else{
-	    ### C in not in CpG-context, determining the second downstream base context
-	    my $second_downstream_base = $genomic[$index+2];
-	
-	    if ($second_downstream_base eq 'G'){
-	      ++$unmethylated_CHG_count;
-	      push @match,'x'; # converted C, not methylated, in CHG context
-	    }
-	    elsif ($second_downstream_base eq 'N'){
-	      ++$unmethylated_C_unknown_count; # if the second downstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'u'; # converted C, not methylated, in Unknown context
-	    }
-	    else{
-	      ++$unmethylated_CHH_count;
-	      push @match,'h'; # converted C, not methylated, in CHH context
-	    }
-	  }
-	}
-	### all other mismatches are not of interest for a methylation call
-	else {
-	  push @match,'.';
-	}
-      }
-      else{
-	die "There can be only 2 possibilities\n";
-      }
-    }
-  }
-  elsif ($read_conversion eq 'GA'){
-    # print join ("\n",'***',$identifier,$sequence_actually_observed,$genomic_sequence,$read_conversion,'***'),"\n";
-
-    for my $index (0..$#seq) {
-      if ($seq[$index] eq $genomic[$index+2]) {
-	### The residue can only be a G if the C on the other strand was not converted to T, i.e. protected my methylation
-	if ($genomic[$index+2] eq 'G') {
-	  ### If the residue is a G we want to know if the C on the other strand was in CpG, CHG or CHH context, therefore we need
-	  ### to look if the base upstream is a C
-
-	  my $upstream_base = $genomic[$index+1];
-	
-	  if ($upstream_base eq 'C'){
-	    ++$methyl_CpG_count;
-	    push @match,'Z'; # protected C on opposing strand, methylated, in CpG context
-	  }
-	  elsif ($upstream_base eq 'N'){ # if the upstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$methyl_C_unknown_count;
-	    push @match,'U'; # protected C on opposing strand, methylated, in Unknown context
-	  }
-	  else{
-	    ### C in not in CpG-context, determining the second upstream base context
-	    my $second_upstream_base = $genomic[$index];
-	
-	    if ($second_upstream_base eq 'C'){
-	      ++$methyl_CHG_count;
-	      push @match,'X'; # protected C on opposing strand, methylated, in CHG context
-	    }
-	    elsif ($second_upstream_base eq 'N'){
-	      ++$methyl_C_unknown_count; # if the second upstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'U'; # protected C, methylated, in Unknown context
-	    }
-	    else{
-	      ++$methyl_CHH_count;
-	      push @match,'H'; # protected C on opposing strand, methylated, in CHH context
-	    }
-	  }
-	}
-	else{
-	  push @match, '.';
-	}
-      }
-      elsif ($seq[$index] ne $genomic[$index+2]) {
-	### for the methylation call we are only interested in mismatches involving cytosines (in the genomic sequence) which were converted to Ts
-	### on the opposing strand, so G to A conversions in the actually observed sequence
-	if ($genomic[$index+2] eq 'G' and $seq[$index] eq 'A') {
-	  ### If the C residue on the opposing strand was converted to T then we will see an A in the currently observed sequence. We want to know if
-	  ### the C on the opposing strand was it was in CpG, CHG or CHH context, therefore we need to look one (or two) bases upstream!
-
-	  my $upstream_base = $genomic[$index+1];
-
-	  if ($upstream_base eq 'C'){
-	    ++$unmethylated_CpG_count;
-	    push @match,'z'; # converted C on opposing strand, not methylated, in CpG context
-	  }
-	  elsif ($upstream_base eq 'N'){ # if the upstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$unmethylated_C_unknown_count;
-	    push @match,'u'; # converted C on opposing strand, not methylated, in Unknown context
-	  }
-	  else{
-	    ### C in not in CpG-context, determining the second upstream base context
-	    my $second_upstream_base = $genomic[$index];
-	
-	    if ($second_upstream_base eq 'C'){
-	      ++$unmethylated_CHG_count;
-	      push @match,'x'; # converted C on opposing strand, not methylated, in CHG context
-	    }
-	    elsif ($second_upstream_base eq 'N'){
-	      ++$unmethylated_C_unknown_count; # if the second upstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'u'; # converted C on opposing strand, not methylated, in Unknown context
-	    }
-	    else{
-	      ++$unmethylated_CHH_count;
-	      push @match,'h'; # converted C on opposing strand, not methylated, in CHH context
-	    }
-	  }
-	}
-	### all other mismatches are not of interest for a methylation call
-	else {
-	  push @match,'.';
-	}
-      }
-      else{
-	die "There can be only 2 possibilities\n";
-      }
-    }
-  }
-  else{
-    die "Strand conversion info is required to perform a methylation call\n";
-  }
-
-  my $methylation_call = join ("",@match);
-
-  $counting{total_meCHH_count} += $methyl_CHH_count;
-  $counting{total_meCHG_count} += $methyl_CHG_count;
-  $counting{total_meCpG_count} += $methyl_CpG_count;
-  $counting{total_meC_unknown_count} += $methyl_C_unknown_count;
-  $counting{total_unmethylated_CHH_count} += $unmethylated_CHH_count;
-  $counting{total_unmethylated_CHG_count} += $unmethylated_CHG_count;
-  $counting{total_unmethylated_CpG_count} += $unmethylated_CpG_count;
-  $counting{total_unmethylated_C_unknown_count} += $unmethylated_C_unknown_count;
-
-  # print "\n$sequence_actually_observed\n$genomic_sequence\n",@match,"\n$read_conversion\n\n";
-
-  return $methylation_call;
-}
-
-sub read_genome_into_memory{
-
-    ## working directoy
-    my $cwd = shift;
-    
-    ## reading in and storing the specified genome in the %chromosomes hash
-    chdir ($genome_folder) or die "Can't move to $genome_folder: $!";
-    warn "Now reading in and storing sequence information of the genome specified in: $genome_folder\n\n";
-
-    my @chromosome_filenames =  <*.fa>;
-
-    ### if there aren't any genomic files with the extension .fa we will look for files with the extension .fasta
-    unless (@chromosome_filenames){
-      @chromosome_filenames =  <*.fasta>;
-    }
-
-    unless (@chromosome_filenames){
-      die "The specified genome folder $genome_folder does not contain any sequence files in FastA format (with .fa or .fasta file extensions)\n";
-    }
-
-    my $SQ_count = 0;
-
-    foreach my $chromosome_filename (@chromosome_filenames){
-
-	open (CHR_IN,$chromosome_filename) or die "Failed to read from sequence file $chromosome_filename $!\n";
-	### first line needs to be a fastA header
-	my $first_line = <CHR_IN>;
-	chomp $first_line;
-	$first_line =~ s/\r//;
-	### Extracting chromosome name from the FastA header
-	my $chromosome_name = extract_chromosome_name($first_line);
-	my $sequence;
-
-	while (<CHR_IN>){
-	  chomp;
-	  $_ =~ s/\r//; # removing carriage returns if present
-	  if ($_ =~ /^>/){
-	
-	    ### storing the previous chromosome in the %chromosomes hash, only relevant for Multi-Fasta-Files (MFA)
-	    if (exists $chromosomes{$chromosome_name}){
-	      print "chr $chromosome_name (",length $sequence ," bp)\n";
-	      die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name!\n";
-	    }
-	    else {
-	      if (length($sequence) == 0){
-		warn "Chromosome $chromosome_name in the multi-fasta file $chromosome_filename did not contain any sequence information!\n";
-	      }
-	      print "chr $chromosome_name (",length $sequence ," bp)\n";
-	      $chromosomes{$chromosome_name} = $sequence;
-	      $SQ_order{$SQ_count} = $chromosome_name;
-
-	      ++$SQ_count;
-
-	    }
-	    ### resetting the sequence variable
-	    $sequence = '';
-	    ### setting new chromosome name
-	    $chromosome_name = extract_chromosome_name($_);
-	  }
-	  else{
-	    $sequence .= uc$_;
-	  }
-	}
-	
- 	### Processing last chromosome of a multi Fasta File or the only entry in case of single entry FastA files
-
-	if (exists $chromosomes{$chromosome_name}){
-	    print "chr $chromosome_name (",length $sequence ," bp)\t";
-	    die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name.\n";
-	}
-	else{
-	    if (length($sequence) == 0){
-		warn "Chromosome $chromosome_name in the file $chromosome_filename did not contain any sequence information!\n";
-	    }
-
-	    ++$SQ_count;
-
-	    print "chr $chromosome_name (",length $sequence ," bp)\n";
-	    $chromosomes{$chromosome_name} = $sequence;
-	    $SQ_order{$SQ_count} = $chromosome_name;
-	}
-    }
-    print "\n";
-    chdir $cwd or die "Failed to move to directory $cwd\n";
-
-    ### If no single multi-FastA genome file was specified explicitely we will generate one here and write it to the output directory
-    if ($cram){
-	unless (defined $cram_ref){
-	    warn "Reconstituting a single multi-FastA genome file as CRAM reference (you may specify such a file using --cram_ref <file> explicitely to prevent this behaviour)\n";	
-
-	    $cram_ref = "${output_dir}Bismark_genome_CRAM_reference.mfa";
-	    warn "Writing multi-FastA file to $cram_ref\n";
-	    open (REF,'>',"$cram_ref") or die "Failed to write to file $cram_ref\n";
-	    foreach my $chr(keys %chromosomes){
-		print REF ">$chr\n$chromosomes{$chr}\n";
-	    }
-	    warn "Complete\n";
-	    close REF or warn "Failed to close filehandle REF: $!\n";
-	}
-	
-    }
-    
-
-
-}
-
-sub extract_chromosome_name {
-    ## Bowtie seems to extract the first string after the inition > in the FASTA file, so we are doing this as well
-    my $fasta_header = shift;
-    if ($fasta_header =~ s/^>//){
-	my ($chromosome_name) = split (/\s+/,$fasta_header);
-	return $chromosome_name;
-    }
-    else{
-	die "The specified chromosome ($fasta_header) file doesn't seem to be in FASTA format as required!\n";
-    }
-}
-
-sub reverse_complement{
-  my $sequence = shift;
-  $sequence =~ tr/CATG/GTAC/;
-  $sequence = reverse($sequence);
-  return $sequence;
-}
-
-sub biTransformFastAFiles {
-  my $file = shift;
-  my ($dir,$filename);
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"gunzip -c $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  if ($gzip){
-    $C_to_T_infile =~ s/$/_C_to_T.fa.gz/;
-    $G_to_A_infile =~ s/$/_G_to_A.fa.gz/;
-  }
-  else{
-    $C_to_T_infile =~ s/$/_C_to_T.fa/;
-    $G_to_A_infile =~ s/$/_G_to_A.fa/;
-  }
-
-  if ($prefix){
-    #  warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    #  warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-
-  if ($gzip){
-    open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-  }
-  else{
-    open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-  }
-
-  unless ($directional){
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-    if ($gzip){
-      open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-  }
-
-  my $count = 0;
-
-  while (1){
-    my $header = <IN>;
-    my $sequence= <IN>;
-    last unless ($header and $sequence);
-
-    $header = fix_IDs($header); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence = uc$sequence; # make input file case insensitive
-
-    # detecting if the input file contains tab stops, as this is likely to result in no alignments
-    if (index($header,"\t") != -1){
-      $seqID_contains_tabs++;
-    }
-
-    ### small check if the sequence seems to be in FastA format
-    die "Input file doesn't seem to be in FastA format at sequence $count: $!\n" unless ($header =~ /^>.*/);
-
-    my $sequence_C_to_T = $sequence;
-    $sequence_C_to_T =~ tr/C/T/;
-    print CTOT "$header$sequence_C_to_T";
-
-    unless ($directional){
-      my $sequence_G_to_A = $sequence;
-      $sequence_G_to_A =~ tr/G/A/;
-      print GTOA "$header$sequence_G_to_A";
-    }
-  }
-  close CTOT or die "Failed to close filehandle $!\n";
-
-  if ($directional){
-    warn "\nCreated C -> T converted versions of the FastA file $filename ($count sequences in total)\n\n";
-  }
-  else{
-    close GTOA or die "Failed to close filehandle $!\n";
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastA file $filename ($count sequences in total)\n\n";
-  }
-  return ($C_to_T_infile,$G_to_A_infile);
-}
-
-sub biTransformFastAFiles_paired_end {
-  my ($file,$read_number) = @_;
-
-  if ($gzip){
-    warn "GZIP compression of temporary files is not supported for paired-end FastA data. Continuing to write uncompressed files\n";
-    sleep (2);
-  }
-
-  my ($dir,$filename);
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"gunzip -c $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  $C_to_T_infile =~ s/$/_C_to_T.fa/;
-  $G_to_A_infile =~ s/$/_G_to_A.fa/;
-
-  if ($prefix){
-    #  warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    #  warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-      open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-    }
-    elsif ($read_number == 2){
-      warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-    else{
-      die "Read number needs to be 1 or 2, but was: $read_number\n\n";
-    }
-  }
-  else{ # all four strand output
-    warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-    open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-    open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-  }
-
-  my $count = 0;
-
-  while (1){
-    my $header = <IN>;
-    my $sequence= <IN>;
-    last unless ($header and $sequence);
-
-    $header = fix_IDs($header); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence = uc$sequence; # make input file case insensitive
-
-    # detecting if the input file contains tab stops, as this is likely to result in no alignments
-    if (index($header,"\t") != -1){
-      $seqID_contains_tabs++;
-    }
-
-    ## small check if the sequence seems to be in FastA format
-    die "Input file doesn't seem to be in FastA format at sequence $count: $!\n" unless ($header =~ /^>/);
-
-    if ($read_number == 1){
-      if ($bowtie2){
-	$header =~ s/$/\/1\/1/;
-      }
-      else{	
-	$header =~ s/$/\/1/;
-      }
-    }
-    elsif ($read_number == 2){
-      if ($bowtie2){
-	$header =~ s/$/\/2\/2/;
-      }
-      else{
-	$header =~ s/$/\/2/;
-      }
-    }
-    else{
-      die "Read number needs to be 1 or 2, but was: $read_number\n\n";
-    }
-    my $sequence_C_to_T = my $sequence_G_to_A = $sequence;
-
-    $sequence_C_to_T =~ tr/C/T/;
-    $sequence_G_to_A =~ tr/G/A/;
-
-    if ($directional){
-
-      if ($read_number == 1){
-	print CTOT "$header$sequence_C_to_T";
-      }
-      elsif ($read_number == 2){
-	print GTOA "$header$sequence_G_to_A";
-      }
-    }
-    else{
-      print CTOT "$header$sequence_C_to_T";
-      print GTOA "$header$sequence_G_to_A";
-    }
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "\nCreated C -> T converted version of the FastA file $filename ($count sequences in total)\n\n";
-    }
-    else{
-      warn "\nCreated G -> A converted version of the FastA file $filename ($count sequences in total)\n\n";
-    }
-  }
-  else{
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastA file $filename ($count sequences in total)\n\n";
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      return ($C_to_T_infile);
-    }
-    else{
-      return ($G_to_A_infile);
-    }
-  }
-  else{
-    return ($C_to_T_infile,$G_to_A_infile);
-  }
-}
-
-
-sub biTransformFastQFiles {
-  my $file = shift;
-  my ($dir,$filename);
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"gunzip -c $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  if ($prefix){
-    # warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    # warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  if ($pbat){ # PBAT-Seq
-    if ($gzip){
-      $G_to_A_infile =~ s/$/_G_to_A.fastq.gz/;
-    }
-    else{
-      $G_to_A_infile =~ s/$/_G_to_A.fastq/;
-    }
-
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-
-    if ($gzip){
-      open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-  }
-  else{ # directional or non-directional
-    if ($gzip){
-      $C_to_T_infile =~ s/$/_C_to_T.fastq.gz/;
-    }
-    else{
-      $C_to_T_infile =~ s/$/_C_to_T.fastq/;
-    }
-
-    warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-
-    if ($gzip){
-      open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n"; # uncompressed option
-    }
-
-    unless ($directional){
-      if ($gzip){
-	$G_to_A_infile =~ s/$/_G_to_A.fastq.gz/;
-      }
-      else{
-	$G_to_A_infile =~ s/$/_G_to_A.fastq/;
-      }
-
-      warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-
-      if ($gzip){
-	open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-      }
-      else{
-	open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-      }
-    }
-  }
-
-  my $count = 0;
-  while (1){
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    my $identifier2 = <IN>;
-    my $quality_score = <IN>;
-    last unless ($identifier and $sequence and $identifier2 and $quality_score);
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence = uc$sequence; # make input file case insensitive
-
-    # detecting if the input file contains tab stops, as this is likely to result in no alignments
-    if (index($identifier,"\t") != -1){
-      $seqID_contains_tabs++;
-    }
-
-    ## small check if the sequence file appears to be a FastQ file
-    if ($count == 1){
-      if ($identifier !~ /^\@/ or $identifier2 !~ /^\+/){
-	die "Input file doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-    }
-
-    if ($pbat){
-      my $sequence_G_to_A = $sequence;
-      $sequence_G_to_A =~ tr/G/A/;
-      print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-    }
-    else{ # directional or non-directional
-      my $sequence_C_to_T = $sequence;
-      $sequence_C_to_T =~ tr/C/T/;
-      print CTOT join ('',$identifier,$sequence_C_to_T,$identifier2,$quality_score);
-
-      unless ($directional){
-	my $sequence_G_to_A = $sequence;
-	$sequence_G_to_A =~ tr/G/A/;
-	print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-      }
-    }
-  }
-
-  if ($directional){
-    close CTOT or die "Failed to close filehandle $!\n";
-    warn "\nCreated C -> T converted version of the FastQ file $filename ($count sequences in total)\n\n";
-  }
-  elsif($pbat){
-    warn "\nCreated G -> A converted version of the FastQ file $filename ($count sequences in total)\n\n";
-    close GTOA or die "Failed to close filehandle $!\n";
-    return ($G_to_A_infile);
-  }
-  else{
-    close CTOT or die "Failed to close filehandle $!\n";
-    close GTOA or die "Failed to close filehandle $!\n";
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastQ file $filename ($count sequences in total)\n\n";
-  }
-
-  return ($C_to_T_infile,$G_to_A_infile);
-}
-
-sub biTransformFastQFiles_paired_end {
-  my ($file,$read_number) = @_;
-  my ($dir,$filename);
-
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"gunzip -c $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  if ($gzip){
-    $C_to_T_infile =~ s/$/_C_to_T.fastq.gz/;
-    $G_to_A_infile =~ s/$/_G_to_A.fastq.gz/;
-  }
-  else{
-    $C_to_T_infile =~ s/$/_C_to_T.fastq/;
-    $G_to_A_infile =~ s/$/_G_to_A.fastq/;
-  }
-
-  if ($prefix){
-    #  warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    #  warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-      if ($gzip){
-	open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-      }
-      else{
-	open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-      }
-    }
-    elsif ($read_number == 2){
-      warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-      if ($gzip){
-	open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-      }
-      else{
-	open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-      }
-    }
-    else{
-      die "Read number needs to be 1 or 2, but was $read_number!\n\n";
-    }
-  }
-  else{
-    warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-    if ($gzip){
-      open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-      open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-  }
-
-  my $count = 0;
-  while (1){
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    my $identifier2 = <IN>;
-    my $quality_score = <IN>;
-    last unless ($identifier and $sequence and $identifier2 and $quality_score);
-    ++$count;
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence= uc$sequence; # make input file case insensitive
-
-    ## small check if the sequence file appears to be a FastQ file
-    if ($count == 1){
-      if ($identifier !~ /^\@/ or $identifier2 !~ /^\+/){
-	die "Input file doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-    }
-    my $sequence_C_to_T = my $sequence_G_to_A = $sequence;
-
-    if ($read_number == 1){
-      if ($bowtie2){
-	$identifier =~ s/$/\/1\/1/;
-      }
-      else{
-	$identifier =~ s/$/\/1/;
-      }
-    }
-    elsif ($read_number == 2){
-      if ($bowtie2){
-	$identifier =~ s/$/\/2\/2/;
-      }
-      else{
-	$identifier =~ s/$/\/2/;
-      }
-    }
-    else{
-      die "Read number needs to be 1 or 2\n";
-    }
-
-    $sequence_C_to_T =~ tr/C/T/;
-    $sequence_G_to_A =~ tr/G/A/;
-
-    if ($directional){
-      if ($read_number == 1){
-	print CTOT join ('',$identifier,$sequence_C_to_T,$identifier2,$quality_score);
-      }
-      else{
-	print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-      }
-    }
-    else{
-      print CTOT join ('',$identifier,$sequence_C_to_T,$identifier2,$quality_score);
-      print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-    }
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "\nCreated C -> T converted version of the FastQ file $filename ($count sequences in total)\n\n";
-    }
-    else{
-      warn "\nCreated G -> A converted version of the FastQ file $filename ($count sequences in total)\n\n";
-    }
-  }
-  else{
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastQ file $filename ($count sequences in total)\n\n";
-  }
-  if ($directional){
-    if ($read_number == 1){
-      close CTOT or die "Failed to close filehandle $!\n";
-      return ($C_to_T_infile);
-    }
-    else{
-      close GTOA or die "Failed to close filehandle $!\n";
-      return ($G_to_A_infile);
-    }
-  }
-  else{
-    close CTOT or die "Failed to close filehandle $!\n";
-    close GTOA or die "Failed to close filehandle $!\n";
-    return ($C_to_T_infile,$G_to_A_infile);
-  }
-}
-
-
-### SPECIAL BOWTIE 1 PAIRED-END FORMAT FOR GZIPPED OUTPUT FILES
-
-sub biTransformFastQFiles_paired_end_bowtie1_gzip {
-  my ($file_1,$file_2) = @_;
-  my ($dir,$filename);
-
-  if ($file_1 =~ /\//){
-    ($dir,$filename) = $file_1 =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file_1;
-  }
-
-  ### gzipped version of infile 1
-  if ($file_1 =~ /\.gz$/){
-    open (IN_1,"gunzip -c $file_1 |") or die "Couldn't read from file $file_1: $!\n";
-  }
-  else{
-    open (IN_1,$file_1) or die "Couldn't read from file $file_1: $!\n";
-  }
-  ### gzipped version of infile 2
-  if ($file_2 =~ /\.gz$/){
-    open (IN_2,"gunzip -c $file_2 |") or die "Couldn't read from file $file_2: $!\n";
-  }
-  else{
-    open (IN_2,$file_2) or die "Couldn't read from file $file_2: $!\n";
-  }
-
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file_1 and $file_2\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file_1 and $file_2\n";
-    sleep (1);
-  }
-
-  my $CT_plus_GA_infile = my $GA_plus_CT_infile = $filename;
-
-  if ($prefix){
-    # warn "Prefixing $prefix:\nold: $CT_plus_GA_infile\nold: $GA_plus_CT_infile\n\n";
-    $CT_plus_GA_infile = "$prefix.$CT_plus_GA_infile";
-    $GA_plus_CT_infile = "$prefix.$GA_plus_CT_infile";
-    # warn "Prefixing $prefix:\nnew: $CT_plus_GA_infile\nnew: $GA_plus_CT_infile\n\n";
-  }
-
-  $CT_plus_GA_infile =~ s/$/.CT_plus_GA.fastq.gz/;
-  $GA_plus_CT_infile =~ s/$/.GA_plus_CT.fastq.gz/;
-  # warn "Prefixing $prefix:\nnew: $CT_plus_GA_infile\nnew: $GA_plus_CT_infile\n\n";
-
-  warn "Writing a C -> T converted version of $file_1 and a G -> A converted version of $file_2 to $temp_dir$CT_plus_GA_infile\n";
-  open (CTPLUSGA,"| gzip -c - > ${temp_dir}${CT_plus_GA_infile}") or die "Can't write to file: $!\n";
-  # open (CTPLUSGA,'>',"$temp_dir$CT_plus_GA_infile") or die "Couldn't write to file $!\n";
-
-  unless ($directional){
-    print "Writing a G -> A converted version of $file_1 and a C -> T converted version of $file_2 to $temp_dir$GA_plus_CT_infile\n";
-    open (GAPLUSCT,"| gzip -c - > ${temp_dir}${GA_plus_CT_infile}") or die "Can't write to file: $!\n";
-  }
-
-  ### for Bowtie 1 we need to write a single gzipped file with 1 line per pair of sequences in the the following format:
-  ### <seq-ID>     <sequence #1 mate>     <quality #1 mate>     <sequence #2 mate>     <quality #2 mate>
-
-  my $count = 0;
-  while (1){
-    my $identifier_1 = <IN_1>;
-    my $sequence_1 = <IN_1>;
-    my $identifier2_1 = <IN_1>;
-    my $quality_score_1 = <IN_1>;
-
-    my $identifier_2 = <IN_2>;
-    my $sequence_2 = <IN_2>;
-    my $identifier2_2 = <IN_2>;
-    my $quality_score_2 = <IN_2>;
-
-    last unless ($identifier_1 and $sequence_1 and $identifier2_1 and $quality_score_1 and $identifier_2 and $sequence_2 and $identifier2_2 and $quality_score_2);
-
-    ++$count;
-
-    ## small check if the sequence file appears to be a FastQ file
-    if ($count == 1){
-      if ($identifier_1 !~ /^\@/ or $identifier2_1 !~ /^\+/){
-	die "Input file 1 doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-      if ($identifier_2 !~ /^\@/ or $identifier2_2 !~ /^\+/){
-	die "Input file 2 doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-    }
-
-    $identifier_1 = fix_IDs($identifier_1); # this is to avoid problems with truncated read ID when they contain white spaces
-    chomp $identifier_1;
-    chomp $sequence_1;
-    chomp $sequence_2;
-    chomp $quality_score_1;
-    chomp $quality_score_2;
-
-    $identifier_1 =~ s/^\@//;
-    $identifier_1 =~ s/$/\/1/; #adding an extra /1 to the end which is being removed by Bowtie otherwise (which leads to no sequences alignments whatsoever)
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence_1 = uc$sequence_1; # make input file 1 case insensitive
-    $sequence_2 = uc$sequence_2; # make input file 2 case insensitive
-
-    # print "$identifier_1\t$sequence_1\t$quality_score_1\t$sequence_2\t$quality_score_2\n";
-    my $sequence_1_C_to_T = $sequence_1;
-    my $sequence_2_G_to_A = $sequence_2;
-    $sequence_1_C_to_T =~ tr/C/T/;
-    $sequence_2_G_to_A =~ tr/G/A/;
-
-    print CTPLUSGA "$identifier_1\t$sequence_1_C_to_T\t$quality_score_1\t$sequence_2_G_to_A\t$quality_score_2\n";
-
-    unless ($directional){
-      my $sequence_1_G_to_A = $sequence_1;
-      my $sequence_2_C_to_T = $sequence_2;
-      $sequence_1_G_to_A =~ tr/G/A/;
-      $sequence_2_C_to_T =~ tr/C/T/;
-      print GAPLUSCT "$identifier_1\t$sequence_1_G_to_A\t$quality_score_1\t$sequence_2_C_to_T\t$quality_score_2\n";
-    }
-  }
-
-  close CTPLUSGA or die "Couldn't close filehandle\n";
-  warn "\nCreated C -> T converted version of FastQ file '$file_1' and G -> A converted version of FastQ file '$file_2' ($count sequences in total)\n";
-
-  if ($directional){
-    warn "\n";
-    return ($CT_plus_GA_infile);
-  }
-  else{
-    close GAPLUSCT or die "Couldn't close filehandle\n";
-    warn "Created G -> A converted version of FastQ file '$file_1' and C -> T converted version of FastQ file '$file_2' ($count sequences in total)\n\n";
-    return ($CT_plus_GA_infile,$GA_plus_CT_infile);
-  }
-}
-
-
-sub fix_IDs{
-  my $id = shift;
-  $id =~ s/[ \t]+/_/g; # replace spaces or tabs with underscores
-  return $id;
-}
-
-sub ensure_sensical_alignment_orientation_single_end{
-  my $index = shift; # index number if the sequence produced an alignment
-  my $strand = shift;
-  ###  setting $orientation to 1 if it is in the correct orientation, and leave it 0 if it is the nonsensical wrong one
-  my $orientation = 0;
-  ##############################################################################################################
-  ## FORWARD converted read against FORWARD converted genome (read: C->T.....C->T..      genome:C->T.......C->T)
-  ## here we only want reads in the forward (+) orientation
-  if ($fhs[$index]->{name} eq 'CTreadCTgenome') {
-    ### if the alignment is (+) we count it, and return 1 for a correct orientation
-    if ($strand eq '+') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (-) the alignment is nonsensical
-    elsif ($strand eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  }
-  ###############################################################################################################
-  ## FORWARD converted read against reverse converted genome (read: C->T.....C->T..      genome: G->A.......G->A)
-  ## here we only want reads in the forward (-) orientation
-  elsif ($fhs[$index]->{name} eq 'CTreadGAgenome') {
-    ### if the alignment is (-) we count it and return 1 for a correct orientation
-    if ($strand eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (+) the alignment is nonsensical
-    elsif ($strand eq '+') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  }
-  ###############################################################################################################
-  ## Reverse converted read against FORWARD converted genome (read: G->A.....G->A..      genome: C->T.......C->T)
-  ## here we only want reads in the forward (-) orientation
-  elsif ($fhs[$index]->{name} eq 'GAreadCTgenome') {
-    ### if the alignment is (-) we count it and return 1 for a correct orientation
-    if ($strand eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (+) the alignment is nonsensical
-    elsif ($strand eq '+') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  }
-  ###############################################################################################################
-  ## Reverse converted read against reverse converted genome (read: G->A.....G->A..      genome: G->A.......G->A)
-  ## here we only want reads in the forward (+) orientation
-  elsif ($fhs[$index]->{name} eq 'GAreadGAgenome') {
-    ### if the alignment is (+) we count it and return 1 for a correct orientation
-    if ($strand eq '+') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (-) the alignment is nonsensical
-    elsif ($strand eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  } else{
-    die "One of the above conditions must be true\n";
-  }
-}
-
-sub ensure_sensical_alignment_orientation_paired_ends{
-  my ($index,$id_1,$strand_1,$id_2,$strand_2) = @_; # index number if the sequence produced an alignment
-  ###  setting $orientation to 1 if it is in the correct orientation, and leave it 0 if it is the nonsensical wrong one
-  my $orientation = 0;
-  ##############################################################################################################
-  ## [Index 0, sequence originated from (converted) forward strand]
-  ## CT converted read 1
-  ## GA converted read 2
-  ## CT converted genome
-  ## here we only want read 1 in (+) orientation and read 2 in (-) orientation
-  if ($fhs[$index]->{name} eq 'CTread1GAread2CTgenome') {
-    ### if the paired-end alignment is read1 (+) and read2 (-) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  ###############################################################################################################
-  ## [Index 1, sequence originated from (converted) reverse strand]
-  ## GA converted read 1
-  ## CT converted read 2
-  ## GA converted genome
-  ## here we only want read 1 in (+) orientation and read 2 in (-) orientation
-  elsif ($fhs[$index]->{name} eq 'GAread1CTread2GAgenome') {
-    ### if the paired-end alignment is read1 (+) and read2 (-) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  ###############################################################################################################
-  ## [Index 2, sequence originated from complementary to (converted) forward strand]
-  ## GA converted read 1
-  ## CT converted read 2
-  ## CT converted genome
-  ## here we only want read 1 in (-) orientation and read 2 in (+) orientation
-  elsif ($fhs[$index]->{name} eq 'GAread1CTread2CTgenome') {
-    ### if the paired-end alignment is read1 (-) and read2 (+) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  ###############################################################################################################
-  ## [Index 3, sequence originated from complementary to (converted) reverse strand]
-  ## CT converted read 1
-  ## GA converted read 2
-  ## GA converted genome
-  ## here we only want read 1 in (+) orientation and read 2 in (-) orientation
-  elsif ($fhs[$index]->{name} eq 'CTread1GAread2GAgenome') {
-    ### if the paired-end alignment is read1 (-) and read2 (+) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  else{
-    die "One of the above conditions must be true\n";
-  }
-}
-
-#####################################################################################################################################################
-
-### Bowtie 1 (default) | PAIRED-END | FASTA
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastA {
-
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-
-  if ($directional){
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_1 and $C_to_T_infile_2 and $G_to_A_infile_2 (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional){
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next;
-      }
-    }
-
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    warn "Now starting a Bowtie paired-end alignment for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile_1} and $temp_dir$fh->{inputfile_2}, with the options: $bt_options)\n";
-    open ($fh->{fh},"$path_to_bowtie $bt_options $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-
-    my $line_1 = $fh->{fh}->getline();
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	die "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains either read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains either read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | PAIRED-END | FASTA
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 {
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-  if ($directional){
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_1 and $C_to_T_infile_2 and $G_to_A_infile_2 (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional){
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next;
-      }
-    }
-
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-
-    warn "Now starting a Bowtie 2 paired-end alignment for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile_1} and $temp_dir$fh->{inputfile_2}, with the options: $bt2_options))\n";
-    open ($fh->{fh},"$path_to_bowtie $bt2_options -x $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else{
-	last; # no alignment output
-      }
-    }
-
-    my $line_1 = $_;
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 /1 tag if present (remember that Bowtie2 clips off /1 or /2 line endings itself, so we added /1/1 or /2/2 to start with
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 /2 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	warn "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains either read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains either read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-### Bowtie 1 (default) | PAIRED-END | FASTQ
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastQ {
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-
-  if ($directional){
-    warn "Input file is $C_to_T_infile_1 and $G_to_A_infile_2 (FastQ)\n";
-  }
-  elsif($pbat){
-    warn "Input file is $G_to_A_infile_1 and $C_to_T_infile_2 (FastQ; PBAT-Seq)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 and $G_to_A_infile_1 and $C_to_T_infile_2 (non-directional; FastQ)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the data structure above
-  if ($directional or $pbat){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional or $pbat){
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next; # skipping unwanted filehandles
-      }
-    }
-
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    if ($gzip){
-      warn "Now starting a Bowtie paired-end alignment for $fh->{name} (reading in sequences from ${temp_dir}$fh->{inputfile_1}, with the options: $bt_options)\n";
-      open ($fh->{fh},"gunzip -c ${temp_dir}$fh->{inputfile_1} | $path_to_bowtie $bt_options $fh->{bisulfiteIndex} --12 - |") or die "Can't open pipe to bowtie: $!";
-    }
-    else{
-      warn "Now starting a Bowtie paired-end alignment for $fh->{name} (reading in sequences from ${temp_dir}$fh->{inputfile_1} and ${temp_dir}$fh->{inputfile_2}, with the options: $bt_options))\n";
-      sleep(5);
-      open ($fh->{fh},"$path_to_bowtie $bt_options $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-    }
-
-    my $line_1 = $fh->{fh}->getline();
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	die "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | PAIRED-END | FASTQ
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 {
-
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-  if ($directional){
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 (FastQ)\n";
-  }
-  elsif ($pbat){
-    warn "Input files are $G_to_A_infile_1 and $C_to_T_infile_2 (FastQ)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_1 and $C_to_T_infile_2 and $G_to_A_infile_2 (FastQ)\n";
-  }
-
-  ## Now starting up 4 instances of Bowtie 2 feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the
-  ## data structure above
-  if ($directional or $pbat){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional or $pbat){ # skipping unwanted filehandles
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next;
-      }
-    }
-
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-
-    warn "Now starting a Bowtie 2 paired-end alignment for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile_1} and $temp_dir$fh->{inputfile_2}, with the options: $bt2_options))\n";
-    open ($fh->{fh},"$path_to_bowtie $bt2_options -x $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else{
-	last; # no alignment output
-      }
-    }
-
-    my $line_1 = $_;
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 tag if present (remember that Bowtie2 clips off /1 or /2 line endings itself, so we added /1/1 or /2/2 to start with
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	die "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-#####################################################################################################################################################
-
-### Bowtie 1 (default) | SINGLE-END | FASTA
-sub single_end_align_fragments_to_bisulfite_genome_fastA {
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    warn "Now starting the Bowtie aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options: $bt_options)\n";
-    if ($gzip){
-      open ($fh->{fh},"gunzip -c $temp_dir$fh->{inputfile} | $path_to_bowtie $bt_options $fh->{bisulfiteIndex} - |") or die "Can't open pipe to bowtie: $!";
-    }
-    else{
-      open ($fh->{fh},"$path_to_bowtie $bt_options $fh->{bisulfiteIndex} $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie: $!"; # command for uncompressed data
-    }
-
-    # if Bowtie produces an alignment we store the first line of the output
-    $_ = $fh->{fh}->getline();
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the bowtie output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | SINGLE-END | FASTA
-sub single_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 {
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-
-    warn "Now starting the Bowtie 2 aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options: $bt2_options)\n";
-    open ($fh->{fh},"$path_to_bowtie $bt2_options -x $fh->{bisulfiteIndex} -U $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie 2: $!";
-
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else{
-	last; # no alignment output
-      }
-    }
-
-    # Bowtie 2 outputs a result line even for sequences without any alignments. We thus store the first line of the output
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the Bowtie output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefinded. This should only happen at the end of a file for Bowtie 2 output
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-
-### Bowtie 1 (default) | SINGLE-END | FASTQ
-sub single_end_align_fragments_to_bisulfite_genome_fastQ {
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastQ)\n";
-  }
-  elsif($pbat){
-    warn "Input file is $G_to_A_infile (FastQ)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastQ)\n";
-  }
-
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## the data structure above
-  if ($directional or $pbat){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    warn "Now starting the Bowtie aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options: $bt_options)\n";
-    sleep (5);
-
-    if ($gzip){
-      open ($fh->{fh},"gunzip -c $temp_dir$fh->{inputfile} | $path_to_bowtie $bowtie_options $fh->{bisulfiteIndex} - |") or die "Can't open pipe to bowtie: $!";
-    }
-    else{
-      open ($fh->{fh},"$path_to_bowtie $bowtie_options $fh->{bisulfiteIndex} $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie: $!"; # command for uncompressed data
-    }
-
-    # if Bowtie produces an alignment we store the first line of the output
-    $_ = $fh->{fh}->getline();
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the Bowtie output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | SINGLE-END | FASTQ
-sub single_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 {
-
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastQ)\n\n";
-  }
-  elsif ($pbat){
-    warn "Input file is $G_to_A_infile (FastQ)\n\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastQ)\n\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie 2 feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## the data structure above
-  if ($directional or $pbat){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-    warn "Now starting the Bowtie 2 aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options $bt2_options)\n";
-    warn "Using Bowtie 2 index: $fh->{bisulfiteIndex}\n\n";
-
-    open ($fh->{fh},"$path_to_bowtie $bt2_options -x $fh->{bisulfiteIndex} -U $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie: $!";
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      # warn "$_\n";
-      # sleep(1);
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else {
-	last;
-      }
-    }
-
-    # Bowtie 2 outputs a result line even for sequences without any alignments. We thus store the first line of the output
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the Bowtie 2 output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-      # warn "storing $id and\n$_\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefined. This should only happen at the end of a file for Bowtie 2 output
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-###########################################################################################################################################
-
-sub reset_counters_and_fhs{
-  my $filename = shift;
-  %counting=(
-	     total_meCHH_count => 0,
-	     total_meCHG_count => 0,
-	     total_meCpG_count => 0,
-	     total_meC_unknown_count => 0,
-	     total_unmethylated_CHH_count => 0,
-	     total_unmethylated_CHG_count => 0,
-	     total_unmethylated_CpG_count => 0,
-	     total_unmethylated_C_unknown_count => 0,
-	     sequences_count => 0,
-	     no_single_alignment_found => 0,
-	     unsuitable_sequence_count => 0,
-	     genomic_sequence_could_not_be_extracted_count => 0,
-	     unique_best_alignment_count => 0,
-	     low_complexity_alignments_overruled_count => 0,
-	     CT_CT_count => 0, #(CT read/CT genome, original top strand)
-	     CT_GA_count => 0, #(CT read/GA genome, original bottom strand)
-	     GA_CT_count => 0, #(GA read/CT genome, complementary to original top strand)
-	     GA_GA_count => 0, #(GA read/GA genome, complementary to original bottom strand)
-	     CT_GA_CT_count => 0, #(CT read1/GA read2/CT genome, original top strand)
-	     GA_CT_GA_count => 0, #(GA read1/CT read2/GA genome, complementary to original bottom strand)
-	     GA_CT_CT_count => 0, #(GA read1/CT read2/CT genome, complementary to original top strand)
-	     CT_GA_GA_count => 0, #(CT read1/GA read2/GA genome, original bottom strand)
-	     alignments_rejected_count => 0, # only relevant if --directional was specified
-	    );
-
-  if ($directional){
-    if ($filename =~ ','){ # paired-end files
-      @fhs=(
-	    { name => 'CTreadCTgenome',
-	      strand_identity => 'con ori forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'CTreadGAgenome',
-	      strand_identity => 'con ori reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadCTgenome',
-	      strand_identity => 'compl ori con forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadGAgenome',
-	    strand_identity => 'compl ori con reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-    else{ # single-end files
-      @fhs=(
-	    { name => 'CTreadCTgenome',
-	      strand_identity => 'con ori forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'CTreadGAgenome',
-	      strand_identity => 'con ori reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-  }
-  elsif($pbat){
-    if ($filename =~ ','){ # paired-end files
-      @fhs=(
-	    { name => 'CTreadCTgenome',
-	      strand_identity => 'con ori forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'CTreadGAgenome',
-	      strand_identity => 'con ori reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadCTgenome',
-	      strand_identity => 'compl ori con forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadGAgenome',
-	    strand_identity => 'compl ori con reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-    else{ # single-end files
-      @fhs=(
-	    { name => 'GAreadCTgenome',
-	      strand_identity => 'compl ori con forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadGAgenome',
-	      strand_identity => 'compl ori con reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-  }
-  else{
-    @fhs=(
-	  { name => 'CTreadCTgenome',
-	    strand_identity => 'con ori forward',
-	    bisulfiteIndex => $CT_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	  { name => 'CTreadGAgenome',
-	    strand_identity => 'con ori reverse',
-	    bisulfiteIndex => $GA_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	  { name => 'GAreadCTgenome',
-	    strand_identity => 'compl ori con forward',
-	    bisulfiteIndex => $CT_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	  { name => 'GAreadGAgenome',
-	    strand_identity => 'compl ori con reverse',
-	    bisulfiteIndex => $GA_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	 );
-  }
-}
-
-
-sub process_command_line{
-  my @bowtie_options;
-  my $help;
-  my $mates1;
-  my $mates2;
-  my $path_to_bowtie;
-  my $fastq;
-  my $fasta;
-  my $skip;
-  my $qupto;
-  my $phred64;
-  my $phred33;
-  my $solexa;
-  my $mismatches;
-  my $seed_length;
-  my $best;
-  my $sequence_format;
-  my $version;
-  my $quiet;
-  my $chunk;
-  my $non_directional;
-  my $ceiling;
-  my $maxins;
-  my $minins;
-  my $unmapped;
-  my $multi_map;
-  my $output_dir;
-  my $bowtie2;
-  my $vanilla;
-  my $sam_no_hd;
-  my $seed_extension_fails;
-  my $reseed_repetitive_seeds;
-  my $most_valid_alignments;
-  my $score_min;
-  my $parallel;
-  my $temp_dir;
-  my $rdg;
-  my $rfg;
-  my $non_bs_mm;
-  my $samtools_path;
-  my $bam;
-  my $gzip;
-  my $pbat;
-  my $prefix;
-  my $old_flag;
-  my $basename;
-  my $sam;
-  my $multicore;
-  my $bowtie1;
-  my $rg_tag;
-  my $rg_id;
-  my $rg_sample;
-  my $genome_folder;
-  my $singles;
-  my $ambig_bam;
-  my $cram;
-  my $cram_ref;
-  my $nucleotide_coverage;
-  my $dovetail;
-  
-  my $command_line = GetOptions ('help|man'                => \$help,
-				 '1=s'                     => \$mates1,
-				 '2=s'                     => \$mates2,
-				 'path_to_bowtie=s'        => \$path_to_bowtie,
-				 'genome_folder=s'         => \$genome_folder,
-				 'f|fasta'                 => \$fasta,
-				 'q|fastq'                 => \$fastq,
-				 's|skip=i'                => \$skip,
-				 'u|upto=i'                => \$qupto,
-				 'phred33-quals'           => \$phred33,
-				 'phred64-quals|solexa1'   => \$phred64,
-				 'solexa-quals'            => \$solexa,
-				 'n|seedmms=i'             => \$mismatches,
-				 'l|seedlen=i'             => \$seed_length,
-				 'no_best'                 => \$best,
-				 'version'                 => \$version,
-				 'quiet'                   => \$quiet,
-				 'chunkmbs=i'              => \$chunk,
-				 'non_directional'         => \$non_directional,
-				 'I|minins=i'              => \$minins,
-				 'X|maxins=i'              => \$maxins,
-				 'e|maqerr=i'              => \$ceiling,
-				 'un|unmapped'             => \$unmapped,
-				 'ambiguous'               => \$multi_map,
-				 'o|output_dir=s'          => \$output_dir,
-				 'bowtie2'                 => \$bowtie2,
-				 'bowtie1'                 => \$bowtie1,
-				 'vanilla'                 => \$vanilla,
-				 'sam-no-hd'               => \$sam_no_hd,
-				 'D=i'                     => \$seed_extension_fails,
-				 'R=i'                     => \$reseed_repetitive_seeds,
-				 'score_min=s'             => \$score_min,
-				 'most_valid_alignments=i' => \$most_valid_alignments,
-				 'p=i'                     => \$parallel,
-				 'temp_dir=s'              => \$temp_dir,
-				 'rdg=s'                   => \$rdg,
-				 'rfg=s'                   => \$rfg,
-				 'non_bs_mm'               => \$non_bs_mm,
-				 'samtools_path=s'         => \$samtools_path,
-				 'bam'                     => \$bam,
-				 'gzip'                    => \$gzip,
-				 'pbat'                    => \$pbat,
-				 'prefix=s'                => \$prefix,
-				 'old_flag'                => \$old_flag,
-				 'B|basename=s'            => \$basename,
-				 'sam'                     => \$sam,
-				 'multicore=i'             => \$multicore,
-				 'rg_tag'                  => \$rg_tag,
-				 'rg_id=s'                 => \$rg_id,
-				 'rg_sample=s'             => \$rg_sample,
-				 'se|single_end=s'         => \$singles,
-				 'ambig_bam'               => \$ambig_bam,
-				 'cram'                    => \$cram,
-				 'cram_ref=s'              => \$cram_ref,
-				 'nucleotide_coverage'     => \$nucleotide_coverage,
-				 'dovetail'                => \$dovetail,
-				);
-
-
-  ### EXIT ON ERROR if there were errors with any of the supplied options
-  unless ($command_line){
-    die "Please respecify command line options\n";
-  }
-  ### HELPFILE
-  if ($help){
-    print_helpfile();
-    exit;
-  }
-  if ($version){
-    print << "VERSION";
-
-
-          Bismark - Bisulfite Mapper and Methylation Caller.
-
-                       Bismark Version: $bismark_version
-        Copyright 2010-15 Felix Krueger, Babraham Bioinformatics
-              www.bioinformatics.babraham.ac.uk/projects/
-
-
-VERSION
-    exit;
-  }
-
-
-  ##########################
-  ### PROCESSING OPTIONS ###
-  ##########################
-
-  if ($bowtie1){
-    $bowtie2 = 0;
-  }
-  else{ # Bowtie 2 is now the default mode (as of 27 July 2015)
-    $bowtie2 = 1;
-  }
-
-  unless ($sam_no_hd){
-    $sam_no_hd =0;
-  }
-
-  ### PATH TO BOWTIE
-  ### if a special path to Bowtie 1/2 was specified we will use that one, otherwise it is assumed that Bowtie 1/2 is in the PATH
-  if ($path_to_bowtie){
-    unless ($path_to_bowtie =~ /\/$/){
-      $path_to_bowtie =~ s/$/\//;
-    }
-    if (-d $path_to_bowtie){
-      if ($bowtie2){
-	$path_to_bowtie = "${path_to_bowtie}bowtie2";
-      }
-      else{
-	$path_to_bowtie = "${path_to_bowtie}bowtie";
-      }
-    }
-    else{
-      die "The path to bowtie provided ($path_to_bowtie) is invalid (not a directory)!\n";
-    }
-  }
-  else{
-    if ($bowtie2){
-      $path_to_bowtie = 'bowtie2';
-      warn "Path to Bowtie 2 specified as: $path_to_bowtie\n";  }
-    else{
-      $path_to_bowtie = 'bowtie';
-      warn "Path to Bowtie specified as: $path_to_bowtie\n";
-    }
-  }
-
-
-  if ($sam){
-      warn "Output format manually set as SAM\n";
-  }
-  elsif($cram){
-      warn "Output format set to CRAM\n";
-      if (defined $cram_ref){
-	  warn "CRAM reference given as: '$cram_ref'\n\n";
-	  unless (-e $cram_ref){
-	      die "There is a problem with the CRAM reference '$cram_ref': $!\n\n";
-	  }
-	  
-	  # determining full path information for the cram reference
-	  if ($cram_ref =~/\//){
-	      if (chdir $cram_ref){
-		  my $absolute_cram_ref_folder = getcwd; ## making the genome folder path absolute
-		  unless ($absolute_cram_ref_folder =~/\/$/){
-		      $absolute_cram_ref_folder =~ s/$/\//;
-		  }
-	      }
-	  }
-      }
-      else{
-	  warn "CRAM reference not specified explicitely, regenerating from FastA reference files\n\n";
-      }
-  }
-  else{
-      $bam = 1;
-      warn "Output format is BAM (default)\n";
-  }
-
-  ### OUTPUT REQUESTED AS BAM FILE (default)
-  if ($bam or $cram){
-      if ($vanilla){
-	  die "Specifying BAM output is not compatible with \"--vanilla\" format. Please respecify\n\n";
-      }
-
-      ### PATH TO SAMTOOLS
-      if (defined $samtools_path){
-	  # if Samtools was specified as full command
-	  if ($samtools_path =~ /samtools$/){
-	      if (-e $samtools_path){
-		  # Samtools executable found
-	      }
-	      else{
-		  die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-	      }
-	  }
-	  else{
-	      unless ($samtools_path =~ /\/$/){
-		  $samtools_path =~ s/$/\//;
-	      }
-	      $samtools_path .= 'samtools';
-	      if (-e $samtools_path){
-		  # Samtools executable found
-	      }
-	      else{
-		  die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-	      }
-	  }
-	  
-	  warn "Alignments will be written out in BAM format. Samtools path provided as: '$samtools_path'\n";
-	  $bam = 1;
-      }
-      # Check whether Samtools is in the PATH if no path was supplied by the user
-      else{
-	  if (!system "which samtools >/dev/null 2>&1"){ # STDOUT is binned, STDERR is redirected to STDOUT. Returns 0 if samtools is in the PATH
-	      $samtools_path = `which samtools`;
-	      chomp $samtools_path;
-	      warn "Alignments will be written out in BAM format. Samtools found here: '$samtools_path'\n"; sleep(1);
-	      $bam = 1;
-	  }
-      }
-      
-      unless (defined $samtools_path){
-	  $bam = 2;
-	  warn "Did not find Samtools on the system. Alignments will be compressed with GZIP instead (.sam.gz)\n";
-      }
-      sleep (1);
-  }
-
-  ### OPTION AMBIGUOUS BAM
-  if ($ambig_bam){
-      unless ($bowtie2){
-	  die "The option --ambig_bam is only available for Bowtie2 alignments\n";
-      }
-  }
-
-
-  ####################################
-  ### PROCESSING ARGUMENTS
-
-  ### GENOME FOLDER
-  if (defined $genome_folder){ # 25 11 2015 The genome folder may now also be defined with the option --genome_folder
-    # warn "Genome folder specified with --genome_folder $genome_folder\n";
-  }
-  else{
-    $genome_folder = shift @ARGV; # mandatory
-  }
-
-  unless ($genome_folder){
-    warn "Genome folder was not specified!\n";
-    print_helpfile();
-    exit;
-  }
-
-  ### checking that the genome folder, all subfolders and the required bowtie index files exist
-  unless ($genome_folder =~/\/$/){
-    $genome_folder =~ s/$/\//;
-  }
-
-  if (chdir $genome_folder){
-    my $absolute_genome_folder = getcwd; ## making the genome folder path absolute
-    unless ($absolute_genome_folder =~/\/$/){
-      $absolute_genome_folder =~ s/$/\//;
-    }
-    warn "Reference genome folder provided is $genome_folder\t(absolute path is '$absolute_genome_folder)'\n";
-    $genome_folder = $absolute_genome_folder;
-  }
-  else{
-    die "Failed to move to $genome_folder: $!\nUSAGE: bismark [options] <genome_folder> {-1 <mates1> -2 <mates2> | <singles>} [<hits>]    (--help for more details)\n";
-  }
-
-  my $CT_dir = "${genome_folder}Bisulfite_Genome/CT_conversion/";
-  my $GA_dir = "${genome_folder}Bisulfite_Genome/GA_conversion/";
-
-  my $bt2_small_index_present = 1;
-  my $bt2_large_index_present = 1;
-
-  my $bt_small_index_present = 1;
-  my $bt_large_index_present = 1;
-
-  if ($bowtie2){ ### Bowtie 2
-
-    ### Checking for small indixes first (ending in .bt2)
-
-    # checking the integrity of $CT_dir
-    chdir $CT_dir or die "Failed to move to directory $CT_dir: $!\n";
-
-    my @CT_bowtie_index = ('BS_CT.1.bt2','BS_CT.2.bt2','BS_CT.3.bt2','BS_CT.4.bt2','BS_CT.rev.1.bt2','BS_CT.rev.2.bt2');
-    foreach my $file(@CT_bowtie_index){
-      unless (-f $file){
-	warn "The Bowtie 2 index of the C->T converted genome seems to be faulty or non-existant ('$file'). Please run the bismark_genome_preparation before running Bismark\n";
-	$bt2_small_index_present = 0;
-      }
-    }
-    # checking the integrity of $GA_dir
-    chdir $GA_dir or die "Failed to move to directory $GA_dir: $!\n";
-    my @GA_bowtie_index = ('BS_GA.1.bt2','BS_GA.2.bt2','BS_GA.3.bt2','BS_GA.4.bt2','BS_GA.rev.1.bt2','BS_GA.rev.2.bt2');
-
-    foreach my $file(@GA_bowtie_index){
-      unless (-f $file){
-	warn "The Bowtie 2 index of the G->A converted genome seems to be faulty or non-existant ('$file'). Please run bismark_genome_preparation before running Bismark\n";
-	$bt2_small_index_present = 0;
-      }
-    }
-
-    ### Using the small index preferentially
-    if ($bt2_small_index_present){
-      $bt2_large_index_present = 0;
-    }
-    else{  # only checking for large indexes if the 'normal' one can't be found
-      warn "\nCouldn't find a traditional small Bowtie 2 index for the genome specified (ending in .bt2). Now searching for a large index instead (64-bit index ending in .bt2l)...\n";
-
-      ### If no small small indexes were found we look for large indexes (64-bit indexes, ending in .bt2l)
-
-      # checking the integrity of $CT_dir
-      chdir $CT_dir or die "Failed to move to directory $CT_dir: $!\n";
-
-      @CT_bowtie_index = ('BS_CT.1.bt2l','BS_CT.2.bt2l','BS_CT.3.bt2l','BS_CT.4.bt2l','BS_CT.rev.1.bt2l','BS_CT.rev.2.bt2l');
-      foreach my $file(@CT_bowtie_index){
-	unless (-f $file){
-	  die "The Bowtie 2 index of the C->T converted genome seems to be faulty or non-existant ('$file'). Please run the bismark_genome_preparation before running Bismark\n";
-	  $bt2_large_index_present = 0;  }
-      }
-
-      ### checking the integrity of $GA_dir
-      chdir $GA_dir or die "Failed to move to directory $GA_dir: $!\n";
-      @GA_bowtie_index = ('BS_GA.1.bt2l','BS_GA.2.bt2l','BS_GA.3.bt2l','BS_GA.4.bt2l','BS_GA.rev.1.bt2l','BS_GA.rev.2.bt2l');
-
-      foreach my $file(@GA_bowtie_index){
-	unless (-f $file){
-	  die "The Bowtie 2 index of the G->A converted genome seems to be faulty or non-existant ('$file'). Please run bismark_genome_preparation before running Bismark\n";
-	  $bt2_large_index_present = 0;
-	}
-      }
-
-      if ($bt2_large_index_present){
-	warn "64-bit large genome Bowtie 2 index found...\n";
-      }
-      else{
-	die "Failed to detect either a standard (.bt2) or 64-bit (.bt2l) Bowtie 2 index for the genome specified. Please run the bismark_genome_preparation before launching Bismark\n\n";
-      }
-    }
-
-  }
-
-  else{ ### Bowtie 1
-      ### Checking for small indixes first (ending in .ebwt)
-      ### checking the integrity of $CT_dir
-      chdir $CT_dir or die "Failed to move to directory $CT_dir: $!\n";
-      my @CT_bowtie_index = ('BS_CT.1.ebwt','BS_CT.2.ebwt','BS_CT.3.ebwt','BS_CT.4.ebwt','BS_CT.rev.1.ebwt','BS_CT.rev.2.ebwt');
-      foreach my $file(@CT_bowtie_index){
-	  unless (-f $file){
-	      warn "The Bowtie index of the C->T converted genome seems to be faulty ($file doesn't exist). Please run bismark_genome_preparation --bowtie1 before running Bismark.\n";
-	      $bt_small_index_present = 0;
-	  }
-      }
-
-      ### checking the integrity of $GA_dir
-      chdir $GA_dir or die "Failed to move to directory $GA_dir: $!\n";
-      my @GA_bowtie_index = ('BS_GA.1.ebwt','BS_GA.2.ebwt','BS_GA.3.ebwt','BS_GA.4.ebwt','BS_GA.rev.1.ebwt','BS_GA.rev.2.ebwt');
-      foreach my $file(@GA_bowtie_index){
-	  unless (-f $file){
-	      warn "The Bowtie index of the G->A converted genome seems to be faulty ($file doesn't exist). Please run bismark_genome_preparation --bowtie1 before running Bismark.\n";
-	      $bt_small_index_present = 0;
-	  }
-      }
-
-      ### Using the small index preferentially
-      if ($bt_small_index_present){
-	  $bt_large_index_present = 0;
-      }
-      else{  # only checking for large indexes if the 'normal' one can't be found
-	  warn "\nCouldn't find a traditional small Bowtie index for the genome specified (ending in .ebwt). Now searching for a large index instead (64-bit index ending in .ebwtl)...\n";
-	  
-	  ### If no small small indexes were found we look for large indexes (64-bit indexes, ending in .ebwtl)
-	  
-	  ### checking the integrity of $CT_dir
-	  chdir $CT_dir or die "Failed to move to directory $CT_dir: $!\n";
-	  my @CT_bowtie_index = ('BS_CT.1.ebwtl','BS_CT.2.ebwtl','BS_CT.3.ebwtl','BS_CT.4.ebwtl','BS_CT.rev.1.ebwtl','BS_CT.rev.2.ebwtl');
-	  foreach my $file(@CT_bowtie_index){
-	      unless (-f $file){
-		  warn "The Bowtie index of the C->T converted genome seems to be faulty ($file doesn't exist). Please run bismark_genome_preparation --bowtie1 before running Bismark.\n";
-		  $bt_large_index_present = 0;
-	      }
-	  }
-	  
-	  ### checking the integrity of $GA_dir
-	  chdir $GA_dir or die "Failed to move to directory $GA_dir: $!\n";
-	  my @GA_bowtie_index = ('BS_GA.1.ebwtl','BS_GA.2.ebwtl','BS_GA.3.ebwtl','BS_GA.4.ebwtl','BS_GA.rev.1.ebwtl','BS_GA.rev.2.ebwtl');
-	  foreach my $file(@GA_bowtie_index){
-	      unless (-f $file){
-		  warn "The Bowtie index of the G->A converted genome seems to be faulty ($file doesn't exist). Please run bismark_genome_preparation --bowtie1 before running Bismark.\n";
-		  $bt_large_index_present = 0;
-	      }
-	  }
-
-	  if ($bt_large_index_present){
-	      warn "64-bit large genome Bowtie index found...\n";
-	  }
-	  else{
-	      die "Failed to detect either a standard (.ebwt) or 64-bit (.ebwtl) Bowtie index for the genome specified. Please run the bismark_genome_preparation --bowtie1 before launching Bismark\n\n";
-	  }
-      }
-      
-  }
-
-  my $CT_index_basename = "${CT_dir}BS_CT";
-  my $GA_index_basename = "${GA_dir}BS_GA";
-
-  ### INPUT OPTIONS
-
-  ### SEQUENCE FILE FORMAT
-  ### exits if both fastA and FastQ were specified
-  if ($fasta and $fastq){
-    die "Only one sequence filetype can be specified (fastA or fastQ)\n";
-  }
-
-  ### unless fastA is specified explicitely, fastQ sequence format is expected by default
-  if ($fasta){
-    print "FastA format specified\n";
-    $sequence_format = 'FASTA';
-    push @bowtie_options, '-f';
-  }
-  elsif ($fastq){
-    print "FastQ format specified\n";
-    $sequence_format = 'FASTQ';
-    push @bowtie_options, '-q';
-  }
-  else{
-    $fastq = 1;
-    print "FastQ format assumed (by default)\n";
-    $sequence_format = 'FASTQ';
-    push @bowtie_options, '-q';
-  }
-
-  ### SKIP
-  if ($skip){
-    warn "Skipping the first $skip reads from the input file\n";
-    # push @bowtie_options,"-s $skip";
-  }
-
-  ### UPTO
-  if ($qupto){
-    warn "Processing sequences up to read no. $qupto from the input file\n";
-    if ($bowtie2){
-      #      push @bowtie_options,"--upto $qupto"; ## slightly changed for Bowtie 2
-    }
-    else{
-      #     push @bowtie_options,"--qupto $qupto";
-    }
-  }
-
-  ### QUALITY VALUES
-  if (($phred33 and $phred64) or ($phred33 and $solexa) or ($phred64 and $solexa)){
-    die "You can only specify one type of quality value at a time! (--phred33-quals or --phred64-quals or --solexa-quals)";
-  }
-  if ($phred33){ ## if nothing else is specified $phred33 will be used as default by both Bowtie 1 and 2.
-    # Phred quality values work only when -q is specified
-    unless ($fastq){
-      die "Phred quality values works only when -q (FASTQ) is specified\n";
-    }
-    if ($bowtie2){
-      push @bowtie_options,"--phred33";
-    }
-    else{
-      push @bowtie_options,"--phred33-quals";
-    }
-  }
-  if ($phred64){
-    # Phred quality values work only when -q is specified
-    unless ($fastq){
-      die "Phred quality values work only when -q (FASTQ) is specified\n";
-    }
-    if ($bowtie2){
-      push @bowtie_options,"--phred64";
-    }
-    else{
-      push @bowtie_options,"--phred64-quals";
-    }
-  }
-  else{
-    $phred64 = 0;
-  }
-
-  if ($solexa){
-    if ($bowtie2){
-      die "The option '--solexa-quals' is not compatible with Bowtie 2. Please respecify!\n";
-    }
-    # Solexa to Phred value conversion works only when -q is specified
-    unless ($fastq){
-      die "Conversion from Solexa to Phred quality values works only when -q (FASTQ) is specified\n";
-    }
-    push @bowtie_options,"--solexa-quals";
-  }
-  else{
-    $solexa = 0;
-  }
-
-  ### ALIGNMENT OPTIONS
-
-  ### MISMATCHES
-  if (defined $mismatches){
-    if ($bowtie2){
-      if ($mismatches == 0 or $mismatches == 1){
-	push @bowtie_options,"-N $mismatches";
-      }
-      else{
-	die "Please set the number of multiseed mismatches for Bowtie 2 with '-N <int>' (where <int> can be 0 or 1)\n";
-      }
-    }
-    else{
-      if ($mismatches >= 0 and $mismatches <= 3){
-	push @bowtie_options,"-n $mismatches";
-      }
-      else{
-	die "Please set the number of seed mismatches for Bowtie 1 with '-n <int>' (where <int> can be 0,1,2 or 3)\n";
-      }
-    }
-  }
-  else{
-    unless ($bowtie2){
-      push @bowtie_options,"-n 1"; # setting -n to 1 by default (for use with Bowtie only) because it is much quicker than the default mode of -n 2
-    }
-  }
-
-  ### SEED LENGTH
-  if (defined $seed_length){
-    if ($bowtie2){
-      push @bowtie_options,"-L $seed_length";
-    }
-    else{
-      push @bowtie_options,"-l $seed_length";
-    }
-  }
-
-  ### MISMATCH CEILING
-  if (defined $ceiling){
-    die "The option '-e' is not compatible with Bowtie 2. Please respecify options\n" if ($bowtie2);
-    push @bowtie_options,"-e $ceiling";
-  }
-
-
-  ### BOWTIE 2 EFFORT OPTIONS
-
-  ### CONSECUTIVE SEED EXTENSION FAILS
-  if (defined $seed_extension_fails){
-    die "The option '-D <int>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    push @bowtie_options,"-D $seed_extension_fails";
-  }
-
-  ### RE-SEEDING REPETITIVE SEEDS
-  if (defined $reseed_repetitive_seeds){
-    die "The option '-R <int>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    push @bowtie_options,"-R $reseed_repetitive_seeds";
-  }
-
-
-  ### BOWTIE 2 SCORING OPTIONS
-
-  my ($score_min_intercept, $score_min_slope);
-
-  if ($score_min){
-    die "The option '--score_min <func>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-
-    unless ($score_min =~ /^L,(.+),(.+)$/){
-      die "The option '--score_min <func>' needs to be in the format <L,value,value> . Please consult \"setting up functions\" in the Bowtie 2 manual for further information\n\n";
-    }
-    ($score_min_intercept, $score_min_slope) = ($1, $2);
-    push @bowtie_options,"--score-min L,$score_min_intercept,$score_min_slope"; # default setting, more stringent than normal Bowtie2
-  }
-  else{
-    if ($bowtie2){
-      ($score_min_intercept, $score_min_slope) = (0, -0.2);
-      push @bowtie_options,"--score-min L,$score_min_intercept,$score_min_slope"; # default setting, more stringent than normal Bowtie2
-    }
-  }
-
-  ### BOWTIE 2 READ GAP OPTIONS
-  my ($insertion_open,$insertion_extend,$deletion_open,$deletion_extend);
-
-  if ($rdg){
-    die "The option '--rdg <int1>,<int2>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    if ($rdg =~ /^(\d+),(\d+)$/){
-      $deletion_open = $1;
-      $deletion_extend = $2;
-    }
-    else{
-      die "The option '--rdg <int1>,<int2>' needs to be in the format <integer,integer> . Please consult \"setting up functions\" in the Bowtie 2 manual for further information\n\n";
-    }
-    push @bowtie_options,"--rdg $rdg";
-  }
-  else{
-    $deletion_open = 5;
-    $deletion_extend = 3;
-  }
-
-  ### BOWTIE 2 REFERENCE GAP OPTIONS
-  if ($rfg){
-    die "The option '--rfg <int1>,<int2>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    if ($rfg =~ /^(\d+),(\d+)$/){
-      $insertion_open = $1;
-      $insertion_extend = $2;
-    }
-    else{
-      die "The option '--rfg <int1>,<int2>' needs to be in the format <integer,integer> . Please consult \"setting up functions\" in the Bowtie 2 manual for further information\n\n";
-    }
-    push @bowtie_options,"--rfg $rfg";
-  }
-  else{
-    $insertion_open = 5;
-    $insertion_extend = 3;
-  }
-
-
-  ### BOWTIE 2 PARALLELIZATION OPTIONS
-  if (defined $parallel){
-    die "The parallelization switch '-p' only works for Bowtie 2. Please respecify!" unless ($bowtie2);
-  }
-  if ($bowtie2){
-    if ($parallel){
-      die "Please select a value for -p of 2 or more!\n" unless ($parallel > 1);
-      if ($parallel > 4){
-	warn "Attention: using more than 4 cores per alignment thread has been reported to have diminishing returns. If possible try to limit -p to a value of 4\n"; sleep(2);
-      }
-      push @bowtie_options,"-p $parallel";
-      push @bowtie_options,'--reorder'; ## re-orders the bowtie 2 output so that it does match the input files. This is abolutely required for parallelization to work.
-      print "Each Bowtie 2 instance is going to be run with $parallel threads. Please monitor performance closely and tune down if needed!\n";
-      sleep (2);
-    }
-  }
-
-  ### REPORTING OPTIONS
-
-  if ($bowtie2){
-    push @bowtie_options,'--ignore-quals'; ## All mismatches will receive penalty for mismatches as if they were of high quality, which is 6 by default
-
-    ### Option -M is deprecated since Bowtie 2 version 2.0.0 beta7. I'll leave this option commented out for a while
-    if(defined $most_valid_alignments){
-
-      warn "\nThe option -M is now deprecated (as of Bowtie 2 version 2.0.0 beta7). What used to be called -M mode is still the default mode. Use the -D and -R options to adjust the effort expended to find valid alignments.\n\n";
-    }
-  }
-  else{ # Because of the way Bismark works we will always use the reporting option -k 2 (report up to 2 valid alignments) for Bowtie 1
-    push @bowtie_options,'-k 2';
-  }
-
-  ### --BEST
-  if ($bowtie2){
-    if ($best){    # Bowtie 2 does away with the concept of --best, so one can also not select --no-best when Bowtie 2 is to be used
-      die "The option '--no-best' is not compatible with Bowtie 2. Please respecify options\n";
-    }
-  }
-  else{
-    # --best is the default option for Bowtie 1, specifying --no-best can turn it off (e.g. to speed up alignment process)
-    unless ($best){
-      push @bowtie_options,'--best';
-    }
-  }
-
-  ### VANILLA BISMARK (BOWTIE 1) OUTPUT
-  if ($vanilla){
-    if ($bowtie2){
-      die "The options --bowtie2 and the --vanilla are not compatible. Please respecify!\n\n";
-    }
-  }
-  else{
-    $vanilla = 0;
-  }
-
-  ### PAIRED-END MAPPING
-  if ($mates1){
-      
-      if (defined $singles){ # if --single_end has been set explicitely
-	  die "You cannot set --single_end and supply files in paired-end format (-1 <mates1> -2 <mates2>). Please respecify!\n";
-      }
-      
-      my @mates1 = (split (/,/,$mates1));
-      die "Paired-end mapping requires the format: -1 <mates1> -2 <mates2>, please respecify!\n" unless ($mates2);
-      my @mates2 = (split(/,/,$mates2));
-      unless (scalar @mates1 == scalar @mates2){
-	  die "Paired-end mapping requires the same amounnt of mate1 and mate2 files, please respecify! (format: -1 <mates1> -2 <mates2>)\n";
-      }
-      while (1){
-	  my $mate1 = shift @mates1;
-	  my $mate2 = shift @mates2;
-	  last unless ($mate1 and $mate2);
-	  push @filenames,"$mate1,$mate2";
-      }
-      if ($bowtie2){
-	  push @bowtie_options,'--no-mixed';     ## By default Bowtie 2 is not looking for single-end alignments if it can't find concordant or discordant alignments
-	  push @bowtie_options,'--no-discordant';## By default Bowtie 2 is not looking for discordant alignments if it can't find concordant ones
-
-	  if ($pbat){
-	      $dovetail = 1; # setting the option $dovetail for PBAT paired-end alignments
-	  }
-
-	  if ($dovetail){
-	      if ($old_flag){
-		  die "The option  --dovetail may only be specified with the current SAM FLAG values. Please respecify...\n";
-	      }
-	      push @bowtie_options,'--dovetail';     ## 07 03 2016 Adding the option --dovetail, mainly for PBAT alignments
-	  }
-      }
-      
-      if ($old_flag){
-	  warn "\nUsing FLAG values for paired-end SAM output used up to Bismark v0.8.2. In addition, paired-end sequences will have /1 and /2 appended to their read IDs\n\n" unless($vanilla);
-	  sleep(3);
-      }
-  }
-  elsif ($mates2){
-      die "Paired-end mapping requires the format: -1 <mates1> -2 <mates2>, please respecify!\n";
-  }
-  
-  ### SINGLE-END MAPPING
-  # Single-end mapping will be performed if no mate pairs for paired-end mapping have been specified
-  
-  unless ($mates1 and $mates2){
-      if (defined $singles){ # if --single_end has been set explicitely
-	  warn "Mapping set to single-end mode (user defined). File names need to be separated by commas [,] or colons [:]! Supplied file names are: $singles\n";
-	  $singles =~ s/:/,/g; # replacing colons (:) with commas
-      }
-      else{
-	  $singles = join (',',@ARGV);
-	  unless ($singles){
-	      die "\nNo filename supplied! Please specify one or more files for single-end Bismark mapping!\n";
-	  }
-	  $singles =~ s/\s/,/g; # replacing spaces with commas
-      }
-      
-      @filenames = (split(/,/,$singles));
-      warn "\nFiles to be analysed:\n";
-      warn "@filenames\n\n";
-      sleep (3);
-  }
-
-  ### MININUM INSERT SIZE (PAIRED-END ONLY)
-  if (defined $minins){
-    die "-I/--minins can only be used for paired-end mapping!\n\n" if ($singles);
-    push @bowtie_options,"--minins $minins";
-  }
-
-  ### MAXIMUM INSERT SIZE (PAIRED-END ONLY)
-  if (defined $maxins){
-    die "-X/--maxins can only be used for paired-end mapping!\n\n" if ($singles);
-    push @bowtie_options,"--maxins $maxins";
-  }
-  else{
-    unless ($singles){
-      push @bowtie_options,'--maxins 500';
-    }
-  }
-
-  ### QUIET prints nothing  besides alignments (suppresses warnings)
-  if ($quiet){
-    push @bowtie_options,'--quiet';
-  }
-
-  ### CHUNKMBS needed to be increased to avoid memory exhaustion warnings for Bowtie 1, particularly for --best (and paired-end) alignments
-  unless ($bowtie2){ # Bowtie 2 does not have a chunkmbs option
-    if (defined $chunk){
-      push @bowtie_options,"--chunkmbs $chunk";
-    }
-    else{
-      push @bowtie_options,'--chunkmbs 512'; ## setting the default to 512MB (up from 64 default)
-    }
-  }
-
-
-  ### SUMMARY OF ALL BOWTIE OPTIONS
-  my $bowtie_options = join (' ',@bowtie_options);
-
-
-  ### STRAND-SPECIFIC LIBRARIES
-  my $directional;
-  if ($non_directional){
-    die "A library can only be specified to be either non-directional or a PBAT-Seq library. Please respecify!\n\n" if ($pbat);
-    warn "Library was specified to be not strand-specific (non-directional), therefore alignments to all four possible bisulfite strands (OT, CTOT, OB and CTOB) will be reported\n";
-    sleep (1);
-    $directional = 0;
-  }
-  elsif($pbat){
-    die "The option --pbat is currently not compatible with --gzip. Please run alignments with uncompressed temporary files, i.e. lose the option --gzip\n" if ($gzip);
-    die "The option --pbat is currently only working with FastQ files. Please respecify (i.e. lose the option -f)!\n" if ($fasta);
-
-    warn "Library was specified as PBAT-Seq (Post-Bisulfite Adapter Tagging), only performing alignments to the complementary strands (CTOT and CTOB)\n";
-    sleep (1);
-    $directional = 0;
-  }
-  else{
-    warn "Library is assumed to be strand-specific (directional), alignments to strands complementary to the original top or bottom strands will be ignored (i.e. not performed!)\n";
-    sleep (1);
-    $directional = 1; # default behaviour
-  }
-
-  ### UNMAPPEDSEQUENCE OUTPUT
-  $unmapped = 0 unless ($unmapped);
-
-  ### AMBIGUOUS ALIGNMENT SEQUENCE OUTPUT
-  $multi_map = 0 unless ($multi_map);
-
-
-  ### OUTPUT DIRECTORY
-
-  chdir $parent_dir or die "Failed to move back to current working directory\n";
-  if ($output_dir){
-    unless ($output_dir =~ /\/$/){
-      $output_dir =~ s/$/\//;
-    }
-
-    if (chdir $output_dir){
-      $output_dir = getcwd; #  making the path absolute
-      unless ($output_dir =~ /\/$/){
-	$output_dir =~ s/$/\//;
-      }
-    }
-    else{
-      mkdir $output_dir or die "Unable to create directory $output_dir $!\n";
-      warn "Created output directory $output_dir!\n\n";
-      chdir $output_dir or die "Failed to move to $output_dir\n";
-      $output_dir = getcwd; #  making the path absolute
-      unless ($output_dir =~ /\/$/){
-	$output_dir =~ s/$/\//;
-      }
-    }
-    warn "Output will be written into the directory: $output_dir\n";
-  }
-  else{
-    $output_dir = '';
-  }
-
-  ### TEMPORARY DIRECTORY for C->T and G->A transcribed files
-
-  chdir $parent_dir or die "Failed to move back to current working directory\n";
-  if ($temp_dir){
-    warn "\nUsing temp directory: $temp_dir\n";
-    unless ($temp_dir =~ /\/$/){
-      $temp_dir =~ s/$/\//;
-    }
-
-    if (chdir $temp_dir){
-      $temp_dir = getcwd; #  making the path absolute
-      unless ($temp_dir =~ /\/$/){
-	$temp_dir =~ s/$/\//;
-      }
-    }
-    else{
-      mkdir $temp_dir or die "Unable to create directory $temp_dir $!\n";
-      warn "Created temporary directory $temp_dir!\n\n";
-      chdir $temp_dir or die "Failed to move to $temp_dir\n";
-      $temp_dir = getcwd; #  making the path absolute
-      unless ($temp_dir =~ /\/$/){
-	$temp_dir =~ s/$/\//;
-      }
-    }
-    warn "Temporary files will be written into the directory: $temp_dir\n";
-  }
-  else{
-    $temp_dir = '';
-  }
-
-  ### OPTIONAL NON-BS MISMATCH OUTPUT AS EXTRA COLUMN IN SAM FILE
-  if ($non_bs_mm){
-    if ($vanilla){
-      die "Option '--non_bs_mm' may only be specified for output in SAM format. Please respecify!\n";
-    }
-  }
-
-  ### PREFIX FOR OUTPUT FILES
-  if ($prefix){
-    # removing trailing dots
-
-    $prefix =~ s/\.+$//;
-
-    warn "Using the following prefix for output files: $prefix\n\n";
-    sleep(1);
-  }
-
-  if (defined $multicore){
-    unless ($multicore > 0){
-      die "Core usage needs to be set to 1 or more (currently selected $multicore). Please respecify!\n";
-    }
-    if ($multicore > 20){
-      warn "Core usage currently set to more than 20 threads. This might fail horribly but let's see how it goes... (set value: $multicore)\n\n";
-    }
-    if ($sam){
-      die "The multicore function currently requires the output to be in BAM format, so please lose either option --sam or --multi\n";
-    }
-  }
-  else{
-    $multicore = 1; # default. Single-thread mode
-    warn "Setting parallelization to single-threaded (default)\n\n";
-  }
-
-  if ($basename and $multicore > 1){
-    die "Specifying --basename in conjuction with --multicore is currently not supported (but we are aiming to fix this soon). Please lose either --basename or --multicore to proceed\n\n";
-  }
-
-  # Read Group Tags for the @RG header
-  if (defined $rg_sample){
-    if (defined $rg_id){
-      warn "--rg_id set to '$rg_id', setting --rg_tag to TRUE\n";
-      $rg_tag++; # implicitely setting $rg_tag as well
-    }
-    else{
-      die "--rg_sample cannot be specified without without setting --rg_id. Please set both or none (which would result in the default name 'SAMPLE' for both)\n";
-    }
-  }
-
-  if ($rg_tag){ # either true because of --rg_tag, or because --rg_id/--rg_sample were defined as well
-    unless (defined $rg_id){
-      $rg_id = 'SAMPLE';
-    }
-    unless (defined $rg_sample){
-      $rg_sample = 'SAMPLE';
-    }
-  }
-
-  return ($genome_folder,$CT_index_basename,$GA_index_basename,$path_to_bowtie,$sequence_format,$bowtie_options,$directional,$unmapped,$multi_map,$phred64,$solexa,$output_dir,$bowtie2,$vanilla,$sam_no_hd,$skip,$qupto,$temp_dir,$non_bs_mm,$insertion_open,$insertion_extend,$deletion_open,$deletion_extend,$gzip,$bam,$samtools_path,$pbat,$prefix,$old_flag,$basename,$score_min_intercept,$score_min_slope,$bt2_large_index_present,$multicore,$rg_tag,$rg_id,$rg_sample,$ambig_bam,$cram,$cram_ref,$nucleotide_coverage,$dovetail);
-}
-
-
-
-sub generate_SAM_header{
-    
-    print OUT "\@HD\tVN:1.0\tSO:unsorted\n";          # @HD = header, VN = version, SO = sort order
-    if ($ambig_bam){
-	print AMBIBAM "\@HD\tVN:1.0\tSO:unsorted\n";    
-    }
-    
-    #  Unordered printing of @SQ headers
-    #  foreach my $chr (keys %chromosomes){
-    #    my $length = length ($chromosomes{$chr});
-    #    print "\@SQ\tSN:$chr\tLN:$length\n";
-    #    print OUT "\@SQ\tSN:$chr\tLN:$length\n";        # @SQ = sequence, SN = seq name, LN = length
-    #  }
-    
-    foreach my $chr (sort {$a<=>$b} keys %SQ_order){
-	# warn "$chr\t$SQ_order{$chr}\n";
-	my $length = length ($chromosomes{$SQ_order{$chr}});
-	print OUT "\@SQ\tSN:$SQ_order{$chr}\tLN:$length\n"; # @SQ = sequence, SN = seq name, LN = length   
-	if ($ambig_bam){
-	    print AMBIBAM "\@SQ\tSN:$SQ_order{$chr}\tLN:$length\n";
-	}
-    }
-
-    # 18 11 2015: Added @RG as a header line if --rg_tag or --rg_id/--rg_sample were set as well
-    if ($rg_tag){
-	print OUT "\@RG\tPL:ILLUMINA\tID:$rg_id\tSM:$rg_sample\n";  # @RG = Read Group, PL = Platform, ID: required, SM: sample, can be a description
-    }
-    
-    print OUT "\@PG\tID:Bismark\tVN:$bismark_version\tCL:\"bismark $command_line\"\n";        # @PG = program, ID = unique identifier, PN = program name name, VN = program version
-    if ($ambig_bam){
-	print AMBIBAM "\@PG\tID:Bismark\tVN:$bismark_version\tCL:\"bismark $command_line\"\n";
-    }
-}
-
-### I would like to thank the following individuals for their valuable contributions to the Bismark SAM output format:
-### O. Tam (2010), C. Whelan (2011), E. Vidal (2011), T. McBryan (2011), P. Hickey (2011), A. Dei Rossi (2014)
-
-sub single_end_SAM_output{
-
-  my ($id,$actual_seq,$methylation_call_params,$qual) = @_;
-  my $strand            = $methylation_call_params->{$id}->{alignment_strand};
-  my $chr               = $methylation_call_params->{$id}->{chromosome};	
-  my $start             = $methylation_call_params->{$id}->{position};	
-  my $stop              = $methylation_call_params->{$id}->{end_position};	
-  my $ref_seq           = $methylation_call_params->{$id}->{unmodified_genomic_sequence};
-  my $methcall          = $methylation_call_params->{$id}->{methylation_call};
-  my $read_conversion   = $methylation_call_params->{$id}->{read_conversion};
-  my $genome_conversion = $methylation_call_params->{$id}->{genome_conversion};
-  my $number_of_mismatches;
-
-  if ($bowtie2){
-    $number_of_mismatches= $methylation_call_params->{$id}->{alignment_score};	
-  }
-  else{
-    $number_of_mismatches= $methylation_call_params->{$id}->{number_of_mismatches};
-  }
-
-  ### This is a description of the bitwise FLAG field which needs to be set for the SAM file taken from: "The SAM Format Specification (v1.4-r985), September 7, 2011"
-  ## FLAG: bitwise FLAG. Each bit is explained in the following table:
-  ## Bit    Description                                                Comment                                Value
-  ## 0x1    template has multiple segments in sequencing               0: single-end 1: paired end            value: 2**0 (  1)
-  ## 0x2    each segment properly aligned according to the aligner     true only for paired-end alignments    value: 2**1 (  2)
-  ## 0x4    segment unmapped                                           ---                                           ---
-  ## 0x8    next segment in the template unmapped                      ---                                           ---
-  ## 0x10   SEQ being reverse complemented                                                                    value: 2**4 ( 16)
-  ## 0x20   SEQ of the next segment in the template being reversed                                            value: 2**5 ( 32)
-  ## 0x40   the first segment in the template                          read 1                                 value: 2**6 ( 64)
-  ## 0x80   the last segment in the template                           read 2                                 value: 2**7 (128)
-  ## 0x100  secondary alignment                                        ---                                           ---
-  ## 0x200  not passing quality controls                               ---                                           ---
-  ## 0x400  PCR or optical duplicate                                   ---                                           ---
-
-  #####
-
-  my $flag;                                                           # FLAG variable used for SAM format.
-  if ($strand eq "+"){
-    if ($read_conversion eq 'CT' and $genome_conversion eq 'CT'){
-      $flag = 0;                                                      # 0 for "+" strand (OT)
-    }
-    elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA'){
-      $flag = 16;                                                     # 16 for "-" strand (CTOB, yields information for the original bottom strand)
-    }
-    else{
-      die "Unexpected strand and read/genome conversion: strand: $strand, read conversion: $read_conversion, genome_conversion: $genome_conversion\n\n";
-    }
-  }
-  elsif ($strand eq "-"){
-    if ($read_conversion eq 'CT' and $genome_conversion eq 'GA'){
-      $flag = 16;                                                     # 16 for "-" strand (OB)
-    }
-    elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT'){
-      $flag = 0;                                                      # 0 for "+" strand (CTOT, yields information for the original top strand)
-    }
-    else{
-      die "Unexpected strand and read/genome conversion: strand: $strand, read conversion: $read_conversion, genome_conversion: $genome_conversion\n\n";
-    }
-  }
-  else{
-    die "Unexpected strand information: $strand\n\n";
-  }
-
-  #####
-
-  my $mapq;
-
-  if ($bowtie2){
-    $mapq = $methylation_call_params->{$id}->{mapq};
-  }
-  else{
-    $mapq = 255;                                                      # Mapping quality is unavailable for use with Bowtie
-  }
-
-  #####
-
-  my $cigar;
-  if ($bowtie2){
-    $cigar = $methylation_call_params->{$id}->{CIGAR};                # Actual CIGAR string reported by Bowtie 2
-  }
-  else{
-    $cigar = length($actual_seq) . "M";                               # Bowtie 1 output does not contain indels (only matches and mismatches)
-  }
-
-  #####	
-
-  my $rnext = "*";                                                    # Paired-end variable
-
-  #####
-
-  my $pnext = 0;                                                      # Paired-end variable
-
-  #####
-
-  my $tlen = 0;                                                       # Paired-end variable
-
-  #####
-
-  if ($read_conversion eq 'CT'){
-    $ref_seq = substr($ref_seq, 0, length($ref_seq) - 2);    # Removes additional nucleotides from the 3' end. This only works for the original top or bottom strands
-  }
-  else{
-    $ref_seq = substr($ref_seq, 2, length($ref_seq) - 2);    # Removes additional nucleotides from the 5' end. This works for the complementary strands in non-directional libraries
-  }
-
-  if ($strand eq '-'){
-    $actual_seq = revcomp($actual_seq);                               # Sequence represented on the forward genomic strand
-    $ref_seq = revcomp($ref_seq);                                     # Required for comparison with actual sequence
-    if ($cigar =~ /D/){
-      $methylation_call_params->{$id}->{genomic_seq_for_MD_tag} = revcomp( $methylation_call_params->{$id}->{genomic_seq_for_MD_tag} );
-    }
-    $qual = reverse $qual;                                            # if the sequence was reverse-complemented the quality string needs to be reversed as well
-  }
-
-  #####
-
-  my $hemming_dist = hemming_dist($actual_seq,$ref_seq);              # Edit distance to the reference, i.e. minimal number of one-nucleotide edits needed to transform the read string
-                                                                      # into the reference string. hemming_dist()
-  if ($bowtie2){
-    $hemming_dist += $methylation_call_params->{$id}->{indels};       # Adding the number of inserted/deleted bases which we parsed while getting the genomic sequence
-  }
-
-  my $NM_tag = "NM:i:$hemming_dist";                                  # Optional tag NM: edit distance based on nucleotide differences
-
-  #####
-
-  my $MD_tag = make_mismatch_string($actual_seq, $ref_seq,$cigar,$methylation_call_params->{$id}->{genomic_seq_for_MD_tag});    # Optional tag MD: string providing mismatched reference bases in the alignment (this does include indel information)
-  #  my $XX_tag = make_mismatch_string($actual_seq, $ref_seq);        # Optional tag XX: string providing mismatched reference bases in the alignment (NO indel information!)
-
-  #####
-
-  my $XM_tag;                                                         # Optional tag XM: Methylation Call String
-  if ($strand eq '+'){
-    $XM_tag = "XM:Z:$methcall";
-  }
-  elsif ($strand eq '-'){
-    $XM_tag = 'XM:Z:'.reverse $methcall;                              # if the sequence was reverse-complemented the methylation call string needs to be reversed as well
-  }
-
-  #####
-
-  my $XR_tag = "XR:Z:$read_conversion";                               # Optional tag XR: Read Conversion
-
-  #####
-
-  my $XG_tag = "XG:Z:$genome_conversion";                             # Optional tag XG: Genome Conversion
-
-  #####
-
-  # Optionally calculating number of mismatches for Bowtie 2 alignments
-
-  if ($non_bs_mm) {
-    if ($bowtie2) {
-
-      $number_of_mismatches =~ s/-//; # removing the minus sign	
-	
-	### if Bowtie 2 was used we need to analyse the CIGAR string whether the read contained any indels to determine the number of mismatches
-	if ($cigar =~ /(D|I)/) {
-	  # warn "$cigar\n";
-	
-	  # parsing CIGAR string
-	  my @len = split (/\D+/,$cigar); # storing the length per operation
-	  my @ops = split (/\d+/,$cigar); # storing the operation
-	  shift @ops;		# remove the empty first element
-	  die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-	
-	  foreach (0..$#len) {
-	    if ($ops[$_] eq 'M') {
-	      # warn "skipping\n";
-	      next;		# irrelevant
-	    }
-	    elsif ($ops[$_] eq 'I') {	# insertion in the read sequence
-	      $number_of_mismatches -= $insertion_open;
-	      $number_of_mismatches -= $len[$_] * $insertion_extend;
-	      # warn "Insertion: Subtracting $ops[$_], length $len[$_], open: $insertion_open, extend: $insertion_extend\n";
-	    }
-	    elsif ($ops[$_] eq 'D') {	# deletion in the read sequence
-	      $number_of_mismatches -= $deletion_open;
-	      $number_of_mismatches -= $len[$_] * $deletion_extend;
-	      # warn "Deletion: Subtracting $ops[$_], length $len[$_], open: $deletion_open, extend: $deletion_extend\n";
-	    }
-	    elsif ($cigar =~ tr/[NSHPX=]//) {	# if these (for standard mapping) illegal characters exist we die
-	      die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-	    }
-	    else {
-	      die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-	    }
-	  }
-	  # warn "Alignment score $number_of_mismatches\n";
-	  # print "Mismatches $number_of_mismatches\n\n";
-	}
-      ### Now we have InDel corrected alignment scores
-
-      ### if the actual sequence contained Ns we need to adjust the number of mismatches. Ns receive a penalty of -1, but normal mismatches receive -6. This might still break if the
-      ### sequence contained more than 5 Ns, but this should occur close to never
-
-      my $seq_N_count = $number_of_mismatches % 6; # modulo 6 will return the integer rest after the division
-      # warn "N count: $seq_N_count\n";
-      $number_of_mismatches = int ($number_of_mismatches / 6) + $seq_N_count;
-      # warn "MM    $number_of_mismatches\n";
-    }
-  }
-
-  ####
-
-  my $XA_tag = "XA:Z:$number_of_mismatches";
-
-  ####
-
-  my $read_group; # optional
-  if ($rg_tag){
-    $read_group = "RG:Z:$rg_id";
-  }
-
-  ####
-
-  # SAM format: QNAME, FLAG, RNAME, 1-based POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL, optional fields
-  ### optionally print number of non-bisulfite mismatches
-  if ($non_bs_mm){
-    if ($rg_tag){
-      print OUT join("\t",($id,$flag,$chr,$start,$mapq,$cigar,$rnext,$pnext,$tlen,$actual_seq,$qual,$NM_tag,$MD_tag,$XM_tag,$XR_tag,$XG_tag,$XA_tag,$read_group)),"\n";
-    }
-    else{
-      print OUT join("\t",($id,$flag,$chr,$start,$mapq,$cigar,$rnext,$pnext,$tlen,$actual_seq,$qual,$NM_tag,$MD_tag,$XM_tag,$XR_tag,$XG_tag,$XA_tag)),"\n";
-    }
-  }
-  else{ # default
-    # SAM format: QNAME, FLAG, RNAME, 1-based POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL, optional fields
-    if ($rg_tag){
-      print OUT join("\t",($id,$flag,$chr,$start,$mapq,$cigar,$rnext,$pnext,$tlen,$actual_seq,$qual,$NM_tag,$MD_tag,$XM_tag,$XR_tag,$XG_tag,$read_group)),"\n";
-    }
-    else{
-      print OUT join("\t",($id,$flag,$chr,$start,$mapq,$cigar,$rnext,$pnext,$tlen,$actual_seq,$qual,$NM_tag,$MD_tag,$XM_tag,$XR_tag,$XG_tag)),"\n";
-    }
-  }
-}
-
-sub paired_end_SAM_output{
-
-  my ($id,$actual_seq_1,$actual_seq_2,$methylation_call_params,$qual_1,$qual_2) = @_;
-  my $strand_1                = $methylation_call_params->{$id}->{alignment_read_1}; # Bowtie 1 only reports the read 1 alignment strand
-  my $strand_2                = $methylation_call_params->{$id}->{alignment_read_2};
-  my $chr                     = $methylation_call_params->{$id}->{chromosome};	
-  my $ref_seq_1               = $methylation_call_params->{$id}->{unmodified_genomic_sequence_1};
-  my $ref_seq_2               = $methylation_call_params->{$id}->{unmodified_genomic_sequence_2};
-  my $methcall_1              = $methylation_call_params->{$id}->{methylation_call_1};
-  my $methcall_2              = $methylation_call_params->{$id}->{methylation_call_2};
-  my $read_conversion_1       = $methylation_call_params->{$id}->{read_conversion_1};
-  my $read_conversion_2       = $methylation_call_params->{$id}->{read_conversion_2};
-  my $genome_conversion       = $methylation_call_params->{$id}->{genome_conversion};
-
-  my $id_1;
-  my $id_2;
-
-  if ($old_flag){
-    $id_1 = $id.'/1';
-    $id_2 = $id.'/2';
-  }
-  else{
-    $id_1 = $id; # appending /1 or /2 confuses some downstream programs such as Picard
-    $id_2 = $id;
-  }
-
-  # Allows all degenerate nucleotide sequences in reference genome
-  # die "Reference sequence ($ref_seq_1) contains invalid nucleotides!\n" if $ref_seq_1 =~ /[^ACTGNRYMKSWBDHVX]/i; # X are padded nucleotides in case of insertions in the read
-  # die "Reference sequence ($ref_seq_2) contains invalid nucleotides!\n" if $ref_seq_2 =~ /[^ACTGNRYMKSWBDHVX]/i;
-
-  my $index; # used to store the srand origin of the alignment in a less convoluted way
-
-  if ($read_conversion_1 eq 'CT' and $genome_conversion eq 'CT'){
-    $index = 0; ## this is OT   (original top strand)
-  }	
-  elsif ($read_conversion_1 eq 'GA' and $genome_conversion eq 'GA'){
-    $index = 1; ## this is CTOB (complementary to OB)
-  }
-  elsif ($read_conversion_1 eq 'GA' and $genome_conversion eq 'CT'){
-    $index = 2; ## this is CTOT (complementary to OT)
-  }
-  elsif ($read_conversion_1 eq 'CT' and $genome_conversion eq 'GA'){
-    $index = 3; ## this is OB   (original bottom)
-  }
-  else {
-    die "Unexpected combination of read 1 and genome conversion: $read_conversion_1 / $genome_conversion\n";
-  }
-
-  my $number_of_mismatches_1;
-  my $number_of_mismatches_2;
-
-  if ($bowtie2){ # Bowtie 2 reports always as read 1 then read 2, so this is fine
-    $number_of_mismatches_1  = $methylation_call_params->{$id}->{alignment_score_1}; # only needed for custom allele-specific output, not the default!
-    $number_of_mismatches_2  = $methylation_call_params->{$id}->{alignment_score_2};
-  }
-  else{ # Bowtie 1 reports always the leftmost read first. That means we have to reverse the strings if the first read aligned in reverse orientation
-    if ($index == 2 or $index == 3){ # CTOT or OB
-      $number_of_mismatches_1  = $methylation_call_params->{$id}->{number_of_mismatches_2}; # only needed for custom allele-specific output, not the default!
-      $number_of_mismatches_2  = $methylation_call_params->{$id}->{number_of_mismatches_1};
-    }
-    else{ # if the first read aligned in forward direction it is like for Bowtie 2
-      $number_of_mismatches_1  = $methylation_call_params->{$id}->{number_of_mismatches_1}; # only needed for custom allele-specific output, not the default!
-      $number_of_mismatches_2  = $methylation_call_params->{$id}->{number_of_mismatches_2};
-    }
-  }
-
-
-	
-  ### we need to remove 2 bp of the genomic sequence as we were extracting read + 2bp long fragments to make a methylation call at the
-  ### first or last position.
-
-  if ($index == 0 or $index == 3){ # OT or OB
-    $ref_seq_1 = substr($ref_seq_1,0,length($ref_seq_1)-2);
-    $ref_seq_2 = substr($ref_seq_2,2,length($ref_seq_2)-2);
-  }
-  else{ # CTOT or CTOB
-    $ref_seq_1 = substr($ref_seq_1,2,length($ref_seq_1)-2);
-    $ref_seq_2 = substr($ref_seq_2,0,length($ref_seq_2)-2);
-  }
-
-  #####
-
-  my $start_read_1;
-  my $start_read_2;
-  # adjusting end positions
-
-  if ($bowtie2){
-    $start_read_1 = $methylation_call_params->{$id}->{position_1};
-    $start_read_2 = $methylation_call_params->{$id}->{position_2};
-  }
-  else{ # Bowtie 1 output. $strand_1 stores the alignment of Read 1
-    if ($strand_1 eq '+'){ # Read 1 aligns to the + strand
-      $start_read_1 = $methylation_call_params->{$id}->{start_seq_1};
-      $start_read_2 = $methylation_call_params->{$id}->{alignment_end} - length ($actual_seq_2) + 1;
-    }
-    else{ # read 1 is on the - strand
-      $start_read_1 = $methylation_call_params->{$id}->{alignment_end} - length ($actual_seq_1) + 1;
-      $start_read_2 = $methylation_call_params->{$id}->{start_seq_1};
-    }
-  }
-
-  #####
-
-  my $end_read_1;
-  my $end_read_2;
-  # adjusting end positions
-
-  if ($bowtie2){
-    $end_read_1 = $methylation_call_params->{$id}->{end_position_1};
-    $end_read_2 = $methylation_call_params->{$id}->{end_position_2};
-  }
-  else{ # Bowtie 1 output. $strand_1 stores the alignment of Read 1
-    if ($strand_1 eq '+'){ # Read 1 aligns to the + strand
-      $end_read_1 = $methylation_call_params->{$id}->{start_seq_1} + length ($actual_seq_1)-1;
-      $end_read_2 = $methylation_call_params->{$id}->{alignment_end};
-      }
-    else{
-      $end_read_1 = $methylation_call_params->{$id}->{alignment_end};
-      $end_read_2 = $methylation_call_params->{$id}->{start_seq_1} + length ($actual_seq_2)-1;
-    }
-  }
-
-  #####
-
-  ### This is a description of the bitwise FLAG field which needs to be set for the SAM file taken from: "The SAM Format Specification (v1.4-r985), September 7, 2011"
-  ## FLAG: bitwise FLAG. Each bit is explained in the following table:
-  ## Bit    Description                                                Comment                                Value
-  ## 0x1    template having multiple segments in sequencing            0: single-end 1: paired end            value: 2^^0 (  1)
-  ## 0x2    each segment properly aligned according to the aligner     true only for paired-end alignments    value: 2^^1 (  2)
-  ## 0x4    segment unmapped                                           ---                                           ---
-  ## 0x8    next segment in the template unmapped                      ---                                           ---
-  ## 0x10   SEQ being reverse complemented                             - strand alignment                     value: 2^^4 ( 16)
-  ## 0x20   SEQ of the next segment in the template being reversed     + strand alignment                     value: 2^^5 ( 32)
-  ## 0x40   the first segment in the template                          read 1                                 value: 2^^6 ( 64)
-  ## 0x80   the last segment in the template                           read 2                                 value: 2^^7 (128)
-  ## 0x100  secondary alignment                                        ---                                           ---
-  ## 0x200  not passing quality controls                               ---                                           ---
-  ## 0x400  PCR or optical duplicate                                   ---                                           ---
-
-  ### As the FLAG value do not consider that there might be 4 different bisulfite strands of DNA, we are trying to make FLAG tags which take the strand identity into account
-
-  # strands OT and CTOT will be treated as aligning to the top strand (both sequences are scored as aligning to the top strand)
-  # strands OB and CTOB will be treated as aligning to the bottom strand (both sequences are scored as reverse complemented sequences)
-
-  my $flag_1;                                                            # FLAG variable used for SAM format
-  my $flag_2;
-
-  ### The new default FLAG values were changed on 21 07 2015, so that reads do not ignored as discordant reads by the new SeqMonk BAM import
-  ### In essence we are going to flip the R1 R2 flags around for CTOT and CTOB reads. We still report the first and second read in the same
-  ### order and only change the actual FLAG value. This should not affect the methylation extraction in any way
-
-  if ($index == 0){       # OT
-    unless ($old_flag){
-      $flag_1 = 99;                                                      # Read 1 is on the + strand and Read 2 is reversed  (1+2+32+64)
-      $flag_2 = 147;                                                     # Read 2 is reverse complemented but informative for the OT  (1+2+16+128)
-    }
-    else{
-      $flag_1 = 67;                                                      # Read 1 is on the + strand  (1+2+64) (Read 2 is technically reverse-complemented, but we do not score it)
-      $flag_2 = 131;                                                     # Read 2 is on - strand but informative for the OT        (1+2+128)
-    }
-  }
-  elsif ($index == 1){    # CTOB
-    unless($old_flag){
-      $flag_1 = 163;                                                     # Read 1 is on the forward strand (CTOB) and Read 2 is reverse complemented but we swap round the FLAG
-                                                                         # for R1 and R2 so that we don't end up with discordant pairs
-                                                                         # So Read 1 gets Paired read, mapped in proper pair, mate is reversed and second in pair  (1+2+32+128)
-      $flag_2 = 83;                                                      # Read 2 gets Read paired, mapped in proper pair, first in pair and Read 2 is reversed  (1+2+16+64)
-    }
-    else{
-      $flag_1 = 115;                                                     # Read 1 is on the + strand, we score for OB  (1+2+16+32+64)
-      $flag_2 = 179;                                                     # Read 2 is on the - strand  (1+2+16+32+128)
-    }
-  }
-  elsif ($index == 2){    # CTOT
-    unless ($old_flag){
-      $flag_1 = 147;                                                     # Read 1 is reverse complemented (CTOT) and Read 2 is the forward read
-                                                                         # but we swap round the FLAG for R1 and R2 so that we do not end up with discordant pairs
-                                                                         # So Read 1 gets Read paired, read mapped in proper pair, read reverse complemented and second in pair (1+2+32+128)
-      $flag_2 = 99;                                                      # Read 2 gets Read paired, read mapped in proper pair, mate reverse strand and First in Pair (1+2+32+64)
-    }
-    else{
-      $flag_1 = 67;                                                      # Read 1 is on the - strand (CTOT) strand, but we score it for OT (1+2+64)
-      $flag_2 = 131;                                                     # Read 2 is on the + strand, score it for OT (1+2+128)
-    }
-  }
-  elsif ($index == 3){    # OB
-    unless ($old_flag){
-      $flag_1 = 83;                                                      # Read 1 is on the - strand, mapped in proper pair and Read 1 is reversed  (1+2+16+64)
-      $flag_2 = 163;                                                     # Read 2 is on the - strand, mapped in proper pair and Read 1 is reversed  (1+2+32+128)
-    }
-    else{
-      $flag_1 = 115;                                                     # Read 1 is on the - strand, we score for OB  (1+2+16+32+64)
-      $flag_2 = 179;                                                     # Read 2 is on the + strand  (1+2+16+32+128)
-    }
-  }
-
-  #####
-
-  my $mapq;
-
-  if ($bowtie2){
-    $mapq = $methylation_call_params->{$id}->{mapq};
-  }
-  else{
-    $mapq = 255;                                                       # Mapping quality is unavailable for use with Bowtie
-  }
-
-  #####
-
-  my $cigar_1;
-  my $cigar_2;
-
-  if ($bowtie2){
-      $cigar_1 = $methylation_call_params->{$id}->{CIGAR_1};             # Actual CIGAR string reported by Bowtie 2
-      $cigar_2 = $methylation_call_params->{$id}->{CIGAR_2};
-  }
-  else{
-      $cigar_1 = length($actual_seq_1) . "M";                            # Assume no indels for Bowtie 1  mapping (only matches and mismatches)
-      $cigar_2 = length($actual_seq_2) . "M";
-  }
-
-  #####
-
-  my $rnext = '=';                                                     # Chromosome of mate; applies to both reads
-
-  #####
-
-  my $pnext_1 = $start_read_2;                                         # Leftmost position of mate
-  my $pnext_2 = $start_read_1;
-
-  #####
-
-  my $tlen_1;                                                          # signed observed Template LENgth (or inferred fragment size)
-  my $tlen_2;
-  
-  if ($bowtie2){
-      
-      if ($start_read_1 <= $start_read_2){
-	  
-	  # Read 1 alignment is leftmost
-	  
-	  if ($end_read_2 >= $end_read_1){
-	      
-	      if ($flag_1 == 83 and $dovetail){   # R1 has a reverse orientation
-		  #         ----------------->     read 2   reads are dovetailing, that is one mate alignment extends past the beginning of the other 
-		  #  <-------------------          read 1   such that the wrong mate begins upstream
-		  # warn "FLAG 1: $flag_1\nFLAG 2: $flag_2\n";
-		  # warn "Reads are dovetailing\n";
-		  $tlen_1 = $start_read_1 - $end_read_2 - 1;     # Read 1 still receives a - sign even though it is the leftmost one
-		  $tlen_2 = $end_read_2 - $start_read_1 + 1;     # Read 2 receives a + sign,
-		  # warn "TLEN 1: $tlen_1\nTLEN 2: $tlen_2\n";
-	      }
-	      else{     
-		  # ------------->                 read 1   reads not overlapping
-		  #                 <----------    read 2
-		  #             or
-		  # ------------------->           read 1   reads overlapping
-		  #        <-------------------    read 2
-		  #             or
-		  # ------------------------->     read 1
-		  #   <-----------------------     read 2   read 2 contained within read 1
-		  #             or
-		  # ------------------------->     read 1   reads 1 and 2 exactly overlapping
-		  # <-------------------------     read 2
-		  #
-		  
-		  $tlen_1 = $end_read_2 - $start_read_1 + 1;                         # Leftmost read has a + sign,
-		  $tlen_2 = $start_read_1 - $end_read_2 - 1;                         # Rightmost read has a - sign
-	   	  # warn "Reads are non/overlapping\nTLEN 1: $tlen_1\nTLEN 2: $tlen_2\n";
-	      }
-	  }
-	  elsif ($end_read_2 < $end_read_1){
-	      
-	      # ------------------------->     read 1
-	      #       <-----------             read 2   read 2 contained within read 1
-	      #
-	      # or
-	      #
-	      # ------------------------->     read 1
-	      # <------------------------      read 2   read 2 contained within read 1
-	      
-	      # start and end of read 2  are fully contained within read 1, using the length of read 1 for the TLEN variable
-	      $tlen_1 = $end_read_1 - $start_read_1 + 1;          # Set to length of read 1   Leftmost read has a + sign,
-	      $tlen_2 = ($end_read_1 - $start_read_1 + 1) * -1;   # Set to length of read 1   Rightmost read has a - sign. well this is debatable. Changed this
-	      ### as a request by frozenlyse on SeqAnswers on 24 July 2013
-	  }
-	  
-      }
-      
-      elsif ($start_read_2 < $start_read_1){
-
-	  # Read 2 alignment is leftmost
-	  
-	  if ($end_read_1 >= $end_read_2){
-	      
-	      # Read 2 alignment is leftmost
-	      if ($flag_1 == 99 and $dovetail){   # R1 has a forward orientation
-
-		  #         ----------------->     read 1   reads are dovetailing, that is one mate alignment extends past the beginning of the other 
-		  #  <-------------------          read 2   such that the wrong mate begins upstream
-
-		  # warn "FLAG 1: $flag_1\nFLAG 2: $flag_2\n";
-		  # warn "Reads are dovetailing\n";
-		  $tlen_1 = $end_read_1 - $start_read_2 + 1;     # Read 1 still receives a + sign even though it is not leftmost
-		  $tlen_2 = $start_read_2 - $end_read_1 - 1;   
-		  # warn "TLEN 1: $tlen_1\nTLEN 2: $tlen_2\n";
-	      }
-	      else{
-		  # ------------->                 read 2   reads not overlapping
-		  #                 <----------    read 1
-		  #             or
-	   	  # ------------------------->     read 2   reads overlapping
-		  #  <-------------------------    read 1
-		  #             or
-		  # ------------------------->     read 2
-		  #   <-----------------------     read 1   read 1 contained within read 2
-		  #             or
-		  # ------------------------->     read 2
-		  #   <-----------------------     read 1   read 1 contained within read 2
-		  # warn "FLAG 1: $flag_1\nFLAG 2: $flag_2\n";
-		  # warn "Read 2 has a forward orientation\n";	  
-		  $tlen_2 = $end_read_1 - $start_read_2 + 1;                         # Leftmost read has a + sign,
-		  $tlen_1 = $start_read_2 - $end_read_1 - 1;                         # Rightmost read has a - sign
-	      }
-	  }
-	  elsif ($end_read_1 < $end_read_2){
-	      
-	      # ------------------------->     read 2
-	      #       <-----------             read 1   read 1 contained within read 2
-	      #
-	      # or
-	      #
-	      # ------------------------->     read 2
-	      #  <------------------------      read 1   read 1 contained within read 2
-	      
-	      # start and end of read 1  are fully contained within read 2, using the length of read 2 for the TLEN variable
-	      $tlen_1 = ($end_read_2 - $start_read_2 + 1) * -1;          # Set to length of read 2   Shorter read receives a - sign,
-	      $tlen_2 = $end_read_2 - $start_read_2 + 1;                 # Set to length of read 2   Longer read receives a +. Well this is debatable. Changed this
-	      ### as a request by frozenlyse on SeqAnswers on 24 July 2013
-	  }
-      }
-  }
-
-  else{ # Bowtie 1
-
-    if ($end_read_2 >= $end_read_1){
-      # Read 1 alignment is leftmost
-      # ------------------------->  read 1
-      #  <------------------------- read 2
-      # this is the most extreme case for Bowtie 1 alignments, reads do not contain each other, also no dovetailing
-
-      $tlen_1 = $end_read_2 - $start_read_1 + 1;                         # Leftmost read has a + sign,
-      $tlen_2 = $start_read_1 - $end_read_2 - 1;                         # Rightmost read has a - sign
-    }
-    else{
-      # Read 2 alignment is leftmost
-      # ------------------------->  read 2
-      #  <------------------------- read 1
-      # this is the most extreme case for Bowtie 1 alignments, reads do not contain each other, also no dovetailing
-
-      $tlen_2 = $end_read_1 - $start_read_2 + 1;                         # Leftmost read has a + sign,
-      $tlen_1 = $start_read_2 - $end_read_1 - 1;                         # Rightmost read has a - sign
-    }
-  }
-
-  #####
-
-  # adjusting the strand of the sequence before we use them to generate mismatch strings
-  if ($strand_1 eq '-'){
-    $actual_seq_1 = revcomp($actual_seq_1);                            # Sequence represented on the forward genomic strand
-    $ref_seq_1 = revcomp($ref_seq_1);                                  # Required for comparison with actual sequence
-    if ($cigar_1 =~ /D/){
-      $methylation_call_params->{$id}->{genomic_seq_for_MD_tag_1} = revcomp( $methylation_call_params->{$id}->{genomic_seq_for_MD_tag_1} );
-    }
-    $qual_1 = reverse $qual_1;                                         # we need to reverse the quality string as well
-  }
-  if ($strand_2 eq '-'){
-    $actual_seq_2 = revcomp($actual_seq_2);                            # Mate sequence represented on the forward genomic strand
-    $ref_seq_2 = revcomp($ref_seq_2);                                  # Required for comparison with actual sequence
-    if ($cigar_2 =~ /D/){
-      $methylation_call_params->{$id}->{genomic_seq_for_MD_tag_2} = revcomp( $methylation_call_params->{$id}->{genomic_seq_for_MD_tag_2} );
-    }
-    $qual_2 = reverse $qual_2;                                         # If the sequence gets reverse complemented we reverse the quality string as well
-  }
-
-  #  print "$actual_seq_1\n$ref_seq_1\n\n";
-  #  print "$actual_seq_2\n$ref_seq_2\n\n";
-
-  #####
-
-  my $hemming_dist_1 = hemming_dist($actual_seq_1,$ref_seq_1);         # Minimal number of one-nucleotide edits needed to transform the read string into the reference sequence
-  my $hemming_dist_2 = hemming_dist($actual_seq_2,$ref_seq_2);
-  if ($bowtie2){
-    $hemming_dist_1 += $methylation_call_params->{$id}->{indels_1};    # Adding the number of inserted/deleted bases which we parsed while getting the genomic sequence
-    $hemming_dist_2 += $methylation_call_params->{$id}->{indels_2};    # Adding the number of inserted/deleted bases which we parsed while getting the genomic sequence
-  }
-  my $NM_tag_1 = "NM:i:$hemming_dist_1";                               # Optional tag NM: edit distance based on nucleotide differences
-  my $NM_tag_2 = "NM:i:$hemming_dist_2";                               # Optional tag NM: edit distance based on nucleotide differences
-
-  #####
-
-  my $MD_tag_1 = make_mismatch_string($actual_seq_1,$ref_seq_1,$cigar_1,$methylation_call_params->{$id}->{genomic_seq_for_MD_tag_1}); # Optional tag MD: String providing mismatched reference bases in the alignment (including indel information)
-  my $MD_tag_2 = make_mismatch_string($actual_seq_2,$ref_seq_2,$cigar_2,$methylation_call_params->{$id}->{genomic_seq_for_MD_tag_2});
-
-  #  my $XX_tag_1 = make_mismatch_string($actual_seq_1,$ref_seq_1);       # Optional tag XX: String providing mismatched reference bases in the alignment (NO indel information!)
-  #  my $XX_tag_2 = make_mismatch_string($actual_seq_2,$ref_seq_2);
-
-  #####
-
-  my $XM_tag_1;                                                        # Optional tag XM: Methylation call string
-  my $XM_tag_2;
-
-  if ($strand_1 eq '-'){
-    $XM_tag_1 = 'XM:Z:'.reverse $methcall_1;                           # Needs to be reversed if the sequence was reverse complemented
-  }
-  else{
-    $XM_tag_1 = "XM:Z:$methcall_1";
-  }
-
-  if ($strand_2 eq '-'){
-    $XM_tag_2 = 'XM:Z:'.reverse $methcall_2;                           # Needs to be reversed if the sequence was reverse complemented
-  }
-  else{
-    $XM_tag_2 = "XM:Z:$methcall_2";
-  }
-
-  #####
-
-  my $XR_tag_1 = "XR:Z:$read_conversion_1";                            # Optional tag XR: Read 1 conversion state
-  my $XR_tag_2 = "XR:Z:$read_conversion_2";                            # Optional tag XR: Read 2 conversion state
-
-  #####
-
-  my $XG_tag = "XG:Z:$genome_conversion";                              # Optional tag XG: Genome Conversion state; valid for both reads
-
-  #####
-
-  # Optionally calculating number of mismatches for Bowtie 2 alignments
-
-  if ($non_bs_mm) {
-    if ($bowtie2) {
-
-      $number_of_mismatches_1 =~ s/-//; # removing the minus sign	
-      $number_of_mismatches_2 =~ s/-//;
-
-      ### if Bowtie 2 was used we need to analyse the CIGAR strings whether the reads contained any indels to determine the number of mismatches
-
-      ### CIGAR 1
-      if ($cigar_1 =~ /(D|I)/) {
-	# warn "$cigar_1\n";
-
-	# parsing CIGAR string
-	my @len = split (/\D+/,$cigar_1); # storing the length per operation
-	my @ops = split (/\d+/,$cigar_1); # storing the operation
-	shift @ops;		# remove the empty first element
-	die "CIGAR string '$cigar_1' contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-	
-	foreach (0..$#len) {
-	  if ($ops[$_] eq 'M') {
-	    # warn "skipping\n";
-	    next;		# irrelevant
-	  }
-	  elsif ($ops[$_] eq 'I') {	# insertion in the read sequence
-	    $number_of_mismatches_1 -= $insertion_open;
-	    $number_of_mismatches_1 -= $len[$_] * $insertion_extend;
-	    # warn "Insertion: Subtracting $ops[$_], length $len[$_], open: $insertion_open, extend: $insertion_extend\n";
-	  }
-	  elsif ($ops[$_] eq 'D') {	# deletion in the read sequence
-	    $number_of_mismatches_1 -= $deletion_open;
-	    $number_of_mismatches_1 -= $len[$_] * $deletion_extend;
-	    # warn "Deletion: Subtracting $ops[$_], length $len[$_], open: $deletion_open, extend: $deletion_extend\n";
-	  }
-	  elsif ($cigar_1 =~ tr/[NSHPX=]//) {	# if these (for standard mapping) illegal characters exist we die
-	    die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-	  }
-	  else {
-	    die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-	  }
-	}
-
-	# warn "Alignment score $number_of_mismatches_1\n";
-	# print "Mismatches $number_of_mismatches_1\n\n";
-      }
-
-      ### CIGAR 2
-      if ($cigar_2 =~ /(D|I)/) {
-	# warn "$cigar_2\n";
-
-	# parsing CIGAR string
-	my @len = split (/\D+/,$cigar_2); # storing the length per operation
-	my @ops = split (/\d+/,$cigar_2); # storing the operation
-	shift @ops;		# remove the empty first element
-	die "CIGAR string '$cigar_2' contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-	
-	foreach (0..$#len) {
-	  if ($ops[$_] eq 'M') {
-	    # warn "skipping\n";
-	    next; #irrelevant
-	  }
-	  elsif ($ops[$_] eq 'I') {	# insertion in the read sequence
-	    $number_of_mismatches_2 -= $insertion_open;
-	    $number_of_mismatches_2 -= $len[$_] * $insertion_extend;
-	    # warn "Insertion: Subtracting $ops[$_], length $len[$_], open: $insertion_open, extend: $insertion_extend\n";
-	  }
-	  elsif ($ops[$_] eq 'D') {	# deletion in the read sequence
-	    $number_of_mismatches_2 -= $deletion_open;
-	    $number_of_mismatches_2 -= $len[$_] * $deletion_extend;
-	    # warn "Deletion: Subtracting $ops[$_], length $len[$_], open: $deletion_open, extend: $deletion_extend\n";
-	  }
-	  elsif ($cigar_2 =~ tr/[NSHPX=]//) {	# if these (for standard mapping) illegal characters exist we die
-	    die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-	  }
-	  else {
-	    die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-	  }
-	}
-      }
-
-      ### Now we have InDel corrected Alignment scores
-
-      ### if the actual sequence contained Ns we need to adjust the number of mismatches. Ns receive a penalty of -1, but normal mismatches receive -6. This might still break if the
-      ### sequence contained more than 5 Ns, but this should occur close to never
-
-      my $seq_1_N_count = $number_of_mismatches_1 % 6; # modulo 6 will return the integer rest after the division
-      my $seq_2_N_count = $number_of_mismatches_2 % 6;
-      #   warn "N count 1: $seq_1_N_count\n";
-      #   warn "N count 2: $seq_2_N_count\n";
-
-      $number_of_mismatches_1 = int ($number_of_mismatches_1 / 6) + $seq_1_N_count;
-      $number_of_mismatches_2 = int ($number_of_mismatches_2 / 6) + $seq_2_N_count;
-
-      # warn "MM1    $number_of_mismatches_1 \n";
-      # warn "MM2    $number_of_mismatches_2 \n";
-    }
-  }
-
-  ####
-
-  my $XA_tag = "XA:Z:$number_of_mismatches_1";
-  my $XB_tag = "XB:Z:$number_of_mismatches_2";
-
-  ####
-
-  my $read_group; # optional
-  if ($rg_tag){
-    $read_group = "RG:Z:$rg_id";
-  }
-
-  ####
-
-  # SAM format: QNAME, FLAG, RNAME, 1-based POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL, optional fields
-  ### optionally print number of non-bisulfite mismatches
-  if ($non_bs_mm){
-    if ($rg_tag){
-      print OUT join("\t", ($id_1, $flag_1, $chr, $start_read_1, $mapq, $cigar_1, $rnext, $pnext_1, $tlen_1, $actual_seq_1, $qual_1, $NM_tag_1, $MD_tag_1, $XM_tag_1,$XR_tag_1,$XG_tag,$XA_tag,$read_group)), "\n";
-      print OUT join("\t", ($id_2, $flag_2, $chr, $start_read_2, $mapq, $cigar_2, $rnext, $pnext_2, $tlen_2, $actual_seq_2, $qual_2, $NM_tag_2, $MD_tag_2, $XM_tag_2,$XR_tag_2,$XG_tag,$XB_tag,$read_group)), "\n";
-    }
-    else{
-      print OUT join("\t", ($id_1, $flag_1, $chr, $start_read_1, $mapq, $cigar_1, $rnext, $pnext_1, $tlen_1, $actual_seq_1, $qual_1, $NM_tag_1, $MD_tag_1, $XM_tag_1,$XR_tag_1,$XG_tag,$XA_tag)), "\n";
-      print OUT join("\t", ($id_2, $flag_2, $chr, $start_read_2, $mapq, $cigar_2, $rnext, $pnext_2, $tlen_2, $actual_seq_2, $qual_2, $NM_tag_2, $MD_tag_2, $XM_tag_2,$XR_tag_2,$XG_tag,$XB_tag)), "\n";
-    }
-  }
-  else{ # default
-    if ($rg_tag){
-      print OUT join("\t", ($id_1, $flag_1, $chr, $start_read_1, $mapq, $cigar_1, $rnext, $pnext_1, $tlen_1, $actual_seq_1, $qual_1, $NM_tag_1, $MD_tag_1, $XM_tag_1,$XR_tag_1,$XG_tag,$read_group)), "\n";
-      print OUT join("\t", ($id_2, $flag_2, $chr, $start_read_2, $mapq, $cigar_2, $rnext, $pnext_2, $tlen_2, $actual_seq_2, $qual_2, $NM_tag_2, $MD_tag_2, $XM_tag_2,$XR_tag_2,$XG_tag,$read_group)), "\n";
-    }
-    else{
-      print OUT join("\t", ($id_1, $flag_1, $chr, $start_read_1, $mapq, $cigar_1, $rnext, $pnext_1, $tlen_1, $actual_seq_1, $qual_1, $NM_tag_1, $MD_tag_1, $XM_tag_1,$XR_tag_1,$XG_tag)), "\n";
-      print OUT join("\t", ($id_2, $flag_2, $chr, $start_read_2, $mapq, $cigar_2, $rnext, $pnext_2, $tlen_2, $actual_seq_2, $qual_2, $NM_tag_2, $MD_tag_2, $XM_tag_2,$XR_tag_2,$XG_tag)), "\n";
-    }
-  }
-}
-
-
-sub revcomp{
-  my $seq = shift or die "Missing seq to reverse complement\n";
-  $seq = reverse $seq;
-  $seq =~ tr/ACTGactg/TGACTGAC/;
-  return $seq;
-}
-
-sub hemming_dist{
-  my $matches = 0;
-  my @actual_seq = split //,(shift @_);
-  my @ref_seq = split //,(shift @_);
-
-  foreach (0..$#actual_seq){
-    ++$matches if ($actual_seq[$_] eq $ref_seq[$_]);
-  }
-  return my $hd = scalar @actual_seq - $matches;
-}
-
-
-### Getting rid of the bitwise comparison because even though the initial comparison is nice and quick, the regex loop looking for non-null bytes characters isn't. We might
-### as well do a substring loop to start with, which enables us to generate proper MD:Z: flags that also take proper care of InDels
-### 05 June 2014
-
-
-sub make_mismatch_string{
-  my ($actual_seq,$ref_seq,$cigar,$md_sequence) = @_;
-
-  my $MD_tag = "MD:Z:";
-  my $prev_matching = 0;
-  my $last_char;
-
-  my $ref_base;
-  my $actual_base;
-
-  foreach my $pos ( 0..(length$actual_seq) - 1 ){
-
-    $actual_base = substr($actual_seq,$pos,1);
-    $ref_base    = substr($ref_seq,$pos,1);
-    # if ($verbose){ warn "reference: $ref_base\tseen base: $actual_base\n";}
-
-    if ( $actual_base eq $ref_base ){
-      ++$prev_matching;
-    }
-    else{
-      # If the mismatch is due to an insertion we simply move on, else we print the previously matching bases as well as the mismatching genomic base
-      if ($ref_base eq 'X'){
-	# if ($verbose){ warn "The genome base was an artificually padded '$ref_base' due to an insertion in the read at this position. Just ignoring it for the MD tag\n"; sleep(1);}
-      }
-      else{
-	# if ($verbose){ warn "previous matching bases: $prev_matching\n";}
-
-	### There is a mismatch between the sequence and the genome. First we need to write out how may bases matched until now
-	if ($prev_matching == 0){
-	  # if ($verbose){ warn "Got a mismatch either at the very start or next to another mismatch. Need to add a padding 0 as well as the mismatch\n";}
-	  # if ($verbose){ warn "${prev_matching}$ref_base\n";}
-	  $MD_tag .= $prev_matching;
-	  $MD_tag .= $ref_base;
-	}
-	else{
-	  # if ($verbose){ warn "${prev_matching}$ref_base\n";}
-	  $MD_tag .= $prev_matching;
-	  $MD_tag .= $ref_base;
-	}
-	
-	$prev_matching = 0; # resetting $prev_matching
-      }
-
-    }
-
-  }
-  ### appending the number of matches one last time
-  $MD_tag .= $prev_matching;
-
-
-  ### If the read contains deletion(s) we need to take care of these in the MD-tag as well
-  if ($cigar =~ /D/){
-    my $deletions_total = 0;
-    while ($cigar =~ /D/g){
-      ++$deletions_total;
-    }
-    if ($verbose){ warn "Read contains $deletions_total deletions in total\n\n";}
-
-    if ($verbose){ warn "There was a deletion in the read!\n";}
-    if ($verbose){ warn "actual:\t$actual_seq\nref:\t$ref_seq\nMD-seq:\t$md_sequence\nMD-tag: $MD_tag\n";}
-
-    # parsing CIGAR string
-    my @len = split (/\D+/,$cigar); # storing the length per operation
-    my @ops = split (/\d+/,$cigar); # storing the operation
-    shift @ops; # remove the empty first element
-    die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-    my $MD_pos_so_far = 0;
-    my $deletions_processed = 0;
-    my $del_pos = 0;
-    my $deleted_bases = '';
-    my $new_MD = $1 if ($MD_tag =~ /MD:Z:(.*)/);
-    my $md_index_already_processed;
-
-    my @md = split //,$new_MD;
-
-    if ($verbose){ warn "New MD-tag:  $new_MD\n\n";}
-    $MD_tag = "MD:Z:"; ### reconstituting a new MD-tag
-    $new_MD = ''; # using this to build up a new string that will replace the old \@md
-
-    if ($verbose){ warn "CIGAR string; $cigar\n";}
-    ### determining end position of a read
-    foreach my $index(0..$#len){
-
-      if ($ops[$index] eq 'M'){  # matching bases
-	$del_pos += $len[$index];
-	if ($verbose){ warn "Operation is 'M', adding $len[$index] bp\n";}
-      }
-      elsif($ops[$index] eq 'I'){ # insertion
-	$del_pos += $len[$index];
-	### need to add insertions in the read to MD pos so far!
-	$MD_pos_so_far += $len[$index];
-	if ($verbose){ warn "Operation is 'I',  adding $len[$index] bp\n";}
-	}
-      elsif($ops[$index] eq 'D'){ # deletion
-	if ($verbose){ warn "Operation is 'D', extracting $len[$index] bp\n";}
-	$deleted_bases = substr($md_sequence,$del_pos,$len[$index]);
-	if ($verbose){ warn "Deleted bases: $deleted_bases\n\n";}
-
-	### Now we need to process the MD-tag so far and write out everything up until this point, inlcuding the deletion
-	if ($verbose){ warn "Now processing the MD-tag\n";}
-	my $op;
-
-	my $this_deletion_processed;
-	my $md_processed_so_far;
-	my $current_md_index;
-
-  	foreach my $el (@md){
-	
-	  unless (defined $current_md_index){
-	    $current_md_index = 0; # first element = index 0
-	  }
-	  else{
-	    ++$current_md_index;
-	  }
-
-	  if ($md_index_already_processed and ($current_md_index <= $md_index_already_processed)){
-	    if ($verbose){ warn "This has to be another deletion within the same read. Currently processing index $current_md_index, but have already processed $md_index_already_processed indexes previously\n";}
-	    $new_MD .= $el;
-	    next;
-	  }
-	
-	  if ($verbose){ warn "Current element: $el\n";}
-	  unless (defined $op){ # initialize
-	    $op = $el;
-	    if ($verbose){ warn "Initializing \$op as $op\n";}
-	    next;
-	  }
-
-	  if ($deletions_processed == $deletions_total){
-	    if ($verbose){ warn "Processed $deletions_processed in the read so far, out of $deletions_total total. Just appending elements until the end of the string: here $el\n";}
-	    $MD_tag .= $el;
-	    $new_MD .= $el;
-	    next;
-	  }
-	  # this only occurs when there are more deletions in the read but we want to regenerate a new MD tag
-	  if ($this_deletion_processed){
-	    $new_MD .= $el;
-	    next;
-	  }
-
-	  if ($op =~ /^\d+$/){
-	    if ($verbose){ warn "Operation so far was a digit: $op\n";}
-	    if ($el =~ /\d/){
-	      $op .= $el;
-	      if ($verbose){ warn "Appending current operation $el. New operation is: $op\n";}
-	      next;
-	    }
-	    else{
-	      if ($verbose){ warn "current element is a word character: $el\n";}
-
-	      ### Need to determine if the matching operation length includes the deletion position
-	      if ($verbose){ warn "Processing operation $op and adding it to MD pos which is so far: $MD_pos_so_far; deletion pos is $del_pos.\n";}
-	      $MD_pos_so_far += $op;
-	      if ($verbose){ warn "MD pos so far: $MD_pos_so_far\n";}
-	      if ($MD_pos_so_far < $del_pos){
-		if ($verbose){ warn "Doesn't cover the deletion yet. Writing back out.\n";}
-		$MD_tag .= $op;
-		$new_MD .= $op;
-		if ($verbose){ warn "Setting new operation to: $el\n";}
-		$op = $el; # setting new $op
-	      }
-	      else{
-		if ($verbose){ warn "Here we go, this operation covers the deletion position!!\n";}
-		### splitting up the number of matching bases in number before and after the deletion
-
-		my $pos_after_deletion = $MD_pos_so_far - $del_pos;
-		my $pos_before_deletion = $op - $pos_after_deletion;
-		if ($verbose){ warn "Splitting up previous operation '$op' into pos before deletion: ${pos_before_deletion} and pos_after_deletion: $pos_after_deletion\n";}	
-		$MD_tag .= "${pos_before_deletion}^${deleted_bases}";
-		$new_MD .= "${pos_before_deletion}^${deleted_bases}${pos_after_deletion}";
-		if ($verbose){ warn "\$newMD after adjusting for the current deletion: $new_MD\n";}
-
-		#adjusting the MD_position by the number of bases after the deletion
-		$MD_pos_so_far -= $pos_after_deletion;
-		if ($verbose){ warn "MD after adjusting for deletion: $MD_pos_so_far\n";	}
-		### also appending the current element because we are writing out the rest of the MD-string unchanged to $new_MD
-		$new_MD .= $el;
-	
-		$deletions_processed += 1;
-		$this_deletion_processed = 1;
-
-		if ($deletions_processed == $deletions_total){ # this was the last deletion of the read
-		  if ($verbose){ warn "This was the last deletion in the read ($deletions_processed out of $deletions_total total). Continuing to append \$pos_after_deletion (${pos_after_deletion})..\n";}
-		  $MD_tag .= "${pos_after_deletion}";
-		
-		  ### also appending the current element because we are writing out the rest of the MD-string unchanged
-		  if ($verbose){ warn "also appending the current element $el\n";}
-		  $MD_tag .= $el;
-		  ### Finally also adding the length of the deletion to $del_pos
-		  $del_pos += $len[$index];
-		  if ($verbose){ warn "Adding length of the deletion itself (",$len[$index],") to \$del_pos: currently at $del_pos\n";}	
-		}	
-		else{
-		  if ($verbose){ warn "This wasn't the last deletion in the read. Substituting the last operation with the current deletion and reconstituting \@md\n";}
-		  if ($verbose){ warn "Adding length of deletion string '${pos_before_deletion}^${deleted_bases}' (",length("${pos_before_deletion}^${deleted_bases}")," - length of current operation (",length$op,") to current_md_index\n";}
-
-		
-		  ### This migh need looking at!!
-		
-		  $current_md_index = $current_md_index + length("${pos_before_deletion}^${deleted_bases}") - length$op;
-		  if ($verbose){  warn "Current index = $current_md_index\n";}
-		
-		  if ($verbose){ warn "Setting \$md_index_already_processed to ",$current_md_index-1,"\n";}
-		  $md_index_already_processed = $current_md_index - 1;
-		
-		  if ($verbose){ warn "Exiting now and waiting for the next deletion\n";}
-
-		  ### Finally also adding the length of the deletion to $del_pos
-		  $del_pos += $len[$index];
-		  $MD_pos_so_far += $len[$index];	
-		  if ($verbose){ warn "Adding length of the deletion itself (",$len[$index],") to \$del_pos: currently at $del_pos\n";}
-		  if ($verbose){ warn "MD-tag so far: $MD_tag ~~\n";}
-		  #setting $op to en empty string so it is not being processed as the last element
-		  $op = '';
-		  # last; # exiting the loop and processing the CIGAR string further until we hit the next deletion	
-		}
-	      }
-	    }
-	    if ($verbose){  warn "MD-tag so far: $MD_tag ~~\n";}
-	  }
-	  else{
-	    if ($verbose){  warn "Operation so far was a word character: $op\n";}
-	    if ($el =~ /\d+/){
-	      # processing the previous mismatch position
-	      $MD_tag .= $op;
-	      $new_MD .= $op;
-	      $MD_pos_so_far += length($op);
-	      if ($verbose){  warn "Writing out mismatching base $op and adding length ",length($op),"\n";}
-	    }
-	    else{
-	      # this should never occur since mismatches are followed by a 0 or another digit
-	      die "current element is a another word character: $el. This should never happen!\n";
-	    }
-	    if ($verbose){ warn "Setting new operation to: $el\n";}
-	    $op = $el; # setting new $op
-	    if ($verbose){  warn "MD-tag so far: $MD_tag ~~\n";}
-	  }
-	}
-
-	### need to consider last element if it was a digit or number and we are expecting the deletion in the last element of the MD-tag
- 	if ($op =~ /\d+/ and $deletions_processed < $deletions_total){
-	  if ($verbose){ warn "\n\nlast operation was $op\n";}
- 	  if ($verbose){ warn "Processing operation $op; deletion pos is $del_pos. MD so far was: $MD_pos_so_far\n";}
-	
- 	  $MD_pos_so_far += $op;
-	  if ($verbose){ warn "Adding $op to MD pos so far: $MD_pos_so_far\n";}
-	  if ($verbose){ warn "Deletions already processed: $deletions_processed, del total: $deletions_total\n\n";}
- 	  if ($MD_pos_so_far >= $del_pos){
-	    if ($verbose){ warn "Here we go, this operation covers the deletion position!!\n";}
- 	    ### splitting up the number of matching bases in number before and after the deletion
-	
- 	    my $pos_after_deletion = $MD_pos_so_far - $del_pos;
- 	    my $pos_before_deletion = $op - $pos_after_deletion;
-	    if ($verbose){  warn "Splitting up previous operation '$op' into pos before deletion: ${pos_before_deletion} and pos_after_deletion: $pos_after_deletion\n";}
-	
-	    $MD_tag .= "${pos_before_deletion}^${deleted_bases}";
-	    $new_MD .= "${pos_before_deletion}^${deleted_bases}${pos_after_deletion}";
-		
-	    #adjusting the MD_position by the number of bases after the deletion
-	    $MD_pos_so_far -= $pos_after_deletion;
-	    if ($verbose){ warn "MD after adjusting for deletion: $MD_pos_so_far\n";	}
-
-	    $deletions_processed += 1;
-	    $this_deletion_processed = 1;
-
-	    if ($deletions_processed == $deletions_total){ # this was the last deletion of the read
-	      if ($verbose){ warn "This was the last deletion in the read ($deletions_processed out of $deletions_total total). Continuing to append \$pos_after_deletion (${pos_after_deletion})..\n";}
-	      $MD_tag .= "${pos_after_deletion}";
-	
-	    }	
-	    else{
-	      if ($verbose){ warn "This wasn't the last deletion in the read. Substituting the last operation with the current deletion and reconstituting \@md\n";}
-	      if ($verbose){ warn "Adding length of deletion string '${pos_before_deletion}^${deleted_bases}' (",length("${pos_before_deletion}^${deleted_bases}")," - length of current operation (",length$op,") to current_md_index\n";}
-	
-	      $current_md_index = $current_md_index + length("${pos_before_deletion}^${deleted_bases}") - length$op;
-	      if ($verbose){  warn "Current index = $current_md_index\n";}
-		
-	      if ($verbose){ warn "Setting \$md_index_already_processed to ",$current_md_index-1,"\n";}
-	      # since we are no longer in the loop we don't have to subtract 1 from $current_md_index (tit hasn't been incremented in the first place...)
-	      $md_index_already_processed = $current_md_index;
-		
-	      if ($verbose){ warn "Exiting now and waiting for the next deletion\n";}
-
-	      $MD_pos_so_far += $len[$index];	
-	      if ($verbose){ warn "MD-tag so far: $MD_tag ~~\n";}
-	    }
-	    ### Finally also adding the length of the deletion to $del_pos
-	    $del_pos += $len[$index];
-	    if ($verbose){ warn "Adding length of the deletion itself (",$len[$index],") to \$del_pos: currently at $del_pos\n";}	
-	  }
-	  else{
-	    die "Something went wrong, we haven't seen a deletion so far even though we should have...\n\n";
-	  }
- 	}
-
-	# forming a new @md
-	@md = split //,$new_MD;
-	$new_MD = '';
-	if ($verbose){ warn "New \@md array: @md\n\n";}
-	if ($verbose){ warn "MD-tag so far: $MD_tag ~~\nnew_MD so far: $new_MD\n\n";}
-
-      }
-      else{
-	die "Found CIGAR operations other than M, I, D or N: '$ops[$index]'. Not allowed at the moment\n";
-      }
-    }
-
-  }
-  if ($verbose){  warn "Returning MD-tag: $MD_tag\n";}
-  return $MD_tag;
-
-}
-
-### Getting rid of the bitwise comparison because even though the initial comparison is nice and quick, the regex loop looking for non-null bytes characters isn't. We might
-### as well do a substring loop to start with, which enables us to generate proper MD:Z: flags that also take proper care of InDels
-# sub make_mismatch_string{
-#   my $actual_seq = shift or die "Missing actual sequence\n";
-#   my $ref_seq = shift or die "Missing reference sequence\n";
-#   my $XX_tag = "XX:Z:";
-
-#   my $tmp = ($actual_seq ^ $ref_seq);                    # Bitwise comparison
-
-#   warn "'$tmp'\n"; sleep(1);
-#   my $prev_mm_pos = 0;
-
-#   while($tmp =~ /[^\0]/g){                               # Where bitwise comparison showed a difference
-#     my $nuc_match = pos($tmp) - $prev_mm_pos - 1;        # Generate number of nucleotide that matches since last mismatch
-#     my $nuc_mm = substr($ref_seq, pos($tmp) - 1, 1) if pos($tmp) <= length($ref_seq);  # Obtain reference nucleotide that was different from the actual read
-#     $XX_tag .= "$nuc_match" if $nuc_match > 0;           # Ignore if mismatches are adjacent to each other
-#     $XX_tag .= "$nuc_mm" if defined $nuc_mm;             # Ignore if there is no mismatch (prevents uninitialized string concatenation)
-#     $prev_mm_pos = pos($tmp);                            # Position of last mismatch
-#   }
-#   my $end_matches = length($ref_seq) - $prev_mm_pos;     # Provides number of matches from last mismatch till end of sequence
-#   $XX_tag .= "$end_matches" if $end_matches > 0;         # Ignore if mismatch is at the end of sequence
-#   return $XX_tag;
-# }
-
-
-
-sub print_helpfile{
-  print << "HOW_TO";
-
-
-     This program is free software: you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published by
-     the Free Software Foundation, either version 3 of the License, or
-     (at your option) any later version.
-
-     This program is distributed in the hope that it will be useful,
-     but WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-     GNU General Public License for more details.
-     You should have received a copy of the GNU General Public License
-     along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-
-
-DESCRIPTION
-
-
-The following is a brief description of command line options and arguments to control the Bismark
-bisulfite mapper and methylation caller. Bismark takes in FastA or FastQ files and aligns the
-reads to a specified bisulfite genome. Sequence reads are transformed into a bisulfite converted forward strand
-version (C->T conversion) or into a bisulfite treated reverse strand (G->A conversion of the forward strand).
-Each of these reads are then aligned to bisulfite treated forward strand index of a reference genome
-(C->T converted) and a bisulfite treated reverse strand index of the genome (G->A conversion of the
-forward strand, by doing this alignments will produce the same positions). These 4 instances of Bowtie (1 or 2)
-are run in parallel. The sequence file(s) are then read in again sequence by sequence to pull out the original
-sequence from the genome and determine if there were any protected C's present or not.
-
-As of version 0.7.0 Bismark will only run 2 alignment threads for OT and OB in parallel, the 4 strand mode can be
-re-enabled by using --non_directional.
-
-The final output of Bismark is in SAM format by default. For Bowtie 1 one can alos choose to report the old
-'vanilla' output format, which is a single tab delimited file with all sequences that have a unique best
-alignment to any of the 4 possible strands of a bisulfite PCR product. Both formats are described in more detail below.
-
-
-USAGE: bismark [options] <genome_folder> {-1 <mates1> -2 <mates2> | <singles>}
-
-
-ARGUMENTS:
-
-<genome_folder>          The path to the folder containing the unmodified reference genome
-                         as well as the subfolders created by the Bismark_Genome_Preparation
-                         script (/Bisulfite_Genome/CT_conversion/ and /Bisulfite_Genome/GA_conversion/).
-                         Bismark expects one or more fastA files in this folder (file extension: .fa
-                         or .fasta). The path can be relative or absolute. The path may also be set as
-                         '--genome_folder /path/to/genome/folder/'.
-
--1 <mates1>              Comma-separated list of files containing the #1 mates (filename usually includes
-                         "_1"), e.g. flyA_1.fq,flyB_1.fq). Sequences specified with this option must
-                         correspond file-for-file and read-for-read with those specified in <mates2>.
-                         Reads may be a mix of different lengths. Bismark will produce one mapping result
-                         and one report file per paired-end input file pair.
-
--2 <mates2>              Comma-separated list of files containing the #2 mates (filename usually includes
-                         "_2"), e.g. flyA_1.fq,flyB_1.fq). Sequences specified with this option must
-                         correspond file-for-file and read-for-read with those specified in <mates1>.
-                         Reads may be a mix of different lengths.
-
-<singles>                A comma- or space-separated list of files containing the reads to be aligned (e.g.
-                         lane1.fq,lane2.fq lane3.fq). Reads may be a mix of different lengths. Bismark will
-                         produce one mapping result and one report file per input file.
-
-
-OPTIONS:
-
-
-Input:
-
---se/--single_end <list> Sets single-end mapping mode explicitly giving a list of file names as <list>.
-                         The filenames may be provided as a comma [,] or colon [:] separated list.       
-
--q/--fastq               The query input files (specified as <mate1>,<mate2> or <singles> are FASTQ
-                         files (usually having extension .fg or .fastq). This is the default. See also
-                         --solexa-quals.
-
--f/--fasta               The query input files (specified as <mate1>,<mate2> or <singles> are FASTA
-                         files (usually having extensions .fa, .mfa, .fna or similar). All quality values
-                         are assumed to be 40 on the Phred scale. FASTA files are expected to contain both
-                         the read name and the sequence on a single line (and not spread over several lines).
-
--s/--skip <int>          Skip (i.e. do not align) the first <int> reads or read pairs from the input.
-
--u/--upto <int>          Only aligns the first <int> reads or read pairs from the input. Default: no limit.
-
---phred33-quals          FASTQ qualities are ASCII chars equal to the Phred quality plus 33. Default: on.
-
---phred64-quals          FASTQ qualities are ASCII chars equal to the Phred quality plus 64. Default: off.
-
---solexa-quals           Convert FASTQ qualities from solexa-scaled (which can be negative) to phred-scaled
-                         (which can't). The formula for conversion is: 
-                         phred-qual = 10 * log(1 + 10 ** (solexa-qual/10.0)) / log(10). Used with -q. This
-                         is usually the right option for use with (unconverted) reads emitted by the GA
-                         Pipeline versions prior to 1.3. Works only for Bowtie 1. Default: off.
-
---solexa1.3-quals        Same as --phred64-quals. This is usually the right option for use with (unconverted)
-                         reads emitted by GA Pipeline version 1.3 or later. Default: off.
-
---path_to_bowtie         The full path </../../> to the Bowtie (1 or 2) installation on your system. If not
-                         specified it is assumed that Bowtie (1 or 2) is in the PATH.
-
-
-Alignment:
-
--n/--seedmms <int>       The maximum number of mismatches permitted in the "seed", i.e. the first L base pairs
-                         of the read (where L is set with -l/--seedlen). This may be 0, 1, 2 or 3 and the 
-                         default is 1. This option is only available for Bowtie 1 (for Bowtie 2 see -N).
-
--l/--seedlen             The "seed length"; i.e., the number of bases of the high quality end of the read to
-                         which the -n ceiling applies. The default is 28. Bowtie (and thus Bismark) is faster for
-                         larger values of -l. This option is only available for Bowtie 1 (for Bowtie 2 see -L).
-
--e/--maqerr <int>        Maximum permitted total of quality values at all mismatched read positions throughout
-                         the entire alignment, not just in the "seed". The default is 70. Like Maq, bowtie rounds
-                         quality values to the nearest 10 and saturates at 30. This value is not relevant for
-                         Bowtie 2.
-
---chunkmbs <int>         The number of megabytes of memory a given thread is given to store path descriptors in
-                         --best mode. Best-first search must keep track of many paths at once to ensure it is
-                         always extending the path with the lowest cumulative cost. Bowtie tries to minimize the
-                         memory impact of the descriptors, but they can still grow very large in some cases. If
-                         you receive an error message saying that chunk memory has been exhausted in --best mode,
-                         try adjusting this parameter up to dedicate more memory to the descriptors. This value
-                         is not relevant for Bowtie 2. Default: 512.
-
--I/--minins <int>        The minimum insert size for valid paired-end alignments. E.g. if -I 60 is specified and
-                         a paired-end alignment consists of two 20-bp alignments in the appropriate orientation
-                         with a 20-bp gap between them, that alignment is considered valid (as long as -X is also
-                         satisfied). A 19-bp gap would not be valid in that case. Default: 0.
-
--X/--maxins <int>        The maximum insert size for valid paired-end alignments. E.g. if -X 100 is specified and
-                         a paired-end alignment consists of two 20-bp alignments in the proper orientation with a
-                         60-bp gap between them, that alignment is considered valid (as long as -I is also satisfied).
-                         A 61-bp gap would not be valid in that case. Default: 500.
-
---multicore <int>        Sets the number of parallel instances of Bismark to be run concurrently. This forks the
-                         Bismark alignment step very early on so that each individual Spawn of Bismark processes
-                         only every n-th sequence (n being set by --multicore). Once all processes have completed,
-                         the individual BAM files, mapping reports, unmapped or ambiguous FastQ files are merged
-                         into single files in very much the same way as they would have been generated running Bismark
-                         conventionally with only a single instance.
-
-                         If system resources are plentiful this is a viable option to speed up the alignment process
-                         (we observed a near linear speed increase for up to --multicore 8 tested). However, please note
-                         that a typical Bismark run will use several cores already (Bismark itself, 2 or 4 threads of
-                         Bowtie/Bowtie2, Samtools, gzip etc...) and ~10-16GB of memory depending on the choice of aligner
-                         and genome. WARNING: Bismark Parallel (BP?) is resource hungry! Each value of --multicore specified
-                         will effectively lead to a linear increase in compute and memory requirements, so --multicore 4 for
-                         e.g. the GRCm38 mouse genome will probably use ~20 cores and eat ~40GB or RAM, but at the same time
-                         reduce the alignment time to ~25-30%. You have been warned.
-
-
-
-Bowtie 1 Reporting:
-
--k <2>                   Due to the way Bismark works Bowtie will report up to 2 valid alignments. This option
-                         will be used by default.
-
---best                   Make Bowtie guarantee that reported singleton alignments are "best" in terms of stratum
-                         (i.e. number of mismatches, or mismatches in the seed in the case if -n mode) and in
-                         terms of the quality; e.g. a 1-mismatch alignment where the mismatch position has Phred
-                         quality 40 is preferred over a 2-mismatch alignment where the mismatched positions both
-                         have Phred quality 10. When --best is not specified, Bowtie may report alignments that
-                         are sub-optimal in terms of stratum and/or quality (though an effort is made to report
-                         the best alignment). --best mode also removes all strand bias. Note that --best does not
-                         affect which alignments are considered "valid" by Bowtie, only which valid alignments
-                         are reported by Bowtie. Bowtie is about 1-2.5 times slower when --best is specified.
-                         Default: on.
-
---no_best                Disables the --best option which is on by default. This can speed up the alignment process,
-                         e.g. for testing purposes, but for credible results it is not recommended to disable --best.
-
-
-Output:
-
---non_directional        The sequencing library was constructed in a non strand-specific manner, alignments to all four
-                         bisulfite strands will be reported. Default: OFF.
-
-                         (The current Illumina protocol for BS-Seq is directional, in which case the strands complementary
-                         to the original strands are merely theoretical and should not exist in reality. Specifying directional
-                         alignments (which is the default) will only run 2 alignment threads to the original top (OT)
-                         or bottom (OB) strands in parallel and report these alignments. This is the recommended option
-                         for sprand-specific libraries).
-
---pbat                   This options may be used for PBAT-Seq libraries (Post-Bisulfite Adapter Tagging; Kobayashi et al.,
-                         PLoS Genetics, 2012). This is essentially the exact opposite of alignments in 'directional' mode,
-                         as it will only launch two alignment threads to the CTOT and CTOB strands instead of the normal OT
-                         and OB ones. Use this option only if you are certain that your libraries were constructed following
-                         a PBAT protocol (if you don't know what PBAT-Seq is you should not specify this option). The option
-                         --pbat works only for FastQ files (in both Bowtie and Bowtie 2 mode) and using uncompressed
-                         temporary files only).
-
---sam-no-hd              Suppress SAM header lines (starting with @). This might be useful when very large input files are
-                         split up into several smaller files to run concurrently and the output files are to be merged.
-
---rg_tag                 Write out a Read Group tag to the resulting SAM/BAM file. This will write the following line to the
-                         SAM header: \@RG PL: ILLUMINA ID:SAMPLE SM:SAMPLE ; to set ID and SM see --rg_id and --rg_sample.
-                         In addition each read receives an RG:Z:RG-ID tag. Default: OFF.
-
---rg_id <string>         Sets the ID field in the \@RG header line. The default is 'SAMPLE'.
-
---rg_sample <string>     Sets the SM field in the \@RG header line; can't be set without setting --rg_id as well. The default is
-                         'SAMPLE'.
-
---quiet                  Print nothing besides alignments.
-
---vanilla                Performs bisulfite mapping with Bowtie 1 and prints the 'old' output (as in Bismark 0.5.X) instead
-                         of SAM format output.
-
--un/--unmapped           Write all reads that could not be aligned to a file in the output directory. Written reads will
-                         appear as they did in the input, without any translation of quality values that may have
-                         taken place within Bowtie or Bismark. Paired-end reads will be written to two parallel files with _1
-                         and _2 inserted in their filenames, i.e. _unmapped_reads_1.txt and unmapped_reads_2.txt. Reads
-                         with more than one valid alignment with the same number of lowest mismatches (ambiguous mapping)
-                         are also written to _unmapped_reads.txt unless the option --ambiguous is specified as well.
-
---ambiguous              Write all reads which produce more than one valid alignment with the same number of lowest
-                         mismatches or other reads that fail to align uniquely to a file in the output directory.
-                         Written reads will appear as. they did in the input, without any of the translation of quality
-                         values that may have taken place within Bowtie or Bismark. Paired-end reads will be written to two
-                         parallel files with _1 and _2 inserted in theit filenames, i.e. _ambiguous_reads_1.txt and
-                         _ambiguous_reads_2.txt. These reads are not written to the file specified with --un.
-
--o/--output_dir <dir>    Write all output files into this directory. By default the output files will be written into
-                         the same folder as the input file(s). If the specified folder does not exist, Bismark will attempt
-                         to create it first. The path to the output folder can be either relative or absolute.
-
---temp_dir <dir>         Write temporary files to this directory instead of into the same directory as the input files. If
-                         the specified folder does not exist, Bismark will attempt to create it first. The path to the
-                         temporary folder can be either relative or absolute.
-
---non_bs_mm              Optionally outputs an extra column specifying the number of non-bisulfite mismatches a read during the
-                         alignment step. This option is only available for SAM format. In Bowtie 2 context, this value is
-                         just the number of actual non-bisulfite mismatches and ignores potential insertions or deletions.
-                         The format for single-end reads and read 1 of paired-end reads is 'XA:Z:number of mismatches'
-                         and 'XB:Z:number of mismatches' for read 2 of paired-end reads.
-
---gzip                   Temporary bisulfite conversion files will be written out in a GZIP compressed form to save disk
-                         space. This option is available for most alignment modes but is not available for paired-end FastA
-                         files. This option might be somewhat slower than writing out uncompressed files, but this awaits
-                         further testing.
-
---sam                    The output will be written out in SAM format instead of the default BAM format. Bismark will
-                         attempt to use the path to Samtools that was specified with '--samtools_path', or, if it hasn't
-                         been specified, attempt to find Samtools in the PATH. If no installation of Samtools can be found,
-                         the SAM output will be compressed with GZIP instead (yielding a .sam.gz output file).
-
---cram                   Writes the output to a CRAM file instead of BAM. This requires the use of Samtools 1.2 or higher.
-                         
---cram_ref <ref_file>    CRAM output requires you to specify a reference genome as a single FastA file. If this single-FastA
-                         reference file is not supplied explicitly it will be regenerated from the genome .fa sequence(s)
-                         used for the Bismark run and written to a file called 'Bismark_genome_CRAM_reference.mfa' into the
-                         oputput directory.
-
---samtools_path          The path to your Samtools installation, e.g. /home/user/samtools/. Does not need to be specified
-                         explicitly if Samtools is in the PATH already.
-
---prefix <prefix>        Prefixes <prefix> to the output filenames. Trailing dots will be replaced by a single one. For
-                         example, '--prefix test' with 'file.fq' would result in the output file 'test.file.fq_bismark.sam' etc.
-
--B/--basename <basename> Write all output to files starting with this base file name. For example, '--basename foo'
-                         would result in the files 'foo.bam' and 'foo_SE_report.txt' (or its paired-end equivalent). Takes
-                         precedence over --prefix.
-
---old_flag               Only in paired-end SAM mode, uses the FLAG values used by Bismark v0.8.2 and before. In addition,
-                         this options appends /1 and /2 to the read IDs for reads 1 and 2 relative to the input file. Since
-                         both the appended read IDs and custom FLAG values may cause problems with some downstream tools 
-                         such as Picard, new defaults were implemented as of version 0.8.3.
-
-
-                                             default                         old_flag
-                                       ===================              ===================
-                                       Read 1       Read 2              Read 1       Read 2
-
-                              OT:         99          147                  67          131
-
-                              OB:         83          163                 115          179
-
-                              CTOT:      147           99                  67          131
-
-                              CTOB:      163           83                 115          179
-
---ambig_bam              For reads that have multiple alignments a random alignment is written out to a special file ending in
-                         '.ambiguous.bam'. The alignments are in Bowtie2 format and do not any contain Bismark specific
-                         entries such as the methylation call etc. These ambiguous BAM files are intended to be used as 
-                         coverage estimators for variant callers. 
-
---nucleotide_coverage    Calculates the mono- and di-nucleotide sequence composition of covered positions in the analysed BAM
-                         file and compares it to the genomic average composition once alignments are complete by calling 'bam2nuc'. 
-                         Since this calculation may take a while, bam2nuc attempts to write the genomic sequence composition
-                         into a file called 'genomic_nucleotide_frequencies.txt' indside the reference genome folder so it can
-                         be re-used the next time round instead of calculating it once again. If a file 'nucleotide_stats.txt' is
-                         found with the Bismark reports it will be automatically detected and used for the Bismark HTML report.
-                         This option works only for BAM or CRAM files. 
-
-
-Other:
-
--h/--help                Displays this help file.
-
--v/--version             Displays version information.
-
-
-BOWTIE 2 SPECIFIC OPTIONS
-
---bowtie1                Uses Bowtie 1 instead of Bowtie 2, which might be a good choice for faster and very short
-                         alignments. Bismark assumes that raw sequence data is adapter and/or quality trimmed where
-                         appropriate. Default: off.
-
---bowtie2                Default: ON. Uses Bowtie 2 instead of Bowtie 1. Bismark limits Bowtie 2 to only perform end-to-end
-                         alignments, i.e. searches for alignments involving all read characters (also called 
-                         untrimmed or unclipped alignments). Bismark assumes that raw sequence data is adapter
-                         and/or quality trimmed where appropriate. Both small (.bt2) and large (.bt2l) Bowtie 2
-                         indexes are supported.
-
-Bowtie 2 alignment options:
-
--N <int>                 Sets the number of mismatches to allowed in a seed alignment during multiseed alignment.
-                         Can be set to 0 or 1. Setting this higher makes alignment slower (often much slower)
-                         but increases sensitivity. Default: 0. This option is only available for Bowtie 2 (for
-                         Bowtie 1 see -n).
-
--L <int>                 Sets the length of the seed substrings to align during multiseed alignment. Smaller values
-                         make alignment slower but more senstive. Default: the --sensitive preset of Bowtie 2 is
-                         used by default, which sets -L to 20. This option is only available for Bowtie 2 (for
-                         Bowtie 1 see -l).
-
---ignore-quals           When calculating a mismatch penalty, always consider the quality value at the mismatched
-                         position to be the highest possible, regardless of the actual value. I.e. input is treated
-                         as though all quality values are high. This is also the default behavior when the input
-                         doesn't specify quality values (e.g. in -f mode). This option is invariable and on by default.
-
-
-Bowtie 2 paired-end options:
-
---no-mixed               This option disables Bowtie 2's behavior to try to find alignments for the individual mates if
-                         it cannot find a concordant or discordant alignment for a pair. This option is invariable and
-                         and on by default.
-
---no-discordant          Normally, Bowtie 2 looks for discordant alignments if it cannot find any concordant alignments.
-                         A discordant alignment is an alignment where both mates align uniquely, but that does not
-                         satisfy the paired-end constraints (--fr/--rf/--ff, -I, -X). This option disables that behavior
-                         and it is on by default.
-
---dovetail               It is possible, though unusual, for the mates to "dovetail", with the mates seemingly extending
-                         "past" each other as in this example:
-
-                         Mate 1:                 GTCAGCTACGATATTGTTTGGGGTGACACATTACGC
-                         Mate 2:            TATGAGTCAGCTACGATATTGTTTGGGGTGACACAT                   
-                         Reference: GCAGATTATATGAGTCAGCTACGATATTGTTTGGGGTGACACATTACGCGTCTTTGAC
-
-                         By default, dovetailing is considered inconsistent with concordant alignment, but setting --dovetail
-                         causes Bowtie 2 to consider dovetailing alignments as concordant. This becomes relevant whenever
-                         Reads are clipped from their 5' end prior to mapping, e.g. because of quality or bias issues.
-                         --dovetail is set automatically for PBAT libraries.
-
-
-Bowtie 2 effort options:
-
--D <int>                 Up to <int> consecutive seed extension attempts can "fail" before Bowtie 2 moves on, using
-                         the alignments found so far. A seed extension "fails" if it does not yield a new best or a
-                         new second-best alignment. Default: 15.
-
--R <int>                 <int> is the maximum number of times Bowtie 2 will "re-seed" reads with repetitive seeds.
-                         When "re-seeding," Bowtie 2 simply chooses a new set of reads (same length, same number of
-                         mismatches allowed) at different offsets and searches for more alignments. A read is considered
-                         to have repetitive seeds if the total number of seed hits divided by the number of seeds
-                         that aligned at least once is greater than 300. Default: 2.
-
-Bowtie 2 parallelization options:
-
-
--p NTHREADS              Launch NTHREADS parallel search threads (default: 1). Threads will run on separate processors/cores
-                         and synchronize when parsing reads and outputting alignments. Searching for alignments is highly
-                         parallel, and speedup is close to linear. Increasing -p increases Bowtie 2's memory footprint.
-                         E.g. when aligning to a human genome index, increasing -p from 1 to 8 increases the memory footprint
-                         by a few hundred megabytes. This option is only available if bowtie is linked with the pthreads
-                         library (i.e. if BOWTIE_PTHREADS=0 is not specified at build time). In addition, this option will
-                         automatically use the option '--reorder', which guarantees that output SAM records are printed in
-                         an order corresponding to the order of the reads in the original input file, even when -p is set
-                         greater than 1 (Bismark requires the Bowtie 2 output to be this way). Specifying --reorder and
-                         setting -p greater than 1 causes Bowtie 2 to run somewhat slower and use somewhat more memory then
-                         if --reorder were not specified. Has no effect if -p is set to 1, since output order will naturally
-                         correspond to input order in that case.
-
-Bowtie 2 Scoring options:
-
---score_min <func>       Sets a function governing the minimum alignment score needed for an alignment to be considered
-                         "valid" (i.e. good enough to report). This is a function of read length. For instance, specifying
-                         L,0,-0.2 sets the minimum-score function f to f(x) = 0 + -0.2 * x, where x is the read length.
-                         See also: setting function options at http://bowtie-bio.sourceforge.net/bowtie2. The default is
-                         L,0,-0.2.
-
---rdg <int1>,<int2>      Sets the read gap open (<int1>) and extend (<int2>) penalties. A read gap of length N gets a penalty
-                         of <int1> + N * <int2>. Default: 5, 3.
-
---rfg <int1>,<int2>      Sets the reference gap open (<int1>) and extend (<int2>) penalties. A reference gap of length N gets
-                         a penalty of <int1> + N * <int2>. Default: 5, 3.
-
-
-Bowtie 2 Reporting options:
-
--most_valid_alignments <int> This used to be the Bowtie 2 parameter -M. As of Bowtie 2 version 2.0.0 beta7 the option -M is
-                         deprecated. It will be removed in subsequent versions. What used to be called -M mode is still the
-                         default mode, but adjusting the -M setting is deprecated.  Use the -D and -R options to adjust the
-                         effort expended to find valid alignments.
-
-                         For reference, this used to be the old (now deprecated) description of -M:
-                         Bowtie 2 searches for at most <int>+1 distinct, valid alignments for each read. The search terminates when it
-                         can't find more distinct valid alignments, or when it finds <int>+1 distinct alignments, whichever
-                         happens first. Only the best alignment is reported. Information from the other alignments is used to
-                         estimate mapping quality and to set SAM optional fields, such as AS:i and XS:i. Increasing -M makes 
-                         Bowtie 2 slower, but increases the likelihood that it will pick the correct alignment for a read that
-                         aligns many places. For reads that have more than <int>+1 distinct, valid alignments, Bowtie 2 does not
-                         guarantee that the alignment reported is the best possible in terms of alignment score. -M is
-                         always used and its default value is set to 10.
-
-
-'VANILLA' Bismark  OUTPUT:
-
-Single-end output format (tab-separated):
-
- (1) <seq-ID>
- (2) <read alignment strand>
- (3) <chromosome>
- (4) <start position>
- (5) <end position>
- (6) <observed bisulfite sequence>
- (7) <equivalent genomic sequence>
- (8) <methylation call>
- (9) <read conversion
-(10) <genome conversion>
-(11) <read quality score (Phred33)>
-
-
-Paired-end output format (tab-separated):
- (1) <seq-ID>
- (2) <read 1 alignment strand>
- (3) <chromosome>
- (4) <start position>
- (5) <end position>
- (6) <observed bisulfite sequence 1>
- (7) <equivalent genomic sequence 1>
- (8) <methylation call 1>
- (9) <observed bisulfite sequence 2>
-(10) <equivalent genomic sequence 2>
-(11) <methylation call 2>
-(12) <read 1 conversion
-(13) <genome conversion>
-(14) <read 1 quality score (Phred33)>
-(15) <read 2 quality score (Phred33)>
-
-
-Bismark SAM OUTPUT (default):
-
- (1) QNAME  (seq-ID)
- (2) FLAG   (this flag tries to take the strand a bisulfite read originated from into account (this is different from ordinary DNA alignment flags!))
- (3) RNAME  (chromosome)
- (4) POS    (start position)
- (5) MAPQ   (always 255 for use with Bowtie)
- (6) CIGAR
- (7) RNEXT
- (8) PNEXT
- (9) TLEN
-(10) SEQ
-(11) QUAL   (Phred33 scale)
-(12) NM-tag (edit distance to the reference)
-(13) MD-tag (base-by-base mismatches to the reference (handles indels)
-(14) XM-tag (methylation call string)
-(15) XR-tag (read conversion state for the alignment)
-(16) XG-tag (genome conversion state for the alignment)
-(17) XA/XB-tag (non-bisulfite mismatches) (optional!)
-
-Each read of paired-end alignments is written out in a separate line in the above format.
-
-
-Last edited on 25 July 2016
-HOW_TO
-}
--- a/bismark_mapping/bismark_bowtie2_wrapper.xml	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,561 +0,0 @@
-<tool id="bismark_bowtie2" name="Bismark Mapper" version="0.16.3">
-    
-    <description>Bisulfite reads mapper</description>
-    <!--<version_command>bismark version</version_command>-->
-    <requirements>
-        <requirement type="package" version="0.1.19">samtools</requirement>
-        <requirement type="package" version="2.1.0">bowtie2</requirement>
-    </requirements>
-    <stdio>
-        <exit_code range="1:" />
-        <exit_code range=":-1" />
-        <regex match="Error:" />
-        <regex match="Exception:" />
-    </stdio>
-    <command interpreter="python">
-<![CDATA[
-        bismark_wrapper.py
-
-        ## Change this to accommodate the number of threads you have available.
-        --num-threads "\${GALAXY_SLOTS:-24}"
-
-        ##--bismark_path \$SCRIPT_PATH
-        --bismark_path "$__tool_directory__"
-
-        --bowtie2
-
-        ##
-        ## Bismark Genome Preparation, if desired.
-        ##
-
-        ## Handle reference file.
-        #if $refGenomeSource.genomeSource == "built_in_fasta":
-            --own-file="${refGenomeSource.built_in_fasta.fields.path}"
-        #else if $refGenomeSource.genomeSource == "own_fasta":
-            --own-file="$refGenomeSource['own_fasta']"
-        #else:
-            --indexes-path "${refGenomeSource.built_in_indexes.fields.path}"
-        #end if
-
-        ##
-        ##  Input parameters
-        ##
-
-        #if $singlePaired.sPaired == "single":
-            --single-paired $singlePaired.input_singles
-
-            #if $singlePaired.input_singles.ext == "fastqillumina":
-                --phred64-quals
-                --fastq
-            #elif $singlePaired.input_singles.ext == "fastqsanger":
-                --fastq
-            #elif $singlePaired.input_singles.ext == "fasta":
-                --fasta
-            #end if
-        #else:
-            --mate-paired
-            #set $mate1 = list()
-            #set $mate2 = list()
-            #for $mate_pair in $singlePaired.mate_list
-                $mate1.append( str($mate_pair.input_mate1) )
-                $mate2.append( str($mate_pair.input_mate2) )
-            #end for
-
-            --mate1 #echo ','.join($mate1)
-            --mate2 #echo ','.join($mate2)
-
-            #for $mate_pair in $singlePaired.mate_list:
-                #if $mate_pair.input_mate1.ext == "fastqillumina":
-                    --phred64-quals
-                    --fastq
-                #elif $mate_pair.input_mate1.ext == "fastqsanger":
-                    --fastq
-                #elif $mate_pair.input_mate1.ext == "fasta":
-                    --fasta
-                #end if
-                #break
-            #end for
-
-            -I $singlePaired.minInsert
-            -X $singlePaired.maxInsert
-        #end if
-
-        #if $sort_bam:
-            --sort-bam
-        #end if
-
-        ## for now hardcode the value for the required memory per thread in --best mode
-        --chunkmbs 512
-
-
-        #if $params.settingsType == "custom":
-
-            ## default 20
-            --seed-len $params.seed_len
-            ## default 0
-            --seed-mismatches $params.seed_mismatches
-            ## default 15
-            --seed-extention-attempts $params.seed_extention_attempts
-            ## default 2
-            --max-reseed $params.max_reseed
-
-            ## default 70
-            ##--maqerr $params.maqerr
-
-            ## default unlimited
-            #if $params.qupto != 0:
-                --qupto $params.qupto
-            #end if
-            #if $params.skip_reads != 0:
-                --skip-reads $params.skip_reads
-            #end if
-
-            ## if set, disable the original behaviour
-            $params.no_mixed
-            ## if set, disable the original behaviour
-            $params.no_discordant
-
-            #if $params.bismark_stdout:
-                --stdout "$output_stdout"
-            #end if
-
-            #if $params.isReportOutput:
-                --output-report-file "$report_file"
-            #end if
-
-        #else:
-          --output-report-file "$report_file"
-        #end if
-
-      ##
-      ## Output parameters.
-      ##
-      --output $output
-      ##$suppress_header
-
-      #if str( $singlePaired.sPaired ) == "single"
-        #if $output_unmapped_reads_l
-          --output-unmapped-reads "$output_unmapped_reads_l"
-        #end if
-        #if $output_suppressed_reads_l
-          --output-suppressed-reads "$output_suppressed_reads_l"
-        #end if
-      #else
-        #if $output_unmapped_reads_l and $output_unmapped_reads_r
-          --output-unmapped-reads-l "$output_unmapped_reads_l"
-          --output-unmapped-reads-r "$output_unmapped_reads_r"
-        #end if
-        #if $output_suppressed_reads_l and $output_suppressed_reads_l
-          --output-suppressed-reads-l "$output_suppressed_reads_l"
-          --output-suppressed-reads-r "$output_suppressed_reads_r"
-        #end if
-      #end if
-
-]]>
-    </command>
-    <inputs>
-        <conditional name="refGenomeSource">
-         	<param name="genomeSource" type="select" label="Will you select a reference genome from your history or use a built-in index?" help="Built-ins were indexed using default options">
-            	<option value="built_in_indexes" selected="true">Use built-in Bismark indexes</option>
-				<option value="built_in_fasta">Generate Bismark indexes from built-in Reference Genome (fasta)</option>
-              	<option value="own_fasta">Generate Bismark indexes from Genome (fasta) in your Galaxy history</option>
-         	</param>
-        	<when value="built_in_indexes">
-				<param name="built_in_indexes" type="select" label="Select Reference Genome (bismark indexes)" help="If your genome of interest is not listed, contact your Galaxy admin">
-              		<options from_data_table="bismark_indexes">
-                		<filter type="sort_by" column="name"/>
-						<validator type="no_options" message="No indexes are available for the selected input dataset"/>
-              		</options>
-				</param>
-          	</when>
-          	<when value="built_in_fasta"> 
-            	<param name="built_in_fasta" type="select" label="Select Reference Genome (fasta)">
-              		<options from_data_table="all_fasta">
-                		<filter type="sort_by" column="name"/>
-                		<validator type="no_options" message="No genomes in fasta are available for the selected input dataset"/>
-              		</options>
-           		 </param>
-          	</when>
-          	<when value="own_fasta"> 
-            	<param name="own_fasta" type="data" format="fasta" label="Select the reference genome"/>
-          	</when>
-        </conditional>
-
-        <!-- Input Parameters -->
-        <conditional name="singlePaired">
-            <param name="sPaired" type="select" label="Is this library mate-paired?">
-              <option value="single">Single-end</option>
-              <option value="paired">Paired-end</option>
-            </param>
-            <when value="single">
-                <param name="input_singles" type="data" format="fastqsanger,fastqillumina,fastq,fasta" label="FASTQ/FASTA file" help="FASTQ or FASTA files." />
-            </when>
-            <when value="paired">
-                <repeat name="mate_list" title="Paired End Pairs" min="1">
-                    <param name="input_mate1" type="data" format="fastqsanger,fastqillumina,fastq,fasta" label="Mate pair 1" help="FASTQ or FASTA files." />
-                    <param name="input_mate2" type="data" format="fastqsanger,fastqillumina,fastq,fasta" label="Mate pair 2" help="FASTQ or FASTA files." />
-                </repeat>
-                <param name="minInsert" type="integer" value="0" label="Minimum insert size for valid paired-end alignments" />
-                <param name="maxInsert" type="integer" value="500" label="Maximum insert size for valid paired-end alignments" />
-            </when>
-        </conditional>
-
-        <param name="sort_bam" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Sort BAM file by chromosomal position (not compatibile with methylation extractor)"/>
-
-        <conditional name="params">
-            <param name="settingsType" type="select" label="Bismark settings to use" help="You can use the default settings or set custom values for any of Bismark's parameters.">
-              <option value="default">Use Defaults</option>
-              <option value="custom">Full parameter list</option>
-            </param>
-            <!--<when value="default" />-->
-            <!-- Full/advanced params. -->
-            <when value="custom">
-                <!-- -N -->
-                <param name="seed_mismatches" type="integer" value="0" label="Number of mismatches to be allowed in a seed alignment during multiseed alignment" />
-                <!-- -L -->
-                <param name="seed_len" type="integer" value="20" label="Length of the seed substrings to align during multiseed alignment" />
-                <!--
-                <param name="maqerr" type="integer" value="70" label="Maximum permitted total of quality values at all mismatched read positions throughout the entire alignment, not just in the 'seed'." />
-                -->
-                <!-- -D -->
-                <param name="seed_extention_attempts" type="integer" value="15" label="How many consecutive seed extension attempts can fail before Bowtie 2 moves on" />
-                <!-- -R -->
-                <param name="max_reseed" type="integer" value="2" label="Maximum number of times Bowtie 2 will re-seed reads with repetitive seeds" />
-
-                <param name="qupto" type="integer" value="0" label="Only aligns the first N reads or read pairs from the input" help="Default is 0 and means 'no-limit'." />
-                <param name="skip_reads" type="integer" value="0" label="Skip (i.e. do not align) the first N reads or read pairs from the input" />
-
-                <param name="no_discordant" type="boolean" truevalue="--no-discordant" falsevalue="" checked="false" label="Disable looking for discordant alignments if it cannot find any concordant alignments (only for paired-end reads)" help="" />
-                <param name="no_mixed" type="boolean" truevalue="--no-mixed" falsevalue="" checked="false" label="Disable Bowtie 2's behaviour to try to find alignments for the individual mates (only for paired-end reads" help="" />
-
-                <param name="suppressed_read_file" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Write ambiguous reads to an extra output file" help="Write all reads which produce more than one valid alignment with the same number of lowest mismatches or other reads that fail to align uniquely." />
-                <param name="unmapped_read_file" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Write all reads that could not be aligned to a file" />
-                <!-- output Options -->
-                <param name="bismark_stdout" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Write the bismark output and summary information to an extra file" />
-                <param name="isReportOutput" type="boolean" truevalue="true" falsevalue="false" checked="true" label="Offer all report files concatenated in one file (Mapping Report)" />
-
-                <!--end output options -->
-            </when>  <!-- full -->
-      </conditional>  <!-- params -->
-      <!--
-      <param name="suppress_header" type="boolean" truevalue="..suppress-header" falsevalue="" checked="false" label="Suppress the header in the output SAM file" help="Bowtie produces SAM with several lines of header information by default." />
-        -->
-    </inputs>
-
-
-    <outputs>
-        <data format="txt" name="report_file" label="${tool.name} on ${on_string}: mapping report">
-            <filter>
-            ((
-            	params['settingsType'] == "default" or
-                ( params['settingsType'] == "custom" and
-                params['isReportOutput'] is True )
-            ))
-            </filter>
-        </data>
-        <data format="txt" name="output_stdout" label="${tool.name} on ${on_string}: Summary">
-            <filter>
-            ((
-                params['settingsType'] == "custom" and
-                params['bismark_stdout'] is True
-            ))
-            </filter>
-        </data>
-
-        <data format="bam" name="output" label="${tool.name} on ${on_string}: mapped reads">
-          <actions>
-            <conditional name="refGenomeSource.genomeSource">
-              <when value="built_in_indexes">
-                <action type="metadata" name="dbkey">
-                  <option type="from_data_table" name="bismark_indexes" column="1" offset="0">
-                    <filter type="param_value" column="0" value="#" compare="startswith" keep="False"/>
-                    <filter type="param_value" ref="refGenomeSource.built_in_indexes" column="0"/>
-                  </option>
-                </action>
-              </when>
-              <when value="generate_indexes">
-                <action type="metadata" name="dbkey">
-                  <option type="from_data_table" name="all_fasta" column="1" offset="0">
-                    <filter type="param_value" column="0" value="#" compare="startswith" keep="False"/>
-                    <filter type="param_value" ref="refGenomeSource.generate_indexes" column="0"/>
-                  </option>
-                </action>
-              </when>
-            </conditional>
-          </actions>
-        </data>
-
-    	<data format="fastq" name="output_suppressed_reads_l" label="${tool.name} on ${on_string}: suppressed reads (L)">
-      		<filter>
-        	((
-          		params['settingsType'] == "custom" and
-          		params['suppressed_read_file'] is True
-        	))
-      		</filter>
-      		<actions>
-        	<conditional name="singlePaired.sPaired">
-          	<when value="single">
-            	<action type="format">
-              		<option type="from_param" name="singlePaired.input_singles" param_attribute="ext" />
-            	</action>
-          	</when>
-       		</conditional>
-      		</actions>
-   		</data>
-
-    <data format="fastq" name="output_suppressed_reads_r" label="${tool.name} on ${on_string}: suppressed reads (R)">
-      <filter>
-        ((
-            singlePaired['sPaired'] == "paired" and
-          params['settingsType'] == "custom" and
-          params['suppressed_read_file'] is True
-        ))
-      </filter>
-      <actions>
-        <conditional name="singlePaired.sPaired">
-          <when value="single">
-            <action type="format">
-              <option type="from_param" name="singlePaired.input_singles" param_attribute="ext" />
-            </action>
-          </when>
-          <when value="paired">
-            <!--action type="format">
-              <option type="from_param" name="singlePaired.mate_list[0].input_mate1" param_attribute="ext" />
-            </action-->
-          </when>
-        </conditional>
-      </actions>
-    </data>
-
-    <!-- Outout unmapped reads -->
-    <data format="fastq" name="output_unmapped_reads_l" label="${tool.name} on ${on_string}: unmapped reads (L)">
-      <filter>
-        ((
-          params['settingsType'] == "custom" and
-          params['unmapped_read_file'] is True
-        ))
-      </filter>
-      <actions>
-        <conditional name="singlePaired.sPaired">
-          <when value="single">
-            <action type="format">
-              <option type="from_param" name="singlePaired.input_singles" param_attribute="ext" />
-            </action>
-          </when>
-          <when value="paired">
-            <!--action type="format">
-              <option type="from_param" name="singlePaired.mate_list[0].input_mate1" param_attribute="ext" />
-            </action-->
-          </when>
-        </conditional>
-      </actions>
-    </data>
-
-    <data format="fastq" name="output_unmapped_reads_r" label="${tool.name} on ${on_string}: unmapped reads (R)">
-      <filter>
-        ((
-            singlePaired['sPaired'] == "paired" and
-          params['settingsType'] == "custom" and
-          params['unmapped_read_file'] is True
-        ))
-      </filter>
-      <actions>
-        <conditional name="singlePaired.sPaired">
-          <when value="single">
-            <action type="format">
-              <option type="from_param" name="singlePaired.input_singles" param_attribute="ext" />
-            </action>
-          </when>
-          <when value="paired">
-            <!--action type="format">
-              <option type="from_param" name="singlePaired.mate_list[0].input_mate1" param_attribute="ext" />
-            </action-->
-          </when>
-        </conditional>
-      </actions>
-    </data>
-    </outputs>
-
-    <tests>
-    </tests>
-
-  <help>
-<![CDATA[
-
-**What it does**
-
-  | Bismark_ is a bisulfite mapper and methylation caller. Bismark takes in FastA or FastQ files and aligns the reads to a specified bisulfite genome. 
-  | Sequence reads are transformed into a bisulfite converted forward strand version (C->T conversion) or into a bisulfite treated reverse strand (G->A conversion of the forward strand).
-  | Each of these reads are then aligned to bisulfite treated forward strand index of a reference genome (C->T converted) and a bisulfite treated reverse strand index of the genome (G->A conversion of the forward strand, by doing this alignments will produce the same positions). 
-  | These instances of Bowtie 2 are run in parallel. The sequence file(s) are then read in again sequence by sequence to pull out the original sequence from the genome and determine if there were any protected C's present or not.
-  |
-  | As of version 0.7.0 Bismark will only run 2 alignment threads for OT and OB in parallel, the 4 strand mode can be re-enabled by using non_directional mode.
-  |
-  | It is developed by Krueger F and Andrews SR. at the Babraham Institute. Krueger F, Andrews SR. (2011) Bismark: a flexible aligner and methylation caller for Bisulfite-Seq applications. Bioinformatics, 27, 1571-2.
-
-.. _Bismark: http://www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-----
-
-**Know what you are doing**
-
-  .. class:: warningmark
-
-  | There is no such thing (yet) as an automated gearshift in short read mapping. It is all like stick-shift driving in San Francisco.
-  | In other words = running this tool with default parameters will probably not give you meaningful results. 
-  | A way to deal with this is to **understand** the parameters by carefully reading the `documentation`__ and experimenting. Fortunately, Galaxy makes experimenting easy.
-  |
-
-  .. class:: warningmark
-
-  | Make sure all your input reads are in the correct and same format. If thats not the case please adjust/convert the filetype with galaxy's build-in converters.
-
-.. __: http://www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-----
-
-**Input formats**
-
-  | Bismark accepts files in either Sanger FASTQ format (galaxy type *fastqsanger*), Illumina FASTQ format (galaxy type *fastqillumina*) or FASTA format (galaxy type *fasta*). Use the FASTQ Groomer to prepare your files.
-
-----
-
-**A Note on Built-in Reference Genomes**
-
-  | The default variant for all genomes is "Full", defined as all primary chromosomes (or scaffolds/contigs) including mitochondrial plus associated unmapped, plasmid, and other segments. 
-  | When only one version of a genome is available in this tool, it represents the default "Full" variant. Some genomes will have more than one variant available. 
-  | The "Canonical Male" or sometimes simply "Canonical" variant contains the primary chromosomes for a genome. For example a human "Canonical" variant contains chr1-chr22, chrX, chrY, and chrM. The "Canonical Female" variant contains the primary chromosomes excluding chrY.
-
-----
-
-**Outputs**
-
-* The final output of Bismark is in SAM format by default, and has the following columns::
-
-      Column  Description
-    --------  --------------------------------------------------------
-    1  QNAME  seq-ID
-    2  FLAG   this flag tries to take the strand a bisulfite read
-              originated from into account
-              (this is different from ordinary DNA alignment flags!)
-    3  RNAME  chromosome
-    4  POS    start position
-    5  MAPQ   always 255
-    6  CIGAR  extended CIGAR string
-    7  MRNM   Mate Reference sequence NaMe ('=' if same as RNAME)
-    8  MPOS   1-based Mate POSition
-    9  ISIZE  Inferred insert SIZE
-    10 SEQ    query SEQuence on the same strand as the reference
-    11 QUAL   Phred33 scale
-    12 NM-tag edit distance to the reference)
-    13 XX-tag base-by-base mismatches to the reference.
-              This does not include indels.
-    14 XM-tag methylation call string
-    15 XR-tag read conversion state for the alignment
-    16 XG-tag genome conversion state for the alignment
-
-
-  | Each read of paired-end alignments is written out in a separate line in the above format.
-  |
-
-* It looks like this (scroll sideways to see the entire example)::
-
-    QNAME	FLAG	RNAME	POS	MAPQ	CIAGR	MRNM	MPOS	ISIZE	SEQ	QUAL	OPT
-    HWI-EAS91_1_30788AAXX:1:1:1761:343	4	*	0	0	*	*	0	0	AAAAAAANNAAAAAAAAAAAAAAAAAAAAAAAAAAACNNANNGAGTNGNNNNNNNGCTTCCCACAGNNCTGG	hhhhhhh;;hhhhhhhhhhh^hOhhhhghhhfhhhgh;;h;;hhhh;h;;;;;;;hhhhhhghhhh;;Phhh
-    HWI-EAS91_1_30788AAXX:1:1:1578:331	4	*	0	0	*	*	0	0	GTATAGANNAATAAGAAAAAAAAAAATGAAGACTTTCNNANNTCTGNANNNNNNNTCTTTTTTCAGNNGTAG	hhhhhhh;;hhhhhhhhhhhhhhhhhhhhhhhhhhhh;;h;;hhhh;h;;;;;;;hhhhhhhhhhh;;hhVh
-
-----
-
-**Note on Bismark settings**
-
-  | All of the options have a default value. You can change any of them. If any Bismark function is missing please contact the tool author or your Galaxy admin.
-
-----
-
-**Bismark settings**
-
-* **If Paired-End Reads**
-
-  * **Minimum insert size for valid paired-end alignments**
-
-      | The minimum insert size for valid paired-end alignments. E.g. if -I 60 is specified and a paired-end alignment consists of two 20-bp alignments in the appropriate orientation with a 20-bp gap between them, that alignment is considered valid (as long as -X is also satisfied). A 19-bp gap would not be valid in that case. Default: 0.
-      |
-      | Alignment option *-I/--minins <INT>*
-
-
-  * **Maximum insert size for valid paired-end alignments**
-
-      |  The maximum insert size for valid paired-end alignments. E.g. if -X 100 is specified and a paired-end alignment consists of two 20-bp alignments in the proper orientation with a 60-bp gap between them, that alignment is considered valid (as long as -I is also satisfied). A 61-bp gap would not be valid in that case. Default: 500.
-      |
-      | Alignment option *-X/--maxins <INT>*
-
-
-* **Number of mismatches to be allowed in a seed alignment during multiseed alignment**
-
-    | Sets the number of mismatches to allowed in a seed alignment during multiseed alignment. Can be set to 0 or 1. Setting this higher makes alignment slower (often much slower) but increases sensitivity. Default: 0. This option is only available for Bowtie 2 (for Bowtie 1 see -n).
-    |
-    | Bowtie 2 Specific option *-N <INT>*
-
-* **Length of the seed substrings to align during multiseed alignment**
-
-    | Sets the length of the seed substrings to align during multiseed alignment. Smaller values make alignment slower but more senstive. Default: the --sensitive preset of Bowtie 2 is used by default, which sets -L to 20. This option is only available for Bowtie 2 (for Bowtie 1 see -l).
-    |
-    | Bowtie 2 Specific option *-L <INT>*
-
-
-* **How many consecutive seed extension attempts can fail before Bowtie 2 moves on**
-
-    | Up to <int> consecutive seed extension attempts can "fail" before Bowtie 2 moves on, using the alignments found so far. A seed extension "fails" if it does not yield a new best or a new second-best alignment. Default: 15.
-    |
-    | Bowtie 2 Effort option *-D <INT>*
-
-* **Maximum number of times Bowtie 2 will re-seed reads with repetitive seeds**
-
-    | <int> is the maximum number of times Bowtie 2 will "re-seed" reads with repetitive seeds. When "re-seeding," Bowtie 2 simply chooses a new set of reads (same length, same number of mismatches allowed) at different offsets and searches for more alignments. A read is considered to have repetitive seeds if the total number of seed hits divided by the number of seeds that aligned at least once is greater than 300. Default: 2.
-    |
-    | Bowtie 2 Effort option *-R <INT>*
-
-* **Only aligns the first N reads or read pairs from the input**
-
-    | Only aligns the first <int> reads or read pairs from the input. Default: no limit.
-    |
-    | Input option *-u/--upto <INT>*
-
-* **Skip (i.e. do not align) the first N reads or read pairs from the input**
-
-    | Input option *-s/--skip*
-
-* **Disable looking for discordant alignments if it cannot find any concordant alignments**
-
-    | Normally, Bowtie 2 looks for discordant alignments if it cannot find any concordant alignments. A discordant alignment is an alignment where both mates align uniquely, but that does not satisfy the paired-end constraints (--fr/--rf/--ff, -I, -X). This option disables that behavior and it is on by default.
-    |
-    | Bowtie 2 Paired-End option *--no-discordant*
-
-* **Disable Bowtie 2's behaviour to try to find alignments for the individual mates**
-
-    | This option disables Bowtie 2's behavior to try to find alignments for the individual mates if it cannot find a concordant or discordant alignment for a pair. This option is invariable and on by default.
-    |
-    | Bowtie 2 Paired-End option *--no-mixed*
-
-* **Write ambiguous reads to an extra output file**
-
-    | Write all reads which produce more than one valid alignment with the same number of lowest mismatches or other reads that fail to align uniquely to a file in the output directory. Written reads will appear as they did in the input, without any of the translation of quality values that may have taken place within Bowtie or Bismark. Paired-end reads will be written to two parallel files with _1 and _2 inserted in theit filenames, i.e. _ambiguous_reads_1.txt and _ambiguous_reads_2.txt. These reads are not written to the file specified with --un.
-    |
-    | Output option *--ambiguous*
-
-* **Write all reads that could not be aligned to a file**
-
-    | Write all reads that could not be aligned to a file in the output directory. Written reads will appear as they did in the input, without any translation of quality values that may have taken place within Bowtie or Bismark. Paired-end reads will be written to two parallel files with _1 and _2 inserted in their filenames, i.e. _unmapped_reads_1.txt and unmapped_reads_2.txt. Reads with more than one valid alignment with the same number of lowest mismatches (ambiguous mapping) are also written to _unmapped_reads.txt unless the option --ambiguous is specified as well.
-    |
-    | Output option *-un/--unmapped*
-
-* **Offer all report files concatenated in one file**
-
-    | Prints out a Bismark mapping report
-
-]]>
-  </help>
-  <citations>
-      <citation type="doi">10.1093/bioinformatics/btr167</citation>
-  </citations>
-</tool>
\ No newline at end of file
--- a/bismark_mapping/bismark_genome_preparation	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,632 +0,0 @@
-#!/usr/bin/env perl
-use strict;
-use warnings;
-use Cwd;
-use Getopt::Long;
-$|++;
-
-
-## This program is Copyright (C) 2010-16, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-my $verbose;
-my $help;
-my $version;
-my $man;
-my $path_to_bowtie;
-my $multi_fasta;
-my $single_fasta;
-my $bowtie2;
-my $bowtie1;
-my $parent_dir = getcwd();
-
-my $genomic_composition;
-my %genomic_freqs; # storing the genomic sequence composition
-my %freqs;
-
-my $bismark_version = 'v0.16.3';
-
-GetOptions ('verbose' => \$verbose,
-	    'help' => \$help,
-	    'man' => \$man,
-	    'version' => \$version,
-	    'path_to_bowtie:s' => \$path_to_bowtie,
-	    'single_fasta' => \$single_fasta,
-	    'bowtie2' => \$bowtie2,
-	    'bowtie1' => \$bowtie1,
-	    'genomic_composition' => \$genomic_composition,
-	   );
-
-if ($help or $man){
-  print_helpfile();
-  exit;
-}
-
-if ($version){
-  print << "VERSION";
-
-          Bismark - Bisulfite Mapper and Methylation Caller.
-
-          Bismark Genome Preparation Version: $bismark_version
-        Copyright 2010-16 Felix Krueger, Babraham Bioinformatics
-              www.bioinformatics.babraham.ac.uk/projects/
-
-VERSION
-  exit;
-}
-
-my $genome_folder = shift @ARGV; # mandatory
-my %chromosomes; # checking if chromosome names are unique (required)
-
-# Ensuring a genome folder has been specified
-if ($genome_folder){
-    unless ($genome_folder =~ /\/$/){
-	$genome_folder =~ s/$/\//;
-    }
-    $verbose and print "Path to genome folder specified as: $genome_folder\n";
-    chdir $genome_folder or die "Could't move to directory $genome_folder. Make sure the directory exists! $!";
-    
-    # making the genome folder path abolsolute so it won't break if the path was specified relative
-    $genome_folder = getcwd();
-    unless ($genome_folder =~ /\/$/){
-	$genome_folder =~ s/$/\//;
-    }
-}
-else{
-    die "Please specify a genome folder to be used for bisulfite conversion\n\n";
-}
-
-
-my $CT_dir;
-my $GA_dir;
-
-if ($bowtie1){
-  if ($bowtie2){
-    die "You may not select both --bowtie1 and --bowtie2. Make your pick! (default is Bowtie2)\n";
-  }
-  $bowtie2 = 0;
-  $verbose and print "Aligner to be used: Bowtie (1)\n";
-}
-else{ # Bowtie 2 is now the default mode (as of 27 July 2015)
-  if ($bowtie2){
-    $verbose and print "Aligner to be used: Bowtie 2 (user-defined)\n";
-  }
-  else{
-    $verbose and print "Aligner to be used: Bowtie 2 (default)\n";
-  }
-  $bowtie2 = 1;
-}
-
-if ($single_fasta){
-  warn "Writing individual genomes out into single-entry fasta files (one per chromosome)\n\n";
-  $multi_fasta = 0;
-}
-else{
-  warn "Writing bisulfite genomes out into a single MFA (multi FastA) file\n\n";
-  $single_fasta = 0;
-  $multi_fasta = 1;
-}
-
-my @filenames = create_bisulfite_genome_folders();
-
-if ($genomic_composition){
-    get_genomic_frequencies();
-    warn "Finished processing genomic nucleotide frequencies\n\n";
-    %chromosomes = (); # resetting
-}
-
-process_sequence_files ();
-
-launch_bowtie_indexer();
-
-sub launch_bowtie_indexer{
-  if ($bowtie2){
-    warn "Bismark Genome Preparation - Step III: Launching the Bowtie 2 indexer\n";
-  }
-  else{
-    warn "Bismark Genome Preparation - Step III: Launching the Bowtie (1) indexer\n";
-  }
-  print "Please be aware that this process can - depending on genome size - take several hours!\n";
-  sleep(1);
-
-  ### if the path to bowtie was specfified explicitely
-  if ($path_to_bowtie){
-    if ($bowtie2){
-      $path_to_bowtie =~ s/$/bowtie2-build/;
-    }
-    else{
-      $path_to_bowtie =~ s/$/bowtie-build/;
-    }
-  }
-  ### otherwise we assume that bowtie-build is in the path
-  else{
-    if ($bowtie2){
-      $path_to_bowtie = 'bowtie2-build';
-    }
-    else{
-      $path_to_bowtie = 'bowtie-build';
-    }
-  }
-
-  $verbose and print "\n";
-
-  ### Forking the program to run 2 instances of Bowtie-build or Bowtie2-build (= the Bowtie (1/2) indexer)
-  my $pid = fork();
-
-  # parent process
-  if ($pid){
-    sleep(1);
-    chdir $CT_dir or die "Unable to change directory: $!\n";
-    $verbose and warn "Preparing indexing of CT converted genome in $CT_dir\n";
-    my @fasta_files = <*.fa>;
-    my $file_list = join (',',@fasta_files);
-    $verbose and print "Parent process: Starting to index C->T converted genome with the following command:\n\n";
-    $verbose and print "$path_to_bowtie -f $file_list BS_CT\n\n";
-
-    system ("$path_to_bowtie","-f","$file_list","BS_CT")== 0 or die "Parent process: Failed to build index\n";
-    waitpid( $pid, 0 );
-    $? == 0 or die "Parent process: Child process failed\n";
-  }
-
-  # child process
-  elsif ($pid == 0){
-    sleep(2);
-    chdir $GA_dir or die "Unable to change directory: $!\n";
-    $verbose and warn "Preparing indexing of GA converted genome in $GA_dir\n";
-    my @fasta_files = <*.fa>;
-    my $file_list = join (',',@fasta_files);
-    $verbose and print "Child process: Starting to index G->A converted genome with the following command:\n\n";
-    $verbose and print "$path_to_bowtie -f $file_list BS_GA\n\n";
-
-    exec ("$path_to_bowtie","-f","$file_list","BS_GA");
-  }
-
-  # if the platform doesn't support the fork command we will run the indexing processes one after the other
-  else{
-    print "Forking process was not successful, therefore performing the indexing sequentially instead\n";
-    # sleep(10);
-
-    ### moving to CT genome folder
-    $verbose and warn "Preparing to index CT converted genome in $CT_dir\n";
-    chdir $CT_dir or die "Unable to change directory: $!\n";
-    my @fasta_files = <*.fa>;
-    my $file_list = join (',',@fasta_files);
-    $verbose and print "$file_list\n\n";
-    # sleep(2);
-    system ("$path_to_bowtie","-f","$file_list","BS_CT");
-    @fasta_files=();
-    $file_list= '';
-
-    ### moving to GA genome folder
-    $verbose and warn "Preparing to index GA converted genome in $GA_dir\n";
-    chdir $GA_dir or die "Unable to change directory: $!\n";
-    @fasta_files = <*.fa>;
-    $file_list = join (',',@fasta_files);
-    $verbose and print "$file_list\n\n";
-    # sleep(2);
-    exec ("$path_to_bowtie","-f","$file_list","BS_GA");
-  }
-}
-
-
-sub process_sequence_files {
-
-  my ($total_CT_conversions,$total_GA_conversions) = (0,0);
-  $verbose and print "Bismark Genome Preparation - Step II: Bisulfite converting reference genome\n\n";
-  sleep (3);
-
-  $verbose and print "conversions performed:\n";
-  $verbose and print join("\t",'chromosome','C->T','G->A'),"\n";
-
-
-  ### If someone wants to index a genome which consists of thousands of contig and scaffold files we need to write the genome conversions into an MFA file
-  ### Otherwise the list of comma separated chromosomes we provide for bowtie-build will get too long for the kernel to handle
-  ### This is now the default option
-
-  if ($multi_fasta){
-    ### Here we just use one multi FastA file name, append .CT_conversion or .GA_conversion and print all sequence conversions into these files
-    my $bisulfite_CT_conversion_filename = "$CT_dir/genome_mfa.CT_conversion.fa";
-    open (CT_CONVERT,'>',$bisulfite_CT_conversion_filename) or die "Can't write to file $bisulfite_CT_conversion_filename: $!\n";
-
-    my $bisulfite_GA_conversion_filename = "$GA_dir/genome_mfa.GA_conversion.fa";
-    open (GA_CONVERT,'>',$bisulfite_GA_conversion_filename) or die "Can't write to file $bisulfite_GA_conversion_filename: $!\n";
-  }
-
-  foreach my $filename(@filenames){
-    my ($chromosome_CT_conversions,$chromosome_GA_conversions) = (0,0);
-    open (IN,$filename) or die "Failed to read from sequence file $filename $!\n";
-    # warn "Reading chromosome information from $filename\n\n";
-
-    ### first line needs to be a fastA header
-    my $first_line = <IN>;
-    chomp $first_line;
-
-    ### Extracting chromosome name from the FastA header
-    my $chromosome_name = extract_chromosome_name($first_line);
-
-    ### Exiting if a chromosome with the same name was present already
-    if (exists $chromosomes{$chromosome_name}){
-      die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name!\n";
-    }
-    else{
-      $chromosomes{$chromosome_name}++;
-    }
-
-    ### alternatively, chromosomes can be written out into single-entry FastA files. This will only work for genomes with up to a few hundred chromosomes.
-    unless ($multi_fasta){
-      my $bisulfite_CT_conversion_filename = "$CT_dir/$chromosome_name";
-      $bisulfite_CT_conversion_filename =~ s/$/.CT_conversion.fa/;
-      open (CT_CONVERT,'>',$bisulfite_CT_conversion_filename) or die "Can't write to file $bisulfite_CT_conversion_filename: $!\n";
-
-      my $bisulfite_GA_conversion_filename = "$GA_dir/$chromosome_name";
-      $bisulfite_GA_conversion_filename =~ s/$/.GA_conversion.fa/;
-      open (GA_CONVERT,'>',$bisulfite_GA_conversion_filename) or die "Can't write to file $bisulfite_GA_conversion_filename: $!\n";
-    }
-
-    print CT_CONVERT ">",$chromosome_name,"_CT_converted\n"; # first entry
-    print GA_CONVERT ">",$chromosome_name,"_GA_converted\n"; # first entry
-
-
-    while (<IN>){
-
-      ### in case the line is a new fastA header
-      if ($_ =~ /^>/){
-	### printing out the stats for the previous chromosome
-	$verbose and print join ("\t",$chromosome_name,$chromosome_CT_conversions,$chromosome_GA_conversions),"\n";
-	### resetting the chromosome transliteration counters
-	($chromosome_CT_conversions,$chromosome_GA_conversions) = (0,0);
-	
-	### Extracting chromosome name from the additional FastA header
-	$chromosome_name = extract_chromosome_name($_);
-
-	### alternatively, chromosomes can be written out into single-entry FastA files. This will only work for genomes with up to a few hundred chromosomes.
-	unless ($multi_fasta){
-	  my $bisulfite_CT_conversion_filename = "$CT_dir/$chromosome_name";
-	  $bisulfite_CT_conversion_filename =~ s/$/.CT_conversion.fa/;
-	  open (CT_CONVERT,'>',$bisulfite_CT_conversion_filename) or die "Can't write to file $bisulfite_CT_conversion_filename: $!\n";
-	
-	  my $bisulfite_GA_conversion_filename = "$GA_dir/$chromosome_name";
-	  $bisulfite_GA_conversion_filename =~ s/$/.GA_conversion.fa/;
-	  open (GA_CONVERT,'>',$bisulfite_GA_conversion_filename) or die "Can't write to file $bisulfite_GA_conversion_filename: $!\n";
-	}
-
-	print CT_CONVERT ">",$chromosome_name,"_CT_converted\n";
-	print GA_CONVERT ">",$chromosome_name,"_GA_converted\n";
-      }
-
-      else{
-	my $sequence = uc$_;
-
-	### (I) First replacing all ambiguous sequence characters (such as M,S,R....) by N (G,A,T,C,N and the line endings \r and \n are added to a character group)
-	
-	$sequence =~ s/[^ATCGN\n\r]/N/g;
-	
-	### (II) Writing the chromosome out into a C->T converted version (equals forward strand conversion)
-	
-	my $CT_sequence = $sequence;
-	my $CT_transliterations_performed = ($CT_sequence =~ tr/C/T/); # converts all Cs into Ts
-	$total_CT_conversions += $CT_transliterations_performed;
-	$chromosome_CT_conversions += $CT_transliterations_performed;
-	
-	print CT_CONVERT $CT_sequence;
-	
-	### (III) Writing the chromosome out in a G->A converted version of the forward strand (this is equivalent to reverse-
-	### complementing the forward strand and then C->T converting it)
-	
-	my $GA_sequence = $sequence;
-	my $GA_transliterations_performed = ($GA_sequence =~ tr/G/A/); # converts all Gs to As on the forward strand
-	$total_GA_conversions += $GA_transliterations_performed;
-	$chromosome_GA_conversions += $GA_transliterations_performed;
-	
-	print GA_CONVERT $GA_sequence;
-	
-      }
-    }
-    $verbose and print join ("\t",$chromosome_name,$chromosome_CT_conversions,$chromosome_GA_conversions),"\n";
-  }
-  close (CT_CONVERT) or die "Failed to close filehandle: $!\n";
-  close (GA_CONVERT) or die "Failed to close filehandle: $!\n";
-
-
-  print "\nTotal number of conversions performed:\n";
-  print "C->T:\t$total_CT_conversions\n";
-  print "G->A:\t$total_GA_conversions\n";
-
-  warn "\nStep II - Genome bisulfite conversions - completed\n\n\n";
-}
-
-sub get_genomic_frequencies{
-    
-    warn "Calculating genomic frequencies (this may take several minutes depending on genome size) ...\n";
-    warn "="x164,"\n";
-    read_genome_into_memory($parent_dir);
-    foreach my $chr (keys %chromosomes){
-	warn "Processing chromosome >> $chr <<\n";
-	process_sequence($chromosomes{$chr});
-    }
-    
-    %genomic_freqs = %freqs;
-    
-    ### Attempting to write a genomic nucleotide frequency table out to the genome folder so we can re-use it next time without the need to re-calculate
-    ### if this fails
-    if  ( open (FREQS,'>',"${genome_folder}genomic_nucleotide_frequencies.txt") ){
-	warn "Writing genomic nucleotide frequencies to the file >${genome_folder}genomic_nucleotide_frequencies.txt< for future re-use\n";
-	foreach my $f(sort keys %genomic_freqs){
-	    warn "Writing count of (di-)nucleotide: $f\t$genomic_freqs{$f}\n";
-	    print FREQS "$f\t$genomic_freqs{$f}\n";
-	}
-	close FREQS or warn "Failed to close filehandle FREQS: $!\n\n";
-    }
-    else{
-	warn "Failed to write out file ${genome_folder}genomic_nucleotide_frequencies.txt because of: $!. Skipping writing out genomic frequency table\n\n";
-    }
-}
-
-
-sub process_sequence{
-    
-    my $seq = shift;
-    my $mono;
-    my $di;
-
-    foreach my $index (0..(length$seq)-1){
-	my $counted = 0;
-	if ($index%10000000==0){
-	    # warn "Current index number is $index\n";
-	}
-	
-	$mono = substr($seq,$index,1);
-	unless ( $mono eq 'N'){
-	    $freqs{$mono}++;
-	}
-	
-	unless ( ($index + 2) > length$seq ){
-	    $di = substr($seq,$index,2);
-	    if (index($di,'N') < 0) {
-		$freqs{$di}++;
-	    }
-	}
-    }
-    
-}
-
-sub extract_chromosome_name {
-  ## Bowtie extracts the first string after the inition > in the FASTA file, so we are doing this as well
-  my $fasta_header = shift;
-  if ($fasta_header =~ s/^>//){
-    my ($chromosome_name) = split (/\s+/,$fasta_header);
-    return $chromosome_name;
-  }
-  else{
-    die "The specified chromosome ($fasta_header) file doesn't seem to be in FASTA format as required!\n";
-  }
-}
-
-
-sub create_bisulfite_genome_folders{
-
-  $verbose and print "Bismark Genome Preparation - Step I: Preparing folders\n\n";
-
-  if ($path_to_bowtie){
-    unless ($path_to_bowtie =~ /\/$/){
-      $path_to_bowtie =~ s/$/\//;
-    }
-    if (chdir $path_to_bowtie){
-      if ($bowtie2){
-	$verbose and print "Path to Bowtie 2 specified: $path_to_bowtie\n";
-      }
-      else{
-	$verbose and print "Path to Bowtie (1) specified: $path_to_bowtie\n";
-      }
-    }
-    else{
-      die "There was an error with the path to bowtie: $!\n";
-    }
-  }
-
-  chdir $genome_folder or die "Could't move to directory $genome_folder. Make sure the directory exists! $!";
-
-
-  # Exiting unless there are fastA files in the folder
-  my @filenames = <*.fa>;
-
-  ### if there aren't any genomic files with the extension .fa we will look for files with the extension .fasta
-  unless (@filenames){
-    @filenames =  <*.fasta>;
-  }
-
-  unless (@filenames){
-    die "The specified genome folder $genome_folder does not contain any sequence files in FastA format (with .fa or .fasta file extensions\n";
-  }
-
-  warn "Bisulfite Genome Indexer version $bismark_version (last modified 25 August 2015)\n\n";
-  sleep (3);
-
-  # creating a directory inside the genome folder to store the bisfulfite genomes unless it already exists
-  my $bisulfite_dir = "${genome_folder}Bisulfite_Genome/";
-  unless (-d $bisulfite_dir){
-    mkdir $bisulfite_dir or die "Unable to create directory $bisulfite_dir $!\n";
-    $verbose and print "Created Bisulfite Genome folder $bisulfite_dir\n";
-  }
-  else{
-    print "\nA directory called $bisulfite_dir already exists. Bisulfite converted sequences and/or already existing Bowtie (1 or 2) indices will be overwritten!\n\n";
-    sleep(5);
-  }
-
-  chdir $bisulfite_dir or die "Unable to move to $bisulfite_dir\n";
-  $CT_dir = "${bisulfite_dir}CT_conversion/";
-  $GA_dir = "${bisulfite_dir}GA_conversion/";
-
-  # creating 2 subdirectories to store a C->T (forward strand conversion) and a G->A (reverse strand conversion)
-  # converted version of the genome
-  unless (-d $CT_dir){
-    mkdir $CT_dir or die "Unable to create directory $CT_dir $!\n";
-    $verbose and print "Created Bisulfite Genome folder $CT_dir\n";
-  }
-  unless (-d $GA_dir){
-    mkdir $GA_dir or die "Unable to create directory $GA_dir $!\n";
-    $verbose and print "Created Bisulfite Genome folder $GA_dir\n";
-  }
-
-  # moving back to the original genome folder
-  chdir $genome_folder or die "Could't move to directory $genome_folder $!";
-  # $verbose and print "Moved back to genome folder folder $genome_folder\n";
-  warn "\nStep I - Prepare genome folders - completed\n\n\n";
-  return @filenames;
-}
-
-sub read_genome_into_memory{
-
-  ## reading in and storing the specified genome in the %chromosomes hash
-  chdir ($genome_folder) or die "Can't move to $genome_folder: $!";
-  warn "Now reading in and storing sequence information of the genome specified in: $genome_folder\n\n";
-
-  my @chromosome_filenames =  <*.fa>;
-
-  ### if there aren't any genomic files with the extension .fa we will look for files with the extension .fasta
-  unless (@chromosome_filenames){
-    @chromosome_filenames =  <*.fasta>;
-  }
-  unless (@chromosome_filenames){
-    die "The specified genome folder $genome_folder does not contain any sequence files in FastA format (with .fa or .fasta file extensions)\n";
-  }
-
-  foreach my $chromosome_filename (@chromosome_filenames){
-
-    # skipping the tophat entire mouse genome fasta file
-    next if ($chromosome_filename eq 'Mus_musculus.NCBIM37.fa');
-
-    open (CHR_IN,$chromosome_filename) or die "Failed to read from sequence file $chromosome_filename $!\n";
-    ### first line needs to be a fastA header
-    my $first_line = <CHR_IN>;
-    chomp $first_line;
-    $first_line =~ s/\r//; # removing /r carriage returns
-
-    ### Extracting chromosome name from the FastA header
-    my $chromosome_name = extract_chromosome_name($first_line);
-	
-    my $sequence;
-    while (<CHR_IN>){
-      chomp;
-      $_ =~ s/\r//; # removing /r carriage returns
-
-      if ($_ =~ /^>/){
-	### storing the previous chromosome in the %chromosomes hash, only relevant for Multi-Fasta-Files (MFA)
-	if (exists $chromosomes{$chromosome_name}){
-	  warn "chr $chromosome_name (",length $sequence ," bp)\n";
-	  die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name!\n";
-	}
-	else {
-	  if (length($sequence) == 0){
-	    warn "Chromosome $chromosome_name in the multi-fasta file $chromosome_filename did not contain any sequence information!\n";
-	  }
-	  warn "chr $chromosome_name (",length $sequence ," bp)\n";
-	  $chromosomes{$chromosome_name} = $sequence;
-	}
-	### resetting the sequence variable
-	$sequence = '';
-	### setting new chromosome name
-	$chromosome_name = extract_chromosome_name($_);
-      }
-      else{
-	$sequence .= uc$_;
-      }
-    }
-
-    if (exists $chromosomes{$chromosome_name}){
-      warn "chr $chromosome_name (",length $sequence ," bp)\t";
-      die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name.\n";
-    }
-    else{
-      if (length($sequence) == 0){
-	warn "Chromosome $chromosome_name in the file $chromosome_filename did not contain any sequence information!\n";
-      }
-      warn "chr $chromosome_name (",length $sequence ," bp)\n";
-      $chromosomes{$chromosome_name} = $sequence;
-    }
-  }
-  warn "\n";
-  chdir $parent_dir or die "Failed to move to directory $parent_dir\n";
-}
-
-
-
-
-sub print_helpfile{
-  print << 'HOW_TO';
-
-
-DESCRIPTION
-
-This script is supposed to convert a specified reference genome into two different bisulfite
-converted versions and index them for alignments with Bowtie 2 (default), or Bowtie 1. The first
-bisulfite genome will have all Cs converted to Ts (C->T), and the other one will have all Gs
-converted to As (G->A). Both bisulfite genomes will be stored in subfolders within the reference
-genome folder. Once the bisulfite conversion has been completed the program will fork and launch
-two simultaneous instances of the Bowtie 1 or 2 indexer (bowtie-build or bowtie2-build). Be aware
-that the indexing process can take up to several hours; this will mainly depend on genome size
-and system resources.
-
-
-
-The following is a brief description of command line options and arguments to control the
-Bismark Genome Preparation:
-
-
-USAGE: bismark_genome_preparation [options] <arguments>
-
-
-OPTIONS:
-
---help/--man             Displays this help filea and exits.
-
---version                Displays version information and exits.
-
---verbose                Print verbose output for more details or debugging.
-
---path_to_bowtie </../>  The full path to the Bowtie 1 or Bowtie 2 installation on your system
-                         (depending on which aligner/indexer you intend to use). Unless this path
-                         is specified it is assumed that Bowtie is in the PATH.
-
---bowtie2                This will create bisulfite indexes for Bowtie 2. (Default: ON).
-
---bowtie1                This will create bisulfite indexes for Bowtie 1. (Default: OFF).
-
---single_fasta           Instruct the Bismark Indexer to write the converted genomes into
-                         single-entry FastA files instead of making one multi-FastA file (MFA)
-                         per chromosome. This might be useful if individual bisulfite converted
-                         chromosomes are needed (e.g. for debugging), however it can cause a
-                         problem with indexing if the number of chromosomes is vast (this is likely
-                         to be in the range of several thousand files; the operating system can
-                         only handle lists up to a certain length, and some newly assembled
-                         genomes may contain 20000-500000 contigs of scaffold files which do exceed
-                         this list length limit).
-
---genomic_composition    Calculate and extract the genomic sequence composition for mono and di-nucleotides
-                         and write the genomic composition table 'genomic_nucleotide_frequencies.txt' to the
-                         genome folder. This may be useful later on when using bam2nuc or the Bismark option
-                         --nucleotide_coverage.
-
-
-ARGUMENTS:
-
-<path_to_genome_folder>  The path to the folder containing the genome to be bisulfite converted.
-                         The Bismark Genome Preparation expects one or more fastA files in the folder
-                         (with the file extension: .fa or .fasta). Specifying this path is mandatory.
-
-
-This script was last modified on 07 July 2016.
-HOW_TO
-}
--- a/bismark_mapping/bismark_wrapper.py	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,379 +0,0 @@
-#!/usr/bin/env python
-
-import argparse
-import os
-import shutil
-import subprocess
-import sys
-import shlex
-import tempfile
-import fileinput
-import fileinput
-from glob import glob
-
-def stop_err( msg ):
-    sys.stderr.write( "%s\n" % msg )
-    sys.exit()
-
-def __main__():
-
-    #Parse Command Line
-    parser = argparse.ArgumentParser(description='Wrapper for the bismark bisulfite mapper.')
-    parser.add_argument( '-p', '--num-threads', dest='num_threads',
-        type=int, default=4, help='Use this many threads to align reads. The default is 4.' )
-
-    parser.add_argument( '--bismark_path', dest='bismark_path', help='Path to the bismark perl scripts' )
-
-    parser.add_argument( '--bowtie2', action='store_true', default=False, help='Running bismark with bowtie2 and not with bowtie.' )
-
-    # input options
-    parser.add_argument( '--own-file', dest='own_file', help='' )
-    parser.add_argument( '-D', '--indexes-path', dest='index_path', help='Indexes directory; location of .ebwt and .fa files.' )
-    parser.add_argument( '-O', '--output', dest='output' )
-
-
-    parser.add_argument( '--output-report-file', dest='output_report_file' )
-    parser.add_argument( '--suppress-header', dest='suppress_header', action="store_true" )
-
-    parser.add_argument( '--mate-paired', dest='mate_paired', action='store_true', help='Reads are mate-paired', default=False)
-
-
-    parser.add_argument( '-1', '--mate1', dest='mate1',
-        help='The forward reads file in Sanger FASTQ or FASTA format.' )
-    parser.add_argument( '-2', '--mate2', dest='mate2',
-        help='The reverse reads file in Sanger FASTQ or FASTA format.' )
-    parser.add_argument( '--sort-bam', dest='sort_bam', action="store_true" )
-
-    parser.add_argument( '--output-unmapped-reads', dest='output_unmapped_reads',
-        help='Additional output file with unmapped reads (single-end).' )
-    parser.add_argument( '--output-unmapped-reads-l', dest='output_unmapped_reads_l',
-        help='File name for unmapped reads (left, paired-end).' )
-    parser.add_argument( '--output-unmapped-reads-r', dest='output_unmapped_reads_r',
-        help='File name for unmapped reads (right, paired-end).' )
-
-
-    parser.add_argument( '--output-suppressed-reads', dest='output_suppressed_reads',
-        help='Additional output file with suppressed reads (single-end).' )
-    parser.add_argument( '--output-suppressed-reads-l', dest='output_suppressed_reads_l',
-        help='File name for suppressed reads (left, paired-end).' )
-    parser.add_argument( '--output-suppressed-reads-r', dest='output_suppressed_reads_r',
-        help='File name for suppressed reads (right, paired-end).' )
-    parser.add_argument( '--stdout', dest='output_stdout',
-        help='File name for the standard output of bismark.' )
-
-
-    parser.add_argument( '--single-paired', dest='single_paired',
-         help='The single-end reads file in Sanger FASTQ or FASTA format.' )
-
-    parser.add_argument( '--fastq', action='store_true', help='Query filetype is in FASTQ format')
-    parser.add_argument( '--fasta', action='store_true', help='Query filetype is in FASTA format')
-    parser.add_argument( '--phred64-quals', dest='phred64', action="store_true" )
-
-
-    parser.add_argument( '--skip-reads', dest='skip_reads', type=int )
-    parser.add_argument( '--qupto', type=int)
-
-
-    # paired end options
-    parser.add_argument( '-I', '--minins', dest='min_insert' )
-    parser.add_argument( '-X', '--maxins', dest='max_insert' )
-    parser.add_argument( '--no-mixed', dest='no_mixed', action="store_true" )
-    parser.add_argument( '--no-discordant', dest='no_discordant', action="store_true" )
-
-    #parse general options
-    # default 20
-    parser.add_argument( '--seed-len', dest='seed_len', type=int)
-    # default 15
-    parser.add_argument( '--seed-extention-attempts', dest='seed_extention_attempts', type=int )
-    # default 0
-    parser.add_argument( '--seed-mismatches', dest='seed_mismatches', type=int )
-    # default 2
-    parser.add_argument( '--max-reseed', dest='max_reseed', type=int )
-    """
-    # default 70
-    parser.add_argument( '--maqerr', dest='maqerr', type=int )
-    """
-    
-    """
-    The number of megabytes of memory a given thread is given to store path
-    descriptors in --best mode. Best-first search must keep track of many paths
-    at once to ensure it is always extending the path with the lowest cumulative
-    cost. Bowtie tries to minimize the memory impact of the descriptors, but
-    they can still grow very large in some cases. If you receive an error message
-    saying that chunk memory has been exhausted in --best mode, try adjusting
-    this parameter up to dedicate more memory to the descriptors. Default: 512.
-    """
-    parser.add_argument( '--chunkmbs', type=int, default=512 )
-
-    args = parser.parse_args()
-
-    # Create bismark index if necessary.
-    index_dir = ""
-    if args.own_file:
-        """
-            Create a temporary index with the offered files from the user.
-            Utilizing the script: bismark_genome_preparation
-            bismark_genome_preparation --bowtie2 hg19/
-        """
-        tmp_index_dir = tempfile.mkdtemp()
-        index_path = os.path.join( tmp_index_dir, '.'.join( os.path.split( args.own_file )[1].split( '.' )[:-1] ) )
-        try:
-            """
-                Create a hard link pointing to args.own_file named 'index_path'.fa.
-            """
-            os.symlink( args.own_file, index_path + '.fa' )
-        except Exception, e:
-            if os.path.exists( tmp_index_dir ):
-                shutil.rmtree( tmp_index_dir )
-            stop_err( 'Error in linking the reference database.\n' + str( e ) )
-        # bismark_genome_preparation needs the complete path to the folder in which the database is stored
-        if args.bowtie2:
-            cmd_index = 'bismark_genome_preparation --bowtie2 %s ' % ( tmp_index_dir )
-        else:
-            cmd_index = 'bismark_genome_preparation %s ' % ( tmp_index_dir )
-        if args.bismark_path:
-            if os.path.exists(args.bismark_path):
-                # add the path to the bismark perl scripts, that is needed for galaxy
-                cmd_index = os.path.join(args.bismark_path, cmd_index)
-            else:
-                # assume the same directory as that script
-                cmd_index = 'perl %s' % os.path.join(os.path.realpath(os.path.dirname(__file__)), cmd_index)
-        try:
-            tmp = tempfile.NamedTemporaryFile( dir=tmp_index_dir ).name
-            tmp_stderr = open( tmp, 'wb' )
-            proc = subprocess.Popen( args=cmd_index, shell=True, cwd=tmp_index_dir, stdout=open(os.devnull, 'wb'), stderr=tmp_stderr.fileno() )
-            returncode = proc.wait()
-            tmp_stderr.close()
-            # get stderr, allowing for case where it's very large
-            tmp_stderr = open( tmp, 'rb' )
-            stderr = ''
-            buffsize = 1048576
-            try:
-                while True:
-                    stderr += tmp_stderr.read( buffsize )
-                    if not stderr or len( stderr ) % buffsize != 0:
-                        break
-            except OverflowError:
-                pass
-            tmp_stderr.close()
-            if returncode != 0:
-                raise Exception, stderr
-        except Exception, e:
-            if os.path.exists( tmp_index_dir ):
-                shutil.rmtree( tmp_index_dir )
-            stop_err( 'Error indexing reference sequence\n' + str( e ) )
-        index_dir = tmp_index_dir
-    else:
-        # bowtie path is the path to the index directory and the first path of the index file name
-        index_dir = os.path.dirname( args.index_path )
-
-    # Build bismark command
-    
-    """
-    Bismark requires a large amount of temporary disc space. If that is not available, for example on a cluster you can hardcode the
-    TMP to some larger space. It's not recommended but it works.
-    """
-    #tmp_bismark_dir = tempfile.mkdtemp( dir='/data/0/galaxy_db/tmp/' )
-    tmp_bismark_dir = tempfile.mkdtemp()
-    output_dir = os.path.join( tmp_bismark_dir, 'results')
-    cmd = 'bismark %(args)s --bam --temp_dir %(tmp_bismark_dir)s --gzip -o %(output_dir)s --quiet %(genome_folder)s %(reads)s'
-
-    if args.fasta:
-        # the query input files (specified as mate1,mate2 or singles) are FastA
-        cmd = '%s %s' % (cmd, '--fasta')
-    elif args.fastq:
-        cmd = '%s %s' % (cmd, '--fastq')
-
-    if args.bismark_path:
-        # add the path to the bismark perl scripts, that is needed for galaxy
-        if os.path.exists(args.bismark_path):
-            cmd = os.path.join(args.bismark_path, cmd)
-        else:
-            # assume the same directory as that script
-            cmd = 'perl %s' % os.path.join(os.path.realpath(os.path.dirname(__file__)), cmd)
-
-    arguments = {
-        'genome_folder': index_dir,
-        'args': '',
-        'tmp_bismark_dir': tmp_bismark_dir,
-        'output_dir': output_dir,
-        }
-
-    additional_opts = ''
-    # Set up the reads
-    if args.mate_paired:
-        # paired-end reads library
-        reads = '-1 %s ' % ( args.mate1 )
-        reads += ' -2 %s ' % ( args.mate2 )
-        additional_opts += ' -I %s -X %s ' % (args.min_insert, args.max_insert)
-    else:
-        # single paired reads library
-        reads = ' %s ' % ( args.single_paired )
-
-
-    if not args.bowtie2:
-        # use bowtie specific options
-        #additional_opts += ' --best ' # bug in bismark, --best is not available as option. Only --non-best, best-mode is activated by default
-        if args.seed_mismatches:
-            # --seedmms
-            additional_opts += ' -n %s ' % args.seed_mismatches
-        if args.seed_len:
-            # --seedlen
-            additional_opts += ' -l %s ' % args.seed_len
-
-    # alignment options
-    if args.bowtie2:
-        additional_opts += ' -p %s --bowtie2 ' % (int(args.num_threads/2)) #divides by 2 here since bismark will spawn 2 (original top and original bottom) jobs with -p threads each
-        if args.seed_mismatches:
-            additional_opts += ' -N %s ' % args.seed_mismatches
-        if args.seed_len:
-            additional_opts += ' -L %s ' % args.seed_len
-        if args.seed_extention_attempts:
-            additional_opts += ' -D %s ' % args.seed_extention_attempts
-        if args.max_reseed:
-            additional_opts += ' -R %s ' % args.max_reseed
-        if args.no_discordant:
-            additional_opts += ' --no-discordant '
-        if args.no_mixed:
-            additional_opts += ' --no-mixed '
-    """
-    if args.maqerr:
-        additional_opts += ' --maqerr %s ' % args.maqerr
-    """
-    if args.skip_reads:
-        additional_opts += ' --skip %s ' % args.skip_reads
-    if args.qupto:
-        additional_opts += ' --qupto %s ' % args.qupto
-    if args.phred64:
-        additional_opts += ' --phred64-quals '
-    if args.suppress_header:
-        additional_opts += ' --sam-no-hd  '
-    if args.output_unmapped_reads or ( args.output_unmapped_reads_l and args.output_unmapped_reads_r):
-        additional_opts += ' --un '
-    if args.output_suppressed_reads or ( args.output_suppressed_reads_l and args.output_suppressed_reads_r):
-        additional_opts += ' --ambiguous '
-
-    arguments.update( {'args': additional_opts, 'reads': reads} )
-
-    # Final bismark command:
-    cmd = cmd % arguments
-    # Run
-    try:
-        tmp_out = tempfile.NamedTemporaryFile().name
-        tmp_stdout = open( tmp_out, 'wb' )
-        tmp_err = tempfile.NamedTemporaryFile().name
-        tmp_stderr = open( tmp_err, 'wb' )
-        proc = subprocess.Popen( args=cmd, shell=True, cwd=".", stdout=tmp_stdout, stderr=tmp_stderr )
-        returncode = proc.wait()
-
-        if returncode != 0:
-            tmp_stdout.close()
-            tmp_stderr.close()
-            # get stderr, allowing for case where it's very large
-            tmp_stderr = open( tmp_err, 'rb' )
-            stderr = ''
-            buffsize = 1048576
-            try:
-                while True:
-                    stderr += tmp_stderr.read( buffsize )
-                    if not stderr or len( stderr ) % buffsize != 0:
-                        break
-            except OverflowError:
-                pass
-
-            raise Exception, stderr
-        tmp_stdout.close()
-        tmp_stderr.close()
-
-        # TODO: look for errors in program output.
-    except Exception, e:
-        stop_err( 'Error in bismark:\n' + str( e ) )
-
-    # collect and copy output files
-    if args.output_report_file:
-        output_report_file = open(args.output_report_file, 'w+')
-        for line in fileinput.input(glob( os.path.join( output_dir, '*report.txt') )):
-            output_report_file.write(line)
-        output_report_file.close()
-
-
-    if args.output_suppressed_reads:
-        if glob(os.path.join( output_dir, '*ambiguous_reads.txt')):
-            shutil.move( glob(os.path.join( output_dir, '*ambiguous_reads.txt'))[0], args.output_suppressed_reads )
-    if args.output_suppressed_reads_l:
-        if glob(os.path.join(output_dir, '*ambiguous_reads_1.txt')):
-            shutil.move( glob(os.path.join( output_dir, '*ambiguous_reads_1.txt'))[0], args.output_suppressed_reads_l )
-    if args.output_suppressed_reads_r:
-        if glob(os.path.join(output_dir, '*ambiguous_reads_2.txt')):
-            shutil.move( glob(os.path.join( output_dir, '*ambiguous_reads_2.txt'))[0], args.output_suppressed_reads_r )
-
-    if args.output_unmapped_reads:
-        if glob(os.path.join(output_dir, '*unmapped_reads.txt')):
-            shutil.move( glob(os.path.join( output_dir, '*unmapped_reads.txt'))[0], args.output_unmapped_reads )
-    if args.output_unmapped_reads_l:
-        if glob(os.path.join(output_dir, '*unmapped_reads_1.txt')):
-            shutil.move( glob(os.path.join( output_dir, '*unmapped_reads_1.txt'))[0], args.output_unmapped_reads_l )
-    if args.output_unmapped_reads_r:
-        if glob(os.path.join(output_dir, '*unmapped_reads_2.txt')):
-            shutil.move( glob(os.path.join( output_dir, '*unmapped_reads_2.txt'))[0], args.output_unmapped_reads_r )
-
-    try:
-        """
-            merge all bam files
-        """
-        #tmp_out = tempfile.NamedTemporaryFile( dir=output_dir ).name
-        tmp_stdout = open( tmp_out, 'wab' )
-        #tmp_err = tempfile.NamedTemporaryFile( dir=output_dir ).name
-        tmp_stderr = open( tmp_err, 'wab' )
-
-        tmp_res = tempfile.NamedTemporaryFile( dir= output_dir).name
-
-        bam_files = glob( os.path.join( output_dir, '*.bam') )
-        if len( bam_files ) > 1:
-            cmd = 'samtools merge -@ %s -f %s %s ' % ( args.num_threads, tmp_res, ' '.join( bam_files ) )
-
-            proc = subprocess.Popen( args=shlex.split( cmd ), stdout=subprocess.PIPE )
-
-            returncode = proc.wait()
-            tmp_stdout.close()
-            tmp_stderr.close()
-            if returncode != 0:
-                raise Exception, open( tmp_stderr.name ).read()
-        else:
-            tmp_res = bam_files[0]
-
-        bam_path = "%s" % tmp_res
-
-        if os.path.exists( bam_path ):
-            if args.sort_bam:
-                cmd = 'samtools sort -@ %s %s sorted_bam' % (args.num_threads, bam_path)
-                proc = subprocess.Popen( args=shlex.split( cmd ) )
-                returncode = proc.wait()
-                if returncode != 0:
-                    raise Exception("Error during '%s'" % cmd)
-                shutil.move( 'sorted_bam.bam', args.output )
-            else:
-                shutil.move( bam_path, args.output )
-        else:
-            stop_err( 'BAM file no found:\n' + str( bam_path ) )
-
-
-    # TODO: look for errors in program output.
-    except Exception, e:
-        stop_err( 'Error in merging bam files:\n' + str( e ) )
-
-
-    if args.output_stdout:
-        # copy the temporary saved stdout from bismark
-        shutil.move( tmp_out, args.output_stdout )
-
-    # Clean up temp dirs
-    if args.own_file:
-        if os.path.exists( tmp_index_dir ):
-            shutil.rmtree( tmp_index_dir )
-    if os.path.exists( tmp_bismark_dir ):
-        shutil.rmtree( tmp_bismark_dir )
-    if os.path.exists( output_dir ):
-        shutil.rmtree( output_dir )
-
-if __name__=="__main__": __main__()
--- a/bismark_methyl_extractor/bismark2bedGraph	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,830 +0,0 @@
-#!/usr/bin/env perl
-use warnings;
-use strict;
-$|++;
-use Getopt::Long;
-use Cwd;
-use Carp;
-
-## This program is Copyright (C) 2010-16, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-my $bismark2bedGraph_version = 'v0.16.3';
-
-my @bedfiles;
-my @methylcalls = qw (0 0 0); # [0] = methylated, [1] = unmethylated, [2] = total
-my @sorting_files;
-
-my ($bedGraph_output,$parent_dir,$output_dir,$remove,$CX_context,$no_header,$sort_size,$coverage_threshold,$counts,$gazillion,$ample_mem,$zero,$input_dir) = process_commandline();
-
-warn "Using these input files: @sorting_files\n";
-warn "\nSummary of parameters for bismark2bedGraph conversion:\n";
-warn '='x54,"\n";
-warn "bedGraph output:\t\t$bedGraph_output\n";
-warn "output directory:\t\t>$output_dir<\n";
-if ($remove){
-    warn "remove whitespaces:\t\tyes\n";
-}
-else{
-    warn "remove whitespaces:\t\tno\n";
-}
-if ($CX_context){
-    warn "CX context:\t\t\tyes\n";
-}
-else{
-    warn "CX context:\t\t\tno (CpG context only, default)\n";
-}
-if ($no_header){
-    warn "No-header selected:\t\tyes\n";
-}
-else{
-    warn "No-header selected:\t\tno\n";
-}
-
-if ($ample_mem){
-    warn "Sorting method:\t\t\tArray-based (faster, but larger memory footprint)\n";
-}
-else{
-    warn "Sorting method:\t\t\tUnix sort-based (smaller memory footprint, but slower)\n";
-}
-unless($ample_mem){
-    warn "Sort buffer size:\t\t$sort_size\n";
-}
-warn "Coverage threshold:\t\t$coverage_threshold\n";
-
-
-warn  "="x77,"\n";
-warn "Methylation information will now be written into a bedGraph and coverage file\n";
-warn  "="x77,"\n\n";
-sleep (2);
-
-### deciding which files to use for bedGraph conversion
-foreach my $filename (@sorting_files){
-    
-    ### DETERMINING THE FULL PATH OF INPUT FILES
-    if ($filename =~ /^(.*\/)(.*)$/){ # if files are in a different output folder we extract the filename again
-	# warn "folder name: $1\nfilename: $2\n\n";
-	chdir $1 or die "Failed to change directory to $1\n"; # $1 might be a relative path 
-	$input_dir = getcwd();                                # this will always be the full path
-	$filename = $2;
-	# warn "Full Input folder: $input_dir\nFilename: $filename\n\n"; sleep (1);
-	chdir $parent_dir or die "Failed to move back to the parent directory\n\n"; # moving back
-    }
-    else{
-	$input_dir = $parent_dir;
-    }   
-    $input_dir .= '/';
-    
-    if ($CX_context){
-	# push @bedfiles,$output_dir.$filename;
- 	push @bedfiles,$input_dir.$filename;
-    }
-    else{ ## CpG context only (default)
-	if ($filename =~ /^CpG/){ # only testing the actual filename without the path information
-	    push @bedfiles,$input_dir.$filename; # we are adding the full path to the filename
-	}
-	else{
-	    # skipping CHH or CHG files
-	}
-    }
-}
-
-if (@bedfiles){
-    warn "Using the following files as Input:\n";
-    print join ("\t",@bedfiles),"\n\n";
-    sleep (2);
-}
-else{
-    die "It seems that you are trying to generate bedGraph files for files not starting with CpG.... Please specify the option '--CX' and try again\n\n";
-}
-
-open (OUT,"| gzip -c - > ${output_dir}${bedGraph_output}") or die "Problems with the bedGraph output filename detected: file path: '$output_dir'\tfile name: '$bedGraph_output' $!\n";
-warn "Writing bedGraph to file: $bedGraph_output\n";
-print OUT "track type=bedGraph\n";
-
-my $coverage_output = $bedGraph_output;
-unless ($coverage_output =~ s/bedGraph\.gz$/bismark.cov.gz/){
-  $coverage_output =~ s/$/.bismark.cov.gz/;
-}
-
-open (COVERAGE,"| gzip -c - > ${output_dir}${coverage_output}") or die "Problems writing to the coverage output detected. File path: '$output_dir'\tfile name: '$coverage_output' $!\n\n";
-warn "Also writing out a coverage file including counts methylated and unmethylated residues to file: $coverage_output\n";
-
-if ($zero){
-  my $zero_coverage_output = $bedGraph_output;
-  unless ($zero_coverage_output =~ s/bedGraph$/bismark.zero.cov/){
-    $zero_coverage_output =~ s/$/.bismark.zero.cov/;
-  }
-
-  open (ZEROCOVERAGE,'>',$output_dir.$zero_coverage_output) or die "Problems writing to the zero-based coverage output detected. File path: '$output_dir'\tfile name: '$\zero_coverage_output' $!\n\n";
-  warn "Also writing out a 0-based, half-open coverage file including counts methylated and unmethylated residues to file: $zero_coverage_output\n";
-}
-warn "\n";
-
-my %temp_fhs;
-my @temp_files; # writing all context files (default CpG only) to these files prior to sorting
-my %chr_lengths; # storing chromosome lenghts in '--ample_memory' mode
-
-### changing to the output directory
-unless ($output_dir eq ''){ # default
-  chdir $output_dir or die "Failed to change directory to $output_dir\n";
-  warn "Changed directory to $output_dir\n";
-}
-
-if ($gazillion){
-    if (scalar @bedfiles == 1){
-	warn "The genome of interest was specified to contain gazillions of chromosomes or scaffolds. Sorting everything in memory instead of writing out individual chromosome files ...\n";
-    }
-    else{
-	warn "The genome of interest was specified to contain gazillions of chromosomes or scaffolds. Merging all input files and sorting everything in memory instead of writing out individual chromosome files...\n";
-	my $merge = "$bedGraph_output.methylation_calls.merged";
-	open (MERGE,'>',$merge) or die "Failed to write to temporary merged file $merge: $!\n";
-	warn "Writing all merged methylation calls to temp file $merge\n\n"; sleep(2);
-	push @temp_files, $merge;
-    }
-}
-
-foreach my $infile (@bedfiles) {
-    
-    # warn "Processing $infile\n";
-    
-    if ($remove) {
-	warn "Now replacing whitespaces in the sequence ID field of the Bismark methylation extractor output $infile prior to bedGraph conversion\n\n";
-	
-	if ($infile =~ /gz$/){
-	    open (READ,"gunzip -c $infile |") or die $!;
-	}
-	else{
-	    open (READ,$infile) or die $!;
-	}
-	
-	my $removed_spaces_outfile = $infile;
-	$removed_spaces_outfile =~ s/$/.spaces_removed.txt/;
-	$removed_spaces_outfile =~ s/.*\///;# replacing everything up to the last slash in the filename
-    
-	warn "Attempting to write to file ${output_dir}${removed_spaces_outfile}\n\n";
-	open (REM,'>',$output_dir.$removed_spaces_outfile) or die "Couldn't write to file $removed_spaces_outfile: $!\n";
-	
-	unless ($no_header){
-	    $_ = <READ>;		### Bismark version header
-	    print REM $_;		### Bismark version header
-	}
-	
-	while (<READ>) {
-	    chomp;
-	    my ($id,$strand,$chr,$pos,$context) = (split (/\t/));
-	    $id =~ s/\s+/_/g;
-	    print REM join ("\t",$id,$strand,$chr,$pos,$context),"\n";
-	}
-	
-	close READ or die $!;
-	close REM or die $!;
-	
-	### changing the infile name to the new file without spaces
-	$infile = $removed_spaces_outfile; # at this stage we are already in the output directory so it should pick it up correctly
-    }
-    
-    # opening infile
-    if ($infile =~ /gz$/){
-	open (IN,"gunzip -c $infile |") or die "Couldn't find file '$infile': $!\n";
-    }
-    else{
-	open (IN,$infile) or die "Couldn't find file '$infile': $!\n";
-    }
-    
-    if ($infile =~ /\//){ # if input files are in a different folders we extract the filename again
-	$infile =~ s/.*\///;# replacing everything up to the last slash in the filename
-	# warn "Renamed Infile: $infile\n";
-    }
-    
-    ### People these days seem to be aligning their data to newly assembled genomes more and more, which sometimes conist of up to half a million scaffolds instead of ~23 chromosomes. This
-    ### does normally clash with the operating system's limit of files that can be open for writing at the same time, and it is difficult and probably not advisable to increase this
-    ### limit (some even say there is a reason for the OS doing so...).
-    ### To still allow then generation of bedGraph files we will in these cases sort everything using the Linux sort command instead, which will sort by chromosome and position (the
-    ### chromosome sorting is not carried out for chromosome sorted files which makes the sort MUCH faster).
-    
-    if ($gazillion){
-	# using all infiles instead of sorting
-	if (scalar @bedfiles == 1){
-	    push @temp_files, $infile;
-	}
-	else{
-	    ## always ignoring the version header
-	    unless ($no_header){
-		$_ = <IN>;		### Bismark version header
-	    }
-
-	    while (<IN>) {
-		if ($_ =~ /^Bismark /){
-		    warn "Found Bismark version information. Skipping this line (should still work fine) but consider using '--no_header' next time...\n";
-		    next;
-		}
-		print MERGE;
-	    }
-	    warn "Finished writing methylation calls from $infile to merged temp file\n";
-	}
-    }
-    else{
-	warn "Now writing methylation information for file >>$infile<< to individual files for each chromosome\n";
-	
-	## always ignoring the version header
-	unless ($no_header){
-	    $_ = <IN>;		### Bismark version header
-	}
-	
-	while (<IN>) {
-	    if ($_ =~ /^Bismark /){
-		warn "Found Bismark version information. Skipping this line (should still work fine) but consider losing '--no_header' next time...\n";
-		next;
-	    }
-
-	    chomp;
-	    
-	    my ($chr,$pos) = (split (/\t/))[2,3];
-	    
-	    ### If --ample_mem was specified we are keeping track of the highest position for each chromosome as this will determine the size of the array we need to create in the next step
-	    if ($ample_mem){
-		### setting the first position for this chromosome
-		unless (defined $chr_lengths{$chr} ){
-		    $chr_lengths{$chr} = $pos;
-		}
-		# for all subsequent postions for this chromosome
-		if ($pos > $chr_lengths{$chr} ){
-		    $chr_lengths{$chr} = $pos; # set the current position as the new highest position
-		}
-	    }
-	    
-	    # warn "This is the chromosome name before replacing '|' characters:\t$chr\n\n";
-	    $chr =~ s/\|/_/g; # replacing pipe ('|') characters in the file names
-	    # warn "This is the chromosome name AFTER replacing '|' characters:\t$chr\n\n";
-	    unless (exists $temp_fhs{$chr}) { # Including the infile name to the temporary chromosome files to enable parallel processing of multiple files at the same time
-		
-		my $temp_file_name = $infile.'.chr'.$chr.'.methXtractor.temp';
-		# warn "Using temp file name: $temp_file_name\n"; sleep(1);
-		
-		open ($temp_fhs{$chr},'>',$infile.'.chr'.$chr.'.methXtractor.temp') or die "Failed to open filehandle: $!";
-		push @temp_files, $temp_file_name; # storing temp files as we open them instead
-	    }
-	    
-	    print {$temp_fhs{$chr}} "$_\n";
-	}
-	
-	warn "Finished writing out individual chromosome files for $infile\n";
-    }
-}
-
-# closing temporary filehandles to force writing out buffered content
-foreach my $temp_fh(keys %temp_fhs){
-    close $temp_fhs{$temp_fh} or warn "Failed to close temporary filehandle $temp_fhs{$temp_fh}: $!\n";
-}
-
-### printing out the determined maximum position for each chromosome
-if ($ample_mem){
-    foreach my $chr (sort keys %chr_lengths){
-	warn "Highest determined position for chromosome $chr:\t\t$chr_lengths{$chr} bp\n";
-    }
-    warn "\n";
-}
-
-unless ($gazillion){
-    warn "\n";
-    warn "Collecting temporary chromosome file information... Processing the following input file(s):\n";
-    warn join ("\n",@temp_files),"\n\n";
-    sleep (1);
-}
-
-if ($gazillion){
-    if (scalar @bedfiles > 1){
-	close (MERGE) or die "Failed to close filehandle MERGE: $!\n";
-    }
-}
-
-foreach my $in (@temp_files) {
-
-    if ($sort_size){
-	warn "Sorting input file $in by positions (using -S of $sort_size)\n" unless ($ample_mem);
-    }
-    
-    my $ifh;
-
-  my $name;
-  my $meth_state;
-  my $chr = "";
-  my $pos = 0;
-  my $meth_state2;
-
-  my $last_pos;
-  my $last_chr;
-
-  ### If the user specified to have a lot of RAM available (probably in the range of > 16GB for 2 arrays of human genome Chromosome 1) we will sort the methylation calls in two big arrays instead of using the Unix sort command
-  if ($ample_mem){
-    # warn "Generating enormous array instead of sorting the file. This may temporily use quite a bit of memory (RAM)!\n\n";
-
-    my @meth_count;
-    my @unmeth_count;
-
-    open ($ifh,$in) or die "Couldn't read from temporary file '$in': $!\n";
-
-    while (my $line = <$ifh>){
-      next if ($line =~ /^Bismark/);
-      chomp $line;
-
-      ($name, $meth_state, $chr, $pos, $meth_state2) = split "\t", $line;
-
-      unless ($last_pos and $last_chr){
-	$last_chr = $chr;
-	$last_pos = $pos;
-      }
-      unless (@meth_count and @unmeth_count){
-	warn  "Setting maximum position of arrays \@meth_count and \@unmeth_count for chromosome $chr to $chr_lengths{$chr}\n";
-	@meth_count   = (0) x  $chr_lengths{$chr};
-	@unmeth_count = (0) x  $chr_lengths{$chr};
-	# warn "length of array meth count: ",scalar @meth_count,"\n";
-	warn "Finished generating arrays\n";
-	# sleep(1);	
-      }
-      # warn "Chromosome\tStart Position\tEnd Position\tMethylation Percentage\n"; sleep(1);
-      # print join ("\t",$name, $meth_state, $chr, $pos, $meth_state2),"\n"; 
-      # sleep(1);
-
-      # if ($last_chr ne $chr) {
-      #    die "Reached new chromosome '$chr' which mustn't happen from pre-sorted files (previous chromosome was: '$last_chr')\n";
-      # }
-
-      my $validated = validate_methylation_call($meth_state, $meth_state2); # as a comment, methylation calls in Unknown context (U, u) would fail this check, but they should be ignored by the methylation extractor anyway
-      unless($validated){
-	warn "Methylation state of sequence ($name) in file ($in) on line $. is inconsistent (meth_state is $meth_state, meth_state2 = $meth_state2)\n";
-	next;
-      }
-
-      if ($meth_state eq '+'){
-	# warn "increasing meth $pos by 1\n"; sleep(1);
-	$meth_count[$pos-1]++;
-      }
-      else{
-	$unmeth_count[$pos-1]++;
-	# warn "increasing unmeth $pos by 1\n"; sleep(1);
-      }
-    }
-
-    close $ifh or die $!;
-
-    warn "Now printing methylation information for this chromosome\n";
-    # warn "length of array meth count: ",scalar @meth_count,"\n";
-    # warn "chr\tposition\tcount methylated\tcount unmethylated\tcount total\n";
-    foreach my $index (0..$#meth_count){
-      my $totalcount = $meth_count[$index] + $unmeth_count[$index];
-      if ($totalcount > 0){
-	#	warn "$index\t$meth_count[$index]\t$unmeth_count[$index]\t$totalcount\n";
-	# sleep(1);
-	
-	my $bed_pos = $index; ### bedGraph coordinates are 0 based
-	my $one_based_pos = $bed_pos + 1;
-
-	my $meth_percentage;
-	($totalcount >= $coverage_threshold) ? ($meth_percentage = ($meth_count[$index]/$totalcount) * 100) : ($meth_percentage = undef);
-
-	if (defined $meth_percentage){
-	
-	  # as of version 0.9.1 we will by default write out both a bedGraph and a more detailed coverage file
-	
-	  # this is the bedGraph file, the starting position is 0-based, the end position is 1-based! (half-open. Clever, huh?)
-	  print OUT "$last_chr\t$bed_pos\t$one_based_pos\t$meth_percentage\n";
-	
-	  # this is the coverage file. Coordinates are 1-based
-	  print COVERAGE "$last_chr\t$one_based_pos\t$one_based_pos\t$meth_percentage\t$meth_count[$index]\t$unmeth_count[$index]\n";
-
-	  # this is an optional 0-based, half-open coverage file. Coordinates are 0-based start and 1-based end
-	  if ($zero){
-	    print ZEROCOVERAGE "$last_chr\t$bed_pos\t$one_based_pos\t$meth_percentage\t$meth_count[$index]\t$unmeth_count[$index]\n";
-	  }
-
-	}
-      }
-    }
-
-    @meth_count = ();
-    @unmeth_count = ();
-
-  }
-  ### default: we assume that the user wants to use the Linux Sort command. This is quite a bit slower, but features a much smaller memory footprint
-  else{
-    my $sort_dir = './'; # there has been a cd into the output_directory already
-    # my $sort_dir = $output_dir;
-    # if ($sort_dir eq ''){
-    #   $sort_dir = './';
-    # }
-    
-    if ($gazillion){
-	if ($in =~ /gz$/){
-	    open $ifh, "gunzip -c $in | sort -S $sort_size -T $sort_dir -k3,3V -k4,4n |" or die "Input file could not be sorted. $!\n";
-	}
-	else{ 
-	    open $ifh, "sort -S $sort_size -T $sort_dir -k3,3V -k4,4n $in |" or die "Input file could not be sorted. $!\n";
-	}
-	### Comment by Volker Brendel, Indiana University
-	### "The -k3,3V sort option is critical when the sequence names are numbered scaffolds (without left-buffering of zeros).  Omit the V, and things go very wrong in the tallying of reads."
-    }
-    else{
-	### this sort command was used previously and sorts according to chromosome in addition to position. Since the files are being sorted according to chromosomes anyway,
-	### we may drop the -k3,3V option. It has been reported that this will result in a dramatic speed increase
-	if ($in =~ /gz$/){
-	    open $ifh, "gunzip -c $in | sort -S $sort_size -T $sort_dir -k4,4n |" or die "Input file could not be sorted. $!\n";
-	}
-	else{
-	    open $ifh, "sort -S $sort_size -T $sort_dir -k4,4n $in |" or die "Input file could not be sorted. $!\n";
-	}
-    }
-
-    while (my $line = <$ifh>) {
-	next if ($line =~ /^Bismark/);
-	chomp $line;
-	#warn "full line:\n$line\n";
-	$last_chr = $chr;
-	$last_pos = $pos;
-	($name, $meth_state, $chr, $pos, $meth_state2) = split "\t", $line;
-	#warn "$name, $meth_state, $chr, $pos, $meth_state2\n"; sleep(1);
-	if (($last_pos ne $pos) || ($last_chr ne $chr)) {
-	    generate_output($last_chr,$last_pos) if $methylcalls[2] > 0;
-	    @methylcalls = qw (0 0 0);
-	}
-
-      my $validated = validate_methylation_call($meth_state, $meth_state2);
-      unless($validated){
-	warn "Methylation state of sequence ($name) in file ($in) on line $. is inconsistent (meth_state is $meth_state, meth_state2 = $meth_state2)\n";
-	next;
-      }
-      if ($meth_state eq "+") {
-	$methylcalls[0]++;
-	$methylcalls[2]++;
-      } else {
-	  $methylcalls[1]++;
-	$methylcalls[2]++;
-      }
-    }
-
-
-    $last_chr = $chr;
-    $last_pos = $pos;
-    if ($methylcalls[2] > 0) {
-      generate_output($last_chr,$last_pos) if $methylcalls[2] > 0;
-    }
-	
-    close $ifh or die $!;
-
-    @methylcalls = qw (0 0 0); # resetting @methylcalls
-
-  }
-
-  ### deleting temporary files (only needed if --gazillion hasn't been specified
-  if ($gazillion and scalar @bedfiles == 1){
-    # if there was only 1 file to sort this will be the input file, which obviously shouldn't be removed
-  }
-  else{
-    my $delete = unlink $in;
-    if ($delete) {
-      warn "Successfully deleted the temporary input file $in\n\n";
-    }
-    else {
-      warn "The temporary inputfile $in could not be deleted $!\n\n";
-    }
-  }
-}
-
-close OUT or die $!;
-close COVERAGE or die $!;
-if ($zero){
-  close ZEROCOVERAGE or die $!;
-}
-
-exit 0;
-
-
-
-sub validate_methylation_call{
-  my $meth_state = shift;
-  croak "Missing (+/-) methylation call" unless defined $meth_state;
-  my $meth_state2 = shift;
-  croak "Missing alphabetical methylation call" unless defined $meth_state2;
-  my $is_consistent;
-  ($meth_state2 =~ /^z/i) ? ($is_consistent = check_CpG_methylation_call($meth_state, $meth_state2)) 
-                          : ($is_consistent = check_nonCpG_methylation_call($meth_state,$meth_state2));
-  return 1 if $is_consistent;
-  return 0;
-}
-
-sub check_CpG_methylation_call{
-  my $meth1 = shift;
-  my $meth2 = shift;
-  return 1 if($meth1 eq "+" && $meth2 eq "Z");
-  return 1 if($meth1 eq "-" && $meth2 eq "z");
-  return 0;
-}
-
-sub check_nonCpG_methylation_call{
-  my $meth1 = shift;
-  my $meth2 = shift;
-  return 1 if($meth1 eq "+" && $meth2 eq "C");
-  return 1 if($meth1 eq "+" && $meth2 eq "X");
-  return 1 if($meth1 eq "+" && $meth2 eq "H");
-  return 1 if($meth1 eq "-" && $meth2 eq "c");
-  return 1 if($meth1 eq "-" && $meth2 eq "x");
-  return 1 if($meth1 eq "-" && $meth2 eq "h");
-  return 0;
-}
-
-sub generate_output{
-  my $methcount = $methylcalls[0];
-  my $nonmethcount = $methylcalls[1];
-  my $totalcount = $methylcalls[2];
-  my $last_chr = shift;
-  my $last_pos = shift;
-  croak "Should not be generating output if there's no reads to this region" unless ($totalcount > 0);
-  croak "Total counts ($totalcount) is not the sum of the methylated ($methcount) and unmethylated ($nonmethcount) counts" if ($totalcount != ($methcount + $nonmethcount) );
-
-  my $bed_pos = $last_pos - 1; ### Bismark coordinates are 1 based whereas bedGraph coordinates are 0 based.
-  my $meth_percentage;
-  ($totalcount >= $coverage_threshold) ? ($meth_percentage = ($methcount/$totalcount) * 100) : ($meth_percentage = undef);
-  # $meth_percentage =~ s/(\.\d\d).+$/$1/ unless $meth_percentage =~ /^Below/;
-  if (defined $meth_percentage){
-
-    # this is the bedGraph file, the starting position is 0-based, the end position is 1-based! (clever, huh?)
-    my $one_based_pos = $bed_pos + 1;
-    print OUT "$last_chr\t$bed_pos\t$one_based_pos\t$meth_percentage\n";
-
-    # this is the coverage file. Coordinates are 1-based
-    print COVERAGE "$last_chr\t$one_based_pos\t$one_based_pos\t$meth_percentage\t$methcount\t$nonmethcount\n";
-
-    # this is an optional 0-based, half-open coverage file. Coordinates are 0-based start and 1-based end
-    if ($zero){
-      print ZEROCOVERAGE "$last_chr\t$bed_pos\t$one_based_pos\t$meth_percentage\t$methcount\t$nonmethcount\n";
-    }
-  }
-
-}
-
-sub process_commandline{
-  my $help;
-  my $output_dir;
-  my $bedGraph_output;
-  my $no_header;
-  my $coverage_threshold; # Minimum number of reads covering before calling methylation status
-  my $remove;
-  my $counts;
-  my $CX_context;
-  my $sort_size;
-  my $version;
-  my $gazillion;
-  my $ample_mem;
-  my $zero;
-  my $input_dir;
-
-  my $command_line = GetOptions ('help|man'            => \$help,
-				 'dir=s'               => \$output_dir,
-				 'o|output=s'          => \$bedGraph_output,
-				 'no_header'           => \$no_header,
-				 "cutoff=i"            => \$coverage_threshold,
-				 "remove_spaces"       => \$remove,
-				 "counts"              => \$counts,
-				 "CX|CX_context"       => \$CX_context,
-				 "buffer_size=s"       => \$sort_size,
-				 'version'             => \$version,
-				 'gazillion|scaffolds' => \$gazillion,
-				 'ample_memory'        => \$ample_mem,
-				 "zero_based"          => \$zero,
-			);
-
-  ### EXIT ON ERROR if there were errors with any of the supplied options
-  unless ($command_line){
-    die "Please respecify command line options\n";
-  }
-
-  ### HELPFILE
-  if ($help){
-    print_helpfile();
-    exit;
-  }
-
-  if ($version){
-    print << "VERSION";
-
-
-                      Bismark Methylation Extractor Module -
-                                bismark2bedGraph
-
-                      Bismark Extractor Version: $bismark2bedGraph_version
-              Copyright 2010-15 Felix Krueger, Babraham Bioinformatics
-                www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-
-VERSION
-    exit;
-  }
-
-  @sorting_files = @ARGV;
-
-  ### no files provided
-  unless (@sorting_files){
-    warn "You need to provide one or more Bismark methylation caller files to create an individual C methylation bedGraph output. Please respecify!\n\n";
-    sleep(2);
-
-    print_helpfile();
-    exit;
-  }
- 
-  ### PARENT DIRECTORY
-  my $parent_dir = getcwd();
-  # warn "parent directory is: $parent_dir\n";
-  
-  ### OUTPUT DIR PATH
-  if (defined $output_dir){
- 
-    unless ($output_dir eq ''){ # if the output dir has been passed on by the methylation extractor and is an empty string we don't want to change it
-	unless ($output_dir =~ /\/$/){
-	    $output_dir =~ s/$/\//;
-	}
-	unless (-d $output_dir){
-	    mkdir $output_dir or die "Failed to create output directory $output_dir: $!\n\n";
-	    warn "Created output directory $output_dir\n";
-	}
-
-      ### want to get an absolute path for the output directory instead of a relative one
-      chdir $output_dir or die "Failed to move into output directory '$output_dir': $!\n\n";
-      $output_dir = getcwd();
-      unless ($output_dir =~ /\/$/){
-	$output_dir =~ s/$/\//;
-      }
-      # warn "output directory is: $output_dir\n";
-
-      # changing back to the parent directory
-      chdir $parent_dir or die "Failed to move back into parent directory '$parent_dir': $!\n\n";
-
-    }
-
-  }
-  else{
-    $output_dir = '';
-  }
-
-  unless (defined $bedGraph_output){
-      die "Please provide the name of the output file using the option -o/--output filename\n";
-  }
-  
-  if ($bedGraph_output =~ /\//){ # this is supposed a filename and not a path name
-      die "Please specify a file name without any path information (or use --dir if necessary)\n\n";
-  }
-  
-  unless ($bedGraph_output =~ /\.gz$/){
-      $bedGraph_output = "${bedGraph_output}.gz";  ### 22 07 2015: Output will be gzip compressed
-  }
-
-  ### NO HEADER
-  unless ($no_header){
-    $no_header = 0;
-  }
-
-  ### remove white spaces in read ID (needed for sorting using the sort command
-  unless ($remove){
-    $remove = 0;
-  }
-
-  ### COVERAGE THRESHOLD FOR bedGraph OUTPUT
-  if (defined $coverage_threshold){
-    unless ($coverage_threshold > 0){
-      die "Please select a coverage greater than 0 (positive integers only)\n";
-    }
-  }
-  else{
-    $coverage_threshold = 1;
-  }
-
-  ### SORT buffer size
-  if (defined $sort_size){
-    unless ($sort_size =~ /^\d+\%$/ or $sort_size =~ /^\d+(K|M|G|T)$/){
-      die "Please select a buffer size as percentage (e.g. --buffer_size 20%) or a number to be multiplied with K, M, G, T etc. (e.g. --buffer_size 20G). For more information on sort type 'info sort' on a command line\n";
-    }
-  }
-  else{
-    $sort_size = '2G';
-  }
-
-  unless ($CX_context){
-    $CX_context = 0;
-  }
-
-  unless ($counts){
-    $counts = 1;
-  }
-
-  if ($gazillion){
-    if ($ample_mem){
-      die "You can't currently select '--ample_mem' together with '--gazillion'. Make your pick!\n\n";
-    }
-  }
-
-  return ($bedGraph_output,$parent_dir,$output_dir,$remove,$CX_context,$no_header,$sort_size,$coverage_threshold,$counts,$gazillion,$ample_mem,$zero,$input_dir);
-}
-
-
-sub print_helpfile{
-  print <<EOF
-
-  SYNOPSIS:
-
-  This script uses positional methylation data generated by the Bismark methylation extractor to generate
-  a bedGraph file as well as a coverage file which are both sorted by chromosomal position. The bedGraph
-  file uses 0-based genomic start and 1-based genomic end coordinates and should be UCSC compatible (if
-  UCSC genomes were used for the alignment step). In addition this module will write out a coverage file
-  which is similar to the bedGraph file, but uses 1-based genomic coordinates and also reports the count
-  of methylated and unmethylated cytosines for any covered position; this coverage file is required if you
-  wish to generate a genome-wide cytosine report with the module coverage2cytosine.
-
-  USAGE: bismark2bedGraph [options] -o <output> [methylation extractor input files]
-
-Methylation extractor input files: These files are required to start with CpG... in order for the
-script to correctly work out the sequence context when using CpG context only (default). If all cytosine
-contexts are selected ('--CX_context'), all input files will be used regardless of their file file name(s).
-
-
--o/--output <filename>     Name of the output file, mandatory.
-
---dir                      Output directory. Output is written to the current directory if not specified explicitly.
-
---cutoff [threshold]       The minimum number of times a methylation state has to be seen for that nucleotide
-                           before its methylation percentage is reported. Default: 1.
-
---remove_spaces            Replaces whitespaces in the sequence ID field with underscores to allow sorting.
-
---CX/--CX_context          The sorted bedGraph output file contains information on every single cytosine that was covered
-                           in the experiment irrespective of its sequence context. This applies to both forward and
-                           reverse strands. Please be aware that this option may generate large temporary and output files
-                           and may take a long time to sort (up to many hours). Default: OFF.
-                           (i.e. Default = CpG context only).
-
---buffer_size <string>     This allows you to specify the main memory sort buffer when sorting the methylation information.
-                           Either specify a percentage of physical memory by appending % (e.g. --buffer_size 50%) or
-			   a multiple of 1024 bytes, e.g. 'K' multiplies by 1024, 'M' by 1048576 and so on for 'T' etc.
-                           (e.g. --buffer_size 20G). For more information on sort type 'info sort' on a command line.
-                           Defaults to 2G.
-
---scaffolds/--gazillion    Users working with unfinished genomes sporting tens or even hundreds of thousands of
-                           scaffolds/contigs/chromosomes frequently encountered errors with pre-sorting reads to 
-                           individual chromosome files. These errors were caused by the operating system's limit
-                           of the number of filehandle that can be written to at any one time (typically 1024; to
-                           find out this limit on Linux, type: ulimit -a).
-                           To bypass the limitation of open filehandles, the option --scaffolds does not pre-sort
-                           methylation calls into individual chromosome files. Instead, all input files are
-                           temporarily merged into a single file (unless there is only a single file), and this
-                           file will then be sorted by both chromosome AND position using the Unix sort command.
-                           Please be aware that this option might take a looooong time to complete, depending on 
-                           the size of the input files, and the memory you allocate to this process (see --buffer_size).
-                           Nevertheless, it seems to be working.
-
---ample_memory             Using this option will not sort chromosomal positions using the UNIX 'sort' command, but will
-                           instead use two arrays to sort methylated and unmethylated calls, respectively. This may result
-                           in a faster sorting process for very large files, but this comes at the cost of a larger memory
-                           footprint (as an estimate, two arrays of the length of (the largest) human chromosome 1 (nearly
-                           250 million bp) temporarily consume around 16GB of RAM). Note however that due to the overheads
-                           of creating and looping through arrays this option might in fact be *slower* for small-ish
-                           files (up to a few million alignments). Note also that this option is not currently compatible
-                           with options '--scaffolds/--gazillion'.
-
---zero_based               Write out an additional coverage file (ending in .zero.cov) that uses 0-based genomic start
-                           and 1-based genomic end coordinates (zero-based, half-open), like used in the bedGraph file,
-                           instead of using 1-based coordinates throughout. Default: OFF.
-
-
-
-The bedGraph output looks like this (tab-delimited; 0-based start coords, 1-based end coords):
-==============================================================================================
-
-track type=bedGraph (header line)
-
-<chromosome>  <start position>  <end position>  <methylation percentage>
-
-
-
-The coverage output looks like this (tab-delimited, 1-based genomic coords; optional zero-based, half-open coords with '--zero_based'):
-=======================================================================================================================================
-
-<chromosome>  <start position>  <end position>  <methylation percentage>  <count methylated>  <count non-methylated>
-
-
-                          Script last modified: 09 December 2015
-
-EOF
-    ;
-  exit 1;
-}
--- a/bismark_methyl_extractor/bismark_methylation_extractor	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5907 +0,0 @@
-#!/usr/bin/env perl
-use warnings;
-use strict;
-$|++;
-use Getopt::Long;
-use Cwd;
-use Carp;
-use FindBin qw($Bin);
-use lib "$Bin/../lib";
-
-## This program is Copyright (C) 2010-16, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-my @filenames; # input files
-my %counting;
-my $parent_dir = getcwd();
-
-my %fhs;
-
-my $version = 'v0.16.3';
-my ($ignore,$genomic_fasta,$single,$paired,$full,$report,$no_overlap,$merge_non_CpG,$vanilla,$output_dir,$no_header,$bedGraph,$remove,$coverage_threshold,$counts,$cytosine_report,$genome_folder,$zero,$CpG_only,$CX_context,$split_by_chromosome,$sort_size,$samtools_path,$gzip,$ignore_r2,$mbias_off,$mbias_only,$gazillion,$ample_mem,$ignore_3prime,$ignore_3prime_r2,$multicore) = process_commandline();
-
-
-### only needed for bedGraph output
-my @sorting_files; # if files are to be written to bedGraph format, these are the methylation extractor output files
-my @methylcalls = qw (0 0 0); # [0] = methylated, [1] = unmethylated, [2] = total
-my @bedfiles;
-
-### only needed for genome-wide cytosine methylation report
-my %chromosomes;
-
-my %mbias_1;
-my %mbias_2;
-
-
-##############################################################################################
-### Summarising Run Parameters
-##############################################################################################
-
-### METHYLATION EXTRACTOR
-
-warn "Summarising Bismark methylation extractor parameters:\n";
-warn '='x63,"\n";
-
-if ($single){
-  if ($vanilla){
-    warn "Bismark single-end vanilla format specified\n";
-  }
-  else{
-    warn "Bismark single-end SAM format specified (default)\n"; # default
-  }
-}
-elsif ($paired){
-  if ($vanilla){
-    warn "Bismark paired-end vanilla format specified\n";
-  }
-  else{
-    warn "Bismark paired-end SAM format specified (default)\n"; # default
-  }
-}
-
-warn "Number of cores to be used: $multicore\n";
-
-if ($single){
-  if ($ignore){
-    warn "First $ignore bp will be disregarded when processing the methylation call string\n";
-  }
-  if ($ignore_3prime){
-    warn "Last $ignore_3prime bp will be disregarded when processing the methylation call string\n";
-  }
-
-}
-else{ ## paired-end
-  if ($ignore){
-    warn "First $ignore bp will be disregarded when processing the methylation call string of Read 1\n";
-  }
-  if ($ignore_r2){
-    warn "First $ignore_r2 bp will be disregarded when processing the methylation call string of Read 2\n";
-  }
-
-  if ($ignore_3prime){
-    warn "Last $ignore_3prime bp will be disregarded when processing the methylation call string of Read 1\n";
-  }
-  if ($ignore_3prime_r2){
-    warn "Last $ignore_3prime_r2 bp will be disregarded when processing the methylation call string of Read 2\n";
-  }
-
-
-}
-
-
-if ($full){
-  warn "Strand-specific outputs will be skipped. Separate output files for cytosines in CpG, CHG and CHH context will be generated\n";
-}
-if ($merge_non_CpG){
-  warn "Merge CHG and CHH context to non-CpG context specified\n";
-}
-### output directory
-if ($output_dir eq ''){
-  warn "Output will be written to the current directory ('$parent_dir')\n";
-}
-else{
-  warn "Output path specified as: $output_dir\n";
-}
-
-
-sleep (1);
-
-### BEDGRAPH
-
-if ($bedGraph){
-  warn "\n\nSummarising bedGraph parameters:\n";
-  warn '='x63,"\n";
-
-  if ($counts){
-    warn "Generating additional output in bedGraph and coverage format\nbedGraph format:\t<Chromosome> <Start Position> <End Position> <Methylation Percentage>\ncoverage format:\t<Chromosome> <Start Position> <End Position> <Methylation Percentage> <count methylated> <count non-methylated>\n\n";
-  }
-  else{
-    warn "Generating additional sorted output in bedGraph format (output format: <Chromosome> <Start Position> <End Position> <Methylation Percentage>)\n";
-  }
-
-  ### Zero-based coordinates
-  if ($zero){
-    warn "Writing out an additional coverage file (ending in zero.cov) with 0-based start and 1-based end genomic coordinates (zero-based, half-open; user-defined)\n";
-  }
-
-  warn "Using a cutoff of $coverage_threshold read(s) to report cytosine positions\n";
-
-  if ($CX_context){
-    warn "Reporting and sorting methylation information for all cytosine context (sorting may take a long time, you have been warned ...)\n";
-  }
-  else{ # default
-    $CpG_only = 1;
-    warn "Reporting and sorting cytosine methylation information in CpG context only (default)\n";
-  }
-
-  if ($remove){
-    warn "White spaces in read ID names will be removed prior to sorting\n";
-  }
-
-  if ($ample_mem){
-    warn "Sorting chromosomal postions for the bedGraph step using arrays instead of using UNIX sort\n";
-  }
-  elsif (defined $sort_size){
-    warn "The bedGraph UNIX sort command will use the following memory setting:\t'$sort_size'. Temporary directory used for sorting is the output directory\n";
-  }
-  else{
-    warn "Setting a default memory usage for the bedGraph UNIX sort command to 2GB\n";
-  }
-
-
-
-  sleep (1);
-
-  if ($cytosine_report){
-    warn "\n\nSummarising genome-wide cytosine methylation report parameters:\n";
-    warn '='x63,"\n";
-    warn "Generating comprehensive genome-wide cytosine report\n(output format: <Chromosome> <Position> <Strand> <count methylated> <count non-methylated>  <C-context>  <trinucleotide context> )\n";
-
-
-    if ($CX_context){
-      warn "Reporting methylation for all cytosine contexts. Be aware that this will generate enormous files\n";
-    }
-    else{ # default
-      $CpG_only = 1;
-      warn "Reporting cytosine methylation in CpG context only (default)\n";
-    }
-
-    if ($split_by_chromosome){
-      warn "Splitting the cytosine report output up into individual files for each chromosome\n";
-    }
-
-    ### Zero-based coordinates
-    if ($zero){
-      warn "Using zero-based start and 1-based end genomic coordinates (zero-based, half-open; user-defined)\n";
-    }
-    else{ # default, 1-based coords
-      warn "Using 1-based genomic coordinates (default)\n";
-    }
-
-    ### GENOME folder
-    if ($genome_folder){
-      unless ($genome_folder =~/\/$/){
-	$genome_folder =~ s/$/\//;
-      }
-      warn "Genome folder was specified as $genome_folder\n";
-    }
-    else{
-      $genome_folder  = '/data/public/Genomes/Mouse/NCBIM37/';
-      warn "Using the default genome folder /data/public/Genomes/Mouse/NCBIM37/\n";
-    }
-    sleep (1);
-  }
-}
-
-warn "\n";
-sleep (1);
-
-######################################################
-### PROCESSING FILES
-######################################################
-
-foreach my $filename (@filenames){
-  # resetting counters and filehandles
-  %fhs = ();
-  %counting =(
-	      total_meCHG_count            => 0,
-	      total_meCHH_count            => 0,
-	      total_meCpG_count            => 0,
-	      total_unmethylated_CHG_count => 0,
-	      total_unmethylated_CHH_count => 0,
-	      total_unmethylated_CpG_count => 0,
-	      sequences_count              => 0,
-	      methylation_call_strings     => 0,
-	     );
-
-  @sorting_files = ();
-  @bedfiles = ();
-
-  %mbias_1 = ();
-  %mbias_2 = ();
-
-
-  ### performing a quick check to see if a paired-end SAM file has been sorted by positions which does interfere with the logic used by the extractor
-  unless ($vanilla){
-    if ($paired){
-      test_positional_sorting($filename);
-    }
-  }
-
-  my ($pid,$pids,$report_basename) = process_Bismark_results_file($filename);
-
-  if ($pid == 0){
-    warn "Finished processing child process. Exiting..\n";
-
-    #  ### Closing all filehandles of the child process so that the Bismark methylation extractor output doesn't get truncated due to buffering issues
-    #     foreach my $fh (keys %fhs) {
-    #       if ($fh =~ /^[1230]$/) {
-    # 	foreach my $context (keys %{$fhs{$fh}}) {
-    # 	  $fhs{$fh}->{$context}->flush;
-    # 	}
-    #       }
-    #       else{
-    # 	$fhs{$fh}->flush;
-    #       }
-    # }
-    exit 0;
-  }
-
-  ###
-  if ($pid and $multicore > 1){
-    warn "Now waiting for all child processes to complete\n";
-    sleep(1);
-
-    ### we need to ensure that we wait for all child processes to be finished before continuing
-    # warn "here are the child IDs: @$pids\n";
-    # warn "Looping through the child process IDs:\n";
-
-    foreach my $id (@$pids){
-      # print "$id\t";
-      my $kid = waitpid ($id,0);
-      # print "Returned: $kid\nExit status: $?\n";
-      unless ($? == 0){
-	warn "\nChild process terminated with exit signal: '$?'\n\n";
-      }
-    }
-  }
-
-  ### Closing all filehandles so that the Bismark methylation extractor output doesn't get truncated due to buffering issues
-  foreach my $fh (keys %fhs) {
-    if ($fh =~ /^[1230]$/) {
-      foreach my $context (keys %{$fhs{$fh}}) {
-	close $fhs{$fh}->{$context} or die $!;
-      }
-    }
-    else{
-      close $fhs{$fh} or die $!;
-    }
-  }
-
-  ### We need to stitch together a main splitting report from all individual parent/child processes
-  if ($multicore > 1){
-    merge_individual_splitting_reports($report_basename);
-    print_splitting_report();
-
-    merge_individual_mbias_reports($report_basename); # this updates the main %mbias_1 and  %mbias_2 data structures so we can proceed normally
-
-  }
-
-  unless ($mbias_off){
-    ### printing out all M-Bias data
-    produce_mbias_plots ($filename);    produce_mbias_plots ($filename);
-
-  }
-
-  unless ($mbias_only){
-    delete_unused_files();
-  }
-
-  if ($bedGraph){
-
-    my $out = (split (/\//,$filename))[-1]; # extracting the filename if a full path was specified
-    $out =~ s/gz$//;
-    $out =~ s/sam$//;
-    $out =~ s/bam$//;
-    $out =~ s/txt$//;
-    $out =~ s/$/bedGraph/;
-
-    my $bedGraph_output = $out;
-    my @args;
-
-    if ($remove){
-      push @args, '--remove';
-    }
-    if ($CX_context){
-      push @args, '--CX_context';
-    }
-    if ($no_header){
-      push @args, '--no_header';
-    }
-    if ($gazillion){
-      push @args, '--gazillion';
-    }
-    if ($ample_mem){
-      push @args, '--ample_memory';
-    }
-    if ($zero){
-      push @args, "--zero";
-    }
-
-    #   if ($counts){
-    #      push @args, "--counts";
-    #   }
-
-    push @args, "--buffer_size $sort_size";
-    push @args, "--cutoff $coverage_threshold";
-    push @args, "--output $bedGraph_output";
-    push @args, "--dir '$output_dir'";
-
-    ### adding all files to be sorted to @args
-    foreach my $f (@sorting_files){
-      push @args, $f;
-    }
-
-    #  print join "\t",@args,"\n";
-
-    system ("$Bin/bismark2bedGraph @args");
-
-    warn "Finished BedGraph conversion ...\n\n";
-    sleep(1);
-
-    # open (OUT,'>',$output_dir.$bedGraph_output) or die "Problems with the bedGraph output filename detected: file path: '$output_dir'\tfile name: '$bedGraph_output' $!";
-    # warn "Writing bedGraph to file: $bedGraph_output\n";
-    # process_bedGraph_output();
-    # close OUT or die $!;
-
-    ### genome-wide cytosine methylation report requires bedGraph processing anyway
-    if ($cytosine_report){
-
-      @args = (); # resetting @args
-      my $cytosine_out = $out;
-      $cytosine_out =~ s/bedGraph$//;
-
-      if ($CX_context){
-	$cytosine_out =~ s/$/CX_report.txt/;
-      }
-      else{
-	$cytosine_out =~ s/$/CpG_report.txt/;
-      }
-
-      push @args, "--output $cytosine_out";
-      push @args, "--dir '$output_dir'";
-      push @args, "--genome '$genome_folder'";
-      push @args, "--parent_dir '$parent_dir'";
-
-      if ($zero){
-	push @args, "--zero";
-      }
-      if ($CX_context){
-	push @args, '--CX_context';
-      }
-      if ($split_by_chromosome){
-	push @args, '--split_by_chromosome';
-      }
-      if ($gzip){
-	  push @args, '--gzip';
-      }
-
-      my $coverage_output = $bedGraph_output;
-      $coverage_output =~ s/bedGraph$/bismark.cov.gz/;
-      
-      push @args, $coverage_output; # this will be the infile
-      # warn "Handing over the following infile: $coverage_output\n"; sleep (5);
-      system ("$Bin/coverage2cytosine @args");
-      
-      warn "\n\nFinished generating genome-wide cytosine report\n\n";
-    }
-  }
-}
-
-sub merge_individual_splitting_reports{
-
-  my $report_basename = shift;
-
-  my @splitting_reports; # only needed in multi-core mode to generate an overall report
-  foreach my $ext (1..$multicore){
-    push @splitting_reports, "$report_basename.$ext";
-  }
-  warn "\nMerging individual splitting reports into overall report: '$report_basename'\n";
-  warn "Merging from these individual files:\n";
-  print join ("\n",@splitting_reports),"\n\n";
-  sleep(1);
-
-  ##########
-  # resetting the counter first
-  %counting =(
-	      total_meCHG_count            => 0,
-	      total_meCHH_count            => 0,
-	      total_meCpG_count            => 0,
-	      total_unmethylated_CHG_count => 0,
-	      total_unmethylated_CHH_count => 0,
-	      total_unmethylated_CpG_count => 0,
-	      sequences_count              => 0,
-	      methylation_call_strings     => 0,
-	     );
-
-  # repopulating the merged counter
-  foreach my $file (@splitting_reports){
-    open (IR,$file) or die $!;
-    while (<IR>){
-      chomp;
-      my ($context,$count) = (split /\t/);
-      if ($context){
-	if ($context =~ /^Total C to T conversions in CpG context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_unmethylated_CpG_count} += $count;
-	}
-	elsif ($context =~ /^Total C to T conversions in CHG context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_unmethylated_CHG_count} += $count;
-	}
-	elsif ($context =~ /^Total C to T conversions in CHH context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_unmethylated_CHH_count} += $count;
-	}
-	elsif ($context =~ /^Total methylated C\'s in CpG context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_meCpG_count} += $count;
-	}
-	elsif ($context =~ /^Total methylated C\'s in CHG context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_meCHG_count} += $count;
-	}
-	elsif ($context =~ /^Total methylated C\'s in CHH context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_meCHH_count} += $count;
-	}
-	elsif ($context =~ /^line count/){
-	  # warn "Line count\ncount: $count\n";
-	  $counting{sequences_count} = $count; # always the same
-	}
-	elsif ($context =~ /^meth call strings/){
-	  # warn "Meth call strings\ncount: $count\n";
-	  $counting{methylation_call_strings} += $count;
-	}
-      }
-    }
-  }
-
-  # deleting the individual reports afterwards
-  foreach my $file (@splitting_reports){
-    unlink $file;
-  }
-}
-
-
-sub merge_individual_mbias_reports{
-
-  my $report_basename = shift;
-
-  my @mbias_reports; # only needed in multi-core mode to generate an overall report
-  foreach my $ext (1..$multicore){
-    push @mbias_reports, "$report_basename.${ext}.mbias";
-  }
-  warn "\nMerging individual M-bias reports into overall M-bias statistics from these $multicore individual files:\n";
-  print join ("\n",@mbias_reports),"\n\n";
-
-
-  ##########
-  # resetting the counters first, then repopulating them
-  %mbias_1 = ();
-  %mbias_2 = ();
-
-  # repopulating the merged counter
-  foreach my $file (@mbias_reports){
-    open (IR,$file) or die $!;
-
-    my $context;
-    my $read;
-
-    while (<IR>){
-      chomp;
-      # warn "$_\n"; sleep(1);
-      if ($_ =~ /context/){
-	$context = $1 if ($_ =~ /(\D{3}) context/);
-	# warn "Context set as $context\n";
-	
-	if ($_ =~ /R2/){
-	  $read = 'R2';
-	}
-	else{
-	  $read = 'R1';
-	}
-	# warn "Setting read identity to '$read'\n";
-	
-	# reading in 2 additional lines (===========, and header line)
-	$_ = <IR>;
-	#warn "discarding line $_\n";
-	$_ = <IR>;
-	#warn "discarding line $_\n";
-	next;
-      }
-      else{
-
-	if ($_ eq ''){
-	  # empty line, only occurs after a context has finished and before a new context starts
-	  next;
-	}
-
-	my ($pos,$meth,$unmeth) = (split /\t/);
-	# warn "$pos\t$meth\t$unmeth\n"; sleep(1);
-	if ($read eq 'R1'){
-	  $mbias_1{$context}->{$pos}->{meth} += $meth;
-	  $mbias_1{$context}->{$pos}->{un} += $unmeth;
-	}
-	elsif ($read eq 'R2'){
-	  $mbias_2{$context}->{$pos}->{meth} += $meth;
-	  $mbias_2{$context}->{$pos}->{un} += $unmeth;
-	}
-      }
-    }
-    close IR or warn "Had trouble closing filehandle for $file: $!\n";
-  }
-
-  # deleting the individual reports afterwards
-  foreach my $file (@mbias_reports){
-    unlink $file;
-  }
-}
-
-
-sub delete_unused_files{
-
-  warn "Deleting unused files ...\n\n"; sleep(1);
-
-  my $index = 0;
-
-  while ($index <= $#sorting_files){
-    if ($sorting_files[$index] =~ /gz$/){
-      open (USED,"gunzip -c $sorting_files[$index] |") or die "Failed to read from methylation extractor output file $sorting_files[$index]: $!\n";
-    }
-    else{
-      open (USED,$sorting_files[$index]) or die "Failed to read from methylation extractor output file $sorting_files[$index]: $!\n";
-    }
-
-    my $used = 0;
-
-    while (<USED>){
-      next if (/^Bismark/);
-      if ($_){
-	$used = 1;
-	last;
-      }
-    }
-
-    if ($used){
-      warn "$sorting_files[$index] contains data ->\tkept\n";
-      ++$index;
-    }
-    else{
-
-      my $delete = unlink $sorting_files[$index];
-
-      if ($delete){
-	warn "$sorting_files[$index] was empty ->\tdeleted\n";
-      }
-      else{
-	warn "$sorting_files[$index] was empty, however deletion was unsuccessful: $!\n"
-      }
-
-      ### we also need to remove the element from @sorting_files
-      splice @sorting_files, $index, 1;
-    }
-  }
-  warn "\n\n"; ## can't close the piped filehandles at this point because it will die (unfortunately)
-}
-
-sub produce_mbias_plots{
-
-  my $filename = shift;
-
-  my $mbias = (split (/\//,$filename))[-1]; # extracting the filename if a full path was specified
-  $mbias =~ s/gz$//;
-  $mbias =~ s/sam$//;
-  $mbias =~ s/bam$//;
-  $mbias =~ s/cram$//;
-  $mbias =~ s/txt$//;
-   my $mbias_graph_1 = my $mbias_graph_2 = $mbias;
-  $mbias_graph_1 = $output_dir . $mbias_graph_1 . 'M-bias_R1.png';
-  $mbias_graph_2 = $output_dir . $mbias_graph_2 . 'M-bias_R2.png';
-
-  $mbias =~ s/$/M-bias.txt/;
-
-  open (MBIAS,'>',"$output_dir$mbias") or die "Failed to open file for the M-bias data\n\n";
-
-  # determining maximum read length
-  my $max_length_1 = 0;
-  my $max_length_2 = 0;
-
-  foreach my $context (keys %mbias_1){
-    foreach my $pos (sort {$a<=>$b} keys %{$mbias_1{$context}}){
-      $max_length_1 = $pos unless ($max_length_1 >= $pos);
-    }
-  }
-  if ($paired){
-    foreach my $context (keys %mbias_2){
-      foreach my $pos (sort {$a<=>$b} keys %{$mbias_2{$context}}){
-	$max_length_2 = $pos unless ($max_length_2 >= $pos);
-      }
-    }
-  }
-
-  if ($single){
-    warn "Determining maximum read length for M-Bias plot\n";
-    warn "Maximum read length of Read 1: $max_length_1\n\n";
-  }
-  else{
-    warn "Determining maximum read lengths for M-Bias plots\n";
-    warn "Maximum read length of Read 1: $max_length_1\n";
-    warn "Maximum read length of Read 2: $max_length_2\n\n";
-  }
-  # sleep(3);
-
-  my @mbias_read1;
-  my @mbias_read2;
-
-  #Check whether the module GD::Graph:lines is installed
-  my $gd_graph_installed = 0;
-  eval{
-    require GD::Graph::lines;
-    GD::Graph::lines->import();
-  };
-
-  unless($@) { # syntax or routine error variable, set if something goes wrong in the last eval{ require ...}
-    $gd_graph_installed = 1;
-
-    #Check whether the module GD::Graph::colour is installed
-    eval{
-      require GD::Graph::colour;
-      GD::Graph::colour->import(qw(:colours :lists :files :convert));
-    };
-
-    if ($@) {
-      warn "Perl module GD::Graph::colour not found, skipping drawing M-bias plots (only writing out M-bias plot table)\n";
-      sleep(2);
-      $gd_graph_installed = 0;
-    }
-
-
-  }
-  else{
-    warn "Perl module GD::Graph::lines is not installed, skipping drawing M-bias plots (only writing out M-bias plot table)\n";
-    sleep(2);
-  }
-
-
-  my $graph_title;
-  my $graph1;
-  my $graph2;
-
-  if ( $gd_graph_installed){
-    $graph1 = GD::Graph::lines->new(800,600);
-    if ($paired){
-      $graph2 = GD::Graph::lines->new(800,600);
-    }
-  }
-
-  foreach my $context (qw(CpG CHG CHH)){
-    @{$mbias_read1[0]} = ();
-
-    if ($paired){
-      print MBIAS "$context context (R1)\n================\n";
-      $graph_title = 'M-bias (Read 1)';
-    }
-    else{
-      print MBIAS "$context context\n===========\n";
-      $graph_title = 'M-bias';
-    }
-    print MBIAS "position\tcount methylated\tcount unmethylated\t% methylation\tcoverage\n";
-
-    foreach my $pos (1..$max_length_1){
-
-      unless (defined $mbias_1{$context}->{$pos}->{meth}){
-	$mbias_1{$context}->{$pos}->{meth} = 0;
-      }
-      unless (defined $mbias_1{$context}->{$pos}->{un}){
-	$mbias_1{$context}->{$pos}->{un} = 0;
-      }
-
-      my $percent = '';
-      if (($mbias_1{$context}->{$pos}->{meth} + $mbias_1{$context}->{$pos}->{un}) > 0){
-	$percent = sprintf("%.2f",$mbias_1{$context}->{$pos}->{meth} * 100/ ( $mbias_1{$context}->{$pos}->{meth} + $mbias_1{$context}->{$pos}->{un}) );
-      }
-      my $coverage = $mbias_1{$context}->{$pos}->{un} + $mbias_1{$context}->{$pos}->{meth};
-
-      print MBIAS "$pos\t$mbias_1{$context}->{$pos}->{meth}\t$mbias_1{$context}->{$pos}->{un}\t$percent\t$coverage\n";
-      push @{$mbias_read1[0]},$pos;
-
-      if ($context eq 'CpG'){
-	push @{$mbias_read1[1]},$percent;
-	push @{$mbias_read1[4]},$coverage;
-      }
-      elsif ($context eq 'CHG'){
-	push @{$mbias_read1[2]},$percent;
-	push @{$mbias_read1[5]},$coverage;
-      }
-      elsif ($context eq 'CHH'){
-    	push @{$mbias_read1[3]},$percent;
-	push @{$mbias_read1[6]},$coverage;
-      }
-    }
-    print MBIAS "\n";
-  }
-
-  if ( $gd_graph_installed){
-
-    add_colour(nice_blue => [31,120,180]);
-    add_colour(nice_orange => [255,127,0]);
-    add_colour(nice_green => [51,160,44]);
-    add_colour(pale_blue => [153,206,227]);
-    add_colour(pale_orange => [253,204,138]);
-    add_colour(pale_green => [191,230,207]);
-
-    $graph1->set(
-		 x_label              => 'position (bp)',
-		 y1_label              => '% methylation',
-		 y2_label              => '# methylation calls',
-		 title                => $graph_title,
-		 line_width           => 2,
-		 x_max_value          => $max_length_1,
-		 x_min_value          => 0,
-		 y_tick_number        => 10,
-		 y_label_skip         => 2,
-		 y1_max_value          => 100,
-		 y1_min_value          => 0,
-		 y_label_skip         => 2,
-		 y2_min_value          => 0,
-		 x_label_skip         => 5,
-		 x_label_position     => 0.5,
-		 x_tick_offset        => -1,
-		 bgclr                => 'white',
-		 transparent          => 0,
-		 two_axes             => 1,
-		 use_axis             => [1,1,1,2,2,2],
-		 legend_placement     => 'RC',
-		 legend_spacing       => 6,
-		 legend_marker_width  => 24,
-		 legend_marker_height => 18,
-		 dclrs              => [ qw(nice_blue nice_orange nice_green pale_blue pale_orange pale_green)],
-		) or die $graph1->error;
-
-    $graph1->set_legend('CpG methylation','CHG methylation','CHH methylation','CpG total calls','CHG total calls','CHH total calls');
-
-    ### Failure to plot the MBIAS graph will now generate a warning instead of dieing (previous version below. Suggested by Andrew DeiRossi, 05 June 2014)
-    if (my $gd1 = $graph1->plot(\@mbias_read1)) {
-      open (MBIAS_G1,'>',$mbias_graph_1) or die "Failed to write to file for M-bias plot 1: $!\n\n";
-      binmode MBIAS_G1;
-      print MBIAS_G1 $gd1->png;
-    }
-    else {
-      warn "WARNING: Cannot generate read 1 M-bias plot: " , $graph1->error  , "\n\n";
-    }
-
-    #     my $gd1 = $graph1->plot(\@mbias_read1) or die $graph1->error;
-    #     open (MBIAS_G1,'>',$mbias_graph_1) or die "Failed to write to file for M-bias plot 1: $!\n\n";
-    #     binmode MBIAS_G1;
-    #     print MBIAS_G1 $gd1->png;
-  }
-
-  if ($paired){
-
-    foreach my $context (qw(CpG CHG CHH)){
-      @{$mbias_read2[0]} = ();
-
-      print MBIAS "$context context (R2)\n================\n";
-      print MBIAS "position\tcount methylated\tcount unmethylated\t% methylation\tcoverage\n";
-      foreach my $pos (1..$max_length_2){
-	
-	unless (defined $mbias_2{$context}->{$pos}->{meth}){
-	  $mbias_2{$context}->{$pos}->{meth} = 0;
-	}
-	unless (defined $mbias_2{$context}->{$pos}->{un}){
-	  $mbias_2{$context}->{$pos}->{un} = 0;
-	}
-
-	my $percent = '';
-	if (($mbias_2{$context}->{$pos}->{meth} + $mbias_2{$context}->{$pos}->{un}) > 0){
-	  $percent = sprintf("%.2f",$mbias_2{$context}->{$pos}->{meth} * 100/ ($mbias_2{$context}->{$pos}->{meth} + $mbias_2{$context}->{$pos}->{un}) );
-	}
-	my $coverage = $mbias_2{$context}->{$pos}->{un} + $mbias_2{$context}->{$pos}->{meth};
-
-	print MBIAS "$pos\t$mbias_2{$context}->{$pos}->{meth}\t$mbias_2{$context}->{$pos}->{un}\t$percent\t$coverage\n";
-	
-	push @{$mbias_read2[0]},$pos;
-	
-	if ($context eq 'CpG'){
-	  push @{$mbias_read2[1]},$percent;
-	  push @{$mbias_read2[4]},$coverage;
-	}
-	elsif ($context eq 'CHG'){
-	  push @{$mbias_read2[2]},$percent;
-	  push @{$mbias_read2[5]},$coverage;
-	}
-	elsif ($context eq 'CHH'){
-	  push @{$mbias_read2[3]},$percent;
-	  push @{$mbias_read2[6]},$coverage;
-	}
-      }	
-      print MBIAS "\n";
-    }
-
-    if ( $gd_graph_installed){
-
-      add_colour(nice_blue => [31,120,180]);
-      add_colour(nice_orange => [255,127,0]);
-      add_colour(nice_green => [51,160,44]);
-      add_colour(pale_blue => [153,206,227]);
-      add_colour(pale_orange => [253,204,138]);
-      add_colour(pale_green => [191,230,207]);
-
-      $graph2->set(
-		   x_label              => 'position (bp)',
-		   line_width           => 2,
-		   x_max_value          => $max_length_1,
-		   x_min_value          => 0,
-		   y_tick_number        => 10,
-		   y_label_skip         => 2,
-		   y1_max_value          => 100,
-		   y1_min_value          => 0,
-		   y_label_skip         => 2,
-		   y2_min_value          => 0,
-		   x_label_skip         => 5,
-		   x_label_position     => 0.5,
-		   x_tick_offset        => -1,
-		   bgclr                => 'white',
-		   transparent          => 0,
-		   two_axes             => 1,
-		   use_axis             => [1,1,1,2,2,2],
-		   legend_placement     => 'RC',
-		   legend_spacing       => 6,
-		   legend_marker_width  => 24,
-		   legend_marker_height => 18,
-		   dclrs                => [ qw(nice_blue nice_orange nice_green pale_blue pale_orange pale_green)],
-		   x_label              => 'position (bp)',
-		   y1_label             => '% methylation',
-		   y2_label             => '# calls',
-		   title                => 'M-bias (Read 2)',
-		  ) or die $graph2->error;
-
-      $graph2->set_legend('CpG methylation','CHG methylation','CHH methylation','CpG total calls','CHG total calls','CHH total calls');
-
-      ### Failure to plot the MBIAS graph will now generate a warning instead of dieing (previous version below. Suggested by Andrew DeiRossi, 05 June 2014)
-      if (my $gd2 = $graph2->plot(\@mbias_read2)) {
-        open (MBIAS_G2,'>',$mbias_graph_2) or die "Failed to write to file for M-bias plot 2: $!\n\n";
-        binmode MBIAS_G2;
-        print MBIAS_G2 $gd2->png;
-      }
-      else {
-        warn "WARNING: Cannot generate Read 2 M-bias plot: " , $graph2->error , "\n\n";
-      }
-
-      # my $gd2 = $graph2->plot(\@mbias_read2) or die $graph2->error;
-      # open (MBIAS_G2,'>',$mbias_graph_2) or die "Failed to write to file for M-bias plot 2: $!\n\n";
-      # binmode MBIAS_G2;
-      # print MBIAS_G2 $gd2->png;
-
-    }
-  }
-}
-
-sub process_commandline{
-  my $help;
-  my $single_end;
-  my $paired_end;
-  my $ignore;
-  my $ignore_r2;
-  my $genomic_fasta;
-  my $full;
-  my $report;
-  my $extractor_version;
-  my $no_overlap;
-  my $merge_non_CpG;
-  my $vanilla;
-  my $output_dir;
-  my $no_header;
-  my $bedGraph;
-  my $coverage_threshold = 1; # Minimum number of reads covering before calling methylation status
-  my $remove;
-  my $counts;
-  my $cytosine_report;
-  my $genome_folder;
-  my $zero;
-  my $CpG_only;
-  my $CX_context;
-  my $split_by_chromosome;
-  my $sort_size;
-  my $samtools_path;
-  my $gzip;
-  my $mbias_only;
-  my $mbias_off;
-  my $gazillion;
-  my $ample_mem;
-  my $include_overlap;
-  my $ignore_3prime;
-  my $ignore_3prime_r2;
-  my $multicore;
-  
-  my $command_line = GetOptions ('help|man'             => \$help,
-				 'p|paired-end'         => \$paired_end,
-				 's|single-end'         => \$single_end,
-				 'fasta'                => \$genomic_fasta,
-				 'ignore=i'             => \$ignore,
-				 'ignore_r2=i'          => \$ignore_r2,
-				 'comprehensive'        => \$full,
-				 'report'               => \$report,
-				 'version'              => \$extractor_version,
-				 'no_overlap'           => \$no_overlap,
-				 'merge_non_CpG'        => \$merge_non_CpG,
-				 'vanilla'              => \$vanilla,
-				 'o|output=s'           => \$output_dir,
-				 'no_header'            => \$no_header,
-				 'bedGraph'             => \$bedGraph,
-				 "cutoff=i"             => \$coverage_threshold,
-				 "remove_spaces"        => \$remove,
-				 "counts"               => \$counts,
-				 "cytosine_report"      => \$cytosine_report,
-				 'g|genome_folder=s'    => \$genome_folder,
-				 "zero_based"           => \$zero,	
-				 "CX|CX_context"        => \$CX_context,
-				 "split_by_chromosome"  => \$split_by_chromosome,
-				 "buffer_size=s"        => \$sort_size,
-				 'samtools_path=s'      => \$samtools_path,
-				 'gzip'                 => \$gzip,
-				 'mbias_only'           => \$mbias_only,			
-				 'mbias_off'            => \$mbias_off,			
-				 'gazillion|scaffolds'  => \$gazillion,
-				 'ample_memory'         => \$ample_mem,
-				 'include_overlap'      => \$include_overlap,
-				 'ignore_3prime=i'      => \$ignore_3prime,
-				 'ignore_3prime_r2=i'   => \$ignore_3prime_r2,
-				 'multicore=i'          => \$multicore,
-	);
-
-  ### EXIT ON ERROR if there were errors with any of the supplied options
-  unless ($command_line){
-    die "Please respecify command line options\n";
-  }
-
-  ### HELPFILE
-  if ($help){
-    print_helpfile();
-    exit;
-  }
-
-  if ($extractor_version){
-    print << "VERSION";
-
-
-                           Bismark Methylation Extractor
-
-                         Bismark Extractor Version: $version
-              Copyright 2010-15 Felix Krueger, Babraham Bioinformatics
-                www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-
-VERSION
-    exit;
-  }
-
-
-  ### no files provided
-  unless (@ARGV){
-    die "You need to provide one or more Bismark files to create an individual C methylation output. Please respecify!\n";
-  }
-  @filenames = @ARGV;
-
-  warn "\n *** Bismark methylation extractor version $version ***\n\n";
-
-  ### M-BIAS ONLY
-  if ($mbias_only){
-
-    if ($mbias_off){
-      die "Options '--mbias_only' and '--mbias_off' are not compatible. Just pick one, mkay?\n";
-    }
-    if ($bedGraph){
-      die "Option '--mbias_only' skips all sorts of methylation extraction, including the bedGraph generation. Please respecify!\n";
-    }
-    if ($cytosine_report){
-      die "Option '--mbias_only' skips all sorts of methylation extraction, including the genome-wide cytosine methylation report generation. Please respecify!\n";
-    }
-    if ($merge_non_CpG){
-      warn "Option '--mbias_only' skips all sorts of methylation extraction, thus '--merge' won't have any effect\n";
-    }
-    if ($full){
-      warn "Option '--mbias_only' skips all sorts of methylation extraction, thus '--comprehensive' won't have any effect\n";
-    }
-    sleep(3);
-  }
-
-  ### PRINT A REPORT
-  unless ($report){
-    $report = 1; # making this the default
-  }
-
-  ### OUTPUT DIR PATH
-  if ($output_dir){
-    unless ($output_dir =~ /\/$/){
-      $output_dir =~ s/$/\//;
-    }
-  }
-  else{
-    $output_dir = '';
-  }
-
-  ### NO HEADER
-  unless ($no_header){
-    $no_header = 0;
-  }
-
-  ### OLD (VANILLA) OUTPUT FORMAT
-  unless ($vanilla){
-    $vanilla = 0;
-  }
-
-  if ($single_end){
-    $paired_end = 0;   ### SINGLE END ALIGNMENTS
-  }
-  elsif ($paired_end){
-    $single_end = 0;   ### PAIRED-END ALIGNMENTS
-  }
-  else{
-
-    ### we will try to determine whether the input file was a single-end or paired-end sequencing run from the SAM header
-
-    if ($vanilla){
-      die "Please specify whether the supplied file(s) are in Bismark single-end or paired-end format with '-s' or '-p'\n\n";
-    }
-    else{ # SAM/BAM format
-
-      my $file = $filenames[0];
-      warn "Trying to determine the type of mapping from the SAM header line of file $file\n"; sleep(1);
-	
-      ### if the user did not specify whether the alignment file was single-end or paired-end we are trying to get this information from the @PG header line in the SAM/BAM file
-      if ($file =~ /\.gz$/){
-	open (DETERMINE,"gunzip -c $file |") or die "Unable to read from gzipped file $file: $!\n";
-      }
-      elsif ($file =~ /\.cram$/ || $file =~ /\.bam$/ || isBam($file) ){ ### this would allow to read BAM files that do not end in *.bam
-	open (DETERMINE,"samtools view -h $file |") or die "Unable to read from BAM/CRAM file $file: $!\n";
-      }
-      else{
-	open (DETERMINE,$file) or die "Unable to read from $file: $!\n";
-      }
-
-      while (<DETERMINE>){
-	last unless (/^\@/);
-	if ($_ =~ /^\@PG/){
-	  # warn "found the \@PG line:\n";
-	  # warn "$_";
-	
-	  if ($_ =~ /\s+-1\s+/ and $_ =~ /\s+-2\s+/){
-	    warn "Treating file(s) as paired-end data (as extracted from \@PG line)\n\n"; sleep(1);
-	    $paired_end = 1;
-	    $single_end = 0;
-	  }
-	  else{
-	    warn "Treating file(s) as single-end data (as extracted from \@PG line)\n\n"; sleep(1);
-	    $paired_end = 0;
-	    $single_end = 1;
-	  }
-	}
-      }
-
-      # close DETERMINE or warn $!; # this always throws an error anyway...
-	
-    }
-  }
-
-  ### IGNORING <INT> 5' END 
-  # bases at the start of the read when processing the methylation call string
-  unless ($ignore){
-    $ignore = 0;
-  }
-
-  if (defined $ignore_r2){
-    die "You can only specify --ignore_r2 for paired-end result files\n" unless ($paired_end);
-  }
-  else{
-    $ignore_r2 = 0;
-  }
-
-  ### IGNORING <INT> 3' END
-  # bases at the end of the read when processing the methylation call string
-  unless ($ignore_3prime){
-    $ignore_3prime = 0;
-  }
-
-  if (defined $ignore_3prime_r2){
-    die "You can only specify --ignore_3prime_r2 for paired-end result files\n" unless ($paired_end);
-  }
-  else{
-    $ignore_3prime_r2 = 0;
-  }
-
-
-  ### NO OVERLAP
-  ### --no_overlap is the default (as of version 0.12.6), unless someone explicitly asks to include overlaps
-  if ($include_overlap){
-    die "The option '--include_overlap' can only be specified for paired-end input!\n" unless ($paired_end);
-    warn "Setting option '--inlcude_overlap' for paired-end data (user-defined)\n\n";
-    $no_overlap = 0;
-  }
-  else{ # default
-    if ($paired_end){
-      warn "Setting option '--no_overlap' since this is (normally) the right thing to do for paired-end data\n\n";
-      $no_overlap = 1;
-    }
-  }
-
-  ### COMPREHENSIVE OUTPUT
-  unless ($full){
-    $full = 0;
-  }
-
-  ### MERGE NON-CpG context
-  unless ($merge_non_CpG){
-    $merge_non_CpG = 0;
-  }
-
-  ### remove white spaces in read ID (needed for sorting using the sort command
-  unless ($remove){
-    $remove = 0;
-  }
-
-  ### COVERAGE THRESHOLD FOR bedGraph OUTPUT
-  if (defined $coverage_threshold){
-    unless ($coverage_threshold > 0){
-      die "Please select a coverage greater than 0 (positive integers only)\n";
-    }
-  }
-  else{
-    $coverage_threshold = 1;
-  }
-
-  ### SORT buffer size
-  if (defined $sort_size){
-    unless ($sort_size =~ /^\d+\%$/ or $sort_size =~ /^\d+(K|M|G|T)$/){
-      die "Please select a buffer size as percentage (e.g. --buffer_size 20%) or a number to be multiplied with K, M, G, T etc. (e.g. --buffer_size 20G). For more information on sort type 'info sort' on a command line\n";
-    }
-  }
-  else{
-    $sort_size = '2G';
-  }
-
-  if ($zero){
-    die "Option '--zero' is only available if  '--bedGraph' or '--cytosine_report' are specified as well. Please respecify\n" unless ($cytosine_report or $bedGraph);
-  }
-
-  if ($CX_context){
-    die "Option '--CX_context' is only available if  '--bedGraph' or '--cytosine_report' are specified as well. Please respecify\n" unless ($cytosine_report or $bedGraph);
-  }
-  else{
-    $CX_context = 0;
-  }
-
-  unless ($counts){
-    $counts = 1; # counts will always be set
-  }
-
-  if ($cytosine_report){
-
-    ### GENOME folder
-    if ($genome_folder){
-      unless ($genome_folder =~/\/$/){
-	$genome_folder =~ s/$/\//;
-      }
-    }
-    else{
-      die "Please specify a genome folder to proceed (full path only)\n";
-    }
-
-    unless ($bedGraph){
-      warn "Setting the option '--bedGraph' since this is required for the genome-wide cytosine report\n";
-      $bedGraph = 1;
-    }
-    unless ($counts){
-      # warn "Setting the option '--counts' since this is required for the genome-wide cytosine report\n";
-      $counts = 1;
-    }
-    warn "\n";
-  }
-
-  ### PATH TO SAMTOOLS
-  if (defined $samtools_path){
-    # if Samtools was specified as full command
-    if ($samtools_path =~ /samtools$/){
-      if (-e $samtools_path){
-	# Samtools executable found
-      }
-      else{
-	die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-      }
-    }
-    else{
-      unless ($samtools_path =~ /\/$/){
-	$samtools_path =~ s/$/\//;
-      }
-      $samtools_path .= 'samtools';
-      if (-e $samtools_path){
-	# Samtools executable found
-      }
-      else{
-	die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-      }
-    }
-  }
-  # Check whether Samtools is in the PATH if no path was supplied by the user
-  else{
-    if (!system "which samtools >/dev/null 2>&1"){ # STDOUT is binned, STDERR is redirected to STDOUT. Returns 0 if Samtools is in the PATH
-      $samtools_path = `which samtools`;
-      chomp $samtools_path;
-    }
-  }
-
-  unless (defined $samtools_path){
-    $samtools_path = '';
-  }
-
-
-  if ($gazillion){
-    if ($ample_mem){
-      die "You can't currently select '--ample_mem' together with '--gazillion'. Make your pick!\n\n";
-    }
-  }
-
-  if (defined $multicore){
-    unless ($multicore > 0){
-      die "Core usage needs to be set to 1 or more (currently selected $multicore). Please respecify!\n";
-    }
-    if ($multicore > 20){
-      warn "Core usage currently set to more than 20 threads. Let's see how this goes... (set value: $multicore)\n\n";
-    }
-  }
-  else{
-    $multicore = 1; # default. Single-thread mode
-    warn "Setting core usage to single-threaded (default). Consider using --multicore <int> to speed up the extraction process.\n\n";
-  }
-
-  return ($ignore,$genomic_fasta,$single_end,$paired_end,$full,$report,$no_overlap,$merge_non_CpG,$vanilla,$output_dir,$no_header,$bedGraph,$remove,$coverage_threshold,$counts,$cytosine_report,$genome_folder,$zero,$CpG_only,$CX_context,$split_by_chromosome,$sort_size,$samtools_path,$gzip,$ignore_r2,$mbias_off,$mbias_only,$gazillion,$ample_mem,$ignore_3prime,$ignore_3prime_r2,$multicore);
-}
-
-
-sub test_positional_sorting{
-
-  my $filename = shift;
-
-  print "\nNow testing Bismark result file $filename for positional sorting (which would be bad...)\t";
-  sleep(1);
-  
-  if ($filename =~ /\.gz$/) {
-      open (TEST,"gunzip -c $filename |") or die "Can't open gzipped file $filename: $!\n";
-  }
-  elsif ($filename =~ /bam$/ || $filename =~ /cram$/ || isBam($filename) ){ ### this would allow to read BAM files that do not end in *.bam
-      if ($samtools_path){
-	  open (TEST,"$samtools_path view -h $filename |") or die "Can't open BAM/CRAM file $filename: $!\n";
-      }
-      else{
-	  die "Sorry couldn't find an installation of Samtools. Either specifiy an alternative path using the option '--samtools_path /your/path/', or use a SAM file instead\n\n";
-      }
-  }
-  else {
-      open (TEST,$filename) or die "Can't open file $filename: $!\n";
-  }
-
-  my $count = 0;
-
-  while (<TEST>) {
-    if (/^\@/) {	     # testing header lines if they contain the @SO flag (for being sorted)
-      if (/^\@SO/) {
-	die "SAM/BAM header line '$_' indicates that the Bismark aligment file has been sorted by chromosomal positions which is is incompatible with correct methylation extraction. Please use an unsorted file instead\n\n";
-      }
-      next;
-    }
-    $count++;
-
-    last if ($count > 100000); # else we test the first 100000 sequences if they start with the same read ID
-
-    my ($id_1) = (split (/\t/));
-
-    ### reading the next line which should be read 2
-    $_ = <TEST>;
-    my ($id_2) = (split (/\t/));
-    last unless ($id_2);
-    ++$count;
-
-    if ($id_1 eq $id_2){
-      ### ids are the same
-      next;
-    }
-    else{ ### in previous versions of Bismark we appended /1 and /2 to the read IDs for easier eyeballing which read is which. These tags need to be removed first
-      my $id_1_trunc = $id_1;
-      $id_1_trunc =~ s/\/1$//;
-      my $id_2_trunc = $id_2;
-      $id_2_trunc =~ s/\/2$//;
-
-      unless ($id_1_trunc eq $id_2_trunc){
-	die "The IDs of Read 1 ($id_1) and Read 2 ($id_2) are not the same. This might be a result of sorting the paired-end SAM/BAM files by chromosomal position which is not compatible with correct methylation extraction. Please use an unsorted file instead\n\n";
-      }
-    }
-  }
-  #  close TEST or die $!; somehow fails on our cluster...
-  ### If it hasen't died so far then it seems the file is in the correct Bismark format (read 1 and read 2 of a pair directly following each other)
-  warn "...passed!\n";
-  sleep(1);
-
-}
-
-sub process_Bismark_results_file{
-
-  my $filename = shift;
-  my $report_filename = open_output_filehandles($filename);
-
-  ### disabling buffering so we don't run into problems with half written out lines...
-  foreach my $fh (keys %fhs){
-    if ($fh =~ /^[1230]$/) {
-      foreach my $context (keys %{$fhs{$fh}}) {
-	select($fhs{$fh}->{$context});
-	$|++;
-      }
-    }
-    else{
-      select($fhs{$fh});
-      $|++;
-    }
-  }
-  select(STDOUT);
-
-  ################################################
-  ################################################
-  ### multi-process handling
-  ###
-
-  my $offset = 1;
-  my $process_id;
-  my @pids;
-  if ($multicore > 1){
-
-    until ($offset == $multicore){
-      # warn "multicore: $multicore\noffset: $offset\n";
-      my $fork = fork;
-
-      if (defined $fork){
-	if ($fork != 0){
-	  $process_id = $fork;
-	  push @pids, $process_id;
-	  if ($offset < $multicore){
-	    ++$offset;
-	    # warn "I am the parent process, child pid: $fork\nIncrementing offset counter to: $offset\n\n";
-	  }
-	  else{
-	    # warn "Reached the number of maximum multicores. Proceeeding to processing...\n";
-	  }
-	}
-	elsif ($fork == 0){
-	  # warn "I am a child process, pid: $fork\nOffset counter is: $offset\nProceeding to processing...\n";
-	  $process_id = $fork;
-	  last;
-	}
-      }
-      else{
-	die "Forking unsuccessful. Proceeding using a single thread only\n";
-      }
-    }
-
-    # warn "\nThe thread identity\n===================\n";
-    if ($process_id){
-      # print "I am the parent process. My children are called:\n";
-      # print join ("\t",@pids),"\n";
-      # print "I am going to process the following line count: $offset\n\n";
-    }
-    elsif($process_id == 0){
-      # warn "I am a child process: Process ID: $process_id\n";
-      # warn "I am going to process the following line count: $offset\n\n";
-    }
-    else{
-      die "Process ID was: $process_id\n";
-    }
-  }
-  else{
-    # warn "Single-core mode: setting pid to 1\n";
-    $process_id = 1;
-  }
-
-  ################################################
-  ################################################
-  if ($process_id){
-      warn "Now reading in Bismark result file $filename\n";
-  }
-  else{
-      warn "\nNow reading in Bismark result file $filename\n\n";
-  }
-
-  if ($filename =~ /\.gz$/) {
-      open (IN,"gunzip -c $filename |") or die "Can't open gzipped file $filename: $!\n";
-  }
-  elsif ($filename =~ /bam$/ || $filename =~ /cram$/ || isBam($filename) ){ ### this would allow to read BAM files that do not end in *.bam
-      if ($samtools_path){
-	  open (IN,"$samtools_path view -h $filename |") or die "Can't open BAM/CRAM file $filename: $!\n";
-      }
-      else{
-	  die "Sorry couldn't find an installation of Samtools. Either specifiy an alternative path using the option '--samtools_path /your/path/', or use a SAM file instead\n\n";
-      }
-  }
-  else {
-    open (IN,$filename) or die "Can't open file $filename: $!\n";
-  }
-
-  ### Vanilla and SAM output need to read different numbers of header lines
-  if ($vanilla) {
-    my $bismark_version = <IN>; ## discarding the Bismark version info
-    chomp $bismark_version;
-    $bismark_version =~ s/\r//; # replaces \r line feed
-    $bismark_version =~  s/Bismark version: //;
-    if ($bismark_version =~ /^\@/) {
-      warn "Detected \@ as the first character of the version information. Is it possible that the file is in SAM format?\n\n";
-      sleep (1);
-    }
-
-    unless ($version eq $bismark_version){
-      die "The methylation extractor and Bismark itself need to be of the same version!\n\nVersions used:\nmethylation extractor: '$version'\nBismark: '$bismark_version'\n";
-    }
-  } else {
-    # If the read is in SAM format (default) it can either start with @ header lines or start with alignments directly.
-    # We are reading from it further down
-  }
-
-  my $methylation_call_strings_processed = 0;
-  my $line_count = 0;
-
-  ### proceeding differently now for single-end or paired-end Bismark files
-
-  ### PROCESSING SINGLE-END RESULT FILES
-  if ($single) {
-
-    ### also proceeding differently now for SAM format or vanilla Bismark format files
-    if ($vanilla) {		# old vanilla Bismark output format
-      while (<IN>) {
-	++$line_count;
-	warn "Processed lines: $line_count\n" if ($line_count%500000==0);
-
-	if ( ($line_count - $offset)%$multicore == 0){
-	  # warn "line count: $line_count\noffset: $offset\n";
-	  # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-	  # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-	}
-	else{
-	  # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-	  next;
-	}
-	
-	### $seq here is the chromosomal sequence (to use for the repeat analysis for example)
-	my ($id,$strand,$chrom,$start,$seq,$meth_call,$read_conversion,$genome_conversion) = (split("\t"))[0,1,2,3,6,7,8,9];
-	
-	### we need to remove 2 bp of the genomic sequence as we were extracting read + 2bp long fragments to make a methylation call at the first or
-	### last position
-	chomp $genome_conversion;
-
-	my $index;
-	if ($meth_call) {
-
-	  if ($read_conversion eq 'CT' and $genome_conversion eq 'CT') { ## original top strand
-	    $index = 0;
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT') { ## complementary to original top strand
-	    $index = 1;
-	  } elsif ($read_conversion eq 'CT' and $genome_conversion eq 'GA') { ## original bottom strand
-	    $index = 3;
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA') { ## complementary to original bottom strand
-	    $index = 2;
-	  } else {
-	    die "Unexpected combination of read and genome conversion: '$read_conversion' / '$genome_conversion'\n";
-	  }
-	
-	  ### Clipping off the first <int> number of bases from the methylation call string as specified with --ignore <int>
-	  if ($ignore) {
-	    $meth_call = substr($meth_call,$ignore,length($meth_call)-$ignore);	
-	
-	    ### If we are clipping off some bases at the start we need to adjust the start position of the alignments accordingly!
-	    if ($strand eq '+') {
-	      $start += $ignore;
-	    }
-	    elsif ($strand eq '-') {
-	      $start += length($meth_call)-1; ## $meth_call is already shortened!
-	    }
-	    else {
-	      die "Alignment did not have proper strand information: $strand\n";
-	    }
-	  }
-	
-	  ### Clipping off the last <int> number of bases from the methylation call string as specified with --ignore_3prime <int>
-	  if ($ignore_3prime) {
-	
-	    $meth_call = substr($meth_call,0, (length($meth_call)) - $ignore_3prime);	
-	
-	    ### If we are clipping off some bases at the end we need to adjust the end position of the alignments accordingly
-	    if ($strand eq '+') {
-	      # clipping the 3' end does not affect the starting position # ignore 5' has already been taken care of, if relevant at all
-	    }
-	    elsif ($strand eq '-') {
-	      # here we need to discriminate if the start has been adjusted because of --ignore or not
-	      if ($ignore){
-		# position adjusted already, and because of this 3' trimming is irrelevant for the start position
-	      }
-	      else{
-		# Here we need to add the length ignore_3prime to the read starting position, adjustment of the start position will take place later in the methylation extraction step
-		$start += $ignore_3prime;
-	      }
-	    }
-	    else {
-	      die "Alignment did not have proper strand information: $strand\n";
-	    }
-	  }
-	  ### just as a comment, if --ignore has not been specified the starting position of reverse reads is adjusted later at the methylation extraction stage
-	
-	  ### printing out the methylation state of every C in the read
-	  print_individual_C_methylation_states_single_end($meth_call,$chrom,$start,$id,$strand,$index);
-	
-	  ++$methylation_call_strings_processed; # 1 per single-end result
-	}
-      }
-    } else {		  # processing single-end SAM format (default)
-      while (<IN>) {
-	chomp;
-	### SAM format can either start with header lines (starting with @) or start with alignments directly
-	if (/^\@/) {	     # skipping header lines (starting with @)
-	  warn "skipping SAM header line:\t$_\n" unless ($process_id == 0);
-	  next;
-	}
-
-	++$line_count;
-	#	warn "$line_count\n";
-	warn "Processed lines: $line_count\n" if ($line_count%500000 == 0);
-
-	if ( ($line_count - $offset)%$multicore == 0){
-	  # warn "line count: $line_count\noffset: $offset\n";
-	  # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-	  # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-	}
-	else{
-	  # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-	  next;
-	}
-	
-	# example read in SAM format
-	# 1_R1/1	67	5	103172224	255	40M	=	103172417	233	AATATTTTTTTTATTTTAAAATGTGTATTGATTTAAATTT	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	NM:i:4	XX:Z:4T1T24TT7	XM:Z:....h.h........................hh.......	XR:Z:CT	XG:Z:CT
-	###
-
-	# < 0.7.6 my ($id,$chrom,$start,$meth_call,$read_conversion,$genome_conversion) = (split("\t"))[0,2,3,13,14,15];
-	# < 0.7.6 $meth_call =~ s/^XM:Z://;
-	# < 0.7.6 $read_conversion =~ s/^XR:Z://;
-	# < 0.7.6 $genome_conversion =~ s/^XG:Z://;	
-
-	my ($id,$chrom,$start,$cigar) = (split("\t"))[0,2,3,5];
-
-	### detecting the following SAM flags in case the SAM entry was shuffled by CRAM or Goby compression/decompression
-	my $meth_call;	  ### Thanks to Zachary Zeno for this solution
-	my $read_conversion;
-	my $genome_conversion;
-	
-	while ( /(XM|XR|XG):Z:([^\t]+)/g ) {
-	  my $tag = $1;
-	  my $value = $2;
-
-	  if ($tag eq "XM") {
-	    $meth_call = $value;
-	    $meth_call =~ s/\r//;
-	  } elsif ($tag eq "XR") {
-	    $read_conversion = $value;
-	    $read_conversion =~ s/\r//;
-	  } elsif ($tag eq "XG") {
-	    $genome_conversion = $value;
-	    $genome_conversion =~ s/\r//;
-	  }
-	}
-
-	my $strand;
-	# warn "$meth_call\n$read_conversion\n$genome_conversion\n";
-	
-	my $index;
-	if ($meth_call) {
-	  if ($read_conversion eq 'CT' and $genome_conversion eq 'CT') { ## original top strand
-	    $index = 0;
-	    $strand = '+';
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT') { ## complementary to original top strand
-	    $index = 1;
-	    $strand = '-';
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA') { ## complementary to original bottom strand
-	    $index = 2;
-	    $strand = '+';
-	  } elsif ($read_conversion eq 'CT' and $genome_conversion eq 'GA') { ## original bottom strand
-	    $index = 3;
-	    $strand = '-';
-	  } else {
-	    die "Unexpected combination of read and genome conversion: '$read_conversion' / '$genome_conversion'\n";
-	  }
-	
-	  ### If the read is in SAM format we need to reverse the methylation call if the read has been reverse-complemented for the output
-	  if ($strand eq '-') {
-	    $meth_call = reverse $meth_call;
-	  }
-	  # warn "\n$meth_call\n";
-	
-	  ### IGNORE 5 PRIME: Clipping off the first <int> number of bases from the methylation call string as specified with --ignore <int>
-	  if ($ignore) {
-	    # warn "\n\n$meth_call\n";
-	    $meth_call = substr($meth_call,$ignore,length($meth_call)-$ignore);	
-	    # warn "$meth_call\n";sleep(1);
-
-	    ### If we are ignoring a part of the sequence we also need to adjust the cigar string accordingly
-
-	    my @len = split (/\D+/,$cigar); # storing the length per operation
-	    my @ops = split (/\d+/,$cigar); # storing the operation
-	    shift @ops;		# remove the empty first element
-	    die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-		
-	    my @comp_cigar; # building an array with all CIGAR operations
-	    foreach my $index (0..$#len) {
-	      foreach (1..$len[$index]) {
-		# print  "$ops[$index]";
-		push @comp_cigar, $ops[$index];
-	      }
-	    }
-	    # print "original CIGAR: $cigar\n";
-	    # print "original CIGAR: @comp_cigar\n";
-
-	    ### If we are clipping off some bases at the start we need to adjust the start position of the alignments accordingly!
-	    if ($strand eq '+') {
-	
-	      my $D_count = 0; # counting all deletions that affect the ignored genomic position, i.e. Deletions and insertions
-	      my $I_count = 0;
-
-	      for (1..$ignore) {
-		my $op = shift @comp_cigar; # adjusting composite CIGAR string by removing $ignore operations from the start
-		# print "$_ deleted $op\n";
-
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $D_count++;
-		  $op = shift @comp_cigar;
-		  # print "$_ deleted $op\n";
-		}
-		if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		  $I_count++;
-		}
-	      }
-	      $start += $ignore + $D_count - $I_count;
-	      # print "start $start\t ignore: $ignore\t D count: $D_count I_count: $I_count\n";
-	    }
-	    elsif ($strand eq '-') {
-
-	      for (1..$ignore) {
-		my $op = pop @comp_cigar; # adjusting composite CIGAR string by removing $ignore operations, here the last value of the array
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $op = pop @comp_cigar;
-		}
-	      }
-
-	      ### For reverse strand alignments we need to determine the number of matching bases (M) or deletions (D) in the read from the CIGAR
-	      ### string to be able to work out the starting position of the read which is on the 3' end of the sequence
-	      my $MD_count = 0;	# counting all operations that affect the genomic position, i.e. M and D. Insertions do not affect the start position
-	      foreach (@comp_cigar) {
-		++$MD_count if ($_ eq 'M' or $_ eq 'D');
-	      }
-	      $start += $MD_count - 1;
-	    }
-	
-	    ### reconstituting shortened CIGAR string
-	    my $new_cigar;
-	    my $count = 0;
-	    my $last_op;
-	    # print "ignore adjusted: @comp_cigar\n";
-	    foreach my $op (@comp_cigar) {
-	      unless (defined $last_op){
-		$last_op = $op;
-		++$count;
-		next;
-	      }
-	      if ($last_op eq $op) {
-		++$count;
-	      } else {
-		$new_cigar .= "$count$last_op";
-		$last_op = $op;
-		$count = 1;
-	      }
-	    }
-	    $new_cigar .= "$count$last_op"; # appending the last operation and count
-	    $cigar = $new_cigar;
-	    # print "ignore adjusted scalar: $cigar\n";
-	  }
-
-	  #######################
-	  ###  INGORE 3' END  ###
-	  #######################
-	
-	  # Clipping off the last <int> number of bases from the methylation call string as specified with --ignore_3prime <int>
-	  if ($ignore_3prime) {
-	    # warn "$meth_call\n";
-	    $meth_call = substr($meth_call,0, (length($meth_call)) - $ignore_3prime);	
-	    # warn "$meth_call\n";sleep(1);
-	
-	    ### If we are ignoring a part of the sequence we also need to adjust the cigar string accordingly
-
-	    my @len = split (/\D+/,$cigar); # storing the length per operation
-	    my @ops = split (/\d+/,$cigar); # storing the operation
-	    shift @ops;		# remove the empty first element
-	    die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-		
-	    my @comp_cigar; # building an array with all CIGAR operations
-	    foreach my $index (0..$#len) {
-	      foreach (1..$len[$index]) {
-		# print  "$ops[$index]";
-		push @comp_cigar, $ops[$index];
-	      }
-	    }
-
-	    # print "original CIGAR: $cigar\n";
-	    # print join ("",@comp_cigar),"\n";
-
-	    ### If we are clipping off some bases at the end we might have to adjust the start position of the alignments accordingly
-	    if ($strand eq '+') {
-
-	      ### clipping the 3' end does not affect the starting position of forward strand alignments
-	      # ignore 5' has already been taken care of at this stage, if relevant at all
-	
-	      for (1..$ignore_3prime) {
-		my $op = pop @comp_cigar; # adjusting composite CIGAR string by removing $ignore_3prime operations from the end
-		# print join ("",@comp_cigar),"\n";
-		# print "$_ deleted $op from 3' end\n";
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $op = pop @comp_cigar;
-		  # print join ("",@comp_cigar),"\n";
-		  # print "$_ deleted $op from 3' end\n";
-		}
-	      }
-	      # print "Final truncated CIGAR string:\n";
-	      # print join ("",@comp_cigar),"\n";
-	      # $start += $ignore + $D_count - $I_count;
-	      # print "start $start\t ignore_3prime: $ignore_3prime\t D count: $D_count I_count: $I_count\n";
-	    }
-	    elsif ($strand eq '-') {
-
-	      my $D_count = 0; # counting all deletions that affect the ignored genomic position, i.e. Deletions and insertions
-	      my $I_count = 0;
-	
-	      for (1..$ignore_3prime) {
-		my $op = shift @comp_cigar; # adjusting composite CIGAR string by removing $ignore_3prime operations, here the first value of the array
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $D_count++;
-		  $op = shift @comp_cigar;
-		}
-		if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		  $I_count++;
-		}
-	
-	      }
-	
-	      # here we need to discriminate if the start has been adjusted because of --ignore or not
-	      if ($ignore){
-		# the start position has already been modified for --ignore already, so we don't have to adjust the position again now
-	      }
-	      else{
-		# Here we need to add the length ignore_3prime to the read starting position
-		#  adjustment of the true starting position of this reverse read will take place later in the methylation extraction step
-		$start += $ignore_3prime + $D_count - $I_count;
-	      }
-	
-	    }
-	
-	    ### reconstituting shortened CIGAR string
-	    my $new_cigar;
-	    my $count = 0;
-	    my $last_op;
-	    # print "ignore_3prime adjusted:\n"; print join ("",@comp_cigar),"\n";
-	    foreach my $op (@comp_cigar) {
-	      unless (defined $last_op){
-		$last_op = $op;
-		++$count;
-		next;
-	      }
-	      if ($last_op eq $op) {
-		++$count;
-	      } else {
-		$new_cigar .= "$count$last_op";
-		$last_op = $op;
-		$count = 1;
-	      }
-	    }
-	    $new_cigar .= "$count$last_op"; # appending the last operation and count
-	    $cigar = $new_cigar;
-	    # print "ignore_3prime adjusted scalar: $cigar\n";
-	  }
-	}
-	### printing out the methylation state of every C in the read
-	print_individual_C_methylation_states_single_end($meth_call,$chrom,$start,$id,$strand,$index,$cigar);
-	
-	++$methylation_call_strings_processed; # 1 per single-end result
-      }
-    }
-  }
-
-  ### PROCESSING PAIRED-END RESULT FILES
-  elsif ($paired) {
-
-    ### proceeding differently now for SAM format or vanilla Bismark format files
-    if ($vanilla) {	# old vanilla Bismark paired-end output format
-      while (<IN>) {
-	++$line_count;
-	warn "processed line: $line_count\n" if ($line_count%500000 == 0);
-
-	if ( ($line_count - $offset)%$multicore == 0){
-	  # warn "line count: $line_count\noffset: $offset\n";
-	  # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-	  # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-	}
-	else{
-	  # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-	  next;
-	}
-
-	### $seq here is the chromosomal sequence (to use for the repeat analysis for example)
-	my ($id,$strand,$chrom,$start_read_1,$end_read_2,$seq_1,$meth_call_1,$seq_2,$meth_call_2,$first_read_conversion,$genome_conversion) = (split("\t"))[0,1,2,3,4,6,7,9,10,11,12,13];
-
-	my $index;
-	chomp $genome_conversion;
-	
-	if ($first_read_conversion eq 'CT' and $genome_conversion eq 'CT') {
-	  $index = 0;		## this is OT
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'GA') {
-	  $index = 2;		## this is CTOB!!!
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'CT') {
-	  $index = 1;		## this is CTOT!!!
-	} elsif ($first_read_conversion eq 'CT' and $genome_conversion eq 'GA') {
-	  $index = 3;		## this is OB
-	} else {
-	  die "Unexpected combination of read and genome conversion: $first_read_conversion / $genome_conversion\n";
-	}
-	
-	if ($meth_call_1 and $meth_call_2) {
-	  ### Clipping off the first <int> number of bases from the methylation call strings as specified with '--ignore <int>'
-
-	  ### IGNORE FROM 5' END
-	  if ($ignore) {
-	    $meth_call_1 = substr($meth_call_1,$ignore,length($meth_call_1)-$ignore);
-	
-	    ### we also need to adjust the start and end positions of the alignments accordingly if '--ignore' was specified
-	    $start_read_1 += $ignore;
-	  }
-	  if ($ignore_r2) {
-	    $meth_call_2 = substr($meth_call_2,$ignore_r2,length($meth_call_2)-$ignore_r2);
-	
-	    ### we also need to adjust the start and end positions of the alignments accordingly if '--ignore_r2' was specified
-	    $end_read_2   -= $ignore_r2;
-	  }
-
-	  ### IGNORE 3' END
-
-	  ### Clipping off the last <int> number of bases from the methylation call string of Read 1 as specified with --ignore_3prime <int>
-	  if ($ignore_3prime) {
-	    $meth_call_1 = substr($meth_call_1,0, length($meth_call_1) - $ignore_3prime);
-	    # we don't have to adjust the position now since the shortened methylation call will be fine, see below
-	  }
-	  ### Clipping off the last <int> number of bases from the methylation call string of Read 2 as specified with --ignore_3prime_r2 <int>
-	  if ($ignore_3prime_r2) {
-	    $meth_call_2 = substr($meth_call_2,0, length($meth_call_2) - $ignore_3prime_r2);
-	    # we don't have to adjust the position now since the shortened methylation call will be fine, see below
-	  }
-
-	  my $end_read_1;
-	  my $start_read_2;
-
-	  if ($strand eq '+') {
-
-	    $end_read_1 = $start_read_1 + length($meth_call_1) - 1;
-	    $start_read_2 = $end_read_2 - length($meth_call_2) + 1;
-	
-	    ## we first pass the first read which is in + orientation on the forward strand
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$start_read_1,$id,'+',$index,0,0,undef,1); # the last two values are CIGAR string and read identity
-	
-	    # we next pass the second read which is in - orientation on the reverse strand
-	    ### if --no_overlap was specified we also pass the end of read 1. If read 2 starts to overlap with read 1 we can stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$end_read_2,$id,'-',$index,$no_overlap,$end_read_1,undef,2);
-	  }
-	  else {
-	
-	    $end_read_1 = $start_read_1+length($meth_call_2)-1;	# read 1 is the second reported read!
-	    $start_read_2 = $end_read_2-length($meth_call_1)+1;	# read 2 is the first reported read!
-
-	    ## we first pass the first read which is in - orientation on the reverse strand
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$end_read_2,$id,'-',$index,0,0,undef,1);
-
-	    # we next pass the second read which is in + orientation on the forward strand
-	    ### if --no_overlap was specified we also pass the end of read 2. If read 2 starts to overlap with read 1 we will stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$start_read_1,$id,'+',$index,$no_overlap,$start_read_2,undef,2);
-	  }
-	
-	  $methylation_call_strings_processed += 2; # paired-end = 2 methylation calls
-	}	
-      }
-    }
-    else {	      # Bismark paired-end BAM/SAM output format (default)
-      while (<IN>) {
-	chomp;
-	### SAM format can either start with header lines (starting with @) or start with alignments directly
-	if (/^\@/) {	     # skipping header lines (starting with @)
-	  warn "skipping SAM header line:\t$_\n" unless ($process_id == 0); # no additional warnings for child procesess
-	  next;
-	}
-	
-	++$line_count;
-	warn "Processed lines: $line_count\n" if ($line_count%500000==0);
-	
-	if ( ($line_count - $offset)%$multicore == 0){
-	  # warn "line count: $line_count\noffset: $offset\n";
-	  # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-	  # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-	}
-	else{
-	  # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-	  $_ = <IN>; # reading and skipping another line since this is the paired-end read
-	  next;
-	}
-
-	# example paired-end reads in SAM format (2 consecutive lines)
-	# 1_R1/1	67	5	103172224	255	40M	=	103172417	233	AATATTTTTTTTATTTTAAAATGTGTATTGATTTAAATTT	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	NM:i:4	XX:Z:4T1T24TT7	XM:Z:....h.h........................hh.......	XR:Z:CT	XG:Z:CT
-	# 1_R1/2	131	5	103172417	255	40M	=	103172224	-233	TATTTTTTTTTAGAGTATTTTTTAATGGTTATTAGATTTT	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	NM:i:6	XX:Z:T5T1T9T9T7T3	XM:Z:h.....h.h.........h.........h.......h...	XR:Z:GA	XG:Z:CT
-	
-	my ($id_1,$chrom,$start_read_1,$cigar_1) = (split("\t"))[0,2,3,5]; ### detecting the following SAM flags in case the SAM entry was shuffled by CRAM or Goby compression/decompression
-	my $meth_call_1;
-	my $first_read_conversion;
-	my $genome_conversion;
-	
-	while ( /(XM|XR|XG):Z:([^\t]+)/g ) {
-	  my $tag = $1;
-	  my $value = $2;
-
-	  if ($tag eq "XM") {
-	    $meth_call_1 = $value;
-	    $meth_call_1 =~ s/\r//;
-	  } elsif ($tag eq "XR") {
-	    $first_read_conversion = $value;
-	    $first_read_conversion =~ s/\r//;
-	  } elsif ($tag eq "XG") {
-	    $genome_conversion = $value;
-	    $genome_conversion =~ s/\r//;
-	  }
-	}
-
-	$_ = <IN>;		# reading in the paired read
-	chomp;
-	
-	my ($id_2,$start_read_2,$cigar_2) = (split("\t"))[0,3,5]; ### detecting the following SAM flags in case the SAM entry was shuffled by CRAM or Goby compression/decompression
-
-	my $meth_call_2;
-	my $second_read_conversion;
-	
-	while ( /(XM|XR):Z:([^\t]+)/g ) {
-	  my $tag = $1;
-	  my $value = $2;
-
-	  if ($tag eq "XM") {
-	    $meth_call_2 = $value;
-	    $meth_call_2 =~ s/\r//;
-	  } elsif ($tag eq "XR") {
-	    $second_read_conversion = $value;
-	    $second_read_conversion = s/\r//;
-	  }
-	}
-	
-	# < version 0.7.6 $genome_conversion =~ s/^XG:Z://;	
-	# chomp $genome_conversion; # in case it captured a new line character	# already removed
-
-	# print join ("\t",$meth_call_1,$meth_call_2,$first_read_conversion,$second_read_conversion,$genome_conversion),"\n";
-
-	my $index;
-	my $strand;
-
-	if ($first_read_conversion eq 'CT' and $genome_conversion eq 'CT') {
-	  $index = 0;		## this is OT
-	  $strand = '+';
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'CT') {
-	  $index = 1;		## this is CTOT
-	  $strand = '-';
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'GA') {
-	  $index = 2;		## this is CTOB
-	  $strand = '+';
-	} elsif ($first_read_conversion eq 'CT' and $genome_conversion eq 'GA') {
-	  $index = 3;		## this is OB
-	  $strand = '-';
-	} else {
-	  die "Unexpected combination of read and genome conversion: $first_read_conversion / $genome_conversion\n";
-	}
-
-	### reversing the methylation call of the read that was reverse-complemented
-	if ($strand eq '+') {
-	  $meth_call_2 = reverse $meth_call_2;
-	} else {
-	  $meth_call_1 = reverse $meth_call_1;
-	}
-	# warn "\n$meth_call_1\n$meth_call_2\n";
-
-	if ($meth_call_1 and $meth_call_2) {
-
-	  my $end_read_1;
-	
-	  ### READ 1
-	  my @len_1 = split (/\D+/,$cigar_1); # storing the length per operation
-	  my @ops_1 = split (/\d+/,$cigar_1); # storing the operation
-	  shift @ops_1;		# remove the empty first element
-
-	  die "CIGAR string contained a non-matching number of lengths and operations: $cigar_1\n".join(" ",@len_1)."\n".join(" ",@ops_1)."\n" unless (scalar @len_1 == scalar @ops_1);
-	
-	  my @comp_cigar_1; # building an array with all CIGAR operations
-	  foreach my $index (0..$#len_1) {
-	    foreach (1..$len_1[$index]) {
-	      # print  "$ops_1[$index]";
-	      push @comp_cigar_1, $ops_1[$index];
-	    }
-	  }
-	  # print "original CIGAR read 1: $cigar_1\n";
-	  # print "original CIGAR read 1: @comp_cigar_1\n";
-
-	  ### READ 2
-	  my @len_2 = split (/\D+/,$cigar_2); # storing the length per operation
-	  my @ops_2 = split (/\d+/,$cigar_2); # storing the operation
-	  shift @ops_2;		# remove the empty first element
-	  die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len_2 == scalar @ops_2);
-	  my @comp_cigar_2; # building an array with all CIGAR operations for read 2
-	  foreach my $index (0..$#len_2) {
-	    foreach (1..$len_2[$index]) {
-	      # print  "$ops_2[$index]";
-	      push @comp_cigar_2, $ops_2[$index];
-	    }
-	  }
-	  # print "original CIGAR read 2: $cigar_2\n";
-	  # print "original CIGAR read 2: @comp_cigar_2\n";
-	
-	  ##################################	
-	  ###  IGNORE BASES FROM 5' END  ###
-	  ##################################
-
-	  if ($ignore) {
-	    ### Clipping off the first <int> number of bases from the methylation call string as specified with '--ignore <int>' for read 1	
-	    ### the methylation calls have already been reversed where necessary
-
-	    if ( (length($meth_call_1) - $ignore) <= 0){
-	      # next; # skipping this read entirely if the read is shorter than the portion to be ignored
-	      $meth_call_1 = undef; # will skip this read entirely since the read is shorter than the portion to be ignored
-	    }
-	    else {
-	      $meth_call_1 = substr($meth_call_1,$ignore,length($meth_call_1)-$ignore);
-	
-	      if ($strand eq '+') {
-		
-		### if the (read 1) strand information is '+', read 1 needs to be trimmed from the start
-		my $D_count_1 = 0; # counting all deletions that affect the ignored genomic position for read 1, i.e. Deletions and insertions
-		my $I_count_1 = 0;
-		
-		for (1..$ignore) {
-		  my $op = shift @comp_cigar_1; # adjusting composite CIGAR string of read 1 by removing $ignore operations from the start
-		  # print "$_ deleted $op\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $D_count_1++;
-		    $op = shift @comp_cigar_1;
-		    # print "$_ deleted $op\n";
-		  }
-		  if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		    $I_count_1++;
-		  }
-		}
-		
-		$start_read_1 += $ignore + $D_count_1 - $I_count_1;
-		# print "start read 1 $start_read_1\t ignore: $ignore\t D count 1: $D_count_1\tI_count 1: $I_count_1\n";
-
-		# the start position of reads mapping to the reverse strand is being adjusted further below
-	      }
-	      elsif ($strand eq '-') {
-		
-		### if the (read 1) strand information is '-', read 1 needs to be trimmed from the back
-		for (1..$ignore) {
-		  my $op = pop @comp_cigar_1; # adjusting composite CIGAR string by removing $ignore operations, here the last value of the array
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $op = pop @comp_cigar_1;
-		  }
-		}
-		# the start position of reads mapping to the reverse strand is being adjusted further below
-		
-	      }
-	    }
-	  }
-	
-	  if ($ignore_r2) {
-	    ### Clipping off the first <int> number of bases from the methylation call string as specified with '--ignore_r2 <int>' for read 2	
-	    ### the methylation calls have already been reversed where necessary
-
-	    if ( (length($meth_call_2) - $ignore_r2) <= 0){
-	      # next; # skipping this read entirely if the read is shorter than the portion to be ignored # this would skip the entire read pair!
-	      $meth_call_2 = undef; # will skip this read entirely since the read is shorter than the portion to be ignored
-	    }
-	    else {
-	      $meth_call_2 = substr($meth_call_2,$ignore_r2,length($meth_call_2)-$ignore_r2);
-	
-	      ### If we are ignoring a part of the sequence we also need to adjust the cigar string accordingly
-	
-	      if ($strand eq '+') {
-		
-		### if the (read 1) strand information is '+', read 2 needs to be trimmed from the back
-
-		for (1..$ignore_r2) {
-		  my $op = pop @comp_cigar_2; # adjusting composite CIGAR string by removing $ignore operations, here the last value of the array
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $op = pop @comp_cigar_2;
-		  }
-		}
-		# the start position of reads mapping to the reverse strand is being adjusted further below
-	      }
-	      elsif ($strand eq '-') {
-	
-		### if the (read 1) strand information is '-', read 2 needs to be trimmed from the start
-		my $D_count_2 = 0; # counting all deletions that affect the ignored genomic position for read 2, i.e. Deletions and insertions
-		my $I_count_2 = 0;
-
-		for (1..$ignore_r2) {
-		  my $op = shift @comp_cigar_2; # adjusting composite CIGAR string of read 2 by removing $ignore operations from the start
-		  # print "$_ deleted $op\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $D_count_2++;
-		    $op = shift @comp_cigar_2;
-		    # print "$_ deleted $op\n";
-		  }
-		  if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		    $I_count_2++;
-		  }
-		}
-		
-		$start_read_2 += $ignore_r2 + $D_count_2 - $I_count_2;
-		# print "start read 2 $start_read_2\t ignore R2: $ignore_r2\t D count 2: $D_count_2\tI_count 2: $I_count_2\n";
-	      }
-	    }
-	  }
-	
-	  if ($ignore and $meth_call_1){ # if the methylation call string is undefined at this position we don't need any new CIGAR string
-	
-	    ### reconstituting shortened CIGAR string 1
-	    my $new_cigar_1;
-	    my $count_1 = 0;
-	    my $last_op_1;
-	    # print "ignore adjusted CIGAR 1: @comp_cigar_1\n";
-	    foreach my $op (@comp_cigar_1) {
-	      unless (defined $last_op_1){
-		$last_op_1 = $op;
-		++$count_1;
-		next;
-	      }
-	      if ($last_op_1 eq $op) {
-		++$count_1;
-	      } else {
-		$new_cigar_1 .= "$count_1$last_op_1";
-		$last_op_1 = $op;
-		$count_1 = 1;
-	      }
-	    }
-	    $new_cigar_1 .= "$count_1$last_op_1"; # appending the last operation and count
-	    $cigar_1 = $new_cigar_1;
-	    # print "ignore adjusted CIGAR 1 scalar: $cigar_1\n";
-	  }
-
-	  if ($ignore_r2 and $meth_call_2){ # if the methylation call string is undefined at this point we don't need any new CIGAR string
-
-	    ### reconstituting shortened CIGAR string 2
-	    my $new_cigar_2;
-	    my $count_2 = 0;
-	    my $last_op_2;
-	    # print "ignore adjusted CIGAR 2: @comp_cigar_2\n";
-	    foreach my $op (@comp_cigar_2) {
-	      unless (defined $last_op_2){
-		$last_op_2 = $op;
-		++$count_2;
-		next;
-	      }
-	      if ($last_op_2 eq $op) {
-		++$count_2;
-	      }
-	      else {
-		$new_cigar_2 .= "$count_2$last_op_2";
-		$last_op_2 = $op;
-		$count_2 = 1;
-	      }
-	    }
-	    $new_cigar_2 .= "$count_2$last_op_2"; # appending the last operation and count
-	    $cigar_2 = $new_cigar_2;
-	    # print "ignore_r2 adjusted CIGAR 2 scalar: $cigar_2\n";
-	  }
-
-	  ###########################
-	  ###  END IGNORE 5' END  ###
-	  ###########################
-
-	  ##################################
-	  ###  IGNORE BASES FROM 3' END  ###
-	  ##################################
-
-	  # print "CIGAR string before truncating 3' end (Read 1)\n";
-	  # print join ("",@comp_cigar_1),"\n";
-		
-	  if ($ignore_3prime and $meth_call_1) { # if the methylation call string is undefined at this point we don't need to process the read any further
-
-	    ### Clipping off the last <int> number of bases from the methylation call string as specified with '--ignore_3prime <int>' for read 1	
-	    ### the methylation calls have already been reversed where necessary
-
-	    if ( (length($meth_call_1) - $ignore_3prime) <= 0){
-	      $meth_call_1 = undef; # will skip this read entirely since the read is shorter than the portion to be ignored
-	    }
-	    else {
-	      $meth_call_1 = substr($meth_call_1,0,length($meth_call_1) - $ignore_3prime);
-	      # warn "truncated meth_call 1:\n$meth_call_1\n";
-	
-	      if ($strand eq '+') {
-
-		### if the (read 1) strand information is '+', clipping the 3' end does not affect the starting position of forward strand alignments
-		# ignore 5' has already been taken care of at this stage, if relevant at all
-		
-		for (1..$ignore_3prime) {
-		  my $op = pop @comp_cigar_1; # adjusting composite CIGAR string of read 1 by removing $ignore_3prime operations from the end
-		  # print "$_ deleted $op from 3' end\n";
-		  # print join ("",@comp_cigar_1),"\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $op = pop @comp_cigar_1;
-		    # print join ("",@comp_cigar_1),"\n";
-		    # print "$_ deleted $op from 3' end\n";
-		  }
-		}
-		
-		# print "Final truncated CIGAR string (Read 1):\n";
-		# print join ("",@comp_cigar_1),"\n";
-		
-	      }
-	      elsif ($strand eq '-') {
-
-		my $D_count_1 = 0; # counting all deletions that affect the ignored genomic position for read 1, i.e. Deletions and insertions
-		my $I_count_1 = 0;
-	
-		### if the (read 1) strand information is '-', the read 1 CIGAR string needs to be trimmed from the start
-		for (1..$ignore_3prime) {
-		  my $op = shift @comp_cigar_1; # adjusting composite CIGAR string by removing $ignore_3prime operations, here the first value of the array
-		  # print join ("",@comp_cigar_1),"\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $D_count_1++;
-		    $op = shift @comp_cigar_1;
-		    # print join ("",@comp_cigar_1),"\n";
-		  }
-
-		  if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		    $I_count_1++;
-		  }
-		}
-
-		# print "Final truncated CIGAR string reverse_read:\n";
-		# print join ("",@comp_cigar_1),"\n";
-		
-		# Here we need to add the length ignore_3prime to the read starting position
-		# adjustment of the true start position of this reverse read will take place later in the methylation extraction step
-		$start_read_1 += $ignore_3prime + $D_count_1 - $I_count_1;
-		
-	      }
-	    }
-	  }
-	
-	  if ($ignore_3prime_r2 and $meth_call_2) { # if the methylation call string is undefined at this point we don't need to process the read any further
-	
-	    ### Clipping off the last <int> number of bases from the methylation call string as specified with '--ignore_3prime_r2 <int>' for read 2	
-	    ### the methylation calls have already been reversed where necessary
-
-	    if ( (length($meth_call_2) - $ignore_3prime_r2) <= 0){
-	      $meth_call_2 = undef; # will skip this read entirely since the read is shorter than the portion to be ignored
-	    }
-	    else {
-	      $meth_call_2 = substr($meth_call_2,0,length($meth_call_2) - $ignore_3prime_r2);
-	      # warn "truncated meth_call 2:\n$meth_call_2\n";
-	
-	      ### If we are ignoring a part of the sequence we also need to adjust the cigar string and the positions accordingly
-	
-	      if ($strand eq '+') {
-		
-		### if the (read 1) strand information is '+', clipping the 3' end of read 2 does potentially affect the starting position of read 2 (reverse strand alignment)
-		### if the (read 1) strand information is '+', read 2 needs to be trimmed from the start
-		
-		my $D_count_2 = 0; # counting all deletions that affect the ignored genomic position for read 2, i.e. Deletions and insertions
-		my $I_count_2 = 0;
-		
-		for (1..$ignore_3prime_r2) {
-		  my $op = shift @comp_cigar_2; # adjusting composite CIGAR string by removing $ignore operations, here the first value of the array
-		  # print "$_ deleted $op from 3' end\n";
-		  # print join ("",@comp_cigar_2),"\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $D_count_2++;
-		    $op = shift @comp_cigar_2;
-		    # print "$_ deleted $op from 3' end\n";
-		    # print join ("",@comp_cigar_2),"\n";
-		  }
-
-		  if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		    $I_count_2++;
-		  }
-		}
-		
-		# print "Final truncated CIGAR string 2 (+ alignment):\n";
-		# print join ("",@comp_cigar_2),"\n";
-		
-		# Here we need to add the length ignore_3prime_r2 to the read starting position
-		# adjustment of the true start position of this reverse read will take place later in the methylation extraction step
-		$start_read_2 += $ignore_3prime_r2 + $D_count_2 - $I_count_2;
-		
-		# print "start read 2 $start_read_2\t ignore R2: $ignore_r2\t D count 2: $D_count_2\tI_count 2: $I_count_2\n";
-	      }
-	      elsif ($strand eq '-') {
-		### if the (read 1) strand information is '-', clipping the 3' end of read 2 does not affect its starting position (forward strand alignment)
-		### ignore_r2 5' has already been taken care of at this stage, if relevant at all
-		
-		### if the (read 1) strand information is '-', read 2 needs to be trimmed from the end
-		
-		for (1..$ignore_3prime_r2) {
-		  my $op = pop @comp_cigar_2; # adjusting composite CIGAR string of read 2 by removing $ignore operations from the start
-		  # print "$_ deleted $op\n";
-		  # print join ("",@comp_cigar_2),"\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $op = pop @comp_cigar_2;
-		    # print "$_ deleted $op\n";
-		    # print join ("",@comp_cigar_2),"\n";
-		  }
-		}
-		
-		# print "Final truncated CIGAR string 2 (- alignment):\n";
-		# print join ("",@comp_cigar_2),"\n";
-		
-	      }
-	    }
-	  }
-	
-	  if ($ignore_3prime and $meth_call_1){ # if the methylation call string is undefined at this point we don't need any new CIGAR string
-	
-	    ### reconstituting shortened CIGAR string 1
-	    my $new_cigar_1;
-	    my $count_1 = 0;
-	    my $last_op_1;
-	    # print "ignore_3prime adjusted CIGAR 1: @comp_cigar_1\n";
-	    foreach my $op (@comp_cigar_1) {
-	      unless (defined $last_op_1){
-		$last_op_1 = $op;
-		++$count_1;
-		next;
-	      }
-	      if ($last_op_1 eq $op) {
-		++$count_1;
-	      }
-	      else {
-		$new_cigar_1 .= "$count_1$last_op_1";
-		$last_op_1 = $op;
-		$count_1 = 1;
-	      }
-	    }
-	    $new_cigar_1 .= "$count_1$last_op_1"; # appending the last operation and count
-	    $cigar_1 = $new_cigar_1;
-	    # warn "ignore_3prime adjusted CIGAR 1 scalar: $cigar_1\n";
-	  }
-
-	  if ($ignore_3prime_r2 and $meth_call_2){ # if the methylation call string is undefined at this point we don't need any new CIGAR string
-
-	    ### reconstituting shortened CIGAR string 2
-	    my $new_cigar_2;
-	    my $count_2 = 0;
-	    my $last_op_2;
-	    # print "ignore_3prime_r2 adjusted CIGAR 2: @comp_cigar_2\n";
-	    foreach my $op (@comp_cigar_2) {
-	      unless (defined $last_op_2){
-		$last_op_2 = $op;
-		++$count_2;
-		next;
-	      }
-	      if ($last_op_2 eq $op) {
-		++$count_2;
-	      }
-	      else {
-		$new_cigar_2 .= "$count_2$last_op_2";
-		$last_op_2 = $op;
-		$count_2 = 1;
-	      }
-	    }
-	    $new_cigar_2 .= "$count_2$last_op_2"; # appending the last operation and count
-	    $cigar_2 = $new_cigar_2;
-	    # warn "ignore_3prime_r2 adjusted CIGAR 2 scalar: $cigar_2\n";
-	  }
-
-	  ###########################
-	  ###  END IGNORE 3' END  ###
-	  ###########################
-
-
-	  ### Adjusting CIGAR string and starting position of reads in reverse orientation which we will pass to the extraction subroutine later on
-	
-	  if ($strand eq '+') {
-	    ### adjusting the start position for all reads mapping to the reverse strand, in this case read 2
-	    @comp_cigar_2  = reverse@comp_cigar_2; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-	    # print "reverse: @comp_cigar_2\n";
-	
-	    my $MD_count_1 = 0;
-	    foreach (@comp_cigar_1) {
-	      ++$MD_count_1 if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	    }
-
-	    my $MD_count_2 = 0;
-	    foreach (@comp_cigar_2) {
-	      ++$MD_count_2 if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	    }
-
-	    $end_read_1 = $start_read_1 + $MD_count_1 - 1;
-	    $start_read_2 += $MD_count_2 - 1; ## Passing on the start position on the reverse strand
-	  }
-	  else {
-	    ### adjusting the start position for all reads mapping to the reverse strand, in this case read 1
-	
-	    @comp_cigar_1  = reverse@comp_cigar_1; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-	    # print "reverse: @comp_cigar_1\n";
-
-	    my $MD_count_1 = 0;
-	    foreach (@comp_cigar_1) {
-	      ++$MD_count_1 if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	    }
-
-	    $end_read_1 = $start_read_1;	
-	    $start_read_1 +=  $MD_count_1 - 1; ### Passing on the start position on the reverse strand
-	  }
-
-	  if ($strand eq '+') {
-	    ## we first pass the first read which is in + orientation on the forward strand; the last value is the read identity
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$start_read_1,$id_1,'+',$index,0,0,$cigar_1,1);
-	
-	    # we next pass the second read which is in - orientation on the reverse strand
-	    ### if --no_overlap was specified we also pass the end of read 1. If read 2 starts to overlap with read 1 we can stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$start_read_2,$id_2,'-',$index,$no_overlap,$end_read_1,$cigar_2,2);
-	  }
-	  else {
-	    ## we first pass the first read which is in - orientation on the reverse strand
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$start_read_1,$id_1,'-',$index,0,0,$cigar_1,1);
-	
-	    # we next pass the second read which is in + orientation on the forward strand
-	    ### if --no_overlap was specified we also pass the end of read 1. If read 2 starts to overlap with read 1 we will stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$start_read_2,$id_2,'+',$index,$no_overlap,$end_read_1,$cigar_2,2);
-	  }
-	
-	  $methylation_call_strings_processed += 2; # paired-end = 2 methylation call strings
-	}	
-      }
-    }
-  } else {
-    die "Single-end or paired-end reads not specified properly\n";
-  }
-
-  $counting{sequences_count}          = $line_count;
-  $counting{methylation_call_strings} = $methylation_call_strings_processed;
-
-  if ($multicore == 1){
-    print_splitting_report ();
-  }
-  elsif ($multicore > 1){
-    print_splitting_report_multicore($report_filename,$offset,$line_count,$methylation_call_strings_processed);
-    print_mbias_report_multicore($report_filename,$offset,$line_count,$methylation_call_strings_processed);
-  }
-
-  return ($process_id,\@pids,$report_filename);
-
-}
-
-
-
-sub print_splitting_report{
-
-  ### Calculating methylation percentages if applicable
-  warn "\nProcessed $counting{sequences_count} lines in total\n";
-  warn "Total number of methylation call strings processed: $counting{methylation_call_strings}\n\n";
-  if ($report) {
-    print REPORT "\nProcessed $counting{sequences_count} lines in total\n";
-    print REPORT "Total number of methylation call strings processed: $counting{methylation_call_strings}\n\n";
-  }
-
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_non_CpG_methylation;
-  if ($merge_non_CpG){
-    if ( ($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}+$counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-      $percent_non_CpG_methylation = sprintf("%.1f",100* ( $counting{total_meCHH_count}+$counting{total_meCHG_count} ) / ( $counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}+$counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count} ) );
-    }
-  }
-
-  if ($report){
-    ### detailed information about Cs analysed
-    print REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-    my $total_number_of_C = $counting{total_meCHG_count}+$counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-    print REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-    print REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-    print REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-    print REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n\n";
-
-    print REPORT "Total C to T conversions in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-    print REPORT "Total C to T conversions in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-    print REPORT "Total C to T conversions in CHH context:\t$counting{total_unmethylated_CHH_count}\n\n";
-
-    ### calculating methylated CpG percentage if applicable
-    if ($percent_meCpG){
-      print REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-    }
-    else{
-      print REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    }
-
-    ### 2-Context Output
-    if ($merge_non_CpG){
-      if ($percent_non_CpG_methylation){
-	print REPORT "C methylated in non-CpG context:\t${percent_non_CpG_methylation}%\n\n\n";
-      }
-      else{
-	print REPORT "Can't determine percentage of methylated Cs in non-CpG context if value was 0\n\n\n";
-      }
-    }
-
-    ### 3 Context Output
-    else{
-      ### calculating methylated CHG percentage if applicable
-      if ($percent_meCHG){
-	print REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-      }
-      else{
-	print REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-      }
-
-      ### calculating methylated CHH percentage if applicable
-      if ($percent_meCHH){
-	print REPORT "C methylated in CHH context:\t${percent_meCHH}%\n\n\n";
-      }
-      else{
-	print REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n\n\n";
-      }
-    }
-  }
-
-  ### detailed information about Cs analysed for on-screen report
-  warn "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-  my $total_number_of_C = $counting{total_meCHG_count}+$counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-  warn "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-  warn "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  warn "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  warn"Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n\n";
-
-  warn "Total C to T conversions in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  warn "Total C to T conversions in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  warn"Total C to T conversions in CHH context:\t$counting{total_unmethylated_CHH_count}\n\n";
-
-  ### printing methylated CpG percentage if applicable
-  if ($percent_meCpG){
-    warn "C methylated in CpG context:\t${percent_meCpG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-  }
-
-  ### 2-Context Output
-  if ($merge_non_CpG){
-    if ($percent_non_CpG_methylation){
-      warn "C methylated in non-CpG context:\t${percent_non_CpG_methylation}%\n\n\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in non-CpG context if value was 0\n\n\n";
-    }
-  }
-
-  ### 3-Context Output
-  else{
-    ### printing methylated CHG percentage if applicable
-    if ($percent_meCHG){
-      warn "C methylated in CHG context:\t${percent_meCHG}%\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-    }
-
-    ### printing methylated CHH percentage if applicable
-    if ($percent_meCHH){
-      warn "C methylated in CHH context:\t${percent_meCHH}%\n\n\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in CHH context if value was 0\n\n\n";
-    }
-  }
-}
-
-###
-
-sub print_splitting_report_multicore{
-
-  my ($report_filename,$offset,$line_count,$meth_call_strings) = @_;
-
-  # warn "\$report_filename is $report_filename\n";
-  my $special_report = $report_filename.".$offset";
-
-  open (SPECIAL_REPORT,'>',$special_report) or die $!;
-  # warn "line count\t$line_count\n";
-  # warn "meth call strings\t$meth_call_strings\n";
-
-  print SPECIAL_REPORT "line count\t$line_count\n";
-  print SPECIAL_REPORT "meth call strings\t$meth_call_strings\n";
-
-  ### Calculating methylation percentages if applicable
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_non_CpG_methylation;
-  if ($merge_non_CpG){
-    if ( ($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}+$counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-      $percent_non_CpG_methylation = sprintf("%.1f",100* ( $counting{total_meCHH_count}+$counting{total_meCHG_count} ) / ( $counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}+$counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count} ) );
-    }
-  }
-
-  if ($report){
-
-    ### detailed information about Cs analysed
-    print SPECIAL_REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-    my $total_number_of_C = $counting{total_meCHG_count}+$counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-    print SPECIAL_REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-    print SPECIAL_REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-    print SPECIAL_REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-    print SPECIAL_REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n\n";
-
-    print SPECIAL_REPORT "Total C to T conversions in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-    print SPECIAL_REPORT "Total C to T conversions in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-    print SPECIAL_REPORT "Total C to T conversions in CHH context:\t$counting{total_unmethylated_CHH_count}\n\n";
-
-    ### calculating methylated CpG percentage if applicable
-    if ($percent_meCpG){
-      print SPECIAL_REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-    }
-    else{
-      print SPECIAL_REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    }
-
-    ### 2-Context Output
-    if ($merge_non_CpG){
-      if ($percent_non_CpG_methylation){
-	print SPECIAL_REPORT "C methylated in non-CpG context:\t${percent_non_CpG_methylation}%\n\n\n";
-      }
-      else{
-	print SPECIAL_REPORT "Can't determine percentage of methylated Cs in non-CpG context if value was 0\n\n\n";
-      }
-    }
-
-    ### 3 Context Output
-    else{
-      ### calculating methylated CHG percentage if applicable
-      if ($percent_meCHG){
-	print SPECIAL_REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-      }
-      else{
-	print SPECIAL_REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-      }
-
-      ### calculating methylated CHH percentage if applicable
-      if ($percent_meCHH){
-	print SPECIAL_REPORT "C methylated in CHH context:\t${percent_meCHH}%\n\n\n";
-      }
-      else{
-	print SPECIAL_REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n\n\n";
-      }
-    }
-  }
-  close SPECIAL_REPORT or warn "Failed to close filehandle for individual report $special_report\n";
-}
-
-
-###
-
-### INDIVIDUAL M-BIAS REPORTS
-
-sub print_mbias_report_multicore{
-
-  my ($report_filename,$offset,$line_count,$meth_call_strings) = @_;
-
-  # warn "\$report_filename is $report_filename\n";
-  my $special_mbias_report = $report_filename.".${offset}.mbias";
-
-  open (SPECIAL_MBIAS,'>',$special_mbias_report) or die $!;
-
-  # determining maximum read length
-  my $max_length_1 = 0;
-  my $max_length_2 = 0;
-
-  foreach my $context (keys %mbias_1){
-    foreach my $pos (sort {$a<=>$b} keys %{$mbias_1{$context}}){
-      $max_length_1 = $pos unless ($max_length_1 >= $pos);
-    }
-  }
-  if ($paired){
-    foreach my $context (keys %mbias_2){
-      foreach my $pos (sort {$a<=>$b} keys %{$mbias_2{$context}}){
-	$max_length_2 = $pos unless ($max_length_2 >= $pos);
-      }
-    }
-  }
-
-  if ($single){
-    # warn "Determining maximum read length for M-Bias plot\n";
-    # warn "Maximum read length of Read 1: $max_length_1\n\n";
-  }
-  else{
-    # warn "Determining maximum read lengths for M-Bias plots\n";
-    # warn "Maximum read length of Read 1: $max_length_1\n";
-    # warn "Maximum read length of Read 2: $max_length_2\n\n";
-  }
-
-  foreach my $context (qw(CpG CHG CHH)){
-
-    if ($paired){
-      print SPECIAL_MBIAS "$context context (R1)\n================\n";
-    }
-    else{
-      print SPECIAL_MBIAS "$context context\n===========\n";
-    }
-    print SPECIAL_MBIAS "position\tcount methylated\tcount unmethylated\t% methylation\tcoverage\n";
-
-    foreach my $pos (1..$max_length_1){
-
-      unless (defined $mbias_1{$context}->{$pos}->{meth}){
-	$mbias_1{$context}->{$pos}->{meth} = 0;
-      }
-      unless (defined $mbias_1{$context}->{$pos}->{un}){
-	$mbias_1{$context}->{$pos}->{un} = 0;
-      }
-
-      my $percent = '';
-      if (($mbias_1{$context}->{$pos}->{meth} + $mbias_1{$context}->{$pos}->{un}) > 0){
-	$percent = sprintf("%.2f",$mbias_1{$context}->{$pos}->{meth} * 100/ ( $mbias_1{$context}->{$pos}->{meth} + $mbias_1{$context}->{$pos}->{un}) );
-      }
-      my $coverage = $mbias_1{$context}->{$pos}->{un} + $mbias_1{$context}->{$pos}->{meth};
-
-      print SPECIAL_MBIAS "$pos\t$mbias_1{$context}->{$pos}->{meth}\t$mbias_1{$context}->{$pos}->{un}\t$percent\t$coverage\n";
-    }
-    print SPECIAL_MBIAS "\n";
-  }
-
-  if ($paired){
-
-    foreach my $context (qw(CpG CHG CHH)){
-
-      print SPECIAL_MBIAS "$context context (R2)\n================\n";
-      print SPECIAL_MBIAS "position\tcount methylated\tcount unmethylated\t% methylation\tcoverage\n";
-
-      foreach my $pos (1..$max_length_2){
-	
-	unless (defined $mbias_2{$context}->{$pos}->{meth}){
-	  $mbias_2{$context}->{$pos}->{meth} = 0;
-	}
-	unless (defined $mbias_2{$context}->{$pos}->{un}){
-	  $mbias_2{$context}->{$pos}->{un} = 0;
-	}
-
-	my $percent = '';
-	if (($mbias_2{$context}->{$pos}->{meth} + $mbias_2{$context}->{$pos}->{un}) > 0){
-	  $percent = sprintf("%.2f",$mbias_2{$context}->{$pos}->{meth} * 100/ ($mbias_2{$context}->{$pos}->{meth} + $mbias_2{$context}->{$pos}->{un}) );
-	}
-	my $coverage = $mbias_2{$context}->{$pos}->{un} + $mbias_2{$context}->{$pos}->{meth};
-
-	print SPECIAL_MBIAS "$pos\t$mbias_2{$context}->{$pos}->{meth}\t$mbias_2{$context}->{$pos}->{un}\t$percent\t$coverage\n";
-      }	
-    }
-  }
-
-  close SPECIAL_MBIAS or warn "Failed to close filehandle for individual M-bias report $special_mbias_report\n";
-}
-
-
-###
-
-
-sub print_individual_C_methylation_states_paired_end_files{
-
-  my ($meth_call,$chrom,$start,$id,$strand,$filehandle_index,$no_overlap,$end_read_1,$cigar,$read_identity) = @_;
-
-  unless (defined $meth_call) {
-    return; # skip this read
-  }
-
-  ### we will use the read identity for the M-bias plot to discriminate read 1 and read 2
-  die "Read identity was neither 1 nor 2: $read_identity\n\n" unless ($read_identity == 1 or $read_identity == 2);
-
-  my @methylation_calls = split(//,$meth_call);
-
-  #################################################################
-  ### . for bases not involving cytosines                       ###
-  ### X for methylated C in CHG context (was protected)         ###
-  ### x for not methylated C in CHG context (was converted)     ###
-  ### H for methylated C in CHH context (was protected)         ###
-  ### h for not methylated C in CHH context (was converted)     ###
-  ### Z for methylated C in CpG context (was protected)         ###
-  ### z for not methylated C in CpG context (was converted)     ###
-  ### U for methylated C in Unknown context (was protected)     ###
-  ### u for not methylated C in Unknown context (was converted) ###
-  #################################################################
-
-  my $methyl_CHG_count = 0;
-  my $methyl_CHH_count = 0;
-  my $methyl_CpG_count = 0;
-  my $unmethylated_CHG_count = 0;
-  my $unmethylated_CHH_count = 0;
-  my $unmethylated_CpG_count = 0;
-
-  my $pos_offset = 0; # this is only relevant for SAM reads with insertions or deletions
-  my $cigar_offset = 0; # again, this is only relevant for SAM reads containing indels
-  my @comp_cigar;
-
-  ### Checking whether the CIGAR string is a linear genomic match or whether if requires indel processing
-  if ($cigar =~ /^\d+M$/){
-    # this check speeds up the extraction process by up to 60%!!!
-  }
-  else{ # parsing CIGAR string
-    my @len;
-    my @ops;
-    @len = split (/\D+/,$cigar); # storing the length per operation
-    @ops = split (/\d+/,$cigar); # storing the operation
-    shift @ops; # remove the empty first element
-
-    die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-    foreach my $index (0..$#len){
-      foreach (1..$len[$index]){
-	# print  "$ops[$index]";
-	push @comp_cigar, $ops[$index];
-      }
-    }
-    # warn "\nDetected CIGAR string: $cigar\n";
-    # warn "Length of methylation call: ",length $meth_call,"\n";
-    # warn "number of operations: ",scalar @ops,"\n";
-    # warn "number of length digits: ",scalar @len,"\n\n";
-    # print @comp_cigar,"\n";
-    # print "$meth_call\n\n";
-    # sleep (1);
-  }
-
-  if ($strand eq '-') {
-
-    ### the  CIGAR string needs to be reversed, the methylation call has already been reversed above
-    if (@comp_cigar){
-      @comp_cigar  = reverse@comp_cigar; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-    }
-    #  print "reverse CIGAR string: @comp_cigar\n";
-
-    ### the start position of paired-end files has already been corrected, see above
-  }
-
-  ### THIS IS AN OPTIONAL 2-CONTEXT (CpG and non-CpG) SECTION IF --merge_non_CpG was specified
-
-  if ($merge_non_CpG) {
-    if ($no_overlap) { # this has to be read 2...
-
-      ### single-file CpG and non-CpG context output
-      if ($full) {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-	
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-	
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start+$index+$pos_offset >= $end_read_1) {
-	      return;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.'){}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	}
-	elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-	
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-	
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start-$index+$pos_offset <= $end_read_1) {
-	      return;
-	    }
-	
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	} else {
-	  die "The read orientation was neither + nor -: '$strand'\n";
-	}
-      }
-
-      ### strand-specific methylation output
-      else {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start+$index+$pos_offset >= $end_read_1) {
-	      return;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }	
-	  }
-	} elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start-$index+$pos_offset <= $end_read_1) {
-	      return;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }
-	  }
-	} else {
-	  die "The strand orientation was neither + nor -: '$strand'/n";
-	}
-      }
-    }
-
-    ### this is the default paired-end procedure allowing overlaps and using every single C position
-    ### Still within the 2-CONTEXT ONLY optional section
-    else {
-      ### single-file CpG and non-CpG context output
-      if ($full) {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	} elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	       if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	} else {
-	  die "The strand orientation as neither + nor -: '$strand'\n";
-	}
-      }
-
-      ### strand-specific methylation output
-      ### still within the 2-CONTEXT optional section
-      else {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	       if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }
-	  }
-	} elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }
-	  }
-	} else {
-	  die "The strand orientation as neither + nor -: '$strand'\n";
-	}
-      }
-    }
-  }
-
-  ############################################
-  ### THIS IS THE DEFAULT 3-CONTEXT OUTPUT ###
-  ############################################
-
-  elsif ($no_overlap) {
-    ### single-file CpG, CHG and CHH context output
-    if ($full) {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-	
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start+$index+$pos_offset >= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  } 
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start-$index+$pos_offset <= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-
-    ### strand-specific methylation output
-    else {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start+$index+$pos_offset >= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }	
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start-$index+$pos_offset <= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-  }
-
-  ### this is the paired-end procedure allowing overlaps and using every single C position
-  else {
-    ### single-file CpG, CHG and CHH context output
-    if ($full) {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-
-    ### strand-specific methylation output
-    else {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-  }
-}
-
-sub check_cigar_string {
-  my ($index,$cigar_offset,$pos_offset,$strand,$comp_cigar) = @_;
-  # print "$index\t$cigar_offset\t$pos_offset\t$strand\t";
-  my ($new_cigar_offset,$new_pos_offset) = (0,0);
-
-  if ($strand eq '+') {
-    #  print "### $strand strand @$comp_cigar[$index + $cigar_offset]\t";
-
-    if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-      #  warn "position needs no adjustment\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){ # insertion in the read sequence
-      $new_pos_offset -= 1; # we need to subtract the length of inserted bases from the genomic position
-      # warn "adjusted genomic position by -1 bp (insertion)\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-      $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-      $new_pos_offset += 1; # we need to add the length of deleted bases to get the genomic position
-      # warn "adjusted genomic position by +1 bp (deletion). Now looping through the CIGAR string until we hit another M or I\n";
-
-      while ( ($index + $cigar_offset + $new_cigar_offset)  < (scalar @$comp_cigar) ){	
-	if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-	  #  warn "position needs no adjustment\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){
-	  $new_pos_offset -= 1; # we need to subtract the length of inserted bases from the genomic position
-	  # warn "adjusted genomic position by another -1 bp (insertion)\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-	  $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-	  $new_pos_offset += 1; # we need to add the length of deleted bases to get the genomic position
-	  # warn "adjusted genomic position by another +1 bp (deletion)\n";
-	}
-	else{
-	  die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-	}
-      }
-    }
-    else{
-      die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-    }
-  }
-
-  elsif ($strand eq '-') {
-    # print "### $strand strand @$comp_cigar[$index + $cigar_offset]\t";
-
-    if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-     # warn "position needs no adjustment\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){ # insertion in the read sequence
-      $new_pos_offset += 1; # we need to add the length of inserted bases to the genomic position
-      # warn "adjusted genomic position by +1 bp (insertion)\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-      $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-      $new_pos_offset -= 1; # we need to subtract the length of deleted bases to get the genomic position
-      # warn "adjusted genomic position by -1 bp (deletion). Now looping through the CIGAR string until we hit another M or I\n";
-
-      while ( ($index + $cigar_offset + $new_cigar_offset)  < (scalar @$comp_cigar) ){	
-	if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-	  # warn "Found new 'M' operation; position needs no adjustment\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){
-	  $new_pos_offset += 1; # we need to subtract the length of inserted bases from the genomic position
-	  # warn "Found new 'I' operation; adjusted genomic position by another +1 bp (insertion)\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-	  $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-	  $new_pos_offset -= 1; # we need to subtract the length of deleted bases to get the genomic position
-	  # warn "adjusted genomic position by another -1 bp (deletion)\n";
-	}
-	else{
-	  die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-	}
-      }
-    }
-    else{
-      die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-    }
-  }
-  # print "new cigar offset: $new_cigar_offset\tnew pos offset: $new_pos_offset\n";
-  return ($new_cigar_offset,$new_pos_offset);
-}
-
-sub print_individual_C_methylation_states_single_end{
-
-  my ($meth_call,$chrom,$start,$id,$strand,$filehandle_index,$cigar) = @_;
-  my @methylation_calls = split(//,$meth_call);
-
-  #################################################################
-  ### . for bases not involving cytosines                       ###
-  ### X for methylated C in CHG context (was protected)         ###
-  ### x for not methylated C in CHG context (was converted)     ###
-  ### H for methylated C in CHH context (was protected)         ###
-  ### h for not methylated C in CHH context (was converted)     ###
-  ### Z for methylated C in CpG context (was protected)         ###
-  ### z for not methylated C in CpG context (was converted)     ###
-  #################################################################
-
-  my $methyl_CHG_count = 0;
-  my $methyl_CHH_count = 0;
-  my $methyl_CpG_count = 0;
-  my $unmethylated_CHG_count = 0;
-  my $unmethylated_CHH_count = 0;
-  my $unmethylated_CpG_count = 0;
-
-  my $pos_offset = 0; # this is only relevant for SAM reads with insertions or deletions
-  my $cigar_offset = 0; # again, this is only relevant for SAM reads containing indels
-
-  my @comp_cigar;
-
-  if ($cigar){ # parsing CIGAR string
-
-    ### Checking whether the CIGAR string is a linear genomic match or whether it requires indel processing
-    if ($cigar =~ /^\d+M$/){
-      #  warn "See!? I told you so! $cigar\n";
-      # sleep(1);
-    }
-    else{
-
-      my @len;
-      my @ops;
-
-      @len = split (/\D+/,$cigar); # storing the length per operation
-      @ops = split (/\d+/,$cigar); # storing the operation
-      shift @ops; # remove the empty first element
-      # die "CIGAR string contained a non-matching number of lengths and operations: id: $id\nmeth call: $meth_call\nCIGAR: $cigar\n".join(" ",@len)."\n".join(" ",@ops)."\n" unless (scalar @len == scalar @ops);
-      die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-      foreach my $index (0..$#len){
-	foreach (1..$len[$index]){
-	  # print  "$ops[$index]";
-	  push @comp_cigar, $ops[$index];
-	}
-      }
-    }
-    # warn "\nDetected CIGAR string: $cigar\n";
-    # warn "Length of methylation call: ",length $meth_call,"\n";
-    # warn "number of operations: ",scalar @ops,"\n";
-    # warn "number of length digits: ",scalar @len,"\n\n";
-    # print @comp_cigar,"\n";
-    # print "$meth_call\n\n";
-    # sleep (1);
-  }
-
-  ### adjusting the start position for all reads mapping to the reverse strand
-  if ($strand eq '-') {
-
-    if (@comp_cigar){ # only needed for SAM reads with InDels
-      @comp_cigar  = reverse@comp_cigar; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-      # print @comp_cigar,"\n";
-    }
-
-    unless ($ignore){  ### if --ignore was specified the start position has already been corrected
-
-      if ($cigar){ ### SAM format
-	if ($cigar =~ /^(\d+)M$/){ # linear match
-	  $start += $1 - 1;
-	}
-	else{ # InDel read
-	  my $MD_count = 0;
-	  foreach (@comp_cigar){
-	    ++$MD_count if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	  }
-	  $start += $MD_count - 1;
-	}
-      }
-      else{ ### vanilla format
-	$start += length($meth_call)-1;
-      }
-    }
-  }
-
-  ### THIS IS THE CpG and Non-CpG SECTION (OPTIONAL)
-
-  ### single-file CpG and other-context output
-  if ($full and $merge_non_CpG) {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	
-	if ($cigar and @comp_cigar){ # only needed for SAM alignments with InDels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-	
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  # print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  #  print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{CpG_context}} $line unless($mbias_only);
-	  # print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{CpG_context}} $line unless($mbias_only);
-	  # print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  # print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  # print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM entries with InDels
-	  # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  #print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  #print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{CpG_context}} $line unless($mbias_only);
-	  #print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{CpG_context}} $line unless($mbias_only);
-	  #print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  #print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  #print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.'){}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The strand information was neither + nor -: $strand\n";
-    }
-  }
-
-  ### strand-specific methylation output
-  elsif ($merge_non_CpG) {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-    	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The strand information was neither + nor -: $strand\n";
-    }
-  }
-
-  ### THIS IS THE 3-CONTEXT (CpG, CHG and CHH) DEFAULT SECTION
-
-  elsif ($full) {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-	
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-	
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The read had a strand orientation which was neither + nor -: $strand\n";
-    }
-  }
-
-  ### strand-specific methylation output
-  else {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The strand information was neither + nor -: $strand\n";
-    }
-  }
-}
-
-sub open_output_filehandles{
-
-  my $filename = shift;
-
-  my $output_filename = (split (/\//,$filename))[-1];
-  my $report_filename = $output_filename;
-
-  ### OPENING OUTPUT-FILEHANDLES
-  if ($report) {
-      $report_filename =~ s/\.sam$//;
-      $report_filename =~ s/\.bam$//;
-      $report_filename =~ s/\.cram$//;
-      $report_filename =~ s/\.txt$//;
-      $report_filename =~ s/$/_splitting_report.txt/;
-      $report_filename = $output_dir . $report_filename;
-      open (REPORT,'>',$report_filename) or die "Failed to write to file $report_filename $!\n";
-  }
-
-  if ($report) {
-
-      print REPORT "$output_filename\n\n";
-      print REPORT "Parameters used to extract methylation information:\n";
-      print REPORT "Bismark Extractor Version: $version\n";
-      
-      if ($paired) {
-	  if ($vanilla) {
-	      print REPORT "Bismark result file: paired-end (vanilla Bismark format)\n";
-	  } else {
-	      print REPORT "Bismark result file: paired-end (SAM format)\n"; # default
-	  }
-      }
-
-      if ($single) {
-	  if ($vanilla) {
-	      print REPORT "Bismark result file: single-end (vanilla Bismark format)\n";
-	  } else {
-	      print REPORT "Bismark result file: single-end (SAM format)\n"; # default
-	  }
-      }
-      if ($single){
-	  if ($ignore) {
-	      print REPORT "Ignoring first $ignore bp\n";
-	  }
-	  if ($ignore_3prime) {
-	      print REPORT "Ignoring last $ignore_3prime bp\n";
-	  }
-      }
-      else{ # paired-end
-	  if ($ignore) {
-	      print REPORT "Ignoring first $ignore bp of Read 1\n";
-	  }
-	  if ($ignore_r2){
-	      print REPORT "Ignoring first $ignore_r2 bp of Read 2\n";
-	  }
-	  
-	  if ($ignore_3prime) {
-	      print REPORT "Ignoring last $ignore_3prime bp of Read 1\n";
-	  }
-	  if ($ignore_3prime_r2){
-	      print REPORT "Ignoring last $ignore_3prime_r2 bp of Read 2\n";
-	  }
-	  
-      }
-      
-      if ($full) {
-	  print REPORT "Output specified: comprehensive\n";
-      } else {
-	  print REPORT "Output specified: strand-specific (default)\n";
-      }
-      
-      if ($no_overlap) {
-	  print REPORT "No overlapping methylation calls specified\n";
-      }
-      if ($genomic_fasta) {
-	  print REPORT "Genomic equivalent sequences will be printed out in FastA format\n";
-      }
-      if ($merge_non_CpG) {
-	  print REPORT "Methylation in CHG and CHH context will be merged into \"non-CpG context\" output\n";
-      }
-      
-      print REPORT "\n";
-  }
-
-  #####   open (OUT,"| gzip -c - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-
-  ### CpG-context and non-CpG context. THIS SECTION IS OPTIONAL
-  ### if --comprehensive AND --merge_non_CpG was specified we are only writing out one CpG-context and one Any-Other-context result file
-  if ($full and $merge_non_CpG) {
-      my $cpg_output = my $other_c_output = $output_filename;
-      ### C in CpG context
-      $cpg_output =~ s/^/CpG_context_/;
-      $cpg_output =~ s/sam$/txt/;
-      $cpg_output =~ s/bam$/txt/;
-      $cpg_output =~ s/cram$/txt/;
-      $cpg_output =~ s/$/.txt/ unless ($cpg_output =~ /\.txt$/);
-      $cpg_output = $output_dir . $cpg_output;
-
-      if ($gzip){
-	  $cpg_output .= '.gz';
-	  open ($fhs{CpG_context},"| gzip -c - > $cpg_output") or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-      }
-      else{ ### disclaimer: I am aware of "The Useless Use of Cat Awards", but I saw no other option...
-	  open ($fhs{CpG_context},"| cat > $cpg_output") or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-	  # open ($fhs{CpG_context},'>',$cpg_output) or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CpG context to $cpg_output\n" unless($mbias_only);
-      push @sorting_files,$cpg_output;
-      
-      unless ($no_header) {
-	  print {$fhs{CpG_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-
-      ### C in any other context than CpG
-      $other_c_output =~ s/^/Non_CpG_context_/;
-      $other_c_output =~ s/sam$/txt/;
-      $other_c_output =~ s/bam$/txt/;
-      $other_c_output =~ s/cram$/txt/;
-      $other_c_output =~ s/$/.txt/ unless ($other_c_output =~ /\.txt$/);
-      $other_c_output = $output_dir . $other_c_output;
-      
-      if ($gzip){
-	  $other_c_output .= '.gz';
-	  open ($fhs{other_context},"| gzip -c - > $other_c_output") or die "Failed to write to $other_c_output $! \n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{other_context},"| cat > $other_c_output") or die "Failed to write to $other_c_output $!\n" unless($mbias_only);
-	  #   open ($fhs{other_context},'>',$other_c_output) or die "Failed to write to $other_c_output $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in any other context to $other_c_output\n" unless($mbias_only);
-      push @sorting_files,$other_c_output;
-      
-      
-      unless ($no_header) {
-	  print {$fhs{other_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-  }
-  
-  ### if only --merge_non_CpG was specified we will write out 8 different output files, depending on where the (first) unique best alignment has been found
-  elsif ($merge_non_CpG) {
-      
-      my $cpg_ot = my $cpg_ctot = my $cpg_ctob = my $cpg_ob = $output_filename;
-      
-      ### For cytosines in CpG context
-      $cpg_ot =~ s/^/CpG_OT_/;
-      $cpg_ot =~ s/sam$/txt/;
-      $cpg_ot =~ s/bam$/txt/;
-      $cpg_ot =~ s/cram$/txt/;
-      $cpg_ot =~ s/$/.txt/ unless ($cpg_ot =~ /\.txt$/);
-      $cpg_ot = $output_dir . $cpg_ot;
-      
-      if ($gzip){
-	  $cpg_ot .= '.gz';
-	  open ($fhs{0}->{CpG},"| gzip -c - > $cpg_ot") or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{0}->{CpG},"| cat > $cpg_ot") or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-	  # open ($fhs{0}->{CpG},'>',$cpg_ot) or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CpG context from the original top strand to $cpg_ot\n" unless($mbias_only);
-      push @sorting_files,$cpg_ot;
-      
-      unless($no_header){
-	  print {$fhs{0}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $cpg_ctot =~ s/^/CpG_CTOT_/;
-      $cpg_ctot =~ s/sam$/txt/;
-      $cpg_ctot =~ s/bam$/txt/; 
-      $cpg_ctot =~ s/cram$/txt/;
-      $cpg_ctot =~ s/$/.txt/ unless ($cpg_ctot =~ /\.txt$/);
-      $cpg_ctot = $output_dir . $cpg_ctot;
-      
-      if ($gzip){
-	  $cpg_ctot .= '.gz';
-	  open ($fhs{1}->{CpG},"| gzip -c - > $cpg_ctot") or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{1}->{CpG},"| cat > $cpg_ctot") or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-	  # open ($fhs{1}->{CpG},'>',$cpg_ctot) or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CpG context from the complementary to original top strand to $cpg_ctot\n" unless($mbias_only);
-      push @sorting_files,$cpg_ctot;
-      
-      unless($no_header){
-	  print {$fhs{1}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $cpg_ctob =~ s/^/CpG_CTOB_/;
-      $cpg_ctob =~ s/sam$/txt/;
-      $cpg_ctob =~ s/bam$/txt/;
-      $cpg_ctob =~ s/cram$/txt/;
-      $cpg_ctob =~ s/$/.txt/ unless ($cpg_ctob =~ /\.txt$/);
-      $cpg_ctob = $output_dir . $cpg_ctob;
-      
-      if ($gzip){
-	  $cpg_ctob .= '.gz';
-	  open ($fhs{2}->{CpG},"| gzip -c - > $cpg_ctob") or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{2}->{CpG},"| cat > $cpg_ctob") or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-	  # open ($fhs{2}->{CpG},'>',$cpg_ctob) or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CpG context from the complementary to original bottom strand to $cpg_ctob\n" unless($mbias_only);
-      push @sorting_files,$cpg_ctob;
-      
-      unless($no_header){
-	  print {$fhs{2}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $cpg_ob =~ s/^/CpG_OB_/;
-      $cpg_ob =~ s/sam$/txt/;
-      $cpg_ob =~ s/bam$/txt/;
-      $cpg_ob =~ s/cram$/txt/;
-      $cpg_ob =~ s/$/.txt/ unless ($cpg_ob =~ /\.txt$/);
-      $cpg_ob = $output_dir . $cpg_ob;
-      
-      if ($gzip){
-	  $cpg_ob .= '.gz';
-	  open ($fhs{3}->{CpG},"| gzip -c - > $cpg_ob") or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{3}->{CpG},"| cat > $cpg_ob") or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-	  # open ($fhs{3}->{CpG},'>',$cpg_ob) or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CpG context from the original bottom strand to $cpg_ob\n\n" unless($mbias_only);
-      push @sorting_files,$cpg_ob;
-      
-      unless($no_header){
-	  print {$fhs{3}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      ### For cytosines in Non-CpG (CC, CT or CA) context
-      my $other_c_ot = my $other_c_ctot = my $other_c_ctob = my $other_c_ob = $output_filename;
-      
-      $other_c_ot =~ s/^/Non_CpG_OT_/;
-      $other_c_ot =~ s/sam$/txt/;
-      $other_c_ot =~ s/bam$/txt/;
-      $other_c_ot =~ s/cram$/txt/;
-      $other_c_ot =~ s/$/.txt/ unless ($other_c_ot =~ /\.txt$/);
-      $other_c_ot = $output_dir . $other_c_ot;
-      
-      if ($gzip){
-	  $other_c_ot .= '.gz';
-	  open ($fhs{0}->{other_c},"| gzip -c - > $other_c_ot") or die "Failed to write to $other_c_ot $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{0}->{other_c},"| cat > $other_c_ot") or die "Failed to write to $other_c_ot $!\n" unless($mbias_only);
-	  # open ($fhs{0}->{other_c},'>',$other_c_ot) or die "Failed to write to $other_c_ot $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in any other context from the original top strand to $other_c_ot\n" unless($mbias_only);
-      push @sorting_files,$other_c_ot;
-      
-      unless($no_header){
-	  print {$fhs{0}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $other_c_ctot =~ s/^/Non_CpG_CTOT_/;
-      $other_c_ctot =~ s/sam$/txt/;
-      $other_c_ctot =~ s/bam$/txt/;
-      $other_c_ctot =~ s/cram$/txt/;
-      $other_c_ctot =~ s/$/.txt/ unless ($other_c_ctot =~ /\.txt$/);
-      $other_c_ctot = $output_dir . $other_c_ctot;
-      
-      if ($gzip){
-	  $other_c_ctot .= '.gz';
-	  open ($fhs{1}->{other_c},"| gzip -c - > $other_c_ctot") or die "Failed to write to $other_c_ctot $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{1}->{other_c},"|  cat > $other_c_ctot") or die "Failed to write to $other_c_ctot $!\n" unless($mbias_only);
-	  # open ($fhs{1}->{other_c},'>',$other_c_ctot) or die "Failed to write to $other_c_ctot $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in any other context from the complementary to original top strand to $other_c_ctot\n" unless($mbias_only);
-      push @sorting_files,$other_c_ctot;
-      
-      unless($no_header){
-	  print {$fhs{1}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $other_c_ctob =~ s/^/Non_CpG_CTOB_/;
-      $other_c_ctob =~ s/sam$/txt/;
-      $other_c_ctob =~ s/bam$/txt/;
-      $other_c_ctob =~ s/cram$/txt/;
-      $other_c_ctob =~ s/$/.txt/ unless ($other_c_ctob =~ /\.txt$/);
-      $other_c_ctob = $output_dir . $other_c_ctob;
-      
-      if ($gzip){
-	  $other_c_ctob .= '.gz';
-	  open ($fhs{2}->{other_c},"| gzip -c - > $other_c_ctob") or die "Failed to write to $other_c_ctob $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{2}->{other_c},"| cat > $other_c_ctob") or die "Failed to write to $other_c_ctob $!\n" unless($mbias_only);
-	  # open ($fhs{2}->{other_c},'>',$other_c_ctob) or die "Failed to write to $other_c_ctob $!\n" unless($mbias_only);
-    }
-      
-      warn "Writing result file containing methylation information for C in any other context from the complementary to original bottom strand to $other_c_ctob\n" unless($mbias_only);
-      push @sorting_files,$other_c_ctob;
-      
-      unless($no_header){
-	  print {$fhs{2}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $other_c_ob =~ s/^/Non_CpG_OB_/;
-      $other_c_ob =~ s/sam$/txt/;
-      $other_c_ob =~ s/sam$/txt/;
-      $other_c_ob =~ s/cram$/txt/;
-      $other_c_ob =~ s/$/.txt/ unless ($other_c_ob =~ /\.txt$/);
-      $other_c_ob = $output_dir . $other_c_ob;
-      
-      if ($gzip){
-	  $other_c_ob .= '.gz';
-	  open ($fhs{3}->{other_c},"| gzip -c - > $other_c_ob") or die "Failed to write to $other_c_ob $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{3}->{other_c},"| cat > $other_c_ob") or die "Failed to write to $other_c_ob $!\n" unless($mbias_only);
-	  # open ($fhs{3}->{other_c},'>',$other_c_ob) or die "Failed to write to $other_c_ob $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in any other context from the original bottom strand to $other_c_ob\n\n" unless($mbias_only);
-      push @sorting_files,$other_c_ob;
-      
-      unless($no_header){
-	  print {$fhs{3}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-  }
-
-  ### THIS SECTION IS THE DEFAULT (CpG, CHG and CHH context)
-  
-  ### if --comprehensive was specified we are only writing one file per context
-  elsif ($full) {
-      my $cpg_output = my $chg_output =  my $chh_output = $output_filename;
-      ### C in CpG context
-      $cpg_output =~ s/^/CpG_context_/;
-      $cpg_output =~ s/sam$/txt/;
-      $cpg_output =~ s/bam$/txt/;
-      $cpg_output =~ s/cram$/txt/;
-      $cpg_output =~ s/$/.txt/ unless ($cpg_output =~ /\.txt$/);
-      $cpg_output = $output_dir . $cpg_output;
-      
-      if ($gzip){
-	  $cpg_output .= '.gz';
-	  open ($fhs{CpG_context},"| gzip -c - > $cpg_output") or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{CpG_context},"| cat > $cpg_output") or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-	  # open ($fhs{CpG_context},'>',$cpg_output) or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CpG context to $cpg_output\n" unless($mbias_only);
-      push @sorting_files,$cpg_output;
-      
-      unless($no_header){
-	  print {$fhs{CpG_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      ### C in CHG context
-      $chg_output =~ s/^/CHG_context_/;
-      $chg_output =~ s/sam$/txt/;
-      $chg_output =~ s/bam$/txt/;
-      $chg_output =~ s/cram$/txt/;
-      $chg_output =~ s/$/.txt/ unless ($chg_output =~ /\.txt$/);
-      $chg_output = $output_dir . $chg_output;
-      
-      if ($gzip){
-	  $chg_output .= '.gz';
-	  open ($fhs{CHG_context},"| gzip -c - > $chg_output") or die "Failed to write to $chg_output $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{CHG_context},"| cat > $chg_output") or die "Failed to write to $chg_output $!\n" unless($mbias_only);
-	  # open ($fhs{CHG_context},'>',$chg_output) or die "Failed to write to $chg_output $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CHG context to $chg_output\n" unless($mbias_only);
-      push @sorting_files,$chg_output;
-      
-      unless($no_header){
-	  print {$fhs{CHG_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      ### C in CHH context
-      $chh_output =~ s/^/CHH_context_/;
-      $chh_output =~ s/sam$/txt/;
-      $chh_output =~ s/bam$/txt/;
-      $chh_output =~ s/cram$/txt/;
-      $chh_output =~ s/$/.txt/ unless ($chh_output =~ /\.txt$/);
-      $chh_output = $output_dir . $chh_output;
-      
-      if ($gzip){
-	  $chh_output .= '.gz';
-	  open ($fhs{CHH_context},"| gzip -c - > $chh_output") or die "Failed to write to $chh_output $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{CHH_context},"| cat > $chh_output") or die "Failed to write to $chh_output $!\n" unless($mbias_only);
-	  # open ($fhs{CHH_context},'>',$chh_output) or die "Failed to write to $chh_output $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CHH context to $chh_output\n" unless($mbias_only);
-      push @sorting_files, $chh_output;
-      
-      unless($no_header){
-	  print {$fhs{CHH_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-  }
-  ### else we will write out 12 different output files, depending on where the (first) unique best alignment was found
-  else {
-      my $cpg_ot = my $cpg_ctot = my $cpg_ctob = my $cpg_ob = $output_filename;
-      
-      ### For cytosines in CpG context
-      $cpg_ot =~ s/^/CpG_OT_/;
-      $cpg_ot =~ s/sam$/txt/;
-      $cpg_ot =~ s/bam$/txt/;
-      $cpg_ot =~ s/cram$/txt/;
-      $cpg_ot =~ s/$/.txt/ unless ($cpg_ot =~ /\.txt$/);
-      $cpg_ot = $output_dir . $cpg_ot;
-      
-      if ($gzip){
-	  $cpg_ot .= '.gz';
-	  open ($fhs{0}->{CpG},"| gzip -c - > $cpg_ot") or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{0}->{CpG},"| cat > $cpg_ot") or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-	  # open ($fhs{0}->{CpG},'>',$cpg_ot) or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CpG context from the original top strand to $cpg_ot\n" unless($mbias_only);
-      push @sorting_files,$cpg_ot;
-      
-      unless($no_header){
-	  print {$fhs{0}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $cpg_ctot =~ s/^/CpG_CTOT_/;
-      $cpg_ctot =~ s/sam$/txt/;
-      $cpg_ctot =~ s/bam$/txt/;
-      $cpg_ctot =~ s/cram$/txt/;
-      $cpg_ctot =~ s/$/.txt/ unless ($cpg_ctot =~ /\.txt$/);
-      $cpg_ctot = $output_dir . $cpg_ctot;
-      
-      if ($gzip){
-	  $cpg_ctot .= '.gz';
-	  open ($fhs{1}->{CpG},"| gzip -c - > $cpg_ctot") or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{1}->{CpG},"| cat > $cpg_ctot") or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-	  # open ($fhs{1}->{CpG},'>',$cpg_ctot) or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CpG context from the complementary to original top strand to $cpg_ctot\n" unless($mbias_only);
-      push @sorting_files,$cpg_ctot;
-      
-      unless($no_header){
-	  print {$fhs{1}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $cpg_ctob =~ s/^/CpG_CTOB_/;
-      $cpg_ctob =~ s/sam$/txt/;
-      $cpg_ctob =~ s/bam$/txt/;
-      $cpg_ctob =~ s/cram$/txt/;
-      $cpg_ctob =~ s/$/.txt/ unless ($cpg_ctob =~ /\.txt$/);
-      $cpg_ctob = $output_dir . $cpg_ctob;
-      
-      if ($gzip){
-	  $cpg_ctob .= '.gz';
-	  open ($fhs{2}->{CpG},"| gzip -c - > $cpg_ctob") or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{2}->{CpG},"| cat > $cpg_ctob") or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-	  # open ($fhs{2}->{CpG},'>',$cpg_ctob) or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CpG context from the complementary to original bottom strand to $cpg_ctob\n" unless($mbias_only);
-      push @sorting_files,$cpg_ctob;
-      
-      unless($no_header){
-	  print {$fhs{2}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $cpg_ob =~ s/^/CpG_OB_/;
-      $cpg_ob =~ s/sam$/txt/;
-      $cpg_ob =~ s/bam$/txt/;
-      $cpg_ob =~ s/cram$/txt/;
-      $cpg_ob =~ s/$/.txt/ unless ($cpg_ob =~ /\.txt$/);
-      $cpg_ob = $output_dir . $cpg_ob;
-      
-      if ($gzip){
-	  $cpg_ob .= '.gz';
-	  open ($fhs{3}->{CpG},"| gzip -c - > $cpg_ob") or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{3}->{CpG},"| cat > $cpg_ob") or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-	  # open ($fhs{3}->{CpG},'>',$cpg_ob) or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CpG context from the original bottom strand to $cpg_ob\n\n" unless($mbias_only);
-      push @sorting_files,$cpg_ob;
-      
-      unless($no_header){
-	  print {$fhs{3}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      ### For cytosines in CHG context
-      my $chg_ot = my $chg_ctot = my $chg_ctob = my $chg_ob = $output_filename;
-      
-      $chg_ot =~ s/^/CHG_OT_/;
-      $chg_ot =~ s/sam$/txt/;
-      $chg_ot =~ s/bam$/txt/;
-      $chg_ot =~ s/cram$/txt/;
-      $chg_ot =~ s/$/.txt/ unless ($chg_ot =~ /\.txt$/);
-      $chg_ot = $output_dir . $chg_ot;
-      
-      if ($gzip){
-	  $chg_ot .= '.gz';
-	  open ($fhs{0}->{CHG},"| gzip -c - > $chg_ot") or die "Failed to write to $chg_ot $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{0}->{CHG},"| cat > $chg_ot") or die "Failed to write to $chg_ot $!\n" unless($mbias_only);
-	  # open ($fhs{0}->{CHG},'>',$chg_ot) or die "Failed to write to $chg_ot $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CHG context from the original top strand to $chg_ot\n" unless($mbias_only);
-      push @sorting_files,$chg_ot;
-      
-      unless($no_header){
-	  print {$fhs{0}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $chg_ctot =~ s/^/CHG_CTOT_/;
-      $chg_ctot =~ s/sam$/txt/;
-      $chg_ctot =~ s/bam$/txt/;
-      $chg_ctot =~ s/cram$/txt/;
-      $chg_ctot =~ s/$/.txt/ unless ($chg_ctot =~ /\.txt$/);
-      $chg_ctot = $output_dir . $chg_ctot;
-      
-      if ($gzip){
-	  $chg_ctot .= '.gz';
-	  open ($fhs{1}->{CHG},"| gzip -c - > $chg_ctot") or die "Failed to write to $chg_ctot $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{1}->{CHG},"| cat > $chg_ctot") or die "Failed to write to $chg_ctot $!\n" unless($mbias_only);
-	  # open ($fhs{1}->{CHG},'>',$chg_ctot) or die "Failed to write to $chg_ctot $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CHG context from the complementary to original top strand to $chg_ctot\n" unless($mbias_only);
-      push @sorting_files,$chg_ctot;
-      
-      unless($no_header){
-	  print {$fhs{1}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $chg_ctob =~ s/^/CHG_CTOB_/;
-      $chg_ctob =~ s/sam$/txt/;
-      $chg_ctob =~ s/bam$/txt/;
-      $chg_ctob =~ s/cram$/txt/;
-      $chg_ctob =~ s/$/.txt/ unless ($chg_ctob =~ /\.txt$/);
-      $chg_ctob = $output_dir . $chg_ctob;
-      
-      if ($gzip){
-	  $chg_ctob .= '.gz';
-	  open ($fhs{2}->{CHG},"| gzip -c - > $chg_ctob") or die "Failed to write to $chg_ctob $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{2}->{CHG},"| cat > $chg_ctob") or die "Failed to write to $chg_ctob $!\n" unless($mbias_only);
-	  # open ($fhs{2}->{CHG},'>',$chg_ctob) or die "Failed to write to $chg_ctob $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CHG context from the complementary to original bottom strand to $chg_ctob\n" unless($mbias_only);
-      push @sorting_files,$chg_ctob;
-      
-      unless($no_header){
-	  print {$fhs{2}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $chg_ob =~ s/^/CHG_OB_/;
-      $chg_ob =~ s/sam$/txt/;
-      $chg_ob =~ s/bam$/txt/;
-      $chg_ob =~ s/cram$/txt/;
-      $chg_ob =~ s/$/.txt/ unless ($chg_ob =~ /\.txt$/);
-      $chg_ob = $output_dir . $chg_ob;
-      
-      if ($gzip){
-	  $chg_ob .= '.gz';
-	  open ($fhs{3}->{CHG},"| gzip -c - > $chg_ob") or die "Failed to write to $chg_ob $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{3}->{CHG},"| cat > $chg_ob") or die "Failed to write to $chg_ob $!\n" unless($mbias_only);
-	  # open ($fhs{3}->{CHG},'>',$chg_ob) or die "Failed to write to $chg_ob $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CHG context from the original bottom strand to $chg_ob\n\n" unless($mbias_only);
-      push @sorting_files,$chg_ob;
-      
-      unless($no_header){
-	  print {$fhs{3}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      ### For cytosines in CHH context
-      my $chh_ot = my $chh_ctot = my $chh_ctob = my $chh_ob = $output_filename;
-      
-      $chh_ot =~ s/^/CHH_OT_/;
-      $chh_ot =~ s/sam$/txt/;
-      $chh_ot =~ s/bam$/txt/;
-      $chh_ot =~ s/cram$/txt/;
-      $chh_ot =~ s/$/.txt/ unless ($chh_ot =~ /\.txt$/);
-      $chh_ot = $output_dir . $chh_ot;
-      
-      if ($gzip){
-	  $chh_ot .= '.gz';
-	  open ($fhs{0}->{CHH},"| gzip -c - > $chh_ot") or die "Failed to write to $chh_ot $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{0}->{CHH},"| cat > $chh_ot") or die "Failed to write to $chh_ot $!\n" unless($mbias_only);
-	  # open ($fhs{0}->{CHH},'>',$chh_ot) or die "Failed to write to $chh_ot $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CHH context from the original top strand to $chh_ot\n" unless($mbias_only);
-      push @sorting_files,$chh_ot;
-      
-      unless($no_header){
-	  print {$fhs{0}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $chh_ctot =~ s/^/CHH_CTOT_/;
-      $chh_ctot =~ s/sam$/txt/;
-      $chh_ctot =~ s/bam$/txt/;
-      $chh_ctot =~ s/cram$/txt/;
-      $chh_ctot =~ s/$/.txt/ unless ($chh_ctot =~ /\.txt$/);
-      $chh_ctot = $output_dir . $chh_ctot;
-      
-      if ($gzip){
-	  $chh_ctot .= '.gz';
-	  open ($fhs{1}->{CHH},"| gzip -c - > $chh_ctot") or die "Failed to write to $chh_ctot $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{1}->{CHH},"| cat > $chh_ctot") or die "Failed to write to $chh_ctot $!\n" unless($mbias_only);
-	  # open ($fhs{1}->{CHH},'>',$chh_ctot) or die "Failed to write to $chh_ctot $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CHH context from the complementary to original top strand to $chh_ctot\n" unless($mbias_only);
-      push @sorting_files,$chh_ctot;
-      
-      unless($no_header){
-	  print {$fhs{1}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $chh_ctob =~ s/^/CHH_CTOB_/;
-      $chh_ctob =~ s/sam$/txt/;
-      $chh_ctob =~ s/bam$/txt/;
-      $chh_ctob =~ s/cram$/txt/;
-      $chh_ctob =~ s/$/.txt/ unless ($chh_ctob =~ /\.txt$/);
-      $chh_ctob = $output_dir . $chh_ctob;
-      
-      if ($gzip){
-	  $chh_ctob .= '.gz';
-	  open ($fhs{2}->{CHH},"| gzip -c - > $chh_ctob") or die "Failed to write to $chh_ctob $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{2}->{CHH},"| cat > $chh_ctob") or die "Failed to write to $chh_ctob $!\n" unless($mbias_only);
-	  # open ($fhs{2}->{CHH},'>',$chh_ctob) or die "Failed to write to $chh_ctob $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CHH context from the complementary to original bottom strand to $chh_ctob\n" unless($mbias_only);
-      push @sorting_files,$chh_ctob;
-      
-      unless($no_header){
-	  print {$fhs{2}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-      
-      $chh_ob =~ s/^/CHH_OB_/;
-      $chh_ob =~ s/sam$/txt/;
-      $chh_ob =~ s/bam$/txt/;
-      $chh_ob =~ s/cram$/txt/;
-      $chh_ob =~ s/$/.txt/ unless ($chh_ob =~ /\.txt$/);
-      $chh_ob = $output_dir . $chh_ob;
-      
-      if ($gzip){
-	  $chh_ob .= '.gz';
-	  open ($fhs{3}->{CHH},"| gzip -c - > $chh_ob") or die "Failed to write to $chh_ob $!\n" unless($mbias_only);
-      }
-      else{
-	  open ($fhs{3}->{CHH},"| cat > $chh_ob") or die "Failed to write to $chh_ob $!\n" unless($mbias_only);
-	  # open ($fhs{3}->{CHH},'>',$chh_ob) or die "Failed to write to $chh_ob $!\n" unless($mbias_only);
-      }
-      
-      warn "Writing result file containing methylation information for C in CHH context from the original bottom strand to $chh_ob\n\n" unless($mbias_only);
-      push @sorting_files,$chh_ob;
-      
-      unless($no_header){
-	  print {$fhs{3}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-      }
-  }
-  return $report_filename;
-}
-
-sub isBam{
-
-  my $filename = shift;
-
-  # reading the first line of the input file to see if it is a BAM file in disguise (i.e. a BAM file that does not end in *.bam which may be produced by Galaxy)
-  open (DISGUISE,"gunzip -c $filename |") or die "Failed to open filehandle DISGUISE for $filename\n\n";
-
-  ### when BAM files read through a gunzip -c stream they start with BAM...
-  my $bam_in_disguise = <DISGUISE>;
-  # warn "BAM in disguise: $bam_in_disguise\n\n";
-
-  if ($bam_in_disguise){
-    if ($bam_in_disguise =~ /^BAM/){
-      close (DISGUISE) or warn "Had trouble closing filehandle BAM in disguise: $!\n";
-      return 1;
-    }
-    else{
-      close (DISGUISE) or warn "Had trouble closing filehandle BAM in disguise: $!\n";
-     return 0;
-    }
-  }
-  else{
-    close (DISGUISE) or warn "Had trouble closing filehandle BAM in disguise: $!\n";
-    return 0;
-  }
-}
-
-
-sub print_helpfile{
-
- print << 'HOW_TO';
-
-
-DESCRIPTION
-
-The following is a brief description of all options to control the Bismark
-methylation extractor. The script reads in a bisulfite read alignment results file 
-produced by the Bismark bisulfite mapper (in BAM/CRAM/SAM format) and extracts the
-methylation information for individual cytosines. This information is found in the
-methylation call field which can contain the following characters:
-
-       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-       ~~~   X   for methylated C in CHG context                      ~~~
-       ~~~   x   for not methylated C CHG                             ~~~
-       ~~~   H   for methylated C in CHH context                      ~~~
-       ~~~   h   for not methylated C in CHH context                  ~~~
-       ~~~   Z   for methylated C in CpG context                      ~~~
-       ~~~   z   for not methylated C in CpG context                  ~~~
-       ~~~   U   for methylated C in Unknown context (CN or CHN       ~~~
-       ~~~   u   for not methylated C in Unknown context (CN or CHN)  ~~~
-       ~~~   .   for any bases not involving cytosines                ~~~
-       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The methylation extractor outputs result files for cytosines in CpG, CHG and CHH
-context (this distinction is actually already made in Bismark itself). As the methylation
-information for every C analysed can produce files which easily have tens or even hundreds of
-millions of lines, file sizes can become very large and more difficult to handle. The C
-methylation info additionally splits cytosine methylation calls up into one of the four possible
-strands a given bisulfite read aligned against:
-
-             OT      original top strand
-             CTOT    complementary to original top strand
-
-             OB      original bottom strand
-             CTOB    complementary to original bottom strand
-
-Thus, by default twelve individual output files are being generated per input file (unless
---comprehensive is specified, see below). The output files can be imported into a genome
-viewer, such as SeqMonk, and re-combined into a single data group if desired (in fact
-unless the bisulfite reads were generated preserving directionality it doesn't make any
-sense to look at the data in a strand-specific manner). Strand-specific output files can
-optionally be skipped, in which case only three output files for CpG, CHG or CHH context
-will be generated. For both the strand-specific and comprehensive outputs there is also
-the option to merge both non-CpG contexts (CHG and CHH) into one single non-CpG context.
-
-
-The output files are in the following format (tab delimited):
-
-<sequence_id>     <strand>      <chromosome>     <position>     <methylation call>
-
-
-USAGE: bismark_methylation_extractor [options] <filenames>
-
-
-ARGUMENTS:
-==========
-
-<filenames>              A space-separated list of Bismark result files in SAM format from
-                         which methylation information is extracted for every cytosine in
-                         the reads. For alignment files in the older custom Bismark output
-                         see option '--vanilla'.
-
-OPTIONS:
-
--s/--single-end          Input file(s) are Bismark result file(s) generated from single-end
-                         read data. If neither -s nor -p is set the type of experiment will
-                         be determined automatically.
-
--p/--paired-end          Input file(s) are Bismark result file(s) generated from paired-end
-                         read data. If neither -s nor -p is set the type of experiment will
-                         be determined automatically.
-
---vanilla                The Bismark result input file(s) are in the old custom Bismark format
-                         (up to version 0.5.x) and not in SAM format which is the default as
-                         of Bismark version 0.6.x or higher. Default: OFF.
-
---no_overlap             For paired-end reads it is theoretically possible that read_1 and
-                         read_2 overlap. This option avoids scoring overlapping methylation
-                         calls twice (only methylation calls of read 1 are used for in the process
-                         since read 1 has historically higher quality basecalls than read 2).
-                         Whilst this option removes a bias towards more methylation calls
-                         in the center of sequenced fragments it may de facto remove a sizable
-                         proportion of the data. This option is on by default for paired-end data
-                         but can be disabled using --include_overlap. Default: ON.
-
---include_overlap        For paired-end data all methylation calls will be extracted irrespective of
-                         of whether they overlap or not. Default: OFF.
-
---ignore <int>           Ignore the first <int> bp from the 5' end of Read 1 (or single-end alignment
-                         files) when processing the methylation call string. This can remove e.g. a
-                         restriction enzyme site at the start of each read or any other source of
-                         bias (such as PBAT-Seq data).
-
---ignore_r2 <int>        Ignore the first <int> bp from the 5' end of Read 2 of paired-end sequencing
-                         results only. Since the first couple of bases in Read 2 of BS-Seq experiments
-                         show a severe bias towards non-methylation as a result of end-repairing
-                         sonicated fragments with unmethylated cytosines (see M-bias plot), it is
-                         recommended that the first couple of bp of Read 2 are removed before
-                         starting downstream analysis. Please see the section on M-bias plots in the
-                         Bismark User Guide for more details.
-
---ignore_3prime <int>    Ignore the last <int> bp from the 3' end of Read 1 (or single-end alignment
-                         files) when processing the methylation call string. This can remove unwanted
-                         biases from the end of reads.
-
---ignore_3prime_r2 <int> Ignore the last <int> bp from the 3' end of Read 2 of paired-end sequencing
-                         results only. This can remove unwanted biases from the end of reads.
-
---comprehensive          Specifying this option will merge all four possible strand-specific
-                         methylation info into context-dependent output files. The default
-
-                         contexts are:
-                          - CpG context
-                          - CHG context
-                          - CHH context
-
---merge_non_CpG          This will produce two output files (in --comprehensive mode) or eight
-                         strand-specific output files (default) for Cs in
-                          - CpG context
-                          - non-CpG context
-
---report                 Prints out a short methylation summary as well as the paramaters used to run
-                         this script. Default: ON.
-
---no_header              Suppresses the Bismark version header line in all output files for more convenient
-                         batch processing.
-
--o/--output DIR          Allows specification of a different output directory (absolute or relative
-                         path). If not specified explicitly, the output will be written to the current directory.
-
---samtools_path          The path to your Samtools installation, e.g. /home/user/samtools/. Does not need to be specified
-                         explicitly if Samtools is in the PATH already.
-
---gzip                   The methylation extractor files (CpG_OT_..., CpG_OB_... etc) will be written out in
-                         a GZIP compressed form to save disk space. This option is also passed on to the genome-wide
-                         cytosine report. BedGraph and coverage files will be written out as .gz by default.
-
---version                Displays version information.
-
--h/--help                Displays this help file and exits.
-
---mbias_only             The methylation extractor will read the entire file but only output the M-bias table and plots as 
-                         well as a report (optional) and then quit. Default: OFF.
-
---mbias_off              The methylation extractor will process the entire file as usual but doesn't write out any M-bias report.
-                         Only recommended for users who deliberately want to keep an earlier version of the M-bias report. 
-                         Default: OFF.
-
---multicore <int>        Sets the number of cores to be used for the methylation extraction process. If system resources
-                         are plentiful this is a viable option to speed up the extraction process (we observed a near linear
-                         speed increase for up to 10 cores used). Please note that a typical process of extracting a BAM file
-                         and writing out '.gz' output streams will in fact use ~3 cores per value of --multicore <int>
-                         specified (1 for the methylation extractor itself, 1 for a Samtools stream, 1 for GZIP stream), so
-                         --multicore 10 is likely to use around 30 cores of system resources. This option has no bearing
-                         on the bismark2bedGraph or genome-wide cytosine report processes.
-
-
-
-
-bedGraph specific options:
-==========================
-
---bedGraph               After finishing the methylation extraction, the methylation output is written into a
-                         sorted bedGraph file that reports the position of a given cytosine and its methylation 
-                         state (in %, see details below). The methylation extractor output is temporarily split up into
-                         temporary files, one per chromosome (written into the current directory or folder
-                         specified with -o/--output); these temp files are then used for sorting and deleted
-                         afterwards. By default, only cytosines in CpG context will be sorted. The option
-                         '--CX_context' may be used to report all cytosines irrespective of sequence context
-                         (this will take MUCH longer!). The default folder for temporary files during the sorting
-                         process is the output directory. The bedGraph conversion step is performed by the external
-                         module 'bismark2bedGraph'; this script needs to reside in the same folder as the 
-                         bismark_methylation_extractor itself.
-
---zero_based             Write out an additional coverage file (ending in .zero.cov) that uses 0-based genomic start
-                         and 1-based genomic end coordinates (zero-based, half-open), like used in the bedGraph file,
-                         instead of using 1-based coordinates throughout. Default: OFF.
-
-
---cutoff [threshold]     The minimum number of times any methylation state (methylated or unmethylated) has to be seen
-                         for a nucleotide before its methylation percentage is reported. Default: 1.
-
---remove_spaces          Replaces whitespaces in the sequence ID field with underscores to allow sorting.
-
---CX/--CX_context        The sorted bedGraph output file contains information on every single cytosine that was covered
-                         in the experiment irrespective of its sequence context. This applies to both forward and
-                         reverse strands. Please be aware that this option may generate large temporary and output files
-                         and may take a long time to sort (up to many hours). Default: OFF.
-                         (i.e. Default = CpG context only).
-
---buffer_size <string>   This allows you to specify the main memory sort buffer when sorting the methylation information.
-                         Either specify a percentage of physical memory by appending % (e.g. --buffer_size 50%) or
-			 a multiple of 1024 bytes, e.g. 'K' multiplies by 1024, 'M' by 1048576 and so on for 'T' etc. 
-                         (e.g. --buffer_size 20G). For more information on sort type 'info sort' on a command line.
-                         Defaults to 2G.
-
---scaffolds/--gazillion  Users working with unfinished genomes sporting tens or even hundreds of thousands of
-                         scaffolds/contigs/chromosomes frequently encountered errors with pre-sorting reads to
-                         individual chromosome files. These errors were caused by the operating system's limit
-                         of the number of filehandle that can be written to at any one time (typically 1024; to
-                         find out this limit on Linux, type: ulimit -a).
-                         To bypass the limitation of open filehandles, the option --scaffolds does not pre-sort
-                         methylation calls into individual chromosome files. Instead, all input files are
-                         temporarily merged into a single file (unless there is only a single file), and this
-                         file will then be sorted by both chromosome AND position using the Unix sort command.
-                         Please be aware that this option might take a looooong time to complete, depending on
-                         the size of the input files, and the memory you allocate to this process (see --buffer_size).
-                         Nevertheless, it seems to be working.
-
---ample_memory           Using this option will not sort chromosomal positions using the UNIX 'sort' command, but will
-                         instead use two arrays to sort methylated and unmethylated calls. This may result in a faster
-                         sorting process of very large files, but this comes at the cost of a larger memory footprint
-                         (two arrays of the length of the largest human chromosome 1 (~250M bp) consume around 16GB
-                         of RAM). Due to overheads in creating and looping through these arrays it seems that it will
-                         actually be *slower* for small files (few million alignments), and we are currently testing at
-                         which point it is advisable to use this option. Note that --ample_memory is not compatible
-                         with options '--scaffolds/--gazillion' (as it requires pre-sorted files to begin with).
-
-
-
-Genome-wide cytosine methylation report specific options:
-=========================================================
-
---cytosine_report        After the conversion to bedGraph has completed, the option '--cytosine_report' produces a
-                         genome-wide methylation report for all cytosines in the genome. By default, the output uses 1-based
-                         chromosome coordinates (zero-based start coords are optional) and reports CpG context only (all
-                         cytosine context is optional). The output considers all Cs on both forward and reverse strands and
-                         reports their position, strand, trinucleotide content and methylation state (counts are 0 if not
-                         covered). The cytosine report conversion step is performed by the external module
-                         'coverage2cytosine'; this script needs to reside in the same folder as the bismark_methylation_extractor
-                         itself.
-
---CX/--CX_context        The output file contains information on every single cytosine in the genome irrespective of
-                         its context. This applies to both forward and reverse strands. Please be aware that this will
-                         generate output files with > 1.1 billion lines for a mammalian genome such as human or mouse.
-                         Default: OFF (i.e. Default = CpG context only).
-
---zero_based             Uses 0-based genomic coordinates instead of 1-based coordinates. Default: OFF.
-
---genome_folder <path>   Enter the genome folder you wish to use to extract sequences from (full path only). Accepted
-                         formats are FastA files ending with '.fa' or '.fasta'. Specifying a genome folder path is mandatory.
-
---split_by_chromosome    Writes the output into individual files for each chromosome instead of a single output file. Files
-                         will be named to include the input filename and the chromosome number.
-
-
-
-OUTPUT:
-
-The bismark_methylation_extractor output is in the form:
-========================================================
-<seq-ID>  <methylation state*>  <chromosome>  <start position (= end position)>  <methylation call>
-
-* Methylated cytosines receive a '+' orientation,
-* Unmethylated cytosines receive a '-' orientation.
-
-
-
-The bedGraph output (optional) looks like this (tab-delimited; 0-based start coords, 1-based end coords):
-=========================================================================================================
-
-track type=bedGraph (header line)
-
-<chromosome>  <start position>  <end position>  <methylation percentage>
-
-
-
-The coverage output looks like this (tab-delimited, 1-based genomic coords; zero-based half-open coordinates available with '--zero_based'):
-============================================================================================================================================
-
-<chromosome>  <start position>  <end position>  <methylation percentage>  <count methylated>  <count non-methylated>
-
-
-
-The genome-wide cytosine methylation output file is tab-delimited in the following format:
-==========================================================================================
-<chromosome>  <position>  <strand>  <count methylated>  <count non-methylated>  <C-context>  <trinucleotide context>
-
-
-
-This script was last modified on 25 February 2016.
-
-HOW_TO
-}
--- a/bismark_methyl_extractor/bismark_methylation_extractor.py	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,181 +0,0 @@
-#!/usr/bin/env python
-
-import argparse, os, shutil, subprocess, sys, tempfile, fileinput
-import zipfile
-import re
-from glob import glob
-
-def stop_err( msg ):
-    sys.stderr.write( "%s\n" % msg )
-    sys.exit()
-
-def zipper(dir, zip_file):
-    output_files_regex = re.compile('^(Non_)?C[pH][GH]_.*')
-    bedgraph_regex = re.compile('.*bedGraph.gz')
-    zip = zipfile.ZipFile(zip_file, 'w', compression=zipfile.ZIP_DEFLATED)
-    root_len = len(os.path.abspath(dir))
-    for root, dirs, files in os.walk(dir):
-        archive_root = os.path.abspath(root)[root_len:]
-        for f in files:
-            if re.search(output_files_regex, f) or re.search(bedgraph_regex, f):
-                fullpath = os.path.join(root, f)
-                archive_name = os.path.join(archive_root, f)
-                zip.write(fullpath, archive_name, zipfile.ZIP_DEFLATED)
-    zip.close()
-    return zip_file
-
-def build_genome_dir(genome_file):
-    tmp_genome_dir = tempfile.mkdtemp(prefix='tmp')
-    genome_path = os.path.join(tmp_genome_dir, '.'.join(os.path.split(genome_file)[1].split('.')[:-1]))
-    try:
-        """
-            Create a hard link pointing to genome_file named 'genome_path'.fa.
-        """
-        os.symlink(genome_file, genome_path + '.fa')
-    except Exception, e:
-        if os.path.exists(tmp_genome_dir):
-            shutil.rmtree(tmp_genome_dir)
-        stop_err('Error in linking the reference database.\n' + str(e))
-    return tmp_genome_dir
-
-def __main__():
-    #Parse Command Line
-    parser = argparse.ArgumentParser(description='Wrapper for the bismark methylation caller.')
-
-    # input options
-    parser.add_argument( '--bismark_path', dest='bismark_path', help='Path to the bismark perl scripts' )
-
-    parser.add_argument( '--infile', help='Input file in SAM or BAM format.' )
-    parser.add_argument( '--single-end', dest='single_end', action="store_true" )
-    parser.add_argument( '--paired-end', dest='paired_end', action="store_true" )
-
-    parser.add_argument('--splitting_report', dest='splitting_report')
-    parser.add_argument('--mbias_report', dest='mbias_report')
-    parser.add_argument('--cytosine_report', dest="cytosine_report")
-    parser.add_argument('--genome_file', dest="genome_file")
-    parser.add_argument('--cx_context', action="store_true" )
-
-    parser.add_argument( '--comprehensive', action="store_true" )
-    parser.add_argument( '--merge-non-cpg', dest='merge_non_cpg', action="store_true" )
-    parser.add_argument( '--no-overlap', dest='no_overlap', action="store_true" )
-    parser.add_argument( '--compress' )
-    parser.add_argument('--ignore', dest='ignore', type=int)
-    parser.add_argument('--ignore_r2', dest='ignore_r2', type=int)
-    parser.add_argument('--ignore_3prime', dest='ignore_3prime', type=int)
-    parser.add_argument('--ignore_3prime_r2', dest='ignore_3prime_r2', type=int)
-
-    args = parser.parse_args()
-
-    # Build methylation extractor command
-    output_dir = tempfile.mkdtemp()
-    cmd = 'bismark_methylation_extractor --no_header -o %s %s %s'
-    if args.bismark_path:
-        # add the path to the bismark perl scripts, that is needed for galaxy
-        cmd = os.path.join(args.bismark_path, cmd)
-
-    # Set up all options
-    additional_opts = ''
-    if args.single_end:
-        additional_opts += ' --single-end '
-    else:
-        additional_opts += ' --paired-end '
-    if args.no_overlap:
-        additional_opts += ' --no_overlap '
-    if args.ignore:
-        additional_opts += ' --ignore %s ' % args.ignore
-    if args.ignore_r2:
-        additional_opts += ' --ignore_r2 %s ' % args.ignore_r2
-    if args.ignore_3prime:
-        additional_opts += ' --ignore_3prime %s ' % args.ignore_3prime
-    if args.ignore_3prime_r2:
-        additional_opts += ' --ignore_3prime_r2 %s ' % args.ignore_3prime_r2
-    if args.comprehensive:
-        additional_opts += ' --comprehensive '
-    if args.merge_non_cpg:
-        additional_opts += ' --merge_non_CpG '
-    if args.splitting_report:
-        additional_opts += ' --report '
-    if args.cytosine_report:
-        tmp_genome_dir = build_genome_dir(args.genome_file)
-        if args.cx_context:
-            additional_opts += ' --bedgraph --CX_context --cytosine_report --CX_context --genome_folder %s ' % tmp_genome_dir
-        else:
-            additional_opts += ' --bedgraph --cytosine_report --genome_folder %s ' % tmp_genome_dir
-
-
-    #detect BAM file, use samtools view if it is a bam file
-    f = open (args.infile, 'rb')
-    sig = f.read(4)
-    f.close()
-    if sig == '\x1f\x8b\x08\x04' :
-        #cmd = cmd % (output_dir, additional_opts, '-')
-        new_infilename = os.path.join(output_dir, 'submitted_bs_mapped_reads.sam')
-        new_sam = open(new_infilename, 'wb')
-        tmp_err = tempfile.NamedTemporaryFile().name
-        tmp_stderr = open(tmp_err, 'wb')
-        proc = subprocess.Popen(['samtools', 'view', args.infile], stdout=new_sam, stderr=tmp_stderr)
-        new_sam.close()
-        tmp_stderr.close()
-        if os.stat(tmp_err).st_size != 0:
-            tmp_sterr = open(tmp_err, 'rb')
-            error_msg = tmp_sterr.read()
-            tmp_sterr.close()
-            sys.exit("error: %s" % error_msg)
-        cmd = cmd % (output_dir, additional_opts, new_infilename)
-    else:
-        cmd = cmd % (output_dir, additional_opts, args.infile)
-
-    # Run
-    try:
-        tmp_out = tempfile.NamedTemporaryFile().name
-        tmp_stdout = open( tmp_out, 'wb' )
-        tmp_err = tempfile.NamedTemporaryFile().name
-        tmp_stderr = open( tmp_err, 'wb' )
-        proc = subprocess.Popen( args=cmd, shell=True, cwd=".", stdout=tmp_stdout, stderr=tmp_stderr )
-        returncode = proc.wait()
-        tmp_stderr.close()
-        # get stderr, allowing for case where it's very large
-        tmp_stderr = open( tmp_err, 'rb' )
-        stderr = ''
-        buffsize = 1048576
-        try:
-            while True:
-                stderr += tmp_stderr.read( buffsize )
-                if not stderr or len( stderr ) % buffsize != 0:
-                    break
-        except OverflowError:
-            pass
-        tmp_stdout.close()
-        tmp_stderr.close()
-        if returncode != 0:
-            raise Exception, stderr
-            
-        # TODO: look for errors in program output.
-    except Exception, e:
-        stop_err( 'Error in bismark methylation extractor:\n' + str( e ) )
-
-    # collect and copy output files
-    if args.compress:
-        zipper(output_dir, args.compress)
-
-    # cytosine report
-    if args.cytosine_report:
-        if args.cx_context:
-            shutil.move( glob(os.path.join( output_dir, '*CX_report.txt'))[0], args.cytosine_report )
-        else:
-            shutil.move(glob(os.path.join(output_dir, '*CpG_report.txt'))[0], args.cytosine_report)
-    # splitting report
-    if args.splitting_report:
-        shutil.move( glob(os.path.join( output_dir, '*_splitting_report.txt'))[0], args.splitting_report )
-    if args.mbias_report:
-        shutil.move(glob(os.path.join(output_dir, '*M-bias.txt'))[0], args.mbias_report)
-
-
-    #Clean up temp dirs
-    if os.path.exists( output_dir ):
-         shutil.rmtree( output_dir )
-    if args.cytosine_report:
-        if os.path.exists( tmp_genome_dir ):
-            shutil.rmtree( tmp_genome_dir )
-
-if __name__=="__main__": __main__()
--- a/bismark_methyl_extractor/bismark_methylation_extractor.xml	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,304 +0,0 @@
-<tool id="bismark_methylation_extractor" name="Bismark Meth. Extractor" version="0.16.3">
-
-    <description>Reports on methylation status of reads mapped by Bismark</description>
-    <!--<version_command>bismark_methylation_extractor version</version_command>-->
-
-    <requirements>
-        <requirement type="package" version="0.1.19">samtools</requirement>
-        <requirement type="package" version="2.1.0">bowtie2</requirement>
-    </requirements>
-
-    <parallelism method="basic"></parallelism>
-
-    <command interpreter="python">
-<![CDATA[
-        bismark_methylation_extractor.py
-
-        --infile "$input"
-
-        ##--bismark_path \$SCRIPT_PATH
-        --bismark_path "$__tool_directory__"
-
-        #if $singlePaired.sPaired == "single":
-            --single-end
-        #else:
-            --paired-end
-            $singlePaired.no_overlap
-        #end if
-
-        #if str( $singlePaired['ignore_r1'] ) != "0":
-          --ignore $singlePaired['ignore_r1']
-        #end if
-        #if str( $singlePaired['ignore_3prime_r1'] ) != "0":
-          --ignore_3prime $singlePaired['ignore_3prime_r1']
-        #end if
-
-        #if $singlePaired.sPaired == "paired":
-          #if str( $singlePaired['ignore_r2'] ) != "0":
-            --ignore_r2 $singlePaired['ignore_r2']
-          #end if
-          #if str( $singlePaired['ignore_3prime_r2'] ) != "0":
-            --ignore_3prime_r2 $singlePaired['ignore_3prime_r2']
-          #end if
-        #end if
-
-        #if $splitting_report:
-            --splitting_report "$output_splitting_report"
-        #end if
-
-        #if $mbias_report:
-          --mbias_report "$output_mbias_report"
-        #end if
-
-        #if $cytosine_report['cytosine_report_selector']:
-          --cytosine_report "$output_cytosine_report"
-          --genome_file "${cytosine_report.built_in_fasta.fields.path}"
-          #if not $cytosine_report['cpg_context']:
-            --cx_context
-          #end if
-        #end if
-
-        #if $output_settings['comprehensive']:
-            --comprehensive
-        #end if
-
-        #if $output_settings['merge_non_cpg']:
-            --merge-non-cpg
-        #end if
-
-        --compress "$compressed_output"
-]]>
-    </command>
-
-    <inputs>
-        <!-- Input Parameters -->
-        <param name="input" type="data" format="sam,bam" label="SAM/BAM file from Bismark bisulfite mapper" />
-        <conditional name="singlePaired">
-            <param name="sPaired" type="select" label="Is this library mate-paired?">
-              <option value="single">Single-end</option>
-              <option value="paired">Paired-end</option>
-            </param>
-            <when value="single">
-              <param name="ignore_r1" type="integer" value="0" label="Ignore the first N bp from the 5’ end of single-end read when processing the methylation call string." />
-              <param name="ignore_3prime_r1" type="integer" value="0" label="Ignore the last N bp from the 3' end of single-end read when processing the methylation call string."/>
-            </when>
-            <when value="paired">
-                <param name="ignore_r1" type="integer" value="0" label="Ignore the first N bp from the 5’ end of Read 1 when processing the methylation call string." />
-                <param name="ignore_3prime_r1" type="integer" value="0" label="Ignore the last N bp from the 3' end of Read 1 when processing the methylation call string."/>
-                <param name="ignore_r2" type="integer" value="0" label="Ignore the first N bp from the 5' end of Read 2 of paired-end sequencing results" />
-                <param name="ignore_3prime_r2" type="integer" value="0" label="Ignore the last N bp from the 3' end of Read 2 of paired-end sequencing results"/>
-                <param name="no_overlap" type="boolean" truevalue="--no-overlap" falsevalue="" checked="False" label="This option avoids scoring overlapping methylation calls twice, in case of overlapping read one and read two" help="" />
-            </when>
-        </conditional>
-        <param name="splitting_report" type="boolean" truevalue="true" falsevalue="false" checked="True" label="Short methylation summary output (Splitting Report)" />
-        <param name="mbias_report" type="boolean" truevalue="true" falsevalue="false" checked="True" label="Methylation proportion report for each possible position in the read (Mbias Report)" />
-        <conditional name="cytosine_report">
-          <param name="cytosine_report_selector" type="boolean" truevalue="true" falsevalue="false" checked="True" label="Genome-wide methylation report for all cytosines in the genome (Cytosine Report)" />
-          <when value="true">
-            <param name="built_in_fasta" type="select" label="Select  the Reference Genome (fasta) used for the mapping">
-              <options from_data_table="all_fasta">
-                <filter type="sort_by" column="name"/>
-                <validator type="no_options" message="No genomes in fasta are available for the selected input dataset"/>
-              </options>
-            </param>
-            <param name="cpg_context" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Reports Cpg Context only" />
-          </when>
-          <when value="false"></when>
-        </conditional>
-        <section name="output_settings" title="Advanced output settings" expanded="False">
-          <param name="comprehensive" type="boolean" truevalue="true" falsevalue="false" checked="True" label="Merge all four possible strand-specific methylation info
-into context-dependent output files" help="" />
-          <param name="merge_non_cpg" type="boolean" truevalue="true" falsevalue="false" checked="False" label="Merge all non-CpG contexts into one file" help="This will produce eight strand-specific output files, or two output files in comprehensive mode." />
-        </section>
-    </inputs>
-    <outputs>
-        <!--
-            OT – original top strand
-            CTOT – complementary to original top strand
-            OB – original bottom strand
-            CTOB – complementary to original bottom strand
-        -->
-        <data format="tabular" name="output_splitting_report" label="${tool.name} on ${on_string}: Splitting Report">
-          <filter> ( splitting_report is True ) </filter>
-        </data>
-        <data format="txt" name="output_mbias_report" label="${tool.name} on ${on_string}: Mbias Report">
-          <filter> ( mbias_report is True ) </filter>
-        </data>
-         <data format="txt" name="output_cytosine_report" label="${tool.name} on ${on_string}: Genome-wide methylation report.">
-          <filter> ( cytosine_report['cytosine_report_selector'] ) </filter>
-        </data>
-        <data format="gzipped" name="compressed_output" label="${tool.name} on ${on_string}: Result archive.">
-          <filter> ( output_settings['compress'] ) </filter>
-        </data>
-    </outputs>
-
-    <tests>
-    </tests>
-
-    <help>
-<![CDATA[
-
-**What it does**
-
-  | The following is a brief description of all options to control the Bismark_methylation extractor. The script reads in a bisulfite read alignment results file produced by the Bismark bisulfite mapper and extracts the methylation information for individual cytosines. This information is found in the methylation call field which can contain the following characters:
-  |
-
-
-  - X = for methylated C in CHG context (was protected)
-  - x = for not methylated C CHG (was converted)
-  - H = for methylated C in CHH context (was protected)
-  - h = for not methylated C in CHH context (was converted)
-  - Z = for methylated C in CpG context (was protected)
-  - z = for not methylated C in CpG context (was converted)
-  - . = for any bases not involving cytosines
-
-  | The methylation extractor outputs result files for cytosines in CpG, CHG and CHH context (this distinction is actually already made in Bismark itself). As the methylation information for every C analysed can produce files which easily have tens or even hundreds of millions of lines, file sizes can become very large and more difficult to handle. The C methylation info additionally splits cytosine methylation calls up into one of the four possible strands a given bisulfite read aligned against:
-  |
-
-  - OT = original top strand
-  - CTOT = complementary to original top strand
-
-  - OB = original bottom strand
-  - CTOB = complementary to original bottom strand
-
-  | Thus, by default twelve individual output files are being generated per input file (unless --comprehensive is specified, see below). The output files can be imported into a genome viewer, such as SeqMonk, and re-combined into a single data group if desired (in fact unless the bisulfite reads were generated preserving directionality it doesn't make any sense to look at the data in a strand-specific manner). Strand-specific output files can optionally be skipped, in which case only three output files for CpG, CHG or CHH context will be generated. For both the strand-specific and comprehensive outputs there is also the option to merge both non-CpG contexts (CHG and CHH) into one single non-CpG context.
-  |
-  | It is developed by Krueger F and Andrews SR. at the Babraham Institute. Krueger F, Andrews SR. (2011) Bismark: a flexible aligner and methylation caller for Bisulfite-Seq applications. Bioinformatics, 27, 1571-2.
-
-.. _Bismark: http://www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-----
-
-**Outputs**
-
-- The output files are in the following format (tab delimited)::
-
-
-      Column  Description
-    --------  --------------------------------------------------------
-        1     seq-ID
-        2     strand
-        3     chromosome
-        4     position
-        5     methylation call
-
-
-- Methylated cytosines receive a '+' orientation,
-- Unmethylated cytosines receive a '-' orientation.
-
-----
-
-**Note on Bismark settings**
-
-  | All of the options have a default value. You can change any of them. If any Bismark function is missing please contact the tool author or your Galaxy admin.
-
-----
-
-**Settings**
-
-* **If Single-End Reads**
-
-  * **Ignore the first N bp from the 5’ end of single-end read when processing the methylation call string.**
-
-      | This can remove e.g. a restriction enzyme site at the start of each read or any other source of bias (e.g. PBAT-Seq data).
-      |
-      | *Input option --ignore <INT>*
-
-  * **Ignore the last N bp from the 3' end of single-end read when processing the methylation call string.**
-
-      | This can remove unwanted biases from the end of reads.
-      |
-      | *Input option --ignore_3prime <INT>* 
-
-* **If Paired-End Reads**
-
-  * **Ignore the first N bp from the 5’ end of Read 1 when processing the methylation call string**
-
-      | This can remove e.g. a restriction enzyme site at the start of each read or any other source of bias (e.g. PBAT-Seq data).
-      |
-      | *Input option --ignore <INT>*
-
-  * **Ignore the last N bp from the 3’ end of Read 1 when processing the methylation call string**
-
-      | This can remove unwanted biases from the end of reads.
-      |
-      | *Input option --ignore_3prime <INT>*
-
-  * **Ignore the first N bp from the 5' end of Read 2 of paired-end sequencing results**
-
-      | Since the first couple of bases in Read 2 of BS-Seq experiments show a severe bias towards non-methylation as a result of end-repairing sonicated fragments with unmethylated cytosines (see M-bias plot), it is recommended that the first couple of bp of Read 2 are removed before starting downstream analysis. Please see the section on M-bias plots in the Bismark User Guide for more details. The options --ignore <int> and --ignore_r2 <int> can be combined in any desired way.
-      |
-      | *Input option --ignore_r2*
-
-  * **Ignore the last N bp from the 3' end of Read 2 of paired-end sequencing results**
-
-      | This can remove unwanted biases from the end of reads.
-      |
-      | *Input option --ignore_3prime_r2*
-
-  * **This option avoids scoring overlapping methylation calls twice, in case of overlapping read one and read two**
-
-      | For paired-end reads it is theoretically possible that read_1 and read_2 overlap. This option avoids scoring overlapping methylation calls twice (only methylation calls of read 1 are used for in the process since read 1 has historically higher quality basecalls than read 2). Whilst this option removes a bias towards more methylation calls in the center of sequenced fragments it may de facto remove a sizable proportion of the data. This option is highly recommended for paired-end data.
-      |
-      | *Input option --no_overlap*
-
-* **Short methylation summary output (Splitting Report)**
-
-    | Prints out a short methylation summary as well as the paramaters used to run this script.
-    |
-    | *Output option --report*
-
-* **Methylation proportion report for each possible position in the read (Mbias Report)**
-
-    | This report shows the methylation proportion across each possible position in the read (described in further detail in:Hansen et al., Genome Biology, 2012, 13:R83). The data for the M-bias plot is also written into a text file and is in the following format:
-    |
-    | <read position> <count methylated> <count unmethylated> <% methylation> <total coverage>
-    |
-    | This allows generating nice graphs by alternative means, e.g. using R or Excel
-
-* **Genome-wide methylation report for all cytosines in the genome**
-
-    | the option --cytosine_report produces a genome-wide methylation report for all cytosines in the genome. 
-
-  * **If CpG Context only**
-
-      | the output uses 1-based chromosome coordinates (zero-based cords are optional) and reports CpG context only (all cytosine context is optional). The output considers all Cs on both forward and reverse strands and reports their position, strand, trinucleotide content and methylation state (counts are 0 if not covered).
-      |
-      | *Genome-wide cytosine methylation report specific option --bedgraph --cytosine_report --genome_folder <path>*
-
-  * **If not CpG Context only**
-
-      | The output file contains information on every single cytosine in the genome irrespective of its context. This applies to both forward and reverse strands. Please be aware that this will generate output files with > 1.1 billion lines for a mammalian genome such as human or mouse. Default: OFF (i.e. Default = CpG context only).
-      |
-      | *Genome-wide cytosine methylation report specific option --bedgraph --CX_context --cytosine_report --CX_context --genome_folder <path>*
-
-* **Merge all four possible strand-specific methylation info into context-dependent output files**
-
-    | Specifying this option will merge all four possible strand-specific methylation info into context-dependent output files. The default contexts are:
-    |  - CpG context
-    |  - CHG context
-    |  - CHH context
-    |
-    | *Output option --comprehensive*
-
-* **Merge all non-CpG contexts into one file**
-
-    | This will produce two output files (in --comprehensive mode) or eight strand-specific output files (default) for Cs in
-    | - CpG context
-    | - non-CpG context
-    |
-    | *Output option --merge_non_CpG*
-
-* **Compress all result files and output one single file**
-
-    | The methylation extractor files (CpG_OT..., CpG_OB... etc) will be written out in a GZIP compressed form to save disk space. This option does not work on bedGraph and genome-wide cytosine reports as they are 'tiny' anyway.
-    |
-    | *Output option --gzip*
-
-]]>
-  </help>
-
-  <citations>
-      <citation type="doi">10.1093/bioinformatics/btr167</citation>
-  </citations>
-</tool>
--- a/bismark_methyl_extractor/coverage2cytosine	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1254 +0,0 @@
-#!/usr/bin/env perl
-use warnings;
-use strict;
-$|++;
-use Getopt::Long;
-use Cwd;
-use Carp;
-
-## This program is Copyright (C) 2010-16, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-my %chromosomes; # storing sequence information of all chromosomes/scaffolds
-my %processed;   # keeping a record of which chromosomes have been processed
-my $coverage2cytosine_version = 'v0.16.3';
-
-my ($output_dir,$genome_folder,$zero,$CpG_only,$CX_context,$split_by_chromosome,$parent_dir,$coverage_infile,$cytosine_out,$merge_CpGs,$gc_context,$gzip,$tetra) = process_commandline();
-
-warn "Summary of parameters for genome-wide cytosine report:\n";
-warn '='x78,"\n";
-warn "Coverage infile:\t\t\t$coverage_infile\n";
-warn "Output directory:\t\t\t>$output_dir<\n";
-warn "Parent directory:\t\t\t>$parent_dir<\n";
-warn "Genome directory:\t\t\t>$genome_folder<\n";
-
-if ($CX_context){
-  warn "CX context:\t\t\t\tyes\n";
-}
-else{
-  warn "CX context:\t\t\t\tno (CpG context only, default)\n";
-}
-if ($merge_CpGs){
-  warn "Pooling CpG top/bottom strand evidence:\tyes\n";
-}
-if($gc_context){
-  warn "Optional GC context track:\t\tyes\n";
-}
-if ($tetra){
-    warn "Tetra/Penta nucleotide context:\t\tyes\n";
-}
-
-if ($zero){
-  warn "Genome coordinates used:\t\t0-based (user specified)\n";
-}
-else{
-  warn "Genome coordinates used:\t\t1-based (default)\n";
-}
-
-if ($gzip){
-    warn "GZIP compression:\t\t\tyes\n";
-}
-else{
-    warn "GZIP compression:\t\t\tno\n";
-}
-
-if ($split_by_chromosome){
-  warn "Split by chromosome:\t\t\tyes\n\n\n";
-}
-else{
-  warn "Split by chromosome:\t\t\tno\n\n\n";
-}
-sleep (3);
-
-read_genome_into_memory();
-warn "Stored sequence information of ",scalar keys %chromosomes," chromosomes/scaffolds in total\n\n";
-
-generate_genome_wide_cytosine_report($coverage_infile);
-
-### 11 December 2014
-
-# The following optional section re-reads the genome-wide report and merges methylation evidence of both top and bottom strand
-# into a single CpG dinucleotide entity. This significantly simplifies downstream processing, e.g. by the bsseq R-/Bioconductor package
-# which recommends this merging process to increase coverage per CpG and reduce the memory burden for its processing
-
-if ($merge_CpGs){
-  # we only allow this operation if the report is limited to CpG context, and for a single report for the entire genome for the time being
-  combine_CpGs_to_single_CG_entity($cytosine_out);
-}
-
-### 18 August 2015
-
-# The following section reprocessed the genome to generate cytosine methylation output in GC context (e.g. when a GpC methylase had been deployed
-if ($gc_context){
-    generate_GC_context_report($coverage_infile);
-}
-
-
-sub combine_CpGs_to_single_CG_entity{
-  my $CpG_report_file = shift;
-  warn "Now merging top and bottom strand CpGs into a single CG dinucleotide entity\n";
-
-  open (IN,$CpG_report_file) or die "Failed to open file $CpG_report_file: $!\n\n";
-  my $pooled_CG = $CpG_report_file;
-  $pooled_CG =~ s/$/.merged_CpG_evidence.cov/;
-  open (OUT,'>',$pooled_CG) or die "Failed to write to file '$pooled_CG': $!\n\n";
-  warn ">>> Writing a new coverage file with top and bottom strand CpG methylation evidence merged to $pooled_CG <<<\n\n";
-  sleep(1);
-
-  while (1){
-    my $line1 = <IN>;
-    my $line2 = <IN>;
-    last unless ($line1 and $line2);
-
-    chomp $line1;
-    chomp $line2;
-
-    my ($chr1,$pos1,$strand1,$m1,$u1,$context1) = (split /\t/,$line1);
-    my ($chr2,$pos2,$strand2,$m2,$u2,$context2) = (split /\t/,$line2);
-    # print join ("\t",$chr1,$pos1,$strand1,$m1,$u1,$context1),"\n";
-    # print join ("\t",$chr2,$pos2,$strand2,$m2,$u2,$context2),"\n"; sleep(1);
-
-    if ($pos1 < 2){
-      $line1 = $line2;
-      $line2 = <IN>;
-      chomp $line2;
-      ($chr1,$pos1,$strand1,$m1,$u1,$context1) = (split /\t/,$line1);
-      ($chr2,$pos2,$strand2,$m2,$u2,$context2) = (split /\t/,$line2);
-    }
-
-    # a few sanity checks
-    die "The context of the first line was not CG:\t$line1"  unless ($context1 eq 'CG');
-    die "The context of the second line was not CG:\t$line2" unless ($context2 eq 'CG');
-
-    unless ($strand1 eq '+' and $strand2 eq'-'){
-      die "The strand of line 1 and line 2 were not + and -:\nline1:\t$line1\nline2:\t$line2\n";
-    }
-    unless ($pos2 eq ($pos1 + 1)){
-      die "The reported position were not spaced 1bp apart:\nline1:\t$line1\nline2:\t$line2\n";
-    }
-    unless($chr1 eq $chr2){
-      die "The chromsome information for line 1 and 2 did not match:\nline1:\t$line1\nline2:\t$line2\n";
-    }
-
-    # This looks alright from what I can tell, lets pool the 2 strands
-
-    my $pooled_m = $m1 + $m2;
-    my $pooled_u = $u1 + $u2;
-
-    # since this is a new coverage file we only write it out if the coverage is at least 1
-    next unless ($pooled_m + $pooled_u) > 0;
-
-    my $pooled_percentage = sprintf ("%.6f",$pooled_m/ ($pooled_m + $pooled_u) *100);
-    # print join ("\t",$chr1,$pos1,$strand1,$m1,$u1,$context1),"\n";
-    # print join ("\t",$chr2,$pos2,$strand2,$m2,$u2,$context2),"\n";
-    # print join ("\t",$chr1,$pos1,$pos2,$pooled_percentage,$pooled_m,$pooled_u),"\n";
-    # sleep(1);
-    print OUT join ("\t",$chr1,$pos1,$pos2,$pooled_percentage,$pooled_m,$pooled_u),"\n";
-  }
-
-  warn "CpG merging complete. Good luck finding DMRs with bsseq!\n\n";
-
-}
-
-
-sub process_commandline{
-  my $help;
-  my $output_dir;
-  my $genome_folder;
-  my $zero;
-  my $CpG_only;
-  my $CX_context;
-  my $gzip;
-
-  my $split_by_chromosome;
-  my $cytosine_out;
-  my $parent_dir;
-  my $version;
-  my $merge_CpGs;
-  my $gc_context;
-  my $tetra;
-
-  my $command_line = GetOptions ('help|man' => \$help,
-				 'dir=s' => \$output_dir,
-				 'g|genome_folder=s' => \$genome_folder,
-				 "zero_based" => \$zero,	
-				 "CX|CX_context" => \$CX_context,
-				 "split_by_chromosome" => \$split_by_chromosome,
-				 'o|output=s' => \$cytosine_out,
-				 'parent_dir=s' => \$parent_dir,
-				 'version' => \$version,
-				 'merge_CpGs' => \$merge_CpGs,
-				 'GC|GC_context' => \$gc_context,
-				 'ff|qq' => \$tetra,
-				 'gzip' => \$gzip,
-      );
-
-  ### EXIT ON ERROR if there were errors with any of the supplied options
-  unless ($command_line){
-      die "Please respecify command line options\n";
-  }
-
-  ### HELPFILE
-  if ($help){
-    print_helpfile();
-    exit;
-  }
-
-  if ($version){
-    print << "VERSION";
-
-
-                      Bismark Methylation Extractor Module -
-                               coverage2cytosine
-
-                      Bismark Extractor Version: $coverage2cytosine_version
-              Copyright 2010-15 Felix Krueger, Babraham Bioinformatics
-                www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-
-VERSION
-    exit;
-  }
-
-  ### no files provided
-  unless (@ARGV){
-    warn "You need to provide a Bismark coverage file (with counts methylated/unmethylated cytosines) to create an individual C methylation output. Please respecify!\n";
-    sleep(2);
-
-    print_helpfile();
-    exit;
-  }
-
-  my $coverage_infile = shift @ARGV;
-
-  unless ($parent_dir){
-    $parent_dir = getcwd();
-  }
-  unless ($parent_dir =~ /\/$/){
-    $parent_dir =~ s/$/\//;
-  }
-
-  unless (defined $cytosine_out){
-    die "Please provide the name of the output file using the option -o/--output filename\n";
-  }
-
-  ### OUTPUT DIR PATH
-  if (defined $output_dir){
-    unless ($output_dir eq ''){ # if the output dir has been passed on by the methylation extractor and is an empty string we don't want to change it
-      unless ($output_dir =~ /\/$/){
-	$output_dir =~ s/$/\//;
-      }
-    }
-  }
-  else{
-    $output_dir = '';
-  }
-
-  unless ($CX_context){
-    $CX_context = 0;
-    $CpG_only = 1;
-  }
-
-  ### GENOME folder
-  if ($genome_folder){
-    unless ($genome_folder =~/\/$/){
-      $genome_folder =~ s/$/\//;
-    }
-  }
-  else{
-    die "Please specify a genome folder to proceed (full path only)\n";
-  }
-
-  if ($merge_CpGs){
-    if ($CX_context){
-      die "Merging individual CpG calls into a single CpG dinucleotide entity is currently only supported if CpG-context is selected only (lose the option --CX)\n";
-    }
-    if ($split_by_chromosome){
-      die "Merging individual CpG calls into a single CpG dinucleotide entity is currently only supported if a single CpG report is written out (lose the option --split_by_chromosome)\n";
-    }
-  }
-
-  return ($output_dir,$genome_folder,$zero,$CpG_only,$CX_context,$split_by_chromosome,$parent_dir,$coverage_infile,$cytosine_out,$merge_CpGs,$gc_context,$gzip,$tetra);
-}
-
-
-
-sub generate_genome_wide_cytosine_report {
-
-  warn  "="x78,"\n";
-  warn "Methylation information will now be written into a genome-wide cytosine report\n";
-  warn  "="x78,"\n\n";
-  sleep (2);
-
-  my $number_processed = 0;
-
-  ### changing to the output directory again
-  unless ($output_dir eq ''){ # default
-    chdir $output_dir or die "Failed to change directory to $output_dir\n";
-    # warn "Changed directory to $output_dir\n";
-  }
-
-  my $in = shift;
-  # infiles handed over by the methylation extractor will be just the filename on their own. The directory should have been handed over with --dir
-  if ($in =~ /gz$/){
-      open (IN,"gunzip -c $in |") or die "Failed to read from gzipped file $in: $!\n"; # changed from gunzip -c to gunzip -c 08 04 16
-  }
-  else{
-      open (IN,"$in") or die "Failed to read from file $in: $!\n";
-  }
-
-
-  ### note: we are still in the folder: $output_dir, so we do not have to include this into the open commands
-  unless ($split_by_chromosome){ ### writing all output to a single file (default)
-      if ($gzip){
-	  unless ($cytosine_out =~ /\.gz$/){
-	      $cytosine_out .= '.gz';
-	  }
-	  open (CYT,"| gzip -c - > $cytosine_out") or die "Failed to write to file $cytosine_out: $!\n";
-      }
-      else{
-	  open (CYT,'>',$cytosine_out) or die "Failed to write to file $cytosine_out: $!\n";
-      }
-      warn ">>> Writing genome-wide cytosine report to: $cytosine_out <<<\n\n";
-      sleep (1);
-  }
-
-  my $last_chr;
-  my %chr; # storing reads for one chromosome at a time
-  
-  my $count = 0;
-  while (<IN>){
-      chomp;
-      ++$count;
-      my ($chr,$start,$end,undef,$meth,$nonmeth) = (split /\t/);
-      
-      # defining the first chromosome
-      unless (defined $last_chr){
-	  $last_chr = $chr;
-	  ++$number_processed;
-	  # warn "Storing all covered cytosine positions for chromosome: $chr\n";
-      }
-      
-      ### As of version 0.9.1 the start positions are 1-based!
-      if ($chr eq $last_chr){
-	  $chr{$chr}->{$start}->{meth} = $meth;
-	  $chr{$chr}->{$start}->{nonmeth} = $nonmeth;
-      }
-      else{
-	  warn "Writing cytosine report for chromosome $last_chr (stored ",scalar keys %{$chr{$last_chr}}," different covered positions)\n";
-	  ++$number_processed;
-	  
-	  if ($split_by_chromosome){ ## writing output to 1 file per chromosome
-	      my $chromosome_out = $cytosine_out;
-	      if ($chromosome_out =~ /\.txt$/){
-		  $chromosome_out =~ s/\.txt$/chr${last_chr}.txt/;
-	      }
-	      else{
-		  $chromosome_out =~ s/$/.chr${last_chr}.txt/;
-	      }
-	      open (CYT,'>',$chromosome_out) or die $!;
-	      # warn "Writing output for $last_chr to $chromosome_out\n";
-	  }
-	  
-	  my $tri_nt;
-	  my $tetra_nt;
-	  my $penta_nt;
-	  my $context;
-
-	  $processed{$last_chr} = 1;
-	  while ( $chromosomes{$last_chr} =~ /([CG])/g){
-	      
-	      $tri_nt = '';
-	      $context = '';
-	      
-	      if ($tetra){
-		  $tetra_nt = ''; # clearing
-		  $penta_nt = '';
-	      }
-	      
-	      my $pos = pos$chromosomes{$last_chr};
-	      
-	      my $strand;
-	      my $meth = 0;
-	      my $nonmeth = 0;
-	      
-	      if ($1 eq 'C'){    # C on forward strand
-		  $tri_nt = substr ($chromosomes{$last_chr},($pos-1),3);   # positions are 0-based!
-		  if ($tetra){
-		      if ( length($chromosomes{$last_chr}) >= ($pos - 1 + 4) ){
-			  $tetra_nt = substr ($chromosomes{$last_chr},($pos-1),4);
-		      }
-		      else{
-			  $tetra_nt = '';
-		      }
-		      if ( length($chromosomes{$last_chr}) >= ($pos - 1 + 5) ){
-			  $penta_nt = substr ($chromosomes{$last_chr},($pos-1),5);
-		      }
-		      else{
-			  $penta_nt = '';
-		      }
-		  }
-		  $strand = '+';
-	      }
-	      elsif ($1 eq 'G'){ # C on reverse strand
-		  
-		  $tri_nt = substr ($chromosomes{$last_chr},($pos-3),3);   # positions are 0-based!
-		  $tri_nt = reverse $tri_nt;
-		  $tri_nt =~ tr/ACTG/TGAC/;
-		  
-		  if ($tetra){
-		      if ( $pos - 4 >= 0 ){
-			  $tetra_nt = substr ($chromosomes{$last_chr},($pos-4),4);
-			  $tetra_nt = reverse $tetra_nt;
-			  $tetra_nt =~ tr/ACTG/TGAC/; 
-		      }
-		      else{
-			  $tetra_nt = '';
-		      }
-		      if ( $pos - 5 >= 0 ){
-			  $penta_nt = substr ($chromosomes{$last_chr},($pos-5),5);
-			  $penta_nt = reverse $penta_nt;
-			  $penta_nt =~ tr/ACTG/TGAC/;
-		      } 
-		      else{
-			  $penta_nt = '';
-		      }
-		  }
-		  $strand = '-';
-	      }
-
-	      next if (length$tri_nt < 3); # trinucleotide sequence could not be extracted
-	      
-	      # if (length$penta_nt < 5){
-	      # warn "$tri_nt\t$tetra_nt\t$penta_nt\n"; sleep(1);		  
-	      # }
-	      
-	      if (exists $chr{$last_chr}->{($pos)}){ # stored positions are 1-based! (as of v0.9.1)
-		  $meth =  $chr{$last_chr}->{$pos}->{meth};
-		  $nonmeth = $chr{$last_chr}->{$pos}->{nonmeth};
-	      }
-	      
-
-	      ### determining cytosine context	
-	      if ($tri_nt =~ /^CG/){
-		  $context = 'CG';
-	      }
-	      elsif ($tri_nt =~ /^C.{1}G$/){
-		  $context = 'CHG';
-	      }
-	      elsif ($tri_nt =~ /^C.{2}$/){
-		  $context = 'CHH';
-	      }
-	      else{ # if the context can't be determined the positions will not be printed (it will equally not have been reported by Bismark)
-		  warn "The sequence context could not be determined (found: '$tri_nt'). Skipping.\n";
-		  next;
-	      }
-
-	      if ($CpG_only){
-		  if ($tri_nt =~ /^CG/){ # CpG context is the default
-		      if ($zero){ # zero based coordinates
-			  $pos -= 1;
-			  if ($tetra){
-			      print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-			  }
-			  else{
-			      print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-			  }
-		      }
-		      else{ # default
-			  if ($tetra){
-			      print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-			  }
-			  else{
-			      print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-			  }
-		      }
-		  }
-	      }
-	      else{ ## all cytosines, specified with --CX
-		  if ($zero){ # zero based coordinates
-		      $pos -= 1;
-		      if ($tetra){
-			  print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-		      }
-		      else{
-			  print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n"
-		      }
-		  }
-		  else{ # default
-		      if ($tetra){
-			  print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-		      }
-		      else{
-			  print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-		      }
-		  }
-	      }
-	  }
-	  
-	  %chr = (); # resetting the hash
-
-	  # new first entry
-	  $last_chr = $chr;
-	  $chr{$chr}->{$start}->{meth} = $meth;
-	  $chr{$chr}->{$start}->{nonmeth} = $nonmeth;
-      }
-  }
-  
-  # Last found chromosome
-  # If there never was a last chromosome then something must have gone wrong with reading the data in
-  unless (defined $last_chr){
-      die "No last chromosome was defined, something must have gone wrong while reading the data in (e.g. specified wrong file path for a gzipped coverage file?). Please check your command!\n\n";
-  }
-
-  warn "Writing cytosine report for last chromosome $last_chr (stored ",scalar keys %{$chr{$last_chr}}," different covered positions)\n";
-  $processed{$last_chr} = 1;
-  
-  if ($split_by_chromosome){ ## writing output to 1 file per chromosome
-      my $chromosome_out = $cytosine_out;
-      if ($chromosome_out =~ /\.txt$/){ # files passed on by the methylation extractor end in _report.txt
-	  $chromosome_out =~ s/\.txt$/chr${last_chr}.txt/;
-      }
-      else{ # user specified output file name
-	  $chromosome_out =~ s/$/.chr${last_chr}.txt/;
-      }
-      open (CYT,'>',$chromosome_out) or die $!;
-      # warn "Writing output for $last_chr to $chromosome_out\n";
-  }
-
-  my $tri_nt;
-  my $tetra_nt;
-  my $penta_nt;
-  my $context;
-  
-  while ( $chromosomes{$last_chr} =~ /([CG])/g){
-      
-      $tri_nt = '';
-      $context = '';
-
-      if ($tetra){
-	  $tetra_nt = '';
-	  $penta_nt = '';
-      }
-      
-      my $pos = pos$chromosomes{$last_chr};
-      
-      my $strand;
-      my $meth = 0;
-      my $nonmeth = 0;
-      
-      if ($1 eq 'C'){    # C on forward strand
-	  $tri_nt = substr ($chromosomes{$last_chr},($pos-1),3);   # positions are 0-based!
-	  $strand = '+';
-
-	  if ($tetra){
-	      if ( length($chromosomes{$last_chr}) >= ($pos - 1 + 4) ){
-		  $tetra_nt = substr ($chromosomes{$last_chr},($pos-1),4);
-	      }
-	      else{
-		  $tetra_nt = '';
-	      }
-	      if ( length($chromosomes{$last_chr}) >= ($pos - 1 + 5) ){
-		  $penta_nt = substr ($chromosomes{$last_chr},($pos-1),5);
-	      }
-	      else{
-		  $penta_nt = '';
-	      }
-	  }
-
-      }
-      elsif ($1 eq 'G'){ # C on reverse strand
-	  $tri_nt = substr ($chromosomes{$last_chr},($pos-3),3);   # positions are 0-based!
-	  $tri_nt = reverse $tri_nt;
-	  $tri_nt =~ tr/ACTG/TGAC/;
-	  $strand = '-';
-
-	  if ($tetra){
-	      if ( $pos - 4 >= 0 ){
-		  $tetra_nt = substr ($chromosomes{$last_chr},($pos-4),4);
-		  $tetra_nt = reverse $tetra_nt;
-		  $tetra_nt =~ tr/ACTG/TGAC/; 
-	      }
-	      else{
-		  $tetra_nt = '';
-	      }
-	  
-	      if ( $pos - 5 >= 0 ){
-		  $penta_nt = substr ($chromosomes{$last_chr},($pos-5),5);
-		  $penta_nt = reverse $penta_nt;
-		  $penta_nt =~ tr/ACTG/TGAC/;
-	      } 
-	      else{
-		  $penta_nt = '';
-	      }
-	  }
-      }
-      
-      if (exists $chr{$last_chr}->{($pos)}){ # stored positions are 1-based! as of v0.9.1
-	  $meth =  $chr{$last_chr}->{$pos}->{meth};
-	  $nonmeth = $chr{$last_chr}->{$pos}->{nonmeth};
-      }
-      
-      next if (length$tri_nt < 3); # trinucleotide sequence could not be extracted
-      # if (length$penta_nt < 5){
-      # warn "$tri_nt\t$tetra_nt\t$penta_nt\n"; sleep(1);		  
-      # }
-	      
-      ### determining cytosine context 
-      if ($tri_nt =~ /^CG/){
-	  $context = 'CG';
-      }
-      elsif ($tri_nt =~ /^C.{1}G$/){
-	  $context = 'CHG';
-      }
-      elsif ($tri_nt =~ /^C.{2}$/){
-	  $context = 'CHH';
-      }
-      else{ # if the context can't be determined the positions will not be printed (it will equally not have been reported by Bismark)
-	  warn "The cytosine context could not be determined (found: '$tri_nt'). Skipping.\n";
-	  next;
-      }
-	
-      if ($CpG_only){
-	  if ($tri_nt =~ /^CG/){ # CpG context is the default
-	      if ($zero){ # zero-based coordinates
-		  $pos -= 1;
-		  if ($tetra){
-		      print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-		  }
-		  else{
-		      print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-		  }
-	      }
-	      else{ # default
-		  if ($tetra){
-		      print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-		  }
-		  else{
-		      print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-		  }
-	      }
-	  }
-      }
-      else{ ## all cytosines, specified with --CX
-	  if ($zero){ # zero based coordinates
-	      $pos -= 1;
-	      if ($tetra){
-		  print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-	      }
-	      else{
-		  print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-	      }
-	  }
-	  else{ # default
-	      if ($tetra){
-		  print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-	      }
-	      else{
-		  print CYT join ("\t",$last_chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-	      }
-	  }
-      }
-  }
-  
-  warn "Finished writing out cytosine report for covered chromosomes (processed $number_processed chromosomes/scaffolds in total)\n\n";
-
-  ### Now processing chromosomes that were not covered in the coverage file
-  warn "Now processing chromosomes that were not covered by any methylation calls in the coverage file...\n";
-  my $unprocessed = 0;
-  
-  foreach my $chr (sort keys %processed) {
-      unless ( $processed{$chr} ) {
-	  ++$unprocessed;
-	  ++$number_processed;
-	  process_unprocessed_chromosomes($chr);
-      }
-  }
-
-  if ($unprocessed == 0) {
-    warn "All chromosomes in the genome were covered by at least some reads. coverage2cytosine processing complete.\n\n";
-  }
-  else{
-    warn "Finished writing out cytosine report (processed $number_processed chromosomes/scaffolds in total). coverage2cytosine processing complete.\n\n";
-  }
-
-  close CYT or warn $!;
-
-}
-
-
-#### GC CONTEXT - optional
-####
-
-sub generate_GC_context_report {
-
-  warn  "="x82,"\n";
-  warn "Methylation information for GC context will now be written to a GpC-context report\n";
-  warn  "="x82,"\n\n";
-  sleep (2);
-
-  my $number_processed = 0;
-
-  ### changing to the output directory again
-  unless ($output_dir eq ''){ # default
-    chdir $output_dir or die "Failed to change directory to $output_dir\n";
-    # warn "Changed directory to $output_dir\n";
-  }
-
-  my $in = shift;
-  if ($in =~ /gz$/){
-    open (IN,"gunzip -c $in |") or die "Failed to read from gzipped file $in: $!\n";
-  }
-  else{
-    open (IN,"$in") or die "Failed to read from file $in: $!\n";
-  }
-
-  my $gc_out = $cytosine_out.'.GpC_report.txt';
-  my $gc_cov = $cytosine_out.'.GpC.cov';
-
-  ### note: we are still in the folder: $output_dir, so we do not have to include this into the open commands
-  open (GC,'>',$gc_out) or die "Failed to write to GpC file $gc_out: !\n\n";
-  warn ">>> Writing genome-wide GpC cytosine report to: $gc_out <<<\n";
-  open (GCCOV,'>',$gc_cov) or die "Failed to write to GpC coverage file $gc_cov: !\n\n";
-  warn ">>> Writing genome-wide GpC coverage file to: $gc_cov <<<\n\n";
-
-  my $last_chr;
-  my %chr; # storing reads for one chromosome at a time
-
-  my $count = 0;
-  while (<IN>){
-    chomp;
-    ++$count;
-    my ($chr,$start,$end,undef,$meth,$nonmeth) = (split /\t/);
-
-    # defining the first chromosome
-    unless (defined $last_chr){
-      $last_chr = $chr;
-      ++$number_processed;
-      # warn "Storing all covered cytosine positions for chromosome: $chr\n";
-    }
-
-    ### start positions are 1-based
-    if ($chr eq $last_chr){
-      $chr{$chr}->{$start}->{meth} = $meth;
-      $chr{$chr}->{$start}->{nonmeth} = $nonmeth;
-    }
-    else{
-      warn "Writing cytosine report for chromosome $last_chr (stored ",scalar keys %{$chr{$last_chr}}," different covered positions)\n";
-      ++$number_processed;
-      $processed{$last_chr} = 1;
-      while ( $chromosomes{$last_chr} =~ /(GC)/g){
-
-	# a GC on the top strand automatically means that there is a GC on the bottom strand as well, so we can process both at the same time
-	my $context_top = '';
-	my $context_bottom = '';
-	my $pos = pos$chromosomes{$last_chr};
-	
-	my $meth_top = 0;
-	my $meth_bottom = 0;
-	my $nonmeth_top = 0;
-	my $nonmeth_bottom = 0;
-	
-	#warn "$1\n"; sleep(1);
-	# C on forward strand
-	my $tri_nt_top = substr ($chromosomes{$last_chr},($pos-1),3);   # positions are 0-based!
-	my $strand_top = '+';
-	
-	# C on reverse strand
-	my $tri_nt_bottom = substr ($chromosomes{$last_chr},($pos-4),3);   # positions are 0-based!
-	$tri_nt_bottom = reverse $tri_nt_bottom;
-	$tri_nt_bottom =~ tr/ACTG/TGAC/;
-	my $strand_bottom = '-';
-	
-	next if (length $tri_nt_top < 3);     # trinucleotide sequence could not be extracted for the top strand
- 	next if (length $tri_nt_bottom < 3);  # trinucleotide sequence could not be extracted for the reverse strand
-
-	# top strand
-	if (exists $chr{$last_chr}->{($pos)}){ # stored positions are 1-based!
-	  $meth_top    = $chr{$last_chr}->{$pos}->{meth};
-	  $nonmeth_top = $chr{$last_chr}->{$pos}->{nonmeth};
-	}
-	# bottom strand
-	if (exists $chr{$last_chr}->{($pos-1)}){ # stored positions are 1-based! -1 for bottom strand Cs
-	  $meth_bottom    = $chr{$last_chr}->{$pos-1}->{meth};
-	  $nonmeth_bottom = $chr{$last_chr}->{$pos-1}->{nonmeth};
-	}	
-	
-	### determining cytosine context top strand	
-	if ($tri_nt_top =~ /^CG/){
-	  $context_top = 'CG';
-	}
-	elsif ($tri_nt_top =~ /^C.{1}G$/){
-	  $context_top = 'CHG';
-	}
-	elsif ($tri_nt_top =~ /^C.{2}$/){
-	  $context_top = 'CHH';
-	}
-	else{ # if the context can't be determined the positions will not be printed (it will equally not have been reported by Bismark)
-	  warn "The sequence context could not be determined for the top strand (found: '$tri_nt_top'). Skipping.\n";
-	  next;
-	}
-	
-	### determining cytosine context bottom strand
-	if ($tri_nt_bottom =~ /^CG/){
-	  $context_bottom = 'CG';
-	}
-	elsif ($tri_nt_bottom =~ /^C.{1}G$/){
-	  $context_bottom = 'CHG';
-	}
-	elsif ($tri_nt_bottom =~ /^C.{2}$/){
-	  $context_bottom = 'CHH';
-	}
-	else{ # if the context can't be determined the positions will not be printed
-	  warn "The sequence context could not be determined for the bottom strand (found: '$tri_nt_bottom'). Skipping.\n";
-	  next;
-	}
-
-	# if Cs were not covered at all they are not written out
-	unless ($meth_bottom + $nonmeth_bottom == 0){
-	  my $percentage = sprintf ("%.6f",$meth_bottom/ ($meth_bottom + $nonmeth_bottom) *100);
-	  print GCCOV join ("\t",$last_chr,$pos-1,$pos-1,$percentage,$meth_bottom,$nonmeth_bottom),"\n";
-	  print GC join ("\t",$last_chr,$pos-1,$strand_bottom,$meth_bottom,$nonmeth_bottom,$context_bottom,$tri_nt_bottom),"\n";
-	}
-	unless ($meth_top + $nonmeth_top == 0){
-	  my $percentage = sprintf ("%.6f",$meth_top/ ($meth_top + $nonmeth_top) *100);
-	  print GCCOV join ("\t",$last_chr,$pos,$pos,$percentage,$meth_top,$nonmeth_top),"\n";
-	  print GC join ("\t",$last_chr,$pos,$strand_top,$meth_top,$nonmeth_top,$context_top,$tri_nt_top),"\n";
-	}	
-	
-      }
-
-      %chr = (); # resetting the hash
-
-      # new first entry
-      $last_chr = $chr;
-      $chr{$chr}->{$start}->{meth} = $meth;
-      $chr{$chr}->{$start}->{nonmeth} = $nonmeth;
-    }
-  }
-
-  # Last found chromosome
-  warn "Writing cytosine GpC report for last chromosome $last_chr (stored ",scalar keys %{$chr{$last_chr}}," different covered positions)\n";
-  $processed{$last_chr} = 1;
-  while ( $chromosomes{$last_chr} =~ /(GC)/g){
-
-    # a GC on the top strand automatically means that there is a GC on the bottom strand as well, so we can process both at the same time
-    my $context_top = '';
-    my $context_bottom = '';
-    my $pos = pos$chromosomes{$last_chr};
-
-    my $meth_top = 0;
-    my $meth_bottom = 0;
-    my $nonmeth_top = 0;
-    my $nonmeth_bottom = 0;
-
-    # C on forward strand
-    my $tri_nt_top = substr ($chromosomes{$last_chr},($pos-1),3);   # positions are 0-based!
-    my $strand_top = '+';
-	
-    # C on reverse strand
-    my $tri_nt_bottom = substr ($chromosomes{$last_chr},($pos-4),3);   # positions are 0-based!
-    $tri_nt_bottom = reverse $tri_nt_bottom;
-    $tri_nt_bottom =~ tr/ACTG/TGAC/;
-    my $strand_bottom = '-';
-	
-    next if (length $tri_nt_top < 3);     # trinucleotide sequence could not be extracted for the top strand
-    next if (length $tri_nt_bottom < 3);  # trinucleotide sequence could not be extracted for the bottom strand
-
-    ### determining cytosine context top strand	
-    if ($tri_nt_top =~ /^CG/){
-      $context_top = 'CG';
-    }
-    elsif ($tri_nt_top =~ /^C.{1}G$/){
-      $context_top = 'CHG';
-    }
-    elsif ($tri_nt_top =~ /^C.{2}$/){
-      $context_top = 'CHH';
-    }
-    else{ # if the context can't be determined the positions will not be printed
-      warn "The sequence context could not be determined for the top strand (found: '$tri_nt_top'). Skipping.\n";
-      next;
-    }
-
-    ### determining cytosine context bottom strand
-    if ($tri_nt_bottom =~ /^CG/){
-      $context_bottom = 'CG';
-    }
-    elsif ($tri_nt_bottom =~ /^C.{1}G$/){
-      $context_bottom = 'CHG';
-    }
-    elsif ($tri_nt_bottom =~ /^C.{2}$/){
-      $context_bottom = 'CHH';
-    }
-    else{ # if the context can't be determined the positions will not be printed
-      warn "The sequence context could not be determined for the bottom strand (found: '$tri_nt_bottom'). Skipping.\n";
-      next;
-    }
-
-    # top strand
-    if (exists $chr{$last_chr}->{($pos)}){ # stored positions are 1-based!
-      $meth_top    = $chr{$last_chr}->{$pos}->{meth};
-      $nonmeth_top = $chr{$last_chr}->{$pos}->{nonmeth};
-    }
-    # bottom strand
-    if (exists $chr{$last_chr}->{($pos-1)}){ # stored positions are 1-based! -1 for bottom strand Cs
-      $meth_bottom    = $chr{$last_chr}->{$pos-1}->{meth};
-      $nonmeth_bottom = $chr{$last_chr}->{$pos-1}->{nonmeth};
-    }
-
-    # if Cs were not covered at all they are not written out
-    unless ($meth_bottom + $nonmeth_bottom == 0){
-      my $percentage = sprintf ("%.6f",$meth_bottom/ ($meth_bottom + $nonmeth_bottom) *100);
-      print GCCOV join ("\t",$last_chr,$pos-1,$pos-1,$percentage,$meth_bottom,$nonmeth_bottom),"\n";
-      print GC join ("\t",$last_chr,$pos-1,$strand_bottom,$meth_bottom,$nonmeth_bottom,$context_bottom,$tri_nt_bottom),"\n";
-    }
-    unless ($meth_top + $nonmeth_top == 0){
-      my $percentage = sprintf ("%.6f",$meth_top/ ($meth_top + $nonmeth_top) *100);
-      print GCCOV join ("\t",$last_chr,$pos,$pos,$percentage,$meth_top,$nonmeth_top),"\n";
-      print GC join ("\t",$last_chr,$pos,$strand_top,$meth_top,$nonmeth_top,$context_top,$tri_nt_top),"\n";
-    }
-  }
-
-  warn "Finished writing out GpC cytosine report for covered chromosomes (processed $number_processed chromosomes/scaffolds in total)\n\n";
-
-  close GC or warn $!;
-
-}
-
-####
-####
-
-
-sub process_unprocessed_chromosomes{
-
-  my $chr = shift;
-
-  warn "Writing cytosine report for not covered chromosome $chr\n";
-  $processed{$chr} = 1;
-
-  if ($split_by_chromosome){ ## writing output to 1 file per chromosome
-    my $chromosome_out = $cytosine_out;
-    if ($chromosome_out =~ /txt$/){ # files passed on by the methylation extractor end in _report.txt
-	$chromosome_out =~ s/txt$/chr${chr}.txt/;
-    }
-    else{ # user specified output file name
-	$chromosome_out =~ s/$/.chr${chr}.txt/;
-    }
-    
-    open (CYT,'>',$chromosome_out) or die $!;
-    # warn "Writing output for $last_chr to $chromosome_out\n";
-  }
-  
-  my $tri_nt;
-  my $tetra_nt;
-  my $penta_nt;
-  my $context;
-  
-  while ( $chromosomes{$chr} =~ /([CG])/g){
-
-      $tri_nt = '';
-      $context = '';
-      if ($tetra){
-	  $tetra_nt = ''; # clearing
-	  $penta_nt = '';
-      }
-      
-      my $pos = pos$chromosomes{$chr};
-      
-      my $strand;
-      my $meth = 0;
-      my $nonmeth = 0;
-      
-      if ($1 eq 'C'){    # C on forward strand
-	  $tri_nt = substr ($chromosomes{$chr},($pos-1),3);   # positions are 0-based!
-	  $strand = '+';
-	  if ($tetra){
-	      if ( length($chromosomes{$chr}) >= ($pos - 1 + 4) ){
-		  $tetra_nt = substr ($chromosomes{$chr},($pos-1),4);
-	      }
-	      else{
-		  $tetra_nt = '';
-	      }
-	      if ( length($chromosomes{$chr}) >= ($pos - 1 + 5) ){
-		  $penta_nt = substr ($chromosomes{$chr},($pos-1),5);
-	      }
-	      else{
-		  $penta_nt = '';
-	      }
-	  }
-      }
-      elsif ($1 eq 'G'){ # C on reverse strand
-	  $tri_nt = substr ($chromosomes{$chr},($pos-3),3);   # positions are 0-based!
-	  $tri_nt = reverse $tri_nt;
-	  $tri_nt =~ tr/ACTG/TGAC/;
-	  $strand = '-';
-	  
-	  if ($tetra){
-	      if ( $pos - 4 >= 0 ){
-		  $tetra_nt = substr ($chromosomes{$chr},($pos-4),4);
-		  $tetra_nt = reverse $tetra_nt;
-		  $tetra_nt =~ tr/ACTG/TGAC/; 
-	      }
-	      else{
-		  $tetra_nt = '';
-	      }
-	      if ( $pos - 5 >= 0 ){
-		  $penta_nt = substr ($chromosomes{$chr},($pos-5),5);
-		  $penta_nt = reverse $penta_nt;
-		  $penta_nt =~ tr/ACTG/TGAC/;
-	      } 
-	      else{
-		  $penta_nt = '';
-	      }
-	  }
-	  $strand = '-';
-      }
-      
-      next if (length$tri_nt < 3); # trinucleotide sequence could not be extracted
-
-      ### determining cytosine context	
-      if ($tri_nt =~ /^CG/){
-	  $context = 'CG';
-      }
-      elsif ($tri_nt =~ /^C.{1}G$/){
-	  $context = 'CHG';
-      }
-      elsif ($tri_nt =~ /^C.{2}$/){
-	  $context = 'CHH';
-      }
-      else{ # if the context can't be determined the positions will not be printed (it will equally not have been reported by Bismark)
-	  warn "The cytosine context could not be determined (found: '$tri_nt'). Skipping.\n";
-	  next;
-      }
-      
-      if ($CpG_only){
-	  if ($tri_nt =~ /^CG/){ # CpG context is the default
-	      if ($zero){ # zero-based coordinates
-		  $pos -= 1;
-		  if ($tetra){
-		      print CYT join ("\t",$chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-		  }
-		  else{
-		      print CYT join ("\t",$chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-		  }
-	      }
-	      else{ # default
-		  if ($tetra){
-		      print CYT join ("\t",$chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-		  }
-		  else{
-		      print CYT join ("\t",$chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-		  }
-	      }
-	  }
-      }
-      else{ ## all cytosines, specified with --CX
-	  if ($zero){ # zero based coordinates
-	      $pos -= 1;
-	      if ($tetra){
-		  print CYT join ("\t",$chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-	      }
-	      else{
-		  print CYT join ("\t",$chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-	      }
-	  }
-	  else{ # default
-	      if ($tetra){
-		  print CYT join ("\t",$chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt,$tetra_nt,$penta_nt),"\n";
-	      }
-	      else{
-		  print CYT join ("\t",$chr,$pos,$strand,$meth,$nonmeth,$context,$tri_nt),"\n";
-	      }
-	  }
-      }
-  }
-
-  #  close CYT or warn $!;
-
-}
-
-
-sub read_genome_into_memory{
-
-  ## reading in and storing the specified genome in the %chromosomes hash
-  chdir ($genome_folder) or die "Can't move to $genome_folder: $!";
-  warn "Now reading in and storing sequence information of the genome specified in: $genome_folder\n\n";
-
-  my @chromosome_filenames =  <*.fa>;
-
-  ### if there aren't any genomic files with the extension .fa we will look for files with the extension .fasta
-  unless (@chromosome_filenames){
-    @chromosome_filenames =  <*.fasta>;
-  }
-  unless (@chromosome_filenames){
-    die "The specified genome folder $genome_folder does not contain any sequence files in FastA format (with .fa or .fasta file extensions)\n";
-  }
-
-  foreach my $chromosome_filename (@chromosome_filenames){
-
-    # skipping the tophat entire mouse genome fasta file
-    next if ($chromosome_filename eq 'Mus_musculus.NCBIM37.fa');
-
-    open (CHR_IN,$chromosome_filename) or die "Failed to read from sequence file $chromosome_filename $!\n";
-    ### first line needs to be a fastA header
-    my $first_line = <CHR_IN>;
-    chomp $first_line;
-    $first_line =~ s/\r//; # removing /r carriage returns
-
-    ### Extracting chromosome name from the FastA header
-    my $chromosome_name = extract_chromosome_name($first_line);
-	
-    my $sequence;
-    while (<CHR_IN>){
-      chomp;
-      $_ =~ s/\r//; # removing /r carriage returns
-
-      if ($_ =~ /^>/){
-	### storing the previous chromosome in the %chromosomes hash, only relevant for Multi-Fasta-Files (MFA)
-	if (exists $chromosomes{$chromosome_name}){
-	  warn "chr $chromosome_name (",length $sequence ," bp)\n";
-	  die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name!\n";
-	}
-	else {
-	  if (length($sequence) == 0){
-	    warn "Chromosome $chromosome_name in the multi-fasta file $chromosome_filename did not contain any sequence information!\n";
-	  }
-	  warn "chr $chromosome_name (",length $sequence ," bp)\n";
-	  $chromosomes{$chromosome_name} = $sequence;
-	  $processed{$chromosome_name} = 0; # processed chromosomes will be set to 1 later to allow a record of which chromosome has been processed
-	}
-	### resetting the sequence variable
-	$sequence = '';
-	### setting new chromosome name
-	$chromosome_name = extract_chromosome_name($_);
-      }
-      else{
-	$sequence .= uc$_;
-      }
-    }
-
-    if (exists $chromosomes{$chromosome_name}){
-      warn "chr $chromosome_name (",length $sequence ," bp)\t";
-      die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name.\n";
-    }
-    else{
-      if (length($sequence) == 0){
-	warn "Chromosome $chromosome_name in the file $chromosome_filename did not contain any sequence information!\n";
-      }
-      warn "chr $chromosome_name (",length $sequence ," bp)\n";
-      $chromosomes{$chromosome_name} = $sequence;
-      $processed{$chromosome_name} = 0; # processed chromosomes will be set to 1 later to allow a record of which chromosome has been processed
-    }
-  }
-  warn "\n";
-  chdir $parent_dir or die "Failed to move to directory $parent_dir\n";
-}
-
-sub extract_chromosome_name {
-  ## Bowtie extracts the first string after the inition > in the FASTA file, so we are doing this as well
-  my $fasta_header = shift;
-  if ($fasta_header =~ s/^>//){
-    my ($chromosome_name) = split (/\s+/,$fasta_header);
-    return $chromosome_name;
-  }
-  else{
-    die "The specified chromosome ($fasta_header) file doesn't seem to be in FASTA format as required!\n";
-  }
-}
-
-
-sub print_helpfile{
-
-  warn <<EOF
-
-  SYNOPSIS:
-
-  This script generates a cytosine methylation report for a genome of interest and a sorted methylation input file produced
-  by the script "bismark2bedGraph". By default, the output uses 1-based chromosome coordinates and reports CpG positions only
-  (for both strands individually and not merged in any way). Coordinates may be changed to 0-based using the option '--zero_based'.
-
-  The input file needs to have been generated with the script bismark2bedGraph (the file is called *.cov) or otherwise be
-  sorted by position and exactly in the following format:
-
-  <chromosome>  <start position>  <end position>  <methylation percentage>  <count methylated>  <count unmethylated>
-
-  The coordinates of the input file are expected to be 1-based throughout (do not use files ending in .zero.cov!).
-
-
-  USAGE: coverage2cytosine [options] --genome_folder <path> -o <output> [input]
-
-
--o/--output <filename>   Name of the output file, mandatory.
-
---dir                    Output directory. Output is written to the current directory if not specified explicitly.
-
---genome_folder <path>   Enter the genome folder you wish to use to extract sequences from (full path only). Accepted
-                         formats are FastA files ending with '.fa' or '.fasta'. Specifying a genome folder path is mandatory.
-
--CX/--CX_context         The output file contains information on every single cytosine in the genome irrespective of
-                         its context. This applies to both forward and reverse strands. Please be aware that this will
-                         generate output files with > 1.1 billion lines for a mammalian genome such as human or mouse.
-                         Default: OFF (i.e. Default = CpG context only).
-
---merge_CpG              Using this option will post-process the genome-wide report to write out an additional coverage
-                         file (see above for the coverage file format) which has the top and bottom strand methylation
-                         evidence pooled into a single CpG dinucleotide entity. This may be the desirable input format
-                         for some downstream processing tools such as the R-package bsseq (by K.D. Hansen). An example would be:
-
-			   genome-wide CpG report (old)
-			   gi|9626372|ref|NC_001422.1|     157     +       313     156     CG
-			   gi|9626372|ref|NC_001422.1|     158     -       335     156     CG
-			   merged CpG evidence coverage file (new)
-			   gi|9626372|ref|NC_001422.1|     157     158     67.500000       648     312
-
-			 This option is currently experimental, and only works if CpG context only and a single genome-wide report
-                         were specified (i.e. it doesn't work with the options --CX or --split_by_chromosome).
-
---gc/--gc_context        In addition to normal processing this option will reprocess the genome to find methylation in 
-                         GpC context. This might be useful for specialist applications where GpC methylases had been
-                         deployed. The output format is exactly the same as for the normal cytosine report, and only
-                         positions covered by at least one read are reported (output file ends in .GpC_report.txt). In addition
-                         this will write out a Bismark coverage file (ending in GpC.cov).
-
---ff                     In addition to the standard output selecting --ff will also extract a four and five (tetra/penta)
-                         nucleotide context for the cytosines in question. Too short sequences (e.g. at the edges of the
-                         chromosome) will be left blank; sequences containing Ns are ignored.
-
---zero_based             Uses 0-based coordinates instead of 1-based coordinates throughout. Default: OFF.
-
---split_by_chromosome    Writes the output into individual files for each chromosome instead of a single output file. Files
-                         will be named to include the input filename and the chromosome number.
-
---gzip                   Output file will be GZIP compressed (ending in .gz). Only works for standard CpG- and CX-output.
- 
---help                   Displays this help message and exits
-
-
-
-OUTPUT FORMAT:
-
-The genome-wide cytosine methylation output file is tab-delimited in the following format (1-based coords):
-===========================================================================================================
-
-<chromosome>  <position>  <strand>  <count methylated>  <count non-methylated>  <C-context>  <trinucleotide context>
-
-
-                              Script last modified: 04 April 2016
-
-EOF
-    ;
-  exit 1;
-}
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bismark_methylation_extractor.py	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,171 @@
+#!/usr/bin/env python
+
+import argparse
+import logging
+import math
+import os
+import re
+import shutil
+import subprocess
+import sys
+import tempfile
+import zipfile
+from glob import glob
+
+
+def stop_err(logger, msg):
+    logger.critical(msg)
+    sys.exit(1)
+
+
+def log_subprocess_output(logger, pipe):
+    for line in iter(pipe.readline, b''):
+        logger.debug(line.decode().rstrip())
+
+
+def zipper(dir, zip_file):
+    output_files_regex = re.compile('^(Non_)?C[pH][GH]_.*')
+    bedgraph_regex = re.compile('.*bedGraph.gz')
+    zip = zipfile.ZipFile(zip_file, 'w', compression=zipfile.ZIP_DEFLATED)
+    root_len = len(os.path.abspath(dir))
+    for root, dirs, files in os.walk(dir):
+        archive_root = os.path.abspath(root)[root_len:]
+        for f in files:
+            if re.search(output_files_regex, f) or re.search(bedgraph_regex, f):
+                fullpath = os.path.join(root, f)
+                archive_name = os.path.join(archive_root, f)
+                zip.write(fullpath, archive_name, zipfile.ZIP_DEFLATED)
+    zip.close()
+    return zip_file
+
+
+def build_genome_dir(genome_file):
+    tmp_genome_dir = tempfile.mkdtemp(prefix='tmp')
+    genome_path = os.path.join(tmp_genome_dir, '.'.join(os.path.split(genome_file)[1].split('.')[:-1]))
+    try:
+        # Create a hard link pointing to genome_file named 'genome_path'.fa.
+        os.symlink(genome_file, genome_path + '.fa')
+    except Exception as e:
+        if os.path.exists(tmp_genome_dir):
+            shutil.rmtree(tmp_genome_dir)
+        stop_err('Error in linking the reference database!\n%s' % e)
+    return tmp_genome_dir
+
+
+def __main__():
+    # Parse Command Line
+    parser = argparse.ArgumentParser(description='Wrapper for the bismark methylation caller.')
+
+    # input options
+    parser.add_argument('--infile', help='Input file in SAM or BAM format.')
+    parser.add_argument('--single-end', dest='single_end', action="store_true")
+    parser.add_argument('--paired-end', dest='paired_end', action="store_true")
+
+    parser.add_argument('--multicore', dest='multicore', type=int, default=1)
+    parser.add_argument('--splitting_report', dest='splitting_report')
+    parser.add_argument('--mbias_report', dest='mbias_report')
+    parser.add_argument('--cytosine_report', dest="cytosine_report")
+    parser.add_argument('--genome_file', dest="genome_file")
+    parser.add_argument('--cx_context', action="store_true")
+
+    parser.add_argument('--comprehensive', action="store_true")
+    parser.add_argument('--merge-non-cpg', dest='merge_non_cpg', action="store_true")
+    parser.add_argument('--no-overlap', dest='no_overlap', action="store_true")
+    parser.add_argument('--compress', dest='compress')
+    parser.add_argument('--ignore', dest='ignore', type=int)
+    parser.add_argument('--ignore_r2', dest='ignore_r2', type=int)
+    parser.add_argument('--ignore_3prime', dest='ignore_3prime', type=int)
+    parser.add_argument('--ignore_3prime_r2', dest='ignore_3prime_r2', type=int)
+    parser.add_argument('--log_report', dest='log_report', metavar='log_filename', type=str)
+    args = parser.parse_args()
+
+    logger = logging.getLogger('bismark_methylation_extractor_wrapper')
+    logger.setLevel(logging.DEBUG)
+    ch = logging.StreamHandler(sys.stdout)
+    if args.log_report:
+        ch.setLevel(logging.WARNING)
+        handler = logging.FileHandler(args.log_report)
+        handler.setLevel(logging.DEBUG)
+        logger.addHandler(handler)
+    else:
+        ch.setLevel(logging.DEBUG)
+    logger.addHandler(ch)
+
+    # Build methylation extractor command
+    output_dir = tempfile.mkdtemp()
+    cmd = ['bismark_methylation_extractor', '--no_header', '-o', output_dir]
+    # Set up all options
+    if args.multicore > 3:
+        # divide multicore by 3 here since bismark will spawn ~3 jobs.
+        cmd.extend(['--multicore', str(math.ceil(args.multicore / 3))])
+    if args.single_end:
+        cmd.append('--single-end')
+    else:
+        cmd.append('--paired-end')
+    if args.no_overlap:
+        cmd.append('--no_overlap')
+    if args.ignore:
+        cmd.extend(['--ignore', str(args.ignore)])
+    if args.ignore_r2:
+        cmd.extend(['--ignore_r2', str(args.ignore_r2)])
+    if args.ignore_3prime:
+        cmd.extend(['--ignore_3prime', str(args.ignore_3prime)])
+    if args.ignore_3prime_r2:
+        cmd.extend(['--ignore_3prime_r2', str(args.ignore_3prime_r2)])
+    if args.comprehensive:
+        cmd.append('--comprehensive')
+    if args.merge_non_cpg:
+        cmd.append('--merge_non_CpG')
+    if args.splitting_report:
+        cmd.append('--report')
+    tmp_genome_dir = None
+    if args.cytosine_report:
+        tmp_genome_dir = build_genome_dir(args.genome_file)
+        if args.cx_context:
+            cmd.extend(
+                ['--bedGraph', '--CX_context', '--cytosine_report', '--CX_context', '--genome_folder', tmp_genome_dir])
+        else:
+            cmd.extend(['--bedGraph', '--cytosine_report', '--genome_folder', tmp_genome_dir])
+
+    cmd.append(args.infile)
+
+    # Run
+    logger.info("Methylation extractor run with: '%s'", " ".join(cmd))
+    prev_dir = os.getcwd()
+    os.chdir(output_dir) # needed due to a bug in bismark where the coverage file cannot be found
+    process = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+    with process.stdout:
+        log_subprocess_output(logger, process.stdout)
+    exitcode = process.wait()
+    if exitcode != 0:
+        stop_err(logger, "Bismark methylation extractor error (also check the log file if any)!\n%s" % process.stderr)
+    logger.info("Finished methylation extractor.")
+    # collect and copy output files
+    logger.debug("Zip output files to '%s'.", args.compress)
+    os.chdir(prev_dir)
+    zipper(output_dir, args.compress)
+
+    # cytosine report
+    if args.cytosine_report:
+        logger.debug("Collecting cytosine report.")
+        if args.cx_context:
+            shutil.move(glob(os.path.join(output_dir, '*CX_report.txt'))[0], args.cytosine_report)
+        else:
+            shutil.move(glob(os.path.join(output_dir, '*CpG_report.txt'))[0], args.cytosine_report)
+    # splitting report
+    if args.splitting_report:
+        logger.debug("Collecting splitting report.")
+        shutil.move(glob(os.path.join(output_dir, '*_splitting_report.txt'))[0], args.splitting_report)
+    if args.mbias_report:
+        logger.debug("Collecting M-Bias file.")
+        shutil.move(glob(os.path.join(output_dir, '*M-bias.txt'))[0], args.mbias_report)
+
+    # Clean up temp dirs
+    logger.debug("Cleanup temp dirs.")
+    if os.path.exists(output_dir):
+        shutil.rmtree(output_dir)
+    if tmp_genome_dir and os.path.exists(tmp_genome_dir):
+        shutil.rmtree(tmp_genome_dir)
+    logger.info("Done.")
+
+if __name__ == "__main__": __main__()
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bismark_methylation_extractor.xml	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,355 @@
+<tool id="bismark_methylation_extractor" name="Bismark Meth. Extractor" version="0.20.0" profile="18.01">
+    <description>Reports on methylation status of reads mapped by Bismark</description>
+    <requirements>
+        <requirement type="package" version="0.20.0">bismark</requirement>
+        <requirement type="package" version="1.8">samtools</requirement>
+        <requirement type="package" version="2.3.4.2">bowtie2</requirement>
+    </requirements>
+    <command><![CDATA[
+        python '$__tool_directory__/bismark_methylation_extractor.py'
+
+        --multicore "\${GALAXY_SLOTS:-4}"
+
+        --infile '$input'
+
+        #if $singlePaired.sPaired == "single":
+            --single-end
+        #else:
+            --paired-end
+            $singlePaired.no_overlap
+        #end if
+
+        #if str( $singlePaired['ignore_r1'] ) != "0":
+          --ignore $singlePaired['ignore_r1']
+        #end if
+        #if str( $singlePaired['ignore_3prime_r1'] ) != "0":
+          --ignore_3prime $singlePaired['ignore_3prime_r1']
+        #end if
+
+        #if $singlePaired.sPaired == "paired":
+          #if str( $singlePaired['ignore_r2'] ) != "0":
+            --ignore_r2 $singlePaired['ignore_r2']
+          #end if
+          #if str( $singlePaired['ignore_3prime_r2'] ) != "0":
+            --ignore_3prime_r2 $singlePaired['ignore_3prime_r2']
+          #end if
+        #end if
+
+        #if $splitting_report:
+            --splitting_report '$output_splitting_report'
+        #end if
+
+        #if $mbias_report:
+          --mbias_report '$output_mbias_report'
+        #end if
+
+        #if $cytosine_report['cytosine_report_selector']:
+          --cytosine_report '$output_cytosine_report'
+          #if $cytosine_report.refGenomeSource.genomeSource == "built_in_fasta":
+            --genome_file '{cytosine_report.refGenomeSource.built_in_fasta.fields.path}'
+          #else:
+            --genome_file '$cytosine_report.refGenomeSource["own_file"]'
+          #end if
+          #if not $cytosine_report['cpg_context']:
+            --cx_context
+          #end if
+        #end if
+
+        #if $output_settings['comprehensive']:
+            --comprehensive
+        #end if
+
+        #if $output_settings['merge_non_cpg']:
+            --merge-non-cpg
+        #end if
+
+        --compress '$compressed_output'
+
+        #if $output_settings['separate_logfile']:
+           --log_report '$log_report'
+        #end if
+]]>
+    </command>
+    <inputs>
+        <!-- Input Parameters -->
+        <param name="input" type="data" format="qname_input_sorted.bam,bam,sam" label="SAM/BAM file from Bismark bisulfite mapper"/>
+        <conditional name="singlePaired">
+            <param name="sPaired" type="select" label="Is this library mate-paired?">
+                <option value="single">Single-end</option>
+                <option value="paired">Paired-end</option>
+            </param>
+            <when value="single">
+                <param name="ignore_r1" type="integer" value="0"
+                       label="Ignore the first N bp from the 5’ end of single-end read when processing the methylation call string."/>
+                <param name="ignore_3prime_r1" type="integer" value="0"
+                       label="Ignore the last N bp from the 3' end of single-end read when processing the methylation call string."/>
+            </when>
+            <when value="paired">
+                <param name="ignore_r1" type="integer" value="0"
+                       label="Ignore the first N bp from the 5’ end of Read 1 when processing the methylation call string."/>
+                <param name="ignore_3prime_r1" type="integer" value="0"
+                       label="Ignore the last N bp from the 3' end of Read 1 when processing the methylation call string."/>
+                <param name="ignore_r2" type="integer" value="0"
+                       label="Ignore the first N bp from the 5' end of Read 2 of paired-end sequencing results"/>
+                <param name="ignore_3prime_r2" type="integer" value="0"
+                       label="Ignore the last N bp from the 3' end of Read 2 of paired-end sequencing results"/>
+                <param name="no_overlap" type="boolean" truevalue="--no-overlap" falsevalue="" checked="False"
+                       label="This option avoids scoring overlapping methylation calls twice, in case of overlapping read one and read two"
+                       help=""/>
+            </when>
+        </conditional>
+        <param name="splitting_report" type="boolean" truevalue="true" falsevalue="false" checked="True"
+               label="Short methylation summary output (Splitting Report)"/>
+        <param name="mbias_report" type="boolean" truevalue="true" falsevalue="false" checked="True"
+               label="Methylation proportion report for each possible position in the read (Mbias Report)"/>
+        <conditional name="cytosine_report">
+            <param name="cytosine_report_selector" type="boolean" truevalue="true" falsevalue="false" checked="True"
+                   label="Genome-wide methylation report for all cytosines in the genome (Cytosine Report)"/>
+            <when value="true">
+                <conditional name="refGenomeSource">
+                    <param name="genomeSource" type="select"
+                           label="Will you select a reference genome from your history or use a built-in index?"
+                           help="Built-ins were indexed using default options">
+                        <option value="built_in_fasta">From built-in Reference Genome (fasta)</option>
+                        <option value="history">From Genome (fasta) in your Galaxy history</option>
+                    </param>
+                    <when value="built_in_fasta">
+                        <param name="built_in_fasta" type="select" label="Select Reference Genome (fasta)">
+                            <options from_data_table="all_fasta">
+                                <filter type="sort_by" column="name"/>
+                                <validator type="no_options"
+                                           message="No genomes in fasta are available for the selected input dataset"/>
+                            </options>
+                        </param>
+                    </when>
+                    <when value="history">
+                        <param name="own_file" type="data" format="fasta" label="Select the reference genome"/>
+                    </when>
+                </conditional>
+                <param name="cpg_context" type="boolean" truevalue="true" falsevalue="false" checked="False"
+                       label="Reports Cpg Context only"/>
+            </when>
+            <when value="false"></when>
+        </conditional>
+        <section name="output_settings" title="Advanced output settings" expanded="False">
+            <param name="comprehensive" type="boolean" truevalue="true" falsevalue="false" checked="True"
+                   label="Merge all four possible strand-specific methylation info into context-dependent output files" help=""/>
+            <param name="merge_non_cpg" type="boolean" truevalue="true" falsevalue="false" checked="False"
+                   label="Merge all non-CpG contexts into one file"
+                   help="This will produce eight strand-specific output files, or two output files in comprehensive mode."/>
+            <param name="separate_logfile" type="boolean" truevalue="true" falsevalue="false" checked="False"
+                   label="Create a separate logfile, otherwise logs are added to the dataset info."/>
+        </section>
+    </inputs>
+    <outputs>
+        <!--
+            OT – original top strand
+            CTOT – complementary to original top strand
+            OB – original bottom strand
+            CTOB – complementary to original bottom strand
+        -->
+        <data format="tabular" name="output_splitting_report" label="${tool.name} on ${on_string}: Splitting Report">
+            <filter>( splitting_report is True )</filter>
+        </data>
+        <data format="txt" name="output_mbias_report" label="${tool.name} on ${on_string}: Mbias Report">
+            <filter>( mbias_report is True )</filter>
+        </data>
+        <data format="txt" name="output_cytosine_report"
+              label="${tool.name} on ${on_string}: Genome-wide methylation report.">
+            <filter>( cytosine_report['cytosine_report_selector'] )</filter>
+        </data>
+        <data format="zip" name="compressed_output" label="${tool.name} on ${on_string}: Result archive."/>
+        <data name="log_report" format="txt" label="${tool.name} on ${on_string}: log report (tool stdout)">
+            <filter>( output_settings['separate_logfile'] is True )</filter>
+        </data>
+    </outputs>
+    <tests>
+        <test>
+            <param name="input" value="mapped_reads.bam" ftype="qname_sorted.bam"/>
+            <param name="sPaired" value="single"/>
+            <param name="cytosine_report_selector" value="true"/>
+            <param name="genomeSource" value="history"/>
+            <param name="own_file" value="mm10.tiny.fa.gz" />
+
+            <param name="splitting_report" value="true"/>
+            <param name="mbias_report" value="true"/>
+
+            <output name="output_splitting_report" file="output_splitting_report.txt" ftype="tabular" lines_diff="2"/>
+            <output name="output_mbias_report" file="output_mbias_report.txt" ftype="txt"/>
+            <output name="output_cytosine_report">
+                <assert_contents>
+                    <!-- &#009; is XML escape code for tab -->
+                    <has_line line="chrY_JH584303_random&#009;4&#009;+&#009;0&#009;0&#009;CHH&#009;CAT" />
+                    <has_line line="chrY_JH584301_random&#009;259872&#009;-&#009;0&#009;0&#009;CHH&#009;CAT" />
+                </assert_contents>
+            </output>
+        </test>
+    </tests>
+
+    <help>
+        <![CDATA[
+
+**What it does**
+
+  | The following is a brief description of all options to control the Bismark_methylation extractor. The script reads in a bisulfite read alignment results file produced by the Bismark bisulfite mapper and extracts the methylation information for individual cytosines. This information is found in the methylation call field which can contain the following characters:
+  |
+
+
+  - X = for methylated C in CHG context (was protected)
+  - x = for not methylated C CHG (was converted)
+  - H = for methylated C in CHH context (was protected)
+  - h = for not methylated C in CHH context (was converted)
+  - Z = for methylated C in CpG context (was protected)
+  - z = for not methylated C in CpG context (was converted)
+  - . = for any bases not involving cytosines
+
+  | The methylation extractor outputs result files for cytosines in CpG, CHG and CHH context (this distinction is actually already made in Bismark itself). As the methylation information for every C analysed can produce files which easily have tens or even hundreds of millions of lines, file sizes can become very large and more difficult to handle. The C methylation info additionally splits cytosine methylation calls up into one of the four possible strands a given bisulfite read aligned against:
+  |
+
+  - OT = original top strand
+  - CTOT = complementary to original top strand
+
+  - OB = original bottom strand
+  - CTOB = complementary to original bottom strand
+
+  | Thus, by default twelve individual output files are being generated per input file (unless --comprehensive is specified, see below). The output files can be imported into a genome viewer, such as SeqMonk, and re-combined into a single data group if desired (in fact unless the bisulfite reads were generated preserving directionality it doesn't make any sense to look at the data in a strand-specific manner). Strand-specific output files can optionally be skipped, in which case only three output files for CpG, CHG or CHH context will be generated. For both the strand-specific and comprehensive outputs there is also the option to merge both non-CpG contexts (CHG and CHH) into one single non-CpG context.
+  |
+  | It is developed by Krueger F and Andrews SR. at the Babraham Institute. Krueger F, Andrews SR. (2011) Bismark: a flexible aligner and methylation caller for Bisulfite-Seq applications. Bioinformatics, 27, 1571-2.
+
+.. _Bismark: http://www.bioinformatics.babraham.ac.uk/projects/bismark/
+
+----
+
+**Outputs**
+
+- The output files are in the following format (tab delimited)::
+
+
+      Column  Description
+    --------  --------------------------------------------------------
+        1     seq-ID
+        2     strand
+        3     chromosome
+        4     position
+        5     methylation call
+
+
+- Methylated cytosines receive a '+' orientation,
+- Unmethylated cytosines receive a '-' orientation.
+
+----
+
+**Note on Bismark settings**
+
+  | All of the options have a default value. You can change any of them. If any Bismark function is missing please contact the tool author or your Galaxy admin.
+
+----
+
+**Settings**
+
+* **If Single-End Reads**
+
+  * **Ignore the first N bp from the 5’ end of single-end read when processing the methylation call string.**
+
+      | This can remove e.g. a restriction enzyme site at the start of each read or any other source of bias (e.g. PBAT-Seq data).
+      |
+      | *Input option --ignore <INT>*
+
+  * **Ignore the last N bp from the 3' end of single-end read when processing the methylation call string.**
+
+      | This can remove unwanted biases from the end of reads.
+      |
+      | *Input option --ignore_3prime <INT>*
+
+* **If Paired-End Reads**
+
+  * **Ignore the first N bp from the 5’ end of Read 1 when processing the methylation call string**
+
+      | This can remove e.g. a restriction enzyme site at the start of each read or any other source of bias (e.g. PBAT-Seq data).
+      |
+      | *Input option --ignore <INT>*
+
+  * **Ignore the last N bp from the 3’ end of Read 1 when processing the methylation call string**
+
+      | This can remove unwanted biases from the end of reads.
+      |
+      | *Input option --ignore_3prime <INT>*
+
+  * **Ignore the first N bp from the 5' end of Read 2 of paired-end sequencing results**
+
+      | Since the first couple of bases in Read 2 of BS-Seq experiments show a severe bias towards non-methylation as a result of end-repairing sonicated fragments with unmethylated cytosines (see M-bias plot), it is recommended that the first couple of bp of Read 2 are removed before starting downstream analysis. Please see the section on M-bias plots in the Bismark User Guide for more details. The options --ignore <int> and --ignore_r2 <int> can be combined in any desired way.
+      |
+      | *Input option --ignore_r2*
+
+  * **Ignore the last N bp from the 3' end of Read 2 of paired-end sequencing results**
+
+      | This can remove unwanted biases from the end of reads.
+      |
+      | *Input option --ignore_3prime_r2*
+
+  * **This option avoids scoring overlapping methylation calls twice, in case of overlapping read one and read two**
+
+      | For paired-end reads it is theoretically possible that read_1 and read_2 overlap. This option avoids scoring overlapping methylation calls twice (only methylation calls of read 1 are used for in the process since read 1 has historically higher quality basecalls than read 2). Whilst this option removes a bias towards more methylation calls in the center of sequenced fragments it may de facto remove a sizable proportion of the data. This option is highly recommended for paired-end data.
+      |
+      | *Input option --no_overlap*
+
+* **Short methylation summary output (Splitting Report)**
+
+    | Prints out a short methylation summary as well as the paramaters used to run this script.
+    |
+    | *Output option --report*
+
+* **Methylation proportion report for each possible position in the read (Mbias Report)**
+
+    | This report shows the methylation proportion across each possible position in the read (described in further detail in:Hansen et al., Genome Biology, 2012, 13:R83). The data for the M-bias plot is also written into a text file and is in the following format:
+    |
+    | <read position> <count methylated> <count unmethylated> <% methylation> <total coverage>
+    |
+    | This allows generating nice graphs by alternative means, e.g. using R or Excel
+
+* **Genome-wide methylation report for all cytosines in the genome**
+
+    | the option --cytosine_report produces a genome-wide methylation report for all cytosines in the genome.
+
+  * **If CpG Context only**
+
+      | the output uses 1-based chromosome coordinates (zero-based cords are optional) and reports CpG context only (all cytosine context is optional). The output considers all Cs on both forward and reverse strands and reports their position, strand, trinucleotide content and methylation state (counts are 0 if not covered).
+      |
+      | *Genome-wide cytosine methylation report specific option --bedgraph --cytosine_report --genome_folder <path>*
+
+  * **If not CpG Context only**
+
+      | The output file contains information on every single cytosine in the genome irrespective of its context. This applies to both forward and reverse strands. Please be aware that this will generate output files with > 1.1 billion lines for a mammalian genome such as human or mouse. Default: OFF (i.e. Default = CpG context only).
+      |
+      | *Genome-wide cytosine methylation report specific option --bedgraph --CX_context --cytosine_report --CX_context --genome_folder <path>*
+
+* **Merge all four possible strand-specific methylation info into context-dependent output files**
+
+    | Specifying this option will merge all four possible strand-specific methylation info into context-dependent output files. The default contexts are:
+    |  - CpG context
+    |  - CHG context
+    |  - CHH context
+    |
+    | *Output option --comprehensive*
+
+* **Merge all non-CpG contexts into one file**
+
+    | This will produce two output files (in --comprehensive mode) or eight strand-specific output files (default) for Cs in
+    | - CpG context
+    | - non-CpG context
+    |
+    | *Output option --merge_non_CpG*
+
+* **Compress all result files and output one single file**
+
+    | The methylation extractor files (CpG_OT..., CpG_OB... etc) will be written out in a GZIP compressed form to save disk space. This option does not work on bedGraph and genome-wide cytosine reports as they are 'tiny' anyway.
+    |
+    | *Output option --gzip*
+
+]]>
+    </help>
+
+    <citations>
+        <citation type="doi">10.1093/bioinformatics/btr167</citation>
+    </citations>
+</tool>
--- a/bismark_pretty_report/bismark2report	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,1237 +0,0 @@
-#!/usr/bin/env perl
-use warnings;
-use strict;
-use Getopt::Long;
-use FindBin qw($Bin);
-use lib "$Bin/../lib";
-
-## This program is Copyright (C) 2010-16, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-my $bismark2report_version = 'v0.16.3';
-my (@alignment_reports,@dedup_reports,@splitting_reports,@mbias_reports,@nuc_reports);
-
-my ($output_dir,$verbose,$manual_output_file) = process_commandline();
-
-# print join (",",@alignment_reports)."\n";
-# print join (",",@dedup_reports)."\n";
-# print join (",",@splitting_reports)."\n";
-# print join (",",@mbias_reports)."\n";
-# print join (",",@nuc_reports)."\n";
-
-while (@alignment_reports){
-
-  my $alignment_report = shift @alignment_reports;
-  my $dedup_report     = shift @dedup_reports;
-  my $splitting_report = shift @splitting_reports;
-  my $mbias_report     = shift @mbias_reports;
-  my $nuc_report       = shift @nuc_reports;
-
-  ### HTML OUTPUT FILE
-  my $report_output = $alignment_report;
-  $report_output =~ s/^.*\///; # deleting optional path information
-  $report_output =~ s/\.txt$//;
-  $report_output =~ s/$/.html/;
-
-  # if -o output_file was specified we are going to use that name preferentially. This may only happen if there is a single report in the folder, or if a single report has been specified manually
-  if ($manual_output_file){
-      warn "A specific output filename was specified: $manual_output_file. Using that one instead of deriving the filename\n"; sleep(1);
-      $report_output = $manual_output_file;
-  }
-
-  $report_output = $output_dir.$report_output;
-  warn "\nWriting Bismark HTML report to >> $report_output <<\n\n";
-
-  my $doc = read_report_template(); #reading and storing the entire report template
-
-  # BISMARK ALIGNMENT REPORT (mandatory)
-  warn "="x110,"\n";
-  warn "Using the following alignment report:\t\t> $alignment_report <\n";
-  # DEDUPLICATION REPORT (optional)
-  if ($dedup_report){
-      warn "Using the following deduplication report:\t> $dedup_report <\n";
-  }
-  else{
-      warn "No deduplication report file specified, skipping this step\n";
-  }
-
-  # SPLITTING REPORT (optional)
-  if ($splitting_report){
-    warn "Using the following splitting report:\t\t> $splitting_report <\n";
-  }
-  else{
-    warn "No splitting report file specified, skipping this step\n";
-  }
-
-  # M-BIAS REPORT (optional)
-  if ($mbias_report){
-      warn "Using the following M-bias report:\t\t> $mbias_report <\n";
-  }
-  else{
-      warn "No M-bias report file specified, skipping this step\n";
-  }
-  
-  # NUCLEOTIDE COVERAGE REPORT (optional)
-  if ($nuc_report){
-      warn "Using the following nucleotide coverage report:\t> $nuc_report <\n";
-  }
-  else{
-      warn "No nucleotide coverage report file specified, skipping this step\n";
-  } 
-  warn "="x110,"\n\n\n";
-  $verbose and sleep(3);
-
-  # creating timestamp
-  $doc = getLoggingTime($doc);
-
-  $doc = read_alignment_report($alignment_report,$doc); # mandatory
-
-  if ($dedup_report){ # optional
-    $doc = read_deduplication_report($dedup_report,$doc);
-
-    # removing the delete tags in the html template
-    $doc =~ s/\{\{start_deletion_duplication\}\}//g;
-    $doc =~ s/\{\{end_deletion_duplication\}\}//g;
-  }
-  else{
-    # removing the entire graph and table section for the deduplication part
-    warn "Removing the duplication section from the HTML report\n" if ($verbose);
-    $doc =~ s/(\{\{start_deletion_duplication.*?end_deletion_duplication\}\})//gs; # s includes newline chars; non-greedy
-    warn "Deleting the following content:\n$1\n\n" if ($verbose);
-    sleep(3) if ($verbose);
-  }
-
-  if ($nuc_report){ # optional
-      $doc = read_nucleotide_coverage_report($nuc_report,$doc);
-      
-      # removing the delete tags in the html template
-      $doc =~ s/\{\{start_deletion_nucleotide_coverage\}\}//g;
-      $doc =~ s/\{\{end_deletion_nucleotide_coverage\}\}//g;
-  }
-  else{
-      # removing the entire graph and table section for the nucleotide coverage part
-      warn "Removing the nucleotide coverage section from the HTML report\n" if ($verbose);
-      $doc =~ s/(\{\{start_deletion_nucleotide_coverage.*?end_deletion_nucleotide_coverage\}\})//gs; # s includes newline chars; non-greedy
-      warn "Deleting the following content:\n$1\n\n" if ($verbose);
-      sleep(3) if ($verbose);
-  }
-
-  if ($splitting_report){ # optional
-    $doc = read_splitting_report($splitting_report,$doc);
-
-    # removing the delete tags in the html template
-    $doc =~ s/\{\{start_deletion_splitting\}\}//g;
-    $doc =~ s/\{\{end_deletion_splitting\}\}//g;
-  }
-  else{
-    # removing the entire graph and table section for the deduplication part
-    warn "Removing the splitting report section from the HTML report\n" if ($verbose);
-    $doc =~ s/(\{\{start_deletion_splitting.*?end_deletion_splitting\}\})//gs; # s includes newline chars; non-greedy
-    warn "Deleting the following content:\n$1\n\n" if ($verbose);
-    sleep(3) if ($verbose);
-  }
-
-  if ($mbias_report){ # optional
-    (my $state, $doc) = read_mbias_report($mbias_report,$doc);
-
-    # removing the delete tags in the html template
-    $doc =~ s/\{\{start_deletion_mbias\}\}//g;
-    $doc =~ s/\{\{end_deletion_mbias\}\}//g;
-
-    warn "Reported read state: $state\n\n" if ($verbose);
-    # if the report was single-end we need to remove the second plot only
-    if ($state eq 'single'){
-      $doc =~ s/(\{\{start_deletion_mbias_2.*?end_deletion_mbias_2\}\})//gs; # s includes newline chars; non-greedy
-      warn "Deleting the following content:\n$1\n\n" if ($verbose);
-    }
-    else{
-      $doc =~ s/\{\{start_deletion_mbias_2\}\}//g;
-      $doc =~ s/\{\{end_deletion_mbias_2\}\}//g;
-    }
-  }
-  else{
-    # removing the entire graph and table section for the deduplication part
-    $doc =~ s/(\{\{start_deletion_mbias.*?end_deletion_mbias\}\})//gs; # s includes newline chars; non-greedy
-    warn "Deleting the following content:\n$1\n\n" if ($verbose);
-    sleep(3) if ($verbose);
-  }
-
-  write_out_report($report_output,$doc);
-
-}
-
-sub write_out_report{
-  my ($report_output,$doc) = @_;
-  open (OUT,'>',$report_output) or die "Failed to write to output file $report_output: $!\n\n";
-  print OUT $doc;
-}
-
-sub getLoggingTime {
-  my $doc = shift;
-  my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst)=localtime(time);
-
-  my $time = sprintf ("%02d:%02d", $hour,$min,$sec);
-  my $date = sprintf ("%04d-%02d-%02d", $year+1900,$mon+1,$mday);
-  warn "Using Time: $time, and date: $date\n\n" if ($verbose);
-
-  $doc =~ s/\{\{date\}\}/$date/g;
-  $doc =~ s/\{\{time\}\}/$time/g;
-
-  return $doc;
-}
-
-
-sub read_alignment_report{
-
-  my ($alignment_report,$doc) = @_;
-
-  warn "Processing alignment report $alignment_report ...\n";
-  open (ALN,$alignment_report) or die "Couldn't read from file $alignment_report: $!\n\n";
-
-  my $unique;
-  my $no_aln;
-  my $multiple;
-  my $no_genomic;
-  my $total_seqs;
-  my $bismark_version;
-  my $input_filename;
-
-  my $unique_text;
-  my $no_aln_text;
-  my $multiple_text;
-  my $total_seq_text;
-
-  my $total_C_count;
-  my ($meth_CpG,$meth_CHG,$meth_CHH,$meth_unknown);
-  my ($unmeth_CpG,$unmeth_CHG,$unmeth_CHH,$unmeth_unknown);
-  my ($perc_CpG,$perc_CHG,$perc_CHH,$perc_unknown);
-
-  my $number_OT;
-  my $number_CTOT;
-  my $number_CTOB;
-  my $number_OB;
-
-  while (<ALN>){
-    chomp;
-
-    ### General Alignment stats
-    if ($_ =~ /^Sequence pairs analysed in total:/ ){ ## Paired-end
-      (undef,$total_seqs) = split /\t/;
-       print "Total paired seqs: >> $total_seqs <<\n" if ($verbose);
-      $total_seq_text = 'Sequence pairs analysed in total';
-    }
-    elsif ($_ =~ /^Sequences analysed in total:/ ){   ## Single-end
-      (undef,$total_seqs) = split /\t/;
-      $total_seq_text = 'Sequences analysed in total';
-      print "total single-end seqs >> $total_seqs <<\n" if ($verbose);
-    }
-
-    elsif($_ =~ /^Bismark report for: (.*) \(version: (.*)\)/){
-      $input_filename = $1;
-      $bismark_version = $2;
-      print "Input filename(s) >> $input_filename <<\n" if ($verbose);
-      print "Bismark version >> $bismark_version <<\n" if ($verbose);
-    }
-
-    elsif($_ =~ /^Number of paired-end alignments with a unique best hit:/){ ## Paired-end
-      (undef,$unique) = split /\t/;
-      print "Unique PE>> $unique <<\n" if ($verbose);;
-      $unique_text = 'Paired-end alignments with a unique best hit';
-    }
-    elsif($_ =~ /^Number of alignments with a unique best hit from/){            ## Single-end
-      (undef,$unique) = split /\t/;
-      print "Unique SE>> $unique <<\n" if ($verbose);
-      $unique_text = 'Single-end alignments with a unique best hit';
-    }
-
-    elsif($_ =~ /^Sequence pairs with no alignments under any condition:/){  ## Paired-end
-      (undef,$no_aln) = split /\t/;
-      print "No alignment PE >> $no_aln <<\n" if ($verbose);
-      $no_aln_text = 'Pairs without alignments under any condition';
-    }
-    elsif($_ =~ /^Sequences with no alignments under any condition:/){  ## Single-end
-      (undef,$no_aln) = split /\t/;
-      print "No alignments SE>> $no_aln <<\n" if ($verbose);
-      $no_aln_text = 'Sequences without alignments under any condition';
-    }
-
-    elsif($_ =~ /^Sequence pairs did not map uniquely:/){ ## Paired-end
-      (undef,$multiple) = split /\t/;
-      print "Multiple alignments PE >> $multiple <<\n" if ($verbose);
-      $multiple_text = 'Pairs that did not map uniquely';
-    }
-    elsif($_ =~ /^Sequences did not map uniquely:/){ ## Single-end
-      (undef,$multiple) = split /\t/;
-      print "Multiple alignments SE >> $multiple <<\n" if ($verbose);
-      $multiple_text = 'Sequences that did not map uniquely';
-    }
-
-    elsif($_ =~ /^Sequence pairs which were discarded because genomic sequence could not be extracted:/){ ## Paired-end
-      (undef,$no_genomic) = split /\t/;
-      print "No genomic sequence PE >> $no_genomic <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Sequences which were discarded because genomic sequence could not be extracted:/){ ## Single-end
-      (undef,$no_genomic) = split /\t/;
-      print "No genomic sequence SE>> $no_genomic <<\n" if ($verbose);
-    }
-
-    ### Context Methylation
-    elsif($_ =~ /^Total number of C/ ){
-      (undef,$total_C_count) = split /\t/;
-      print "Total number C >> $total_C_count <<\n" if ($verbose);
-    }
-
-      elsif($_ =~ /^Total methylated C\'s in CpG context:/ ){
-      (undef,$meth_CpG) = split /\t/;
-      print "meth CpG >> $meth_CpG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total methylated C\'s in CHG context:/ ){
-      (undef,$meth_CHG) = split /\t/;
-      print "meth CHG >> $meth_CHG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total methylated C\'s in CHH context:/ ){
-      (undef,$meth_CHH) = split /\t/;
-      print "meth CHH >> $meth_CHH <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total methylated C\'s in Unknown context:/ ){
-      (undef,$meth_unknown) = split /\t/;
-      print "meth Unknown >> $meth_unknown <<\n" if ($verbose);
-    }
-
-    elsif($_ =~ /^Total unmethylated C\'s in CpG context:/ or $_ =~ /^Total C to T conversions in CpG context:/){
-      (undef,$unmeth_CpG) = split /\t/;
-      print "unmeth CpG >> $unmeth_CpG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total unmethylated C\'s in CHG context:/ or $_ =~ /^Total C to T conversions in CHG context:/){
-      (undef,$unmeth_CHG) = split /\t/;
-      print "unmeth CHG >> $unmeth_CHG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total unmethylated C\'s in CHH context:/ or $_ =~ /^Total C to T conversions in CHH context:/){
-      (undef,$unmeth_CHH) = split /\t/;
-      print "unmeth CHH >> $unmeth_CHH <<\n"if ($verbose);
-    }
-    elsif($_ =~ /^Total unmethylated C\'s in Unknown context:/ or $_ =~ /^Total C to T conversions in Unknown context:/){
-      (undef,$unmeth_unknown) = split /\t/;
-      print "unmeth Unknown >> $unmeth_unknown <<\n" if ($verbose);
-    }
-
-    elsif($_ =~ /^C methylated in CpG context:/ ){
-      (undef,$perc_CpG) = split /\t/;
-      $perc_CpG =~ s/%//;
-      print "percentage CpG >> $perc_CpG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^C methylated in CHG context:/ ){
-      (undef,$perc_CHG) = split /\t/;
-      $perc_CHG =~ s/%//;
-      print "percentage CHG >> $perc_CHG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^C methylated in CHH context:/ ){
-      (undef,$perc_CHH) = split /\t/;
-      $perc_CHH =~ s/%//;
-      print "percentage CHH >> $perc_CHH <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^C methylated in Unknown context:/ ){
-      (undef,$perc_unknown) = split /\t/;
-      $perc_unknown =~ s/%//;
-      print "percentage Unknown >> $perc_unknown <<\n" if ($verbose);
-    }
-
-
-    ### Strand Origin
-
-    elsif($_ =~ /^CT\/GA\/CT:/ ){             ## Paired-end
-      (undef,$number_OT) = split /\t/;
-      print "Number OT PE>> $number_OT <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^CT\/CT:/ ){                 ## Single-end
-      (undef,$number_OT) = split /\t/;
-      print "Number OT SE>> $number_OT <<\n" if ($verbose);
-    }
-
-    elsif($_ =~ /^GA\/CT\/CT:/ ){             ## Paired-end
-      (undef,$number_CTOT) = split /\t/;
-      print "Number CTOT PE >> $number_CTOT <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^GA\/CT:/ ){                 ## Single-end
-      (undef,$number_CTOT) = split /\t/;
-      print "Number CTOT SE >> $number_CTOT <<\n" if ($verbose);
-    }
-
-    elsif($_ =~ /^GA\/CT\/GA:/ ){             ## Paired-end
-      (undef,$number_CTOB) = split /\t/;
-      print "Number CTOB PE >> $number_CTOB <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^GA\/GA:/ ){                 ## Single-end
-      (undef,$number_CTOB) = split /\t/;
-      print "Number CTOB SE >> $number_CTOB <<\n" if ($verbose);
-    }
-
-    elsif($_ =~ /^CT\/GA\/GA:/ ){             ## Paired-end
-      (undef,$number_OB) = split /\t/;
-      print "Number OB PE >> $number_OB <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^CT\/GA:/ ){                 ## Single-end
-      (undef,$number_OB) = split /\t/;
-      print "Number OB SE >> $number_OB <<\n" if ($verbose);
-    }
-
-
-  }
-
-  if (defined $unique and defined $no_aln and defined $multiple and defined $no_genomic and defined $total_seqs){
-    warn "Got all necessary information, editing HTML report\n"  if ($verbose);
-
-    ### General Alignment Stats
-    $doc =~ s/\{\{unique_seqs\}\}/$unique/g;
-    $doc =~ s/\{\{unique_seqs_text\}\}/$unique_text/g;
-
-    $doc =~ s/\{\{no_alignments\}\}/$no_aln/g;
-    $doc =~ s/\{\{no_alignments_text\}\}/$no_aln_text/g;
-
-    $doc =~ s/\{\{multiple_alignments\}\}/$multiple/g;
-    $doc =~ s/\{\{multiple_alignments_text\}\}/$multiple_text/g;
-
-    $doc =~ s/\{\{no_genomic\}\}/$no_genomic/g;
-
-    $doc =~ s/\{\{total_sequences_alignments\}\}/$total_seqs/g;
-    $doc =~ s/\{\{sequences_analysed_in_total\}\}/$total_seq_text/g;
-
-    $doc =~ s/\{\{filename\}\}/$input_filename/g;
-    $doc =~ s/\{\{bismark_version\}\}/$bismark_version/g;
-
-    ### Strand Origin
-    $doc =~ s/\{\{number_OT\}\}/$number_OT/g;
-    $doc =~ s/\{\{number_CTOT\}\}/$number_CTOT/g;
-    $doc =~ s/\{\{number_CTOB\}\}/$number_CTOB/g;
-    $doc =~ s/\{\{number_OB\}\}/$number_OB/g;
-
-    ### Context Methylation
-    $doc =~ s/\{\{total_C_count\}\}/$total_C_count/g;
-
-    unless (defined $perc_CpG){
-      $perc_CpG = 'N/A';
-    }
-    unless (defined $perc_CHG){
-      $perc_CHG = 'N/A';
-    }
-    unless (defined $perc_CHH){
-      $perc_CHH = 'N/A';
-    }
-    unless (defined $perc_unknown){
-      $perc_unknown = 'N/A';
-    }
-
-    ### Unknown sequence context, just for Bowtie 2 alignments
-    my $meth_unknown_inject;
-    my $unmeth_unknown_inject;
-    my $perc_unknown_inject;
-
-    if (defined $meth_unknown){ # if one Unknown context file is present, so should the others
-      $meth_unknown_inject = "     <tr>
-                                <th>Methylated C's in Unknown context</th>
-    				<td>$meth_unknown</td>
-    			</tr>";
-      $unmeth_unknown_inject = "     <tr>
-                                <th>Unmethylated C's in Unknown context</th>
-    				<td>$unmeth_unknown</td>
-    			</tr>";
-      $perc_unknown_inject = "     <tr>
-                                <th>Methylated C's in Unknown context</th>
-    				<td>$perc_unknown%</td>
-    			</tr>";
-    }
-    else{
-      $meth_unknown_inject = $unmeth_unknown_inject = $perc_unknown_inject = '';
-    }
-
-    ### injecting this into the table
-    $doc =~ s/\{\{meth_unknown\}\}/$meth_unknown_inject/g;
-    $doc =~ s/\{\{unmeth_unknown\}\}/$unmeth_unknown_inject/g;
-    $doc =~ s/\{\{perc_unknown\}\}/$perc_unknown_inject/g;
-
-
-    $doc =~ s/\{\{meth_CpG\}\}/$meth_CpG/g;
-    $doc =~ s/\{\{meth_CHG\}\}/$meth_CHG/g;
-    $doc =~ s/\{\{meth_CHH\}\}/$meth_CHH/g;
-
-    $doc =~ s/\{\{unmeth_CpG\}\}/$unmeth_CpG/g;
-    $doc =~ s/\{\{unmeth_CHG\}\}/$unmeth_CHG/g;
-    $doc =~ s/\{\{unmeth_CHH\}\}/$unmeth_CHH/g;
-
-    $doc =~ s/\{\{perc_CpG\}\}/$perc_CpG/g;
-    $doc =~ s/\{\{perc_CHG\}\}/$perc_CHG/g;
-    $doc =~ s/\{\{perc_CHH\}\}/$perc_CHH/g;
-
-    my ($perc_CpG_graph, $perc_CHG_graph,$perc_CHH_graph,$perc_unknown_graph);
-
-    if ($perc_CpG eq 'N/A'){
-      $perc_CpG_graph = 0; # values of 0 won't show in the graph and won't produce errors
-    }
-    else{
-      $perc_CpG_graph =  $perc_CpG;
-    }
-
-    if ($perc_CHG eq 'N/A'){
-      $perc_CHG_graph = 0; # values of 0 won't show in the graph and won't produce errors
-    }
-    else{
-      $perc_CHG_graph =  $perc_CHG;
-    }
-
-    if ($perc_CHH eq 'N/A'){
-      $perc_CHH_graph = 0; # values of 0 won't show in the graph and won't produce errors
-    }
-    else{
-      $perc_CHH_graph =  $perc_CHH;
-    }
-
-    if ($perc_unknown eq 'N/A'){
-      $perc_unknown_graph = 0; # values of 0 won't show in the graph and won't produce errors
-    }
-    else{
-      $perc_unknown_graph =  $perc_unknown;
-    }
-
-    $doc =~ s/\{\{perc_CpG_graph\}\}/$perc_CpG_graph/g;
-    $doc =~ s/\{\{perc_CHG_graph\}\}/$perc_CHG_graph/g;
-    $doc =~ s/\{\{perc_CHH_graph\}\}/$perc_CHH_graph/g;
-
-  }
-  else{
-    warn "Am I missing something?\n\n";
-  }
-
-  warn "Complete\n\n";
-  return $doc;
-}
-
-
-sub read_deduplication_report{
-
-  my ($dedup_report,$doc) = @_;
-
-  warn "Processing deduplication report $dedup_report ...\n";
-  open (DEDUP,$dedup_report) or die "Couldn't read from file $dedup_report: $!\n\n";
-
-  my $total_seqs;
-  my $dups;
-  my $diff_pos;
-  my $leftover;
-
-  while (<DEDUP>){
-    chomp;
-    if ($_ =~ /^Total number of alignments/){
-      (undef,$total_seqs) = split /\t/;
-      warn "Total number of seqs >> $total_seqs <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total number duplicated/){
-      (undef,$dups) = split /\t/;
-      $dups =~ s/\s.*//; # just need the number, not the percentage
-      warn "Duplicated >> $dups <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Duplicated alignments were found at/){
-      (undef,$diff_pos) = split /\t/;
-      $diff_pos =~ s/\s.*//; # just need the number
-      warn "Different positions >> $diff_pos <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total count of deduplicated leftover sequences: (\d+)/){
-      $leftover = $1;
-      warn "Leftover seqs >> $leftover <<\n" if ($verbose);
-    }
-  }
-
-  unless (defined $leftover){
-    if (defined $dups and defined $total_seqs){
-      $leftover = $total_seqs - $dups;
-    }
-  }
-
-  # Checking if we got all we need
-  if (defined $dups and defined $total_seqs and defined $diff_pos and defined $leftover){
-    # warn "Got all I need!\n\n";
-    $doc =~ s/\{\{seqs_total_duplicates\}\}/$total_seqs/g;
-    $doc =~ s/\{\{unique_alignments_duplicates\}\}/$leftover/g;
-    $doc =~ s/\{\{duplicate_alignments_duplicates\}\}/$dups/g;
-    $doc =~ s/\{\{different_positions_duplicates\}\}/$diff_pos/g;
-  }
-  else{
-    warn "Something went wrong... Use --verbose to get a clue...\n";
-    # skipping this plot entirely if values could not be extracted
-    return $doc;
-  }
-  warn "Complete\n\n";
-  return $doc;
-}
-
-
-sub read_nucleotide_coverage_report{
-    
-    my ($nuc_report,$doc) = @_;
-    
-    warn "Processing nucleotide coverage report '$nuc_report' ...\n";
-    open (NUC,$nuc_report) or die "Couldn't read from file $nuc_report: $!\n\n";
-    
-    my %nucs; # storing nucleotides and frequencies
-    my $linecount = 0;    
-    
-    while (<NUC>){
-	chomp;
-	$_ =~ s/\r//; # removing carriage returns
-	# warn "$_\n"; sleep(1);
-	my ($element,$count_obs,$observed,$count_exp,$expected,$coverage) = (split /\t/);
-	# warn "$element , $count_obs , $observed , $count_exp , $expected, $coverage\n"; sleep(1);
-	if ($linecount == 0){ # verifying that the data appears to be a Bismark nucleotide coverage report
-	    if ($observed eq 'percent sample'){
-		# warn "Fine, found '$observed'\n";
-	    }
-	    else{
-		die "Expected to find 'percent sample' as entry in line 1, column 3 but found '$observed'. This doesn't look like a Bismark nucleotide coverage report. Please respecify!\n";
-	    }
-	    
-	    if ($expected eq 'percent genomic'){
-		# warn "Fine, found '$expected'\n";
-	    }
-	    else{
-		die "Expected to find 'percent genomic' as entry in line 1, column 5 but found '$expected'. This doesn't look like a Bismark nucleotide coverage report. Please respecify!\n";
-	    }
-	}
-	else{
-	    $nucs{$element}->{obs}->{percent}  = $observed;
-	    $nucs{$element}->{exp}->{percent}  = $expected;
-	    $nucs{$element}->{obs}->{counts}   = $count_obs;
-	    $nucs{$element}->{exp}->{counts}   = $count_exp;
-	    $nucs{$element}->{obs}->{coverage} = $coverage; # coverage of that nucleotide in the sample
-	    warn "Element '$element' observed: $observed\n" if $verbose;
-	    warn "Element '$element' expected: $expected\n" if $verbose;
-	}
-
-	++$linecount;
-
-    }
-
-    # Checking if we got all we need
-    my $looksOK = 1;
-    foreach my $key (keys %nucs){ 
-	unless ( (defined $nucs{$key}->{obs}) and (defined $nucs{$key}->{exp})){
-	    $looksOK = 0;
-	}
-    }
-    
-    if ($looksOK){ 
-	warn "Got all necessary information, editing HTML report ...\n" if $verbose;
-	my $minmax = 0;
-	foreach my $key (sort {$a cmp $b} keys %nucs){
-	    my $nuc_obs = $nucs{$key}->{obs}->{percent};
-	    my $nuc_exp = $nucs{$key}->{exp}->{percent};
-	    my $counts_obs = $nucs{$key}->{obs}->{counts};
-	    my $counts_exp = $nucs{$key}->{exp}->{counts};
-	    my $cov = $nucs{$key}->{obs}->{coverage};
-
-	    # calculating log2 observed/expected
-	    my $ratio = $nuc_obs/$nuc_exp;
-	    #  my $logratio = sprintf ("%.2f",log($ratio)/log(2));
-	    # if (abs($logratio) > $minmax){
-	    # $minmax = abs($logratio);
-	    # } 
-	    warn "$key\tnuc_${key}_obs\t$nuc_obs\tnuc_${key}_exp\t$nuc_exp\tratio: $ratio\n" if $verbose;
-
-	    $doc =~ s/\{\{nuc_${key}_p_obs\}\}/$nuc_obs/g;
-	    $doc =~ s/\{\{nuc_${key}_p_exp\}\}/$nuc_exp/g;
-	    $doc =~ s/\{\{nuc_${key}_counts_obs\}\}/$counts_obs/g;
-	    $doc =~ s/\{\{nuc_${key}_counts_exp\}\}/$counts_exp/g;
-	    $doc =~ s/\{\{nuc_${key}_coverage\}\}/$cov/g;
-	}
-	# warn "Minimum/maxium ratio was: $minmax\n" if $verbose;
-	# $doc =~ s/\{\{nuc_minmax\}\}/$minmax/g;
-    }
-    else{
-	warn "Something went wrong, skipping this plot entirely... Use --verbose to get a clue...\n";
-	# skipping this plot entirely if values could not be extracted
-	return $doc;
-    }
-
-    warn "Complete\n\n";
-    return $doc;
-}
-
-
-sub read_splitting_report{
-
-  my ($splitting_report,$doc) = @_;
-
-  warn "Processing splitting report $splitting_report ...\n";
-  open (SPLIT,$splitting_report) or die "Couldn't read from file $splitting_report: $!\n\n";
-
-  my $total_seqs;
-
-  my $total_C_count;
-  my ($meth_CpG,$meth_CHG,$meth_CHH,$meth_unknown);
-  my ($unmeth_CpG,$unmeth_CHG,$unmeth_CHH,$unmeth_unknown);
-  my ($perc_CpG,$perc_CHG,$perc_CHH,$perc_unknown);
-
-  while (<SPLIT>){
-    chomp;
-
-    ### Context Methylation
-    if($_ =~ /^Total number of C/ ){
-      (undef,$total_C_count) = split /\t/;
-      print "total calls >> $total_C_count <<\n" if ($verbose);
-    }
-
-    elsif($_ =~ /^Total methylated C\'s in CpG context:/ ){
-      (undef,$meth_CpG) = split /\t/;
-      print "meth CpG >> $meth_CpG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total methylated C\'s in CHG context:/ ){
-      (undef,$meth_CHG) = split /\t/;
-      print "meth CHG>> $meth_CHG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total methylated C\'s in CHH context:/ ){
-      (undef,$meth_CHH) = split /\t/;
-      print "meth CHH >> $meth_CHH <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total methylated C\'s in Unknown context:/ ){
-      (undef,$meth_unknown) = split /\t/;
-      print "meth Unknown >> $meth_unknown <<\n" if ($verbose);
-    }
-
-    elsif($_ =~ /^Total C to T conversions in CpG context:/ ){
-      (undef,$unmeth_CpG) = split /\t/;
-      print "unmeth CpG >> $unmeth_CpG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total C to T conversions in CHG context:/ ){
-      (undef,$unmeth_CHG) = split /\t/;
-      print "unmeth CHG >> $unmeth_CHG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total C to T conversions in CHH context:/ ){
-      (undef,$unmeth_CHH) = split /\t/;
-      print "unmeth CHH >> $unmeth_CHH <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^Total C to T conversions in Unknown context:/ ){
-      (undef,$unmeth_unknown) = split /\t/;
-      print "unmeth Unknown >> $unmeth_unknown <<\n" if ($verbose);
-    } 
-
-    elsif($_ =~ /^C methylated in CpG context:/ ){
-      (undef,$perc_CpG) = split /\t/;
-      $perc_CpG =~ s/%//;
-      print "percentage CpG >> $perc_CpG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^C methylated in CHG context:/ ){
-      (undef,$perc_CHG) = split /\t/;
-      $perc_CHG =~ s/%//;
-      print "percentage CHG >> $perc_CHG <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^C methylated in CHH context:/ ){
-      (undef,$perc_CHH) = split /\t/;
-      $perc_CHH =~ s/%//;
-      print "percentage CHH >> $perc_CHH <<\n" if ($verbose);
-    }
-    elsif($_ =~ /^C methylated in Unknown context:/ ){
-      (undef,$perc_unknown) = split /\t/;
-      $perc_unknown =~ s/%//;
-      print "percentage unknown >> $perc_unknown <<\n" if ($verbose);
-    }
-  }
-
-  if (defined $meth_CpG and defined $meth_CHG and defined $meth_CHH and defined $unmeth_CpG and defined $unmeth_CHG and defined $unmeth_CHH){
-    warn "Got all necessary information, editing HTML report ...\n" if ($verbose);
-
-    ### Context Methylation
-    $doc =~ s/\{\{total_C_count_splitting\}\}/$total_C_count/g;
-
-    $doc =~ s/\{\{meth_CpG_splitting\}\}/$meth_CpG/g;
-    $doc =~ s/\{\{meth_CHG_splitting\}\}/$meth_CHG/g;
-    $doc =~ s/\{\{meth_CHH_splitting\}\}/$meth_CHH/g;
-
-    $doc =~ s/\{\{unmeth_CpG_splitting\}\}/$unmeth_CpG/g;
-    $doc =~ s/\{\{unmeth_CHG_splitting\}\}/$unmeth_CHG/g;
-    $doc =~ s/\{\{unmeth_CHH_splitting\}\}/$unmeth_CHH/g;
-
-    unless (defined $perc_CpG){
-      $perc_CpG = 'N/A';
-    }
-    unless (defined $perc_CHG){
-      $perc_CHG = 'N/A';
-    }
-    unless (defined $perc_CHH){
-      $perc_CHH = 'N/A';
-    }
-    unless (defined $perc_unknown){
-      $perc_unknown = 'N/A';
-    }
-
-    ### Unknown sequence context, just for Bowtie 2 alignments
-    my $meth_unknown_inject;
-    my $unmeth_unknown_inject;
-    my $perc_unknown_inject;
-
-    if (defined $meth_unknown){ # if one Unknown context file is present, so should the others
-      $meth_unknown_inject = "     <tr>
-                                <th>Methylated C's in Unknown context</th>
-    				<td>$meth_unknown</td>
-    			</tr>";
-      $unmeth_unknown_inject = "     <tr>
-                                <th>Unmethylated C's in Unknown context</th>
-    				<td>$unmeth_unknown</td>
-    			</tr>";
-      $perc_unknown_inject = "     <tr>
-                                <th>Methylated C's in Unknown context</th>
-    				<td>$perc_unknown%</td>
-    			</tr>";
-    }
-    else{
-      $meth_unknown_inject = $unmeth_unknown_inject = $perc_unknown_inject = '';
-    }
-
-    ### injecting this into the table
-    $doc =~ s/\{\{meth_unknown_splitting\}\}/$meth_unknown_inject/g;
-    $doc =~ s/\{\{unmeth_unknown_splitting\}\}/$unmeth_unknown_inject/g;
-    $doc =~ s/\{\{perc_unknown_splitting\}\}/$perc_unknown_inject/g;
-
-    # for the graph we need to take care that there are no N/A values in the percentage fields
-    my ($perc_CpG_graph, $perc_CHG_graph,$perc_CHH_graph,$perc_unknown_graph);
-
-    if ($perc_CpG eq 'N/A'){
-      $perc_CpG_graph = 0; # values of 0 won't show in the graph and won't produce errors
-    }
-    else{
-      $perc_CpG_graph =  $perc_CpG;
-    }
-
-    if ($perc_CHG eq 'N/A'){
-      $perc_CHG_graph = 0; # values of 0 won't show in the graph and won't produce errors
-    }
-    else{
-      $perc_CHG_graph =  $perc_CHG;
-    }
-
-    if ($perc_CHH eq 'N/A'){
-      $perc_CHH_graph = 0; # values of 0 won't show in the graph and won't produce errors
-    }
-    else{
-      $perc_CHH_graph =  $perc_CHH;
-    }
-
-    if ($perc_unknown eq 'N/A'){
-      $perc_unknown_graph = 0; # values of 0 won't show in the graph and won't produce errors
-    }
-    else{
-      $perc_unknown_graph =  $perc_unknown;
-    }
-
-    $doc =~ s/\{\{perc_CpG_graph_splitting\}\}/$perc_CpG_graph/g;
-    $doc =~ s/\{\{perc_CHG_graph_splitting\}\}/$perc_CHG_graph/g;
-    $doc =~ s/\{\{perc_CHH_graph_splitting\}\}/$perc_CHH_graph/g;
-
-    $doc =~ s/\{\{perc_CpG_splitting\}\}/$perc_CpG/g;
-    $doc =~ s/\{\{perc_CHG_splitting\}\}/$perc_CHG/g;
-    $doc =~ s/\{\{perc_CHH_splitting\}\}/$perc_CHH/g;
-  }
-  else{
-    warn "Am I missing something? Try using --verbose to get a clue...\n\n";
-  }
-  warn "Complete\n\n";
-
-  return $doc;
-
-}
-
-
-sub read_mbias_report{
-
-  my ($mbias_report,$doc) = @_;
-
-  warn "Processing M-bias report $mbias_report ...\n";
-  open (MBIAS,$mbias_report) or die "Couldn't read from file $mbias_report: $!\n\n";
-
-  my %mbias_1;
-  my %mbias_2;
-
-  my $context;
-  my $read_identity;
-  my $state = 'single'; # setting this to 'single' if there is no read 2
-
-  while (<MBIAS>){
-    chomp;
-    if ($_ =~ /^(C.{2}) context/){
-      $context = $1;
-
-      if ($_ =~ /R2/){
-	$read_identity = 2;
-	$state = 'paired';
-      }
-      else{
-	$read_identity = 1;
-      }
-
-      # warn "new context is: $context\n";
-      # warn "Read identity is: Read $read_identity\n";
-    }
-    if ($_ =~ /^\d/){
-      my ($pos,$meth,$unmeth,$perc,$coverage) = (split /\t/);
-      if ($read_identity == 1){
-	push @{$mbias_1{$context}->{coverage}}, "[$pos, $coverage]";
-	push @{$mbias_1{$context}->{perc}}, "[$pos, $perc]";
-      }
-      elsif ($read_identity == 2){
-	push @{$mbias_2{$context}->{coverage}}, "[$pos, $coverage]";
-	push @{$mbias_2{$context}->{perc}}, "[$pos, $perc]";
-      }
-      else{
-	warn "read identity was unknown : '$read_identity'\n\n";
-      }
-
-      # print join (" ",$pos,$meth,$unmeth,$perc,$coverage)."\n";
-    }
-  }
-
-  # Read 1 M-bias
-  my $r1_CpG_coverage = join (',',@{$mbias_1{'CpG'}->{coverage}});
-  my $r1_CpG_perc     = join (',',@{$mbias_1{'CpG'}->{perc}});
-
-  my $r1_CHG_coverage = join (',',@{$mbias_1{'CHG'}->{coverage}});
-  my $r1_CHG_perc     = join (',',@{$mbias_1{'CHG'}->{perc}});
-
-  my $r1_CHH_coverage = join (',',@{$mbias_1{'CHH'}->{coverage}});
-  my $r1_CHH_perc     = join (',',@{$mbias_1{'CHH'}->{perc}});
-
-  $doc =~ s/\{\{CpG_total_calls_R1\}\}/$r1_CpG_coverage/g;
-  $doc =~ s/\{\{CHG_total_calls_R1\}\}/$r1_CHG_coverage/g;
-  $doc =~ s/\{\{CHH_total_calls_R1\}\}/$r1_CHH_coverage/g;
-
-  $doc =~ s/\{\{CpG_methylation_R1\}\}/$r1_CpG_perc/g;
-  $doc =~ s/\{\{CHG_methylation_R1\}\}/$r1_CHG_perc/g;
-  $doc =~ s/\{\{CHH_methylation_R1\}\}/$r1_CHH_perc/g;
-
-  # Read 2 M-bias
-  if (%mbias_2){
-      my $r2_CpG_coverage = join (',',@{$mbias_2{'CpG'}->{coverage}});
-      my $r2_CpG_perc     = join (',',@{$mbias_2{'CpG'}->{perc}});
-      
-      my $r2_CHG_coverage = join (',',@{$mbias_2{'CHG'}->{coverage}});
-      my $r2_CHG_perc     = join (',',@{$mbias_2{'CHG'}->{perc}});
-      
-      my $r2_CHH_coverage = join (',',@{$mbias_2{'CHH'}->{coverage}});
-      my $r2_CHH_perc     = join (',',@{$mbias_2{'CHH'}->{perc}});
-      
-      $doc =~ s/\{\{CpG_total_calls_R2\}\}/$r2_CpG_coverage/g;
-      $doc =~ s/\{\{CHG_total_calls_R2\}\}/$r2_CHG_coverage/g;
-      $doc =~ s/\{\{CHH_total_calls_R2\}\}/$r2_CHH_coverage/g;
-      
-      $doc =~ s/\{\{CpG_methylation_R2\}\}/$r2_CpG_perc/g;
-      $doc =~ s/\{\{CHG_methylation_R2\}\}/$r2_CHG_perc/g;
-      $doc =~ s/\{\{CHH_methylation_R2\}\}/$r2_CHH_perc/g;
-  }
-  warn "Complete\n\n";
-
-  return ($state,$doc);
-
-}
-
-
-sub read_report_template{
-  my $doc;
-  warn "Attempting to open file from: $Bin/bismark_sitrep.tpl\n\n" if ($verbose);
-  open (DOC,"$Bin/bismark_sitrep.tpl") or die $!;
-  while(<DOC>){
-    chomp;
-    $_ =~ s/\r//g;
-    $doc .= $_."\n";
-  }
-
-  close DOC or die $!;
-  return $doc;
-}
-
-
-
-sub process_commandline{
-  my $help;
-  my $output_dir;
-  my $manual_output_file;
-  my $alignment_report;
-  my $dedup_report;
-  my $splitting_report;
-  my $mbias_report;
-  my $nucleotide_coverage_report;  # stores nucleotide coverage statistics
-  my $verbose;
-
-  my $version;
-
-  my $command_line = GetOptions ('help|man'              => \$help,
-				 'dir=s'                 => \$output_dir,
-				 'o|output=s'            => \$manual_output_file,
-				 'alignment_report=s'    => \$alignment_report,
-				 'dedup_report=s'        => \$dedup_report,
-				 'splitting_report=s'    => \$splitting_report,
-				 'mbias_report=s'        => \$mbias_report,
-				 'nucleotide_report=s'   => \$nucleotide_coverage_report, 
-				 'version'               => \$version,
-				 'verbose'               => \$verbose,
-				);
-
-  ### EXIT ON ERROR if there were errors with any of the supplied options
-  unless ($command_line){
-    die "Please respecify command line options\n";
-  }
-
-  ### HELPFILE
-  if ($help){
-    print_helpfile();
-    exit;
-  }
-
-  if ($version){
-    print << "VERSION";
-
-
-                              Bismark HTML Report Module
-
-                         bismark2report version: $bismark2report_version
-                            Copyright 2010-16 Felix Krueger
-                               Babraham Bioinformatics
-                www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-
-VERSION
-    exit;
-  }
-
-  ### OUTPUT DIR PATH
-  if (defined $output_dir){
-    unless ($output_dir eq ''){ # if the output dir has been passed on by the methylation extractor and is an empty string we don't want to change it
-      unless ($output_dir =~ /\/$/){
-	$output_dir =~ s/$/\//;
-      }
-    }
-  }
-  else{
-    $output_dir = '';
-  }
-
-
-  ## First we are looking for alignment reports, and then look whether there are any optional plots with the same base name
-
-  if ($alignment_report){
-    ### we only process the one alignment report (and possibly the other ones as well) that was specified
-    push @alignment_reports, $alignment_report;
-  }
-  else{ ### no alignment report specified, looking in the current directory for files ending in *E_report.txt (SE or PE)
-
-    ### looking in the current directory for report files. Less than 1 report file is not allowed
-    @alignment_reports = <*E_report.txt>;
-
-    if (scalar @alignment_reports == 0){
-      warn "Found no potential alignment reports in the current directory. Please specify a single Bismark alignment report file using the option '--alignment_report FILE'\n\n";
-      print_helpfile();
-      exit;
-    }
-    else{
-      # there are Bismark alignment report(s) in the directory
-      warn "Found ",scalar @alignment_reports," alignment reports in current directory. Now trying to figure out whether there are corresponding optional reports\n";
-    }
-  }
-
-  ### Ensuring that there isn't more than 1 file in @alignment_reports if someone manually specified an output file.
-  if (scalar @alignment_reports > 1){
-    if (defined $manual_output_file){
-      die "You cannot run bismark2report on more than 1 file while specifying a single output file. Either lose the option -o to derive the output filenames automatically, or specify a single Bismark alignment report file using the option '--alignment_report FILE'\n\n";
-    }
-  }
-
-  foreach my $aln (@alignment_reports){
-
-    # warn "Figuring things out for:\n$aln\n";
-    $aln =~ /^(.+)_(P|S)E_report.txt$/;
-    my $basename = $1;
-    # warn "using this basename:\n$basename\n\n";
-
-    ### DEDUPLICATION REPORT (optional)
-    if ($dedup_report){
-	warn "User specifified dedup report: $dedup_report\n";sleep(3);
-      if (lc$dedup_report eq 'none'){
-	push @dedup_reports, ''; # user may wish to skip this step by specifying 'none'
-      }
-      else{
-	push @dedup_reports, $dedup_report;
-      }
-    }
-    else{
-      ### looking in the current directory for a report file with the same base name
-      my @dedup_report_files = <$basename*deduplication_report.txt>;
-      # warn "Number of deduplication reports found in current directory for basename $1: ", scalar @dedup_report_files , "\n";
-
-      if (scalar @dedup_report_files > 1){
-	die "Found ", scalar @dedup_report_files ," potential deduplication reports with the same basename ($basename) in the current directory. Please specify a single report using the option '--dedup_report FILE' or otherwise provide filenames that are easier to figure out...\n\n";
-      }
-      elsif (scalar @dedup_report_files == 0){
-	push @dedup_reports, ''; # no corresponding deduplication report found
-      }
-      else{
-	# there is only a single deduplication report in the current directory, using this one
-	$dedup_report = shift @dedup_report_files;
-	push @dedup_reports, $dedup_report;
-	# warn "Going to use this dedup report: $dedup_report\n\n";
-      }
-    }
-
-    ### NUCLEOTIDE COVERAGE REPORT (optional)
-    if (defined $nucleotide_coverage_report){
-	# warn "User specified nucleotide coverage report: $nucleotide_coverage_report\n";sleep(1);
-	if (lc$nucleotide_coverage_report eq 'none'){
-	    push @nuc_reports, ''; # user may wish to skip this step by specifying 'none'
-	}
-	else{
-	    push @nuc_reports, $nucleotide_coverage_report;
-	}
-    }
-    else{
-	### looking in the current directory for a report file with the same base name
-	my @nucleotide_coverage_report_files = <$basename*nucleotide_stats.txt>;
-	# warn "Number of nucleotide coverage statistic reports found in current directory for basename $1: ", scalar @nucleotide_coverage_report_files , "\n";
-	
-	if (scalar @nucleotide_coverage_report_files > 1){
-	    die "Found ", scalar @nucleotide_coverage_report_files ," potential nucleotide coverage reports with the same basename ($basename) in the current directory. Please specify a single report using the option '--nucleotide_report FILE' or otherwise provide filenames that are easier to figure out...\n\n";
-	}
-	elsif (scalar @nucleotide_coverage_report_files == 0){
-	    # warn "Found no corresponding nucleotide coverage file\n";
-	    push @nuc_reports, ''; # no corresponding nucleotide coverge file report found
-	}
-	else{
-	    # there is only a single nucleotide coverage report in the current directory, using this one
-	    $nucleotide_coverage_report = shift @nucleotide_coverage_report_files;
-	    push @nuc_reports, $nucleotide_coverage_report;
-	    # warn "Going to use this nucleotide coverage report: $nucleotide_coverage_report\n\n"; sleep(3);
-	}
-    }
-
-    
-    ### METHYLATION EXTRACTOR SPLITTING REPORT
-    if ($splitting_report){
-      if (lc$splitting_report eq 'none'){
-	push @splitting_reports, ''; # user may wish to skip this step by specifying 'none'
-      }
-      else{
-	push @splitting_reports, $splitting_report;
-      }
-    }
-    else{
-      ### looking in the current directory for a report file with the same basename
-      my @splitting_report_files = <$basename*splitting_report.txt>;
-      # warn "Number of splitting reports found in current directory: ", scalar @splitting_report_files , "\n";
-
-      if (scalar @splitting_report_files > 1){
-	die "Found ", scalar @splitting_report_files ," potential methylation extractor splitting reports with the same basename ($basename) in the current directory. Please specify a single report using the option '--splitting_report FILE' or otherwise provide filenames that are easier to figure out...\n\n";
-      }
-      elsif (scalar @splitting_report_files == 0){
-	push @splitting_reports, ''; # no corresponding methylation extractor report found
-      }
-      else{
-	# there is only a single splitting report in the current directory, using this one
-	$splitting_report = shift @splitting_report_files;
-	push  @splitting_reports, $splitting_report;
-      }
-    }
-
-    ### M-BIAS REPORT
-    if ($mbias_report){
-      if (lc$mbias_report eq 'none'){
-	$mbias_report = ''; # user may wish to skip this step by specifying 'none'
-   	push @mbias_reports, $mbias_report;
-      }
-      else{
-	push @mbias_reports, $mbias_report;
-      }
-    }
-    else{
-      ### looking in the current directory for a single report file. More (or less) than 1 report file is not allowed
-      my @mbias_report_files = <$basename*M-bias.txt>;
-
-      # warn "Number of M-bias reports found in current directory: ", scalar @mbias_report_files , "\n";
-
-      if (scalar @mbias_report_files > 1){
-	die "Found ", scalar @mbias_report_files ," potential M-bias reports with the same basename ($basename) in the current directory. Please specify a single report using the option '--mbias_report FILE'or otherwise provide filenames that are easier to figure out automatically ...\n\n";
-      }
-      elsif (scalar @mbias_report_files == 0){
-	push @mbias_reports, '';
-      }
-      else{
-	# there is only a single M-bias report in the current directory, using this one
-	$mbias_report = shift @mbias_report_files;
-	push @mbias_reports, $mbias_report;
-      }
-    }
-    $dedup_report = $splitting_report = $mbias_report = $nucleotide_coverage_report = undef;
-  }
-
-  return ($output_dir,$verbose,$manual_output_file);
-
-}
-
-sub print_helpfile{
-  print <<EOF
-
-  SYNOPSIS:
-
-  This script uses a Bismark alignment report to generate a graphical HTML report page. Optionally, further reports of
-  the Bismark suite such as deduplication, methylation extractor splitting or M-bias reports can be specified as well. If several
-  Bismark reports are found in the same folder, a separate report will be generated for each of these, whereby the output filename
-  will be derived from the Bismark alignment report file. Bismark2report attempts to find optional reports automatically based
-  on the file basename.
-
-
-  USAGE: bismark2report [options]
-
-
--o/--output <filename>     Name of the output file (optional). If not specified explicitly, the output filename will be derived
-                           from the Bismark alignment report file. Specifying an output filename only works if the HTML report is
-                           to be generated for a single Bismark alignment report (and potentially additional reports).
-
---dir                      Output directory. Output is written to the current directory if not specified explicitly.
-
-
---alignment_report FILE    If not specified explicitly, bismark2report attempts to find Bismark report file(s) in the current
-                           directory and produces a separate HTML report for each mapping report file. Based on the basename of
-                           the Bismark mapping report, bismark2report will also attempt to find the other Bismark reports (see below)
-                           for inclusion into the HTML report. Specifying a Bismark alignment report file is mandatory.
-
---dedup_report FILE        If not specified explicitly, bismark2report attempts to find a deduplication report file with the same
-                           basename as the Bismark mapping report (generated by deduplicate_bismark) in the
-                           current working directory. Including a deduplication report is optional, and using the FILE 'none'
-                           will skip this step entirely.
-
---splitting_report FILE    If not specified explicitly, bismark2report attempts to find a splitting report file with the same
-                           basename as the Bismark mapping report (generated by the Bismark methylation extractor) in the current
-                           working directory. Including a splitting report is optional, and using the FILE 'none' will skip this
-                           step entirely.
-
---mbias_report FILE        If not specified explicitly, bismark2report attempts to find a single M-bias report file with the same
-                           basename as the Bismark mapping report (generated by the Bismark methylation extractor) in the current
-                           working directory. Including an M-Bias report is optional, and using the FILE 'none' will skip this step
-                           entirely.
-
---nucleotide_report FILE   If not specified explicitly, bismark2report attempts to find a single nucleotide coverage report file
-                           with the same basename as the Bismark mapping report (generated by Bismark with the option
-                           '--nucleotide_coverage') in the current working directory. Including a nucleotide coverage statistics
-                           report is optional, and using the FILE 'none' will skip this report entirely.
-
-                           Script last modified: 13 May 2016
-
-EOF
-    ;
-  exit 1;
-}
-
--- a/bismark_pretty_report/bismark2report_wrapper.py	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,122 +0,0 @@
-#!/usr/bin/python
-
-import argparse
-import os
-import shutil
-import subprocess
-import sys
-import tempfile
-import logging
-
-def cleanup_before_exit(tmp_dir):
-    if tmp_dir and os.path.exists(tmp_dir):
-        shutil.rmtree(tmp_dir)
-
-def get_arg():
-    parser = argparse.ArgumentParser()
-    parser.add_argument('--tool_dir', dest='tool_dir', action='store', nargs=1, metavar='tool_dir', type=str)
-    parser.add_argument('--alignment_report', dest='alignment_report', action='store', nargs=1, metavar='alignment_report', type=str)
-    parser.add_argument('--dedup_report', dest='dedup_report', action='store', nargs=1, metavar='dedup_report', type=str)
-    parser.add_argument('--splitting_report', dest='splitting_report', action='store', nargs=1, metavar='splitting_report', type=str)
-    parser.add_argument('--mbias_report', dest='mbias_report', action='store', nargs=1, metavar='mbias_report', type=str)
-    parser.add_argument('--nucleotide_report', dest='nucleotide_report', action='store', nargs=1, metavar='nucleotide_report', type=str)
-    parser.add_argument('--output_html_report', dest='output_html_report', action='store', nargs=1, metavar='output_html_report', type=str)
-    parser.add_argument('--output_html_report_link', dest='output_html_report_link', action='store', nargs=1, metavar='output_html_report_link', type=str)
-    parser.add_argument('--log_report', dest='log_report', action='store', nargs=1, metavar='log_report', type=str)
-    parser.add_argument('--output_dir', dest='job_dir', action='store', nargs=1, metavar='job_dir', type=str)
-    args = parser.parse_args()
-    return args
-
-def create_and_write_html_link(job_dir, output_html_report_link, tmp_dir):
-    """
-    Web browsers don't allow to open a link pointing to the absolute path of a local html file FROM a website page;
-    The only way to make such link functional is to integrate the local file inside the web structure of the site.
-    Galaxy has been designed such that the child_dir <dataset_[0-9]+_files> of the output_dir is considered as the root
-    of the html base tag (i.e <base href="/" /> for the current job running.
-    The function proceeds the following steps:
-    #1. Extracts the galaxy dir where the output files are stored
-    #2. Creating a child dir <dataset_[0-9]+_files> in this output_dir is needed because it is considered as the root of the html base tag
-    #   We can extract the exact name of this child dir from the jobs_directory name
-    #3. Moves the html file in this child_dir
-    """
-    output_path_list = output_html_report_link.split('/')
-    output_path = '/'.join(output_path_list[0:-1])
-    html_root = job_dir.split('/')[-1]
-    final_dir = os.path.join(output_path, html_root)
-    os.makedirs(final_dir)
-    shutil.move(os.path.join(tmp_dir, 'html_report'), os.path.join(final_dir, 'html_report.html'))
-
-    html_report = open(output_html_report_link, 'wb')
-    html_report.write('<!DOCTYPE html>\n')
-    html_report.write('<head>\n')
-    html_report.write('\t<meta http-equiv="content-type" content="text/html; charset=UTF-8">\n')
-    html_report.write('\t\t<base href="/" />\n')
-    html_report.write('\t\t<a href="html_report.html/" target="_blank">Link to Bismark Pretty Report Page</a>\n')
-    html_report.write('</head>')
-    html_report.close()
-
-def __main__():
-    args = get_arg()
-
-    tmp_dir = tempfile.mkdtemp(prefix='tmp', suffix='')
-
-    if args.log_report:
-        logging.basicConfig(level=logging.INFO, filename=args.log_report[0], filemode="a+", format='%(message)s')
-    else:
-        logging.basicConfig(level=logging.INFO, filename=os.path.join(tmp_dir, 'log_report.txt'), filemode="a+", format='%(message)s')
-
-    alignment_option = '--alignment_report'
-    alignment_report = args.alignment_report[0]
-    if args.dedup_report:
-        dedup_option = '--dedup_report'
-        dedup_report = args.dedup_report[0]
-    else:
-        dedup_option = ''
-        dedup_report = ''
-    if args.splitting_report:
-        splitting_option = '--splitting_report'
-        splitting_report = args.splitting_report[0]
-    else:
-        splitting_option = ''
-        splitting_report = ''
-    if args.mbias_report:
-        mbias_option = '--mbias_report'
-        mbias_report = args.mbias_report[0]
-    else:
-        mbias_option = ''
-        mbias_report = ''
-    if args.nucleotide_report:
-        nucleotide_option = '--nucleotide_report'
-        nucleotide_report = args.nucleotide_report[0]
-    else:
-        nucleotide_option = ''
-        nucleotide_report = ''
-
-    proc = subprocess.Popen(['perl', os.path.join(args.tool_dir[0], 'bismark2report'), alignment_option, alignment_report, dedup_option, dedup_report,\
-                             splitting_option, splitting_report, mbias_option, mbias_report, nucleotide_option, nucleotide_report,\
-                             '--dir', tmp_dir, '--output', 'html_report'],\
-                             stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
-    proc_out, proc_err = proc.communicate()
-
-    cmd = 'perl %s %s %s %s %s %s %s %s %s %s %s --output html_report --dir %s'\
-          % (os.path.join(args.tool_dir[0], 'bismark2report'), alignment_option, alignment_report, dedup_option, dedup_report,\
-             splitting_option, splitting_report, mbias_option, mbias_report, nucleotide_option, nucleotide_report, tmp_dir)
-
-    logging.info('COMMAND LINE:\n\n%s' % cmd)
-    logging.info("__________________________________________________________________\n")
-    logging.info("BISMARK PRETTY REPORT STDOUT:\n\n%s" % proc_out)
-    if proc_err:
-        logging.critical("__________________________________________________________________\n")
-        logging.critical("BISMARK PRETTY REPORT ERROR:\n\n%s" % proc_err)
-        sys.exit("Bismark pretty report crashed with the folowing error message:\n%s" % proc_err)
-
-    if args.output_html_report:
-        shutil.copy(os.path.join(tmp_dir, 'html_report'), args.output_html_report[0])
-
-    #This function writes a link towards the Bismark html page inside an html file.
-    #This is needed because the direct visualization of the Bismark html report via Galaxy is ugly
-    create_and_write_html_link(args.job_dir[0], args.output_html_report_link[0], tmp_dir)
-
-    cleanup_before_exit(tmp_dir)
-
-if __name__=="__main__": __main__()
\ No newline at end of file
--- a/bismark_pretty_report/bismark2report_wrapper.xml	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,75 +0,0 @@
-<tool id="bismark_pretty_report" name="Bismark Pretty Report" version="0.16.3">
-
-    <description>Generates a graphical HTML report page from report outputs of Bismark</description>
-    <!--<version_command>bismark version</version_command>-->
-
-    <requirements>
-        <requirement type="package" version="0.1.19">samtools</requirement>
-        <requirement type="package" version="2.1.0">bowtie2</requirement>
-    </requirements>
-
-    <stdio>
-        <exit_code range="1:" />
-        <exit_code range=":-1" />
-        <regex match="Error:" />
-        <regex match="Exception:" />
-    </stdio>
-
-    <command interpreter="python">
-<![CDATA[
-        bismark2report_wrapper.py
-
-        --tool_dir "$__tool_directory__"
-
-        --alignment_report "$alignment"
-
-        #if $additional_reports['dedup']:
-        	--dedup_report "$additional_reports['dedup']"
-        #end if
-        #if $additional_reports['splitting']:
-            --splitting_report "$additional_reports['splitting']"
-        #end if
-        #if $additional_reports['mbias']:
-            --mbias_report "$additional_reports['mbias']"
-        #end if
-        #if $additional_reports['nucleotide']:
-            --nucleotide_report "$additional_reports['nucleotide']"
-        #end if
-
-        ##--output_html_report $output_html_report
-        --output_html_report_link "$output_html_report_link"
-        --output_dir "$output_html_report_link.files_path"
-
-        ##--log_report $log_report
-]]>
-    </command>
-
-    <inputs>
-        <param name="alignment" type="data" format="txt" label="Submit a Bismark mapping report" optional="False"/>
-        <section name="additional_reports" title="Additional reports to include in the HTML page (optional)" expanded="True">
-            <param name="dedup" type="data" format="txt" label="Submit the corresponding Bismark deduplication report" optional="True" help="Optional output of the module *Bismark Deduplicate*"/>
-            <param name="splitting" type="data" format="txt" label="Submit the corresponding Bismark splitting report" optional="True" help="Optional output of the module *Bismark Methylation Extractor*"/>
-            <param name="mbias" type="data" format="txt" label="Submit the corresponding Bismark M-bias report" optional="True" help="Optional output of the module *Bismark Methylation Extractor*"/>
-            <param name="nucleotide" type="data" format="txt" label="Submit the corresponding Bismark nucleotide report" optional="True" help="Optional output of the module *Bismark Mapping*"/>
-        </section>
-    </inputs>
-
-    <outputs>
-        <!--<data name="output_html_report" format="html" label="${tool.name} on ${on_string}: Download pretty html report"/>-->
-        <data name="output_html_report_link" format="html" label="${tool.name} on ${on_string}: Visualize pretty html report"/>
-        <!--<data name="log_report" format="txt" label="${tool.name} on ${on_string}: log report (tool stdout)"/>-->
-    </outputs>
-
-    <help>
-<![CDATA[
-**What it does**
-
-    | This tool uses a Bismark alignment report to generate a graphical HTML report page.
-    | Optionally, further reports of the Bismark suite such as deduplication, methylation extractor splitting or M-bias reports can be specified as well.
-
-]]>
-  </help>
-  <citations>
-      <citation type="doi">10.1093/bioinformatics/btr167</citation>
-  </citations>
-</tool>
--- a/bismark_pretty_report/bismark_sitrep.tpl	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,807 +0,0 @@
-<!DOCTYPE html>
-<html>
-<head>
-	<meta http-equiv="content-type" content="text/html; charset=UTF-8">
-	<title>Bismark Processing Report - {{filename}}</title>
-	<style type="text/css">
-		body {
-			font-family: Arial, sans-serif;
-			font-size:14px;
-			padding:0 20px 20px;
-		}
-		.container {
-			margin:0 auto;
-			max-width:1200px;
-		}
-		.header h1,
-		.header img {
-			float:left;
-		}
-		.header h1 {
-			margin: 20px 0 10px;
-		}
-		.header img {
-			padding: 0 20px 20px 0;
-		}
-		.subtitle {
-			margin-top:120px;
-			float:right;
-			text-align:right;
-
-		}
-		.header_subtitle h3,
-		.header_subtitle p {
-			margin:0;
-		}
-		h1 {
-			font-size: 3.2em;
-		}
-		h2 {
-			font-size:2.2em;
-		}
-		h3 {
-			font-size:1.4em;
-		}
-		h2, h3, hr {
-			clear:both;
-		}
-		hr {
-			border-top:1px solid #CCC;
-			border-bottom:1px solid #F3F3F3;
-			border-left:0;
-			border-right:0;
-			height:0;
-		}
-		.data {
-			float:left;
-			width:500px;
-			max-width:100%;
-			margin-right:30px;
-			border:1px solid #CCC;
-			border-collapse:separate;
-			border-spacing: 0;
-			border-left:0;
-			-webkit-border-radius:4px;
-			-moz-border-radius:4px;
-			border-radius:4px;
-		}
-		.data th, .data td {
-			border-left:1px solid #CCC;
-			border-top:1px solid #CCC;
-			padding:5px 7px;
-		}
-		.data tr:first-child th,
-		.data tr:first-child td {
-			border-top:0;
-		}
-		.data tr:last-child th,
-		.data tr:last-child td {
-			border-bottom: 2px solid #666;
-		}
-		.plot {
-			width:650px;
-			max-width:100%;
-			float:left;
-			margin-bottom:30px;
-		}
-		
-		.fullWidth_plot {
-			height: 600px;
-		}
-		
-		.data th {
-			text-align:left;
-		}
-		.data td {
-			text-align:right;
-		}
-		footer {
-			color:#999;
-		}
-		footer a {
-			color:#999;
-		}
-	</style>
-</head>
-<body>
-	<script>
-		/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license
-		//@ sourceMappingURL=jquery-1.10.2.min.map
-		*/
-		(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="<div class='a'></div><div class='a i'></div>",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="<select><option selected=''></option></select>",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="<a href='#'></a>","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="<input/>",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav></:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="<table><tr><td></td><td>t</td></tr></table>",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="<div></div>",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t
-		}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/<tbody/i,wt=/<|&#?\w+;/,Tt=/<(?:script|style|link)/i,Ct=/^(?:checkbox|radio)$/i,Nt=/checked\s*(?:[^=]|=\s*.checked.)/i,kt=/^$|\/(?:java|ecma)script/i,Et=/^true\/(.*)/,St=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,At={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:x.support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1></$2>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1></$2>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?"<table>"!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle);
-		u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("<iframe frameborder='0' width='0' height='0'/>").css("cssText","display:block !important")).appendTo(t.documentElement),t=(Pt[0].contentWindow||Pt[0].contentDocument).document,t.write("<!doctype html><html><body>"),t.close(),n=un(e,t),Pt.detach()),Gt[e]=n),n}function un(e,t){var n=x(t.createElement(e)).appendTo(t.body),r=x.css(n[0],"display");return n.remove(),r}x.each(["height","width"],function(e,n){x.cssHooks[n]={get:function(e,r,i){return r?0===e.offsetWidth&&Xt.test(x.css(e,"display"))?x.swap(e,Qt,function(){return sn(e,n,i)}):sn(e,n,i):t},set:function(e,t,r){var i=r&&Rt(e);return on(e,t,r?an(e,n,r,x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,i),i):0)}}}),x.support.opacity||(x.cssHooks.opacity={get:function(e,t){return It.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=x.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===x.trim(o.replace($t,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=$t.test(o)?o.replace($t,i):o+" "+i)}}),x(function(){x.support.reliableMarginRight||(x.cssHooks.marginRight={get:function(e,n){return n?x.swap(e,{display:"inline-block"},Wt,[e,"marginRight"]):t}}),!x.support.pixelPosition&&x.fn.position&&x.each(["top","left"],function(e,n){x.cssHooks[n]={get:function(e,r){return r?(r=Wt(e,n),Yt.test(r)?x(e).position()[n]+"px":r):t}}})}),x.expr&&x.expr.filters&&(x.expr.filters.hidden=function(e){return 0>=e.offsetWidth&&0>=e.offsetHeight||!x.support.reliableHiddenOffsets&&"none"===(e.style&&e.style.display||x.css(e,"display"))},x.expr.filters.visible=function(e){return!x.expr.filters.hidden(e)}),x.each({margin:"",padding:"",border:"Width"},function(e,t){x.cssHooks[e+t]={expand:function(n){var r=0,i={},o="string"==typeof n?n.split(" "):[n];for(;4>r;r++)i[e+Zt[r]+t]=o[r]||o[r-2]||o[0];return i}},Ut.test(e)||(x.cssHooks[e+t].set=on)});var cn=/%20/g,pn=/\[\]$/,fn=/\r?\n/g,dn=/^(?:submit|button|image|reset|file)$/i,hn=/^(?:input|select|textarea|keygen)/i;x.fn.extend({serialize:function(){return x.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=x.prop(this,"elements");return e?x.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!x(this).is(":disabled")&&hn.test(this.nodeName)&&!dn.test(e)&&(this.checked||!Ct.test(e))}).map(function(e,t){var n=x(this).val();return null==n?null:x.isArray(n)?x.map(n,function(e){return{name:t.name,value:e.replace(fn,"\r\n")}}):{name:t.name,value:n.replace(fn,"\r\n")}}).get()}}),x.param=function(e,n){var r,i=[],o=function(e,t){t=x.isFunction(t)?t():null==t?"":t,i[i.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(n===t&&(n=x.ajaxSettings&&x.ajaxSettings.traditional),x.isArray(e)||e.jquery&&!x.isPlainObject(e))x.each(e,function(){o(this.name,this.value)});else for(r in e)gn(r,e[r],n,o);return i.join("&").replace(cn,"+")};function gn(e,t,n,r){var i;if(x.isArray(t))x.each(t,function(t,i){n||pn.test(e)?r(e,i):gn(e+"["+("object"==typeof i?t:"")+"]",i,n,r)});else if(n||"object"!==x.type(t))r(e,t);else for(i in t)gn(e+"["+i+"]",t[i],n,r)}x.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){x.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),x.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}});var mn,yn,vn=x.now(),bn=/\?/,xn=/#.*$/,wn=/([?&])_=[^&]*/,Tn=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Cn=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Nn=/^(?:GET|HEAD)$/,kn=/^\/\//,En=/^([\w.+-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,Sn=x.fn.load,An={},jn={},Dn="*/".concat("*");try{yn=o.href}catch(Ln){yn=a.createElement("a"),yn.href="",yn=yn.href}mn=En.exec(yn.toLowerCase())||[];function Hn(e){return function(t,n){"string"!=typeof t&&(n=t,t="*");var r,i=0,o=t.toLowerCase().match(T)||[];if(x.isFunction(n))while(r=o[i++])"+"===r[0]?(r=r.slice(1)||"*",(e[r]=e[r]||[]).unshift(n)):(e[r]=e[r]||[]).push(n)}}function qn(e,n,r,i){var o={},a=e===jn;function s(l){var u;return o[l]=!0,x.each(e[l]||[],function(e,l){var c=l(n,r,i);return"string"!=typeof c||a||o[c]?a?!(u=c):t:(n.dataTypes.unshift(c),s(c),!1)}),u}return s(n.dataTypes[0])||!o["*"]&&s("*")}function _n(e,n){var r,i,o=x.ajaxSettings.flatOptions||{};for(i in n)n[i]!==t&&((o[i]?e:r||(r={}))[i]=n[i]);return r&&x.extend(!0,e,r),e}x.fn.load=function(e,n,r){if("string"!=typeof e&&Sn)return Sn.apply(this,arguments);var i,o,a,s=this,l=e.indexOf(" ");return l>=0&&(i=e.slice(l,e.length),e=e.slice(0,l)),x.isFunction(n)?(r=n,n=t):n&&"object"==typeof n&&(a="POST"),s.length>0&&x.ajax({url:e,type:a,dataType:"html",data:n}).done(function(e){o=arguments,s.html(i?x("<div>").append(x.parseHTML(e)).find(i):e)}).complete(r&&function(e,t){s.each(r,o||[e.responseText,t,e])}),this},x.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){x.fn[t]=function(e){return this.on(t,e)}}),x.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:yn,type:"GET",isLocal:Cn.test(mn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Dn,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":x.parseJSON,"text xml":x.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?_n(_n(e,x.ajaxSettings),t):_n(x.ajaxSettings,e)},ajaxPrefilter:Hn(An),ajaxTransport:Hn(jn),ajax:function(e,n){"object"==typeof e&&(n=e,e=t),n=n||{};var r,i,o,a,s,l,u,c,p=x.ajaxSetup({},n),f=p.context||p,d=p.context&&(f.nodeType||f.jquery)?x(f):x.event,h=x.Deferred(),g=x.Callbacks("once memory"),m=p.statusCode||{},y={},v={},b=0,w="canceled",C={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!c){c={};while(t=Tn.exec(a))c[t[1].toLowerCase()]=t[2]}t=c[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?a:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=v[n]=v[n]||e,y[e]=t),this},overrideMimeType:function(e){return b||(p.mimeType=e),this},statusCode:function(e){var t;if(e)if(2>b)for(t in e)m[t]=[m[t],e[t]];else C.always(e[C.status]);return this},abort:function(e){var t=e||w;return u&&u.abort(t),k(0,t),this}};if(h.promise(C).complete=g.add,C.success=C.done,C.error=C.fail,p.url=((e||p.url||yn)+"").replace(xn,"").replace(kn,mn[1]+"//"),p.type=n.method||n.type||p.method||p.type,p.dataTypes=x.trim(p.dataType||"*").toLowerCase().match(T)||[""],null==p.crossDomain&&(r=En.exec(p.url.toLowerCase()),p.crossDomain=!(!r||r[1]===mn[1]&&r[2]===mn[2]&&(r[3]||("http:"===r[1]?"80":"443"))===(mn[3]||("http:"===mn[1]?"80":"443")))),p.data&&p.processData&&"string"!=typeof p.data&&(p.data=x.param(p.data,p.traditional)),qn(An,p,n,C),2===b)return C;l=p.global,l&&0===x.active++&&x.event.trigger("ajaxStart"),p.type=p.type.toUpperCase(),p.hasContent=!Nn.test(p.type),o=p.url,p.hasContent||(p.data&&(o=p.url+=(bn.test(o)?"&":"?")+p.data,delete p.data),p.cache===!1&&(p.url=wn.test(o)?o.replace(wn,"$1_="+vn++):o+(bn.test(o)?"&":"?")+"_="+vn++)),p.ifModified&&(x.lastModified[o]&&C.setRequestHeader("If-Modified-Since",x.lastModified[o]),x.etag[o]&&C.setRequestHeader("If-None-Match",x.etag[o])),(p.data&&p.hasContent&&p.contentType!==!1||n.contentType)&&C.setRequestHeader("Content-Type",p.contentType),C.setRequestHeader("Accept",p.dataTypes[0]&&p.accepts[p.dataTypes[0]]?p.accepts[p.dataTypes[0]]+("*"!==p.dataTypes[0]?", "+Dn+"; q=0.01":""):p.accepts["*"]);for(i in p.headers)C.setRequestHeader(i,p.headers[i]);if(p.beforeSend&&(p.beforeSend.call(f,C,p)===!1||2===b))return C.abort();w="abort";for(i in{success:1,error:1,complete:1})C[i](p[i]);if(u=qn(jn,p,n,C)){C.readyState=1,l&&d.trigger("ajaxSend",[C,p]),p.async&&p.timeout>0&&(s=setTimeout(function(){C.abort("timeout")},p.timeout));try{b=1,u.send(y,k)}catch(N){if(!(2>b))throw N;k(-1,N)}}else k(-1,"No Transport");function k(e,n,r,i){var c,y,v,w,T,N=n;2!==b&&(b=2,s&&clearTimeout(s),u=t,a=i||"",C.readyState=e>0?4:0,c=e>=200&&300>e||304===e,r&&(w=Mn(p,C,r)),w=On(p,w,C,c),c?(p.ifModified&&(T=C.getResponseHeader("Last-Modified"),T&&(x.lastModified[o]=T),T=C.getResponseHeader("etag"),T&&(x.etag[o]=T)),204===e||"HEAD"===p.type?N="nocontent":304===e?N="notmodified":(N=w.state,y=w.data,v=w.error,c=!v)):(v=N,(e||!N)&&(N="error",0>e&&(e=0))),C.status=e,C.statusText=(n||N)+"",c?h.resolveWith(f,[y,N,C]):h.rejectWith(f,[C,N,v]),C.statusCode(m),m=t,l&&d.trigger(c?"ajaxSuccess":"ajaxError",[C,p,c?y:v]),g.fireWith(f,[C,N]),l&&(d.trigger("ajaxComplete",[C,p]),--x.active||x.event.trigger("ajaxStop")))}return C},getJSON:function(e,t,n){return x.get(e,t,n,"json")},getScript:function(e,n){return x.get(e,t,n,"script")}}),x.each(["get","post"],function(e,n){x[n]=function(e,r,i,o){return x.isFunction(r)&&(o=o||i,i=r,r=t),x.ajax({url:e,type:n,dataType:o,data:r,success:i})}});function Mn(e,n,r){var i,o,a,s,l=e.contents,u=e.dataTypes;while("*"===u[0])u.shift(),o===t&&(o=e.mimeType||n.getResponseHeader("Content-Type"));if(o)for(s in l)if(l[s]&&l[s].test(o)){u.unshift(s);break}if(u[0]in r)a=u[0];else{for(s in r){if(!u[0]||e.converters[s+" "+u[0]]){a=s;break}i||(i=s)}a=a||i}return a?(a!==u[0]&&u.unshift(a),r[a]):t}function On(e,t,n,r){var i,o,a,s,l,u={},c=e.dataTypes.slice();if(c[1])for(a in e.converters)u[a.toLowerCase()]=e.converters[a];o=c.shift();while(o)if(e.responseFields[o]&&(n[e.responseFields[o]]=t),!l&&r&&e.dataFilter&&(t=e.dataFilter(t,e.dataType)),l=o,o=c.shift())if("*"===o)o=l;else if("*"!==l&&l!==o){if(a=u[l+" "+o]||u["* "+o],!a)for(i in u)if(s=i.split(" "),s[1]===o&&(a=u[l+" "+s[0]]||u["* "+s[0]])){a===!0?a=u[i]:u[i]!==!0&&(o=s[0],c.unshift(s[1]));break}if(a!==!0)if(a&&e["throws"])t=a(t);else try{t=a(t)}catch(p){return{state:"parsererror",error:a?p:"No conversion from "+l+" to "+o}}}return{state:"success",data:t}}x.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(e){return x.globalEval(e),e}}}),x.ajaxPrefilter("script",function(e){e.cache===t&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),x.ajaxTransport("script",function(e){if(e.crossDomain){var n,r=a.head||x("head")[0]||a.documentElement;return{send:function(t,i){n=a.createElement("script"),n.async=!0,e.scriptCharset&&(n.charset=e.scriptCharset),n.src=e.url,n.onload=n.onreadystatechange=function(e,t){(t||!n.readyState||/loaded|complete/.test(n.readyState))&&(n.onload=n.onreadystatechange=null,n.parentNode&&n.parentNode.removeChild(n),n=null,t||i(200,"success"))},r.insertBefore(n,r.firstChild)},abort:function(){n&&n.onload(t,!0)}}}});var Fn=[],Bn=/(=)\?(?=&|$)|\?\?/;x.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Fn.pop()||x.expando+"_"+vn++;return this[e]=!0,e}}),x.ajaxPrefilter("json jsonp",function(n,r,i){var o,a,s,l=n.jsonp!==!1&&(Bn.test(n.url)?"url":"string"==typeof n.data&&!(n.contentType||"").indexOf("application/x-www-form-urlencoded")&&Bn.test(n.data)&&"data");return l||"jsonp"===n.dataTypes[0]?(o=n.jsonpCallback=x.isFunction(n.jsonpCallback)?n.jsonpCallback():n.jsonpCallback,l?n[l]=n[l].replace(Bn,"$1"+o):n.jsonp!==!1&&(n.url+=(bn.test(n.url)?"&":"?")+n.jsonp+"="+o),n.converters["script json"]=function(){return s||x.error(o+" was not called"),s[0]},n.dataTypes[0]="json",a=e[o],e[o]=function(){s=arguments},i.always(function(){e[o]=a,n[o]&&(n.jsonpCallback=r.jsonpCallback,Fn.push(o)),s&&x.isFunction(a)&&a(s[0]),s=a=t}),"script"):t});var Pn,Rn,Wn=0,$n=e.ActiveXObject&&function(){var e;for(e in Pn)Pn[e](t,!0)};function In(){try{return new e.XMLHttpRequest}catch(t){}}function zn(){try{return new e.ActiveXObject("Microsoft.XMLHTTP")}catch(t){}}x.ajaxSettings.xhr=e.ActiveXObject?function(){return!this.isLocal&&In()||zn()}:In,Rn=x.ajaxSettings.xhr(),x.support.cors=!!Rn&&"withCredentials"in Rn,Rn=x.support.ajax=!!Rn,Rn&&x.ajaxTransport(function(n){if(!n.crossDomain||x.support.cors){var r;return{send:function(i,o){var a,s,l=n.xhr();if(n.username?l.open(n.type,n.url,n.async,n.username,n.password):l.open(n.type,n.url,n.async),n.xhrFields)for(s in n.xhrFields)l[s]=n.xhrFields[s];n.mimeType&&l.overrideMimeType&&l.overrideMimeType(n.mimeType),n.crossDomain||i["X-Requested-With"]||(i["X-Requested-With"]="XMLHttpRequest");try{for(s in i)l.setRequestHeader(s,i[s])}catch(u){}l.send(n.hasContent&&n.data||null),r=function(e,i){var s,u,c,p;try{if(r&&(i||4===l.readyState))if(r=t,a&&(l.onreadystatechange=x.noop,$n&&delete Pn[a]),i)4!==l.readyState&&l.abort();else{p={},s=l.status,u=l.getAllResponseHeaders(),"string"==typeof l.responseText&&(p.text=l.responseText);try{c=l.statusText}catch(f){c=""}s||!n.isLocal||n.crossDomain?1223===s&&(s=204):s=p.text?200:404}}catch(d){i||o(-1,d)}p&&o(s,c,p,u)},n.async?4===l.readyState?setTimeout(r):(a=++Wn,$n&&(Pn||(Pn={},x(e).unload($n)),Pn[a]=r),l.onreadystatechange=r):r()},abort:function(){r&&r(t,!0)}}}});var Xn,Un,Vn=/^(?:toggle|show|hide)$/,Yn=RegExp("^(?:([+-])=|)("+w+")([a-z%]*)$","i"),Jn=/queueHooks$/,Gn=[nr],Qn={"*":[function(e,t){var n=this.createTween(e,t),r=n.cur(),i=Yn.exec(t),o=i&&i[3]||(x.cssNumber[e]?"":"px"),a=(x.cssNumber[e]||"px"!==o&&+r)&&Yn.exec(x.css(n.elem,e)),s=1,l=20;if(a&&a[3]!==o){o=o||a[3],i=i||[],a=+r||1;do s=s||".5",a/=s,x.style(n.elem,e,a+o);while(s!==(s=n.cur()/r)&&1!==s&&--l)}return i&&(a=n.start=+a||+r||0,n.unit=o,n.end=i[1]?a+(i[1]+1)*i[2]:+i[2]),n}]};function Kn(){return setTimeout(function(){Xn=t}),Xn=x.now()}function Zn(e,t,n){var r,i=(Qn[t]||[]).concat(Qn["*"]),o=0,a=i.length;for(;a>o;o++)if(r=i[o].call(n,t,e))return r}function er(e,t,n){var r,i,o=0,a=Gn.length,s=x.Deferred().always(function(){delete l.elem}),l=function(){if(i)return!1;var t=Xn||Kn(),n=Math.max(0,u.startTime+u.duration-t),r=n/u.duration||0,o=1-r,a=0,l=u.tweens.length;for(;l>a;a++)u.tweens[a].run(o);return s.notifyWith(e,[u,o,n]),1>o&&l?n:(s.resolveWith(e,[u]),!1)},u=s.promise({elem:e,props:x.extend({},t),opts:x.extend(!0,{specialEasing:{}},n),originalProperties:t,originalOptions:n,startTime:Xn||Kn(),duration:n.duration,tweens:[],createTween:function(t,n){var r=x.Tween(e,u.opts,t,n,u.opts.specialEasing[t]||u.opts.easing);return u.tweens.push(r),r},stop:function(t){var n=0,r=t?u.tweens.length:0;if(i)return this;for(i=!0;r>n;n++)u.tweens[n].run(1);return t?s.resolveWith(e,[u,t]):s.rejectWith(e,[u,t]),this}}),c=u.props;for(tr(c,u.opts.specialEasing);a>o;o++)if(r=Gn[o].call(u,e,c,u.opts))return r;return x.map(c,Zn,u),x.isFunction(u.opts.start)&&u.opts.start.call(e,u),x.fx.timer(x.extend(l,{elem:e,anim:u,queue:u.opts.queue})),u.progress(u.opts.progress).done(u.opts.done,u.opts.complete).fail(u.opts.fail).always(u.opts.always)}function tr(e,t){var n,r,i,o,a;for(n in e)if(r=x.camelCase(n),i=t[r],o=e[n],x.isArray(o)&&(i=o[1],o=e[n]=o[0]),n!==r&&(e[r]=o,delete e[n]),a=x.cssHooks[r],a&&"expand"in a){o=a.expand(o),delete e[r];for(n in o)n in e||(e[n]=o[n],t[n]=i)}else t[r]=i}x.Animation=x.extend(er,{tweener:function(e,t){x.isFunction(e)?(t=e,e=["*"]):e=e.split(" ");var n,r=0,i=e.length;for(;i>r;r++)n=e[r],Qn[n]=Qn[n]||[],Qn[n].unshift(t)},prefilter:function(e,t){t?Gn.unshift(e):Gn.push(e)}});function nr(e,t,n){var r,i,o,a,s,l,u=this,c={},p=e.style,f=e.nodeType&&nn(e),d=x._data(e,"fxshow");n.queue||(s=x._queueHooks(e,"fx"),null==s.unqueued&&(s.unqueued=0,l=s.empty.fire,s.empty.fire=function(){s.unqueued||l()}),s.unqueued++,u.always(function(){u.always(function(){s.unqueued--,x.queue(e,"fx").length||s.empty.fire()})})),1===e.nodeType&&("height"in t||"width"in t)&&(n.overflow=[p.overflow,p.overflowX,p.overflowY],"inline"===x.css(e,"display")&&"none"===x.css(e,"float")&&(x.support.inlineBlockNeedsLayout&&"inline"!==ln(e.nodeName)?p.zoom=1:p.display="inline-block")),n.overflow&&(p.overflow="hidden",x.support.shrinkWrapBlocks||u.always(function(){p.overflow=n.overflow[0],p.overflowX=n.overflow[1],p.overflowY=n.overflow[2]}));for(r in t)if(i=t[r],Vn.exec(i)){if(delete t[r],o=o||"toggle"===i,i===(f?"hide":"show"))continue;c[r]=d&&d[r]||x.style(e,r)}if(!x.isEmptyObject(c)){d?"hidden"in d&&(f=d.hidden):d=x._data(e,"fxshow",{}),o&&(d.hidden=!f),f?x(e).show():u.done(function(){x(e).hide()}),u.done(function(){var t;x._removeData(e,"fxshow");for(t in c)x.style(e,t,c[t])});for(r in c)a=Zn(f?d[r]:0,r,u),r in d||(d[r]=a.start,f&&(a.end=a.start,a.start="width"===r||"height"===r?1:0))}}function rr(e,t,n,r,i){return new rr.prototype.init(e,t,n,r,i)}x.Tween=rr,rr.prototype={constructor:rr,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||"swing",this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(x.cssNumber[n]?"":"px")},cur:function(){var e=rr.propHooks[this.prop];return e&&e.get?e.get(this):rr.propHooks._default.get(this)},run:function(e){var t,n=rr.propHooks[this.prop];return this.pos=t=this.options.duration?x.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):rr.propHooks._default.set(this),this}},rr.prototype.init.prototype=rr.prototype,rr.propHooks={_default:{get:function(e){var t;return null==e.elem[e.prop]||e.elem.style&&null!=e.elem.style[e.prop]?(t=x.css(e.elem,e.prop,""),t&&"auto"!==t?t:0):e.elem[e.prop]},set:function(e){x.fx.step[e.prop]?x.fx.step[e.prop](e):e.elem.style&&(null!=e.elem.style[x.cssProps[e.prop]]||x.cssHooks[e.prop])?x.style(e.elem,e.prop,e.now+e.unit):e.elem[e.prop]=e.now}}},rr.propHooks.scrollTop=rr.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},x.each(["toggle","show","hide"],function(e,t){var n=x.fn[t];x.fn[t]=function(e,r,i){return null==e||"boolean"==typeof e?n.apply(this,arguments):this.animate(ir(t,!0),e,r,i)}}),x.fn.extend({fadeTo:function(e,t,n,r){return this.filter(nn).css("opacity",0).show().end().animate({opacity:t},e,n,r)},animate:function(e,t,n,r){var i=x.isEmptyObject(e),o=x.speed(t,n,r),a=function(){var t=er(this,x.extend({},e),o);(i||x._data(this,"finish"))&&t.stop(!0)};return a.finish=a,i||o.queue===!1?this.each(a):this.queue(o.queue,a)},stop:function(e,n,r){var i=function(e){var t=e.stop;delete e.stop,t(r)};return"string"!=typeof e&&(r=n,n=e,e=t),n&&e!==!1&&this.queue(e||"fx",[]),this.each(function(){var t=!0,n=null!=e&&e+"queueHooks",o=x.timers,a=x._data(this);if(n)a[n]&&a[n].stop&&i(a[n]);else for(n in a)a[n]&&a[n].stop&&Jn.test(n)&&i(a[n]);for(n=o.length;n--;)o[n].elem!==this||null!=e&&o[n].queue!==e||(o[n].anim.stop(r),t=!1,o.splice(n,1));(t||!r)&&x.dequeue(this,e)})},finish:function(e){return e!==!1&&(e=e||"fx"),this.each(function(){var t,n=x._data(this),r=n[e+"queue"],i=n[e+"queueHooks"],o=x.timers,a=r?r.length:0;for(n.finish=!0,x.queue(this,e,[]),i&&i.stop&&i.stop.call(this,!0),t=o.length;t--;)o[t].elem===this&&o[t].queue===e&&(o[t].anim.stop(!0),o.splice(t,1));for(t=0;a>t;t++)r[t]&&r[t].finish&&r[t].finish.call(this);delete n.finish})}});function ir(e,t){var n,r={height:e},i=0;for(t=t?1:0;4>i;i+=2-t)n=Zt[i],r["margin"+n]=r["padding"+n]=e;return t&&(r.opacity=r.width=e),r}x.each({slideDown:ir("show"),slideUp:ir("hide"),slideToggle:ir("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(e,t){x.fn[e]=function(e,n,r){return this.animate(t,e,n,r)}}),x.speed=function(e,t,n){var r=e&&"object"==typeof e?x.extend({},e):{complete:n||!n&&t||x.isFunction(e)&&e,duration:e,easing:n&&t||t&&!x.isFunction(t)&&t};return r.duration=x.fx.off?0:"number"==typeof r.duration?r.duration:r.duration in x.fx.speeds?x.fx.speeds[r.duration]:x.fx.speeds._default,(null==r.queue||r.queue===!0)&&(r.queue="fx"),r.old=r.complete,r.complete=function(){x.isFunction(r.old)&&r.old.call(this),r.queue&&x.dequeue(this,r.queue)},r},x.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2}},x.timers=[],x.fx=rr.prototype.init,x.fx.tick=function(){var e,n=x.timers,r=0;for(Xn=x.now();n.length>r;r++)e=n[r],e()||n[r]!==e||n.splice(r--,1);n.length||x.fx.stop(),Xn=t},x.fx.timer=function(e){e()&&x.timers.push(e)&&x.fx.start()},x.fx.interval=13,x.fx.start=function(){Un||(Un=setInterval(x.fx.tick,x.fx.interval))},x.fx.stop=function(){clearInterval(Un),Un=null},x.fx.speeds={slow:600,fast:200,_default:400},x.fx.step={},x.expr&&x.expr.filters&&(x.expr.filters.animated=function(e){return x.grep(x.timers,function(t){return e===t.elem}).length}),x.fn.offset=function(e){if(arguments.length)return e===t?this:this.each(function(t){x.offset.setOffset(this,e,t)});var n,r,o={top:0,left:0},a=this[0],s=a&&a.ownerDocument;if(s)return n=s.documentElement,x.contains(n,a)?(typeof a.getBoundingClientRect!==i&&(o=a.getBoundingClientRect()),r=or(s),{top:o.top+(r.pageYOffset||n.scrollTop)-(n.clientTop||0),left:o.left+(r.pageXOffset||n.scrollLeft)-(n.clientLeft||0)}):o},x.offset={setOffset:function(e,t,n){var r=x.css(e,"position");"static"===r&&(e.style.position="relative");var i=x(e),o=i.offset(),a=x.css(e,"top"),s=x.css(e,"left"),l=("absolute"===r||"fixed"===r)&&x.inArray("auto",[a,s])>-1,u={},c={},p,f;l?(c=i.position(),p=c.top,f=c.left):(p=parseFloat(a)||0,f=parseFloat(s)||0),x.isFunction(t)&&(t=t.call(e,n,o)),null!=t.top&&(u.top=t.top-o.top+p),null!=t.left&&(u.left=t.left-o.left+f),"using"in t?t.using.call(e,u):i.css(u)}},x.fn.extend({position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===x.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),x.nodeName(e[0],"html")||(n=e.offset()),n.top+=x.css(e[0],"borderTopWidth",!0),n.left+=x.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-x.css(r,"marginTop",!0),left:t.left-n.left-x.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent||s;while(e&&!x.nodeName(e,"html")&&"static"===x.css(e,"position"))e=e.offsetParent;return e||s})}}),x.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,n){var r=/Y/.test(n);x.fn[e]=function(i){return x.access(this,function(e,i,o){var a=or(e);return o===t?a?n in a?a[n]:a.document.documentElement[i]:e[i]:(a?a.scrollTo(r?x(a).scrollLeft():o,r?o:x(a).scrollTop()):e[i]=o,t)},e,i,arguments.length,null)}});function or(e){return x.isWindow(e)?e:9===e.nodeType?e.defaultView||e.parentWindow:!1}x.each({Height:"height",Width:"width"},function(e,n){x.each({padding:"inner"+e,content:n,"":"outer"+e},function(r,i){x.fn[i]=function(i,o){var a=arguments.length&&(r||"boolean"!=typeof i),s=r||(i===!0||o===!0?"margin":"border");return x.access(this,function(n,r,i){var o;return x.isWindow(n)?n.document.documentElement["client"+e]:9===n.nodeType?(o=n.documentElement,Math.max(n.body["scroll"+e],o["scroll"+e],n.body["offset"+e],o["offset"+e],o["client"+e])):i===t?x.css(n,r,s):x.style(n,r,i,s)},n,a?i:t,a,null)}})}),x.fn.size=function(){return this.length},x.fn.andSelf=x.fn.addBack,"object"==typeof module&&module&&"object"==typeof module.exports?module.exports=x:(e.jQuery=e.$=x,"function"==typeof define&&define.amd&&define("jquery",[],function(){return x}))})(window);
-
-		/* Highcharts JS v3.0.4 (2013-08-02) (c) 2009-2013 Torstein Hønsi
-		License: www.highcharts.com/license	*/
-		(function(){function e(e,t){var n;e||(e={});for(n in t)e[n]=t[n];return e}function t(){var e,t=arguments.length,n={},r=function(e,t){var n,i;typeof e!=="object"&&(e={});for(i in t)t.hasOwnProperty(i)&&(n=t[i],e[i]=n&&typeof n==="object"&&Object.prototype.toString.call(n)!=="[object Array]"&&typeof n.nodeType!=="number"?r(e[i]||{},n):t[i]);return e};for(e=0;e<t;e++)n=r(n,arguments[e]);return n}function n(e,t){return parseInt(e,t||10)}function r(e){return typeof e==="string"}function i(e){return typeof e==="object"}function s(e){return Object.prototype.toString.call(e)==="[object Array]"}function o(e){return typeof e==="number"}function u(e){return $.log(e)/$.LN10}function a(e){return $.pow(10,e)}function f(e,t){for(var n=e.length;n--;)if(e[n]===t){e.splice(n,1);break}}function l(e){return e!==W&&e!==null}function c(e,t,n){var s,o;if(r(t))l(n)?e.setAttribute(t,n):e&&e.getAttribute&&(o=e.getAttribute(t));else if(l(t)&&i(t))for(s in t)e.setAttribute(s,t[s]);return o}function h(e){return s(e)?e:[e]}function p(){var e=arguments,t,n,r=e.length;for(t=0;t<r;t++)if(n=e[t],typeof n!=="undefined"&&n!==null)return n}function d(t,n){if(ot&&n&&n.opacity!==W)n.filter="alpha(opacity="+n.opacity*100+")";e(t.style,n)}function v(t,n,r,i,s){t=X.createElement(t);n&&e(t,n);s&&d(t,{padding:0,border:Lt,margin:0});r&&d(t,r);i&&i.appendChild(t);return t}function m(t,n){var r=function(){};r.prototype=new t;e(r.prototype,n);return r}function g(e,t,r,i){var s=wt.lang,e=+e||0,o=t===-1?(e.toString().split(".")[1]||"").length:isNaN(t=Z(t))?2:t,t=r===void 0?s.decimalPoint:r,i=i===void 0?s.thousandsSep:i,s=e<0?"-":"",r=String(n(e=Z(e).toFixed(o))),u=r.length>3?r.length%3:0;return s+(u?r.substr(0,u)+i:"")+r.substr(u).replace(/(\d{3})(?=\d)/g,"$1"+i)+(o?t+Z(e-r).toFixed(o).slice(2):"")}function y(e,t){return Array((t||2)+1-String(e).length).join(0)+e}function b(e,t,n){var r=e[t];e[t]=function(){var e=Array.prototype.slice.call(arguments);e.unshift(r);return n.apply(this,e)}}function w(e,t){for(var n="{",r=!1,i,s,o,u,a,f=[];(n=e.indexOf(n))!==-1;){i=e.slice(0,n);if(r){s=i.split(":");o=s.shift().split(".");a=o.length;i=t;for(u=0;u<a;u++)i=i[o[u]];if(s.length)s=s.join(":"),o=/\.([0-9])/,u=wt.lang,a=void 0,/f$/.test(s)?(a=(a=s.match(o))?a[1]:-1,i=g(i,a,u.decimalPoint,s.indexOf(",")>-1?u.thousandsSep:"")):i=Et(s,i)}f.push(i);e=e.slice(n+1);n=(r=!r)?"}":"{"}f.push(e);return f.join("")}function E(e){return $.pow(10,K($.log(e)/$.LN10))}function S(e,t,n,r){var i,n=p(n,1);i=e/n;t||(t=[1,2,2.5,5,10],r&&r.allowDecimals===!1&&(n===1?t=[1,2,5,10]:n<=.1&&(t=[1/n])));for(r=0;r<t.length;r++)if(e=t[r],i<=(t[r]+(t[r+1]||t[r]))/2)break;e*=n;return e}function x(e,t){var n=t||[[Ot,[1,2,5,10,20,25,50,100,200,500]],[Mt,[1,2,5,10,15,30]],[_t,[1,2,5,10,15,30]],[Dt,[1,2,3,4,6,8,12]],[Pt,[1,2]],[Ht,[1,2]],[Bt,[1,2,3,4,6]],[jt,null]],r=n[n.length-1],i=Tt[r[0]],s=r[1],o;for(o=0;o<n.length;o++)if(r=n[o],i=Tt[r[0]],s=r[1],n[o+1]&&e<=(i*s[s.length-1]+Tt[n[o+1][0]])/2)break;i===Tt[jt]&&e<5*i&&(s=[1,2,5]);i===Tt[jt]&&e<5*i&&(s=[1,2,5]);n=S(e/i,s,r[0]===jt?E(e/i):1);return{unitRange:i,count:n,unitName:r[0]}}function T(t,n,r,i){var s=[],o={},u=wt.global.useUTC,a,f=new Date(n),c=t.unitRange,h=t.count;if(l(n)){c>=Tt[Mt]&&(f.setMilliseconds(0),f.setSeconds(c>=Tt[_t]?0:h*K(f.getSeconds()/h)));if(c>=Tt[_t])f[Vt](c>=Tt[Dt]?0:h*K(f[qt]()/h));if(c>=Tt[Dt])f[$t](c>=Tt[Pt]?0:h*K(f[Rt]()/h));if(c>=Tt[Pt])f[Jt](c>=Tt[Bt]?1:h*K(f[zt]()/h));c>=Tt[Bt]&&(f[Kt](c>=Tt[jt]?0:h*K(f[Wt]()/h)),a=f[Xt]());c>=Tt[jt]&&(a-=a%h,f[Qt](a));if(c===Tt[Ht])f[Jt](f[zt]()-f[Ut]()+p(i,1));n=1;a=f[Xt]();for(var i=f.getTime(),d=f[Wt](),v=f[zt](),m=u?0:(864e5+f.getTimezoneOffset()*6e4)%864e5;i<r;)s.push(i),c===Tt[jt]?i=It(a+n*h,0):c===Tt[Bt]?i=It(a,d+n*h):!u&&(c===Tt[Pt]||c===Tt[Ht])?i=It(a,d,v+n*h*(c===Tt[Pt]?1:7)):i+=c*h,n++;s.push(i);rn(sn(s,function(e){return c<=Tt[Dt]&&e%Tt[Pt]===m}),function(e){o[e]=Pt})}s.info=e(t,{higherRanks:o,totalRange:c*h});return s}function N(){this.symbol=this.color=0}function C(e,t){var n=e.length,r,i;for(i=0;i<n;i++)e[i].ss_i=i;e.sort(function(e,n){r=t(e,n);return r===0?e.ss_i-n.ss_i:r});for(i=0;i<n;i++)delete e[i].ss_i}function k(e){for(var t=e.length,n=e[0];t--;)e[t]<n&&(n=e[t]);return n}function L(e){for(var t=e.length,n=e[0];t--;)e[t]>n&&(n=e[t]);return n}function A(e,t){for(var n in e)e[n]&&e[n]!==t&&e[n].destroy&&e[n].destroy(),delete e[n]}function O(e){bt||(bt=v(kt));e&&bt.appendChild(e);bt.innerHTML=""}function M(e,t){var n="Highcharts error #"+e+": www.highcharts.com/errors/"+e;if(t)throw n;else V.console&&console.log(n)}function _(e){return parseFloat(e.toPrecision(14))}function D(e,t){St=p(e,t.animation)}function P(){var e=wt.global.useUTC,t=e?"getUTC":"get",n=e?"setUTC":"set";It=e?Date.UTC:function(e,t,n,r,i,s){return(new Date(e,t,p(n,1),p(r,0),p(i,0),p(s,0))).getTime()};qt=t+"Minutes";Rt=t+"Hours";Ut=t+"Day";zt=t+"Date";Wt=t+"Month";Xt=t+"FullYear";Vt=n+"Minutes";$t=n+"Hours";Jt=n+"Date";Kt=n+"Month";Qt=n+"FullYear"}function H(){}function B(e,t,n,r){this.axis=e;this.pos=t;this.type=n||"";this.isNew=!0;!n&&!r&&this.addLabel()}function j(e,t){this.axis=e;if(t)this.options=t,this.id=t.id}function F(e,t,n,r,i,s){var o=e.chart.inverted;this.axis=e;this.isNegative=n;this.options=t;this.x=r;this.total=0;this.points={};this.stack=i;this.percent=s==="percent";this.alignOptions={align:t.align||(o?n?"left":"right":"center"),verticalAlign:t.verticalAlign||(o?"middle":n?"bottom":"top"),y:p(t.y,o?4:n?14:-6),x:p(t.x,o?n?-6:6:0)};this.textAlign=t.textAlign||(o?n?"right":"left":"center")}function I(){this.init.apply(this,arguments)}function q(){this.init.apply(this,arguments)}function R(e,t){this.init(e,t)}function U(e,t){this.init(e,t)}function z(){this.init.apply(this,arguments)}var W,X=document,V=window,$=Math,J=$.round,K=$.floor,Q=$.ceil,G=$.max,Y=$.min,Z=$.abs,et=$.cos,tt=$.sin,nt=$.PI,rt=nt*2/360,it=navigator.userAgent,st=V.opera,ot=/msie/i.test(it)&&!st,ut=X.documentMode===8,at=/AppleWebKit/.test(it),ft=/Firefox/.test(it),lt=/(Mobile|Android|Windows Phone)/.test(it),ct="http://www.w3.org/2000/svg",ht=!!X.createElementNS&&!!X.createElementNS(ct,"svg").createSVGRect,pt=ft&&parseInt(it.split("Firefox/")[1],10)<4,dt=!ht&&!ot&&!!X.createElement("canvas").getContext,vt,mt=X.documentElement.ontouchstart!==W,gt={},yt=0,bt,wt,Et,St,xt,Tt,Nt=function(){},Ct=[],kt="div",Lt="none",At="rgba(192,192,192,"+(ht?1e-4:.002)+")",Ot="millisecond",Mt="second",_t="minute",Dt="hour",Pt="day",Ht="week",Bt="month",jt="year",Ft="stroke-width",It,qt,Rt,Ut,zt,Wt,Xt,Vt,$t,Jt,Kt,Qt,Gt={};V.Highcharts=V.Highcharts?M(16,!0):{};Et=function(t,n,r){if(!l(n)||isNaN(n))return"Invalid date";var t=p(t,"%Y-%m-%d %H:%M:%S"),i=new Date(n),s,o=i[Rt](),u=i[Ut](),a=i[zt](),f=i[Wt](),c=i[Xt](),h=wt.lang,d=h.weekdays,i=e({a:d[u].substr(0,3),A:d[u],d:y(a),e:a,b:h.shortMonths[f],B:h.months[f],m:y(f+1),y:c.toString().substr(2,2),Y:c,H:y(o),I:y(o%12||12),l:o%12||12,M:y(i[qt]()),p:o<12?"AM":"PM",P:o<12?"am":"pm",S:y(i.getSeconds()),L:y(J(n%1e3),3)},Highcharts.dateFormats);for(s in i)for(;t.indexOf("%"+s)!==-1;)t=t.replace("%"+s,typeof i[s]==="function"?i[s](n):i[s]);return r?t.substr(0,1).toUpperCase()+t.substr(1):t};N.prototype={wrapColor:function(e){if(this.color>=e)this.color=0},wrapSymbol:function(e){if(this.symbol>=e)this.symbol=0}};Tt=function(){for(var e=0,t=arguments,n=t.length,r={};e<n;e++)r[t[e++]]=t[e];return r}(Ot,1,Mt,1e3,_t,6e4,Dt,36e5,Pt,864e5,Ht,6048e5,Bt,26784e5,jt,31556952e3);xt={init:function(e,t,n){var t=t||"",r=e.shift,i=t.indexOf("C")>-1,s=i?7:3,o,t=t.split(" "),n=[].concat(n),u,a,f=function(e){for(o=e.length;o--;)e[o]==="M"&&e.splice(o+1,0,e[o+1],e[o+2],e[o+1],e[o+2])};i&&(f(t),f(n));e.isArea&&(u=t.splice(t.length-6,6),a=n.splice(n.length-6,6));if(r<=n.length/s)for(;r--;)n=[].concat(n).splice(0,s).concat(n);e.shift=0;if(t.length)for(e=n.length;t.length<e;)r=[].concat(t).splice(t.length-s,s),i&&(r[s-6]=r[s-2],r[s-5]=r[s-1]),t=t.concat(r);u&&(t=t.concat(u),n=n.concat(a));return[t,n]},step:function(e,t,n,r){var i=[],s=e.length;if(n===1)i=r;else if(s===t.length&&n<1)for(;s--;)r=parseFloat(e[s]),i[s]=isNaN(r)?e[s]:n*parseFloat(t[s]-r)+r;else i=t;return i}};(function(t){V.HighchartsAdapter=V.HighchartsAdapter||t&&{init:function(e){var n=t.fx,i=n.step,s,o=t.Tween,u=o&&o.propHooks;s=t.cssHooks.opacity;t.extend(t.easing,{easeOutQuad:function(e,t,n,r,i){return-r*(t/=i)*(t-2)+n}});t.each(["cur","_default","width","height","opacity"],function(e,t){var r=i,s,a;t==="cur"?r=n.prototype:t==="_default"&&o&&(r=u[t],t="set");(s=r[t])&&(r[t]=function(n){n=e?n:this;a=n.elem;return a.attr?a.attr(n.prop,t==="cur"?W:n.now):s.apply(this,arguments)})});b(s,"get",function(e,t,n){return t.attr?t.opacity||0:e.call(this,t,n)});s=function(t){var n=t.elem,r;if(!t.started)r=e.init(n,n.d,n.toD),t.start=r[0],t.end=r[1],t.started=!0;n.attr("d",e.step(t.start,t.end,t.pos,n.toD))};o?u.d={set:s}:i.d=s;this.each=Array.prototype.forEach?function(e,t){return Array.prototype.forEach.call(e,t)}:function(e,t){for(var n=0,r=e.length;n<r;n++)if(t.call(e[n],e[n],n,e)===!1)return n};t.fn.highcharts=function(){var e="Chart",t=arguments,n,i;r(t[0])&&(e=t[0],t=Array.prototype.slice.call(t,1));n=t[0];if(n!==W)n.chart=n.chart||{},n.chart.renderTo=this[0],new Highcharts[e](n,t[1]),i=this;n===W&&(i=Ct[c(this[0],"data-highcharts-chart")]);return i}},getScript:t.getScript,inArray:t.inArray,adapterRun:function(e,n){return t(e)[n]()},grep:t.grep,map:function(e,t){for(var n=[],r=0,i=e.length;r<i;r++)n[r]=t.call(e[r],e[r],r,e);return n},offset:function(e){return t(e).offset()},addEvent:function(e,n,r){t(e).bind(n,r)},removeEvent:function(e,n,r){var i=X.removeEventListener?"removeEventListener":"detachEvent";X[i]&&e&&!e[i]&&(e[i]=function(){});t(e).unbind(n,r)},fireEvent:function(n,r,i,s){var o=t.Event(r),u="detached"+r,a;!ot&&i&&(delete i.layerX,delete i.layerY);e(o,i);n[r]&&(n[u]=n[r],n[r]=null);t.each(["preventDefault","stopPropagation"],function(e,t){var n=o[t];o[t]=function(){try{n.call(o)}catch(e){t==="preventDefault"&&(a=!0)}}});t(n).trigger(o);n[u]&&(n[r]=n[u],n[u]=null);s&&!o.isDefaultPrevented()&&!a&&s(o)},washMouseEvent:function(e){var t=e.originalEvent||e;if(t.pageX===W)t.pageX=e.pageX,t.pageY=e.pageY;return t},animate:function(e,n,r){var i=t(e);if(!e.style)e.style={};if(n.d)e.toD=n.d,n.d=1;i.stop();i.animate(n,r)},stop:function(e){t(e).stop()}}})(V.jQuery);var Yt=V.HighchartsAdapter,Zt=Yt||{};Yt&&Yt.init.call(Yt,xt);var en=Zt.adapterRun,tn=Zt.getScript,nn=Zt.inArray,rn=Zt.each,sn=Zt.grep,on=Zt.offset,un=Zt.map,an=Zt.addEvent,fn=Zt.removeEvent,ln=Zt.fireEvent,cn=Zt.washMouseEvent,hn=Zt.animate,pn=Zt.stop,Zt={enabled:!0,x:0,y:15,style:{color:"#666",cursor:"default",fontSize:"11px",lineHeight:"14px"}};wt={colors:"#2f7ed8,#0d233a,#8bbc21,#910000,#1aadce,#492970,#f28f43,#77a1e5,#c42525,#a6c96a".split(","),symbols:["circle","diamond","square","triangle","triangle-down"],lang:{loading:"Loading...",months:"January,February,March,April,May,June,July,August,September,October,November,December".split(","),shortMonths:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec".split(","),weekdays:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday".split(","),decimalPoint:".",numericSymbols:"k,M,G,T,P,E".split(","),resetZoom:"Reset zoom",resetZoomTitle:"Reset zoom level 1:1",thousandsSep:","},global:{useUTC:!0,canvasToolsURL:"http://code.highcharts.com/3.0.4/modules/canvas-tools.js",VMLRadialGradientURL:"http://code.highcharts.com/3.0.4/gfx/vml-radial-gradient.png"},chart:{borderColor:"#4572A7",borderRadius:5,defaultSeriesType:"line",ignoreHiddenSeries:!0,spacingTop:10,spacingRight:10,spacingBottom:15,spacingLeft:10,style:{fontFamily:'"Lucida Grande", "Lucida Sans Unicode", Verdana, Arial, Helvetica, sans-serif',fontSize:"12px"},backgroundColor:"#FFFFFF",plotBorderColor:"#C0C0C0",resetZoomButton:{theme:{zIndex:20},position:{align:"right",x:-10,y:10}}},title:{text:"Chart title",align:"center",margin:15,style:{color:"#274b6d",fontSize:"16px"}},subtitle:{text:"",align:"center",style:{color:"#4d759e"}},plotOptions:{line:{allowPointSelect:!1,showCheckbox:!1,animation:{duration:1e3},events:{},lineWidth:2,marker:{enabled:!0,lineWidth:0,radius:4,lineColor:"#FFFFFF",states:{hover:{enabled:!0},select:{fillColor:"#FFFFFF",lineColor:"#000000",lineWidth:2}}},point:{events:{}},dataLabels:t(Zt,{align:"center",enabled:!1,formatter:function(){return this.y===null?"":g(this.y,-1)},verticalAlign:"bottom",y:0}),cropThreshold:300,pointRange:0,showInLegend:!0,states:{hover:{marker:{}},select:{marker:{}}},stickyTracking:!0}},labels:{style:{position:"absolute",color:"#3E576F"}},legend:{enabled:!0,align:"center",layout:"horizontal",labelFormatter:function(){return this.name},borderWidth:1,borderColor:"#909090",borderRadius:5,navigation:{activeColor:"#274b6d",inactiveColor:"#CCC"},shadow:!1,itemStyle:{cursor:"pointer",color:"#274b6d",fontSize:"12px"},itemHoverStyle:{color:"#000"},itemHiddenStyle:{color:"#CCC"},itemCheckboxStyle:{position:"absolute",width:"13px",height:"13px"},symbolWidth:16,symbolPadding:5,verticalAlign:"bottom",x:0,y:0,title:{style:{fontWeight:"bold"}}},loading:{labelStyle:{fontWeight:"bold",position:"relative",top:"1em"},style:{position:"absolute",backgroundColor:"white",opacity:.5,textAlign:"center"}},tooltip:{enabled:!0,animation:ht,backgroundColor:"rgba(255, 255, 255, .85)",borderWidth:1,borderRadius:3,dateTimeLabelFormats:{millisecond:"%A, %b %e, %H:%M:%S.%L",second:"%A, %b %e, %H:%M:%S",minute:"%A, %b %e, %H:%M",hour:"%A, %b %e, %H:%M",day:"%A, %b %e, %Y",week:"Week from %A, %b %e, %Y",month:"%B %Y",year:"%Y"},headerFormat:'<span style="font-size: 10px">{point.key}</span><br/>',pointFormat:'<span style="color:{series.color}">{series.name}</span>: <b>{point.y}</b><br/>',shadow:!0,snap:lt?25:10,style:{color:"#333333",cursor:"default",fontSize:"12px",padding:"8px",whiteSpace:"nowrap"}},credits:{enabled:!0,text:"Highcharts.com",href:"http://www.highcharts.com",position:{align:"right",x:-10,verticalAlign:"bottom",y:-5},style:{cursor:"pointer",color:"#909090",fontSize:"9px"}}};var dn=wt.plotOptions,Yt=dn.line;P();var vn=function(e){var r=[],i,s;(function(e){e&&e.stops?s=un(e.stops,function(e){return vn(e[1])}):(i=/rgba\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]?(?:\.[0-9]+)?)\s*\)/.exec(e))?r=[n(i[1]),n(i[2]),n(i[3]),parseFloat(i[4],10)]:(i=/#([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/.exec(e))?r=[n(i[1],16),n(i[2],16),n(i[3],16),1]:(i=/rgb\(\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*,\s*([0-9]{1,3})\s*\)/.exec(e))&&(r=[n(i[1]),n(i[2]),n(i[3]),1])})(e);return{get:function(n){var i;s?(i=t(e),i.stops=[].concat(i.stops),rn(s,function(e,t){i.stops[t]=[i.stops[t][0],e.get(n)]})):i=r&&!isNaN(r[0])?n==="rgb"?"rgb("+r[0]+","+r[1]+","+r[2]+")":n==="a"?r[3]:"rgba("+r.join(",")+")":e;return i},brighten:function(e){if(s)rn(s,function(t){t.brighten(e)});else if(o(e)&&e!==0){var t;for(t=0;t<3;t++)r[t]+=n(e*255),r[t]<0&&(r[t]=0),r[t]>255&&(r[t]=255)}return this},rgba:r,setOpacity:function(e){r[3]=e;return this}}};H.prototype={init:function(e,t){this.element=t==="span"?v(t):X.createElementNS(ct,t);this.renderer=e;this.attrSetters={}},opacity:1,animate:function(e,n,r){n=p(n,St,!0);pn(this);if(n){n=t(n);if(r)n.complete=r;hn(this,e,n)}else this.attr(e),r&&r()},attr:function(e,t){var i,s,o,u,a=this.element,f=a.nodeName.toLowerCase(),h=this.renderer,d,v=this.attrSetters,m=this.shadows,g,y,b=this;r(e)&&l(t)&&(i=e,e={},e[i]=t);if(r(e))i=e,f==="circle"?i={x:"cx",y:"cy"}[i]||i:i==="strokeWidth"&&(i="stroke-width"),b=c(a,i)||this[i]||0,i!=="d"&&i!=="visibility"&&(b=parseFloat(b));else{for(i in e)if(d=!1,s=e[i],o=v[i]&&v[i].call(this,s,i),o!==!1){o!==W&&(s=o);if(i==="d")s&&s.join&&(s=s.join(" ")),/(NaN| {2}|^$)/.test(s)&&(s="M 0 0");else if(i==="x"&&f==="text")for(o=0;o<a.childNodes.length;o++)u=a.childNodes[o],c(u,"x")===c(a,"x")&&c(u,"x",s);else if(this.rotation&&(i==="x"||i==="y"))y=!0;else if(i==="fill")s=h.color(s,a,i);else if(f==="circle"&&(i==="x"||i==="y"))i={x:"cx",y:"cy"}[i]||i;else if(f==="rect"&&i==="r")c(a,{rx:s,ry:s}),d=!0;else if(i==="translateX"||i==="translateY"||i==="rotation"||i==="verticalAlign"||i==="scaleX"||i==="scaleY")d=y=!0;else if(i==="stroke")s=h.color(s,a,i);else if(i==="dashstyle")if(i="stroke-dasharray",s=s&&s.toLowerCase(),s==="solid")s=Lt;else{if(s){s=s.replace("shortdashdotdot","3,1,1,1,1,1,").replace("shortdashdot","3,1,1,1").replace("shortdot","1,1,").replace("shortdash","3,1,").replace("longdash","8,3,").replace(/dot/g,"1,3,").replace("dash","4,3,").replace(/,$/,"").split(",");for(o=s.length;o--;)s[o]=n(s[o])*p(e["stroke-width"],this["stroke-width"]);s=s.join(",")}}else if(i==="width")s=n(s);else if(i==="align")i="text-anchor",s={left:"start",center:"middle",right:"end"}[s];else if(i==="title")o=a.getElementsByTagName("title")[0],o||(o=X.createElementNS(ct,"title"),a.appendChild(o)),o.textContent=s;i==="strokeWidth"&&(i="stroke-width");if(i==="stroke-width"||i==="stroke"){this[i]=s;if(this.stroke&&this["stroke-width"])c(a,"stroke",this.stroke),c(a,"stroke-width",this["stroke-width"]),this.hasStroke=!0;else if(i==="stroke-width"&&s===0&&this.hasStroke)a.removeAttribute("stroke"),this.hasStroke=!1;d=!0}this.symbolName&&/^(x|y|width|height|r|start|end|innerR|anchorX|anchorY)/.test(i)&&(g||(this.symbolAttr(e),g=!0),d=!0);if(m&&/^(width|height|visibility|x|y|d|transform|cx|cy|r)$/.test(i))for(o=m.length;o--;)c(m[o],i,i==="height"?G(s-(m[o].cutHeight||0),0):s);if((i==="width"||i==="height")&&f==="rect"&&s<0)s=0;this[i]=s;i==="text"?(s!==this.textStr&&delete this.bBox,this.textStr=s,this.added&&h.buildText(this)):d||c(a,i,s)}y&&this.updateTransform()}return b},addClass:function(e){var t=this.element,n=c(t,"class")||"";n.indexOf(e)===-1&&c(t,"class",n+" "+e);return this},symbolAttr:function(e){var t=this;rn("x,y,r,start,end,width,height,innerR,anchorX,anchorY".split(","),function(n){t[n]=p(e[n],t[n])});t.attr({d:t.renderer.symbols[t.symbolName](t.x,t.y,t.width,t.height,t)})},clip:function(e){return this.attr("clip-path",e?"url("+this.renderer.url+"#"+e.id+")":Lt)},crisp:function(e,t,n,r,i){var s,o={},u={},a,e=e||this.strokeWidth||this.attr&&this.attr("stroke-width")||0;a=J(e)%2/2;u.x=K(t||this.x||0)+a;u.y=K(n||this.y||0)+a;u.width=K((r||this.width||0)-2*a);u.height=K((i||this.height||0)-2*a);u.strokeWidth=e;for(s in u)this[s]!==u[s]&&(this[s]=o[s]=u[s]);return o},css:function(t){var n=this.element,r=t&&t.width&&n.nodeName.toLowerCase()==="text",i,s="",o=function(e,t){return"-"+t.toLowerCase()};if(t&&t.color)t.fill=t.color;this.styles=t=e(this.styles,t);dt&&r&&delete t.width;if(ot&&!ht)r&&delete t.width,d(this.element,t);else{for(i in t)s+=i.replace(/([A-Z])/g,o)+":"+t[i]+";";c(n,"style",s)}r&&this.added&&this.renderer.buildText(this);return this},on:function(e,t){var n=this.element;if(mt&&e==="click")n.ontouchstart=function(e){e.preventDefault();t.call(n,e)};n["on"+e]=t;return this},setRadialReference:function(e){this.element.radialReference=e;return this},translate:function(e,t){return this.attr({translateX:e,translateY:t})},invert:function(){this.inverted=!0;this.updateTransform();return this},htmlCss:function(t){var n=this.element;if(n=t&&n.tagName==="SPAN"&&t.width)delete t.width,this.textWidth=n,this.updateTransform();this.styles=e(this.styles,t);d(this.element,t);return this},htmlGetBBox:function(){var e=this.element,t=this.bBox;if(!t){if(e.nodeName==="text")e.style.position="absolute";t=this.bBox={x:e.offsetLeft,y:e.offsetTop,width:e.offsetWidth,height:e.offsetHeight}}return t},htmlUpdateTransform:function(){if(this.added){var e=this.renderer,t=this.element,r=this.translateX||0,i=this.translateY||0,s=this.x||0,o=this.y||0,u=this.textAlign||"left",a={left:0,center:.5,right:1}[u],f=u&&u!=="left",c=this.shadows;d(t,{marginLeft:r,marginTop:i});c&&rn(c,function(e){d(e,{marginLeft:r+1,marginTop:i+1})});this.inverted&&rn(t.childNodes,function(n){e.invertChild(n,t)});if(t.tagName==="SPAN"){var h,v,c=this.rotation,m;h=0;var g=1,y=0,b;m=n(this.textWidth);var w=this.xCorr||0,E=this.yCorr||0,S=[c,u,t.innerHTML,this.textWidth].join(",");if(S!==this.cTT){l(c)&&(h=c*rt,g=et(h),y=tt(h),this.setSpanRotation(c,y,g));h=p(this.elemWidth,t.offsetWidth);v=p(this.elemHeight,t.offsetHeight);if(h>m&&/[ \-]/.test(t.textContent||t.innerText))d(t,{width:m+"px",display:"block",whiteSpace:"normal"}),h=m;m=e.fontMetrics(t.style.fontSize).b;w=g<0&&-h;E=y<0&&-v;b=g*y<0;w+=y*m*(b?1-a:a);E-=g*m*(c?b?a:1-a:1);f&&(w-=h*a*(g<0?-1:1),c&&(E-=v*a*(y<0?-1:1)),d(t,{textAlign:u}));this.xCorr=w;this.yCorr=E}d(t,{left:s+w+"px",top:o+E+"px"});if(at)v=t.offsetHeight;this.cTT=S}}else this.alignOnAdd=!0},setSpanRotation:function(e){var t={};t[ot?"-ms-transform":at?"-webkit-transform":ft?"MozTransform":st?"-o-transform":""]=t.transform="rotate("+e+"deg)";d(this.element,t)},updateTransform:function(){var e=this.translateX||0,t=this.translateY||0,n=this.scaleX,r=this.scaleY,i=this.inverted,s=this.rotation;i&&(e+=this.attr("width"),t+=this.attr("height"));e=["translate("+e+","+t+")"];i?e.push("rotate(90) scale(-1,1)"):s&&e.push("rotate("+s+" "+(this.x||0)+" "+(this.y||0)+")");(l(n)||l(r))&&e.push("scale("+p(n,1)+" "+p(r,1)+")");e.length&&c(this.element,"transform",e.join(" "))},toFront:function(){var e=this.element;e.parentNode.appendChild(e);return this},align:function(e,t,n){var i,s,o,u,a={};s=this.renderer;o=s.alignedObjects;if(e){if(this.alignOptions=e,this.alignByTranslate=t,!n||r(n))this.alignTo=i=n||"renderer",f(o,this),o.push(this),n=null}else e=this.alignOptions,t=this.alignByTranslate,i=this.alignTo;n=p(n,s[i],s);i=e.align;s=e.verticalAlign;o=(n.x||0)+(e.x||0);u=(n.y||0)+(e.y||0);if(i==="right"||i==="center")o+=(n.width-(e.width||0))/{right:1,center:2}[i];a[t?"translateX":"x"]=J(o);if(s==="bottom"||s==="middle")u+=(n.height-(e.height||0))/({bottom:1,middle:2}[s]||1);a[t?"translateY":"y"]=J(u);this[this.placed?"animate":"attr"](a);this.placed=!0;this.alignAttr=a;return this},getBBox:function(){var t=this.bBox,n=this.renderer,r,i=this.rotation;r=this.element;var s=this.styles,o=i*rt;if(!t){if(r.namespaceURI===ct||n.forExport){try{t=r.getBBox?e({},r.getBBox()):{width:r.offsetWidth,height:r.offsetHeight}}catch(u){}if(!t||t.width<0)t={width:0,height:0}}else t=this.htmlGetBBox();if(n.isSVG){n=t.width;r=t.height;if(ot&&s&&s.fontSize==="11px"&&r.toPrecision(3)==="22.7")t.height=r=14;if(i)t.width=Z(r*tt(o))+Z(n*et(o)),t.height=Z(r*et(o))+Z(n*tt(o))}this.bBox=t}return t},show:function(){return this.attr({visibility:"visible"})},hide:function(){return this.attr({visibility:"hidden"})},fadeOut:function(e){var t=this;t.animate({opacity:0},{duration:e||150,complete:function(){t.hide()}})},add:function(e){var t=this.renderer,r=e||t,i=r.element||t.box,s=i.childNodes,o=this.element,u=c(o,"zIndex"),a;if(e)this.parentGroup=e;this.parentInverted=e&&e.inverted;this.textStr!==void 0&&t.buildText(this);if(u)r.handleZ=!0,u=n(u);if(r.handleZ)for(r=0;r<s.length;r++)if(e=s[r],t=c(e,"zIndex"),e!==o&&(n(t)>u||!l(u)&&l(t))){i.insertBefore(o,e);a=!0;break}a||i.appendChild(o);this.added=!0;ln(this,"add");return this},safeRemoveChild:function(e){var t=e.parentNode;t&&t.removeChild(e)},destroy:function(){var e=this,t=e.element||{},n=e.shadows,r=e.renderer.isSVG&&t.nodeName==="SPAN"&&t.parentNode,i,s;t.onclick=t.onmouseout=t.onmouseover=t.onmousemove=t.point=null;pn(e);if(e.clipPath)e.clipPath=e.clipPath.destroy();if(e.stops){for(s=0;s<e.stops.length;s++)e.stops[s]=e.stops[s].destroy();e.stops=null}e.safeRemoveChild(t);for(n&&rn(n,function(t){e.safeRemoveChild(t)});r&&r.childNodes.length===0;)t=r.parentNode,e.safeRemoveChild(r),r=t;e.alignTo&&f(e.renderer.alignedObjects,e);for(i in e)delete e[i];return null},shadow:function(e,t,n){var r=[],i,s,o=this.element,u,a,f,l;if(e){a=p(e.width,3);f=(e.opacity||.15)/a;l=this.parentInverted?"(-1,-1)":"("+p(e.offsetX,1)+", "+p(e.offsetY,1)+")";for(i=1;i<=a;i++){s=o.cloneNode(0);u=a*2+1-2*i;c(s,{isShadow:"true",stroke:e.color||"black","stroke-opacity":f*i,"stroke-width":u,transform:"translate"+l,fill:Lt});if(n)c(s,"height",G(c(s,"height")-u,0)),s.cutHeight=u;t?t.element.appendChild(s):o.parentNode.insertBefore(s,o);r.push(s)}this.shadows=r}return this}};var mn=function(){this.init.apply(this,arguments)};mn.prototype={Element:H,init:function(e,t,n,r){var i=location,s,o;s=this.createElement("svg").attr({version:"1.1"});o=s.element;e.appendChild(o);e.innerHTML.indexOf("xmlns")===-1&&c(o,"xmlns",ct);this.isSVG=!0;this.box=o;this.boxWrapper=s;this.alignedObjects=[];this.url=(ft||at)&&X.getElementsByTagName("base").length?i.href.replace(/#.*?$/,"").replace(/([\('\)])/g,"\\$1").replace(/ /g,"%20"):"";this.createElement("desc").add().element.appendChild(X.createTextNode("Created with Highcharts 3.0.4"));this.defs=this.createElement("defs").add();this.forExport=r;this.gradients={};this.setSize(t,n,!1);var u;if(ft&&e.getBoundingClientRect)this.subPixelFix=t=function(){d(e,{left:0,top:0});u=e.getBoundingClientRect();d(e,{left:Q(u.left)-u.left+"px",top:Q(u.top)-u.top+"px"})},t(),an(V,"resize",t)},isHidden:function(){return!this.boxWrapper.getBBox().width},destroy:function(){var e=this.defs;this.box=null;this.boxWrapper=this.boxWrapper.destroy();A(this.gradients||{});this.gradients=null;if(e)this.defs=e.destroy();this.subPixelFix&&fn(V,"resize",this.subPixelFix);return this.alignedObjects=null},createElement:function(e){var t=new this.Element;t.init(this,e);return t},draw:function(){},buildText:function(e){for(var t=e.element,r=this,i=r.forExport,s=p(e.textStr,"").toString().replace(/<(b|strong)>/g,'<span style="font-weight:bold">').replace(/<(i|em)>/g,'<span style="font-style:italic">').replace(/<a/g,"<span").replace(/<\/(b|strong|i|em|a)>/g,"</span>").split(/<br.*?>/g),o=t.childNodes,u=/style="([^"]+)"/,a=/href="(http[^"]+)"/,f=c(t,"x"),l=e.styles,h=l&&l.width&&n(l.width),v=l&&l.lineHeight,m=o.length;m--;)t.removeChild(o[m]);h&&!e.added&&this.box.appendChild(t);s[s.length-1]===""&&s.pop();rn(s,function(n,s){var o,p=0,n=n.replace(/<span/g,"|||<span").replace(/<\/span>/g,"</span>|||");o=n.split("|||");rn(o,function(n){if(n!==""||o.length===1){var m={},g=X.createElementNS(ct,"tspan"),y;u.test(n)&&(y=n.match(u)[1].replace(/(;| |^)color([ :])/,"$1fill$2"),c(g,"style",y));a.test(n)&&!i&&(c(g,"onclick",'location.href="'+n.match(a)[1]+'"'),d(g,{cursor:"pointer"}));n=(n.replace(/<(.|\n)*?>/g,"")||" ").replace(/</g,"<").replace(/>/g,">");if(n!==" "&&(g.appendChild(X.createTextNode(n)),p?m.dx=0:m.x=f,c(g,m),!p&&s&&(!ht&&i&&d(g,{display:"block"}),c(g,"dy",v||r.fontMetrics(/px$/.test(g.style.fontSize)?g.style.fontSize:l.fontSize).h,at&&g.offsetHeight)),t.appendChild(g),p++,h))for(var n=n.replace(/([^\^])-/g,"$1- ").split(" "),b,w=[];n.length||w.length;)delete e.bBox,b=e.getBBox().width,m=b>h,!m||n.length===1?(n=w,w=[],n.length&&(g=X.createElementNS(ct,"tspan"),c(g,{dy:v||16,x:f}),y&&c(g,"style",y),t.appendChild(g),b>h&&(h=b))):(g.removeChild(g.firstChild),w.unshift(n.pop())),n.length&&g.appendChild(X.createTextNode(n.join(" ").replace(/- /g,"-")))}})})},button:function(n,r,i,s,o,u,a){var f=this.label(n,r,i,null,null,null,null,null,"button"),l=0,c,h,p,d,v,n={x1:0,y1:0,x2:0,y2:1},o=t({"stroke-width":1,stroke:"#CCCCCC",fill:{linearGradient:n,stops:[[0,"#FEFEFE"],[1,"#F6F6F6"]]},r:2,padding:5,style:{color:"black"}},o);p=o.style;delete o.style;u=t(o,{stroke:"#68A",fill:{linearGradient:n,stops:[[0,"#FFF"],[1,"#ACF"]]}},u);d=u.style;delete u.style;a=t(o,{stroke:"#68A",fill:{linearGradient:n,stops:[[0,"#9BD"],[1,"#CDF"]]}},a);v=a.style;delete a.style;an(f.element,ot?"mouseover":"mouseenter",function(){f.attr(u).css(d)});an(f.element,ot?"mouseout":"mouseleave",function(){c=[o,u,a][l];h=[p,d,v][l];f.attr(c).css(h)});f.setState=function(e){(l=e)?e===2&&f.attr(a).css(v):f.attr(o).css(p)};return f.on("click",function(){s.call(f)}).attr(o).css(e({cursor:"default"},p))},crispLine:function(e,t){e[1]===e[4]&&(e[1]=e[4]=J(e[1])-t%2/2);e[2]===e[5]&&(e[2]=e[5]=J(e[2])+t%2/2);return e},path:function(t){var n={fill:Lt};s(t)?n.d=t:i(t)&&e(n,t);return this.createElement("path").attr(n)},circle:function(e,t,n){e=i(e)?e:{x:e,y:t,r:n};return this.createElement("circle").attr(e)},arc:function(e,t,n,r,s,o){if(i(e))t=e.y,n=e.r,r=e.innerR,s=e.start,o=e.end,e=e.x;e=this.symbol("arc",e||0,t||0,n||0,n||0,{innerR:r||0,start:s||0,end:o||0});e.r=n;return e},rect:function(e,t,n,r,s,o){s=i(e)?e.r:s;s=this.createElement("rect").attr({rx:s,ry:s,fill:Lt});return s.attr(i(e)?e:s.crisp(o,e,t,G(n,0),G(r,0)))},setSize:function(e,t,n){var r=this.alignedObjects,i=r.length;this.width=e;this.height=t;for(this.boxWrapper[p(n,!0)?"animate":"attr"]({width:e,height:t});i--;)r[i].align()},g:function(e){var t=this.createElement("g");return l(e)?t.attr({"class":"highcharts-"+e}):t},image:function(t,n,r,i,s){var o={preserveAspectRatio:Lt};arguments.length>1&&e(o,{x:n,y:r,width:i,height:s});o=this.createElement("image").attr(o);o.element.setAttributeNS?o.element.setAttributeNS("http://www.w3.org/1999/xlink","href",t):o.element.setAttribute("hc-svg-href",t);return o},symbol:function(t,n,r,i,s,o){var u,a=this.symbols[t],a=a&&a(J(n),J(r),i,s,o),f=/^url\((.*?)\)$/,l,c;if(a)u=this.path(a),e(u,{symbolName:t,x:n,y:r,width:i,height:s}),o&&e(u,o);else if(f.test(t))c=function(e,t){e.element&&(e.attr({width:t[0],height:t[1]}),e.alignByTranslate||e.translate(J((i-t[0])/2),J((s-t[1])/2)))},l=t.match(f)[1],t=gt[l],u=this.image(l).attr({x:n,y:r}),u.isImg=!0,t?c(u,t):(u.attr({width:0,height:0}),v("img",{onload:function(){c(u,gt[l]=[this.width,this.height])},src:l}));return u},symbols:{circle:function(e,t,n,r){var i=.166*n;return["M",e+n/2,t,"C",e+n+i,t,e+n+i,t+r,e+n/2,t+r,"C",e-i,t+r,e-i,t,e+n/2,t,"Z"]},square:function(e,t,n,r){return["M",e,t,"L",e+n,t,e+n,t+r,e,t+r,"Z"]},triangle:function(e,t,n,r){return["M",e+n/2,t,"L",e+n,t+r,e,t+r,"Z"]},"triangle-down":function(e,t,n,r){return["M",e,t,"L",e+n,t,e+n/2,t+r,"Z"]},diamond:function(e,t,n,r){return["M",e+n/2,t,"L",e+n,t+r/2,e+n/2,t+r,e,t+r/2,"Z"]},arc:function(e,t,n,r,i){var s=i.start,n=i.r||n||r,o=i.end-.001,r=i.innerR,u=i.open,a=et(s),f=tt(s),l=et(o),o=tt(o),i=i.end-s<nt?0:1;return["M",e+n*a,t+n*f,"A",n,n,0,i,1,e+n*l,t+n*o,u?"M":"L",e+r*l,t+r*o,"A",r,r,0,i,0,e+r*a,t+r*f,u?"":"Z"]}},clipRect:function(e,t,n,r){var i="highcharts-"+yt++,s=this.createElement("clipPath").attr({id:i}).add(this.defs),e=this.rect(e,t,n,r,0).add(s);e.id=i;e.clipPath=s;return e},color:function(e,n,r){var i=this,o,u=/^rgba/,a,f,h,p,d,v,m,g=[];e&&e.linearGradient?a="linearGradient":e&&e.radialGradient&&(a="radialGradient");if(a){r=e[a];f=i.gradients;p=e.stops;n=n.radialReference;s(r)&&(e[a]=r={x1:r[0],y1:r[1],x2:r[2],y2:r[3],gradientUnits:"userSpaceOnUse"});a==="radialGradient"&&n&&!l(r.gradientUnits)&&(r=t(r,{cx:n[0]-n[2]/2+r.cx*n[2],cy:n[1]-n[2]/2+r.cy*n[2],r:r.r*n[2],gradientUnits:"userSpaceOnUse"}));for(m in r)m!=="id"&&g.push(m,r[m]);for(m in p)g.push(p[m]);g=g.join(",");f[g]?e=f[g].id:(r.id=e="highcharts-"+yt++,f[g]=h=i.createElement(a).attr(r).add(i.defs),h.stops=[],rn(p,function(e){u.test(e[1])?(o=vn(e[1]),d=o.get("rgb"),v=o.get("a")):(d=e[1],v=1);e=i.createElement("stop").attr({offset:e[0],"stop-color":d,"stop-opacity":v}).add(h);h.stops.push(e)}));return"url("+i.url+"#"+e+")"}else return u.test(e)?(o=vn(e),c(n,r+"-opacity",o.get("a")),o.get("rgb")):(n.removeAttribute(r+"-opacity"),e)},text:function(e,t,n,r){var i=wt.chart.style,s=dt||!ht&&this.forExport;if(r&&!this.forExport)return this.html(e,t,n);t=J(p(t,0));n=J(p(n,0));e=this.createElement("text").attr({x:t,y:n,text:e}).css({fontFamily:i.fontFamily,fontSize:i.fontSize});s&&e.css({position:"absolute"});e.x=t;e.y=n;return e},html:function(t,n,r){var i=wt.chart.style,s=this.createElement("span"),o=s.attrSetters,u=s.element,a=s.renderer;o.text=function(e){e!==u.innerHTML&&delete this.bBox;u.innerHTML=e;return!1};o.x=o.y=o.align=function(e,t){t==="align"&&(t="textAlign");s[t]=e;s.htmlUpdateTransform();return!1};s.attr({text:t,x:J(n),y:J(r)}).css({position:"absolute",whiteSpace:"nowrap",fontFamily:i.fontFamily,fontSize:i.fontSize});s.css=s.htmlCss;
-		if(a.isSVG)s.add=function(t){var n,r=a.box.parentNode,i=[];if(t){if(n=t.div,!n){for(;t;)i.push(t),t=t.parentGroup;rn(i.reverse(),function(t){var i;n=t.div=t.div||v(kt,{className:c(t.element,"class")},{position:"absolute",left:(t.translateX||0)+"px",top:(t.translateY||0)+"px"},n||r);i=n.style;e(t.attrSetters,{translateX:function(e){i.left=e+"px"},translateY:function(e){i.top=e+"px"},visibility:function(e,t){i[t]=e}})})}}else n=r;n.appendChild(u);s.added=!0;s.alignOnAdd&&s.htmlUpdateTransform();return s};return s},fontMetrics:function(e){var e=n(e||11),e=e<24?e+4:J(e*1.2),t=J(e*.8);return{h:e,b:t}},label:function(n,r,i,s,o,u,a,f,c){function h(){var e,n;e=y.element.style;w=(T===void 0||N===void 0||g.styles.textAlign)&&y.getBBox();g.width=(T||w.width||0)+2*S+x;g.height=(N||w.height||0)+2*S;O=S+m.fontMetrics(e&&e.fontSize).b;if(M){if(!b)e=J(-E*S),n=f?-O:0,g.box=b=s?m.symbol(s,e,n,g.width,g.height):m.rect(e,n,g.width,g.height,0,A[Ft]),b.add(g);b.isImg||b.attr(t({width:g.width,height:g.height},A));A=null}}function p(){var e=g.styles,e=e&&e.textAlign,t=x+S*(1-E),n;n=f?0:O;if(l(T)&&(e==="center"||e==="right"))t+={center:.5,right:1}[e]*(T-w.width);(t!==y.x||n!==y.y)&&y.attr({x:t,y:n});y.x=t;y.y=n}function d(e,t){b?b.attr(e,t):A[e]=t}function v(){y.add(g);g.attr({text:n,x:r,y:i});b&&l(o)&&g.attr({anchorX:o,anchorY:u})}var m=this,g=m.g(c),y=m.text("",0,0,a).attr({zIndex:1}),b,w,E=0,S=3,x=0,T,N,C,k,L=0,A={},O,a=g.attrSetters,M;an(g,"add",v);a.width=function(e){T=e;return!1};a.height=function(e){N=e;return!1};a.padding=function(e){l(e)&&e!==S&&(S=e,p());return!1};a.paddingLeft=function(e){l(e)&&e!==x&&(x=e,p());return!1};a.align=function(e){E={left:0,center:.5,right:1}[e];return!1};a.text=function(e,t){y.attr(t,e);h();p();return!1};a[Ft]=function(e,t){M=!0;L=e%2/2;d(t,e);return!1};a.stroke=a.fill=a.r=function(e,t){t==="fill"&&(M=!0);d(t,e);return!1};a.anchorX=function(e,t){o=e;d(t,e+L-C);return!1};a.anchorY=function(e,t){u=e;d(t,e-k);return!1};a.x=function(e){g.x=e;e-=E*((T||w.width)+S);C=J(e);g.attr("translateX",C);return!1};a.y=function(e){k=g.y=J(e);g.attr("translateY",k);return!1};var _=g.css;return e(g,{css:function(e){if(e){var n={},e=t(e);rn("fontSize,fontWeight,fontFamily,color,lineHeight,width,textDecoration".split(","),function(t){e[t]!==W&&(n[t]=e[t],delete e[t])});y.css(n)}return _.call(g,e)},getBBox:function(){return{width:w.width+2*S,height:w.height+2*S,x:w.x-S,y:w.y-S}},shadow:function(e){b&&b.shadow(e);return g},destroy:function(){fn(g,"add",v);fn(g.element,"mouseenter");fn(g.element,"mouseleave");y&&(y=y.destroy());b&&(b=b.destroy());H.prototype.destroy.call(g);g=m=h=p=d=v=null}})}};vt=mn;var gn;if(!ht&&!dt){Highcharts.VMLElement=gn={init:function(e,t){var n=["<",t,' filled="f" stroked="f"'],r=["position: ","absolute",";"],i=t===kt;(t==="shape"||i)&&r.push("left:0;top:0;width:1px;height:1px;");r.push("visibility: ",i?"hidden":"visible");n.push(' style="',r.join(""),'"/>');if(t)n=i||t==="span"||t==="img"?n.join(""):e.prepVML(n),this.element=v(n);this.renderer=e;this.attrSetters={}},add:function(e){var t=this.renderer,n=this.element,r=t.box,r=e?e.element||e:r;e&&e.inverted&&t.invertChild(n,r);r.appendChild(n);this.added=!0;this.alignOnAdd&&!this.deferUpdateTransform&&this.updateTransform();ln(this,"add");return this},updateTransform:H.prototype.htmlUpdateTransform,setSpanRotation:function(e,t,n){d(this.element,{filter:e?["progid:DXImageTransform.Microsoft.Matrix(M11=",n,", M12=",-t,", M21=",t,", M22=",n,", sizingMethod='auto expand')"].join(""):Lt})},attr:function(e,t){var n,i,s,u=this.element||{},a=u.style,f=u.nodeName,h=this.renderer,p=this.symbolName,d,m=this.shadows,g,y=this.attrSetters,b=this;r(e)&&l(t)&&(n=e,e={},e[n]=t);if(r(e))n=e,b=n==="strokeWidth"||n==="stroke-width"?this.strokeweight:this[n];else for(n in e)if(i=e[n],g=!1,s=y[n]&&y[n].call(this,i,n),s!==!1&&i!==null){s!==W&&(i=s);if(p&&/^(x|y|r|start|end|width|height|innerR|anchorX|anchorY)/.test(n))d||(this.symbolAttr(e),d=!0),g=!0;else if(n==="d"){i=i||[];this.d=i.join(" ");s=i.length;g=[];for(var w;s--;)if(o(i[s]))g[s]=J(i[s]*10)-5;else if(i[s]==="Z")g[s]="x";else if(g[s]=i[s],i.isArc&&(i[s]==="wa"||i[s]==="at"))w=i[s]==="wa"?1:-1,g[s+5]===g[s+7]&&(g[s+7]-=w),g[s+6]===g[s+8]&&(g[s+8]-=w);i=g.join(" ")||"x";u.path=i;if(m)for(s=m.length;s--;)m[s].path=m[s].cutOff?this.cutOffPath(i,m[s].cutOff):i;g=!0}else if(n==="visibility"){if(m)for(s=m.length;s--;)m[s].style[n]=i;f==="DIV"&&(i=i==="hidden"?"-999em":0,ut||(a[n]=i?"visible":"hidden"),n="top");a[n]=i;g=!0}else if(n==="zIndex")i&&(a[n]=i),g=!0;else if(nn(n,["x","y","width","height"])!==-1)this[n]=i,n==="x"||n==="y"?n={x:"left",y:"top"}[n]:i=G(0,i),this.updateClipping?(this[n]=i,this.updateClipping()):a[n]=i,g=!0;else if(n==="class"&&f==="DIV")u.className=i;else if(n==="stroke")i=h.color(i,u,n),n="strokecolor";else if(n==="stroke-width"||n==="strokeWidth")u.stroked=i?!0:!1,n="strokeweight",this[n]=i,o(i)&&(i+="px");else if(n==="dashstyle")(u.getElementsByTagName("stroke")[0]||v(h.prepVML(["<stroke/>"]),null,null,u))[n]=i||"solid",this.dashstyle=i,g=!0;else if(n==="fill")if(f==="SPAN")a.color=i;else{if(f!=="IMG")u.filled=i!==Lt?!0:!1,i=h.color(i,u,n,this),n="fillcolor"}else if(n==="opacity")g=!0;else if(f==="shape"&&n==="rotation")this[n]=u.style[n]=i,u.style.left=-J(tt(i*rt)+1)+"px",u.style.top=J(et(i*rt))+"px";else if(n==="translateX"||n==="translateY"||n==="rotation")this[n]=i,this.updateTransform(),g=!0;else if(n==="text")this.bBox=null,u.innerHTML=i,g=!0;g||(ut?u[n]=i:c(u,n,i))}return b},clip:function(e){var t=this,n;e?(n=e.members,f(n,t),n.push(t),t.destroyClip=function(){f(n,t)},e=e.getCSS(t)):(t.destroyClip&&t.destroyClip(),e={clip:ut?"inherit":"rect(auto)"});return t.css(e)},css:H.prototype.htmlCss,safeRemoveChild:function(e){e.parentNode&&O(e)},destroy:function(){this.destroyClip&&this.destroyClip();return H.prototype.destroy.apply(this)},on:function(e,t){this.element["on"+e]=function(){var e=V.event;e.target=e.srcElement;t(e)};return this},cutOffPath:function(e,t){var r,e=e.split(/[ ,]/);r=e.length;if(r===9||r===11)e[r-4]=e[r-2]=n(e[r-2])-10*t;return e.join(" ")},shadow:function(e,t,r){var i=[],s,o=this.element,u=this.renderer,a,f=o.style,l,c=o.path,h,d,m,g;c&&typeof c.value!=="string"&&(c="x");d=c;if(e){m=p(e.width,3);g=(e.opacity||.15)/m;for(s=1;s<=3;s++){h=m*2+1-2*s;r&&(d=this.cutOffPath(c.value,h+.5));l=['<shape isShadow="true" strokeweight="',h,'" filled="false" path="',d,'" coordsize="10 10" style="',o.style.cssText,'" />'];a=v(u.prepVML(l),null,{left:n(f.left)+p(e.offsetX,1),top:n(f.top)+p(e.offsetY,1)});if(r)a.cutOff=h+1;l=['<stroke color="',e.color||"black",'" opacity="',g*s,'"/>'];v(u.prepVML(l),null,null,a);t?t.element.appendChild(a):o.parentNode.insertBefore(a,o);i.push(a)}this.shadows=i}return this}};gn=m(H,gn);var yn={Element:gn,isIE8:it.indexOf("MSIE 8.0")>-1,init:function(e,t,n){var r,i;this.alignedObjects=[];r=this.createElement(kt);i=r.element;i.style.position="relative";e.appendChild(r.element);this.isVML=!0;this.box=i;this.boxWrapper=r;this.setSize(t,n,!1);if(!X.namespaces.hcv)X.namespaces.add("hcv","urn:schemas-microsoft-com:vml"),X.createStyleSheet().cssText="hcv\\:fill, hcv\\:path, hcv\\:shape, hcv\\:stroke{ behavior:url(#default#VML); display: inline-block; } "},isHidden:function(){return!this.box.offsetWidth},clipRect:function(t,n,r,s){var o=this.createElement(),u=i(t);return e(o,{members:[],left:u?t.x:t,top:u?t.y:n,width:u?t.width:r,height:u?t.height:s,getCSS:function(t){var n=t.element,r=n.nodeName,t=t.inverted,i=this.top-(r==="shape"?n.offsetTop:0),s=this.left,n=s+this.width,o=i+this.height,i={clip:"rect("+J(t?s:i)+"px,"+J(t?o:n)+"px,"+J(t?n:o)+"px,"+J(t?i:s)+"px)"};!t&&ut&&r==="DIV"&&e(i,{width:n+"px",height:o+"px"});return i},updateClipping:function(){rn(o.members,function(e){e.css(o.getCSS(e))})}})},color:function(e,t,n,r){var i=this,s,o=/^rgba/,u,a,f=Lt;e&&e.linearGradient?a="gradient":e&&e.radialGradient&&(a="pattern");if(a){var l,c,h=e.linearGradient||e.radialGradient,p,d,m,g,y,b="",e=e.stops,w,E=[],S=function(){u=['<fill colors="'+E.join(",")+'" opacity="',m,'" o:opacity2="',d,'" type="',a,'" ',b,'focus="100%" method="any" />'];v(i.prepVML(u),null,null,t)};p=e[0];w=e[e.length-1];p[0]>0&&e.unshift([0,p[1]]);w[0]<1&&e.push([1,w[1]]);rn(e,function(e,t){o.test(e[1])?(s=vn(e[1]),l=s.get("rgb"),c=s.get("a")):(l=e[1],c=1);E.push(e[0]*100+"% "+l);t?(m=c,g=l):(d=c,y=l)});if(n==="fill")if(a==="gradient")n=h.x1||h[0]||0,e=h.y1||h[1]||0,p=h.x2||h[2]||0,h=h.y2||h[3]||0,b='angle="'+(90-$.atan((h-e)/(p-n))*180/nt)+'"',S();else{var f=h.r,x=f*2,T=f*2,N=h.cx,C=h.cy,k=t.radialReference,L,f=function(){k&&(L=r.getBBox(),N+=(k[0]-L.x)/L.width-.5,C+=(k[1]-L.y)/L.height-.5,x*=k[2]/L.width,T*=k[2]/L.height);b='src="'+wt.global.VMLRadialGradientURL+'" size="'+x+","+T+'" origin="0.5,0.5" position="'+N+","+C+'" color2="'+y+'" ';S()};r.added?f():an(r,"add",f);f=g}else f=l}else if(o.test(e)&&t.tagName!=="IMG")s=vn(e),u=["<",n,' opacity="',s.get("a"),'"/>'],v(this.prepVML(u),null,null,t),f=s.get("rgb");else{f=t.getElementsByTagName(n);if(f.length)f[0].opacity=1,f[0].type="solid";f=e}return f},prepVML:function(e){var t=this.isIE8,e=e.join("");t?(e=e.replace("/>",' xmlns="urn:schemas-microsoft-com:vml" />'),e=e.indexOf('style="')===-1?e.replace("/>",' style="display:inline-block;behavior:url(#default#VML);" />'):e.replace('style="','style="display:inline-block;behavior:url(#default#VML);')):e=e.replace("<","<hcv:");return e},text:mn.prototype.html,path:function(t){var n={coordsize:"10 10"};s(t)?n.d=t:i(t)&&e(n,t);return this.createElement("shape").attr(n)},circle:function(e,t,n){var r=this.symbol("circle");if(i(e))n=e.r,t=e.y,e=e.x;r.isCircle=!0;return r.attr({x:e,y:t,width:2*n,height:2*n})},g:function(e){var t;e&&(t={className:"highcharts-"+e,"class":"highcharts-"+e});return this.createElement(kt).attr(t)},image:function(e,t,n,r,i){var s=this.createElement("img").attr({src:e});arguments.length>1&&s.attr({x:t,y:n,width:r,height:i});return s},rect:function(e,t,n,r,s,o){if(i(e))t=e.y,n=e.width,r=e.height,o=e.strokeWidth,e=e.x;var u=this.symbol("rect");u.r=s;return u.attr(u.crisp(o,e,t,G(n,0),G(r,0)))},invertChild:function(e,t){var r=t.style;d(e,{flip:"x",left:n(r.width)-1,top:n(r.height)-1,rotation:-90})},symbols:{arc:function(e,t,n,r,i){var s=i.start,o=i.end,u=i.r||n||r,n=i.innerR,r=et(s),a=tt(s),f=et(o),l=tt(o);if(o-s===0)return["x"];s=["wa",e-u,t-u,e+u,t+u,e+u*r,t+u*a,e+u*f,t+u*l];i.open&&!n&&s.push("e","M",e,t);s.push("at",e-n,t-n,e+n,t+n,e+n*f,t+n*l,e+n*r,t+n*a,"x","e");s.isArc=!0;return s},circle:function(e,t,n,r,i){i&&i.isCircle&&(e-=n/2,t-=r/2);return["wa",e,t,e+n,t+r,e+n,t+r/2,e+n,t+r/2,"e"]},rect:function(e,t,n,r,i){var s=e+n,o=t+r,u;!l(i)||!i.r?s=mn.prototype.symbols.square.apply(0,arguments):(u=Y(i.r,n,r),s=["M",e+u,t,"L",s-u,t,"wa",s-2*u,t,s,t+2*u,s-u,t,s,t+u,"L",s,o-u,"wa",s-2*u,o-2*u,s,o,s,o-u,s-u,o,"L",e+u,o,"wa",e,o-2*u,e+2*u,o,e+u,o,e,o-u,"L",e,t+u,"wa",e,t,e+2*u,t+2*u,e,t+u,e+u,t,"x","e"]);return s}}};Highcharts.VMLRenderer=gn=function(){this.init.apply(this,arguments)};gn.prototype=t(mn.prototype,yn);vt=gn}var bn;if(dt)Highcharts.CanVGRenderer=gn=function(){ct="http://www.w3.org/1999/xhtml"},gn.prototype.symbols={},bn=function(){function e(){var e=t.length,n;for(n=0;n<e;n++)t[n]();t=[]}var t=[];return{push:function(n,r){t.length===0&&tn(r,e);t.push(n)}}}(),vt=gn;B.prototype={addLabel:function(){var t=this.axis,n=t.options,r=t.chart,i=t.horiz,s=t.categories,u=t.series[0]&&t.series[0].names,f=this.pos,c=n.labels,h=t.tickPositions,i=i&&s&&!c.step&&!c.staggerLines&&!c.rotation&&r.plotWidth/h.length||!i&&(r.optionsMarginLeft||r.chartWidth*.33),d=f===h[0],v=f===h[h.length-1],u=s?p(s[f],u&&u[f],f):f,s=this.label,h=h.info,m;t.isDatetimeAxis&&h&&(m=n.dateTimeLabelFormats[h.higherRanks[f]||h.unitName]);this.isFirst=d;this.isLast=v;n=t.labelFormatter.call({axis:t,chart:r,isFirst:d,isLast:v,dateTimeLabelFormat:m,value:t.isLog?_(a(u)):u});f=i&&{width:G(1,J(i-2*(c.padding||10)))+"px"};f=e(f,c.style);if(l(s))s&&s.attr({text:n}).css(f);else{i={align:t.labelAlign};if(o(c.rotation))i.rotation=c.rotation;this.label=l(n)&&c.enabled?r.renderer.text(n,0,0,c.useHTML).attr(i).css(f).add(t.labelGroup):null}},getLabelSize:function(){var e=this.label,t=this.axis;return e?(this.labelBBox=e.getBBox())[t.horiz?"height":"width"]:0},getLabelSides:function(){var e=this.axis,t=this.labelBBox.width,e=t*{left:0,center:.5,right:1}[e.labelAlign]-e.options.labels.x;return[-e,t-e]},handleOverflow:function(e,t){var n=!0,r=this.axis,i=r.chart,s=this.isFirst,o=this.isLast,u=t.x,a=r.reversed,f=r.tickPositions;if(s||o){var l=this.getLabelSides(),c=l[0],l=l[1],i=i.plotLeft,h=i+r.len,f=(r=r.ticks[f[e+(s?1:-1)]])&&r.label.xy&&r.label.xy.x+r.getLabelSides()[s?0:1];s&&!a||o&&a?u+c<i&&(u=i-c,r&&u+l>f&&(n=!1)):u+l>h&&(u=h-l,r&&u+c<f&&(n=!1));t.x=u}return n},getPosition:function(e,t,n,r){var i=this.axis,s=i.chart,o=r&&s.oldChartHeight||s.chartHeight;return{x:e?i.translate(t+n,null,null,r)+i.transB:i.left+i.offset+(i.opposite?(r&&s.oldChartWidth||s.chartWidth)-i.right-i.left:0),y:e?o-i.bottom+i.offset-(i.opposite?i.height:0):o-i.translate(t+n,null,null,r)-i.transB}},getLabelPosition:function(e,t,n,r,i,s,o,u){var a=this.axis,f=a.transA,c=a.reversed,h=a.staggerLines,p=a.chart.renderer.fontMetrics(i.style.fontSize).b,d=i.rotation,e=e+i.x-(s&&r?s*f*(c?-1:1):0),t=t+i.y-(s&&!r?s*f*(c?1:-1):0);d&&a.side===2&&(t-=p-p*et(d*rt));!l(i.y)&&!d&&(t+=p-n.getBBox().height/2);h&&(t+=o/(u||1)%h*(a.labelOffset/h));return{x:e,y:t}},getMarkPath:function(e,t,n,r,i,s){return s.crispLine(["M",e,t,"L",e+(i?0:-n),t+(i?n:0)],r)},render:function(e,t,n){var r=this.axis,i=r.options,s=r.chart.renderer,o=r.horiz,u=this.type,a=this.label,f=this.pos,l=i.labels,c=this.gridLine,h=u?u+"Grid":"grid",d=u?u+"Tick":"tick",v=i[h+"LineWidth"],m=i[h+"LineColor"],g=i[h+"LineDashStyle"],y=i[d+"Length"],h=i[d+"Width"]||0,b=i[d+"Color"],w=i[d+"Position"],d=this.mark,E=l.step,S=!0,x=r.tickmarkOffset,T=this.getPosition(o,f,x,t),N=T.x,T=T.y,C=o&&N===r.pos||!o&&T===r.pos+r.len?-1:1,k=r.staggerLines;this.isActive=!0;if(v){f=r.getPlotLinePath(f+x,v*C,t,!0);if(c===W){c={stroke:m,"stroke-width":v};if(g)c.dashstyle=g;if(!u)c.zIndex=1;if(t)c.opacity=0;this.gridLine=c=v?s.path(f).attr(c).add(r.gridGroup):null}if(!t&&c&&f)c[this.isNew?"attr":"animate"]({d:f,opacity:n})}if(h&&y)w==="inside"&&(y=-y),r.opposite&&(y=-y),t=this.getMarkPath(N,T,y,h*C,o,s),d?d.animate({d:t,opacity:n}):this.mark=s.path(t).attr({stroke:b,"stroke-width":h,opacity:n}).add(r.axisGroup);if(a&&!isNaN(N))a.xy=T=this.getLabelPosition(N,T,a,o,l,x,e,E),this.isFirst&&!p(i.showFirstLabel,1)||this.isLast&&!p(i.showLastLabel,1)?S=!1:!k&&o&&l.overflow==="justify"&&!this.handleOverflow(e,T)&&(S=!1),E&&e%E&&(S=!1),S&&!isNaN(T.y)?(T.opacity=n,a[this.isNew?"attr":"animate"](T),this.isNew=!1):a.attr("y",-9999)},destroy:function(){A(this,this.axis)}};j.prototype={render:function(){var e=this,n=e.axis,r=n.horiz,i=(n.pointRange||0)/2,s=e.options,o=s.label,a=e.label,f=s.width,c=s.to,h=s.from,d=l(h)&&l(c),v=s.value,m=s.dashStyle,g=e.svgElem,y=[],b,w=s.color,E=s.zIndex,S=s.events,x=n.chart.renderer;n.isLog&&(h=u(h),c=u(c),v=u(v));if(f){if(y=n.getPlotLinePath(v,f),i={stroke:w,"stroke-width":f},m)i.dashstyle=m}else if(d){if(h=G(h,n.min-i),c=Y(c,n.max+i),y=n.getPlotBandPath(h,c,s),i={fill:w},s.borderWidth)i.stroke=s.borderColor,i["stroke-width"]=s.borderWidth}else return;if(l(E))i.zIndex=E;if(g)y?g.animate({d:y},null,g.onGetPath):(g.hide(),g.onGetPath=function(){g.show()});else if(y&&y.length&&(e.svgElem=g=x.path(y).attr(i).add(),S))for(b in s=function(t){g.on(t,function(n){S[t].apply(e,[n])})},S)s(b);if(o&&l(o.text)&&y&&y.length&&n.width>0&&n.height>0){o=t({align:r&&d&&"center",x:r?!d&&4:10,verticalAlign:!r&&d&&"middle",y:r?d?16:10:d?6:-4,rotation:r&&!d&&90},o);if(!a)e.label=a=x.text(o.text,0,0,o.useHTML).attr({align:o.textAlign||o.align,rotation:o.rotation,zIndex:E}).css(o.style).add();n=[y[1],y[4],p(y[6],y[1])];y=[y[2],y[5],p(y[7],y[2])];r=k(n);d=k(y);a.align(o,!1,{x:r,y:d,width:L(n)-r,height:L(y)-d});a.show()}else a&&a.hide();return e},destroy:function(){f(this.axis.plotLinesAndBands,this);delete this.axis;A(this)}};F.prototype={destroy:function(){A(this,this.axis)},setTotal:function(e){this.cum=this.total=e},addValue:function(e){this.setTotal(_(this.total+e))},render:function(e){var t=this.options,n=t.format,n=n?w(n,this):t.formatter.call(this);this.label?this.label.attr({text:n,visibility:"hidden"}):this.label=this.axis.chart.renderer.text(n,0,0,t.useHTML).css(t.style).attr({align:this.textAlign,rotation:t.rotation,visibility:"hidden"}).add(e)},cacheExtremes:function(e,t){this.points[e.index]=t},setOffset:function(e,t){var n=this.axis,r=n.chart,i=r.inverted,s=this.isNegative,o=n.translate(this.percent?100:this.total,0,0,0,1),n=n.translate(0),n=Z(o-n),u=r.xAxis[0].translate(this.x)+e,a=r.plotHeight,s={x:i?s?o:o-n:u,y:i?a-u-t:s?a-o-n:a-o,width:i?n:t,height:i?t:n};if(i=this.label)i.align(this.alignOptions,null,s),s=i.alignAttr,i.attr({visibility:this.options.crop===!1||r.isInsidePlot(s.x,s.y)?ht?"inherit":"visible":"hidden"})}};I.prototype={defaultOptions:{dateTimeLabelFormats:{millisecond:"%H:%M:%S.%L",second:"%H:%M:%S",minute:"%H:%M",hour:"%H:%M",day:"%e. %b",week:"%e. %b",month:"%b '%y",year:"%Y"},endOnTick:!1,gridLineColor:"#C0C0C0",labels:Zt,lineColor:"#C0D0E0",lineWidth:1,minPadding:.01,maxPadding:.01,minorGridLineColor:"#E0E0E0",minorGridLineWidth:1,minorTickColor:"#A0A0A0",minorTickLength:2,minorTickPosition:"outside",startOfWeek:1,startOnTick:!1,tickColor:"#C0D0E0",tickLength:5,tickmarkPlacement:"between",tickPixelInterval:100,tickPosition:"outside",tickWidth:1,title:{align:"middle",style:{color:"#4d759e",fontWeight:"bold"}},type:"linear"},defaultYAxisOptions:{endOnTick:!0,gridLineWidth:1,tickPixelInterval:72,showLastLabel:!0,labels:{x:-8,y:3},lineWidth:0,maxPadding:.05,minPadding:.05,startOnTick:!0,tickWidth:0,title:{rotation:270,text:"Values"},stackLabels:{enabled:!1,formatter:function(){return g(this.total,-1)},style:Zt.style}},defaultLeftAxisOptions:{labels:{x:-8,y:null},title:{rotation:270}},defaultRightAxisOptions:{labels:{x:8,y:null},title:{rotation:90}},defaultBottomAxisOptions:{labels:{x:0,y:14},title:{rotation:0}},defaultTopAxisOptions:{labels:{x:0,y:-5},title:{rotation:0}},init:function(e,t){var n=t.isX;this.horiz=e.inverted?!n:n;this.xOrY=(this.isXAxis=n)?"x":"y";this.opposite=t.opposite;this.side=this.horiz?this.opposite?0:2:this.opposite?1:3;this.setOptions(t);var r=this.options,i=r.type;this.labelFormatter=r.labels.formatter||this.defaultLabelFormatter;this.userOptions=t;this.minPixelPadding=0;this.chart=e;this.reversed=r.reversed;this.zoomEnabled=r.zoomEnabled!==!1;this.categories=r.categories||i==="category";this.isLog=i==="logarithmic";this.isDatetimeAxis=i==="datetime";this.isLinked=l(r.linkedTo);this.tickmarkOffset=this.categories&&r.tickmarkPlacement==="between"?.5:0;this.ticks={};this.minorTicks={};this.plotLinesAndBands=[];this.alternateBands={};this.len=0;this.minRange=this.userMinRange=r.minRange||r.maxZoom;this.range=r.range;this.offset=r.offset||0;this.stacks={};this.oldStacks={};this.stacksMax={};this._stacksTouched=0;this.min=this.max=null;var s,r=this.options.events;nn(this,e.axes)===-1&&(e.axes.push(this),e[n?"xAxis":"yAxis"].push(this));this.series=this.series||[];if(e.inverted&&n&&this.reversed===W)this.reversed=!0;this.removePlotLine=this.removePlotBand=this.removePlotBandOrLine;for(s in r)an(this,s,r[s]);if(this.isLog)this.val2lin=u,this.lin2val=a},setOptions:function(e){this.options=t(this.defaultOptions,this.isXAxis?{}:this.defaultYAxisOptions,[this.defaultTopAxisOptions,this.defaultRightAxisOptions,this.defaultBottomAxisOptions,this.defaultLeftAxisOptions][this.side],t(wt[this.isXAxis?"xAxis":"yAxis"],e))},update:function(n,r){var i=this.chart,n=i.options[this.xOrY+"Axis"][this.options.index]=t(this.userOptions,n);this.destroy(!0);this._addedPlotLB=!1;this.init(i,e(n,{events:W}));i.isDirtyBox=!0;p(r,!0)&&i.redraw()},remove:function(e){var t=this.chart,n=this.xOrY+"Axis";rn(this.series,function(e){e.remove(!1)});f(t.axes,this);f(t[n],this);t.options[n].splice(this.options.index,1);rn(t[n],function(e,t){e.options.index=t});this.destroy();t.isDirtyBox=!0;p(e,!0)&&t.redraw()},defaultLabelFormatter:function(){var e=this.axis,t=this.value,n=e.categories,r=this.dateTimeLabelFormat,i=wt.lang.numericSymbols,s=i&&i.length,o,u=e.options.labels.format,e=e.isLog?t:e.tickInterval;if(u)o=w(u,this);else if(n)o=t;else if(r)o=Et(r,t);else if(s&&e>=1e3)for(;s--&&o===W;)n=Math.pow(1e3,s+1),e>=n&&i[s]!==null&&(o=g(t/n,-1)+i[s]);o===W&&(o=t>=1e3?g(t,0):g(t,-1));return o},getSeriesExtremes:function(){var e=this,t=e.chart;e.hasVisibleSeries=!1;e.dataMin=e.dataMax=null;e.stacksMax={};e.buildStacks();rn(e.series,function(n){if(n.visible||!t.options.chart.ignoreHiddenSeries){var r=n.options,i;i=r.threshold;e.hasVisibleSeries=!0;e.isLog&&i<=0&&(i=null);if(e.isXAxis){if(i=n.xData,i.length)e.dataMin=Y(p(e.dataMin,i[0]),k(i)),e.dataMax=G(p(e.dataMax,i[0]),L(i))}else{r=r.stacking;e.usePercentage=r==="percent";if(e.usePercentage)e.dataMin=0,e.dataMax=99;n.getExtremes();r=n.dataMax;n=n.dataMin;if(!e.usePercentage&&l(n)&&l(r))e.dataMin=Y(p(e.dataMin,n),n),e.dataMax=G(p(e.dataMax,r),r);if(l(i))if(e.dataMin>=i)e.dataMin=i,e.ignoreMinPadding=!0;else if(e.dataMax<i)e.dataMax=i,e.ignoreMaxPadding=!0}}})},translate:function(e,t,n,r,i,s){var u=this.len,a=1,f=0,l=r?this.oldTransA:this.transA,r=r?this.oldMin:this.min,c=this.minPixelPadding,i=(this.options.ordinal||this.isLog&&i)&&this.lin2val;if(!l)l=this.transA;n&&(a*=-1,f=u);this.reversed&&(a*=-1,f-=a*u);t?(e=e*a+f,e-=c,e=e/l+r,i&&(e=this.lin2val(e))):(i&&(e=this.val2lin(e)),s==="between"&&(s=.5),e=a*(e-r)*l+f+a*c+(o(s)?l*s*this.pointRange:0));return e},toPixels:function(e,t){return this.translate(e,!1,!this.horiz,null,!0)+(t?0:this.pos)},toValue:function(e,t){return this.translate(e-(t?0:this.pos),!0,!this.horiz,null,!0)},getPlotLinePath:function(e,t,n,r){var i=this.chart,s=this.left,o=this.top,u,a,f,e=this.translate(e,null,null,n),l=n&&i.oldChartHeight||i.chartHeight,c=n&&i.oldChartWidth||i.chartWidth,h;u=this.transB;n=a=J(e+u);u=f=J(l-e-u);if(isNaN(e))h=!0;else if(this.horiz){if(u=o,f=l-this.bottom,n<s||n>s+this.width)h=!0}else if(n=s,a=c-this.right,u<o||u>o+this.height)h=!0;return h&&!r?null:i.renderer.crispLine(["M",n,u,"L",a,f],t||0)},getPlotBandPath:function(e,t){var n=this.getPlotLinePath(t),r=this.getPlotLinePath(e);r&&n?r.push(n[4],n[5],n[1],n[2]):r=null;return r},getLinearTickPositions:function(e,t,n){for(var r,t=_(K(t/e)*e),n=_(Q(n/e)*e),i=[];t<=n;){i.push(t);t=_(t+e);if(t===r)break;r=t}return i},getLogTickPositions:function(e,t,n,r){var i=this.options,s=this.len,o=[];if(!r)this._minorAutoInterval=null;if(e>=.5)e=J(e),o=this.getLinearTickPositions(e,t,n);else if(e>=.08)for(var s=K(t),f,l,c,h,d,i=e>.3?[1,2,4]:e>.15?[1,2,4,6,8]:[1,2,3,4,5,6,7,8,9];s<n+1&&!d;s++){l=i.length;for(f=0;f<l&&!d;f++)c=u(a(s)*i[f]),c>t&&(!r||h<=n)&&o.push(h),h>n&&(d=!0),h=c}else if(t=a(t),n=a(n),e=i[r?"minorTickInterval":"tickInterval"],e=p(e==="auto"?null:e,this._minorAutoInterval,(n-t)*(i.tickPixelInterval/(r?5:1))/((r?s/this.tickPositions.length:s)||1)),e=S(e,null,E(e)),o=un(this.getLinearTickPositions(e,t,n),u),!r)this._minorAutoInterval=e/5;if(!r)this.tickInterval=e;return o},getMinorTickPositions:function(){var e=this.options,t=this.tickPositions,n=this.minorTickInterval,r=[],i;if(this.isLog){i=t.length;for(e=1;e<i;e++)r=r.concat(this.getLogTickPositions(n,t[e-1],t[e],!0))}else if(this.isDatetimeAxis&&e.minorTickInterval==="auto")r=r.concat(T(x(n),this.min,this.max,e.startOfWeek)),r[0]<this.min&&r.shift();else for(t=this.min+(t[0]-this.min)%n;t<=this.max;t+=n)r.push(t);return r},adjustForMinRange:function(){var e=this.options,t=this.min,n=this.max,r,i=this.dataMax-this.dataMin>=this.minRange,s,o,u,a,f;if(this.isXAxis&&this.minRange===W&&!this.isLog)l(e.min)||l(e.max)?this.minRange=null:(rn(this.series,function(e){a=e.xData;for(o=f=e.xIncrement?1:a.length-1;o>0;o--)if(u=a[o]-a[o-1],s===W||u<s)s=u}),this.minRange=Y(s*5,this.dataMax-this.dataMin));if(n-t<this.minRange){var c=this.minRange;r=(c-n+t)/2;r=[t-r,p(e.min,t-r)];if(i)r[2]=this.dataMin;t=L(r);n=[t+c,p(e.max,t+c)];if(i)n[2]=this.dataMax;n=k(n);n-t<c&&(r[0]=n-c,r[1]=p(e.min,n-c),t=L(r))}this.min=t;this.max=n},setAxisTranslation:function(e){var t=this.max-this.min,n=0,i,s=0,o=0,u=this.linkedParent,a=this.transA;if(this.isXAxis)u?(s=u.minPointOffset,o=u.pointRangePadding):rn(this.series,function(e){var u=e.pointRange,a=e.options.pointPlacement,f=e.closestPointRange;u>t&&(u=0);n=G(n,u);s=G(s,r(a)?0:u/2);o=G(o,a==="on"?0:u);!e.noSharedTooltip&&l(f)&&(i=l(i)?Y(i,f):f)}),u=this.ordinalSlope&&i?this.ordinalSlope/i:1,this.minPointOffset=s*=u,this.pointRangePadding=o*=u,this.pointRange=Y(n,t),this.closestPointRange=i;if(e)this.oldTransA=a;this.translationSlope=this.transA=a=this.len/(t+o||1);this.transB=this.horiz?this.left:this.bottom;this.minPixelPadding=a*s},setTickPositions:function(e){var t=this,n=t.chart,r=t.options,i=t.isLog,s=t.isDatetimeAxis,o=t.isXAxis,a=t.isLinked,f=t.options.tickPositioner,c=r.maxPadding,h=r.minPadding,d=r.tickInterval,v=r.minTickInterval,m=r.tickPixelInterval,g=t.categories;a?(t.linkedParent=n[o?"xAxis":"yAxis"][r.linkedTo],n=t.linkedParent.getExtremes(),t.min=p(n.min,n.dataMin),t.max=p(n.max,n.dataMax),r.type!==t.linkedParent.options.type&&M(11,1)):(t.min=p(t.userMin,r.min,t.dataMin),t.max=p(t.userMax,r.max,t.dataMax));if(i)!e&&Y(t.min,p(t.dataMin,t.min))<=0&&M(10,1),t.min=_(u(t.min)),t.max=_(u(t.max));if(t.range&&(t.userMin=t.min=G(t.min,t.max-t.range),t.userMax=t.max,e))t.range=null;t.beforePadding&&t.beforePadding();t.adjustForMinRange();if(!g&&!t.usePercentage&&!a&&l(t.min)&&l(t.max)&&(n=t.max-t.min)){if(!l(r.min)&&!l(t.userMin)&&h&&(t.dataMin<0||!t.ignoreMinPadding))t.min-=n*h;if(!l(r.max)&&!l(t.userMax)&&c&&(t.dataMax>0||!t.ignoreMaxPadding))t.max+=n*c}t.tickInterval=t.min===t.max||t.min===void 0||t.max===void 0?1:a&&!d&&m===t.linkedParent.options.tickPixelInterval?t.linkedParent.tickInterval:p(d,g?1:(t.max-t.min)*m/(t.len||1));o&&!e&&rn(t.series,function(e){e.processData(t.min!==t.oldMin||t.max!==t.oldMax)});t.setAxisTranslation(!0);t.beforeSetTickPositions&&t.beforeSetTickPositions();if(t.postProcessTickInterval)t.tickInterval=t.postProcessTickInterval(t.tickInterval);if(t.pointRange)t.tickInterval=G(t.pointRange,t.tickInterval);if(!d&&t.tickInterval<v)t.tickInterval=v;if(!s&&!i&&!d)t.tickInterval=S(t.tickInterval,null,E(t.tickInterval),r);t.minorTickInterval=r.minorTickInterval==="auto"&&t.tickInterval?t.tickInterval/5:r.minorTickInterval;t.tickPositions=e=r.tickPositions?[].concat(r.tickPositions):f&&f.apply(t,[t.min,t.max]);if(!e)e=s?(t.getNonLinearTimeTicks||T)(x(t.tickInterval,r.units),t.min,t.max,r.startOfWeek,t.ordinalPositions,t.closestPointRange,!0):i?t.getLogTickPositions(t.tickInterval,t.min,t.max):t.getLinearTickPositions(t.tickInterval,t.min,t.max),t.tickPositions=e;if(!a)i=e[0],s=e[e.length-1],a=t.minPointOffset||0,r.startOnTick?t.min=i:t.min-a>i&&e.shift(),r.endOnTick?t.max=s:t.max+a<s&&e.pop(),e.length===1&&(t.min-=.001,t.max+=.001)},setMaxTicks:function(){var e=this.chart,t=e.maxTicks||{},n=this.tickPositions,r=this._maxTicksKey=[this.xOrY,this.pos,this.len].join("-");if(!this.isLinked&&!this.isDatetimeAxis&&n&&n.length>(t[r]||0)&&this.options.alignTicks!==!1)t[r]=n.length;e.maxTicks=t},adjustTickAmount:function(){var e=this._maxTicksKey,t=this.tickPositions,n=this.chart.maxTicks;if(n&&n[e]&&!this.isDatetimeAxis&&!this.categories&&!this.isLinked&&this.options.alignTicks!==!1){var r=this.tickAmount,i=t.length;this.tickAmount=e=n[e];if(i<e){for(;t.length<e;)t.push(_(t[t.length-1]+this.tickInterval));this.transA*=(i-1)/(e-1);this.max=t[t.length-1]}if(l(r)&&e!==r)this.isDirty=!0}},setScale:function(){var e=this.stacks,t,n,r,i;this.oldMin=this.min;this.oldMax=this.max;this.oldAxisLength=this.len;this.setAxisSize();i=this.len!==this.oldAxisLength;rn(this.series,function(e){if(e.isDirtyData||e.isDirty||e.xAxis.isDirty)r=!0});if(i||r||this.isLinked||this.forceRedraw||this.userMin!==this.oldUserMin||this.userMax!==this.oldUserMax){if(!this.isXAxis)for(t in e)for(n in e[t])e[t][n].total=null;this.forceRedraw=!1;this.getSeriesExtremes();this.setTickPositions();this.oldUserMin=this.userMin;this.oldUserMax=this.userMax;if(!this.isDirty)this.isDirty=i||this.min!==this.oldMin||this.max!==this.oldMax}else if(!this.isXAxis){if(this.oldStacks)e=this.stacks=this.oldStacks;for(t in e)for(n in e[t])e[t][n].cum=e[t][n].total}this.setMaxTicks()},setExtremes:function(t,n,r,i,s){var o=this,u=o.chart,r=p(r,!0),s=e(s,{min:t,max:n});ln(o,"setExtremes",s,function(){o.userMin=t;o.userMax=n;o.isDirtyExtremes=!0;r&&u.redraw(i)})},zoom:function(e,t){this.allowZoomOutside||(l(this.dataMin)&&e<=this.dataMin&&(e=W),l(this.dataMax)&&t>=this.dataMax&&(t=W));this.displayBtn=e!==W||t!==W;this.setExtremes(e,t,!1,W,{trigger:"zoom"});return!0},setAxisSize:function(){var e=this.chart,t=this.options,n=t.offsetLeft||0,r=t.offsetRight||0,i=this.horiz,s,o;this.left=o=p(t.left,e.plotLeft+n);this.top=s=p(t.top,e.plotTop);this.width=n=p(t.width,e.plotWidth-n+r);this.height=t=p(t.height,e.plotHeight);this.bottom=e.chartHeight-t-s;this.right=e.chartWidth-n-o;this.len=G(i?n:t,0);this.pos=i?o:s},getExtremes:function(){var e=this.isLog;return{min:e?_(a(this.min)):this.min,max:e?_(a(this.max)):this.max,dataMin:this.dataMin,dataMax:this.dataMax,userMin:this.userMin,userMax:this.userMax}},getThreshold:function(e){var t=this.isLog,n=t?a(this.min):this.min,t=t?a(this.max):this.max;n>e||e===null?e=n:t<e&&(e=t);return this.translate(e,0,1,0,1)},addPlotBand:function(e){this.addPlotBandOrLine(e,"plotBands")},addPlotLine:function(e){this.addPlotBandOrLine(e,"plotLines")},addPlotBandOrLine:function(e,t){var n=(new j(this,e)).render(),r=this.userOptions;t&&(r[t]=r[t]||[],r[t].push(e));this.plotLinesAndBands.push(n);return n},autoLabelAlign:function(e){e=(p(e,0)-this.side*90+720)%360;return e>15&&e<165?"right":e>195&&e<345?"left":"center"},getOffset:function(){var e=this,t=e.chart,n=t.renderer,r=e.options,i=e.tickPositions,s=e.ticks,o=e.horiz,u=e.side,a=t.inverted?[1,0,3,2][u]:u,f,c=0,h,d=0,v=r.title,m=r.labels,g=0,y=t.axisOffset,b=t.clipOffset,w=[-1,1,1,-1][u],E,S=1,x=p(m.maxStaggerLines,5),T,N,C,k;e.hasData=f=e.hasVisibleSeries||l(e.min)&&l(e.max)&&!!i;e.showAxis=t=f||p(r.showEmpty,!0);e.staggerLines=e.horiz&&m.staggerLines;if(!e.axisGroup)e.gridGroup=n.g("grid").attr({zIndex:r.gridZIndex||1}).add(),e.axisGroup=n.g("axis").attr({zIndex:r.zIndex||2}).add(),e.labelGroup=n.g("axis-labels").attr({zIndex:m.zIndex||7}).add();if(f||e.isLinked){e.labelAlign=p(m.align||e.autoLabelAlign(m.rotation));rn(i,function(t){s[t]?s[t].addLabel():s[t]=new B(e,t)});if(e.horiz&&!e.staggerLines&&x&&!m.rotation){for(E=e.reversed?[].concat(i).reverse():i;S<x;){f=[];T=!1;for(m=0;m<E.length;m++)N=E[m],C=(C=s[N].label&&s[N].label.bBox)?C.width:0,k=m%S,C&&(N=e.translate(N),f[k]!==W&&N<f[k]&&(T=!0),f[k]=N+C);if(T)S++;else break}if(S>1)e.staggerLines=S}rn(i,function(t){if(u===0||u===2||{1:"left",3:"right"}[u]===e.labelAlign)g=G(s[t].getLabelSize(),g)});if(e.staggerLines)g*=e.staggerLines,e.labelOffset=g}else for(E in s)s[E].destroy(),delete s[E];if(v&&v.text&&v.enabled!==!1){if(!e.axisTitle)e.axisTitle=n.text(v.text,0,0,v.useHTML).attr({zIndex:7,rotation:v.rotation||0,align:v.textAlign||{low:"left",middle:"center",high:"right"}[v.align]}).css(v.style).add(e.axisGroup),e.axisTitle.isNew=!0;if(t)c=e.axisTitle.getBBox()[o?"height":"width"],d=p(v.margin,o?5:10),h=v.offset;e.axisTitle[t?"show":"hide"]()}e.offset=w*p(r.offset,y[u]);e.axisTitleMargin=p(h,g+d+(u!==2&&g&&w*r.labels[o?"y":"x"]));y[u]=G(y[u],e.axisTitleMargin+c+w*e.offset);b[a]=G(b[a],r.lineWidth)},getLinePath:function(e){var t=this.chart,n=this.opposite,r=this.offset,i=this.horiz,s=this.left+(n?this.width:0)+r;this.lineTop=r=t.chartHeight-this.bottom-(n?this.height:0)+r;n||(e*=-1);
-		return t.renderer.crispLine(["M",i?this.left:s,i?r:this.top,"L",i?t.chartWidth-this.right:s,i?r:t.chartHeight-this.bottom],e)},getTitlePosition:function(){var e=this.horiz,t=this.left,r=this.top,i=this.len,s=this.options.title,o=e?t:r,u=this.opposite,a=this.offset,f=n(s.style.fontSize||12),i={low:o+(e?0:i),middle:o+i/2,high:o+(e?i:0)}[s.align],t=(e?r+this.height:t)+(e?1:-1)*(u?-1:1)*this.axisTitleMargin+(this.side===2?f:0);return{x:e?i:t+(u?this.width:0)+a+(s.x||0),y:e?t-(u?this.height:0)+a:i+(s.y||0)}},render:function(){var e=this,t=e.chart,n=t.renderer,r=e.options,i=e.isLog,s=e.isLinked,o=e.tickPositions,u=e.axisTitle,f=e.stacks,c=e.ticks,h=e.minorTicks,p=e.alternateBands,d=r.stackLabels,v=r.alternateGridColor,m=e.tickmarkOffset,g=r.lineWidth,y,b=t.hasRendered&&l(e.oldMin)&&!isNaN(e.oldMin);y=e.hasData;var w=e.showAxis,E,S;rn([c,h,p],function(e){for(var t in e)e[t].isActive=!1});if(y||s)if(e.minorTickInterval&&!e.categories&&rn(e.getMinorTickPositions(),function(t){h[t]||(h[t]=new B(e,t,"minor"));b&&h[t].isNew&&h[t].render(null,!0);h[t].render(null,!1,1)}),o.length&&(rn(o.slice(1).concat([o[0]]),function(t,n){n=n===o.length-1?0:n+1;if(!s||t>=e.min&&t<=e.max)c[t]||(c[t]=new B(e,t)),b&&c[t].isNew&&c[t].render(n,!0),c[t].render(n,!1,1)}),m&&e.min===0&&(c[-1]||(c[-1]=new B(e,-1,null,!0)),c[-1].render(-1))),v&&rn(o,function(t,n){if(n%2===0&&t<e.max)p[t]||(p[t]=new j(e)),E=t+m,S=o[n+1]!==W?o[n+1]+m:e.max,p[t].options={from:i?a(E):E,to:i?a(S):S,color:v},p[t].render(),p[t].isActive=!0}),!e._addedPlotLB)rn((r.plotLines||[]).concat(r.plotBands||[]),function(t){e.addPlotBandOrLine(t)}),e._addedPlotLB=!0;rn([c,h,p],function(e){var n,r,i=[],s=St?St.duration||500:0,o=function(){for(r=i.length;r--;)e[i[r]]&&!e[i[r]].isActive&&(e[i[r]].destroy(),delete e[i[r]])};for(n in e)if(!e[n].isActive)e[n].render(n,!1,0),e[n].isActive=!1,i.push(n);e===p||!t.hasRendered||!s?o():s&&setTimeout(o,s)});if(g)y=e.getLinePath(g),e.axisLine?e.axisLine.animate({d:y}):e.axisLine=n.path(y).attr({stroke:r.lineColor,"stroke-width":g,zIndex:7}).add(e.axisGroup),e.axisLine[w?"show":"hide"]();if(u&&w)u[u.isNew?"attr":"animate"](e.getTitlePosition()),u.isNew=!1;if(d&&d.enabled){var x,T,r=e.stackTotalGroup;if(!r)e.stackTotalGroup=r=n.g("stack-labels").attr({visibility:"visible",zIndex:6}).add();r.translate(t.plotLeft,t.plotTop);for(x in f)for(T in n=f[x],n)n[T].render(r)}e.isDirty=!1},removePlotBandOrLine:function(e){for(var t=this.plotLinesAndBands,n=this.options,r=this.userOptions,i=t.length;i--;)t[i].id===e&&t[i].destroy();rn([n.plotLines||[],r.plotLines||[],n.plotBands||[],r.plotBands||[]],function(t){for(i=t.length;i--;)t[i].id===e&&f(t,t[i])})},setTitle:function(e,t){this.update({title:e},t)},redraw:function(){var e=this.chart.pointer;e.reset&&e.reset(!0);this.render();rn(this.plotLinesAndBands,function(e){e.render()});rn(this.series,function(e){e.isDirty=!0})},buildStacks:function(){this.isXAxis||rn(this.series,function(e){e.setStackedPoints()})},setCategories:function(e,t){this.update({categories:e},t)},destroy:function(e){var t=this,n=t.stacks,r,i=t.plotLinesAndBands;e||fn(t);for(r in n)A(n[r]),n[r]=null;rn([t.ticks,t.minorTicks,t.alternateBands],function(e){A(e)});for(e=i.length;e--;)i[e].destroy();rn("stackTotalGroup,axisLine,axisGroup,gridGroup,labelGroup,axisTitle".split(","),function(e){t[e]&&(t[e]=t[e].destroy())})}};q.prototype={init:function(e,t){var r=t.borderWidth,i=t.style,s=n(i.padding);this.chart=e;this.options=t;this.crosshairs=[];this.now={x:0,y:0};this.isHidden=!0;this.label=e.renderer.label("",0,0,t.shape,null,null,t.useHTML,null,"tooltip").attr({padding:s,fill:t.backgroundColor,"stroke-width":r,r:t.borderRadius,zIndex:8}).css(i).css({padding:0}).hide().add();dt||this.label.shadow(t.shadow);this.shared=t.shared},destroy:function(){rn(this.crosshairs,function(e){e&&e.destroy()});if(this.label)this.label=this.label.destroy();clearTimeout(this.hideTimer);clearTimeout(this.tooltipTimeout)},move:function(t,n,r,i){var s=this,o=s.now,u=s.options.animation!==!1&&!s.isHidden;e(o,{x:u?(2*o.x+t)/3:t,y:u?(o.y+n)/2:n,anchorX:u?(2*o.anchorX+r)/3:r,anchorY:u?(o.anchorY+i)/2:i});s.label.attr(o);if(u&&(Z(t-o.x)>1||Z(n-o.y)>1))clearTimeout(this.tooltipTimeout),this.tooltipTimeout=setTimeout(function(){s&&s.move(t,n,r,i)},32)},hide:function(){var e=this,t;clearTimeout(this.hideTimer);if(!this.isHidden)t=this.chart.hoverPoints,this.hideTimer=setTimeout(function(){e.label.fadeOut();e.isHidden=!0},p(this.options.hideDelay,500)),t&&rn(t,function(e){e.setState()}),this.chart.hoverPoints=null},hideCrosshairs:function(){rn(this.crosshairs,function(e){e&&e.hide()})},getAnchor:function(e,t){var n,r=this.chart,i=r.inverted,s=r.plotTop,o=0,u=0,a,e=h(e);n=e[0].tooltipPos;this.followPointer&&t&&(t.chartX===W&&(t=r.pointer.normalize(t)),n=[t.chartX-r.plotLeft,t.chartY-s]);n||(rn(e,function(e){a=e.series.yAxis;o+=e.plotX;u+=(e.plotLow?(e.plotLow+e.plotHigh)/2:e.plotY)+(!i&&a?a.top-s:0)}),o/=e.length,u/=e.length,n=[i?r.plotWidth-u:o,this.shared&&!i&&e.length>1&&t?t.chartY-s:i?r.plotHeight-o:u]);return un(n,J)},getPosition:function(e,t,n){var r=this.chart,i=r.plotLeft,s=r.plotTop,o=r.plotWidth,u=r.plotHeight,a=p(this.options.distance,12),f=n.plotX,n=n.plotY,r=f+i+(r.inverted?a:-e-a),l=n-t+s+15,c;r<7&&(r=i+G(f,0)+a);r+e>i+o&&(r-=r+e-(i+o),l=n-t+s-a,c=!0);l<s+5&&(l=s+5,c&&n>=l&&n<=l+t&&(l=n+s+a));l+t>s+u&&(l=G(s,s+u-t-a));return{x:r,y:l}},defaultFormatter:function(e){var t=this.points||h(this),n=t[0].series,r;r=[n.tooltipHeaderFormatter(t[0])];rn(t,function(e){n=e.series;r.push(n.tooltipFormatter&&n.tooltipFormatter(e)||e.point.tooltipFormatter(n.tooltipOptions.pointFormat))});r.push(e.options.footerFormat||"");return r.join("")},refresh:function(e,t){var n=this.chart,r=this.label,i=this.options,s,o,a,f={},l,c=[];l=i.formatter||this.defaultFormatter;var f=n.hoverPoints,d,v=i.crosshairs;a=this.shared;clearTimeout(this.hideTimer);this.followPointer=h(e)[0].series.tooltipOptions.followPointer;o=this.getAnchor(e,t);s=o[0];o=o[1];a&&(!e.series||!e.series.noSharedTooltip)?(n.hoverPoints=e,f&&rn(f,function(e){e.setState()}),rn(e,function(e){e.setState("hover");c.push(e.getLabelConfig())}),f={x:e[0].category,y:e[0].y},f.points=c,e=e[0]):f=e.getLabelConfig();l=l.call(f,this);f=e.series;a=a||!f.isCartesian||f.tooltipOutsidePlot||n.isInsidePlot(s,o);l===!1||!a?this.hide():(this.isHidden&&(pn(r),r.attr("opacity",1).show()),r.attr({text:l}),d=i.borderColor||e.color||f.color||"#606060",r.attr({stroke:d}),this.updatePosition({plotX:s,plotY:o}),this.isHidden=!1);if(v){v=h(v);for(r=v.length;r--;)if(f=e.series,i=f[r?"yAxis":"xAxis"],v[r]&&i)if(a=r?p(e.stackY,e.y):e.x,i.isLog&&(a=u(a)),f.modifyValue&&(a=f.modifyValue(a)),i=i.getPlotLinePath(a,1),this.crosshairs[r])this.crosshairs[r].attr({d:i,visibility:"visible"});else{a={"stroke-width":v[r].width||1,stroke:v[r].color||"#C0C0C0",zIndex:v[r].zIndex||2};if(v[r].dashStyle)a.dashstyle=v[r].dashStyle;this.crosshairs[r]=n.renderer.path(i).attr(a).add()}}ln(n,"tooltipRefresh",{text:l,x:s+n.plotLeft,y:o+n.plotTop,borderColor:d})},updatePosition:function(e){var t=this.chart,n=this.label,n=(this.options.positioner||this.getPosition).call(this,n.width,n.height,e);this.move(J(n.x),J(n.y),e.plotX+t.plotLeft,e.plotY+t.plotTop)}};R.prototype={init:function(e,t){var n=dt?"":t.chart.zoomType,r=e.inverted,i;this.options=t;this.chart=e;this.zoomX=i=/x/.test(n);this.zoomY=n=/y/.test(n);this.zoomHor=i&&!r||n&&r;this.zoomVert=n&&!r||i&&r;this.pinchDown=[];this.lastValidTouch={};if(t.tooltip.enabled)e.tooltip=new q(e,t.tooltip);this.setDOMEvents()},normalize:function(t){var n,r,t=t||V.event;if(!t.target)t.target=t.srcElement;t=cn(t);r=t.touches?t.touches.item(0):t;this.chartPosition=n=on(this.chart.container);return e(t,{chartX:J(p(r.pageX,r.clientX)-n.left),chartY:J(p(r.pageY,r.clientY)-n.top)})},getCoordinates:function(e){var t={xAxis:[],yAxis:[]};rn(this.chart.axes,function(n){t[n.isXAxis?"xAxis":"yAxis"].push({axis:n,value:n.toValue(e[n.horiz?"chartX":"chartY"])})});return t},getIndex:function(e){var t=this.chart;return t.inverted?t.plotHeight+t.plotTop-e.chartY:e.chartX-t.plotLeft},runPointActions:function(e){var t=this.chart,n=t.series,r=t.tooltip,i,s=t.hoverPoint,o=t.hoverSeries,u,a,f=t.chartWidth,l=this.getIndex(e);if(r&&this.options.tooltip.shared&&(!o||!o.noSharedTooltip)){i=[];u=n.length;for(a=0;a<u;a++)if(n[a].visible&&n[a].options.enableMouseTracking!==!1&&!n[a].noSharedTooltip&&n[a].tooltipPoints.length&&(t=n[a].tooltipPoints[l],t.series))t._dist=Z(l-t.clientX),f=Y(f,t._dist),i.push(t);for(u=i.length;u--;)i[u]._dist>f&&i.splice(u,1);if(i.length&&i[0].clientX!==this.hoverX)r.refresh(i,e),this.hoverX=i[0].clientX}if(o&&o.tracker){if((t=o.tooltipPoints[l])&&t!==s)t.onMouseOver(e)}else r&&r.followPointer&&!r.isHidden&&(e=r.getAnchor([{}],e),r.updatePosition({plotX:e[0],plotY:e[1]}))},reset:function(e){var t=this.chart,n=t.hoverSeries,r=t.hoverPoint,i=t.tooltip,t=i&&i.shared?t.hoverPoints:r;(e=e&&i&&t)&&h(t)[0].plotX===W&&(e=!1);if(e)i.refresh(t);else{if(r)r.onMouseOut();if(n)n.onMouseOut();i&&(i.hide(),i.hideCrosshairs());this.hoverX=null}},scaleGroups:function(e,t){var n=this.chart,r;rn(n.series,function(i){r=e||i.getPlotBox();i.xAxis&&i.xAxis.zoomEnabled&&(i.group.attr(r),i.markerGroup&&(i.markerGroup.attr(r),i.markerGroup.clip(t?n.clipRect:null)),i.dataLabelsGroup&&i.dataLabelsGroup.attr(r))});n.clipRect.attr(t||n.clipBox)},pinchTranslateDirection:function(e,t,n,r,i,s,o){var u=this.chart,a=e?"x":"y",f=e?"X":"Y",l="chart"+f,c=e?"width":"height",h=u["plot"+(e?"Left":"Top")],p,d,v=1,m=u.inverted,g=u.bounds[e?"h":"v"],y=t.length===1,b=t[0][l],w=n[0][l],E=!y&&t[1][l],S=!y&&n[1][l],x,n=function(){!y&&Z(b-E)>20&&(v=Z(w-S)/Z(b-E));d=(h-w)/v+b;p=u["plot"+(e?"Width":"Height")]/v};n();t=d;t<g.min?(t=g.min,x=!0):t+p>g.max&&(t=g.max-p,x=!0);x?(w-=.8*(w-o[a][0]),y||(S-=.8*(S-o[a][1])),n()):o[a]=[w,S];m||(s[a]=d-h,s[c]=p);s=m?1/v:v;i[c]=p;i[a]=t;r[m?e?"scaleY":"scaleX":"scale"+f]=v;r["translate"+f]=s*h+(w-s*b)},pinch:function(t){var n=this,r=n.chart,i=n.pinchDown,s=r.tooltip&&r.tooltip.options.followTouchMove,o=t.touches,u=o.length,a=n.lastValidTouch,f=n.zoomHor||n.pinchHor,l=n.zoomVert||n.pinchVert,c=f||l,h=n.selectionMarker,p={},d={};t.type==="touchstart"&&(s||c)&&t.preventDefault();un(o,function(e){return n.normalize(e)});if(t.type==="touchstart")rn(o,function(e,t){i[t]={chartX:e.chartX,chartY:e.chartY}}),a.x=[i[0].chartX,i[1]&&i[1].chartX],a.y=[i[0].chartY,i[1]&&i[1].chartY],rn(r.axes,function(e){if(e.zoomEnabled){var t=r.bounds[e.horiz?"h":"v"],n=e.minPixelPadding,i=e.toPixels(e.dataMin),s=e.toPixels(e.dataMax),o=Y(i,s),i=G(i,s);t.min=Y(e.pos,o-n);t.max=G(e.pos+e.len,i+n)}});else if(i.length){if(!h)n.selectionMarker=h=e({destroy:Nt},r.plotBox);f&&n.pinchTranslateDirection(!0,i,o,p,h,d,a);l&&n.pinchTranslateDirection(!1,i,o,p,h,d,a);n.hasPinched=c;n.scaleGroups(p,d);!c&&s&&u===1&&this.runPointActions(n.normalize(t))}},dragStart:function(e){var t=this.chart;t.mouseIsDown=e.type;t.cancelClick=!1;t.mouseDownX=this.mouseDownX=e.chartX;this.mouseDownY=e.chartY},drag:function(e){var t=this.chart,n=t.options.chart,r=e.chartX,e=e.chartY,i=this.zoomHor,s=this.zoomVert,o=t.plotLeft,u=t.plotTop,a=t.plotWidth,f=t.plotHeight,l,c=this.mouseDownX,h=this.mouseDownY;r<o?r=o:r>o+a&&(r=o+a);e<u?e=u:e>u+f&&(e=u+f);this.hasDragged=Math.sqrt(Math.pow(c-r,2)+Math.pow(h-e,2));if(this.hasDragged>10){l=t.isInsidePlot(c-o,h-u);if(t.hasCartesianSeries&&(this.zoomX||this.zoomY)&&l&&!this.selectionMarker)this.selectionMarker=t.renderer.rect(o,u,i?1:a,s?1:f,0).attr({fill:n.selectionMarkerFill||"rgba(69,114,167,0.25)",zIndex:7}).add();this.selectionMarker&&i&&(i=r-c,this.selectionMarker.attr({width:Z(i),x:(i>0?0:i)+c}));this.selectionMarker&&s&&(i=e-h,this.selectionMarker.attr({height:Z(i),y:(i>0?0:i)+h}));l&&!this.selectionMarker&&n.panning&&t.pan(r)}},drop:function(t){var n=this.chart,r=this.hasPinched;if(this.selectionMarker){var i={xAxis:[],yAxis:[],originalEvent:t.originalEvent||t},s=this.selectionMarker,o=s.x,u=s.y,a;if(this.hasDragged||r)rn(n.axes,function(e){if(e.zoomEnabled){var t=e.horiz,n=e.toValue(t?o:u),t=e.toValue(t?o+s.width:u+s.height);!isNaN(n)&&!isNaN(t)&&(i[e.xOrY+"Axis"].push({axis:e,min:Y(n,t),max:G(n,t)}),a=!0)}}),a&&ln(n,"selection",i,function(t){n.zoom(e(t,r?{animation:!1}:null))});this.selectionMarker=this.selectionMarker.destroy();r&&this.scaleGroups()}if(n)d(n.container,{cursor:n._cursor}),n.cancelClick=this.hasDragged>10,n.mouseIsDown=this.hasDragged=this.hasPinched=!1,this.pinchDown=[]},onContainerMouseDown:function(e){e=this.normalize(e);e.preventDefault&&e.preventDefault();this.dragStart(e)},onDocumentMouseUp:function(e){this.drop(e)},onDocumentMouseMove:function(e){var t=this.chart,n=this.chartPosition,r=t.hoverSeries,e=cn(e);n&&r&&r.isCartesian&&!t.isInsidePlot(e.pageX-n.left-t.plotLeft,e.pageY-n.top-t.plotTop)&&this.reset()},onContainerMouseLeave:function(){this.reset();this.chartPosition=null},onContainerMouseMove:function(e){var t=this.chart,e=this.normalize(e);e.returnValue=!1;t.mouseIsDown==="mousedown"&&this.drag(e);t.isInsidePlot(e.chartX-t.plotLeft,e.chartY-t.plotTop)&&!t.openMenu&&this.runPointActions(e)},inClass:function(e,t){for(var n;e;){if(n=c(e,"class"))if(n.indexOf(t)!==-1)return!0;else if(n.indexOf("highcharts-container")!==-1)return!1;e=e.parentNode}},onTrackerMouseOut:function(e){var t=this.chart.hoverSeries;if(t&&!t.options.stickyTracking&&!this.inClass(e.toElement||e.relatedTarget,"highcharts-tooltip"))t.onMouseOut()},onContainerClick:function(t){var n=this.chart,r=n.hoverPoint,i=n.plotLeft,s=n.plotTop,o=n.inverted,u,a,f,t=this.normalize(t);t.cancelBubble=!0;if(!n.cancelClick)r&&this.inClass(t.target,"highcharts-tracker")?(u=this.chartPosition,a=r.plotX,f=r.plotY,e(r,{pageX:u.left+i+(o?n.plotWidth-f:a),pageY:u.top+s+(o?n.plotHeight-a:f)}),ln(r.series,"click",e(t,{point:r})),n.hoverPoint&&r.firePointEvent("click",t)):(e(t,this.getCoordinates(t)),n.isInsidePlot(t.chartX-i,t.chartY-s)&&ln(n,"click",t))},onContainerTouchStart:function(e){var t=this.chart;e.touches.length===1?(e=this.normalize(e),t.isInsidePlot(e.chartX-t.plotLeft,e.chartY-t.plotTop)?(this.runPointActions(e),this.pinch(e)):this.reset()):e.touches.length===2&&this.pinch(e)},onContainerTouchMove:function(e){(e.touches.length===1||e.touches.length===2)&&this.pinch(e)},onDocumentTouchEnd:function(e){this.drop(e)},setDOMEvents:function(){var e=this,t=e.chart.container,n;this._events=n=[[t,"onmousedown","onContainerMouseDown"],[t,"onmousemove","onContainerMouseMove"],[t,"onclick","onContainerClick"],[t,"mouseleave","onContainerMouseLeave"],[X,"mousemove","onDocumentMouseMove"],[X,"mouseup","onDocumentMouseUp"]];mt&&n.push([t,"ontouchstart","onContainerTouchStart"],[t,"ontouchmove","onContainerTouchMove"],[X,"touchend","onDocumentTouchEnd"]);rn(n,function(t){e["_"+t[2]]=function(n){e[t[2]](n)};t[1].indexOf("on")===0?t[0][t[1]]=e["_"+t[2]]:an(t[0],t[1],e["_"+t[2]])})},destroy:function(){var e=this;rn(e._events,function(t){t[1].indexOf("on")===0?t[0][t[1]]=null:fn(t[0],t[1],e["_"+t[2]])});delete e._events;clearInterval(e.tooltipTimeout)}};U.prototype={init:function(e,r){var i=this,s=r.itemStyle,o=p(r.padding,8),u=r.itemMarginTop||0;this.options=r;if(r.enabled)i.baseline=n(s.fontSize)+3+u,i.itemStyle=s,i.itemHiddenStyle=t(s,r.itemHiddenStyle),i.itemMarginTop=u,i.padding=o,i.initialItemX=o,i.initialItemY=o-5,i.maxItemWidth=0,i.chart=e,i.itemHeight=0,i.lastLineHeight=0,i.render(),an(i.chart,"endResize",function(){i.positionCheckboxes()})},colorizeItem:function(e,t){var n=this.options,r=e.legendItem,i=e.legendLine,s=e.legendSymbol,o=this.itemHiddenStyle.color,n=t?n.itemStyle.color:o,u=t?e.color:o,o=e.options&&e.options.marker,a={stroke:u,fill:u},f;r&&r.css({fill:n,color:n});i&&i.attr({stroke:u});if(s){if(o&&s.isMarker)for(f in o=e.convertAttribs(o),o)r=o[f],r!==W&&(a[f]=r);s.attr(a)}},positionItem:function(e){var t=this.options,n=t.symbolPadding,t=!t.rtl,r=e._legendItemPos,i=r[0],r=r[1],s=e.checkbox;e.legendGroup&&e.legendGroup.translate(t?i:this.legendWidth-i-2*n-4,r);if(s)s.x=i,s.y=r},destroyItem:function(e){var t=e.checkbox;rn(["legendItem","legendLine","legendSymbol","legendGroup"],function(t){e[t]&&(e[t]=e[t].destroy())});t&&O(e.checkbox)},destroy:function(){var e=this.group,t=this.box;if(t)this.box=t.destroy();if(e)this.group=e.destroy()},positionCheckboxes:function(e){var t=this.group.alignAttr,n,r=this.clipHeight||this.legendHeight;if(t)n=t.translateY,rn(this.allItems,function(i){var s=i.checkbox,o;s&&(o=n+s.y+(e||0)+3,d(s,{left:t.translateX+i.legendItemWidth+s.x-20+"px",top:o+"px",display:o>n-6&&o<n+r-6?"":Lt}))})},renderTitle:function(){var e=this.padding,t=this.options.title,n=0;if(t.text){if(!this.title)this.title=this.chart.renderer.label(t.text,e-3,e-4,null,null,null,null,null,"legend-title").attr({zIndex:1}).css(t.style).add(this.group);e=this.title.getBBox();n=e.height;this.offsetWidth=e.width;this.contentGroup.attr({translateY:n})}this.titleHeight=n},renderItem:function(e){var n;var r=this,i=r.chart,s=i.renderer,o=r.options,u=o.layout==="horizontal",a=o.symbolWidth,f=o.symbolPadding,l=r.itemStyle,c=r.itemHiddenStyle,h=r.padding,d=u?p(o.itemDistance,8):0,m=!o.rtl,g=o.width,y=o.itemMarginBottom||0,b=r.itemMarginTop,E=r.initialItemX,S=e.legendItem,x=e.series||e,T=x.options,N=T.showCheckbox,C=o.useHTML;if(!S&&(e.legendGroup=s.g("legend-item").attr({zIndex:1}).add(r.scrollGroup),x.drawLegendSymbol(r,e),e.legendItem=S=s.text(o.labelFormat?w(o.labelFormat,e):o.labelFormatter.call(e),m?a+f:-f,r.baseline,C).css(t(e.visible?l:c)).attr({align:m?"left":"right",zIndex:2}).add(e.legendGroup),(C?S:e.legendGroup).on("mouseover",function(){e.setState("hover");S.css(r.options.itemHoverStyle)}).on("mouseout",function(){S.css(e.visible?l:c);e.setState()}).on("click",function(t){var n=function(){e.setVisible()},t={browserEvent:t};e.firePointEvent?e.firePointEvent("legendItemClick",t,n):ln(e,"legendItemClick",t,n)}),r.colorizeItem(e,e.visible),T&&N))e.checkbox=v("input",{type:"checkbox",checked:e.selected,defaultChecked:e.selected},o.itemCheckboxStyle,i.container),an(e.checkbox,"click",function(t){ln(e,"checkboxClick",{checked:t.target.checked},function(){e.select()})});s=S.getBBox();n=e.legendItemWidth=o.itemWidth||a+f+s.width+d+(N?20:0),o=n;r.itemHeight=a=s.height;if(u&&r.itemX-E+o>(g||i.chartWidth-2*h-E))r.itemX=E,r.itemY+=b+r.lastLineHeight+y,r.lastLineHeight=0;r.maxItemWidth=G(r.maxItemWidth,o);r.lastItemY=b+r.itemY+y;r.lastLineHeight=G(a,r.lastLineHeight);e._legendItemPos=[r.itemX,r.itemY];u?r.itemX+=o:(r.itemY+=b+a+y,r.lastLineHeight=a);r.offsetWidth=g||G((u?r.itemX-E-d:o)+h,r.offsetWidth)},render:function(){var t=this,n=t.chart,r=n.renderer,i=t.group,s,o,u,a,f=t.box,c=t.options,h=t.padding,p=c.borderWidth,d=c.backgroundColor;t.itemX=t.initialItemX;t.itemY=t.initialItemY;t.offsetWidth=0;t.lastItemY=0;if(!i)t.group=i=r.g("legend").attr({zIndex:7}).add(),t.contentGroup=r.g().attr({zIndex:1}).add(i),t.scrollGroup=r.g().add(t.contentGroup);t.renderTitle();s=[];rn(n.series,function(e){var t=e.options;t.showInLegend&&!l(t.linkedTo)&&(s=s.concat(e.legendItems||(t.legendType==="point"?e.data:e)))});C(s,function(e,t){return(e.options&&e.options.legendIndex||0)-(t.options&&t.options.legendIndex||0)});c.reversed&&s.reverse();t.allItems=s;t.display=o=!!s.length;rn(s,function(e){t.renderItem(e)});u=c.width||t.offsetWidth;a=t.lastItemY+t.lastLineHeight+t.titleHeight;a=t.handleOverflow(a);if(p||d){u+=h;a+=h;if(f){if(u>0&&a>0)f[f.isNew?"attr":"animate"](f.crisp(null,null,null,u,a)),f.isNew=!1}else t.box=f=r.rect(0,0,u,a,c.borderRadius,p||0).attr({stroke:c.borderColor,"stroke-width":p||0,fill:d||Lt}).add(i).shadow(c.shadow),f.isNew=!0;f[o?"show":"hide"]()}t.legendWidth=u;t.legendHeight=a;rn(s,function(e){t.positionItem(e)});o&&i.align(e({width:u,height:a},c),!0,"spacingBox");n.isResizing||this.positionCheckboxes()},handleOverflow:function(e){var t=this,n=this.chart,r=n.renderer,i=this.options,s=i.y,s=n.spacingBox.height+(i.verticalAlign==="top"?-s:s)-this.padding,o=i.maxHeight,u=this.clipRect,a=i.navigation,f=p(a.animation,!0),l=a.arrowSize||12,c=this.nav;i.layout==="horizontal"&&(s/=2);o&&(s=Y(s,o));if(e>s&&!i.useHTML){this.clipHeight=n=s-20-this.titleHeight;this.pageCount=Q(e/n);this.currentPage=p(this.currentPage,1);this.fullHeight=e;if(!u)u=t.clipRect=r.clipRect(0,0,9999,0),t.contentGroup.clip(u);u.attr({height:n});if(!c)this.nav=c=r.g().attr({zIndex:1}).add(this.group),this.up=r.symbol("triangle",0,0,l,l).on("click",function(){t.scroll(-1,f)}).add(c),this.pager=r.text("",15,10).css(a.style).add(c),this.down=r.symbol("triangle-down",0,0,l,l).on("click",function(){t.scroll(1,f)}).add(c);t.scroll(0);e=s}else if(c)u.attr({height:n.chartHeight}),c.hide(),this.scrollGroup.attr({translateY:1}),this.clipHeight=0;return e},scroll:function(e,t){var n=this.pageCount,r=this.currentPage+e,i=this.clipHeight,s=this.options.navigation,o=s.activeColor,u=s.inactiveColor,s=this.pager,a=this.padding;r>n&&(r=n);if(r>0)t!==W&&D(t,this.chart),this.nav.attr({translateX:a,translateY:i+7+this.titleHeight,visibility:"visible"}),this.up.attr({fill:r===1?u:o}).css({cursor:r===1?"default":"pointer"}),s.attr({text:r+"/"+this.pageCount}),this.down.attr({x:18+this.pager.getBBox().width,fill:r===n?u:o}).css({cursor:r===n?"default":"pointer"}),i=-Y(i*(r-1),this.fullHeight-i+a)+1,this.scrollGroup.animate({translateY:i}),s.attr({text:r+"/"+n}),this.currentPage=r,this.positionCheckboxes(i)}};z.prototype={init:function(e,n){var r,s=e.series;e.series=null;r=t(wt,e);r.series=e.series=s;var s=r.chart,o=s.margin,o=i(o)?o:[o,o,o,o];this.optionsMarginTop=p(s.marginTop,o[0]);this.optionsMarginRight=p(s.marginRight,o[1]);this.optionsMarginBottom=p(s.marginBottom,o[2]);this.optionsMarginLeft=p(s.marginLeft,o[3]);o=s.events;this.bounds={h:{},v:{}};this.callback=n;this.isResizing=0;this.options=r;this.axes=[];this.series=[];this.hasCartesianSeries=s.showAxes;var u=this,a;u.index=Ct.length;Ct.push(u);s.reflow!==!1&&an(u,"load",function(){u.initReflow()});if(o)for(a in o)an(u,a,o[a]);u.xAxis=[];u.yAxis=[];u.animation=dt?!1:p(s.animation,!0);u.pointCount=0;u.counters=new N;u.firstRender()},initSeries:function(e){var t=this.options.chart;(t=Gt[e.type||t.type||t.defaultSeriesType])||M(17,!0);t=new t;t.init(this,e);return t},addSeries:function(e,t,n){var r,i=this;e&&(t=p(t,!0),ln(i,"addSeries",{options:e},function(){r=i.initSeries(e);i.isDirtyLegend=!0;t&&i.redraw(n)}));return r},addAxis:function(e,n,r,i){var s=n?"xAxis":"yAxis",o=this.options;new I(this,t(e,{index:this[s].length,isX:n}));o[s]=h(o[s]||{});o[s].push(e);p(r,!0)&&this.redraw(i)},isInsidePlot:function(e,t,n){var r=n?t:e,e=n?e:t;return r>=0&&r<=this.plotWidth&&e>=0&&e<=this.plotHeight},adjustTickAmounts:function(){this.options.chart.alignTicks!==!1&&rn(this.axes,function(e){e.adjustTickAmount()});this.maxTicks=null},redraw:function(e){var t=this.axes,n=this.series,r=this.pointer,i=this.legend,s=this.isDirtyLegend,o,u,a=this.isDirtyBox,f=n.length,l=f,c=this.renderer,h=c.isHidden(),p=[];D(e,this);h&&this.cloneRenderTo();for(this.layOutTitles();l--;)if(e=n[l],e.options.stacking&&(o=!0,e.isDirty)){u=!0;break}if(u)for(l=f;l--;)if(e=n[l],e.options.stacking)e.isDirty=!0;rn(n,function(e){e.isDirty&&e.options.legendType==="point"&&(s=!0)});if(s&&i.options.enabled)i.render(),this.isDirtyLegend=!1;o&&this.getStacks();if(this.hasCartesianSeries){if(!this.isResizing)this.maxTicks=null,rn(t,function(e){e.setScale()});this.adjustTickAmounts();this.getMargins();rn(t,function(e){if(e.isDirtyExtremes)e.isDirtyExtremes=!1,p.push(function(){ln(e,"afterSetExtremes",e.getExtremes())});if(e.isDirty||a||o)e.redraw(),a=!0})}a&&this.drawChartBox();rn(n,function(e){e.isDirty&&e.visible&&(!e.isCartesian||e.xAxis)&&e.redraw()});r&&r.reset&&r.reset(!0);c.draw();ln(this,"redraw");h&&this.cloneRenderTo(!0);rn(p,function(e){e.call()})},showLoading:function(t){var n=this.options,r=this.loadingDiv,i=n.loading;if(!r)this.loadingDiv=r=v(kt,{className:"highcharts-loading"},e(i.style,{zIndex:10,display:Lt}),this.container),this.loadingSpan=v("span",null,i.labelStyle,r);this.loadingSpan.innerHTML=t||n.lang.loading;if(!this.loadingShown)d(r,{opacity:0,display:"",left:this.plotLeft+"px",top:this.plotTop+"px",width:this.plotWidth+"px",height:this.plotHeight+"px"}),hn(r,{opacity:i.style.opacity},{duration:i.showDuration||0}),this.loadingShown=!0},hideLoading:function(){var e=this.options,t=this.loadingDiv;t&&hn(t,{opacity:0},{duration:e.loading.hideDuration||100,complete:function(){d(t,{display:Lt})}});this.loadingShown=!1},get:function(e){var t=this.axes,n=this.series,r,i;for(r=0;r<t.length;r++)if(t[r].options.id===e)return t[r];for(r=0;r<n.length;r++)if(n[r].options.id===e)return n[r];for(r=0;r<n.length;r++){i=n[r].points||[];for(t=0;t<i.length;t++)if(i[t].id===e)return i[t]}return null},getAxes:function(){var e=this,t=this.options,n=t.xAxis=h(t.xAxis||{}),t=t.yAxis=h(t.yAxis||{});rn(n,function(e,t){e.index=t;e.isX=!0});rn(t,function(e,t){e.index=t});n=n.concat(t);rn(n,function(t){new I(e,t)});e.adjustTickAmounts()},getSelectedPoints:function(){var e=[];rn(this.series,function(t){e=e.concat(sn(t.points||[],function(e){return e.selected}))});return e},getSelectedSeries:function(){return sn(this.series,function(e){return e.selected})},getStacks:function(){var e=this;rn(e.yAxis,function(e){if(e.stacks&&e.hasVisibleSeries)e.oldStacks=e.stacks});rn(e.series,function(t){if(t.options.stacking&&(t.visible===!0||e.options.chart.ignoreHiddenSeries===!1))t.stackKey=t.type+p(t.options.stack,"")})},showResetZoom:function(){var e=this,t=wt.lang,n=e.options.chart.resetZoomButton,r=n.theme,i=r.states,s=n.relativeTo==="chart"?null:"plotBox";this.resetZoomButton=e.renderer.button(t.resetZoom,null,null,function(){e.zoomOut()},r,i&&i.hover).attr({align:n.position.align,title:t.resetZoomTitle}).add().align(n.position,!1,s)},zoomOut:function(){var e=this;ln(e,"selection",{resetSelection:!0},function(){e.zoom()})},zoom:function(e){var t,n=this.pointer,r=!1,s;!e||e.resetSelection?rn(this.axes,function(e){t=e.zoom()}):rn(e.xAxis.concat(e.yAxis),function(e){var i=e.axis,s=i.isXAxis;if(n[s?"zoomX":"zoomY"]||n[s?"pinchX":"pinchY"])t=i.zoom(e.min,e.max),i.displayBtn&&(r=!0)});s=this.resetZoomButton;if(r&&!s)this.showResetZoom();else if(!r&&i(s))this.resetZoomButton=s.destroy();t&&this.redraw(p(this.options.chart.animation,e&&e.animation,this.pointCount<100))},pan:function(e){var t=this.xAxis[0],n=this.mouseDownX,r=t.pointRange/2,i=t.getExtremes(),s=t.translate(n-e,!0)+r,n=t.translate(n+this.plotWidth-e,!0)-r;(r=this.hoverPoints)&&rn(r,function(e){e.setState()});t.series.length&&s>Y(i.dataMin,i.min)&&n<G(i.dataMax,i.max)&&t.setExtremes(s,n,!0,!1,{trigger:"pan"});this.mouseDownX=e;d(this.container,{cursor:"move"})},setTitle:function(e,n){var r;var i=this,s=i.options,o;o=s.title=t(s.title,e);r=s.subtitle=t(s.subtitle,n),s=r;rn([["title",e,o],["subtitle",n,s]],function(e){var t=e[0],n=i[t],r=e[1],e=e[2];n&&r&&(i[t]=n=n.destroy());e&&e.text&&!n&&(i[t]=i.renderer.text(e.text,0,0,e.useHTML).attr({align:e.align,"class":"highcharts-"+t,zIndex:e.zIndex||4}).css(e.style).add())});i.layOutTitles()},layOutTitles:function(){var t=0,n=this.title,r=this.subtitle,i=this.options,s=i.title,i=i.subtitle,o=this.spacingBox.width-44;if(n&&(n.css({width:(s.width||o)+"px"}).align(e({y:15},s),!1,"spacingBox"),!s.floating&&!s.verticalAlign))t=n.getBBox().height,t>=18&&t<=25&&(t=15);r&&(r.css({width:(i.width||o)+"px"}).align(e({y:t+s.margin},i),!1,"spacingBox"),!i.floating&&!i.verticalAlign&&(t=Q(t+r.getBBox().height)));this.titleOffset=t},getChartSize:function(){var e=this.options.chart,t=this.renderToClone||this.renderTo;this.containerWidth=en(t,"width");this.containerHeight=en(t,"height");this.chartWidth=G(0,e.width||this.containerWidth||600);this.chartHeight=G(0,p(e.height,this.containerHeight>19?this.containerHeight:400))},cloneRenderTo:function(e){var t=this.renderToClone,n=this.container;e?t&&(this.renderTo.appendChild(n),O(t),delete this.renderToClone):(n&&n.parentNode===this.renderTo&&this.renderTo.removeChild(n),this.renderToClone=t=this.renderTo.cloneNode(0),d(t,{position:"absolute",top:"-9999px",display:"block"}),X.body.appendChild(t),n&&t.appendChild(n))},getContainer:function(){var t,i=this.options.chart,s,o,u;this.renderTo=t=i.renderTo;u="highcharts-"+yt++;if(r(t))this.renderTo=t=X.getElementById(t);t||M(13,!0);s=n(c(t,"data-highcharts-chart"));!isNaN(s)&&Ct[s]&&Ct[s].destroy();c(t,"data-highcharts-chart",this.index);t.innerHTML="";t.offsetWidth||this.cloneRenderTo();this.getChartSize();s=this.chartWidth;o=this.chartHeight;this.container=t=v(kt,{className:"highcharts-container"+(i.className?" "+i.className:""),id:u},e({position:"relative",overflow:"hidden",width:s+"px",height:o+"px",textAlign:"left",lineHeight:"normal",zIndex:0,"-webkit-tap-highlight-color":"rgba(0,0,0,0)"},i.style),this.renderToClone||t);this._cursor=t.style.cursor;this.renderer=i.forExport?new mn(t,s,o,!0):new vt(t,s,o);dt&&this.renderer.create(this,t,s,o)},getMargins:function(){var e=this.options.chart,t=e.spacingTop,n=e.spacingRight,r=e.spacingBottom,e=e.spacingLeft,i,s=this.legend,o=this.optionsMarginTop,u=this.optionsMarginLeft,a=this.optionsMarginRight,f=this.optionsMarginBottom,c=this.options.legend,h=p(c.margin,10),d=c.x,v=c.y,m=c.align,g=c.verticalAlign,y=this.titleOffset;this.resetMargins();i=this.axisOffset;if(y&&!l(o))this.plotTop=G(this.plotTop,y+this.options.title.margin+t);if(s.display&&!c.floating)if(m==="right"){if(!l(a))this.marginRight=G(this.marginRight,s.legendWidth-d+h+n)}else if(m==="left"){if(!l(u))this.plotLeft=G(this.plotLeft,s.legendWidth+d+h+e)}else if(g==="top"){if(!l(o))this.plotTop=G(this.plotTop,s.legendHeight+v+h+t)}else if(g==="bottom"&&!l(f))this.marginBottom=G(this.marginBottom,s.legendHeight-v+h+r);this.extraBottomMargin&&(this.marginBottom+=this.extraBottomMargin);this.extraTopMargin&&(this.plotTop+=this.extraTopMargin);this.hasCartesianSeries&&rn(this.axes,function(e){e.getOffset()});l(u)||(this.plotLeft+=i[3]);l(o)||(this.plotTop+=i[0]);l(f)||(this.marginBottom+=i[2]);l(a)||(this.marginRight+=i[1]);this.setChartSize()},initReflow:function(){function e(e){var s=n.width||en(r,"width"),o=n.height||en(r,"height"),e=e?e.target:V;if(!t.hasUserSize&&s&&o&&(e===V||e===X)){if(s!==t.containerWidth||o!==t.containerHeight)clearTimeout(i),t.reflowTimeout=i=setTimeout(function(){if(t.container)t.setSize(s,o,!1),t.hasUserSize=null},100);t.containerWidth=s;t.containerHeight=o}}var t=this,n=t.options.chart,r=t.renderTo,i;an(V,"resize",e);an(t,"destroy",function(){fn(V,"resize",e)})},setSize:function(e,t,n){var r=this,i,s,o;r.isResizing+=1;o=function(){r&&ln(r,"endResize",null,function(){r.isResizing-=1})};D(n,r);r.oldChartHeight=r.chartHeight;r.oldChartWidth=r.chartWidth;if(l(e))r.chartWidth=i=G(0,J(e)),r.hasUserSize=!!i;if(l(t))r.chartHeight=s=G(0,J(t));d(r.container,{width:i+"px",height:s+"px"});r.setChartSize(!0);r.renderer.setSize(i,s,n);r.maxTicks=null;rn(r.axes,function(e){e.isDirty=!0;e.setScale()});rn(r.series,function(e){e.isDirty=!0});r.isDirtyLegend=!0;r.isDirtyBox=!0;r.getMargins();r.redraw(n);r.oldChartHeight=null;ln(r,"resize");St===!1?o():setTimeout(o,St&&St.duration||500)},setChartSize:function(e){var t=this.inverted,n=this.renderer,r=this.chartWidth,i=this.chartHeight,s=this.options.chart,o=s.spacingTop,u=s.spacingRight,a=s.spacingBottom,f=s.spacingLeft,l=this.clipOffset,c,h,p,d;this.plotLeft=c=J(this.plotLeft);this.plotTop=h=J(this.plotTop);this.plotWidth=p=G(0,J(r-c-this.marginRight));this.plotHeight=d=G(0,J(i-h-this.marginBottom));this.plotSizeX=t?d:p;this.plotSizeY=t?p:d;this.plotBorderWidth=t=s.plotBorderWidth||0;this.spacingBox=n.spacingBox={x:f,y:o,width:r-f-u,height:i-o-a};this.plotBox=n.plotBox={x:c,y:h,width:p,height:d};n=Q(G(t,l[3])/2);r=Q(G(t,l[0])/2);this.clipBox={x:n,y:r,width:K(this.plotSizeX-G(t,l[1])/2-n),height:K(this.plotSizeY-G(t,l[2])/2-r)};e||rn(this.axes,function(e){e.setAxisSize();e.setAxisTranslation()})},resetMargins:function(){var e=this.options.chart,t=e.spacingRight,n=e.spacingBottom,r=e.spacingLeft;this.plotTop=p(this.optionsMarginTop,e.spacingTop);this.marginRight=p(this.optionsMarginRight,t);this.marginBottom=p(this.optionsMarginBottom,n);this.plotLeft=p(this.optionsMarginLeft,r);this.axisOffset=[0,0,0,0];
-		this.clipOffset=[0,0,0,0]},drawChartBox:function(){var e=this.options.chart,t=this.renderer,n=this.chartWidth,r=this.chartHeight,i=this.chartBackground,s=this.plotBackground,o=this.plotBorder,u=this.plotBGImage,a=e.borderWidth||0,f=e.backgroundColor,l=e.plotBackgroundColor,c=e.plotBackgroundImage,h=e.plotBorderWidth||0,p,d=this.plotLeft,v=this.plotTop,m=this.plotWidth,g=this.plotHeight,y=this.plotBox,b=this.clipRect,w=this.clipBox;p=a+(e.shadow?8:0);if(a||f)if(i)i.animate(i.crisp(null,null,null,n-p,r-p));else{i={fill:f||Lt};if(a)i.stroke=e.borderColor,i["stroke-width"]=a;this.chartBackground=t.rect(p/2,p/2,n-p,r-p,e.borderRadius,a).attr(i).add().shadow(e.shadow)}if(l)s?s.animate(y):this.plotBackground=t.rect(d,v,m,g,0).attr({fill:l}).add().shadow(e.plotShadow);if(c)u?u.animate(y):this.plotBGImage=t.image(c,d,v,m,g).add();b?b.animate({width:w.width,height:w.height}):this.clipRect=t.clipRect(w);if(h)o?o.animate(o.crisp(null,d,v,m,g)):this.plotBorder=t.rect(d,v,m,g,0,h).attr({stroke:e.plotBorderColor,"stroke-width":h,zIndex:1}).add();this.isDirtyBox=!1},propFromSeries:function(){var e=this,t=e.options.chart,n,r=e.options.series,i,s;rn(["inverted","angular","polar"],function(o){n=Gt[t.type||t.defaultSeriesType];s=e[o]||t[o]||n&&n.prototype[o];for(i=r&&r.length;!s&&i--;)(n=Gt[r[i].type])&&n.prototype[o]&&(s=!0);e[o]=s})},render:function(){var t=this,r=t.axes,i=t.renderer,s=t.options,o=s.labels,u=s.credits,a;t.setTitle();t.legend=new U(t,s.legend);t.getStacks();rn(r,function(e){e.setScale()});t.getMargins();t.maxTicks=null;rn(r,function(e){e.setTickPositions(!0);e.setMaxTicks()});t.adjustTickAmounts();t.getMargins();t.drawChartBox();t.hasCartesianSeries&&rn(r,function(e){e.render()});if(!t.seriesGroup)t.seriesGroup=i.g("series-group").attr({zIndex:3}).add();rn(t.series,function(e){e.translate();e.setTooltipPoints();e.render()});o.items&&rn(o.items,function(r){var s=e(o.style,r.style),u=n(s.left)+t.plotLeft,a=n(s.top)+t.plotTop+12;delete s.left;delete s.top;i.text(r.html,u,a).attr({zIndex:2}).css(s).add()});if(u.enabled&&!t.credits)a=u.href,t.credits=i.text(u.text,0,0).on("click",function(){if(a)location.href=a}).attr({align:u.position.align,zIndex:8}).css(u.style).add().align(u.position);t.hasRendered=!0},destroy:function(){var e=this,t=e.axes,n=e.series,r=e.container,i,s=r&&r.parentNode;ln(e,"destroy");Ct[e.index]=W;e.renderTo.removeAttribute("data-highcharts-chart");fn(e);for(i=t.length;i--;)t[i]=t[i].destroy();for(i=n.length;i--;)n[i]=n[i].destroy();rn("title,subtitle,chartBackground,plotBackground,plotBGImage,plotBorder,seriesGroup,clipRect,credits,pointer,scroller,rangeSelector,legend,resetZoomButton,tooltip,renderer".split(","),function(t){var n=e[t];n&&n.destroy&&(e[t]=n.destroy())});if(r)r.innerHTML="",fn(r),s&&O(r);for(i in e)delete e[i]},isReadyToRender:function(){var e=this;return!ht&&V==V.top&&X.readyState!=="complete"||dt&&!V.canvg?(dt?bn.push(function(){e.firstRender()},e.options.global.canvasToolsURL):X.attachEvent("onreadystatechange",function(){X.detachEvent("onreadystatechange",e.firstRender);X.readyState==="complete"&&e.firstRender()}),!1):!0},firstRender:function(){var e=this,t=e.options,n=e.callback;if(e.isReadyToRender())e.getContainer(),ln(e,"init"),e.resetMargins(),e.setChartSize(),e.propFromSeries(),e.getAxes(),rn(t.series||[],function(t){e.initSeries(t)}),ln(e,"beforeRender"),e.pointer=new R(e,t),e.render(),e.renderer.draw(),n&&n.apply(e,[e]),rn(e.callbacks,function(t){t.apply(e,[e])}),e.cloneRenderTo(!0),ln(e,"load")}};z.prototype.callbacks=[];var wn=function(){};wn.prototype={init:function(e,t,n){this.series=e;this.applyOptions(t,n);this.pointAttr={};if(e.options.colorByPoint&&(t=e.options.colors||e.chart.options.colors,this.color=this.color||t[e.colorCounter++],e.colorCounter===t.length))e.colorCounter=0;e.chart.pointCount++;return this},applyOptions:function(t,n){var r=this.series,i=r.pointValKey,t=wn.prototype.optionsToObject.call(this,t);e(this,t);this.options=this.options?e(this.options,t):t;if(i)this.y=this[i];if(this.x===W&&r)this.x=n===W?r.autoIncrement():n;return this},optionsToObject:function(e){var t,n=this.series,r=n.pointArrayMap||["y"],i=r.length,o=0,u=0;if(typeof e==="number"||e===null)t={y:e};else if(s(e)){t={};if(e.length>i){n=typeof e[0];if(n==="string")t.name=e[0];else if(n==="number")t.x=e[0];o++}for(;u<i;)t[r[u++]]=e[o++]}else if(typeof e==="object"){t=e;if(e.dataLabels)n._hasPointLabels=!0;if(e.marker)n._hasPointMarkers=!0}return t},destroy:function(){var e=this.series.chart,t=e.hoverPoints,n;e.pointCount--;if(t&&(this.setState(),f(t,this),!t.length))e.hoverPoints=null;if(this===e.hoverPoint)this.onMouseOut();if(this.graphic||this.dataLabel)fn(this),this.destroyElements();this.legendItem&&e.legend.destroyItem(this);for(n in this)this[n]=null},destroyElements:function(){for(var e="graphic,dataLabel,dataLabelUpper,group,connector,shadowGroup".split(","),t,n=6;n--;)t=e[n],this[t]&&(this[t]=this[t].destroy())},getLabelConfig:function(){return{x:this.category,y:this.y,key:this.name||this.category,series:this.series,point:this,percentage:this.percentage,total:this.total||this.stackTotal}},select:function(e,t){var n=this,r=n.series,i=r.chart,e=p(e,!n.selected);n.firePointEvent(e?"select":"unselect",{accumulate:t},function(){n.selected=n.options.selected=e;r.options.data[nn(n,r.data)]=n.options;n.setState(e&&"select");t||rn(i.getSelectedPoints(),function(e){if(e.selected&&e!==n)e.selected=e.options.selected=!1,r.options.data[nn(e,r.data)]=e.options,e.setState(""),e.firePointEvent("unselect")})})},onMouseOver:function(e){var t=this.series,n=t.chart,r=n.tooltip,i=n.hoverPoint;if(i&&i!==this)i.onMouseOut();this.firePointEvent("mouseOver");r&&(!r.shared||t.noSharedTooltip)&&r.refresh(this,e);this.setState("hover");n.hoverPoint=this},onMouseOut:function(){var e=this.series.chart,t=e.hoverPoints;if(!t||nn(this,t)===-1)this.firePointEvent("mouseOut"),this.setState(),e.hoverPoint=null},tooltipFormatter:function(e){var t=this.series,n=t.tooltipOptions,r=p(n.valueDecimals,""),i=n.valuePrefix||"",s=n.valueSuffix||"";rn(t.pointArrayMap||["y"],function(t){t="{point."+t;if(i||s)e=e.replace(t+"}",i+t+"}"+s);e=e.replace(t+"}",t+":,."+r+"f}")});return w(e,{point:this,series:this.series})},update:function(e,t,n){var r=this,s=r.series,o=r.graphic,u,a=s.data,f=s.chart,l=s.options,t=p(t,!0);r.firePointEvent("update",{options:e},function(){r.applyOptions(e);i(e)&&(s.getAttribs(),o&&o.attr(r.pointAttr[s.state]));u=nn(r,a);s.xData[u]=r.x;s.yData[u]=s.toYData?s.toYData(r):r.y;s.zData[u]=r.z;l.data[u]=r.options;s.isDirty=s.isDirtyData=f.isDirtyBox=!0;l.legendType==="point"&&f.legend.destroyItem(r);t&&f.redraw(n)})},remove:function(e,t){var n=this,r=n.series,i=r.chart,s,o=r.data;D(t,i);e=p(e,!0);n.firePointEvent("remove",null,function(){s=nn(n,o);o.splice(s,1);r.options.data.splice(s,1);r.xData.splice(s,1);r.yData.splice(s,1);r.zData.splice(s,1);n.destroy();r.isDirty=!0;r.isDirtyData=!0;e&&i.redraw()})},firePointEvent:function(e,t,n){var r=this,i=this.series.options;(i.point.events[e]||r.options&&r.options.events&&r.options.events[e])&&this.importEvents();e==="click"&&i.allowPointSelect&&(n=function(e){r.select(null,e.ctrlKey||e.metaKey||e.shiftKey)});ln(this,e,t,n)},importEvents:function(){if(!this.hasImportedEvents){var e=t(this.series.options.point,this.options).events,n;this.events=e;for(n in e)an(this,n,e[n]);this.hasImportedEvents=!0}},setState:function(e){var n=this.plotX,r=this.plotY,i=this.series,s=i.options.states,o=dn[i.type].marker&&i.options.marker,u=o&&!o.enabled,a=o&&o.states[e],f=a&&a.enabled===!1,l=i.stateMarkerGraphic,c=this.marker||{},h=i.chart,p=this.pointAttr,e=e||"";if(!(e===this.state||this.selected&&e!=="select"||s[e]&&s[e].enabled===!1||e&&(f||u&&!a.enabled))){if(this.graphic)s=o&&this.graphic.symbolName&&p[e].r,this.graphic.attr(t(p[e],s?{x:n-s,y:r-s,width:2*s,height:2*s}:{}));else{if(e&&a)s=a.radius,c=c.symbol||i.symbol,l&&l.currentSymbol!==c&&(l=l.destroy()),l?l.attr({x:n-s,y:r-s}):(i.stateMarkerGraphic=l=h.renderer.symbol(c,n-s,r-s,2*s,2*s).attr(p[e]).add(i.markerGroup),l.currentSymbol=c);if(l)l[e&&h.isInsidePlot(n,r)?"show":"hide"]()}this.state=e}}};var En=function(){};En.prototype={isCartesian:!0,type:"line",pointClass:wn,sorted:!0,requireSorting:!0,pointAttrToOptions:{stroke:"lineColor","stroke-width":"lineWidth",fill:"fillColor",r:"radius"},colorCounter:0,init:function(t,n){var i,s,o=t.series;this.chart=t;this.options=n=this.setOptions(n);this.bindAxes();e(this,{name:n.name,state:"",pointAttr:{},visible:n.visible!==!1,selected:n.selected===!0});if(dt)n.animation=!1;s=n.events;for(i in s)an(this,i,s[i]);if(s&&s.click||n.point&&n.point.events&&n.point.events.click||n.allowPointSelect)t.runTrackerClick=!0;this.getColor();this.getSymbol();this.setData(n.data,!1);if(this.isCartesian)t.hasCartesianSeries=!0;o.push(this);this._i=o.length-1;C(o,function(e,t){return p(e.options.index,e._i)-p(t.options.index,e._i)});rn(o,function(e,t){e.index=t;e.name=e.name||"Series "+(t+1)});i=n.linkedTo;this.linkedSeries=[];if(r(i)&&(i=i===":previous"?o[this.index-1]:t.get(i)))i.linkedSeries.push(this),this.linkedParent=i},bindAxes:function(){var e=this,t=e.options,n=e.chart,r;e.isCartesian&&rn(["xAxis","yAxis"],function(i){rn(n[i],function(n){r=n.options;if(t[i]===r.index||t[i]!==W&&t[i]===r.id||t[i]===W&&r.index===0)n.series.push(e),e[i]=n,n.isDirty=!0});e[i]||M(18,!0)})},autoIncrement:function(){var e=this.options,t=this.xIncrement,t=p(t,e.pointStart,0);this.pointInterval=p(this.pointInterval,e.pointInterval,1);this.xIncrement=t+this.pointInterval;return t},getSegments:function(){var e=-1,t=[],n,r=this.points,i=r.length;if(i)if(this.options.connectNulls){for(n=i;n--;)r[n].y===null&&r.splice(n,1);r.length&&(t=[r])}else rn(r,function(n,s){n.y===null?(s>e+1&&t.push(r.slice(e+1,s)),e=s):s===i-1&&t.push(r.slice(e+1,s+1))});this.segments=t},setOptions:function(e){var n=this.chart.options,r=n.plotOptions,i=r[this.type];this.userOptions=e;e=t(i,r.series,e);this.tooltipOptions=t(n.tooltip,e.tooltip);i.marker===null&&delete e.marker;return e},getColor:function(){var e=this.options,t=this.userOptions,n=this.chart.options.colors,r=this.chart.counters,i;i=e.color||dn[this.type].color;if(!i&&!e.colorByPoint)l(t._colorIndex)?e=t._colorIndex:(t._colorIndex=r.color,e=r.color++),i=n[e];this.color=i;r.wrapColor(n.length)},getSymbol:function(){var e=this.userOptions,t=this.options.marker,n=this.chart,r=n.options.symbols,n=n.counters;this.symbol=t.symbol;if(!this.symbol)l(e._symbolIndex)?e=e._symbolIndex:(e._symbolIndex=n.symbol,e=n.symbol++),this.symbol=r[e];if(/^url/.test(this.symbol))t.radius=0;n.wrapSymbol(r.length)},drawLegendSymbol:function(e){var t=this.options,n=t.marker,r=e.options,i;i=r.symbolWidth;var s=this.chart.renderer,o=this.legendGroup,e=e.baseline-J(s.fontMetrics(r.itemStyle.fontSize).b*.3);if(t.lineWidth){r={"stroke-width":t.lineWidth};if(t.dashStyle)r.dashstyle=t.dashStyle;this.legendLine=s.path(["M",0,e,"L",i,e]).attr(r).add(o)}if(n&&n.enabled)t=n.radius,this.legendSymbol=i=s.symbol(this.symbol,i/2-t,e-t,2*t,2*t).add(o),i.isMarker=!0},addPoint:function(e,t,n,r){var i=this.options,s=this.data,o=this.graph,u=this.area,a=this.chart,f=this.xData,l=this.yData,c=this.zData,h=this.names,d=o&&o.shift||0,v=i.data;D(r,a);n&&rn([o,u,this.graphNeg,this.areaNeg],function(e){if(e)e.shift=d+1});if(u)u.isArea=!0;t=p(t,!0);r={series:this};this.pointClass.prototype.applyOptions.apply(r,[e]);f.push(r.x);l.push(this.toYData?this.toYData(r):r.y);c.push(r.z);if(h)h[r.x]=r.name;v.push(e);i.legendType==="point"&&this.generatePoints();n&&(s[0]&&s[0].remove?s[0].remove(!1):(s.shift(),f.shift(),l.shift(),c.shift(),v.shift()));this.isDirtyData=this.isDirty=!0;t&&(this.getAttribs(),a.redraw())},setData:function(e,t){var n=this.points,i=this.options,u=this.chart,a=null,f=this.xAxis,l=f&&f.categories&&!f.categories.length?[]:null,c;this.xIncrement=null;this.pointRange=f&&f.categories?1:i.pointRange;this.colorCounter=0;var h=[],d=[],v=[],m=e?e.length:[];c=p(i.turboThreshold,1e3);var g=this.pointArrayMap,g=g&&g.length,y=!!this.toYData;if(c&&m>c){for(c=0;a===null&&c<m;)a=e[c],c++;if(o(a)){a=p(i.pointStart,0);i=p(i.pointInterval,1);for(c=0;c<m;c++)h[c]=a,d[c]=e[c],a+=i;this.xIncrement=a}else if(s(a))if(g)for(c=0;c<m;c++)i=e[c],h[c]=i[0],d[c]=i.slice(1,g+1);else for(c=0;c<m;c++)i=e[c],h[c]=i[0],d[c]=i[1]}else for(c=0;c<m;c++)if(e[c]!==W&&(i={series:this},this.pointClass.prototype.applyOptions.apply(i,[e[c]]),h[c]=i.x,d[c]=y?this.toYData(i):i.y,v[c]=i.z,l&&i.name))l[i.x]=i.name;r(d[0])&&M(14,!0);this.data=[];this.options.data=e;this.xData=h;this.yData=d;this.zData=v;this.names=l;for(c=n&&n.length||0;c--;)n[c]&&n[c].destroy&&n[c].destroy();if(f)f.minRange=f.userMinRange;this.isDirty=this.isDirtyData=u.isDirtyBox=!0;p(t,!0)&&u.redraw(!1)},remove:function(e,t){var n=this,r=n.chart,e=p(e,!0);if(!n.isRemoving)n.isRemoving=!0,ln(n,"remove",null,function(){n.destroy();r.isDirtyLegend=r.isDirtyBox=!0;e&&r.redraw(t)});n.isRemoving=!1},processData:function(e){var t=this.xData,n=this.yData,r=t.length,i;i=0;var s,o,u=this.xAxis,a=this.options,f=a.cropThreshold,l=this.isCartesian;if(l&&!this.isDirty&&!u.isDirty&&!this.yAxis.isDirty&&!e)return!1;if(l&&this.sorted&&(!f||r>f||this.forceCrop))if(e=u.min,u=u.max,t[r-1]<e||t[0]>u)t=[],n=[];else if(t[0]<e||t[r-1]>u)i=this.cropData(this.xData,this.yData,e,u),t=i.xData,n=i.yData,i=i.start,s=!0;for(u=t.length-1;u>=0;u--)r=t[u]-t[u-1],r>0&&(o===W||r<o)?o=r:r<0&&this.requireSorting&&M(15);this.cropped=s;this.cropStart=i;this.processedXData=t;this.processedYData=n;if(a.pointRange===null)this.pointRange=o||1;this.closestPointRange=o},cropData:function(e,t,n,r){var i=e.length,s=0,o=i,u;for(u=0;u<i;u++)if(e[u]>=n){s=G(0,u-1);break}for(;u<i;u++)if(e[u]>r){o=u+1;break}return{xData:e.slice(s,o),yData:t.slice(s,o),start:s,end:o}},generatePoints:function(){var e=this.options.data,t=this.data,n,r=this.processedXData,i=this.processedYData,s=this.pointClass,o=r.length,u=this.cropStart||0,a,f=this.hasGroupedData,l,c=[],p;if(!t&&!f)t=[],t.length=e.length,t=this.data=t;for(p=0;p<o;p++)a=u+p,f?c[p]=(new s).init(this,[r[p]].concat(h(i[p]))):(t[a]?l=t[a]:e[a]!==W&&(t[a]=l=(new s).init(this,e[a],r[p])),c[p]=l);if(t&&(o!==(n=t.length)||f))for(p=0;p<n;p++)if(p===u&&!f&&(p+=o),t[p])t[p].destroyElements(),t[p].plotX=W;this.data=t;this.points=c},setStackedPoints:function(){if(this.options.stacking&&!(this.visible!==!0&&this.chart.options.chart.ignoreHiddenSeries!==!1)){var e=this.processedXData,t=this.processedYData,n=t.length,r=this.options,i=r.threshold,s=r.stack,r=r.stacking,o=this.stackKey,u="-"+o,a=this.yAxis,f=a.stacks,l=a.oldStacks,c=a.stacksMax,h,p,d,v,m,g;for(m=0;m<n;m++){p=e[m];g=t[m];v=(h=g<i)?u:o;c[v]||(c[v]=g);f[v]||(f[v]={});if(!f[v][p])l[v]&&l[v][p]?(f[v][p]=l[v][p],f[v][p].total=null):f[v][p]=new F(a,a.options.stackLabels,h,p,s,r);d=f[v][p];p=d.total;d.addValue(g);d.cacheExtremes(this,[p,p+g]);if(d.total>c[v]&&!h)c[v]=d.total;else if(d.total<c[v]&&h)c[v]=d.total}a.oldStacks={}}},getExtremes:function(){var e=this.xAxis,t=this.yAxis,n=this.stackKey,r=this.options,i=r.threshold,s=this.processedXData,o=this.processedYData,u=o.length,a=[],f=0,c=e.min,e=e.max,h,d,v;r.stacking&&(d=t.stacksMax["-"+n]||i,v=t.stacksMax[n]||i);if(!l(d)||!l(v)){for(r=0;r<u;r++)if(h=s[r],n=o[r],i=n!==null&&n!==W&&(!t.isLog||n.length||n>0),h=this.getExtremesFromAll||this.cropped||(s[r+1]||h)>=c&&(s[r-1]||h)<=e,i&&h)if(i=n.length)for(;i--;)n[i]!==null&&(a[f++]=n[i]);else a[f++]=n;d=p(d,k(a));v=p(v,L(a))}this.dataMin=d;this.dataMax=v},translate:function(){this.processedXData||this.processData();this.generatePoints();for(var e=this.options,t=e.stacking,n=this.xAxis,r=n.categories,i=this.yAxis,s=this.points,u=s.length,a=!!this.modifyValue,f=e.pointPlacement,c=f==="between"||o(f),h=e.threshold,e=0;e<u;e++){var d=s[e],v=d.x,m=d.y,g=d.low,y=i.stacks[(m<h?"-":"")+this.stackKey],b;if(i.isLog&&m<=0)d.y=m=null;d.plotX=n.translate(v,0,0,0,1,f);if(t&&this.visible&&y&&y[v])y=y[v],b=y.total,y.cum=g=y.cum-m,m=g+m,y.cum===0&&(g=p(h,i.min)),i.isLog&&g<=0&&(g=null),t==="percent"&&(g=b?g*100/b:0,m=b?m*100/b:0),d.percentage=b?d.y*100/b:0,d.total=d.stackTotal=b,d.stackY=m,y.setOffset(this.pointXOffset||0,this.barW||0);d.yBottom=l(g)?i.translate(g,0,1,0,1):null;a&&(m=this.modifyValue(m,d));d.plotY=typeof m==="number"&&m!==Infinity?J(i.translate(m,0,1,0,1)*10)/10:W;d.clientX=c?n.translate(v,0,0,0,1):d.plotX;d.negative=d.y<(h||0);d.category=r&&r[d.x]!==W?r[d.x]:d.x}this.getSegments()},setTooltipPoints:function(e){var t=[],n,r,i=(n=this.xAxis)?n.tooltipLen||n.len:this.chart.plotSizeX,s,o,u,a=[];if(this.options.enableMouseTracking!==!1){if(e)this.tooltipPoints=null;rn(this.segments||this.points,function(e){t=t.concat(e)});n&&n.reversed&&(t=t.reverse());this.orderTooltipPoints&&this.orderTooltipPoints(t);e=t.length;for(u=0;u<e;u++){s=t[u];o=t[u+1];n=t[u-1]?r+1:0;for(r=t[u+1]?Y(G(0,K((s.clientX+(o?o.wrappedClientX||o.clientX:i))/2)),i):i;n>=0&&n<=r;)a[n++]=s}this.tooltipPoints=a}},tooltipHeaderFormatter:function(e){var t=this.tooltipOptions,n=t.xDateFormat,r=t.dateTimeLabelFormats,i=this.xAxis,s=i&&i.options.type==="datetime",t=t.headerFormat,i=i&&i.closestPointRange,u;if(s&&!n)if(i)for(u in Tt){if(Tt[u]>=i){n=r[u];break}}else n=r.day;s&&n&&o(e.key)&&(t=t.replace("{point.key}","{point.key:"+n+"}"));return w(t,{point:e,series:this})},onMouseOver:function(){var e=this.chart,t=e.hoverSeries;if(t&&t!==this)t.onMouseOut();this.options.events.mouseOver&&ln(this,"mouseOver");this.setState("hover");e.hoverSeries=this},onMouseOut:function(){var e=this.options,t=this.chart,n=t.tooltip,r=t.hoverPoint;if(r)r.onMouseOut();this&&e.events.mouseOut&&ln(this,"mouseOut");n&&!e.stickyTracking&&(!n.shared||this.noSharedTooltip)&&n.hide();this.setState();t.hoverSeries=null},animate:function(t){var n=this,r=n.chart,s=r.renderer,o;o=n.options.animation;var u=r.clipBox,a=r.inverted,f;if(o&&!i(o))o=dn[n.type].animation;f="_sharedClip"+o.duration+o.easing;if(t)t=r[f],o=r[f+"m"],t||(r[f]=t=s.clipRect(e(u,{width:0})),r[f+"m"]=o=s.clipRect(-99,a?-r.plotLeft:-r.plotTop,99,a?r.chartWidth:r.chartHeight)),n.group.clip(t),n.markerGroup.clip(o),n.sharedClipKey=f;else{if(t=r[f])t.animate({width:r.plotSizeX},o),r[f+"m"].animate({width:r.plotSizeX+99},o);n.animate=null;n.animationTimeout=setTimeout(function(){n.afterAnimate()},o.duration)}},afterAnimate:function(){var e=this.chart,t=this.sharedClipKey,n=this.group;n&&this.options.clip!==!1&&(n.clip(e.clipRect),this.markerGroup.clip());setTimeout(function(){t&&e[t]&&(e[t]=e[t].destroy(),e[t+"m"]=e[t+"m"].destroy())},100)},drawPoints:function(){var t,n=this.points,r=this.chart,i,s,o,u,a,f,l,c,h=this.options.marker,d,v=this.markerGroup;if(h.enabled||this._hasPointMarkers)for(o=n.length;o--;)if(u=n[o],i=K(u.plotX),s=u.plotY,c=u.graphic,f=u.marker||{},t=h.enabled&&f.enabled===W||f.enabled,d=r.isInsidePlot(J(i),s,r.inverted),t&&s!==W&&!isNaN(s)&&u.y!==null)if(t=u.pointAttr[u.selected?"select":""],a=t.r,f=p(f.symbol,this.symbol),l=f.indexOf("url")===0,c)c.attr({visibility:d?ht?"inherit":"visible":"hidden"}).animate(e({x:i-a,y:s-a},c.symbolName?{width:2*a,height:2*a}:{}));else{if(d&&(a>0||l))u.graphic=r.renderer.symbol(f,i-a,s-a,2*a,2*a).attr(t).add(v)}else if(c)u.graphic=c.destroy()},convertAttribs:function(e,t,n,r){var i=this.pointAttrToOptions,s,o,u={},e=e||{},t=t||{},n=n||{},r=r||{};for(s in i)o=i[s],u[s]=p(e[o],t[s],n[s],r[s]);return u},getAttribs:function(){var t=this,n=t.options,r=dn[t.type].marker?n.marker:n,i=r.states,s=i.hover,o,u=t.color,a={stroke:u,fill:u},f=t.points||[],c=[],h,p=t.pointAttrToOptions,d=n.negativeColor,v;n.marker?(s.radius=s.radius||r.radius+2,s.lineWidth=s.lineWidth||r.lineWidth+1):s.color=s.color||vn(s.color||u).brighten(s.brightness).get();c[""]=t.convertAttribs(r,a);rn(["hover","select"],function(e){c[e]=t.convertAttribs(i[e],c[""])});t.pointAttr=c;for(u=f.length;u--;){a=f[u];if((r=a.options&&a.options.marker||a.options)&&r.enabled===!1)r.radius=0;if(a.negative&&d)a.color=a.fillColor=d;o=n.colorByPoint||a.color;if(a.options)for(v in p)l(r[p[v]])&&(o=!0);if(o){r=r||{};h=[];i=r.states||{};o=i.hover=i.hover||{};if(!n.marker)o.color=vn(o.color||a.color).brighten(o.brightness||s.brightness).get();h[""]=t.convertAttribs(e({color:a.color},r),c[""]);h.hover=t.convertAttribs(i.hover,c.hover,h[""]);h.select=t.convertAttribs(i.select,c.select,h[""]);if(a.negative&&n.marker&&d)h[""].fill=h.hover.fill=h.select.fill=t.convertAttribs({fillColor:d}).fill}else h=c;a.pointAttr=h}},update:function(n,r){var i=this.chart,s=this.type,n=t(this.userOptions,{animation:!1,index:this.index,pointStart:this.xData[0]},{data:this.options.data},n);this.remove(!1);e(this,Gt[n.type||s].prototype);this.init(i,n);p(r,!0)&&i.redraw(!1)},destroy:function(){var e=this,t=e.chart,n=/AppleWebKit\/533/.test(it),r,i,s=e.data||[],o,u,a;ln(e,"destroy");fn(e);rn(["xAxis","yAxis"],function(t){if(a=e[t])f(a.series,e),a.isDirty=a.forceRedraw=!0});e.legendItem&&e.chart.legend.destroyItem(e);for(i=s.length;i--;)(o=s[i])&&o.destroy&&o.destroy();e.points=null;clearTimeout(e.animationTimeout);rn("area,graph,dataLabelsGroup,group,markerGroup,tracker,graphNeg,areaNeg,posClip,negClip".split(","),function(t){e[t]&&(r=n&&t==="group"?"hide":"destroy",e[t][r]())});if(t.hoverSeries===e)t.hoverSeries=null;f(t.series,e);for(u in e)delete e[u]},drawDataLabels:function(){var e=this,n=e.options.dataLabels,r=e.points,i,s,o,u;if(n.enabled||e._hasPointLabels)e.dlProcessOptions&&e.dlProcessOptions(n),u=e.plotGroup("dataLabelsGroup","data-labels",e.visible?"visible":"hidden",n.zIndex||6),s=n,rn(r,function(r){var a,f=r.dataLabel,c,h,d=r.connector,v=!0;i=r.options&&r.options.dataLabels;a=s.enabled||i&&i.enabled;if(f&&!a)r.dataLabel=f.destroy();else if(a){n=t(s,i);a=n.rotation;c=r.getLabelConfig();o=n.format?w(n.format,c):n.formatter.call(c,n);n.style.color=p(n.color,n.style.color,e.color,"black");if(f)if(l(o))f.attr({text:o}),v=!1;else{if(r.dataLabel=f=f.destroy(),d)r.connector=d.destroy()}else if(l(o)){f={fill:n.backgroundColor,stroke:n.borderColor,"stroke-width":n.borderWidth,r:n.borderRadius||0,rotation:a,padding:n.padding,zIndex:1};for(h in f)f[h]===W&&delete f[h];f=r.dataLabel=e.chart.renderer[a?"text":"label"](o,0,-999,null,null,null,n.useHTML).attr(f).css(n.style).add(u).shadow(n.shadow)}f&&e.alignDataLabel(r,f,n,null,v)}})},alignDataLabel:function(t,n,r,i,s){var o=this.chart,u=o.inverted,a=p(t.plotX,-999),f=p(t.plotY,-999),t=n.getBBox(),i=e({x:u?o.plotWidth-f:a,y:J(u?o.plotHeight-a:f),width:0,height:0},i);e(r,{width:t.width,height:t.height});r.rotation?(i={align:r.align,x:i.x+r.x+i.width/2,y:i.y+r.y+i.height/2},n[s?"attr":"animate"](i)):(n.align(r,null,i),i=n.alignAttr);n.attr({visibility:r.crop===!1||o.isInsidePlot(i.x,i.y)&&o.isInsidePlot(i.x+t.width,i.y+t.height)?o.renderer.isSVG?"inherit":"visible":"hidden"})},getSegmentPath:function(e){var t=this,n=[],r=t.options.step;rn(e,function(i,s){var o=i.plotX,u=i.plotY,a;t.getPointSpline?n.push.apply(n,t.getPointSpline(e,i,s)):(n.push(s?"L":"M"),r&&s&&(a=e[s-1],r==="right"?n.push(a.plotX,u):r==="center"?n.push((a.plotX+o)/2,a.plotY,(a.plotX+o)/2,u):n.push(o,a.plotY)),n.push(i.plotX,i.plotY))});return n},getGraphPath:function(){var e=this,t=[],n,r=[];rn(e.segments,function(i){n=e.getSegmentPath(i);i.length>1?t=t.concat(n):r.push(i[0])});e.singlePoints=r;return e.graphPath=t},drawGraph:function(){var e=this,t=this.options,n=[["graph",t.lineColor||this.color]],r=t.lineWidth,i=t.dashStyle,s=this.getGraphPath(),o=t.negativeColor;o&&n.push(["graphNeg",o]);rn(n,function(n,o){var u=n[0],a=e[u];if(a)pn(a),a.animate({d:s});else if(r&&s.length){a={stroke:n[1],"stroke-width":r,zIndex:1};if(i)a.dashstyle=i;e[u]=e.chart.renderer.path(s).attr(a).add(e.group).shadow(!o&&t.shadow)}})},clipNeg:function(){var e=this.options,t=this.chart,n=t.renderer,r=e.negativeColor||e.negativeFillColor,i,s=this.graph,o=this.area,u=this.posClip,a=this.negClip;i=t.chartWidth;var f=t.chartHeight,l=G(i,f),c=this.yAxis;if(r&&(s||o)){r=J(c.toPixels(e.threshold||0,!0));e={x:0,y:0,width:l,height:r};l={x:0,y:r,width:l,height:l};if(t.inverted)e.height=l.y=t.plotWidth-r,n.isVML&&(e={x:t.plotWidth-r-t.plotLeft,y:0,width:i,height:f},l={x:r+t.plotLeft-i,y:0,width:t.plotLeft+r,height:i});c.reversed?(t=l,i=e):(t=e,i=l);u?(u.animate(t),a.animate(i)):(this.posClip=u=n.clipRect(t),this.negClip=a=n.clipRect(i),s&&this.graphNeg&&(s.clip(u),this.graphNeg.clip(a)),o&&(o.clip(u),this.areaNeg.clip(a)))}},invertGroups:function(){function e(){var e={width:t.yAxis.len,height:t.xAxis.len};rn(["group","markerGroup"],function(n){t[n]&&t[n].attr(e).invert()})}var t=this,n=t.chart;if(t.xAxis)an(n,"resize",e),an(t,"destroy",function(){fn(n,"resize",e)}),e(),t.invertGroups=e},plotGroup:function(e,t,n,r,i){var s=this[e],o=!s;o&&(this[e]=s=this.chart.renderer.g(t).attr({visibility:n,zIndex:r||.1}).add(i));s[o?"attr":"animate"](this.getPlotBox());return s},getPlotBox:function(){return{translateX:this.xAxis?this.xAxis.left:this.chart.plotLeft,translateY:this.yAxis?this.yAxis.top:this.chart.plotTop,scaleX:1,scaleY:1}},render:function(){var e=this.chart,t,n=this.options,r=n.animation&&!!this.animate&&e.renderer.isSVG,i=this.visible?"visible":"hidden",s=n.zIndex,o=this.hasRendered,u=e.seriesGroup;t=this.plotGroup("group","series",i,s,u);this.markerGroup=this.plotGroup("markerGroup","markers",i,s,u);r&&this.animate(!0);this.getAttribs();t.inverted=this.isCartesian?e.inverted:!1;this.drawGraph&&(this.drawGraph(),this.clipNeg());this.drawDataLabels();this.drawPoints();this.options.enableMouseTracking!==!1&&this.drawTracker();e.inverted&&this.invertGroups();n.clip!==!1&&!this.sharedClipKey&&!o&&t.clip(e.clipRect);r?this.animate():o||this.afterAnimate();this.isDirty=this.isDirtyData=!1;this.hasRendered=!0},redraw:function(){var e=this.chart,t=this.isDirtyData,n=this.group,r=this.xAxis,i=this.yAxis;n&&(e.inverted&&n.attr({width:e.plotWidth,height:e.plotHeight}),n.animate({translateX:p(r&&r.left,e.plotLeft),translateY:p(i&&i.top,e.plotTop)}));this.translate();this.setTooltipPoints(!0);this.render();t&&ln(this,"updatedData")},setState:function(e){var t=this.options,n=this.graph,r=this.graphNeg,i=t.states,t=t.lineWidth,e=e||"";if(this.state!==e)this.state=e,i[e]&&i[e].enabled===!1||(e&&(t=i[e].lineWidth||t+1),n&&!n.dashstyle&&(e={"stroke-width":t},n.attr(e),r&&r.attr(e)))},setVisible:function(e,t){var n=this,r=n.chart,i=n.legendItem,s,o=r.options.chart.ignoreHiddenSeries,u=n.visible;s=(n.visible=e=n.userOptions.visible=e===W?!u:e)?"show":"hide";rn(["group","dataLabelsGroup","markerGroup","tracker"],function(e){if(n[e])n[e][s]()});if(r.hoverSeries===n)n.onMouseOut();i&&r.legend.colorizeItem(n,e);n.isDirty=!0;n.options.stacking&&rn(r.series,function(e){if(e.options.stacking&&e.visible)e.isDirty=!0});rn(n.linkedSeries,function(t){t.setVisible(e,!1)});if(o)r.isDirtyBox=!0;t!==!1&&r.redraw();ln(n,s)},show:function(){this.setVisible(!0)},hide:function(){this.setVisible(!1)},select:function(e){this.selected=e=e===W?!this.selected:e;if(this.checkbox)this.checkbox.checked=e;ln(this,e?"select":"unselect")},drawTracker:function(){var e=this,t=e.options,n=t.trackByArea,r=[].concat(n?e.areaPath:e.graphPath),i=r.length,s=e.chart,o=s.pointer,u=s.renderer,a=s.options.tooltip.snap,f=e.tracker,l=t.cursor,l=l&&{cursor:l},c=e.singlePoints,h,p=function(){if(s.hoverSeries!==e)e.onMouseOver()};if(i&&!n)for(h=i+1;h--;)r[h]==="M"&&r.splice(h+1,0,r[h+1]-a,r[h+2],"L"),(h&&r[h]==="M"||h===i)&&r.splice(h,0,"L",r[h-2]+a,r[h-1]);for(h=0;h<c.length;h++)i=c[h],r.push("M",i.plotX-a,i.plotY,"L",i.plotX+a,i.plotY);if(f)f.attr({d:r});else if(e.tracker=f=u.path(r).attr({"class":"highcharts-tracker","stroke-linejoin":"round",visibility:e.visible?"visible":"hidden",stroke:At,fill:n?At:Lt,"stroke-width":t.lineWidth+(n?0:2*a),zIndex:2}).addClass("highcharts-tracker").on("mouseover",p).on("mouseout",function(e){o.onTrackerMouseOut(e)}).css(l).add(e.markerGroup),mt)f.on("touchstart",p)}};Zt=m(En);Gt.line=Zt;dn.area=t(Yt,{threshold:0});Zt=m(En,{type:"area",getSegments:function(){var e=[],t=[],n=[],r=this.xAxis,i=this.yAxis,s=i.stacks[this.stackKey],o={},u,a,f=this.points,l,c,h;if(this.options.stacking&&!this.cropped){for(c=0;c<f.length;c++)o[f[c].x]=f[c];for(h in s)n.push(+h);n.sort(function(e,t){return e-t});rn(n,function(e){o[e]?t.push(o[e]):(u=r.translate(e),l=s[e].percent?s[e].total?s[e].cum*100/s[e].total:0:s[e].cum,a=i.toPixels(l,!0),t.push({y:null,plotX:u,clientX:u,plotY:a,yBottom:a,onMouseOver:Nt}))});t.length&&e.push(t)}else En.prototype.getSegments.call(this),e=this.segments;this.segments=e},getSegmentPath:function(e){var t=En.prototype.getSegmentPath.call(this,e),n=[].concat(t),r,i=this.options;t.length===3&&n.push("L",t[1],t[2]);if(i.stacking&&!this.closedStacks)for(r=e.length-1;r>=0;r--)r<e.length-1&&i.step&&n.push(e[r+1].plotX,e[r].yBottom),n.push(e[r].plotX,e[r].yBottom);else this.closeSegment(n,e);this.areaPath=this.areaPath.concat(n);return t},closeSegment:function(e,t){var n=this.yAxis.getThreshold(this.options.threshold);e.push("L",t[t.length-1].plotX,n,"L",t[0].plotX,n)},drawGraph:function(){this.areaPath=[];En.prototype.drawGraph.apply(this);var e=this,t=this.areaPath,n=this.options,r=n.negativeColor,i=n.negativeFillColor,s=[["area",this.color,n.fillColor]];(r||i)&&s.push(["areaNeg",r,i]);rn(s,function(r){var i=r[0],s=e[i];s?s.animate({d:t}):e[i]=e.chart.renderer.path(t).attr({fill:p(r[2],vn(r[1]).setOpacity(p(n.fillOpacity,.75)).get()),zIndex:0}).add(e.group)})},drawLegendSymbol:function(e,t){t.legendSymbol=this.chart.renderer.rect(0,e.baseline-11,e.options.symbolWidth,12,2).attr({zIndex:3}).add(t.legendGroup)}});Gt.area=Zt;dn.spline=t(Yt);gn=m(En,{type:"spline",getPointSpline:function(e,t,n){var r=t.plotX,i=t.plotY,s=e[n-1],o=e[n+1],u,a,f,l;if(s&&o){e=s.plotY;f=o.plotX;var o=o.plotY,c;u=(1.5*r+s.plotX)/2.5;a=(1.5*i+e)/2.5;f=(1.5*r+f)/2.5;l=(1.5*i+o)/2.5;c=(l-a)*(f-r)/(f-u)+i-l;a+=c;l+=c;a>e&&a>i?(a=G(e,i),l=2*i-a):a<e&&a<i&&(a=Y(e,i),l=2*i-a);l>o&&l>i?(l=G(o,i),a=2*i-l):l<o&&l<i&&(l=Y(o,i),a=2*i-l);t.rightContX=f;t.rightContY=l}n?(t=["C",s.rightContX||s.plotX,s.rightContY||s.plotY,u||r,a||i,r,i],s.rightContX=s.rightContY=null):t=["M",r,i];return t}});Gt.spline=gn;dn.areaspline=t(dn.area);yn=Zt.prototype;gn=m(gn,{type:"areaspline",closedStacks:!0,getSegmentPath:yn.getSegmentPath,closeSegment:yn.closeSegment,drawGraph:yn.drawGraph,drawLegendSymbol:yn.drawLegendSymbol});Gt.areaspline=gn;dn.column=t(Yt,{borderColor:"#FFFFFF",borderWidth:1,borderRadius:0,groupPadding:.2,marker:null,pointPadding:.1,minPointLength:0,cropThreshold:50,pointRange:null,states:{hover:{brightness:.1,shadow:!1},select:{color:"#C0C0C0",borderColor:"#000000",shadow:!1}},dataLabels:{align:null,verticalAlign:null,y:null},stickyTracking:!1,threshold:0});gn=m(En,{type:"column",tooltipOutsidePlot:!0,pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color",r:"borderRadius"},trackerGroups:["group","dataLabelsGroup"],init:function(){En.prototype.init.apply(this,arguments);var e=this,t=e.chart;t.hasRendered&&rn(t.series,function(t){if(t.type===e.type)t.isDirty=!0})},getColumnMetrics:function(){var e=this,t=e.options,n=e.xAxis,r=e.yAxis,i=n.reversed,s,o={},u,a=0;t.grouping===!1?a=1:rn(e.chart.series,function(t){var n=t.options,i=t.yAxis;if(t.type===e.type&&t.visible&&r.len===i.len&&r.pos===i.pos)n.stacking?(s=t.stackKey,o[s]===W&&(o[s]=a++),u=o[s]):n.grouping!==!1&&(u=a++),t.columnIndex=u});var n=Y(Z(n.transA)*(n.ordinalSlope||t.pointRange||n.closestPointRange||1),n.len),f=n*t.groupPadding,c=(n-2*f)/a,h=t.pointWidth,t=l(h)?(c-h)/2:c*t.pointPadding,h=p(h,c-2*t);return e.columnMetrics={width:h,offset:t+(f+((i?a-(e.columnIndex||0):e.columnIndex)||0)*c-n/2)*(i?-1:1)}},translate:function(){var e=this.chart,t=this.options,n=t.borderWidth,r=this.yAxis,i=this.translatedThreshold=r.getThreshold(t.threshold),s=p(t.minPointLength,5),t=this.getColumnMetrics(),o=t.width,u=this.barW=Q(G(o,1+2*n)),a=this.pointXOffset=t.offset;En.prototype.translate.apply(this);rn(this.points,function(t){var f=Y(G(-999,t.plotY),r.len+999),l=p(t.yBottom,i),c=t.plotX+a,h=Q(Y(f,l)),f=Q(G(f,l)-h);Z(f)<s&&s&&(f=s,h=J(Z(h-i)>s?l-s:i-(r.translate(t.y,0,1,0,1)<=i?s:0)));t.barX=c;t.pointWidth=o;t.shapeType="rect";t.shapeArgs=t=e.renderer.Element.prototype.crisp.call(0,n,c,h,u,f);n%2&&(t.y-=1,t.height+=1)})},getSymbol:Nt,drawLegendSymbol:Zt.prototype.drawLegendSymbol,drawGraph:Nt,drawPoints:function(){var e=this,n=e.options,r=e.chart.renderer,i;
-		rn(e.points,function(s){var o=s.plotY,u=s.graphic;if(o!==W&&!isNaN(o)&&s.y!==null)i=s.shapeArgs,u?(pn(u),u.animate(t(i))):s.graphic=r[s.shapeType](i).attr(s.pointAttr[s.selected?"select":""]).add(e.group).shadow(n.shadow,null,n.stacking&&!n.borderRadius);else if(u)s.graphic=u.destroy()})},drawTracker:function(){var e=this,t=e.chart,n=t.pointer,r=e.options.cursor,i=r&&{cursor:r},s=function(n){var r=n.target,i;if(t.hoverSeries!==e)e.onMouseOver();for(;r&&!i;)i=r.point,r=r.parentNode;if(i!==W&&i!==t.hoverPoint)i.onMouseOver(n)};rn(e.points,function(e){if(e.graphic)e.graphic.element.point=e;if(e.dataLabel)e.dataLabel.element.point=e});e._hasTracking?e._hasTracking=!0:rn(e.trackerGroups,function(t){if(e[t]&&(e[t].addClass("highcharts-tracker").on("mouseover",s).on("mouseout",function(e){n.onTrackerMouseOut(e)}).css(i),mt))e[t].on("touchstart",s)})},alignDataLabel:function(e,n,r,i,s){var o=this.chart,u=o.inverted,a=e.dlBox||e.shapeArgs,f=e.below||e.plotY>p(this.translatedThreshold,o.plotSizeY),l=p(r.inside,!!this.options.stacking);if(a&&(i=t(a),u&&(i={x:o.plotWidth-i.y-i.height,y:o.plotHeight-i.x-i.width,width:i.height,height:i.width}),!l))u?(i.x+=f?0:i.width,i.width=0):(i.y+=f?i.height:0,i.height=0);r.align=p(r.align,!u||l?"center":f?"right":"left");r.verticalAlign=p(r.verticalAlign,u||l?"middle":f?"top":"bottom");En.prototype.alignDataLabel.call(this,e,n,r,i,s)},animate:function(e){var t=this.yAxis,n=this.options,r=this.chart.inverted,i={};if(ht)e?(i.scaleY=.001,e=Y(t.pos+t.len,G(t.pos,t.toPixels(n.threshold))),r?i.translateX=e-t.len:i.translateY=e,this.group.attr(i)):(i.scaleY=1,i[r?"translateX":"translateY"]=t.pos,this.group.animate(i,this.options.animation),this.animate=null)},remove:function(){var e=this,t=e.chart;t.hasRendered&&rn(t.series,function(t){if(t.type===e.type)t.isDirty=!0});En.prototype.remove.apply(e,arguments)}});Gt.column=gn;dn.bar=t(dn.column);yn=m(gn,{type:"bar",inverted:!0});Gt.bar=yn;dn.scatter=t(Yt,{lineWidth:0,tooltip:{headerFormat:'<span style="font-size: 10px; color:{series.color}">{series.name}</span><br/>',pointFormat:"x: <b>{point.x}</b><br/>y: <b>{point.y}</b><br/>",followPointer:!0},stickyTracking:!1});yn=m(En,{type:"scatter",sorted:!1,requireSorting:!1,noSharedTooltip:!0,trackerGroups:["markerGroup"],drawTracker:gn.prototype.drawTracker,setTooltipPoints:Nt});Gt.scatter=yn;dn.pie=t(Yt,{borderColor:"#FFFFFF",borderWidth:1,center:[null,null],clip:!1,colorByPoint:!0,dataLabels:{distance:30,enabled:!0,formatter:function(){return this.point.name}},ignoreHiddenPoint:!0,legendType:"point",marker:null,size:null,showInLegend:!1,slicedOffset:10,states:{hover:{brightness:.1,shadow:!1}},stickyTracking:!1,tooltip:{followPointer:!0}});Yt={type:"pie",isCartesian:!1,pointClass:m(wn,{init:function(){wn.prototype.init.apply(this,arguments);var t=this,n;if(t.y<0)t.y=null;e(t,{visible:t.visible!==!1,name:p(t.name,"Slice")});n=function(e){t.slice(e.type==="select")};an(t,"select",n);an(t,"unselect",n);return t},setVisible:function(e){var t=this,n=t.series,r=n.chart,i;t.visible=t.options.visible=e=e===W?!t.visible:e;n.options.data[nn(t,n.data)]=t.options;i=e?"show":"hide";rn(["graphic","dataLabel","connector","shadowGroup"],function(e){if(t[e])t[e][i]()});t.legendItem&&r.legend.colorizeItem(t,e);if(!n.isDirty&&n.options.ignoreHiddenPoint)n.isDirty=!0,r.redraw()},slice:function(e,t,n){var r=this.series;D(n,r.chart);p(t,!0);this.sliced=this.options.sliced=e=l(e)?e:!this.sliced;r.options.data[nn(this,r.data)]=this.options;e=e?this.slicedTranslation:{translateX:0,translateY:0};this.graphic.animate(e);this.shadowGroup&&this.shadowGroup.animate(e)}}),requireSorting:!1,noSharedTooltip:!0,trackerGroups:["group","dataLabelsGroup"],pointAttrToOptions:{stroke:"borderColor","stroke-width":"borderWidth",fill:"color"},getColor:Nt,animate:function(e){var t=this,n=t.points,r=t.startAngleRad;if(!e)rn(n,function(e){var n=e.graphic,e=e.shapeArgs;n&&(n.attr({r:t.center[3]/2,start:r,end:r}),n.animate({r:e.r,start:e.start,end:e.end},t.options.animation))}),t.animate=null},setData:function(e,t){En.prototype.setData.call(this,e,!1);this.processData();this.generatePoints();p(t,!0)&&this.chart.redraw()},generatePoints:function(){var e,t=0,n,r,i,s=this.options.ignoreHiddenPoint;En.prototype.generatePoints.call(this);n=this.points;r=n.length;for(e=0;e<r;e++)i=n[e],t+=s&&!i.visible?0:i.y;this.total=t;for(e=0;e<r;e++)i=n[e],i.percentage=i.y/t*100,i.total=t},getCenter:function(){var e=this.options,t=this.chart,r=2*(e.slicedOffset||0),i,s=t.plotWidth-2*r,o=t.plotHeight-2*r,t=e.center,e=[p(t[0],"50%"),p(t[1],"50%"),e.size||"100%",e.innerSize||0],u=Y(s,o),a;return un(e,function(e,t){a=/%$/.test(e);i=t<2||t===2&&a;return(a?[s,o,u,u][t]*n(e)/100:e)+(i?r:0)})},translate:function(e){this.generatePoints();var t=0,n=this.options,r=n.slicedOffset,i=r+n.borderWidth,s,o,u,a=this.startAngleRad=nt/180*((n.startAngle||0)%360-90),f=this.points,l=2*nt,c=n.dataLabels.distance,n=n.ignoreHiddenPoint,h,p=f.length,d;if(!e)this.center=e=this.getCenter();this.getX=function(t,n){u=$.asin((t-e[1])/(e[2]/2+c));return e[0]+(n?-1:1)*et(u)*(e[2]/2+c)};for(h=0;h<p;h++){d=f[h];s=J((a+t*l)*1e3)/1e3;if(!n||d.visible)t+=d.percentage/100;o=J((a+t*l)*1e3)/1e3;d.shapeType="arc";d.shapeArgs={x:e[0],y:e[1],r:e[2]/2,innerR:e[3]/2,start:s,end:o};u=(o+s)/2;u>.75*l&&(u-=2*nt);d.slicedTranslation={translateX:J(et(u)*r),translateY:J(tt(u)*r)};s=et(u)*e[2]/2;o=tt(u)*e[2]/2;d.tooltipPos=[e[0]+s*.7,e[1]+o*.7];d.half=u<l/4?0:1;d.angle=u;i=Y(i,c/2);d.labelPos=[e[0]+s+et(u)*c,e[1]+o+tt(u)*c,e[0]+s+et(u)*i,e[1]+o+tt(u)*i,e[0]+s,e[1]+o,c<0?"center":d.half?"right":"left",u]}this.setTooltipPoints()},drawGraph:null,drawPoints:function(){var t=this,n=t.chart.renderer,r,i,s=t.options.shadow,o,u;if(s&&!t.shadowGroup)t.shadowGroup=n.g("shadow").add(t.group);rn(t.points,function(a){i=a.graphic;u=a.shapeArgs;o=a.shadowGroup;if(s&&!o)o=a.shadowGroup=n.g("shadow").add(t.shadowGroup);r=a.sliced?a.slicedTranslation:{translateX:0,translateY:0};o&&o.attr(r);i?i.animate(e(u,r)):a.graphic=i=n.arc(u).setRadialReference(t.center).attr(a.pointAttr[a.selected?"select":""]).attr({"stroke-linejoin":"round"}).attr(r).add(t.group).shadow(s,o);a.visible===!1&&a.setVisible(!1)})},drawDataLabels:function(){var e=this,t=e.data,n,r=e.chart,i=e.options.dataLabels,s=p(i.connectorPadding,10),o=p(i.connectorWidth,1),u=r.plotWidth,r=r.plotHeight,a,f,l=p(i.softConnector,!0),c=i.distance,h=e.center,d=h[2]/2,v=h[1],m=c>0,g,y,b,w,E=[[],[]],S,x,T,N,C,k=[0,0,0,0],A=function(e,t){return t.y-e.y},O=function(e,t){e.sort(function(e,n){return e.angle!==void 0&&(n.angle-e.angle)*t})};if(e.visible&&(i.enabled||e._hasPointLabels)){En.prototype.drawDataLabels.apply(e);rn(t,function(e){e.dataLabel&&E[e.half].push(e)});for(N=0;!w&&t[N];)w=t[N]&&t[N].dataLabel&&(t[N].dataLabel.getBBox().height||21),N++;for(N=2;N--;){var t=[],M=[],_=E[N],D=_.length,P;O(_,N-.5);if(c>0){for(C=v-d-c;C<=v+d+c;C+=w)t.push(C);y=t.length;if(D>y){n=[].concat(_);n.sort(A);for(C=D;C--;)n[C].rank=C;for(C=D;C--;)_[C].rank>=y&&_.splice(C,1);D=_.length}for(C=0;C<D;C++){n=_[C];b=n.labelPos;n=9999;var H,B;for(B=0;B<y;B++)H=Z(t[B]-b[1]),H<n&&(n=H,P=B);if(P<C&&t[C]!==null)P=C;else for(y<D-C+P&&t[C]!==null&&(P=y-D+C);t[P]===null;)P++;M.push({i:P,y:t[P]});t[P]=null}M.sort(A)}for(C=0;C<D;C++){n=_[C];b=n.labelPos;g=n.dataLabel;T=n.visible===!1?"hidden":"visible";n=b[1];if(c>0){if(y=M.pop(),P=y.i,x=y.y,n>x&&t[P+1]!==null||n<x&&t[P-1]!==null)x=n}else x=n;S=i.justify?h[0]+(N?-1:1)*(d+c):e.getX(P===0||P===t.length-1?n:x,N);g._attr={visibility:T,align:b[6]};g._pos={x:S+i.x+({left:s,right:-s}[b[6]]||0),y:x+i.y-10};g.connX=S;g.connY=x;if(this.options.size===null)y=g.width,S-y<s?k[3]=G(J(y-S+s),k[3]):S+y>u-s&&(k[1]=G(J(S+y-u+s),k[1])),x-w/2<0?k[0]=G(J(-x+w/2),k[0]):x+w/2>r&&(k[2]=G(J(x+w/2-r),k[2]))}}if(L(k)===0||this.verifyDataLabelOverflow(k))this.placeDataLabels(),m&&o&&rn(this.points,function(t){a=t.connector;b=t.labelPos;if((g=t.dataLabel)&&g._pos)T=g._attr.visibility,S=g.connX,x=g.connY,f=l?["M",S+(b[6]==="left"?5:-5),x,"C",S,x,2*b[2]-b[4],2*b[3]-b[5],b[2],b[3],"L",b[4],b[5]]:["M",S+(b[6]==="left"?5:-5),x,"L",b[2],b[3],"L",b[4],b[5]],a?(a.animate({d:f}),a.attr("visibility",T)):t.connector=a=e.chart.renderer.path(f).attr({"stroke-width":o,stroke:i.connectorColor||t.color||"#606060",visibility:T}).add(e.group);else if(a)t.connector=a.destroy()})}},verifyDataLabelOverflow:function(e){var t=this.center,n=this.options,r=n.center,i=n=n.minSize||80,s;r[0]!==null?i=G(t[2]-G(e[1],e[3]),n):(i=G(t[2]-e[1]-e[3],n),t[0]+=(e[3]-e[1])/2);r[1]!==null?i=G(Y(i,t[2]-G(e[0],e[2])),n):(i=G(Y(i,t[2]-e[0]-e[2]),n),t[1]+=(e[0]-e[2])/2);i<t[2]?(t[2]=i,this.translate(t),rn(this.points,function(e){if(e.dataLabel)e.dataLabel._pos=null}),this.drawDataLabels()):s=!0;return s},placeDataLabels:function(){rn(this.points,function(e){var e=e.dataLabel,t;if(e)(t=e._pos)?(e.attr(e._attr),e[e.moved?"animate":"attr"](t),e.moved=!0):e&&e.attr({y:-999})})},alignDataLabel:Nt,drawTracker:gn.prototype.drawTracker,drawLegendSymbol:Zt.prototype.drawLegendSymbol,getSymbol:Nt};Yt=m(En,Yt);Gt.pie=Yt;e(Highcharts,{Axis:I,Chart:z,Color:vn,Legend:U,Pointer:R,Point:wn,Tick:B,Tooltip:q,Renderer:vt,Series:En,SVGElement:H,SVGRenderer:mn,arrayMin:k,arrayMax:L,charts:Ct,dateFormat:Et,format:w,pathAnim:xt,getOptions:function(){return wt},hasBidiBug:pt,isTouchDevice:lt,numberFormat:g,seriesTypes:Gt,setOptions:function(e){wt=t(wt,e);P();return wt},addEvent:an,removeEvent:fn,createElement:v,discardElement:O,css:d,each:rn,extend:e,map:un,merge:t,pick:p,splat:h,extendClass:m,pInt:n,wrap:b,svg:ht,canvas:dt,vml:!ht&&!dt,product:"Highcharts",version:"3.0.4"})})()
-	
-	</script>
-	<script type='text/javascript'>
-		
-		// Alignment
-		$(function () {
-			
-			// Set defaults for Highcharts
-			Highcharts.setOptions({
-			    colors: ['#0d233a','#2f7ed8','#8bbc21','#910000','#1aadce','#492970','#f28f43','#77a1e5','#c42525','#a6c96a'],
-			    title: { text: null },
-				credits: { enabled: false }
-			});
-			
-			// Alignment
-			$('#alignment').highcharts({
-				chart: { type: 'pie' },
-				tooltip: {
-					formatter: function() {
-						return '<b>'+ this.point.name + ':</b>'+this.percentage.toFixed(1) + '%';
-					}
-				},
-				plotOptions: {
-					pie: {
-						allowPointSelect: true,
-						cursor: 'pointer',
-						dataLabels: {
-							enabled: true,
-							color: '#000000',
-							connectorColor: '#000000',
-							format: '<b>{point.name}</b>: {point.percentage:.1f} %'
-						}
-					}
-				},
-				series: [{
-					type: 'pie',
-					name: 'Reads',
-					data: [
-						{
-							name: 'Unique Alignments',
-							y: {{unique_seqs}},
-							sliced: true,
-							selected: true
-						},
-						['No Alignment', {{no_alignments}}],
-						['Multiple Alignments', {{multiple_alignments}}],
-						['No Genomic Sequence', {{no_genomic}}]
-					]
-				}]
-			});
-
-			// Aligment Context
-			$('#alignment_context').highcharts({
-				chart: { type: 'column' },
-				xAxis: { categories: ['OT', 'CTOT', 'CTOB', 'OB' ] },
-				yAxis: { title: { text: 'Number of Alignments' } },
-				tooltip: {
-					formatter: function() {
-						if(this.x == 'OT'){
-							return '<b>' + this.x + ':</b> ' + (this.y / ( {{number_OT}} + {{number_CTOT}} + {{number_CTOB}} + {{number_OB}} ) * 100).toFixed(1) + '%'
-									+ '<br><em>original top strand</em>';
-						} else if(this.x == 'CTOT'){
-							return '<b>' + this.x + ':</b> ' + (this.y / ( {{number_OT}} + {{number_CTOT}} + {{number_CTOB}} + {{number_OB}} ) * 100).toFixed(1) + '%'
-									+ '<br><em>complementary to original top strand</em>';
-						} else if(this.x == 'CTOB'){
-							return '<b>' + this.x + ':</b> ' + (this.y / ( {{number_OT}} + {{number_CTOT}} + {{number_CTOB}} + {{number_OB}} ) * 100).toFixed(1) + '%'
-									+ '<br><em>complementary to original bottom strand</em>';
-						} else if(this.x == 'OB'){
-							return '<b>' + this.x + ':</b> ' + (this.y / ( {{number_OT}} + {{number_CTOT}} + {{number_CTOB}} + {{number_OB}} ) * 100).toFixed(1) + '%'
-									+ '<br><em>original bottom strand</em>';
-						} else {
-							return false;
-						}
-					}
-				},
-				series: [{
-					name: 'Alignment Context',
-					data: [ {{number_OT}}, {{number_CTOT}}, {{number_CTOB}}, {{number_OB}} ]
-				}]
-			});
-
-			// Methylation Context
-			$('#methylation_context').highcharts({
-				chart: { type: 'column' },
-				xAxis: { categories: ['CpG', 'CHG', 'CHH'] },
-				yAxis: {
-					title: { text: '% Methylation' },
-					max: 100
-				},
-				legend: { enabled: false },
-				tooltip: {
-					headerFormat: '',
-					pointFormat: '<b>{point.category} Methylation</b>: {point.y}%'
-				},
-				series: [{
-					name: 'Methylation Context',
-					data: [{{perc_CpG_graph}}, {{perc_CHG_graph}}, {{perc_CHH_graph}}]
-				}]
-			});
-		});
-
-		{{start_deletion_duplication}}
-
-		// Deduplication
-		
-		$(function () {
-			$('#deduplication_plot').highcharts({
-				chart: { type: 'pie' },
-				tooltip: {
-					formatter: function() {
-						return '<b>'+ this.point.name + ':</b>'+this.percentage.toFixed(1) + '%';
-					}
-				},
-				plotOptions: {
-					pie: {
-						allowPointSelect: true,
-						cursor: 'pointer',
-						dataLabels: {
-							enabled: true,
-							color: '#000000',
-							connectorColor: '#000000',
-							format: '<b>{point.name}</b>: {point.percentage:.1f} %'
-						}
-					}
-				},
-				series: [{
-					type: 'pie',
-					name: 'Read Pairs',
-					data: [
-						['Unique', {{unique_alignments_duplicates}}],
-						['Duplicate', {{duplicate_alignments_duplicates}}]
-					]
-				}]
-			});
-		});
-
-		{{end_deletion_duplication}}
-	
-		{{start_deletion_splitting}}
-
-		// Methylation Context after Extraction
-		$(function () {
-			$('#dedup_methylation_context').highcharts({
-				chart: { type: 'column' },
-				xAxis: { categories: ['CpG', 'CHG', 'CHH'] },
-				yAxis: {
-					title: { text: '% Methylation' },
-					max: 100
-				},
-				legend: { enabled: false },
-				tooltip: {
-					headerFormat: '',
-					pointFormat: '<b>{point.category} Methylation</b>: {point.y}%'
-				},
-				series: [{
-					name: 'Methylation Context',
-					data: [{{perc_CpG_graph_splitting}}, {{perc_CHG_graph_splitting}}, {{perc_CHH_graph_splitting}}]
-				}]
-			});
-		});
-
-		{{end_deletion_splitting}}	
-
-		
-		{{start_deletion_nucleotide_coverage}}	
-		// Nucleotide coverage
-		$(function(){
-		    $('#nucleotide_coverage').highcharts({
-		        chart: {
-		            type: 'bar'
-		        },
-		        xAxis: {
-		            categories: ['A','T','C','G','AC','CA','TC','CT','CC','CG','GC','GG','AG','GA','TG','GT','TT','TA','AT','AA'],
-		            title: { text: null }
-		        },
-		        yAxis: {
-		            min: 0,
-		            title: { text: null }
-		        },
-		        tooltip: {
-					valueDecimals: 1,
-		            valueSuffix: '%',
-		            shared: true,
-		            headerFormat: '<span style="text-decoration:underline; font-weight:bold; font-size: 1.1em;">{point.key}</span><br/>'
-		        },
-				plotOptions: {
-					series: {
-						borderWidth: 0,
-						groupPadding: 0.1
-					}
-				},
-		        series: [{
-		            name: 'Percent Genomic',
-		            data: [
-						{{nuc_A_p_exp}},{{nuc_T_p_exp}},{{nuc_C_p_exp}},{{nuc_G_p_exp}},
-						{{nuc_AC_p_exp}},{{nuc_CA_p_exp}},{{nuc_TC_p_exp}},{{nuc_CT_p_exp}},
-						{{nuc_CC_p_exp}},{{nuc_CG_p_exp}},{{nuc_GC_p_exp}},{{nuc_GG_p_exp}},
-						{{nuc_AG_p_exp}},{{nuc_GA_p_exp}},{{nuc_TG_p_exp}},{{nuc_GT_p_exp}},
-						{{nuc_TT_p_exp}},{{nuc_TA_p_exp}},{{nuc_AT_p_exp}},{{nuc_AA_p_exp}},
-					]	        }, {
-		            name: 'Percent Sample',
-		            data: [
-						{{nuc_A_p_obs}},{{nuc_T_p_obs}},{{nuc_C_p_obs}},{{nuc_G_p_obs}},
-						{{nuc_AC_p_obs}},{{nuc_CA_p_obs}},{{nuc_TC_p_obs}},{{nuc_CT_p_obs}},
-						{{nuc_CC_p_obs}},{{nuc_CG_p_obs}},{{nuc_GC_p_obs}},{{nuc_GG_p_obs}},
-						{{nuc_AG_p_obs}},{{nuc_GA_p_obs}},{{nuc_TG_p_obs}},{{nuc_GT_p_obs}},
-						{{nuc_TT_p_obs}},{{nuc_TA_p_obs}},{{nuc_AT_p_obs}},{{nuc_AA_p_obs}},
-					]
-		        }]
-		    });
-		});
-		{{end_deletion_nucleotide_coverage}}	
-
-		{{start_deletion_mbias}}	
-
-		// M-Bias Plots
-		$(function () {
-			
-			// Set plot defaults to be used twice
-			var m_bias_settings = {
-				colors: [ '#CCF0E1','#EDD3A8','#69798A','#21BCA2','#F29D13','#0d233a','#f28f43','#77a1e5','#c42525','#a6c96a'],
-				chart: {
-					zoomType: 'x',
-					marginRight: 80,
-					alignTicks: false,
-					plotBorderWidth:1
-				},
-				title: { text: 'Read 1' },
-				subtitle: {
-					text: document.ontouchstart === undefined ?
-						'Click and drag in the plot area to zoom in' :
-						'Drag your finger over the plot to zoom in'
-				},
-				xAxis: {
-					title: { text: 'Position (bp)' },
-					tickInterval: 5,
-					minTickInterval: 0,
-					min: 0,
-				},
-				yAxis: [{
-					title: { text: '% Methylation' },
-					min: 0,
-					max: 100,
-					gridLineWidth: 0,
-					tickWidth: 1,
-					lineWidth: 1
-				}, { // secondary axis
-					title: { text: '# Methylation Calls' },
-					min:0,
-					gridLineWidth: 0,
-					lineWidth: 1,
-					tickWidth: 1,
-					opposite: true
-				}],
-				credits: { enabled: false },
-				tooltip: {
-					shared: true,
-					headerFormat: '<b>Base {point.x}</b><table>',
-					pointFormat: '<tr><td><span style="color:{series.color};">{series.name} Methylation:</span></td><td>{point.y}</td></tr>',
-					footerFormat: '</table>',
-					useHTML: true
-				},
-				legend: {
-					layout: 'vertical',
-					align: 'right',
-					verticalAlign: 'top',
-					x: -60,
-					backgroundColor: '#FFFFFF'
-				},
-				plotOptions: {
-					line: {
-						lineWidth: 1,
-						marker: { enabled: false },
-						shadow: false
-					}
-				},
-				series: [{
-					name: 'CHH Total Calls',
-					yAxis: 1,
-					lineWidth: 2,
-					legendIndex: 5,
-					data: [ {{CHH_total_calls_R1}} ]
-				},{
-					name: 'CHG Total Calls',
-					yAxis: 1,
-					lineWidth: 2,
-					legendIndex: 4,
-					data: [ {{CHG_total_calls_R1}} ]
-				},{
-					name: 'CpG Total Calls',
-					yAxis: 1,
-					lineWidth: 2,
-					legendIndex: 3,
-					data: [ {{CpG_total_calls_R1}} ]
-				},{
-					name: 'CHH Methylation',
-					yAxis: 0,
-					lineWidth: 3,
-					legendIndex: 2,
-					data: [ {{CHH_methylation_R1}} ]
-				},{
-					name: 'CHG Methylation',
-					yAxis: 0,
-					lineWidth: 3,
-					legendIndex: 1,
-					data: [ {{CHG_methylation_R1}} ]
-				},{
-					name: 'CpG Methylation',
-					yAxis: 0,
-					lineWidth: 3,
-					legendIndex: 0,
-					data: [ {{CpG_methylation_R1}} ]
-				}]
-			};
-			
-			// Plot the graph
-			$('#m_bias_1').highcharts(m_bias_settings);
-			
-		});
-		{{end_deletion_mbias}}
-
-		{{start_deletion_mbias}}
-
-		{{start_deletion_mbias_2}}	
-	
-		// M-Bias Plot 2
-		//$(function () {
-			
-			// M-bias plot 2 data
-			m_bias_settings['title']['text'] = 'Read 2';
-			m_bias_settings['series'] = [{
-				name: 'CHH Total Calls',
-				yAxis: 1,
-				lineWidth: 2,
-				legendIndex: 5,
-				data: [ {{CHH_total_calls_R2}} ]
-			},{
-				name: 'CHG Total Calls',
-				yAxis: 1,
-				lineWidth: 2,
-				legendIndex: 4,
-				data: [ {{CHG_total_calls_R2}} ]
-			},{
-				name: 'CpG Total Calls',
-				yAxis: 1,
-				lineWidth: 2,
-				legendIndex: 3,
-				data: [ {{CpG_total_calls_R2}} ]
-			},{
-				name: 'CHH Methylation',
-				yAxis: 0,
-				lineWidth: 3,
-				legendIndex: 2,
-				data: [ {{CHH_methylation_R2}} ]	
-			},{
-				name: 'CHG Methylation',
-				yAxis: 0,
-				lineWidth: 3,
-				legendIndex: 1,
-				data: [ {{CHG_methylation_R2}} ]
-			},{
-				name: 'CpG Methylation',
-				yAxis: 0,
-				lineWidth: 3,
-				legendIndex: 0,
-				data: [ {{CpG_methylation_R2}} ]
-			}];
-			
-			// Plot graph
-			$('#m_bias_2').highcharts(m_bias_settings);
-		});
-	
-	    	{{end_deletion_mbias_2}}
-	
-		{{end_deletion_mbias}}
- 
-
-// adds commas to big numbers for better readability
-
-		$(function () {
-			$('table tbody tr td').each(function(){
-				if(isNumber($(this).text())){
-					$(this).text(addCommas($(this).text()));
-				}
-			});
-		});
-
-		function isNumber(n) {
-			return !isNaN(parseFloat(n)) && isFinite(n);
-		}
-		
-		function addCommas(nStr) {
-			nStr += '';
-			x = nStr.split('.');
-			x1 = x[0];
-			x2 = x.length > 1 ? '.' + x[1] : '';
-			var rgx = /(\d+)(\d{3})/;
-			while (rgx.test(x1)) {
-				x1 = x1.replace(rgx, '$1' + ',' + '$2');
-			}
-			return x1 + x2;
-		}
-
-	
-	</script>
-	
-<div class="container">
-	<div class="header">
-		<img alt="Bismark" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANYAAADbCAYAAAARfW/wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7Z13mCRV9f4/ZxOb02xiMywsOecsSUDJQSQJSFRAERH4GlBRUBAQRCQnCSIKgiBJUZDsyg8kCUqSKHEBgWXZcH5/vLe2q+6t2Znp6Z60/T5PPzNVXV1d3V3nnvwec3ca6ByY2TBgDWAtYElgBDAy/M3+HwzMBv4HfBj+/yj8/0/gAeBB4Clv/JhdBtb4LToOZrYUsCWwAbA68AHwV+A/wJvAG+HxHhKgT8JjtrvPM7PewERgCSSIS4THcsBU4CHgXuAe4AF3/7CjPlsDRTQEq84wsxWBLwHbICH4M3AucLu7v1fD9xkGbAxsCnwKWAF4FLgV+KW7/7tW79VAy2gIVp1gZp8GjgK2At4Hfgn8wt3/2UHvPwLYGtg1/P1/wKXANe7+v464hkUZDcGqIcysH7AnEqiVgCeAXyCN8UEnXtcg4DNIyDYEzgbOcPePOuuaejoaglUDmNlIZO4dDgwBrgUucfc7O/O6ymBmU4ErkI92HnC1uz/dmdfUE9EQrHbAzJYGjgT2Axxpgp+4+1udeV2tgZmtDOwD7As8Bxzt7vd07lX1HDQEqwqY2VjgHGAH4OPw/ynu/kanXlgVCJ/ldGA74A7gceCs9n4WM1sW+NjdX2j3RXYwglbfDZhRtdXh7o1HKx9ALxQIeAnlkk4Hxnb2ddXos/UD9gDeAt4FjgYGteN830Ba/CXgYmDJzv6Mbbj2lcK1O4rg9m7rOXpVJY2LIMzsQJRv+h1wHTDN3Y9y99c798pqA3f/xN1/hW6qK4DvAC+a2XfNbLEqTpmZlTcBqwFPmtmPzGxwba64rpgZ/r4BHAJcEwJTrUbDFGwBZtYHOAX4Clq9TnL3Vzv3quqPEEncE/gmSmTv4+6PtPEcDyO/8x1gEvBVlPze0ruwHxo++wfA5cC/gB8A17r7rq09R0NjLQShUuJuYCNgLXc/fFEQKgB3/9DdL0Aa7F7gQTP7v1D90Vq8B6wM/M7dz0SlWzOBO4Nv1yXhqlj5BF3/T4A5wC5mtkprz9EQrBKYWR8zOxa4D7gaWNfdH+7ky+oUuPsH7n4oyoNtCzxmZgeb2YBWvPxJYC8UCMDd3w7n+RC4y8zG1+mya4GZqJRsNnAyErSvtPbFDcGKYGZrAn8H1gfWcPcz3X1eJ19Wp8Pd73D3DYAvomqSF83sBDMbspCXXYoKiffMnedj4EpgAvBXM5scvyiYYp2NxVBOEuCHwI3AnmY2qjUvbghWgJkNMrPTUWDiB+6+g7u/1NnX1dXg7g+4+y7AF4D9gafMbOdmjv0bijDGjv99wKqogv/8/BNm1jec8/O1vvbWIiwWw4Gh2S7gMqA/cHDJ8aPjfQ3BAsxsG+AxtEqt6O7XdvIldXm4+y2o0Pcy4GQzu8bMxpQc+hIwN9q3krs/i8q91jOz/H24Barg/3kL2rCeyLToL8Pf9YGHUZRw3/yBZrYM8JKZXZzfv0gLlpmNNrMrgbNQ1Oswd3+/s6+ru8Dd33f3bwLLooXpUTPbIzrsZVLBym7cS5BWWDb33K7Ai0ATOROygzEFXfPtYftIZLpeBUwPCeQMJwN9gf3MbHi2c5EVrGBq/BM1EK7q7vd28iV1W7j7PHf/AbATcJKZ3WBmi4enXyEVrHXD655DCel1AUIwYwcU8AD4lpk11fv6SzAZeDnnW9+NzMC/hu2NAczss8CawPHIXFwnO8EiJ1hmNsrMfoPCqHu5+6HeiZXnPQnufj+wClqsnjSz/ZDGWhD8Cc7/f3Iv+zuwrpkZ0mB3oKbPB4BxhIhiB2M54IXc9vtAH6RJAYaY2XYokb4LcHPYv2gKlpnthFo5PkC+1G2dfEk9DsE83BtV+/8UOIyixpoHfDu3PQNprCOAzYBT0ep/Jvqtptb/qhNsCfwptz0eLQZvh+2dgd8AB7r7gyEVcwBBk8EiIlhmtqyZ3QD8HDjA3ff3GnbvNpDC3a9GyeFXKQrWKGD33PYrKAhyIrIgZiBT7E1UEDypQy44wMwmIY3129zuq9z9GeR7gRaAy6Ig10vA+lnpU48WrBCcOBtFdJ4FlnP3mzr5shYZhHTFAxQFa+vosH7oPjzY3a8J+zZFgjUP2C3QDnQUtgJe92KP2qGh4mRpZNrujDRqHm8BAwjmYJ8OuNBOgZkdBpyEhGotd3+8ky9pUcV8cj4W4v24M9tw97PMbMNQAJzBkGD1D6/vSCqBrZAJmscaKPJ3kbtfGL/AzNZBmheUt+uZgmVmm6PgxMHufkVnX88ijteQoGQYicymPOIGS0caoD/wnLvPr9/lVWBmQ5FGjRPe7wJ9Q9VIGWZQSYIPgB5oCprZAah6Yo+GUHUJzEd+VobJyJzK481oe567z6GisToK+yPauD9G+2cijbUAoUIEgCD4S6MFYT70IMEyswFmdg2KQm3t7jd09jU1AMiMeg3AzKYD67j7AkEKYfadotcsE/6OQIniuiNcx+HAaSX7NyEnWKGV6JDc9iDUJGqEMqgeIVihEe96FEZfK+RTGugamEJFYy1PUXvhagi8LnrNq+FmXQ21rGBmTWZ2XUjK1gOfBaZRyVVlaEKfIa+xBiLS1QxbAseE194JPUCwwg9wLfA0CqUv8pXoXQzzKApTwQwMdYKxj/VfdOP2Bc4Ox1yKNNtQagwzG4g6pv/l7k/mnwsNma+Qk5VQ9pZfvDcEegOXZv5gtxaswDL7d+Af7v4Vb7RDdymEqu+lqfhQA0kDFwcBK+Ze0wvluTZF/Vz3A9fkjqlHlcwVyJ9rrk50MdSPlcfE3P8bhb+3ZDu6rWCZ2dbA34DL3f1bnX09DZRiG+CDXFTvY1LBAkXVMkxFCeMtUf7rBTQYYtvwfE0Fy8xWR/WJB6I2/Ph5Q5HMOdFTfwnPD0Em67vkPke3DLeb2brI/DvF3U+q4vWZQ/q2uz9W6+trYAF60XJEsMnd38ltj0T35Rph+xPgAhR+B3Uf1wTBNz8P5admmFn/ksP6o88RC9awcB9diEzWw/JuSLcSrPDBv49Wl7Pc/XtVnGMEIglZBq2Iy9XyGhsoYAuKgjUAeCY6Zh0z65XTasPQTXwJ6vUaC7yOIoRQrvGqxWnIpMuqQcrIcuYiHys2BbdB99DngDPd/arQj7Yn8Gqnc7i15YFq/Tx8kGpevzrqsVkP2c03dPZn6qkP1E7hwFG5fWcBq+S2Fwd+E71ua2D73PYByL/aFZUa1er6dkTckGvn9l3czD3j5LgFUVj9aZSzehdVa/wIaVMHXu42PlYo0z8MON/dv1rF6/cGvgXs6grHH0QI5TZQF0wFZrr76bAgKLEnRVNwFXQjxsi3lTQhrbcm5RqlzQiFthcC+7voAzJMKTl8KMXeLFBj5nQkYMMQH8aKqGLjAuCDbiFYoWnuYmQaHFrF6/dFIdHPufv7wbY+BFFD54/rZ2YN07A2OAQV4AILqhP6uJiaMrxIUYgy5I/5j8sHW4MaCJaZLYmid39z919HT8d+FEhw/hDta0JTNLcGRrh7P+BQVxtSE/BGlxes4CBejro3D/Cgi5s5ds2SffsAk1wNjdmq80XgSg9zosysVzjuVuACM7uzGf6GBloB07CILYDjcvv6oBldeawKlA3EywczBgZt127BMvHJ/w0N/5tiOXbbUEG/QcnL+gPPR/vuA+5z99vc/d3w2TL2ppWB17u8YCGTrRewp7ec/D0s+8fM+ppooc9D9m+2vxewN6HsP9wEf0Zq/XDgy8DayP5uoDqsgwYiPJrbtye6qfNYlTTE3cuLc7s+QRHcwai7uCoEIboK+dVfQaZqvh3lfTR1JUYvioIOanxcMrc9CfggFCtMA57t0oIVyDlOBL7hIk5sCfnIzV6ohGaXSCA3Ap5291lmtivwK+BL7v5LgHAzPOSNdv2qEH6zb1Jpo8jwMBrdmsdqpBprhWj7j+i3vMmrnIBiZpugZPNbwCHBCnrQczWLSMhWDNonj2VJc2dvUlx430PRww3QAn1llxYsFFrvA/wjv9PMRubISvK4PvvH3S9196NQ5CmPocBYM7sJccRt6WF8qbs/GcLxZbZ2A63DOSiFEYfFjya9QZd291gAl4q25yNeiYuquRjTHLDr0W+6m7vPRWH/2KycDdwans9jfMl19ybXsxV8wDdQxcjf3f2xLitYZrYCClRsV/JhP3L310peVojymVhWy6ZEfIhyGNu4+8xw7Ljw3OpEq60J65rZRjTQLAJRzC7ALFJNtBK5QIWZTSA0BUZ4PXfMGGQqfoT837Zez+rIzB8OHOIVOob+8Xu7+yzKF9T7iQQrmKqn5t7nWFQpsg8KsnXpkqYzUY3YAyXPTY93mIZpLx3t3gOZAHk8jRog/xKZiBnl1sbkVtvggz2Kcmg/DDdEA+U4CCWATyfVCAMpmoJLkBbkGqHFJKAvSgz/ohX+dQGhq/cOdB9dGL3XAKJ7P/hgCaMtivLNLNm/fu7/ScileAMF2rqmYJnZtugGPx6FyWN8umTfeojXIo9NEXdgHrPdvWylzBzUDQkrq5mtj1bKw919TeR8f781n2FRg2kyy3cQA9Ms5FNlz/VBfm2+aXECRSECmVIfhNf0Q8WxfwJ+3MZr2QT5Zme5+A77UwxAjKDCy55hcST8MUaRtpJA0TpaPbz2a5lv3uUEK5B2nIwSwc+jJGKMsikV/UoEZnjkoIIYduL3HIxWHJDz+bKZfQGp9Z3c/a7w3PsU28wbYEE37WWoCPV6FFXNt3csCzwUvaxMsD4NPBPugUtRwnb31morM+ttZscjYfyJux8fnmqiWGM4kVSw3qJCyJnHCEo0lrt/Et7zOLSoH+/uv8me73KChXJMU9GEB6jwZ+cxq2RfrNr7EBVshhtgtZLXfpcKk9B/w3vvCGwahYw3BO6igRinorq5PZFjvxnFGsH1SBPBE0kFqxe6iW9D3/+OXizQbRYm2ue7kNY8OGiqDKMoMkVNJHBT5NAbRfdi9C/LnZrZFmZ2LYpaHxa9X9cSrJAHOAHVAv437C6bOlHQQkFgYvt4CqkDvS7lDvP0XIDkQHdfDSU3F7ADhQLgtUi7XRdpmLjajwD2DRG+NYHXvNg1UCZYE4i6idHNfwuwObrR/0sLCJQMhyOfbh7i+7skOmx4JByjSXk2DqUZSyh6v2mBAuKPKGCxl7v/In5RlxIsFJLtjxiWMoEZWXJc/IOsSLr6LUUauFiW6AcOzXgLzIJccnJZihpvbeCvmQ1tZpubOMovb+Ez9ViY2UqoNu4X7p6V/YwlrVRoTrBeM7OhZvZ5M/s1WkSnhuf7oS6G5t57tJl9D/k/BwObuPsmlGud2Ox7l/QeGtTMa0eEqPCqZvYXFJzZGY0fWtpFTJqgy7SNmNkSaNL6UVkIHEX5XoqOm0zEmIMq1ePARZlgLUNa9zWGtCIA4Gh3/31ue03gqXANJyCNeClwvpmt5WJw7bEws8XySfqQR/wDuiFPzR06AjU0ZseNQL/FS2F7CDK9VwPOQKVKzQ3OPtTMTs58LDObgqyOzVH1zADUQb6Zu/8v+GYFsy0szrHAvF2yz1CpUoxVUDXFWVQCaX8N5zjAzD5GhQlX5c3WLiFYIcx6EfBbd88PIovJ6UGRvjgD34tywbo+2jedoA1z6Its+vz19EPCmsckNMvpceAud983HLs+6m7tsYIVHPRVUPoiC/b8AeWXjqVYhTACmXEZlkamYWZqr4V43QciTbYwTALOC/mxddCQhLeROZ5pt0lZzScKmMSNkE2kpUqLl+zrRbnv3jscuyMijFkPLcZboaTyJCRHhYLuLiFYyL5dHzHl5JEVTeaRNZ7lsQZFrm2A0SVZ/SZ3fz3adwwKmOSxPGkU6xz0hT6GopYZbket3T0SZrY7qrXMEunTgF8jrbQl6lPKL3QjKHIBOjkz0N3/HELz/0IafzSaS9zckLkDwt+3UFT2YHe/LlzLV8gllJFgxVUSZYI1hdTHWkBdtmCH6kr/FdIEb6NFJH7+CeCWOHLZ6T5WiOaciEpB4hVjOqkQrUpqH29UUolR6PgMUcKyFWkxTxlOd0JtAXlMA77s7j+OHOEPKBZz9hiYJl1egLRxrxCoeBiZxJujRe7k6GUjKJrb80j9q8EoWXwUCjqUzRyei3JF30H+7VgkXE/ljhlGUbCGUK6x1oj2vUPK9pT1VuUxiMhfNI3UzVqL9kL36MXR6zpXYwUT8ELEsT6u5JDFPaUXXtpFSZVHIbEXVpJYWJYkqqQO9n9cLgVqu94/2re6azxo9trRKNDyCeUC220QTN/PAc+4+wNh36fQqJr9kfm9FrqBvuLuF4RjRpF+zyMo+i8FjRUwBi1IKyBtOCu85hxklv8XdRGfFV3jBIqt/bFglWmsONQOci+GR/v6kCaIB5F+vpWBwWY2C/gBypclcwE6W2OdDvzP3U8l/aBQ6XHJIxYqSBN4E0nV/3TgXVOTY35frP1AQh63M8RJyr3QKjqY8hB+t0AQjrtQKc54U2/a15DW+VZIer6Jom/bZEIVMJvUVB8RbQ8jFazRSFB/j6JrRyL/+gR3fxD5bHGAaknE4563RIaTClaZxoopo4eR+t/9kZmfR5lgPYEE9UFkmh5PCTpNY5nZQcD2qBwEIjUcHOT50b5+aM7tSejHyR7LmFlWmzYcCcZiZhYHKgC+YWZPoYr5viiqlH+PLYH3XNzh2b4BpJxzW6Lh1FtRXkvWpRGshX3RjTE17O6Hik7XRivxmQDu/t1wfNz2sRKprzKYYjR2LKlgrU7FZDwU+ApF031xigEQkCke+71lGiuO9o2iOEQO5EPHPvkA0s83mFSwLkSBjKvRwhOTzACdJFgmDu8TgM+4+3shTBqvUBPI3bBmthWqSM/6df6LhONetOq9i0yK+DEbfUEj0Y85Ivf/EaQ5l9lo4FkeaxEJIHLaPzF1nnYrwTLN9b0M3eCHoeDBgcCVyBRbj3TlH0eqmTdG1eN5xA2OYwltP+F3PgX5VvehZLybmGjfjl4TW1PvkutADj7zKhQFewipT95EWiiwHGmIfzZpJLigsczsO2h065/d/QssBB0uWOFG/D3wXdeISdAKFZtkE4CZQVvcjnIId6LI4YySGsBqruV14Odmdm0uD3Uk6cq4ProRs9eNpCKQQyneFF0KQdNsBDzi4vtYH622byCe+1dCOH0+CkR8G/H/xX1sA0v83cm0TKA5NlzGN1BbxUph/0G5vNggim0hZay0G5Lzr9x9rpndE0XjmtNY8YIwpuT8r5FqyUHo4g9A98WKwE0oXbBQdKiPFYIKvwImR/mqCaSNcRPQ6vNzZJrs5u6buvvNtRCqgAuQ+s9XrK9AqrHWpbgybkpFgw2jhiSSdcCFBKJ+MzsG+VMzUCT1lZBAfRAY5u7fDMLzVdJcYbyag8LW8VC4xc1sPzPb38xOQfWDTyBNtRLSDHMpmoeDKN78fUmT+y+SG54dEF9jmWANyJv1AXM9HZX7IrnWEjNbFeXtvom+w7nA5u6+nbvHpKMJOkxjhZXzHMq7NydSLljjkerd1t1vpsZw9/kh+nW1me3k7r9DkaE4A79M1Gy5D6oeAJmZcUFnl4CZfQnl6GYivofPosXqu7nUxorAs16kIliF9KYtSylMIaexQmBoCbRgNXdv/RTYwd3zi9FwpNmyBe0Bd48tmH+T8pDEI36Gkmqi2MUAGGpmd4XzZR3FI4BtTf12SyKN/R/gXOQL3lKisZtFR2qsM1B36aGkq8oEUurhcSgEfFU9hCpDyNo7cImZjQfu9eL8pqVJO0vHUWnNzgoyuxRMPW2noe91BLpZ1kfh4rzPsSapKTssV82QCUwcXDK0IOY11gjkc01F5maMN6iMr81jBEUf9p0QvMpjPGpSzd5/KOmCNphUg8bnAQnga4i+bFu0mL6BtPKDqLRuGXef6u5fdvc/tEWooIMEy8y+jIRkE9fQ5DJ/KrbVs/D7d6k/folunNNJQ64rokqDPF7KNJi7/6OZxslOgZkNNLPfATcgM2wG8ptWdRGVnuNFYp7lKc/l5TGeNN2wONIGseZ5Czn895Lm9y5EN3V8riGRabYzigLmsRxFbfQpSqonSgSgrKLjXXf/PEpy/wtpvu+5+47u/nV3v9LdkwEJbUHdTUEzOxqFUzdx93+FkHksRGUELsNQ3iKuAawHbkDm0u6kJtB05LACC9pHWrSxOwMmhqQ/oCqCjd39XjMb5O5XhufLyP2XIldlErRTLBDjCcJnIrw8lkooepqZzUOm3K5IA+xNuQn2TRTij4lhYg7HKYRpHjm8Q9EP25I0AhgX4PZGgZAYL8OC8qrV0MJ6v5n9DVkgl3mRWLTNqKvGMrPTUNHrgbkVYCSpsz+ElHR+GGlZUV0QVvCrwuYF0dP5+U4g/yOeqt7pCNXmd6GbLROqXhTD4Z8mXRSWoriYjEPtHCPMbDdTa8h4Kr/FTFSNsScyxf6FCqDvQ2H00ZQL1UykscYCx5vZw2Z2fDh/nCtajbQQYLgX+QbXpZjDgpSuegSRdWRRA2w454+Rhl2HZhK+bUXdBMvMNkMhysfd/fbcU3GbNEiw4pV0KOUcBPVCVu+1erR/MkXBqgnVca1gwkFI2JcGLskFWnpFNZRvkEslBMF7J6zce5rZDJTHGoMipdegqOlFwEgz255yHpGWcAvyWQ5Cua//oJrP74fzTzGzU81sk3DjP1MSyYt9pTuRtsz368WCNYqcXxZQGBhuYuf6Ggrn340if+1Pn3h9Jk0MQiVFxwEnRc9tDHw12ncXMCXa9280VK4jJ2Tci5J/+X1XRNvno3btDruuhVzvcmjM6Ksot/ITYFTu+eOi408BlshtLwmcGP4fj4IK3obHzFYccxXQN7qOEchvLTv+HST8O0SfZbXoHLuG4+ehxPF5KGDSL3fMBohTPdvuhRbKp5D590R4/eOIZq9mv029fKwTUfj8FFI+uDKNNZRyHysuRak3TgWuM7Pl3P2fpqa8OGs/2NNq+A6HicX3UhScWNrdPzSzG7xYoLwtgeHIzDYEtgOWMrO5SCutDfzPNB3zY9qeNvgJmuDSnGXxY+CbHu7qDK5G1t2Dv7o9+u3PRRUaA1BgItOS/0Rm5hJm9kMqTYr/Q0n7fZF5ORSZcrPNbA7y4+fpo9sPwzVmn282qty5Bvly93gbo34toeaCFTL7X0BRqPmRqobmfax8bd6qlGfM6wp3/52ZnYs07b7ItMqXVfWnC7DkmiZaXo1uuG2DUA0GZplG1AxCAYxXrDLUbSnU37ZsdLoBpMGD1uI/SFvEFHVzkaZoib32GCRYR3qRN+LnIZw/KTwykppfICEagXJQr6Pv4F53PwbAzMYic34oMvv6o/v8DeR/vgq84qmpWVPUVLBCHuhSxMP3Ysjqx1G9JtIwaZmPZbRDsMIPMw2FkycjE+NOTxOPMY4AHjazPZEt/kLuuZXpGoGLGcDvUE3fiSGa1Q/lgm6jOKVyWzN7lOoXhGfQ4rJWyXPzSaNu76EZZC1aG+7+tJk9AexrZle4ptFnzzmqhniRlOG4V3MaxtXIekvZcx2JmglWKKz9E1KrWYRtIinTTmuCF5n5tSYt0I2FOrf8KtwLaZqVSBvoZoYKi2bP6apBOwvV151Osf9nDSIe+c6Au88zsywPswfwPbSIvEil1ebPKILZhCJoMf5EZZFoQpRlZSxFo0inbWR4k2JN4X9QYXVcjrQwXIeaGS9A6Y4WUWuzrS6ooSN9PXImN8zt+xTwo+i4CymOp8w6e3tFx71CyejKkve9m7Y53K8DQ1tx3r4l+y4GxtbSya3h9z8ICdDBiOQSZOYdhJzz/HcwD9Vr5l/fB0Xo2vJdrpD7/4FqvhsUHcwCIb3b+z10lUdNwu2mgV7bI57s/Ao2mTTZ2ESxLnAw8G9PV6HXaZ0z3ZrP8B5qyJuJ/IljWnqBRzZ4MC3X95Qzo0vA3T909wfc/XwPkwrdfZa7X+DuK6KkaxYuX9bdY9rk71GpPG8N3qNCTXcJKgBo83fj7o+gCPJwFEzpEahVHuvHyO7/O8XepLGkhZODKJqHQ0lzDSDTsDVcEmWjNjO8jshIRrv7OqhdBVQZUA26XE1ga+HuL7r7je5+p7sXIp1mtgPwf2085R1o0VzL3b/orZtf1hyOCH9bbMfoLmi3YJnZYSjncBpaFfPh3kGkgvWhBxsgYAhFgpAMc4F1gqZYGJoLJvwD/egX57TP/eHvFNOIl1bDhSNaPrLrwswODXWb+X0HAddSuRdubMWpnkQNkj+nnNqgrbgPmf57Buun26NdgmUiYzkNRc6uRYKVF6TBpKZgXH08hLQ0BSRYI2nZPClzlH8PbODucStKXgh3buG8PQZm1t/MLgZ+RrEu8AiU8M4a/P6NFskyXpEMr6N82LkouNRu09hVxPx55GtdHqLL3Rrt1VjroVL7M1ydnFMotiAMpkRjRdtDSGvFoBLRa2mKfWxGnocmhJQ1H+Y/b8xh2CNhZhugAM9kYF13fyjsX46UvPS1YE3cRDlmIWq4Y5EAvu4lk0DMbDEzO9DMbgk1gevHx8Rw93tQg+UawEOteU1XRnsF6+co15QlAidR9LHKTMG4E7U5wcqOW6aFa3iWSo3YjWiecHPh2Hxx6BItnLfbwswmm9m3zezfiDTlJnffwt3/X3jeUHg7/i0yrr1DSPupXkWDz09GkUdIJ1/2NrMjkQWzG6Ji3tvdy6ibE7iSxDuiBfkvwUztnmhHeHd5dEOfktv3cnTM74Atctv9gUujY/ZDbffx+S9Fptv/gEELuY7+VEK+41q45s9RDBcP7OywbC0fKGR+MkrcOgowDI2OyWaBlYXP56K2k/3QpPqN0I2+NRKq16Ljj82dd2UUwHoccam353OsgEx8Ry09S3b2d9vmz9COD/+N8MFXCtsjUNg8f8ztKESdbY8sEawjKCmARDmjQ8OPPWAh1zElXMeLrbjm06IbY1pn/wA1+RGVxP0/ph5nnwAAIABJREFUVHXuSIsfT64gNRy3MjKdW5un2g1VdDxR8tzMTGhRn9UnYTFM8n9VfqZBqBbQkQl6QndaCNtjCm6EeK2zjtsm0hbvwRS7PgeQlvYPQUWRCxCaISeiCuT3WTg3ehaEiKmOyxDb7TETUbdDaHu4G7W8f4SCNtNc5JfZ1MEJZvZ9lMRN5jcHPAmcjeok90cL5m/COZ4vOf5sVMD7M1R0faK77+c1qsFz5eX2RemS+ag6I6ag67JoT0nT6miFyjCKVLBi9p2BpP5UGSniUKSlPjKzq5BpknAomNkaiKL4y+5+Tvx8dOxipL1WMd1Vt4KJSu7PqKTrYhQCX8rMlkfVFWsSyHjQZ52NSogeRQne99HvM8PTCGoecaL+dhT4uBCR1ezn7pclr6oB3P3iUAt5G92Iv7EqwQoVxBNQL1CGMsEaQFGwBpASyfQlFay+VDpfbwVuMLMJnk4PmQjs4WJXagmrk5I0xow+3QahSfFKFDX9lrufFPZ/HS1EGeajessrEY1z2XC1lpBfkP6IIqqnIaG6pl5ClcHdHzezD6H7zH+uVmNlplleIEaRUpj19SKt1kBSwcpW0jzepDKh8S/Iz9qHaHq6u9/QhmsuC99Wc5N1FWyNbvDnKYbNf4S+z3dRG/713goevOZgZitTIfZ5D5lmOyMekzm0vWKjmmsYgIqM68bWVWtUK1j7hr95gWgiTdbGPBYDSPNYfUg11khCYtnVa/Q0ac9Pq2FmE1H7dYxuq7GomGc35v0aF7fIoTV8n6yu8h4UZh+ITEBQGD8ePlEP7IJ+qxM64L1qgjYLlmloWLb65wVnFCmPd6yJBpLmj3qTCtanKA5EeJHyMT8tIvghtyDTNY836EY2ewky/7Bu9NZmtgyqiPgDslIWQ8XMGaVYXMhbLxwFXOe5UaRdHdVEBXeh0juV/6BzSdvYY4EZgEK+efQhFcBe0b6XqCKCF6KLv0PcgDFO9ZKqgW6E7Lsuo35uNcxsieCvxftXRD1bD6M2lHmoqmWF3GF176Y2s10Qa9N19X6vWqIawdoIVTjMplhZ/jo5My+0scc+zEBStp0yjQVFbfgxMKYVBbkLEG6Wy1GbRIy3UJt3t4VroMTjwM5t+V5KsDbwppn9zMzWN7PdTWOS7kG/71bBHD+ESldANkDijna8b4sIvtVpqEigo/lP2oU2CVbWk4RKWZ7xYunQTA+ZvYA4IpjteybaVyZYAylqrDWRoLUlPH4eqrQow5leXkvY3XA+CrV/tdoTuHq3foAifLegruldUePqFu7+TkhVnBJe8igV7RGPG601jkMFADd7+9pSOhxt1VjLowqLy0nbteOK5IGkgjWQcsGKv7TRBI0VeObWAO7w4mCCZmFmp6J5T2WYR8nM2O4I1yjRHYHTzOx5MzuxyvOc4e6D3X2Yu09w9+kh2ZsteNtQEaIzqPz2q7TrAwBmtpKZXWlmr5jZo6YZVJjZEihw8jaq7OhWaGvwYiXkS/2XlO10SrQ9nDQ4UCZY8yNNB+ryzdpLVkaa7g8sBEGbboAiYnst5NBbvWVCmW4Dd7/BzAahAuh4wHmrsTCCFirzmN9APIHZsOzYX27rex6GKOcyQprxKLr8A7Qw9kc0ZieEJPGDaM5Xl9debdVYU1EG/ANSwZoabZdNABxA6xrjxlARyowIpaUcxgmotGdhQgXduAu4Obj7x+7+7yhn2CqY2eamkTalIXoz2w619AP8wt1nu6rVbwY2DsUCbX3PwWZ2A+qO6I/886MRE9S00ISaTUzsh7Tymagk6w0zO8fM1mzr+3Yk2ipYU9CqYaQTKmJTcCzlpmDs25Rdw2gqgrUe8NjCSm6C2dDaRGVr2v17PMzs02Z2L/KXrvAir192zAQ002w+CiKcmXv6PGQe/qiN79sXuRLbI6vkO6gY+jTU9X0cuscmonvsDEQ488fwmtuRBp0Rer02b8v7dxSq0VgfI20VT+WI0ZzGarVgBfNuC1owA1HPVmsDG59v5XE9FmZ2PLI8nkY3dTwIAjNbAVEZTAAOcfejgTlmtpaZ7Y2iwwD7mVmLJDAmfB31au2IWGinu/sPgfkmHse/obFNmYvSB1Xp/xuNTrrR3XdDqZffIoH7k5n9yjQUosugGo01G33guGU+9pPKBKu1GmtAyJusHM7TkhkY1wAuDMuZ2R5tOL5Hwcy+hYYRXO4igUna8M1sI2RWT0Ih/cFm9kcUtLgWmdsZN4UBt5rZMSE8XvaeQ1C1xqnIsnkWaaKdzexy5LNfiQSlOXwxCNBwF0X1a0hznYu6mh/tUuZhG3tkPkTdpVNQDVr+uYej7V+S68UK+64hakYEri55n6fC32OQubBQvjkUqZxH28j8J9WjD6crP5C5nH0HI5o5Zk9UTpYd9x4Spv8Seu/CcZuF/b9EJpujNMwRqIZxJ2QdXIh88tb+Ni09XkJEpb8kDEpASesXUNnTJp39Pbu3odERmWeOKqenAV+Jnv9HtH07sHy076b4BwV+FW0PA+4K/98RC+xCrq+56RXNPfbv7C+/Q39oCUL22b9f8vzU8Ptkx3wAfJ3QuAicFR2/LXB6+H8a0kAf1VCAFvaYj7TntNz1jEWLwCyU1+tU8s+2mIJZOH02IiaJS2liH6fMFOxDWpgbh3jHAC+EyokNKW+yK8MXaRv984yWD+kZCAGDn4fNvyJyzgXPmWi6n0CBojNQQOFEdz/NKwW+k6PTDiLUfbr7s+5+JPqtfo6G0dUThqyUzM/DRRb6JNJkZ6DgRjxutcPQFsHKSGFmo9q7uDQpPtco0jxWWTI49s1Go1Kaoch3apVguSoptqfloAqIBqwrDDfoKHwN9W19iDS1w4LRPg8jE/FgYIK7fw0Fp+K6z4nR9qCSYxZz9yPcfRmkAQ+mvoXOF5rZXgAhl/eBux+CiD+XRcK1Xh3fv1m0RbBeCH8HoJtygWCF6F18rjnuPit3TG9gBU+rJ0o1FpUeoNZqLFy0yTuRCm8eJ7v7V7Obq6cjhMyz8Z/HuvtzZtZkZheh+rtrgNtcA62zSouVSGnlRkXbU8lppvD75ttX/oNC+XOQD/SdknO2F72By4JwjUHJZdz9XBSgGQH82jSbuUPRasFyzWp9A93w71LUWGXnKfQ6uaJ8j5adOtoegxodsy+jTTwHruTlYc08/V13P64t5+sB+CrSLn8GfhHC2k+hm30NVIwct3+MR9FAAMysrCZwbYomX9l4pu2At939SXf/obsvizRkLdEbkc4cGZ37dUTnMAnl4joUbQ23P48GmK1GcUROWQ6prK6vbIJ5mcYaSmUMZzVjcy4lNQm/4e7dplGuFjCzgag06H3kg+4FXIHSFxu6+xOo2uGR3GsWA16INPoY0nKp1SmagmNIWXFXIP0dZqE0ytmkLMnVYhYquM7XLr6Cqjl+BXw+5N46DG0VrBdRCPUBioJTdp6yyellghVrrEkocvgfFOVZvo3XmGnHjHzG0SC8U9t6nh6AvZE5dCRKol+MHPv9ciZ5QbBQkCKeaTamZN97XhwcPppUsD7K7wuab5a7P+buh6M5Zr9s64cqwYtIOz6Y2zcZRTb3R1bP2WYW17PWDW0VrDfQF7g6xURvmcYqS9q2RmM9R6WN5FFSZqXW4tsoBL+Pu59d5Tm6O45AhJePooVmhrsfFWmjlSgOpZhC2sZTprFiE71MY31EcSLmRMTDAYCLHOhkFKyKOf3bguURN0qeGmIK8JGrYHdXpAguL2vqrAfa+iYvoy+9P0XBaq3GKut2jTXW8ijrD2IX+lTbLjGc1P1/7v55d7+ymtd3Z4QQ+iUocHACMv1+SM5vyqF/FFCaQhouLwiWaa50vEiWCVY/RCKaoaxOcxjq8p5C+7TXYIosThOyVEGwfr6PwvPHtuM9Wo22CtadyLfamSIne+E8oYfKon39Kfe7Yo01x92z6NHPgM8Eno0GWoEcx8cyyDy6DHUDn0klIJQd+xnSLu8ppKRAYygGOJYi4m1HlkxsLq5BUbDWI/WZh6EAx0wXQWc2d6u1eIfK4vz16HryyBTB9wPzVF3RVsGagdo+tmbhpmCZGTgU2bwxYsFa0FbiqmM7D5l1DbSAwFNxD9JUW6EAQX/kZyxOmpwfQ5rEn0xRGEA36bW57SbSNEiZxlqTYoDjU6SJ+WEUm2ZnoZrBVg1SQCbkakgbTzKzpcP+kdFxvVGF/tuISq+uaJNghaDAdujD5HNF8XmaE6yydvjYFIyF9EFgHxPrbbthZiPNbPuWj+xeMLNz0Wp/PvAZVGf5GTTB/n0qznweg5BvkkdfT0k93d3zPtAoUq1SECyrkLrmrY25pDnGYRSZpsa7KNw2Rv5XS/nGKSjaORRY0SvTKmOzszfSlmcDuwWiobqhzY6caxTMJcBBoVQGUmEYQophlAtWjHilmY5W4XNr5HheRIUXsUfAzJrQDTPO1a6/M9LyP3X3zPQqi/Yti9pH8ij7jWJN10T6m8dRwQmo2/dvuX19S841jGJ1xjDQIh5yjr+nHEehCSifhP8nocBXZg7H6IOso3PQIrB/yTE1Q7U36s2orClzBOPzlCUUW9RYoacmjkgthVakqVTmMlWF0A27I92IUbU1cPe3QwjbQxXMj1EVeD5vN5k0ObscuZU9LFytFayY7HRAvtIGCVrMwNtEqrGGUCw2iDvMDZm1mwB7UOGu3MLF178yuj+e8DAEAiW447lsvRANxNvI79yPOqJawbodJd6+Y2YZ4X6eo69MsKZR7mPlsSxpQtFcFMmHA98LNWHV4mAqM6B6KrZGi9HXvMhEVSZYy1A0tcaTCgOkwjCdyjznDGWJ/niRfJlUSIcSyqVCgCsue+qPOif+6u5Xu/vmSIsdBuDuT7uYpvLvtTjpAjGPyj36U2BtM6ubr1WVYIU8yH7IRLsOrST5hrky7TSqZF+M6ZRn6glf3pNI7bcZwVzaBtEixyZRT8LhqO3m2mj/FM/RG4Rk7TNeJNZZmigoEXylfM2nob6sfJ1gXxbCtJXDmJJ9Q6kI/AjSaGP/knO7u7+Qe/+RFO+tJlKNNY8g/OHa/4LqF+uCqn2WoHZ3Qjf7KRQ//FCUm4hRJlj5lW4waWQpb14cA3zdzOKC0NZga6RZz6/itd0CISK2DeX5qrjtY1mKkT5QDvGFaN82FG/2lUjvm9GkdYKj8+cKxcCbkArJICqVHyNKrnsxUmGM86Ex38r9pII1l+K9djN1nI/WrmBAiDZtAzwGbJlreR9Gec6qYAqGVu684PQh1VgLviB3/ztytr9VxeXuhcyeu1s6sBvjEOSTlFUxxGxKy5FS0Q0nDaOvT9E8XIGUWnoMKc/kaIqMWO9SmcmVx8e5nq8ywSpoLDMbQ5p7iwUk1mBQNAVBub7BZrYwOoCq0e4oW6gXWx91n15uZpeS8mFkiD/sYIrC1oeW+3fuBr7UliY2M9sZLQAveRUUYd0IWRFq4eYNnBNPRccuR1rV/r6LTyKP0RTHMzUhlqX4mPh1Yygurh8DN3jKCZjXRmWC9ZoXOfbXJS2vWpyir7gq6b02meL3kmnhdgXEmkN7JjougLt/YGY7oBDvsYg05gYzG+nFCRFlgpVfXRcjDXzE15hxE/7LzJ5Eav9+VG/2IdJws4AlgXXCY5Pw2m7N174whIjeCsjEibXCZNJ81XKk88x2A86K9o2gGKkbRRpgyPNAZsgmk2SYSmpmQlH7lQnWjdH2ZqR+2OKIjCbDgxSHN4DC69fntrNIZNXjoRaGmggWgItF9QQzuxDVZe0PvGhm5yE+cEijgrHGGk3aUBfXHA5AmfN7UMh/ReCgFi5vHmo1b82c4u6KrZG5dy7pDTqZVDuNi5K+kPq3oFrCvFYpmzVdJljjotctQ2QuhsUgv5AOJucHhdK4wykuiP+jXGPlhxCWVfk8SbHKJPPTplIH1LzS191fdfeDkHN8BUriPYcELX6/WLDGkoZ7ywTrcVKHtjk8BKzt7j29LOowtNjMolxjxcJQCI+HesyJ0b5+pL9ZmWCVmYJTouqGZUgtliaKi3t8P4wiTUT3oVyw8tin5L0GR9f4Agq4DAlRxZqibiX07v6Mux+KVoQfhve6yszuMbNvm9l+qHYsH73pR1oAGmvVjM+7pTGnH6KizHVCtUiPhZktiTTWtWi1jjXRZHLaImiKmE9wPKlwTC3ZVzZruqCxQoPlw5HGmk4aqYsDKoOiax9FGm38NGkSOS4saCIVrInkFpyQMsoEdCo1Rs1MweYQ2HN+APzAzDZAnNw7oQ8zEphrZv9EmmoZwuQMFAkaBqxmZgciYZqOvtg/ElVql2Brd7+nhWN6Cg5E0cDrEHNw7DuNo6jFBpUc8wmpJphGKkRlLfixKTiOdOEbRSpYY6LtwdF1lgnWyiXX2Z/irLYRpIL1TAnPSRa9ngrUdPGtu2Dl4e73Avdm22Y2GBVRTkUrypjw2DD8HYdMytjBbKmr+L5FSKggdM+6+8sh8RtrrDHRvsGkgvUZ0sqMaaSarbens8ViU3AcKYPTENJK+rEUI4f5nBZIsOL0y7vuHp/nxUhoygSrrJjXkZsyteS5dqFDBStGCH0/QTNUZKG2r7kizIXh9JYP6Rkws0kogPONsGsYqY81Nto3gdScmkBaQzmUnMZaSGK+TGM9VHKuOIAyhmI7/Ue5XjyINFaoJS0IVVhI4omWw0kFq9CYGVilPqROgtUhbcrtwJFVvOZ5yqs+eio+E/7eFP6WaazRFAVrVdJK9yaK2oJwnrzG2pw01J2dP3/Dlw1iLzM/Z1PUbHFRQayxNqPcvxoY7StorFByFXdcDArnfopFSbBCl+dmVbz0am9+gFpPxDbAq+6eJYDjyBrIV8/ni1Yl9VPezvEKZliSoo+1DFHUNhTOErX3j6OYwwLoE10DpGZePGw9Fqwyrbc4GrKQxwiKof0mUq22fjj30yxKgkX1c3VvaPmQnoEQzt6cSisFQK+8vxFMpTgAsAqpxiobEL4JRY01hFTrlOWwxpKGwKeGCpA8ViMVpjxGUdRQA0revyBYISL5mrvnu6CbSs49BeXtFh2NZWaj0dSLtuI10pWyJ2MjpKHyghULSMxXAQqtLxCYULFeNk84jgoOJs0zlgnWMHI+VtBqs0oS0qtl1xEEIm4JGhW9X3OC9VxuewTiZsmjiVQ7vkBFY9U8l9UlBQuN7SyjSmsJfygJqfZkbBP+3pHbF/+mY0lvxncic7mJyC8Lzv0QWtZYhYhgoHMeGpmVTTTDEEXlhn+atMa0iaJPVyZY2bytDBlTc3yeOD/6GeCNwKvyNjXWWl1OsEL18tdbPLAccV6kp2Mb4FkXZ32GmMthLDmNFRpFY19nHKKay2MY0n6xxiozBfN0aatTXq3xWMn1L4ZmCo9E6ZbkfoyKdgdSUppFqrFiH3MEaeR5EhWhfp6eLlhopm21c4LLat16JMxsOZTPuyN6KhasCRRvxq1JV/RxpNG24ailI5/UbU6wrsltl/GdNJEGS0Dh9TlUNG+MMn6M+P0HRNc4gjQqWhb0WIzKAvMxPVmwzGwt2k7y8RBivIXWzyHuCTgE1ftdGO1vSbBWIc1zjSP1QUaQLlSfRLwWkHJbxOOdoLzmDyrh9V3iJ4LPFfd49cu3tZjZ8qT8gaNJBWsYKfHrXFSlAhKwmrCAZejUBHEewYE+i/LoVB6OAhS/BX7r7i8Ef2AVxGPX4xEaRL8AnO/uM3L7h5CaeRMprvIjSUuLxpHy+A0n1YZl9ZlZkjXDYNJIXxNRMXX4vbP77xMk/Hn/eDRpziw28eZE7w36vC9E+4aRRkZnU2n0nEPa9NkudCWNtS/qnSrDW8BV4Zjx7r6uu5+a8R6ERri/oMHdXWaxqCN2Rxrl1mj/SNLSnTgiVsYHMZZUY42kknTOWjjKvttYQw0hFYgmytv5PwzTTT6Nevksej6OQMbVFC+TCsQEyk3BuNFzNpVE9lxarj1tE7rSTfh/uf8dNS/egm6eh1oR7XsErYpLUv9RnZ2C4OQfQIVQ54XokLKQsUff3UjKi3RjwRqNpspkWKrkGFAdZ8xbEmuRJtKGxYlIAHZAEcPYhC3TWEuYWa9cRHNayXtl581jGGl1xmwqGnkOYexrrdBpgmVmX0YFtr9HJsZ09GFPAi4OlGdtwdWoRnBzuqBgBZ9hMHKaF0NmzeutSQ+EroAD0QiljAP/XFLtNJKUrCU2y0aSFtYOD/wleYymKEgrkvo8oHb+/HsMJo3ANZFWj2+Brv9U9Lv1ja61oLHMbCMkhFOpCNNSpFUXE0kr8oehUH0es6kEWuYgIa0ZOkWwQuHoKSgheETuqTOBy6oQKtz9fTO7CjjJzH5VUgHdoQim0zrIzPk0mkMVO/BzzOwVpEFeCY//IpMoq2/bCZUS5XExqkSPc31N5LSRmY0gvcmGU5kdtuDQko/QRDF4sQSR0AY/KfbpBpNq0iZSjZQRivZC7S4HU+SMH03geTfNtboWCV7+3phGrlsiYDbp5NChpOmErC0JtFDV1C3qLI11JmmWHURvdkzox7oIODcwl7YW56A2/b0Q5XKHI7TCHIkGareUze+LVuCpbXiLWYj64ABSwRpJMQIYRwQB/hnlvSD1uUClUXmhGUZ54jW+h5pI/ZW33D0OHmyENPeR7v5imHxyWu750cArIeGclanl2W5BGis2+56JNGh27fFn7JvbN4caWzkdHrwIX+BOLRy2BOo6fsnMzjOzmBikFO7+MKJH+46ZTW3PdbYVZjbAzL6Oko0/oGWhqhY/CySb40g14EIFK0RPyygNYjMQUk00jJTZdixpQGECadChLJq4LOqbO9PMxqPyprxPtxjScnegxtafkvaLFcY7mdlklPiNMZD0Xt+cSunTILpzVDDUjMUsQAvDAGQiPG5mt5vZZ4P5sTAcgr7IW1pxbE0QTJUZyF+ohky0tXgXTeAACVHc8zSZYiftBIoBgJFEwhG+o9bMoxoevxYJVhymLxOsghkY0gUrIGEBlRe94+55f2kQuvHfQDyS00n9tAkUF4CMtiFGvzwLcMCdVAhlJtF6DpVWoaM11v+hqF012BKFf582s72aExrX9L5j0Iq4bpXv1WqEpHYZ3VY9cHIuQdpUEnBYilRj5QMVZTmspYi0jpmtRGrONaexFnRqh99kYL7YNvBrxPfZsSjocF3Y/gy5kicz2xKNN70J+Gww/6aT01ihsv/FyOzrS0oKW0YCC/Kxsu+mTMu1Cx0mWCFg8Y0WD2wZSyP2p7+Z2cbNHHMeMiF+Y2YTmzmmXQim3zeQUxyTotQDr6EJlxmmhpaQPEZEbfMTSQUr1k5rk954ZSVIZZ3JYyiG7suGgI8kd7MH7X4kcFAubL4S8K4J3wZ+Axzq7sfljlma4jTIqaQRzziyCApcxIP0FhwbBHQs5bWMVaMjNdaPSUOe7cGawF1mdp1VpvgBCxh4Po9WpZtNvOE1gZn1MbNDkE1+CrX9TAvDCVFN3Md5jRXM7Dj8Pp5ixUETqZnWm/IayzLBiveNpdgyUmYGNlEMepyK/MQnwnVvh0y4QSjXtRWwmrsvqD8MGvTtaNGYRtqpXBaMa246zerhPpmAoqJxdLFd6BDBMrN10ESSemAn4AkzOyPfUxPaAbZDDW3/MI0bqhpmNszMvoraG84lJeKvJ54hVxMYfJSYY30v0pt6aESpPZJ0hNEQUo01nHLBirXRsKh2MNZgkGv9MLNtUD7sxLA9ETHYzkTBi7uBTdw9/mynkwYuRpFWU/Qlje611E2emYE17TrvKI11Ci3XALYHfVHH8TNmdlRQ77j7k6j8Zzhwo5ndYGZtohQ2s+XN7Bfopj2D6n3E9uDHUev7WMpZh2JhiL/zkaQ30OqkgrUmabX7UFLNFuem+lGusV4MEbvLkAmY5cM2RmbfucAS7n5yTKsQCGQ2Iw1cDCMdFN6XNJgSRzczXzD7/iahXF+cDmgX6p7HCjZ1c75QrTEC5UK+bGbHuftv3f1WM1sf5cW2B7Y3s4dRqdRf0Er4fpYfCf1KqyBeiF2ojnejOcxHDXfPIn/lPSoTON6L9vVG7RhNpCtzGVnLKqQ3fllfVIxBJa9bG31fecyNckiQshT3pVywHkJF09fmaenc/SpUA7owfB59jjjpO5x0UHh8PVA+9WY4lSqSScD9tW6Q7YgEcd2Gey0E01Dg4u/IN7nRzFZHSduvIbNjNXL1iWb2CXKyh1M7Tf46ihg+EP7OKGlPT2BiFboVCeA80hu/LFiyBDkn3dIRSVCeWxtIWuI0gZz2C0nvshU91lh9S841Ejgafa/H0gaEvNuhYbNs5FDMKlUmWGWL0GJUtPQy1Ni/gjoLlpntjSoEOgtrAr83s/8HfN/dTzGzMxCfxuHIDMrMpX60L6n7HjJNHiIIUwj9V4NzEJFLlmKITbVxpCbdoOi4MaQ3eZnGGhWZmQCzo9b64aT+FaQ3cj9SH2sUGja+bkl6oCXsgcLs75BWkHhgWY6vJzb9Vi85r1FZOLZA5mhNUW+NVdVY0zpgdTRW6GFUn3aZu18aaAA2D48tUKCjNXgL2fKPZI8Sh7sqmNkxqNdqd7SS9i65IceSjuVZnKJmG0259oiFqIxbJC5dSiKCwWeKNWJfigSfWb3kvlkUsLUI2urbKEWzWonwl5lua6BUSx6rkVbA9wL+Eyp6yvq32o26CZaZrY0+VFfCaojM8xEzOwG43t1/hQaVYxpm9ymkEYaGRy90o81EK+fDqI2l5tyFZrYTEvwd3f3mIPhlyc1x5IZrm9mKKCGeF6wxpObbq+4em1QxFTSkJUhlEcFVSNmZhhMEKwjGFch/uY62Yw90f/4MlYjFKAuG3ecahJjHFFJ/0VCFylZhu1rLolnUU2Md2vIhnYZVUdb/0SBg17nwLGkbQofAzHZBkxIPdveM6nkE5YIVU0ZnNXOxYMUaqzC7N0THyioVyjRWawRrHeCMUG1xOQrlH1/6GeKCAAASQElEQVRy/QtFTlsdgXzMuBUmu/xNgCXd/ZKwbzpwe3TcHFIfNROsryNro6Wh821GXcLtISH7+Xqcu8ZYGUWrnjKz42qZSG4LzOz/CGFnd/9l7qnhlCdv4+kh4xExS35fc6ZgHlMoUjGvjrRcrOmGlVzHcFLBmh5KjE5C/u1eVWr2rwFPuvstyD8rq75fBTXC5n2oFUuOm03aOgP6jBtTpymf9cpjdWRFQi0wHbFDvWhmt5jZ7qGSoe4IwZSvohU+npCyMI2VN9fGAz+PjilorKCJ4hKouHP4JzSfHI6bHF8lFazZZrY7Gja4UzU9ccGF+BYVJuRliHwkM8t84sUomnlxlzCouDYWrLdQf9xsiiNWa4aaC5ap27UaFtuugF6IHuxq4FUz27eeb2Zm30EFqBmPeBykaE6wyjRWnNOJW9tHkvolC6ouQlXEKsjfjBfFMsGaQipYTSjZu1tbgxXhGoah7/4nuWr04QTBMrNeZnYYanoEONXd8yH3Mr+rt6cD3bdFpVWXRmViNUNNBSvY1j9r8cDugRHApWZ2bUgw1wzhBjmOIFTu/hyKTsV1bcOJKiBC4e0AihXp40kjX6MpOuUjSUPRQ4B3TOxOZyGyngeBz5ZcR6zFlqc4JXIcyn8d7O63UR0uQMKRH8M0CXjO1Mf3d6SZh6Gk+QL/Ldx7rTU7VwiPug17r7XGOojyvEF3xs7AvWb2sJkdaOKuqBohgncvcpw3CzWNoBsoXnHjifWgKu/no0qBMsHyKBc1EvmTeQxG98DPUIT0D6hyYl1T526GQaQVFYMIGstEHnofcIS7tzknZGZ9QxBpN+CK6LqXQHO7/oBSAwcjrvpfl7DklmmfsrD8cOAOd68bN0rNBMvMmgjFlT0Uq6IV9RUz+6mZTW/rCUwjX+9ADX5/igpYm0jpzBKNhQTr5GjfgBJ/JhbSJtIkay/gOGA5KlUor4T9+Xab/5W0u/cBZgZ/56/Ad909Jg9tESEf9hhK2P8JLWJLmtlOZvYg8oX+h7T7CkioPkXKYTGYtJsZogbGcJ/uT+qT1hS11FgnUp7Z72kYjvqJnjKzm0JLQ4sI/tQhqPnyZtJh23M8nU9VprGmk6NxNvHyFXydUOUf+2tl+yYijfD5HL9FpkHzDLPNkc3sAVwPHOjul5cc0xqsj0rQhiKBuQWlPM5BbE+ruPuW7n5L0NJfRvftg9F54sHgGWLz8Bik3auZFNpq1CSPFfqhDqrFuboRDPki25jZZcB33D2Zdhh8g6+jfNGG7j7bzNaj2N4wllSAoNy32QxVT2R+yHjSJr2lKeccXDBxw8yWQVpqbw/EpwFl/UuFMH0Q5jEocbu9u8eMua2Gu19tZvehZG026+r+4HcWEAqkv4hSC7HZN5goBxm0U74SZBzSjLvXuug2Rq0SxEfRtVh1OxK9kGmxl5n9Ba2EN6IAw6loRb4f0WFnPsGqFCvWmyurKfhJZrYpqiHMJ2snkvpXS5P2azURQvQh9H4FcJG7x2NlM0qw/CzgBTWBoQzoyvC5t3P3/GyuqhBYoy5oxaHfQ1qpLIk/nLQLYCJF3/BbwGPufhN1RruFwTQkrq5h6W6CfmjVPRv5MnejEPgSqOUhr1VWpdguPonyspoFPljw6bLhD/kE7tSS1y5FucZ6P4S0f4NM0aNL3nMo8qnyGvQ5MxtjZiehyNwsFHhpt1C1Fma2KkocH0bU9BgqSE6lXLCyJssVUeDj23W/WGqjZb5G90oGdwSuBFZ09x+ENpF1KQrSUhSrwJvTWB+ZcABqPcn8njxN2FRSwRpXcr4m5Ms8hMqEtivprwL5dU9H+7YJ59sa2NXd13P32MepG4IPegEqPbuRNNI3BBhXkq8aiSj0hqIStvvd/U91v2CqNAVD8+LewD6kLK2LMmagFf97HggqQ2/V8Cg0PD+y8SciTRBjHKLpihtFL879P5VUsJpK9o1EEckrUa4pmf0brvVrqBN7c6SBt0ZNl/sQaipLrrPe+B6idtsubC8fPT+QcsKY8SjF8Cv0PX2hPpdXAndv1QOtZAegH3o+WjUaDz3uQYEJgL9E39s6wNW57SHAldExv0JTVLLtzVHkcV7Jez0QvfY2VF2Q33dVtP1ZVOv37RZ+412i97qL0MHb2vuk1g8UefwY2CBsDwX+Fh0zDTir5LXnobrFOajEqsOue6EaK/hPO1JpUS/r0ARFvGahla030oR9STtMexrmolDzZbCgJCeuAl8R3fwZppL6AmMI0T8zOxrlqZoz02PC074l2ueDcK6B6MZaFZG0xO8b40n0e88CnvO0xaRDYSIhuhj4srtnXb5jSSnOBlLO5jsKKYP9PQ3S1BWlgmVmuwFfQiZIRmM8HzX13YOIPV4Oj1e8mc5QE5fgsigBuRxK8k2u4fV3Bh5BOZY/A1/IhCpgDdJC2qWRY51hKqnZ0g84xDSBZWF5sdfJdbsupIxnnJmdiGrizgS+1hoTzt3/WXJtnYJw79wA3ODuedN3DGmz5iCi78E0EGJd4EavPsdWNRYIVviRtkah883D7jeRmXILaiJrU2u1q5DyJcS9nXHfZZGdTmnRaCM+RBG9fyCB2srdd86etMAGlcNaKPmbx5teKVsCCdZfQk5lZ+BzwAZozlRLuMyLAYfxFLkpJqM+uM8if+Ts6KbsFjBxbNyIgjWx1hxDml4YSE7YTFzwtyHt1powfs3RJ1zI3sB3UbTqExRBuQy4xYsTJ9oFV07mR2b2Y9SvcygK1XeF2cFzUDj7Zyg0/nXg5+6e5X4GAZtmB5vZyqQm3TQ0RC2Pp0Lj3hT0/W6F/IZ1aHtU9s5oeypqddkMJT63p/hdPkA3Q1jgr0T5tPNJudjHkFZNDKRiSi9Ppa5wC3e/s57X2xz6mNnBKOl4HsoP/D27meqFYJbMAGaY2enIp4grqjsafVGkc2+0Is5BdYGvolzIahTzJ9sRzLKQRxmAFqq1QxJ1BeRfrYBuhub809bgGZQYfTC83wQ0BmcP1Jf0zWZe1+0EC40oWgdp8GNI6/+WIuUTHIQWmC8js/t+YE9PyWY6Dp0V7SmJ4GyKhK2zI3wtPV5FydVsey71jZK+RmCbAi5FVQeted2bnf2bVnEP7BC+21XC9q3AptExtwBTo337I2Gbj8qsOi2KueCaOvsCoi/IEFXyO628eRqP5h83dfbv2cbffpWwiGyQ2/cginrmj3sJ6J/bnoSS3u8jEp5O/yzu3rXq+1y4knQIWQNtR7f5/sxsPxRN3d8rYXWAZz3n44cescEe6ieDb/kQyg2u6+7Xd9xVLxxdSrAyuIguN0Z00d7Jl9NdUde2iFrAzIaa2aXAJcB/3P3W3HMTSSssRgP/NbM1zewmVElyN7C2i6e/y6CzZhC3iLBSHW1md6IIZb1Gj/ZEzHD3mOu8SyFwbJyPCGH2othYCSqViwlB30OR1xnI1/ysV6jiuhS6pMbKw1XivyrpFIkGmkebO3k7EoHv42YUvVsWpTkGR4dl+zOOkINRGmQu4rpYoasKFXQDwQJwJZo3Rrm2sukRDVTwIYHZt6shcFscjsLoB7v759z9HZSSiJtEl0U5wOMRW++P0GSS5V1dA2Uknl0HnR09qSJ6tBZqa+jsqFtXfVzS2b9RM7/bTqhrehaaAJN/7gvAp3Lbo1C1/3xEvLMPuUhgd3h0C42Vh7vPQFHDmPy+AWGamV1sZl+phvCm1jCzdczsbpSDOx118cZD5FZEQwq2MrOLUKPov4CV3X0Dd7/cUz6Qro3Olux2roJfQqZhZ2uJrvx4HhUN7wAM6cDfZkXkIzkaRDE+7D8XmJI7bjBqT/kwHHsXsFZn31vt/vydfQE1+AG3RsnBzr6Bu8JjTgvPf4LqDY8D1gP61eH32AoNJpiLWmgOiZ6/BXU4fBlVVsxGBQHXImKaTr+nGoJV+bFWQvV9nX1jd+bjERSyPg0lWx9FBcFPU9EG8WMWygP9GNU+NlX5/S+G+p4eR71Sl6Fw+SlBiAagBfCniFTTw9/rUStR71reD13hYeGL6fYILRz7oXGcnTGAuzPxAbCGN8PsGoqExyNOwuloysoq4e+Q6PCnUMDgHuA2T+dN5c+bVenvgQqNZyMBehT5wRciU3Q9pMH+iDTm/Wh8Ts06J7oaeoxgZQjUXqegvq9FBXu5BmW3CUHglkBCtgryi5ZCC9MQpFluBj7nEY+faeTPQ82cei7i3HgGCeptwJ+9q4fIa4geJ1gZwmr6C8Q315PxO881X9YKgZZhSVTp8LK7/7XkmAnI5GtC2moWYnN6oSdro9agxwoWLKBa/jbqWO6J/BvvooRps+ZaA52DbpfHagvc/R13Pwpl8X+FTJuegnnAYQ2h6pro0RorhpmtgfyvzTr7WtqJV1GHbDxxo4EugroIViCjXw45sXNRfqXs/2y7movIaNZa+xgIPOPu/w6V1SezcEakropbETtUPCe4gS6EegnWN+mas7IW+CSBtGQ7NCUlY3vtypiL/MVTfFEyM7op6iVYfybHaFRnzEYC8y6aE/Vu9HgbzXz6L3CPp/zeWVPdF1GSsyvyHjqwh7v/usUjG+gSqLlgmdkAdIMv1sqXOGIgmtnCIxaYmcC7XsPizEBTthtKMq9aq/O2E8+j2Vt1me7eQH1QD8FaHBV8vo84t2dHf/P/f4SEIyHo70wEM/EbwAl0Xpj+XlQCdH1X+34aaBn1EKwd0JDnLWp64k6AmS2JmGp3Qn1gZSNDa4lHUUX4Nd7JvOkNtA/1EKyd0LTADdz9kZqevBMRqgx2REK2CbXjC3FU8vNNd3+4pYMb6B5ot2CF2rxNEN/7pohcsg/wLXc/qZXnmIiqnAeispiPgefLymi6AgLh/rYomrg6KmxtTbLd0dCB+8LjEeDpuA6vge6Pdq26YXD1ZaiVOkbZtMD8a/sgfvRdEefB31Dh5ghEezXNzP6JRo/+0jUZsUvA3WcCl4dHxuu+MipiHY4KWAeHv2+i1o2ngX96nem7G+gaaK85cyzlQgUpndUChBvxt6jl4CzgM3HCM2ixzYBDgMPNbO2uJFx5uPuHqBXi/s6+lga6BtplCprZEsicGVry9JvAhLjKOcyD/RNqftve3Z9v4T3GINqru91916ovtoEGOhDtKsINQnFKM0+PpjwX9GnU87NeS0IV3uMNNO18FzP7arXX2kADHYlaVLefh4INZXi7ZN8GaFRQUgHRHNz9BuTPHB1yTA000KXR7pvUNa3wt808HVMEg+YelU2IbwnnIb9tqype20ADHYparf7NCVah7i4Mm16V6gTrflTzd1gIfjTQQJdFrZKctyFCk5h/ewphCmHAOuE9m+NKaBbuPt/Mbkasqe+Y2f1oVtL7aFriMBTqHp77fwCiJ97B3WMK4wYaqBtqIlju/rGZ/QHYPXpqUrS9HvCWa0xPNbgJCVY/lJQuw8tout9jSNifawhVAx2NWo7x+S2pYI2NtoeRDmtuC17O/T8HVTE8QmWq/T/cvSxg0kADHYpaCtaNaNTl4rl9sWD1QoOYq0XmE2YT7Rda3dFAA52FmoWuA2fcT6LdY6JtI/XD2oKsuvzVhlA10JVR65zQpYg9KEOZxhpgZktVef7sehut6Q10adRUsEJxaj53FQtWVsW9XpVvkQVDnq3y9Q000CGoRxXD2bn/Rwca4wwZt/g2VZ57J1Tl8Y8qX99AAx2CegjW1bn/+6I2kAxPh7+7m1k8EX2hMLOlUQ/U/Ys6fXEDXR/1EKwsf5QhH8DIBKsXcGogb2kRoWIjm7D+u1pcZAMN1BM1F6xAfPK33K7RuefepTImcxvgGjNbKJuTma2LfKpPhV3X1+xiG2igTqhXpXi+4S9mOfoiSu4C7Azca2ZfNLNh+YPMbLyZ/RDlx8aF3X9395fqccENNFBLdIRgFZLQ7v4P4Ae5XWsAFwGvm9m/zexFM3sDjYP5FsUO5Yvqc7kNNFBb1LLyIo88O1PZe/wIzVT6CpWk72KoAbIMHwIHVzNcrYEGOgP10livUml+TATL3ee6+5GImen1Fs71L2DdhlA10J1QF8EKpP1Z232zWtHdb0VTSY4Cnoye/gfwHWAtd3+8HtfZQAP1Qr1MQVAkb7mW3iNUa/wU+GkYzzkfmOPu79fx2hpooK6op2A919b3aMx8aqCnoJ7ELPeEv/UU3gYa6JKop2D9KfxtCFYDixzqJljBd/oQ6F+v92igga6KenP0PUnXnJDYQAN1Rb3NtDMQz0UDDSxS+P/SuwD4nierXwAAAABJRU5ErkJggg==" />
-		<h1>Bismark Processing Report</h1>
-		<div class="subtitle">
-			<h3>{{filename}}</h3>
-			<p>Data processed at {{time}} on {{date}}</p>
-		</div>
-	</div>
-	<hr>
-	
-	<h2>Alignment</h2>
-	<table class="data">
-		<tbody>
-			<tr>
-				<th>{{sequences_analysed_in_total}}</th>
-				<td>{{total_sequences_alignments}}</td>
-			</tr>
-		</tbody>
-		<tbody>
-			<tr>
-				<th>{{unique_seqs_text}}</th>
-				<td>{{unique_seqs}}</td>
-			</tr>
-			<tr>
-				<th>{{no_alignments_text}}</th>
-				<td>{{no_alignments}}</td>
-			</tr>
-			<tr>
-				<th>{{multiple_alignments_text}}</th>
-				<td>{{multiple_alignments}}</td>
-			</tr>
-			<tr>
-				<th>Genomic sequence context not extractable (edges of chromosomes)</th>
-				<td>{{no_genomic}}</td>
-			</tr>
-		</tbody>
-	</table>
-	<div id="alignment" class="plot"></div>
-
-	<hr>
-	
-	
-	<h2>Cytosine Methylation</h2>
-	<table class="data">
-		<tbody>
-			<tr>
-				<th>Total C's analysed</th>
-				<td>{{total_C_count}}</td>
-			</tr>
-		</tbody>
-		<tbody>
-			<tr>
-				<th>Methylated C's in CpG context</th>
-				<td>{{meth_CpG}}</td>
-			</tr>
-			<tr>
-				<th>Methylated C's in CHG context</th>
-				<td>{{meth_CHG}}</td>
-			</tr>
-			<tr>
-				<th>Methylated C's in CHH context</th>
-				<td>{{meth_CHH}}</td>
-			</tr>
-			{{meth_unknown}}
-		</tbody>
-		<tbody>
-			<tr>
-				<th>Unmethylated C's in CpG context</th>
-				<td>{{unmeth_CpG}}</td>
-			</tr>
-			<tr>
-				<th>Unmethylated C's in CHG context</th>
-				<td>{{unmeth_CHG}}</td>
-			</tr>
-			<tr>
-				<th>Unmethylated C's in CHH context</th>
-				<td>{{unmeth_CHH}}</td>
-			</tr>
-			{{unmeth_unknown}}	
-		</tbody>
-		<tbody>
-			<tr>
-				<th>Percentage methylation (CpG context)</th>	
-				<td>{{perc_CpG}}%</td>
-			</tr>
-			<tr>
-				<th>Percentage methylation (CHG context)</th>
-				<td>{{perc_CHG}}%</td>
-			</tr>
-			<tr>
-				<th>Percentage methylation (CHH context)</th>
-				<td>{{perc_CHH}}%</td>
-			</tr>
-			{{perc_unknown}}	
-		</tbody>
-	</table>
-	<div id="methylation_context" class="plot"></div>
-	
-	<hr>
-
-	<h2>Alignment to Individual Bisulfite Strands</h2>
-	<table class="data">
-		<tbody>
-			<tr>
-				<th>OT</th>
-				<td>{{number_OT}}</td>
-				<td>original top strand</td>
-			</tr>
-			<tr>
-				<th>CTOT</th>
-				<td>{{number_CTOT}}</td>
-				<td>complementary to original top strand</td>
-			</tr>
-			<tr>
-				<th>CTOB</th>
-				<td>{{number_CTOB}}</td>
-				<td>complementary to original bottom strand</td>
-			</tr>
-			<tr>
-				<th>OB</th>
-				<td>{{number_OB}}</td>
-				<td>original bottom strand</td>
-			</tr>
-		</tbody>
-	</table>
-	<div id="alignment_context" class="plot"></div>
-
-	<hr>
-	
-	{{start_deletion_duplication}}
-
-	<h2>Deduplication</h2>
-	<table class="data">
-		<tbody>
-			<tr>
-				<th>Alignments analysed</th>
-				<td>{{seqs_total_duplicates}}</td>
-			</tr>
-			<tr>
-				<th>Unique alignments</th>
-				<td>{{unique_alignments_duplicates}}</td>
-			</tr>
-			<tr>
-				<th>Duplicates removed</th>
-				<td>{{duplicate_alignments_duplicates}}</td>
-			</tr>
-		</tbody>
-		<tbody>
-			<tr>
-				<td colspan="2" style="text-align:left;">Duplicated alignments were found at <strong>{{different_positions_duplicates}}</strong> different positions</td>
-			</tr>
-		</tbody>
-	</table>
-	<div id="deduplication_plot" class="plot"></div>
-	<hr>
-
-	{{end_deletion_duplication}}
-	
-	{{start_deletion_splitting}}
-	
-	<h2>Cytosine Methylation after Extraction</h2>
-	<table class="data">
-		<tbody>
-			<tr>
-				<th>Total C's analysed</th>
-				<td>{{total_C_count_splitting}}</td>
-			</tr>
-		</tbody>
-		<tbody>
-			<tr>
-				<th>Methylated C's in CpG context</th>
-				<td>{{meth_CpG_splitting}}</td>
-			</tr>
-			<tr>
-				<th>Methylated C's in CHG context</th>
-				<td>{{meth_CHG_splitting}}</td>
-			</tr>
-			<tr>
-				<th>Methylated C's in CHH context</th>
-				<td>{{meth_CHH_splitting}}</td>
-			</tr>
-			{{meth_unknown_splitting}}	
-		</tbody>
-		<tbody>
-			<tr>
-				<th>Unmethylated C's in CpG context</th>
-				<td>{{unmeth_CpG_splitting}}</td>
-			</tr>
-			<tr>
-				<th>Unmethylated C's in CHG context</th>
-				<td>{{unmeth_CHG_splitting}}</td>
-			</tr>
-			<tr>
-				<th>Unmethylated C's in CHH context</th>
-				<td>{{unmeth_CHH_splitting}}</td>
-			</tr>
-			{{unmeth_unknown_splitting}}
-		</tbody>
-		<tbody>
-			<tr>
-				<th>Percentage methylation (CpG context)</th>
-				<td>{{perc_CpG_splitting}}%</td>
-			</tr>
-			<tr>
-				<th>Percentage methylation (CHG context)</th>
-				<td>{{perc_CHG_splitting}}%</td>
-			</tr>
-			<tr>
-				<th>Percentage methylation (CHH context)</th>
-				<td>{{perc_CHH_splitting}}%</td>
-			</tr>
-			{{perc_unknown_splitting}}
-		</tbody>
-	</table>
-	<div id="dedup_methylation_context" class="plot"></div>
-	<hr>
-
-	{{end_deletion_splitting}}
-	
-	{{start_deletion_nucleotide_coverage}}
-
-	<h2>Nucleotide Coverage</h2>
-	<table class="data" id="nucleotide_coverage_table">
-		<thead>
-			<tr><th>Nucleotide Class</th> <th>Counts Sample</th> <th>Counts Genome</th><th>% in Sample</th> <th>% in Genome</th> <th>fold coverage</th></thead>
-		<tbody>
-		  <tr><th>A</th>	<td>{{nuc_A_counts_obs}}</td> <td>{{nuc_A_counts_exp}}</td> <td>{{nuc_A_p_obs}}</td>  <td>{{nuc_A_p_exp}}</td>	<td>{{nuc_A_coverage}}</td></tr>
-		  <tr><th>T</th>	<td>{{nuc_T_counts_obs}}</td> <td>{{nuc_T_counts_exp}}</td> <td>{{nuc_T_p_obs}}</td>  <td>{{nuc_T_p_exp}}</td>  <td>{{nuc_T_coverage}}</td></tr>
-		  <tr><th>C</th>	<td>{{nuc_C_counts_obs}}</td> <td>{{nuc_C_counts_exp}}</td> <td>{{nuc_C_p_obs}}</td>  <td>{{nuc_C_p_exp}}</td>  <td>{{nuc_C_coverage}}</td></tr>
-		  <tr><th>G</th>	<td>{{nuc_G_counts_obs}}</td> <td>{{nuc_G_counts_exp}}</td> <td>{{nuc_G_p_obs}}</td>  <td>{{nuc_G_p_exp}}</td>	<td>{{nuc_G_coverage}}</td></tr>
-	          </tbody><tbody>
-		  <tr><th>AC</th>	<td>{{nuc_AC_counts_obs}}</td> <td>{{nuc_AC_counts_exp}}</td> <td>{{nuc_AC_p_obs}}</td> <td>{{nuc_AC_p_exp}}</td> <td>{{nuc_AC_coverage}}</tr>
-		  <tr><th>CA</th>	<td>{{nuc_CA_counts_obs}}</td> <td>{{nuc_CA_counts_exp}}</td> <td>{{nuc_CA_p_obs}}</td> <td>{{nuc_CA_p_exp}}</td> <td>{{nuc_CA_coverage}}</tr>
-		  <tr><th>TC</th>	<td>{{nuc_TC_counts_obs}}</td> <td>{{nuc_TC_counts_exp}}</td> <td>{{nuc_TC_p_obs}}</td> <td>{{nuc_TC_p_exp}}</td> <td>{{nuc_TC_coverage}}</tr>
-		  <tr><th>CT</th>	<td>{{nuc_CT_counts_obs}}</td> <td>{{nuc_CT_counts_exp}}</td> <td>{{nuc_CT_p_obs}}</td> <td>{{nuc_CT_p_exp}}</td> <td>{{nuc_CT_coverage}}</tr>
-		  <tr><th>CC</th>	<td>{{nuc_CC_counts_obs}}</td> <td>{{nuc_CC_counts_exp}}</td> <td>{{nuc_CC_p_obs}}</td> <td>{{nuc_CC_p_exp}}</td> <td>{{nuc_CC_coverage}}</tr>
-		  <tr><th>CG</th>	<td>{{nuc_CG_counts_obs}}</td> <td>{{nuc_CG_counts_exp}}</td> <td>{{nuc_CG_p_obs}}</td> <td>{{nuc_CG_p_exp}}</td> <td>{{nuc_CG_coverage}}</tr>
-		  <tr><th>GC</th>	<td>{{nuc_GC_counts_obs}}</td> <td>{{nuc_GC_counts_exp}}</td> <td>{{nuc_GC_p_obs}}</td> <td>{{nuc_GC_p_exp}}</td> <td>{{nuc_GC_coverage}}</tr>
-		  <tr><th>GG</th>	<td>{{nuc_GG_counts_obs}}</td> <td>{{nuc_GG_counts_exp}}</td> <td>{{nuc_GG_p_obs}}</td> <td>{{nuc_GG_p_exp}}</td> <td>{{nuc_GG_coverage}}</tr>
-		  <tr><th>AG</th>	<td>{{nuc_AG_counts_obs}}</td> <td>{{nuc_AG_counts_exp}}</td> <td>{{nuc_AG_p_obs}}</td> <td>{{nuc_AG_p_exp}}</td> <td>{{nuc_AG_coverage}}</tr>
-		  <tr><th>GA</th>	<td>{{nuc_GA_counts_obs}}</td> <td>{{nuc_GA_counts_exp}}</td> <td>{{nuc_GA_p_obs}}</td> <td>{{nuc_GA_p_exp}}</td> <td>{{nuc_GA_coverage}}</tr>
-		  <tr><th>TG</th>	<td>{{nuc_TG_counts_obs}}</td> <td>{{nuc_TG_counts_exp}}</td> <td>{{nuc_TG_p_obs}}</td> <td>{{nuc_TG_p_exp}}</td> <td>{{nuc_TG_coverage}}</tr>
-		  <tr><th>GT</th>	<td>{{nuc_GT_counts_obs}}</td> <td>{{nuc_GT_counts_exp}}</td> <td>{{nuc_GT_p_obs}}</td> <td>{{nuc_GT_p_exp}}</td> <td>{{nuc_GT_coverage}}</tr>
-		  <tr><th>TT</th>	<td>{{nuc_TT_counts_obs}}</td> <td>{{nuc_TT_counts_exp}}</td> <td>{{nuc_TT_p_obs}}</td> <td>{{nuc_TT_p_exp}}</td> <td>{{nuc_TT_coverage}}</tr>	
-		  <tr><th>TA</th>	<td>{{nuc_TA_counts_obs}}</td> <td>{{nuc_TA_counts_exp}}</td> <td>{{nuc_TA_p_obs}}</td> <td>{{nuc_TA_p_exp}}</td> <td>{{nuc_TA_coverage}}</tr>
-		  <tr><th>AT</th>	<td>{{nuc_AT_counts_obs}}</td> <td>{{nuc_AT_counts_exp}}</td> <td>{{nuc_AT_p_obs}}</td> <td>{{nuc_AT_p_exp}}</td> <td>{{nuc_AT_coverage}}</tr>
-		  <tr><th>AA</th>	<td>{{nuc_AA_counts_obs}}</td> <td>{{nuc_AA_counts_exp}}</td> <td>{{nuc_AA_p_obs}}</td> <td>{{nuc_AA_p_exp}}</td> <td>{{nuc_AA_coverage}}</tr>
-		</tbody>
-	</table>
-	<div id="nucleotide_coverage" class="plot" style="height: 600px;"></div>
-	<hr>
-	{{end_deletion_nucleotide_coverage}}
-
-	{{start_deletion_mbias}}
-
-	
-	<h2>M-Bias Plot</h2>
-	<div id="m_bias_1" class="fullWidth_plot"></div>
-	
-	{{start_deletion_mbias_2}}
-
-	<p>&nbsp;</p>
-	<div id="m_bias_2" class="fullWidth_plot"></div>
-	<hr>
-
-	{{end_deletion_mbias_2}}	
-
-	{{end_deletion_mbias}}	
-	
-	<footer>
-		<a style="float:right;" href="http://www.bioinformatics.babraham.ac.uk/"><img alt="Babraham Bioinformatics" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABHCAYAAABCvgiTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAJ5pJREFUeNrsnXeYXVW5xn/vPmX6ZIIhgUAKIRAChFBiKAIiSBCQqtIRVOCC7VquogJS1KuiqFzFiyJ2EQVRVC5VqSogUqXHkECAITGFydTTvvvHWvucffYpc2YmwaiznuckM3N2WeV7v76+JTNjvI238Va9BeNTMN7G2zhAxtt4GwfIeBtv4wAZb+PtNWzJkVw8bedTQNW/E8Ko/LqqE0CV15sBstIFNVstp4JGPHgRebkUebqhyPNcP42yoQgw+YdYgNEiqQVoBmsBTTSsU6gDaANa3Xc0AQnDEkIB5c/MY5ZH5EBDBgNAv6APbB2mHhOvCgaBIdz3g0DOMN/R0sy6YcXm1Fy3w3EHAwOseee7WHf4wfBcH+Qyfmz4OfGrZLWmuM6ahfMaTpwUXWz/ntLcx9fCPdoiROKf0QiZhPMRvrfYh+iN1WnJjpo4OoCMNwS0AJsBUxFTBJOALRFb+L93gdqAdv+/Bw3pqvBUfFmL0MwIMh4AA6ABFIKFfmAdsAJ4BegGVgJr/P+vAKuB3PiSvYYS5N+sdQDTge2BGaCtJWZhbIKYAEzw1/WDPBGT8Zy92xNnBih4VhXy4ISf97T/NPtPG9Au0eGlTPh9e8PSUMoBa0FrgNWCl4HF/vMy8BywFOgtY5/SuLI9DpC6rcUT/DYeEDO9NEgAWTniXw78GfESsAqjD7MB5TIDwJAlUxmZZYGsKSQ+w8pEhJcPTosI5J6fwiwNShs0IZoFTaagw6RJgsnAFLApoC6wzUGbA1t4UKUjEEniJNqkSnUCgFWIVYJlBo8ATwFPKZNZQibfSbppCsnEJuSyE8nnWzw4nYooWvy7YjSjrGcK/Tjp9qr/uQdY5SVatwMuQ55h/POoDCMJFP6L2SDy6tFUD4ZJ5hZ2NWYrQGskW2NoSOXGiLt5cAgC0b/TAjCj+W9PYglHO1YkzPiMOICYWXEOojq5eX1bCgj6+9BAL1Lg7QlDTjdPGtYuowO0CWKWYVsLTQNmUChsI7PJFgRpRCsKkpZMYkHCjbhM3wewgUJT05rs1GlNQ9O2bstuPq15aOqWFCZsgqWbXN9yWff/yIPKuQhw1nkmsxhsCaaliMcxew6pb2O1Qf6dAZIU1oopieg1I1N8v/kRycrN9dC2zOUY3HoOPfsexOCcHUQub0FfbxVjk5KByzDji16fTJFeupimZc9CMhXHZkkuFe3n4vOalc1OVT67mwWJwwiCtyZ6Xp2YeuUlUqtXoqEBgmzGgSWRxBIJd1ehgPI5KBSwZJJCazvZTTdnaPosMjO2ZmjLmRQ6JkAqBbkc5HPlRFYYrVCwPtBK4DHgQeAhzO5D6h4HyHoHyMhBoog3pez99QBieQpNrbz80QspTJgIAwMJpGYUtHiVbABIYoU8og+CXGmhCrW961bw3Q/ci4KkI0h3cwCkIjbJFCf1bGpE3ZqOMQNpCqKFgrn+5LIOGOt6SHcvJ/3yC6SXLyPdvZxgoL8qUGUFyOdRPk8hlSbfMYGh6bMss8WMdZktpt+VnTpjKYU8wGSkyYUJEzdFmkxmqI1CoRmzMVg0tgb4C8adoNvAHkIMjQPknwkgLe28/KFPU2hp9dxTgdfNmz2xvg7o9LbApt7odu5gSICGgLzXx/MeAOkICEKjvdN/JgKb+Oe1+ec1Zj86tSqDtIZEYgkKniKfW5LsfnHppj/5Vl9y1YpdSSb3B3YKHQIWc4GrUIB8DhUK2UJzy+pCU/M9FOxGpFsslXyhf+fdKTS3tvTNf/3kfEfXDFpbtyKbmUE2O5uC7YiY4cfQ+AI5VSsH9iToRrDrMe5Dyo8DZAwAkZVrNRsMIP95HoXWthAg9TxhHR4wM8GmY5qC2MwDaTMvDdq9oyA9CpabjXjPhryRvBxY5j1WLwBPeN1/HZAjlSaxZhWTv3spyb93QzKVAGZh7AcsMrG3XN9qSBgLzaa1mN0SZIauNnRrvq2tNzNrDpktZpDZYhoDc3eGZFOa3NBEstmdPQj3AHYDpjEy31ke437EtRi/AJaNA2SjBUgHL579OWhrjwBEkM86Hb2mQWuR4CJ4lawJIwXWhTTBSQxzgUVTMyLtVZakj/rlwXIYQ6B+p8ZZD2g1xhpkg05ClVFE+dwlUyRW/53J3/96CJDiIvgZ2Qxpf+AwYD9qgaV8bE9TsGuUy16lbPbJQjrNwNz55KbOYHD6TAZ3WgiZIchmwGwCsBDYCzgImNeoO9u3lcAvge8C940DZJQA0TB3jgogGJZK0bv7G7FUqhQVzmUZmjmbzPTZFFIpSCYdWOoDJOatiS2cRaLN4UKXLX4xkh8ZtEU8aKMGCEhht6YLDka8HXiDl3T12lrgegp2BdnMHxK5DLnOLnoX7sPgVtsxuN1OkAgcWAoGWBJpPrAIOAJsV1CqQT0sA/wa9A3gznGAjBEg8Sc0ApCypxR/LRAMDpZJCbMChZY2lEozMGs7Vh99MoXOLscx8/l/ZoBEFtj2lHQcxpEmpg1jUHji5VIKhXuCwX4KqSYGt9medfssYnDbHZzplhmM3pMG9gaOAw71LvhG3cm/Ar4K/HEcIGMBSJTYojlY/v2qcrOZ1coMidG4EZhBPk++s4vehfuybuG+FCZ0QTbrPFWvJUAU0zUDf39zK1q7hs2+dTHJlS83ChBnf7gvZxocIzgVmDsM2QyCXQV8GeNJMkMoCBjcdgfW7b2Igdlz3bMrpC2zPVBOBrZtkET7gR8Dl4A9Mw6QUQDESotcljNX8YrRAIRS8E/5PMoOke+cyKojT2Jg3m6QSkL/YHkwOQjczckEJNOUslIoZRVmBstjDXJSgETazZmZU1mCpHtHeM3gAKSaioxAPWtRIkH6hedoefJRWv/6F4L+XggSIwVIOOrJoBOBs3BZCPVaN/Blg8tkNhhkhkCib95urD7qZArtnaF9Ep/YzRAnAv/RwDvC9iLYJZguBxv4dwFIl/OAWOA9N3/0EdqNASALzaWEIPSU8xj563M5wBicM4/BWXNYt3BfrLXNSZRUGvWsQUGC9LLFNC37m7NdwmzcgkEqSd/83cl3dvm4iIuZND/xME3PPweJBJZK0rtgH9LLl9K09FksmUKJBKnly8hP6GJw9vakVrxE+x9vR4U8wUA/wdAg+eZmn/2r0QIk7OrmoPcC7/Pu3Hr87VbEh4HHMXNMpK2T1Ued7JiIFcqlSVEg2ubA6UhnAps3SLJ3gH0c9OfXCiCb45LpcpXedpm51OxXfbBs1ABRmQ5dbHuC7vL+/14zWwA8HQUoDWRnjx0gVSFyG3CAH8engc+UD9dQNkOQGaJv7s707H8o2c23pP1Pt9N+/90EVoCBfoKB/sjYhcmll+RbOxiathU9B7wVgM7f3UDzs08QhKnpCsh1TSQYHCDo73eOBeEi5bkcheYWlMuihAOfKYAgcKktsTGZ2cgBUiK8nQ0+JzhkGOP6JdAHgOvAIJsDK9A/bwFrjjqJQluHkyblAAkpbVvgY8B7GoyrvApchNlXNjhApu9y6rXAIsNHNitDdDlcktr9wPeA369HgOwFusffMmTGzrhkuwr1fMMBRLVW5HfA/v7W8zG7qNSv2B2Dg1g6TaG1leSrq7Fkk+uvAs9miADEgYu8QTaDNTW7Zw4NYukmFJSerULOPyMoT2eK2C+K2WDVABIJ0o0GIGAmkz4kuGgY120G+AjYZWb+2dkMhbYOVr3jVAZ3ej0M9FcBSNGJciDi8z6m0oDDi6vBPohYORKAjDQl4HVAh2BS/OOjvJt5g+okM7vFTcBoW1WyLRSDRiUztcK2/Qe0QjUjqQIcgDW5oHrQ30uhqcVx+TCRsFYLAgcOH1+xpuaK663eMzTCPDVpLHNhgq8aHAw8U+e6NPAN4P1FwKabCPr7mPSTb9H86APQ3lmvL7d6pnRxEen1yek4xM3ADiMZzEgBkosRwlJcotlfPTdfG+lRAvgiaJexgST6qfIVG2fZItUjMqlkGI+UcMdGvGNjUSNr9wBvwSUh1kkE1tckHeksIUEqTZAvsOnV36Hzxl84myyoRabWA3Y2cDjG0gb6tItLW2HhhgJItOW9UfZ6YAGwC2bzMftphAklJQ6tQeJjbPYPA0fdtxbVkH+NplEvnIHboHU48HCdCxPA/yJmhERiqSTKZem6+Zd0/u43kKgHEkD8FnEgcFcDkJ/m4zN7NTKKsW6YCvN/wva8N9LeUvJm2Kble5GLbQLwZlx0dopEyqU+22O4NIJX6s6+0QeaiDjc++L7EX/y9kA8/7rFq34ppCGwx1x6B0cIdgV+ADwdMT0WAovAZoK6JK0zeF5wI3BvFTMlChxvObMzsI9XO3udR4U/1Vm6mcBBiHmgybiNWiuAu4Hfep09+tItgK38z68Az/qfd0DM9+rwMj8fobevHTEfYztcQuTjnqgKjUiSUbKjFw07XuI20BY1rtkMuAjslOJcJhJI0HXb9QD0vOmQyB75qm2xB+NlwInD9GkKcA1ODXx0QwIkKLfrhNwusnUlgGhdjICSQscDZ6uqPiiAj+KCUH+oqepJpwjeGQsiGXALcKZX/8I2C7gZlxH7shmHC/uypDcX1QGzpz1xXuBBl6xCJJ9yaiPn1iGnqcDXgPfisnOj6ukl/hlRgpzkjdXTQJtWed6HEDcJ3gXWHUHICcDnPVR/CTrfERmHKZL0KOluw04EdgedC9optMrl8u9/DZyJ1WVI9ZwnjQiTp5A+ClxVR2s5FuOLuMRKxwODBAIm3nQd2c22YGDn3WGgbziP1bv8/+8dpldTQT/G5YK9vCFUrNATUawE4n/YlnDLpxvm7aEnRRKSZgNXRIyll4C/gEUNutnA5QYtNZajQ/BZsG2Bv0XcvfIDvkoubhJtKSCFMRHpCkrgAMh5iXAecLQHRz/oMa8e9EcYyjmCt6qKUi0wibOA//TvWxtjRmdLOiwkNq91vw34ZAQcz7r5KFu0twAfr8JJEt7W2we4HfeseEbwPkK3CF0DzI8JvgA4EvhyQ4qUGrdMop4xb49d48FYqzUhHV60s8IMhyCBpZuYdPV3aHn0z5AaNuE5C3wQuLyBbs7zzCyxIQAiYDtzk76rM4A4DJcP0+qv+R7G72P3PYtxEdBj2HkG+xi2p4tzcHGERc31C1qr38txkmgPM/Yw478inHlPgzOs0mbCF0V4vSf6Rzwx9nr35ReAlw272bBFwEKM3c04HBcJDtuBdeYkBfwK7BAz2w+XKrEqcs1hMQP+GozfAc+Z2bEY4Vy8EafShW1fXyWlmik0xf/+cYNDDTvLsBWR77fDWGnGJ3ExihOjLnKDA01sZXIuqJqfBuSHeddylU8B7NvhOtRoVde7kEigXJZNfvEDgp61ziYZ3j7+MNgvGqDjY4BTNoSKlfDoyzsmobAkDgbdgq8b9kXn9lN552WXALdgPFD6SquBr+BSCiYACcwm1XA7FjyXvi7yt0twiW5H+t+PA75OJGgZWcVnwE5Desgwk3k7SjzoufXzRe7vtIrfGdziVTqAjjqW+H0YJ6Ki1HnEE/tp/vfJsc6sBr3HzFJEIvBmPAtcKXGw/1OrjytU0zHWGRxBeep3p1cHAbLm+n5ThJD75OYvEDSbUz+XjMZVYdG5iKZ1VNyhe+WAWcvVOrEW17FUmuSra+n48928evDbobd3uP4NYpwFzEIM50k9F7gJ46X1rWI1C9rkFq8lMiDhNgptVcP1M2SmB4SKGbWhfWLmOIzV93wNmdkjJdWtiKHrI33YRrBjjcn7LHC3OeO5L+a+flRobRmoXSZrrkbcI97uAPodWygmC66q6wSTLQMtlnxmcYlXW7l/zKyGy3+x4L6St1AIPRn5fiXYn2P3/C0y7lBI0MinzCqLMQqVVOnKj6vb9VyduVtbl+Sbmum86xaaH/sLpNO1HZtGOJqVYGeBDYemrYB3r28JYs5DYi+Ckp5opuA22EwBPiF0kolTimpWeZGBVsT+wDy5+lNTgS2lYr2pei825PoeJSOJp/yiJ4F2g+mCOGHkJT1TVqmqYlja1Rm1bO29RZtLtcBW4ebttcpYSFDDIxyltS29pJkDbCk01cTWI3C5p7z+HZXw4YgK7vvSgGWWqCGdRxwpGeET6lnZj9RT4iwISKx7lebFTzI47/WQHWrkffd5zeTTw1x3AuKbuIJ76wUgeeCzbnN9WSLYgQbflVvwLQU/wm2zfCGyQIsQnwNbEC2JWc60rQrTjeZ/qJqffm0EIGBWXRUyRzzyz4lUr5oC+oI5Y7dDNckgTOpTNfCOhuI+huz9oOlFA7dKCoxqP1oNUXLdP4/QO1Ulbd/iaSFV4yrqqPHVINj1w7HGfEsr7fffzeDWfvNVmLNVc5TC28UneW9mrTYXZwvfsP5ULCNVpVe3gl0UmfGpJk6NXLZIZtcJQnD0edXoQjPOGYbD1JiHqioJilrDVjug4r/uAq4GTlUJHA8YfN2cvXNP45G1xuSvB95nBReH4ABbbvA9Mz4OfJv13EKjeTSsv0LyVZXtdYE22Xseq63DD8x4ItytXPOjgKBnDU3PPVPKbh6+rW3Mq6X940JjjHGQKBsv43T3ey9Rmx/9bn4DTzPGBUVvjNuEfzrGo57zdJnpoxJtoxH13u5JNijO4/ef4tVDgB6wjwA/wooBuh1Ae683QnVSa6Gkj0Zkw+VmnI+8B8o4DOkMNqJm9bi1IsCvzigO8C78eHsaOE8NMBcDFCTcfpiRFbK7CheD6qpzzWyM1xEJUo9NgtSwos3p7s1VNNWZiAWUCqmfj5UimXJlN6usQMWLhCxfVpzBCZHtQoAYDBoRr0StBXWGsSTeFHnUrw2uNMiUsmCjc6V66s5I5u4NkXlajnNVr4j0I7W+CTw0mCsJuEHz3BrlNxbLIbQ273mMt27gRLkCco09OgiwECBGYx94kWFTUZjssxjWlxdL/VUob3vBBWVGonjST1pn7O8FU1Rr1ywi0qOO370JV0M3Jsvs7ZGJXAI8ZrXVsShZBJSnZlsplFc0dBrbzdYgV3NP1sQyz5gsxGtIyNvWVI9GxfbHqp6N6fZPesdHtC0DjjLsLw1TnBXIt7XTN38hZLIjnYN7h7kqSYwpjUXFCnDp7Ef7h+Zx+T+H+P/DjmUR13ijttupL3R52vyc/30xrmbS1ygWWav/bqGLgW5fhLkTeC/S4ZH3Xi94dThGb6FnKyJt5GIKZ+FywjqBDyDeuAE0lqjLc7rBpYLPe/X0EFzKzcahWo0NHKeDPhl3h5txplTa9NYQQDIZMltt6wpiFPIj7cezw3w/iMrjZslRgCL689EN3HO+fMqz92T9HDjD89AFoLs9SDah0p8V17Oi758D3CMHkClyWZphexIXJKzW96BMTpTe8CNcflPCg+KbHsCtHrS5yHypzrxoGL9CEHEO/J/QsxT3Wus9hh0j55adUOcdVZ85wu+rz0kNw370TmA+gAviBn5l1xp8VcaXgIG65WcqpIdhEj37HISl0zA0OFJHwyrqF7zpxqx7LCpWozO1Brdn/ES/6yvUbAwXtbwxBtJNgMVmdnrUQFLkMCT/hLz/qdt7eAZwqfbTIp27HzgW8XIsqlWRHFTql4HZrbitnFHDfqIHzBeAHzbkWKtuaaqqimW8gnEGLmgXBvk6gAmG3QR8mEYPwanUR20Yx5pG4CYeDTwmAv/jPylc1vfVZhzgU40GRvzEwX765y1gcJvtYWhoDJit2R5BvDoWCXIO8A2wXM33GznEy2b2BJCtpBetNOxtGEdJ7Ok7/ajBbyS9bLAErF1QQLo/KhXM7FBBAqnH4A9gl8vYH2kG0IfZI8CNSK/GuN8ypOOENeO48xNVQwDGVw37E9IhrvSmvYDp98j+gIu2/sbdr6WV82Jh0YYnqlDk98Du8fe+FKPiOwQHgB0FmovLRL0Xl+IO2GLPyHr8d2F/r0X2tP9tNQpznIrvvhfsCC8nByStiXG4JYIjXREMZYikuawHV9chiC9i2hGxzo/lcsRdo7KHCgUS/b307bI7q459j6/wUhgFru11dfzwGYxbiWVJjHRP+jCCpLQZPJrBW+6j84LESoXZrNxLSKmgvypEfVlBAcxVvVExOlzBMsv3ZNeomhIJaVuknpQUFnqzBhjRcCWLKr+3sBxP+eQU5yieXl4KX4RpHjYMk6zyzoorq2sckfNIqqpYVbcTY28QfBR0OLAU41rEzwx7qDjK2NZyd9Sj1fQKKpfD0ml69llEzz4HYql07PiFEQHkPNBFNb68DeNQIGNHd43VSNeIrioudrhF1lgvQn296QWRAmsqO8xTG0T52NjbCG2OduCNhp0gNA/sCeAYzO4ErRqLba98Hksk+PsxpzGw6x7Q3+tKAhXpaKTro31qyShns1qmmltrvbkNo8X+VKyasR63xfpMUYtz/PWvRG/q7Z11QHY0e+qMjRtb8XrD1JEWVVp4kOlCXEJoGpcNcTZo+UiWs+aUWgELAv5+/BkM7LQAenvG6rqeg9u9Wq39HLPf1vL7jsa9WwuFFYZoLPu0rWgEh3mpqrZwqsnRIk9L+E+GSI5rhShXvE5t3Zk9ADjfYCdE3uAMwS9qya1QMlodpUt15J28qtgwmKTK0rt1QamKUxJF9chQDT9ueODoUGQUXYa2AjrAnjLjVkmrGw2cKpZ6Fx5fXZGlXChQaOtgcNZ2zltVC+UVNZVrvvgMSvuUom2JA3b1DO2RAmRHXBBw0zLvkBv0Kxi340L6a6oQ1DG4nKPvIy4szkxcMS3T0Wvp2WwC/ASxheAoM+cFapS5RPXrSDf3wO2PkLArzLQa8WjZ02yY+qMxODR2BAPRmlLu7VYCT81trqpGKdUGq9KR5yNju50GPxXMEHob8LRP0RwAHsbMrAFMlDG8kYpVXyvLGs65qmGbGXMxTqvy7rVg78Z4vtYTRwQQgy7Bm/0xyHlKu8PcTjrxNsHpBsfKb4ON9GlvsBmggwUXOVamhghaqjjwYzPEIifNNFvyALERzX3cn3EaLv5xMq4AMqq2oNpYVKmGjlkqQqdGPyfgApLXALmYUT4Jt3ksQMwl3NZsZdIEQ5G5tCK4i3ZdlYl+jVuAi8N0xv6+DuMUFD82YWwSpOB0cgp+8h7w05KScaikz4PNF7oMeCswSEmMXiK0AnFjVXE2sjl80sxOQpootxd7fbRpno4ex5fuLLNz7F/BXq84FuEAZOc4NbJidM8Jjsft7bmxzHsW8xTW1vXsHzjOYjuX0q7MsIMrQacC/zfck8aSarKG8kJx3/cq+ZXA/uZysh6MzOcy4LNxJahhh0nM44n007EYbVVKlea9EpX5N3FWNRn2MZWOcCupNW6CDPj5BvUebvh2Kq4QR7Q9iqt88mAjDxgLQJJRY9zP2h9Ba7yNsFnx2GT35U7Oi2D34Koxxic9CToaVyurC1iDuAl3MEqc/FsER/g//pLy2lx7AtsKfmsutWA/XKWTCbhg23W4aHvY9gKmye1olJeM2+CCcncRLTIgDsIVpphs0Cu40xwRxaPCzcA7vEPiOlx288m4TN1v4t61CFeR8gFcJZijfMAzK3EXJedAm48r7OX7cC/wM6pE2OUSKo/EFbzo8GO4G+xqf3Bo2F4HfEmwh6FnBG+nWCWFP+DONUz6Mciwa7zmEI9XTAGOldjNjVkv+fHeXYVeFvhTqmYAWcweQrqaOiV3xpgA9k4/11EavxL4FGhFw4x0RNXddzl1Lzl33iZ+wWLnw9nuoDu822++GX+NSOJzcVXPzzH47+gESJqKO2/uIC+ZVuNK3LfiNjH9hyfu0NsxRehxry/PIbLnW9IP/OR8HLeT8Wiv0oXet3VmdiLwGx+kK1Zmj6nqD2Ps7c4ApN2Mr0uciovYv4I0EZeKcocjflteLIgNkyWW41JILgW+aEanZHc6wOpQXHT5KlxZofM8qIxS2Z73OYbDD3HlaQpA4Dt4Bdj7Ii7oNK4m1gf8z90enNOBFkfgOkUw4NLOdXPR5WkUfBReYEmMY5F+jotvPA8kzWxLoCe2T39/4Du4DIOXvBSa6SfxfLmK6uGinO3XPsDVK0thNh3pl373ZgURKpsh395J94cupNDc4o5FKBqPlB8JrdiBQy6J9vORuXwCswtA11TEUWUVb7ejR1+8OtqGrGJXrE7xC/0rM3s69uZ87P+oT/1KD44vGWwHbG9mO4Jdi6tO8pkqWm7Gf+KTG+ZAf85P0DEYC8D2AH6G0SHpY76eFOYqf5xuTvS6PSpwGsZ55raBAnzZg+OnGDsCc81srif+/YDLDDVZef96Pbe8BHhA4ksG/xvr7DtwWcPnOuZi84BL/Yg+A9wMtgTsUGA+xvFyzON00L6lV5m8FLoasz3MbLbBjmbMBx4WegdwkLeZc2AXevUDb3wf4iSnDkK6kxInqj7Hbn/+T70EOQVjG2AOZnvhqpZcaHC8OWP9AIMvGCzB7PVgc4E5SKfgtsJWgiOXw5Ip1hx1MoXW9vLDg+q3SbgcvUsijOJCsP28I2L0atII3ScyY4cIZ24HjjV4t+AuzD5MeQGBqJVgZUqBONKrNbdSXhztOeBMc3sIThdcaeHOwwasDl8C9cLyi+0zQkfh9sunMQYkbvWXHGGwo5zK9FQkiL4ncIZhfxM6wxM+wCsG/yUXLDscVwPr5lgILu29Y9+vob0/hSuXuTTy/QXAO83YBHGuHNDD9ldcRfPTwbbBlRXFq5gnGAzGvL/P4or0XYY7JuBX/tpbvXQBWQ9wW60D6yjbk2ZhNOYTuO2zHwFFkzj/hHGqxLnAUqed6BD/6CtBD/nHZamV/BlGz084k8F5C4arpBhtByG+gtsn1A38BLNvo7DC/Ogsp9EAxNfB4sfRMI2vWHOf58bPS/GAXRXnpPvbcf5PPy87yMzdsAq4QQ4oB+BK8gznuAgsXKxKeK7wKlOVgy2KG2ViZ1roaG9JXVcCRxgCtZzTubWnxBFm3BzpS9oT/g/qGLd/hFhVcmPAnWFBHuzSWCULgOW+54X4ySPhRJfVTVBR/WyK5ff7oJkCsGSZTVNf657p7Zxu4NqyKLz79z45Oy10z4enmOyCCEAFD5yQZiJjL0XPGweHzQHO8UUEl3kN4Cps/SRfjiWSfqM3OhN+6bbGcdPfgC7wIni4NhFjOx8j+2u1c85UqgC4WyPu9EjmRFP0rxqhSukJLCEXQETwRJxwPGd43P+2nS9FlIupeylqe8ZKETCLlAhy2x4CUGdEYtVVi6080pHwhvgWuCqSyB+6XDuCMnxEx7OSnZzjwB40Z8z7+a0eIDK4AeODEsd7dfpbwO+LcxLR0+Wj50P1ouelti3wLsQRoBcwTgW7CWnV+nSDjRYgBecNcGXtPf9oxjgJ9A2J73sX8I3FQntWHnnz4nqyUJd/3poai/V3T4ybNyYlbVTVmuLZVipJgfAo4tU1HtlXBLuTPmtjjx2tV3Q0926Pi10cJpiCaI5IRGuIvVgdh66blLAY4MqyJIMauS+C20yc4WwBjgSOlPPEXeodMBWcyUXPq9bgbQZmO1vJ5mK2FOk4hqnQ/loDJGzxEQwivgPMNjhbZh9Dug3IRk8ojp2EEDixaxZNErLyCj45L64T0WVQrRD3mGNTFapX4HK9VFDVQ0aL57MFI8Fm3XPcVeXswHKiq5Lpp7PA/hvHcG4wuFrGY4i9gU8YdRJDqmTT1BlGuO6Fsn1nfnuA+ap+5d2zK53do2Odh1F7OKeJ5nqVqAyElkxWYxZTnZaiLlxw+LKiWrkB21gAohq//skdFKndMDYBXql2eq2f3LVAr6FJYK3lKlYxAa3Fo2oNDdYSsdiqqzY91BlU0Zhca06Xbrfq3DXwdNIrMUBFeuAYcDo8sYaDOVTim96//yawOyKKz4QKDlImJhvZ61LW/u4797pK4aJyX0x5bt3zYF8y+BamTyHOFpyDuA63bRoLAoKBPppeXMbgtjvCUNThaWsdbSn7Wub3BOvlKeVzPKFYKEaRZNrqg3olLBgsNBPzUobI8QDSVI+XJxoL2Ywuxb7GXdkwqCnZjFKfSgqQVDzq4QWwDc7RSvuQo0xH7/F67CU+LhNVE1MNr94w2yuccW2P+atmYUxpZLpVri32AJ+Q6U4gYbBnqSicIDNEx103u4IMKvMI9lXxjG7UAMlbRe0jAuAEPxkPhAG8Yi2mGDEaVkDc6jG0X4337OF13HvCWkvV9V3zx5+FhZIVLdwzAh5ZUab5Vq837W+RP0d+3M/373bXBTWETw1DUPFsY6tlXLshTvFK2UtuKhS9p+x83khJoXAkKUQuUjPZja1aArHjDI/j0jRmIN5c5eJOwQdxKfFVrMMig3nR+7KSxdk0Yelmmp99nOanHm3kLJCNEiChLGhzrkO1+Z+3pRTwK2B8pRHEm8ucXS14J2LnGOUcjHMZPoC487VOAvIEdr2PVyzClQOKtvneKH7Ree9e+2aOrS/19L4oiiIZO4J9MLQZYreu856kramsV1Wv9Xv9H1wGwMyofSJxsTfAT/MS/2Bc4mp0YrfBeJNnjPeX16cTymZpXvJ0/XMJX6M2mrI/KT+UHwn1ekM7hYsaJ3D5P58AuyGyESH6rmSMjy7GVRO5Uu78im/iUjTm444IXgt8RKb+0tEAiFL9LNVwnSZqMO4mqtfeSvnxxVelB+wsTL+SuBZXu+thT1hn4dJuThR6idLRGPIel6ZhGFMt9Sfso+qsWSIy/O/i4kknAx0ST4K2MdhPKBt9V2QbTreka4ATQb8F+7V/2TJfdcR8H5Lxfnimtr/cQTx3GLpazmA+yBng/NmMS/0cfAWXHfELwYMGXYjjcKlE/1PlWAYKzU20PPYAPfu+hUJL22jqX/3DANLniWNTwiPNSueXPwLcZdgPgYdU6RR6BRcdr3YW3nc9sM71Xo3Ae6/uBT6BVZxVmMNFlUtertJ3z+MKhK2luk3xqNeD4yb3c8DjYP1RNPmL7kAcgsvv+ZCfN/P2yfup2HVIzs9Hdw0NfZ3B3+QCW9W8A0/4eaomgbs9U1kV0S5/J/E+4FO4zIQjgaXIPuLPiLyEaFKge1fO4MNycZa3+IDoAO7sckyY3Bwn8OlB4UYzQcaMMxEv4rInzvZPXgNcYW4NV0gKcDll5xi8VfA2P8wlwMcxvlZ1iyOgXHbM1erWi8k3omTFnU9pRZquEjCiUz4ELDW/8V3xKsdiUy9llhmsrOE5mutzjCY7o5fbPUcrc3/iDgLdxi/aM7jKiKGeOw2YJLHYqxHRiU4izQHyLlcMi+j6s5yqaIuJZOdGTtQAl57xJj+OFYbdHSZNlr+GpMQcT+DPUtzVWrygE3dW4wrB8irSZRsPwmdCkEQ0pymYbWGwVGK1leqHy2CRjIUG6yTuMuxBORV4O4MX3SGgcfNcHcBcqRjDWQz0mDt5ao6nkadCFS2aISHRgrE/YlcgZ8bDkt1jaF2sKN+WuJSdmZ7JPgDc7+ouVKG/Qp5CazvdHzjf52LlyxMSQwKLaiixvfWl32P+6xEmK8o2ApSOt/G2sbZgfArG23gbB8h4G2/jABlv420cIONtvI0DZLyNt3GAjLfxttG3/x8AscyrBFrkMAcAAAAASUVORK5CYII=" /></a>
-		<p>Analysis produced by <a href="http://www.bioinformatics.babraham.ac.uk/projects/bismark/"><strong>Bismark</strong></a> (version {{bismark_version}}) - a tool to map bisulfite converted sequence reads and determine cytosine methylation states</p>
-		<p>Report graphs rendered using <a href="http://jquery.com/">jQuery</a> and <a href="http://www.highcharts.com/">Highcharts</a>. Page design by <a href="http://phil.ewels.co.uk/">Phil Ewels.</a></p>
-	</footer>
-
-</div>
-</body>
-</html>
-
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/bismark_wrapper.py	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,289 @@
+#!/usr/bin/env python
+
+import argparse
+import fileinput
+import logging
+import math
+import os
+import shutil
+import subprocess
+import sys
+import tempfile
+from glob import glob
+
+
+def stop_err(logger, msg):
+    logger.critical(msg)
+    sys.exit(1)
+
+
+def log_subprocess_output(logger, pipe):
+    for line in iter(pipe.readline, b''):
+        logger.debug(line.decode().rstrip())
+
+
+def __main__():
+    # Parse Command Line
+    parser = argparse.ArgumentParser(description='Wrapper for the bismark bisulfite mapper.')
+    parser.add_argument('-p', '--num-threads', dest='num_threads',
+                        type=int, default=4, help='Use this many threads to align reads. The default is 4.')
+
+    # input options
+    parser.add_argument('--own-file', dest='own_file', help='')
+    parser.add_argument('-D', '--indexes-path', dest='index_path',
+                        help='Indexes directory; location of .ebwt and .fa files.')
+    parser.add_argument('-O', '--output', dest='output')
+
+    parser.add_argument('--output-report-file', dest='output_report_file')
+    parser.add_argument('--suppress-header', dest='suppress_header', action="store_true")
+
+    parser.add_argument('--mate-paired', dest='mate_paired', action='store_true', help='Reads are mate-paired',
+                        default=False)
+
+    parser.add_argument('-1', '--mate1', dest='mate1',
+                        help='The forward reads file in Sanger FASTQ or FASTA format.')
+    parser.add_argument('-2', '--mate2', dest='mate2',
+                        help='The reverse reads file in Sanger FASTQ or FASTA format.')
+    parser.add_argument('--sort-bam', dest='sort_bam', action="store_true")
+
+    parser.add_argument('--output-unmapped-reads', dest='output_unmapped_reads',
+                        help='Additional output file with unmapped reads (single-end).')
+    parser.add_argument('--output-unmapped-reads-l', dest='output_unmapped_reads_l',
+                        help='File name for unmapped reads (left, paired-end).')
+    parser.add_argument('--output-unmapped-reads-r', dest='output_unmapped_reads_r',
+                        help='File name for unmapped reads (right, paired-end).')
+
+    parser.add_argument('--output-suppressed-reads', dest='output_suppressed_reads',
+                        help='Additional output file with suppressed reads (single-end).')
+    parser.add_argument('--output-suppressed-reads-l', dest='output_suppressed_reads_l',
+                        help='File name for suppressed reads (left, paired-end).')
+    parser.add_argument('--output-suppressed-reads-r', dest='output_suppressed_reads_r',
+                        help='File name for suppressed reads (right, paired-end).')
+    parser.add_argument('--stdout', dest='output_stdout',
+                        help='File name for the standard output of bismark.')
+
+    parser.add_argument('--single-paired', dest='single_paired',
+                        help='The single-end reads file in Sanger FASTQ or FASTA format.')
+
+    parser.add_argument('--fastq', action='store_true', help='Query filetype is in FASTQ format')
+    parser.add_argument('--fasta', action='store_true', help='Query filetype is in FASTA format')
+    parser.add_argument('--phred64-quals', dest='phred64', action="store_true")
+
+    parser.add_argument('--skip-reads', dest='skip_reads', type=int)
+    parser.add_argument('--qupto', type=int)
+
+    # paired end options
+    parser.add_argument('-I', '--minins', dest='min_insert')
+    parser.add_argument('-X', '--maxins', dest='max_insert')
+    parser.add_argument('--no-mixed', dest='no_mixed', action="store_true")
+    parser.add_argument('--no-discordant', dest='no_discordant', action="store_true")
+
+    # parse general options
+    # default 20
+    parser.add_argument('--seed-len', dest='seed_len', type=int)
+    # default 15
+    parser.add_argument('--seed-extention-attempts', dest='seed_extention_attempts', type=int)
+    # default 0
+    parser.add_argument('--seed-mismatches', dest='seed_mismatches', type=int)
+    # default 2
+    parser.add_argument('--max-reseed', dest='max_reseed', type=int)
+    """
+    # default 70
+    parser.add_argument( '--maqerr', dest='maqerr', type=int )
+    """
+
+    """
+    The number of megabytes of memory a given thread is given to store path
+    descriptors in --best mode. Best-first search must keep track of many paths
+    at once to ensure it is always extending the path with the lowest cumulative
+    cost. Bowtie tries to minimize the memory impact of the descriptors, but
+    they can still grow very large in some cases. If you receive an error message
+    saying that chunk memory has been exhausted in --best mode, try adjusting
+    this parameter up to dedicate more memory to the descriptors. Default: 512.
+    """
+    parser.add_argument('--chunkmbs', type=int, default=512)
+
+    args = parser.parse_args()
+
+    logger = logging.getLogger('bismark_wrapper')
+    logger.setLevel(logging.DEBUG)
+    ch = logging.StreamHandler(sys.stdout)
+    if args.output_stdout:
+        ch.setLevel(logging.WARNING)
+        handler = logging.FileHandler(args.output_stdout)
+        handler.setLevel(logging.DEBUG)
+        logger.addHandler(handler)
+    else:
+        ch.setLevel(logging.DEBUG)
+    logger.addHandler(ch)
+
+    # Create bismark index if necessary.
+    index_dir = ""
+    tmp_index_dir = None
+    if args.own_file:
+        logger.info("Create a temporary index with the offered files from the user. "
+                    "Utilizing the script: bismark_genome_preparation")
+        tmp_index_dir = tempfile.mkdtemp()
+        index_path = os.path.join(tmp_index_dir, '.'.join(os.path.split(args.own_file)[1].split('.')[:-1]))
+        try:
+            # Create a hard link pointing to args.own_file named 'index_path'.fa.
+            os.symlink(args.own_file, index_path + '.fa')
+        except Exception as e:
+            if os.path.exists(tmp_index_dir):
+                shutil.rmtree(tmp_index_dir)
+            stop_err(logger, 'Error in linking the reference database!\n%s' % e)
+        # bismark_genome_preparation needs the complete path to the folder in which the database is stored
+        cmd_index = ['bismark_genome_preparation', '--bowtie2', tmp_index_dir]
+        try:
+            logger.info("Generating index with: '%s'", " ".join(cmd_index))
+            process = subprocess.Popen(cmd_index, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+            with process.stdout:
+                log_subprocess_output(logger, process.stdout)
+            exitcode = process.wait()
+            if exitcode != 0:
+                raise Exception(process.stderr)
+        except Exception as e:
+            if os.path.exists(tmp_index_dir):
+                shutil.rmtree(tmp_index_dir)
+            stop_err(logger, 'Error indexing reference sequence!\n%s' % e)
+        index_dir = tmp_index_dir
+    else:
+        # bowtie path is the path to the index directory and the first path of the index file name
+        index_dir = os.path.dirname(args.index_path)
+
+    # Build bismark command
+    tmp_bismark_dir = tempfile.mkdtemp()
+    output_dir = os.path.join(tmp_bismark_dir, 'results')
+    cmd = ['bismark', '--bam', '--gzip', '--temp_dir', tmp_bismark_dir, '-o', output_dir, '--quiet']
+
+    if args.fasta:
+        # the query input files (specified as mate1,mate2 or singles) are FastA
+        cmd.append('--fasta')
+    elif args.fastq:
+        cmd.append('--fastq')
+
+    # alignment options
+    if args.num_threads > 2:
+        # divide num_threads by 2 here since bismark will spawn 2 jobs with -p threads each
+        cmd.extend(['-p', str(math.ceil(args.num_threads / 2))])
+    if args.seed_mismatches:
+        cmd.extend(['-N', str(args.seed_mismatches)])
+    if args.seed_len:
+        cmd.extend(['-L', str(args.seed_len)])
+    if args.seed_extention_attempts:
+        cmd.extend(['-D', str(args.seed_extention_attempts)])
+    if args.max_reseed:
+        cmd.extend(['-R', str(args.max_reseed)])
+    if args.no_discordant:
+        cmd.append('--no-discordant')
+    if args.no_mixed:
+        cmd.append('--no-mixed')
+    if args.skip_reads:
+        cmd.extend(['--skip', str(args.skip_reads)])
+    if args.qupto:
+        cmd.extend(['--upto', 'args.qupto'])
+    if args.phred64:
+        cmd.append('--phred64-quals')
+    if args.suppress_header:
+        cmd.append('--sam-no-hd')
+    if args.output_unmapped_reads or (args.output_unmapped_reads_l and args.output_unmapped_reads_r):
+        cmd.append('--un')
+    if args.output_suppressed_reads or (args.output_suppressed_reads_l and args.output_suppressed_reads_r):
+        cmd.append('--ambiguous')
+
+    cmd.append(index_dir)
+    # Set up the reads
+    if args.mate_paired:
+        # paired-end reads library
+        cmd.extend(['-1', args.mate1, '-2', args.mate2, '-I', str(args.min_insert), '-X', str(args.max_insert)])
+    else:
+        # single paired reads library
+        cmd.append(args.single_paired)
+
+    # Run
+    try:
+        logger.info("Running bismark with: '%s'", " ".join(cmd))
+        process = subprocess.Popen(args=cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+        with process.stdout:
+            log_subprocess_output(logger, process.stdout)
+        exitcode = process.wait()
+        if exitcode != 0:
+            raise Exception(process.stderr)
+    except Exception as e:
+        stop_err(logger, 'Error in running bismark!\n%s' % e)
+
+    # collect and copy output files
+    if args.output_report_file:
+        output_report_file = open(args.output_report_file, 'w+')
+        for line in fileinput.input(glob(os.path.join(output_dir, '*report.txt'))):
+            output_report_file.write(line)
+        output_report_file.close()
+
+    if args.output_suppressed_reads:
+        if glob(os.path.join(output_dir, '*ambiguous_reads.txt')):
+            shutil.move(glob(os.path.join(output_dir, '*ambiguous_reads.txt'))[0], args.output_suppressed_reads)
+    if args.output_suppressed_reads_l:
+        if glob(os.path.join(output_dir, '*ambiguous_reads_1.txt')):
+            shutil.move(glob(os.path.join(output_dir, '*ambiguous_reads_1.txt'))[0], args.output_suppressed_reads_l)
+    if args.output_suppressed_reads_r:
+        if glob(os.path.join(output_dir, '*ambiguous_reads_2.txt')):
+            shutil.move(glob(os.path.join(output_dir, '*ambiguous_reads_2.txt'))[0], args.output_suppressed_reads_r)
+
+    if args.output_unmapped_reads:
+        if glob(os.path.join(output_dir, '*unmapped_reads.txt')):
+            shutil.move(glob(os.path.join(output_dir, '*unmapped_reads.txt'))[0], args.output_unmapped_reads)
+    if args.output_unmapped_reads_l:
+        if glob(os.path.join(output_dir, '*unmapped_reads_1.txt')):
+            shutil.move(glob(os.path.join(output_dir, '*unmapped_reads_1.txt'))[0], args.output_unmapped_reads_l)
+    if args.output_unmapped_reads_r:
+        if glob(os.path.join(output_dir, '*unmapped_reads_2.txt')):
+            shutil.move(glob(os.path.join(output_dir, '*unmapped_reads_2.txt'))[0], args.output_unmapped_reads_r)
+
+    try:
+        # merge all bam files
+        tmp_res = tempfile.NamedTemporaryFile(dir=output_dir).name
+
+        bam_files = glob(os.path.join(output_dir, '*.bam'))
+        if len(bam_files) > 1:
+            cmd = ['samtools', 'merge', '-@', str(args.num_threads), '-f', tmp_res, ' '.join(bam_files)]
+            logger.info("Merging bams with: '%s'", cmd)
+            process = subprocess.Popen(args=cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+            with process.stdout:
+                log_subprocess_output(logger, process.stdout)
+            exitcode = process.wait()
+            if exitcode != 0:
+                raise Exception(process.stderr)
+        else:
+            tmp_res = bam_files[0]
+
+        bam_path = "%s" % tmp_res
+
+        if os.path.exists(bam_path):
+            if args.sort_bam:
+                cmd = ['samtools', 'sort', '-@', str(args.num_threads), bam_path, 'sorted_bam']
+                logger.info("Sorting bam with: '%s'", cmd)
+                process = subprocess.Popen(args=cmd, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
+                with process.stdout:
+                    log_subprocess_output(logger, process.stdout)
+                exitcode = process.wait()
+                if exitcode != 0:
+                    raise Exception(process.stderr)
+                shutil.move('sorted_bam.bam', args.output)
+            else:
+                shutil.move(bam_path, args.output)
+        else:
+            stop_err(logger, 'BAM file no found:\n%s' % bam_path)
+
+    except Exception as e:
+        stop_err(logger, 'Error in merging bam files!\n%s' % e)
+
+    # Clean up temp dirs
+    if tmp_index_dir and os.path.exists(tmp_index_dir):
+        shutil.rmtree(tmp_index_dir)
+    if os.path.exists(tmp_bismark_dir):
+        shutil.rmtree(tmp_bismark_dir)
+    if os.path.exists(output_dir):
+        shutil.rmtree(output_dir)
+
+
+if __name__ == "__main__": __main__()
Binary file documentation/Bismark_User_Guide.pdf has changed
--- a/documentation/readme.rst	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,53 +0,0 @@
-===============
-Bismark Wrapper
-===============
-
-Bismark_ uses Bowtie or Bowtie2 to map bisulfite converted sequence reads to a reference genome and determine cytosine methylation states.
-
-Publication: http://www.ncbi.nlm.nih.gov/pubmed/21493656
-
-User Guide: http://www.bioinformatics.babraham.ac.uk/projects/bismark/Bismark_User_Guide_v0.7.12.pdf
-
-.. _bismark: http://www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-Preparation
-===========
-
-Create your reference index with *bismark_genome_preparation* in your normal Galaxy Bowtie2/Botwie index directory. It will create a Bisulfite_Genome folder directly in your Bowtie2/Bowtie index directory.
-If you follow that approach you do not need to specify or modify an extra .loc file.
-That wrapper will extract the path to the Bisulfite_Genome folder from ./tool-data/bowtie2_indices.loc or ./tool-data/bowtie_indices.loc.
-
-=======
-History
-=======
-
-- v0.7: Initial public release
-- v0.7.8: update and add Tool Shed Integration
-- v0.7.11.1 change default output to BAM, from now on samtools are required
-- v0.7.11.2 added multi-threading to samtools (samtools > 0.1.19 is required)
-- v0.7.12 upgrade to bismark 0.7.12 and fix a major slowdown
-- v0.7.12.1 define a dependency to samtools 0.1.19
-
-
-===============================
-Wrapper Licence (MIT/BSD style)
-===============================
-
-Permission to use, copy, modify, and distribute this software and its
-documentation with or without modifications and for any purpose and
-without fee is hereby granted, provided that any copyright notices
-appear in all copies and that both those copyright notices and this
-permission notice appear in supporting documentation, and that the
-names of the contributors or copyright holders not be used in
-advertising or publicity pertaining to distribution of the software
-without specific prior permission.
-
-THE CONTRIBUTORS AND COPYRIGHT HOLDERS OF THIS SOFTWARE DISCLAIM ALL
-WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED
-WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL THE
-CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT
-OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
-OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
-OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE
-OR PERFORMANCE OF THIS SOFTWARE.
-
--- a/macros.xml	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,65 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<macros>
-    <token name="@WRAPPER_VERSION@">0.14</token>
-    <xml name="requirements_stdio">
-        <requirements>
-            <requirement type="package" version="0.1.19">samtools</requirement>
-            <yield/>
-        </requirements>
-        <stdio>
-            <exit_code range="1:" />
-            <exit_code range=":-1" />
-            <regex match="Error:" />
-            <regex match="Exception:" />
-        </stdio>
-        <version_command>bismark --version</version_command>
-    </xml>
-
-    <xml name="single_paired_conditional">
-        <!-- Input Parameters -->
-        <conditional name="singlePaired">
-            <param name="sPaired" type="select" label="Is this library mate-paired?">
-              <option value="single">Single-end</option>
-              <option value="paired">Paired-end</option>
-            </param>
-            <when value="single">
-                <param name="input_singles" type="data" format="fastqsanger,fastqillumina,fastq,fasta" label="FASTQ/FASTA file" help="FASTQ or FASTA files." />
-            </when>
-            <when value="paired">
-                <repeat name="mate_list" title="Paired End Pairs" min="1">
-                    <param name="input_mate1" type="data" format="fastqsanger,fastqillumina,fastq,fasta" label="Mate pair 1" help="FASTQ or FASTA files." />
-                    <param name="input_mate2" type="data" format="fastqsanger,fastqillumina,fastq,fasta" label="Mate pair 2" help="FASTQ or FASTA files." />
-                </repeat>
-                <param name="minInsert" type="integer" value="0" label="Minimum insert size for valid paired-end alignments" />
-                <param name="maxInsert" type="integer" value="500" label="Maximum insert size for valid paired-end alignments" />
-            </when>
-        </conditional>
-    </xml>
-
-    <xml name="advanced_params">
-        <param name="seed_len" type="integer" value="28" label="Seed length"
-            help="The number of bases of the high quality end of the read to which the maximum number of mismatches applies. (--seed-len)" />
-        <param name="qupto" type="integer" value="0" min="0" label="Only aligns the first N reads or read pairs from the input"
-            help="Default is 0 and means 'no-limit'. (--qupto)"/>
-        <param name="skip_reads" type="integer" value="0" label="Skip (i.e. do not align) the first N reads or read pairs from the input"
-            help="(--skip-reads)" />
-
-        <param name="suppressed_read_file" type="boolean" truevalue="true" falsevalue="false" checked="false"
-            label="Write ambiguous reads to an extra output file"
-            help="Write all reads which produce more than one valid alignment with the same number of lowest
-                mismatches or other reads that fail to align uniquely. (--output-suppressed-reads-r/l)" />
-        <param name="unmapped_read_file" type="boolean" truevalue="true" falsevalue="false" checked="false"
-            label="Write all reads that could not be aligned to a file. (--output-unmapped-reads-r/l)" />
-
-        <!-- output Options -->
-        <param name="bismark_stdout" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Write the bismark output and summary information to an extra file" />
-        <param name="isReportOutput" type="boolean" truevalue="true" falsevalue="false" checked="false" label="Offer all report files concatenated in one file" />
-        <!--end output options -->
-
-    </xml>
-    <xml name="citation">
-        <citations>
-            <citation type="doi">10.1093/bioinformatics/btr167</citation>
-        </citations>
-    </xml>
-</macros>
--- a/new/bismark	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,9636 +0,0 @@
-#!/usr/bin/perl --
-use strict;
-use warnings;
-use IO::Handle;
-use Cwd;
-$|++;
-use Getopt::Long;
-
-
-## This program is Copyright (C) 2010-15, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-my $parent_dir = getcwd;
-my $bismark_version = 'v0.14.3';
-my $command_line = join (" ",@ARGV);
-
-
-### before processing the command line we will replace --solexa1.3-quals with --phred64-quals as the '.' in the option name will cause Getopt::Long to fail
-foreach my $arg (@ARGV){
-  if ($arg eq '--solexa1.3-quals'){
-    $arg = '--phred64-quals';
-  }
-}
-my @filenames;   # will be populated by processing the command line
-
-my ($genome_folder,$CT_index_basename,$GA_index_basename,$path_to_bowtie,$sequence_file_format,$bowtie_options,$directional,$unmapped,$ambiguous,$phred64,$solexa,$output_dir,$bowtie2,$vanilla,$sam_no_hd,$skip,$upto,$temp_dir,$non_bs_mm,$insertion_open,$insertion_extend,$deletion_open,$deletion_extend,$gzip,$bam,$samtools_path,$pbat,$prefix,$old_flag,$basename,$score_min_intercept,$score_min_slope,$bt2_large_index,$multicore) = process_command_line();
-
-my @fhs;         # stores alignment process names, bisulfite index location, bowtie filehandles and the number of times sequences produced an alignment
-my %chromosomes; # stores the chromosome sequences of the mouse genome
-my %SQ_order;    # stores the order of sequences in the reference. This is to produce SAM/BAM files with a known order of chromosomes
-my %counting;    # counting various events
-my @pids; # storing the process IDs of child processes in parallel mode
-
-
-my $seqID_contains_tabs;
-my $verbose = 0;
-
-if ($multicore > 1){
-  warn "Running Bismark Parallel version. Number of parallel instances to be spawned: $multicore\n\n";
-}
-
-
-sub multi_process_handling{
-
-  my $offset = 1;
-  my $process_id;
-  if ($multicore > 1){
-
-    until ($offset == $multicore){
-      # warn "multicore: $multicore\noffset: $offset\n";
-      my $fork = fork;
-
-      if (defined $fork){
-	if ($fork != 0){
-	  $process_id = $fork;
-	  push @pids, $process_id;
-	  if ($offset < $multicore){
-	    ++$offset;
-	    # warn "I am the parent process, child pid: $fork\nIncrementing offset counter to: $offset\n\n";
-	  }
-	  else{
-	    # warn "Reached the number of maximum multicores. Proceeeding to processing...\n";
-	  }
-	}
-	elsif ($fork == 0){
-	  # warn "I am a child process, pid: $fork\nOffset counter is: $offset\nProceeding to processing...\n";
-	  $process_id = $fork;
-	  last;
-	}
-      }
-      else{
-	die "Forking unsuccessful. Proceeding using a single thread only\n";
-      }
-    }
-
-    # warn "\nThe Thread Identity\n===================\n";
-    if ($process_id){
-      # print "I am the parent process. My children are called:\n";
-      # print join ("\t",@pids),"\n";
-      # print "I am going to process the following line count: $offset\n\n";
-    }
-    elsif($process_id == 0){
-      # warn "I am a child process: Process ID: $process_id\n";
-      # warn "I am going to process the following line count: $offset\n\n";
-    }
-    else{
-      die "Process ID was: '$process_id'\n";
-    }
-  }
-  else{
-    warn "Single-core mode: setting pid to 1\n";
-    $process_id = 1;
-  }
-
-  return ($process_id,$offset);
-}
-
-
-sub subset_input_file_FastQ{
-
-  my ($filename,$process_id,$offset) = @_;
-
-  if ($filename =~ /gz$/){
-    open (OFFSET,"zcat $filename |") or die "Couldn't read from file '$filename': $!\n";
-  }
-  else{
-    open (OFFSET,$filename) or die "Couldn't read from file '$filename': $!\n";
-  }
-
-  # warn "offset is $offset\n";
-  my $temp = $filename;
-  $temp .= ".temp.$offset";
-  $temp =~ s/^.*\///; # replacing everything upto and including the last /, i.e. removing file path information
-
-  if ($gzip){
-    $temp .= '.gz';
-    open (TEMPFQ,"| gzip -c - > ${temp_dir}${temp}") or die "Can't write to file ${temp_dir}${temp}: $!\n";
-  }
-  else{
-    open (TEMPFQ,'>',"${temp_dir}${temp}") or die "Failed to write output ${temp_dir}${temp}: $!\n";
-  }
-
-  my $line_count = 0;
-
-  while (1){
-    my $l1 = <OFFSET>;
-    my $l2 = <OFFSET>;
-    my $l3 = <OFFSET>;
-    my $l4 = <OFFSET>;
-
-    last unless ($l4);
-    ++$line_count;
-
-    if ( ($line_count - $offset)%$multicore == 0){
-      # warn "line count: $line_count\noffset: $offset\n";
-      # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-      # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-      print TEMPFQ "$l1$l2$l3$l4";
-    }
-    else{
-      # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-      next;
-    }
-  }
-
-  close OFFSET or warn $!;
-  close TEMPFQ or warn "Failed to close file handle TEMPFQ: $!\n";
-
-  warn "Finished subdividing $filename for PID: $process_id and offset $offset\n\n";
-
-  return ($temp); # returning the subset filename
-
-}
-
-sub subset_input_file_FastA{
-
-  my ($filename,$process_id,$offset) = @_;
-
-  if ($filename =~ /gz$/){
-    open (OFFSET,"zcat $filename |") or die "Couldn't read from file '$filename': $!\n";
-  }
-  else{
-    open (OFFSET,$filename) or die "Couldn't read from file '$filename': $!\n";
-  }
-
-  # warn "offset is $offset\n";
-  my $temp = $filename;
-  $temp .= ".temp.$offset";
-
-  if ($gzip){
-    $temp .= '.gz';
-    open (TEMPFQ,"| gzip -c - > ${temp_dir}${temp}") or die "Can't write to file ${temp_dir}${temp}: $!\n";
-  }
-  else{
-    open (TEMPFQ,'>',"${temp_dir}${temp}") or die "Failed to write output ${temp_dir}${temp}: $!\n";
-  }
-
-  warn "Writing temporary infile to $temp\n";
-
-  my $line_count = 0;
-
-  while (1){
-    my $l1 = <OFFSET>;
-    my $l2 = <OFFSET>;
-
-    last unless ($l2);
-    ++$line_count;
-
-    if ( ($line_count - $offset)%$multicore == 0){
-      # warn "line count: $line_count\noffset: $offset\n";
-      # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-      # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-      print TEMPFQ "$l1$l2";
-    }
-    else{
-      # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-      next;
-    }
-  }
-
-  close OFFSET or warn $!;
-  close TEMPFQ or warn "Failed to close file handle TEMPFQ: $!\n";
-
-  warn "Finished subdividing $filename for PID: $process_id and offset $offset\n\n";
-
-  return ($temp); # returning the subset filename
-
-}
-
-#####
-#####
-
-foreach my $filename (@filenames){
-
-  my $original_filename = $filename;
-  my $original_filename_1;
-  my $original_filename_2;
-
-  chdir $parent_dir or die "Unable to move to initial working directory'$parent_dir' $!\n";
-  ### resetting the counting hash and fhs
-  reset_counters_and_fhs($filename);
-  @pids = ();
-  $seqID_contains_tabs = 0;
-
-  ### As of version 0.14.0 we support multi-threading. In a first instance we accomplish this by
-  ### splitting the input file(s) into several smaller subfiles and merging the results back at
-  ### the end.
-
-  # get general settings (also for single-threaded use)
-  my ($pid,$offset) = multi_process_handling ();
-
-  my ($single_end,$paired_end);
-  ### PAIRED-END ALIGNMENTS
-  if ($filename =~ ','){
-
-    $single_end = 0;
-    $paired_end = 1;
-
-    my ($C_to_T_infile_1,$G_to_A_infile_1); # to be made from mate1 file
-
-    $fhs[0]->{name} = 'CTread1GAread2CTgenome';
-    $fhs[1]->{name} = 'GAread1CTread2GAgenome';
-    $fhs[2]->{name} = 'GAread1CTread2CTgenome';
-    $fhs[3]->{name} = 'CTread1GAread2GAgenome';
-    warn "\nPaired-end alignments will be performed\n",'='x39,"\n\n";
-
-    my ($filename_1,$filename_2) = (split (/,/,$filename));
-    $original_filename_1 = $filename_1;
-    $original_filename_2 = $filename_2;
-
-    warn "The provided filenames for paired-end alignments are $filename_1 and $filename_2\n";
-
-    ### subsetting the input file(s)
-    unless ($multicore == 1){ # not needed in single-core mode
-      # warn "My PID: $pid\nMy offset: $offset\n";
-      if ($sequence_file_format eq 'FASTA'){
-	my $temp_filename_1 = subset_input_file_FastA($filename_1,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename_1< as new in-file 1 (instead of >$filename_1<)\n";
-	$filename_1 = "${temp_dir}$temp_filename_1";
-	
-	my $temp_filename_2 = subset_input_file_FastA($filename_2,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename_2< as new in-file 2 (instead of >$filename_2<)\n";
-	$filename_2 = "${temp_dir}$temp_filename_2";
-      }
-      else{ # FastQ format, default
-	my $temp_filename_1 = subset_input_file_FastQ($filename_1,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename_1< as new in-file 1 (instead of >$filename_1<)\n";
-	$filename_1 = "${temp_dir}$temp_filename_1";
-
-	my $temp_filename_2 = subset_input_file_FastQ($filename_2,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename_2< as new in-file 2 (instead of >$filename_2<)\n";
-	$filename_2 = "${temp_dir}$temp_filename_2";
-      }
-    }
-
-    ### additional variables only for paired-end alignments
-    my ($C_to_T_infile_2,$G_to_A_infile_2); # to be made from mate2 file
-
-    ### FastA format
-    if ($sequence_file_format eq 'FASTA'){
-      warn "Input files are in FastA format\n";
-
-      if ($directional){
-	($C_to_T_infile_1) = biTransformFastAFiles_paired_end ($filename_1,1); # also passing the read number
-	($G_to_A_infile_2) = biTransformFastAFiles_paired_end ($filename_2,2);
-
-	$fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	$fhs[1]->{inputfile_1} = undef;
-	$fhs[1]->{inputfile_2} = undef;
-	$fhs[2]->{inputfile_1} = undef;
-	$fhs[2]->{inputfile_2} = undef;
-	$fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-      }
-      else{
-	($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastAFiles_paired_end ($filename_1,1); # also passing the read number
-	($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastAFiles_paired_end ($filename_2,2);
-
-	$fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	$fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-      }
-
-      if ($bowtie2){
-	paired_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-      }
-      else{
-	paired_end_align_fragments_to_bisulfite_genome_fastA ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-      }
-    }
-
-    ### FastQ format
-    else{
-      warn "Input files are in FastQ format\n";
-      if ($directional){
-	if ($bowtie2){
-	  ($C_to_T_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	  ($G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	  $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	  $fhs[1]->{inputfile_1} = undef;
-	  $fhs[1]->{inputfile_2} = undef;
-	  $fhs[2]->{inputfile_1} = undef;
-	  $fhs[2]->{inputfile_2} = undef;
-	  $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	}
-	else{ # Bowtie 1 alignments
-	  if ($gzip){
-	    ($C_to_T_infile_1) = biTransformFastQFiles_paired_end_bowtie1_gzip ($filename_1,$filename_2); # passing both reads at the same time
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1; # this file contains both read 1 and read 2 in tab delimited format
-	    $fhs[0]->{inputfile_2} = undef; # no longer needed
-	    $fhs[1]->{inputfile_1} = undef;
-	    $fhs[1]->{inputfile_2} = undef;
-	    $fhs[2]->{inputfile_1} = undef;
-	    $fhs[2]->{inputfile_2} = undef;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1; # this file contains both read 1 and read 2 in tab delimited format
-	    $fhs[3]->{inputfile_2} = undef; # no longer needed
-	  }
-	  else{
-	    ($C_to_T_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	    ($G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	    $fhs[1]->{inputfile_1} = undef;
-	    $fhs[1]->{inputfile_2} = undef;
-	    $fhs[2]->{inputfile_1} = undef;
-	    $fhs[2]->{inputfile_2} = undef;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	  }
-	}
-      }
-      elsif($pbat){ # PBAT-Seq. This works for both Bowtie and Bowtie 2
-	### At the moment we are only performing alignments only with uncompressed FastQ files
-	($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	$fhs[0]->{inputfile_1} = undef;
-	$fhs[0]->{inputfile_2} = undef;
-	$fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[3]->{inputfile_1} = undef;
-	$fhs[3]->{inputfile_2} = undef;
-      }
-      else{
-	if ($bowtie2){
-	  ($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	  ($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	  $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	  $fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	  $fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	  $fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	  $fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	  $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	}
-	else{ # Bowtie 1 alignments
-	  if ($gzip){
-	    ($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end_bowtie1_gzip ($filename_1,$filename_2); # passing both reads at the same time
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[0]->{inputfile_2} = undef; # not needed for compressed temp files
-	    $fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[1]->{inputfile_2} = undef;
-	    $fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[2]->{inputfile_2} = undef;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[3]->{inputfile_2} = undef; # not needed for compressed temp files
-	  }
-	  else{ # uncompressed temp files
-	    ($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	    ($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	    $fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	    $fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	  }
-	}
-      }
-      if ($bowtie2){
-	paired_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-      }
-      else{
-       	paired_end_align_fragments_to_bisulfite_genome_fastQ ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);	
-      }
-    }
-    start_methylation_call_procedure_paired_ends($filename_1,$filename_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid);
-  }
-
-  ### Else we are performing SINGLE-END ALIGNMENTS
-  else{
-    warn "\nSingle-end alignments will be performed\n",'='x39,"\n\n";
-
-    $single_end = 1;
-    $paired_end = 0;
-
-    ### subsetting the input file(s)
-    unless ($multicore == 1){ # not needed in single-core mode
-      # warn "My PID: $pid\nMy offset: $offset\n";
-      if ($sequence_file_format eq 'FASTA'){
-	my $temp_filename = subset_input_file_FastA($filename,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename< as new in-file (instead of >$filename<)\n";
-	$filename = "${temp_dir}$temp_filename";
-      }
-      else{ # FastQ format, default
-	my $temp_filename = subset_input_file_FastQ($filename,$pid,$offset);
-	warn "Using the subset file >${temp_dir}$temp_filename< as new in-file (instead of >$filename<)\n";
-	$filename = "${temp_dir}$temp_filename";
-      }
-    }
-
-    ### Initialising bisulfite conversion filenames
-    my ($C_to_T_infile,$G_to_A_infile);
-
-    ### FastA format
-    if ($sequence_file_format eq 'FASTA'){
-      warn "Inut file is in FastA format\n";
-      if ($directional){
-	($C_to_T_infile) = biTransformFastAFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-      }
-      else{
-	($C_to_T_infile,$G_to_A_infile) = biTransformFastAFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-	$fhs[2]->{inputfile} = $fhs[3]->{inputfile} = $G_to_A_infile;
-      }
-
-      ### Creating 4 different bowtie filehandles and storing the first entry
-      if ($bowtie2){
-	single_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 ($C_to_T_infile,$G_to_A_infile);
-      }
-      else{
-	single_end_align_fragments_to_bisulfite_genome_fastA ($C_to_T_infile,$G_to_A_infile);
-      }
-    }
-
-    ## FastQ format
-    else{
-      warn "Input file is in FastQ format\n";
-      if ($directional){
-	($C_to_T_infile) = biTransformFastQFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-      }
-      elsif($pbat){
-	($G_to_A_infile) = biTransformFastQFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $G_to_A_infile; # PBAT-Seq only uses the G to A converted files
-      }
-      else{
-	($C_to_T_infile,$G_to_A_infile) = biTransformFastQFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-	$fhs[2]->{inputfile} = $fhs[3]->{inputfile} = $G_to_A_infile;
-      }
-
-      ### Creating up to 4 different bowtie filehandles and storing the first entry
-      if ($pbat){
-	if ($bowtie2){ # as of version 0.10.2 we also support PBAT alignments for Bowtie 2
-	  single_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 (undef,$G_to_A_infile);
-	}
-	else{
-	  single_end_align_fragments_to_bisulfite_genome_fastQ (undef,$G_to_A_infile);
-	}
-      }
-      elsif ($bowtie2){
-	single_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 ($C_to_T_infile,$G_to_A_infile);
-      }
-      else{
-	single_end_align_fragments_to_bisulfite_genome_fastQ ($C_to_T_infile,$G_to_A_infile);
-      }
-    }
-
-    start_methylation_call_procedure_single_ends($filename,$C_to_T_infile,$G_to_A_infile,$pid);
-
-  }
-
-  ### MERGING AND DELETING TEMP FILES // TIDYING UP AFTER A MULTICORE PROCESS
-
-  if ($pid){ # only performing this for the parent process
-
-    if ($multicore > 1){
-
-      warn "Now waiting for all child processes to complete\n";
-
-      ### we need to ensure that we wait for all child processes to be finished before continuing
-      # warn "here are the child IDs: @pids\n";
-      # warn "Looping through the child process IDs:\n";
-
-      foreach my $id (@pids){
-	# print "$id\t";
-	my $kid = waitpid ($id,0);
-	# print "Returned: $kid\nExit status: $?\n";
-	unless ($? == 0){
-	  warn "\nChild process terminated with exit signal: '$?'\n\n";
-	}
-      }
-
-      # regenerating names for temporary files
-      my @temp_input;
-      my @temp_output;
-      my @temp_reports;
-      my @temp_unmapped_1;  # will store single end reads or R1 of paired-end
-      my @temp_unmapped_2;
-      my @temp_ambiguous_1; # will store single end reads or R1 of paired-end
-      my @temp_ambiguous_2;
-
-      for (1..$offset){
-
-	# Temp Input Files
-	if ($single_end){
-	  if ($gzip){
-	    push @temp_input, "${original_filename}.temp.${_}.gz";
-	  }
-	  else{
-	    push @temp_input, "${original_filename}.temp.${_}";
-	  }
-
-	}
-	elsif($paired_end){
-	  if ($gzip){
-	    push @temp_input, "${original_filename_1}.temp.${_}.gz";
-	    push @temp_input, "${original_filename_2}.temp.${_}.gz";
-	  }
-	  else{
-	    push @temp_input, "${original_filename_1}.temp.${_}";
-	    push @temp_input, "${original_filename_2}.temp.${_}";
-	  }
-	}
-
-	# if files had a prefix we need to specify it
-	my $add_prefix;
-	if (defined $prefix){
-	  $add_prefix = "${prefix}.";
-	}
-	else{
-	  $add_prefix = '';
-	}
-
-	# Temp Output Files
-	if ($single_end){
-	
-	  if ($bowtie2){
-	    if ($gzip){
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_bismark_bt2.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_bismark_bt2_SE_report.txt";
-	    }
-	    else{
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename}.temp.${_}_bismark_bt2.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename}.temp.${_}_bismark_bt2_SE_report.txt";
-	    }
-	  }
-	  else{
-	    if ($gzip){
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_bismark.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_bismark_SE_report.txt";
-	    }
-	    else{
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename}.temp.${_}_bismark.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename}.temp.${_}_bismark_SE_report.txt";
-	    }
-	  }
-	
-	  if ($unmapped){
-	    if ($gzip){
-	      push @temp_unmapped_1,   "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_unmapped_reads.fq";
-	    }
-	    else{
-	      push @temp_unmapped_1,   "${output_dir}${add_prefix}${original_filename}.temp.${_}_unmapped_reads.fq";
-  	    }
-	  }
-
-	  if ($ambiguous){
-	    if ($gzip){
-	      push @temp_ambiguous_1,  "${output_dir}${add_prefix}${original_filename}.temp.${_}.gz_ambiguous_reads.fq";
-	    }
-	    else{
-	      push @temp_ambiguous_1,  "${output_dir}${add_prefix}${original_filename}.temp.${_}_ambiguous_reads.fq";
-	    }
-	  }
-	
-	}
-	elsif($paired_end){
-	  if ($bowtie2){
-	    if ($gzip){
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_bismark_bt2_pe.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_bismark_bt2_PE_report.txt";
-	    }
-	    else{
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_bismark_bt2_pe.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_bismark_bt2_PE_report.txt";
-	    }
-	  }
-	  else{
-	    if ($gzip){
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_bismark_pe.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_bismark_PE_report.txt";
-	    }
-	    else{
-	      push @temp_output,     "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_bismark_pe.bam";
-	      push @temp_reports,    "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_bismark_PE_report.txt";
-	    }
-	  }
-
-	  if ($unmapped){
-	    if ($gzip){
-	      push @temp_unmapped_1,   "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_unmapped_reads_1.fq";
-	      push @temp_unmapped_2,   "${output_dir}${add_prefix}${original_filename_2}.temp.${_}.gz_unmapped_reads_2.fq";
-	    }
-	    else{
-	      push @temp_unmapped_1,   "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_unmapped_reads_1.fq";
-	      push @temp_unmapped_2,   "${output_dir}${add_prefix}${original_filename_2}.temp.${_}_unmapped_reads_2.fq";
-	    }
-	  }
-
-	  if ($ambiguous){
-	    if ($gzip){
-	      push @temp_ambiguous_1,   "${output_dir}${add_prefix}${original_filename_1}.temp.${_}.gz_ambiguous_reads_1.fq";
-	      push @temp_ambiguous_2,   "${output_dir}${add_prefix}${original_filename_2}.temp.${_}.gz_ambiguous_reads_2.fq";
-	    }
-	    else{
-	      push @temp_ambiguous_1,   "${output_dir}${add_prefix}${original_filename_1}.temp.${_}_ambiguous_reads_1.fq";
-	      push @temp_ambiguous_2,   "${output_dir}${add_prefix}${original_filename_2}.temp.${_}_ambiguous_reads_2.fq";
-	    }
-	  }
-	
-	}
-      }
-
-      warn "\n\nRight, cleaning up now...\n\n";
-
-      # deleting temp files;
-      warn "Deleting temporary sequence files...\n";
-      foreach my $temp (@temp_input){
-	#print "$temp\t";
-	$temp =~ s/.*\///; # deleting path information
-	print "${temp_dir}${temp}\t";
-	unlink "${temp_dir}${temp}" or warn "Failed to delete temporary FastQ file ${temp_dir}$temp: $!\n";
-      }
-      print "\n\n";
-
-      # merging temp BAM files
-      if ($single_end){
-	merge_individual_BAM_files(\@temp_output,$original_filename,$single_end);
-      }
-      else{
-	merge_individual_BAM_files(\@temp_output,$original_filename_1,$single_end);
-      }
-
-      # deleting temp BAM files
-      warn "Deleting temporary BAM files...\n";
-      foreach my $temp (@temp_output){
-	# print "$temp\t";
-	$temp =~ s/.*\///; # deleting path information
-	print "${output_dir}${temp}\t";
-	unlink "${output_dir}${temp}" or warn "Failed to delete temporary BAM file ${output_dir}${temp}: $!\n";
-      }
-      print "\n\n";
-
-      if ($unmapped){
-	if ($single_end){
-	  merge_individual_unmapped_files(\@temp_unmapped_1,$original_filename,$single_end);
-	}
-	else{
-	  merge_individual_unmapped_files(\@temp_unmapped_1,$original_filename_1,$single_end,'_1');
-	  merge_individual_unmapped_files(\@temp_unmapped_2,$original_filename_2,$single_end,'_2');
-	}
-
-	# deleting temp unmapped files
-	warn "Deleting temporary unmapped files...\n";
-	foreach my $temp (@temp_unmapped_1){
-	  print "$temp\t";
-	  unlink "${output_dir}${temp}" or warn "Failed to delete temporary unmapped FastQ file ${output_dir}$temp: $!\n";
-	}
-	if ($paired_end){
-	  foreach my $temp (@temp_unmapped_2){
-	    print "$temp\t";
-	    unlink "${output_dir}${temp}" or warn "Failed to delete temporary unmapped FastQ file ${output_dir}$temp: $!\n";
-	  }
-	}
-	print "\n\n";
-
-      }
-
-      if ($ambiguous){
-	if ($single_end){
-	  merge_individual_ambiguous_files(\@temp_ambiguous_1,$original_filename,$single_end);
-	}
-	else{
-	  merge_individual_ambiguous_files(\@temp_ambiguous_1,$original_filename_1,$single_end,'_1');
-	  merge_individual_ambiguous_files(\@temp_ambiguous_2,$original_filename_2,$single_end,'_2');
-	}
-
-	# deleting temp ambiguous files
-	warn "Deleting temporary ambiguous files...\n";
-	foreach my $temp (@temp_ambiguous_1){
-	  print "$temp\t";
-	  unlink "${output_dir}${temp}" or warn "Failed to delete temporary ambiguous FastQ file ${output_dir}$temp: $!\n";
-	}
-
-	if ($paired_end){
-	  foreach my $temp (@temp_ambiguous_2){
-	    print "$temp\t";
-	    unlink "${output_dir}${temp}" or warn "Failed to delete temporary ambiguous FastQ file ${output_dir}$temp: $!\n";
-	  }
-	}
-	print "\n\n";
-      }
-
-      # resetting the counters once more so we can add all data from all temporary reports
-      reset_counters_and_fhs($original_filename);
-
-      ### Merging the Bismark mapping report files
-      if ($single_end){
-	merge_individual_splitting_reports(\@temp_reports,$original_filename,$single_end);
-	print_final_analysis_report_single_end('mock_file1','mock_file_2','mock_pid','mergeThis');
-      }
-      else{
-	merge_individual_splitting_reports(\@temp_reports,$original_filename_1,$single_end,$original_filename_2);
-	print_final_analysis_report_paired_ends('mock_file1','mock_file_2','mock_file3','mock_file_4','mock_pid','mergeThis');
-      }
-
-      # deleting temp report files
-      warn "Deleting temporary report files...\n";
-      foreach my $temp (@temp_reports){
-	print "$temp\t";
-	unlink "${output_dir}${temp}" or warn "Failed to delete temporary report file $output_dir$temp: $!\n";
-      }
-      print "\n\n";
-
-    }
-
-  }
-
-  if ($pid){ # only for the Parent
-    warn "\n====================\nBismark run complete\n====================\n\n";
-  }
-
-}
-
-sub merge_individual_splitting_reports{
-
-  my ($temp_reports,$original_filename_1,$single_end,$original_filename_2) = @_;
-  my $report_file = $original_filename_1;
-  $report_file =~ s/.*\///; # removing path information
-  if ($prefix){
-    $report_file = "${prefix}.${report_file}";
-  }
-
-  if ($basename){ # Output file basename is set using the -B argument
-    $report_file = ${basename};
-  }
-
-  if ($single_end){
-    if ($bowtie2){
-      $report_file .= '_bismark_bt2_SE_report.txt';
-    }
-    else{
-      $report_file .= '_bismark_SE_report.txt';
-    }
-  }
-  else{
-    if ($bowtie2){
-      $report_file .= '_bismark_bt2_PE_report.txt';
-    }
-    else{
-      $report_file .= '_bismark_PE_report.txt';
-    }
-  }
-  warn "Writing report to ${output_dir}${report_file}\n";
-  open (REPORT,'>',"$output_dir$report_file") or die "Failed to write to ${output_dir}${report_file}: $!\n";
-
-  foreach my $temp(@$temp_reports){
-    $temp =~ s/.*\///; # removing path information
-  }
-
-  warn "Now merging temporary reports @$temp_reports into >>> ${output_dir}${report_file} <<<\n";
-
-  if ($single_end){
-    print REPORT "Bismark report for: $original_filename_1 (version: $bismark_version)\n";
-  }
-  else{ # paired-end
-    print REPORT "Bismark report for: $original_filename_1 and $original_filename_2 (version: $bismark_version)\n";
-  }
-
-
-  my $first = 0;
-
-  foreach my $temp(@$temp_reports){
-    # $temp =~ s/.*\///; # removing path information
-
-    warn "Merging from file >> $temp <<\n";
-    open (IN,"${output_dir}${temp}") or die "Failed to read from temporary mapping report '${output_dir}${temp}'\n";
-
-    ### this is printing the first couple of lines
-    while (<IN>){
-      chomp;
-      if ($_ =~ /^Bismark report/){
-	next;
-      }
-
-      unless ($first){ # only happens for the first run we are processing
-	if ($_ =~ /^Final Alignment/){
-	  ++$first;
-	  last;
-	}
-	else{
-	  print REPORT "$_\n";
-	}
-      }
-    }
-    close IN or warn "Failed to close filehandle\n";
-
-    ### Simon says: You are going to regret this in the future. Just for the record. He might be right...
-    read_alignment_report($temp,$single_end);
-
-  }
-  warn "\n";
-
-}
-
-sub read_alignment_report{
-  my ($report,$single_end) = @_;
-
-  my $unique;
-  my $no_aln;
-  my $multiple;
-  my $no_genomic;
-  my $total_seqs;
-  my $bismark_version;
-  my $input_filename;
-
-  my $unique_text;
-  my $no_aln_text;
-  my $multiple_text;
-  my $total_seq_text;
-
-  my $total_C_count;
-  my ($meth_CpG,$meth_CHG,$meth_CHH,$meth_unknown);
-  my ($unmeth_CpG,$unmeth_CHG,$unmeth_CHH,$unmeth_unknown);
-
-  my $number_OT;
-  my $number_CTOT;
-  my $number_CTOB;
-  my $number_OB;
-
-  open (ALN,"${output_dir}${report}") or die "Failed to read from temporary mapping report '$output_dir$report'\n";
-
-  while (<ALN>){
-    chomp;
-
-    ### General Alignment stats
-    if ($_ =~ /^Sequence pairs analysed in total:/ ){ ## Paired-end
-      (undef,$total_seqs) = split /\t/;
-      # warn "Total paired seqs: >> $total_seqs <<\n";
-    }
-    elsif ($_ =~ /^Sequences analysed in total:/ ){   ## Single-end
-      (undef,$total_seqs) = split /\t/;
-      # warn "total single-end seqs >> $total_seqs <<\n";
-    }
-
-    elsif($_ =~ /^Number of paired-end alignments with a unique best hit:/){ ## Paired-end
-      (undef,$unique) = split /\t/;
-      # warn "Unique PE>> $unique <<\n";
-    }
-    elsif($_ =~ /^Number of alignments with a unique best hit from/){        ## Single-end
-      (undef,$unique) = split /\t/;
-      # warn "Unique SE>> $unique <<\n";
-    }
-
-    elsif($_ =~ /^Sequence pairs with no alignments under any condition:/){  ## Paired-end
-      (undef,$no_aln) = split /\t/;
-      # warn "No alignment PE >> $no_aln <<\n";
-    }
-    elsif($_ =~ /^Sequences with no alignments under any condition:/){  ## Single-end
-      (undef,$no_aln) = split /\t/;
-      # warn "No alignments SE>> $no_aln <<\n";
-    }
-
-    elsif($_ =~ /^Sequence pairs did not map uniquely:/){ ## Paired-end
-      (undef,$multiple) = split /\t/;
-      # warn "Multiple alignments PE >> $multiple <<\n";
-    }
-    elsif($_ =~ /^Sequences did not map uniquely:/){ ## Single-end
-      (undef,$multiple) = split /\t/;
-      # warn "Multiple alignments SE >> $multiple <<\n";
-    }
-
-    elsif($_ =~ /^Sequence pairs which were discarded because genomic sequence could not be extracted:/){ ## Paired-end
-      (undef,$no_genomic) = split /\t/;
-      # warn "No genomic sequence PE >> $no_genomic <<\n";
-    }
-    elsif($_ =~ /^Sequences which were discarded because genomic sequence could not be extracted:/){ ## Single-end
-      (undef,$no_genomic) = split /\t/;
-      # warn "No genomic sequence SE>> $no_genomic <<\n";
-    }
-
-    ### Context Methylation
-    elsif($_ =~ /^Total number of C/ ){
-      (undef,$total_C_count) = split /\t/;
-      # warn "Total number C >> $total_C_count <<\n";
-    }
-
-    elsif($_ =~ /^Total methylated C\'s in CpG context:/ ){
-      (undef,$meth_CpG) = split /\t/;
-      # warn "meth CpG >> $meth_CpG <<\n" ;
-    }
-    elsif($_ =~ /^Total methylated C\'s in CHG context:/ ){
-      (undef,$meth_CHG) = split /\t/;
-      # warn "meth CHG >> $meth_CHG <<\n" ;
-    }
-    elsif($_ =~ /^Total methylated C\'s in CHH context:/ ){
-      (undef,$meth_CHH) = split /\t/;
-      # warn "meth CHH >> $meth_CHH <<\n" ;
-    }
-    elsif($_ =~ /^Total methylated C\'s in Unknown context:/ ){
-      (undef,$meth_unknown) = split /\t/;
-      # warn "meth Unknown >> $meth_unknown <<\n" ;
-    }
-
-    elsif($_ =~ /^Total unmethylated C\'s in CpG context:/ or $_ =~ /^Total C to T conversions in CpG context:/){
-      (undef,$unmeth_CpG) = split /\t/;
-      # warn "unmeth CpG >> $unmeth_CpG <<\n" ;
-    }
-    elsif($_ =~ /^Total unmethylated C\'s in CHG context:/ or $_ =~ /^Total C to T conversions in CHG context:/){
-      (undef,$unmeth_CHG) = split /\t/;
-      # warn "unmeth CHG >> $unmeth_CHG <<\n" ;
-    }
-    elsif($_ =~ /^Total unmethylated C\'s in CHH context:/ or $_ =~ /^Total C to T conversions in CHH context:/){
-      (undef,$unmeth_CHH) = split /\t/;
-      # warn "unmeth CHH >> $unmeth_CHH <<\n";
-    }
-    elsif($_ =~ /^Total unmethylated C\'s in Unknown context:/ or $_ =~ /^Total C to T conversions in Unknown context:/){
-      (undef,$unmeth_unknown) = split /\t/;
-      # warn "unmeth Unknown >> $unmeth_unknown <<\n" ;
-    }
-
-    ### Strand Origin
-
-    elsif($_ =~ /^CT\/GA\/CT:/ ){             ## Paired-end
-      (undef,$number_OT) = split /\t/;
-      # warn "Number OT PE>> $number_OT <<\n" ;
-    }
-    elsif($_ =~ /^CT\/CT:/ ){                 ## Single-end
-      (undef,$number_OT) = split /\t/;
-      # warn "Number OT SE>> $number_OT <<\n" ;
-    }
-
-    elsif($_ =~ /^GA\/CT\/CT:/ ){             ## Paired-end
-      (undef,$number_CTOT) = split /\t/;
-      # warn "Number CTOT PE >> $number_CTOT <<\n" ;
-    }
-    elsif($_ =~ /^GA\/CT:/ ){                 ## Single-end
-      (undef,$number_CTOT) = split /\t/;
-      # warn "Number CTOT SE >> $number_CTOT <<\n" ;
-    }
-
-    elsif($_ =~ /^GA\/CT\/GA:/ ){             ## Paired-end
-      (undef,$number_CTOB) = split /\t/;
-      # warn "Number CTOB PE >> $number_CTOB <<\n" ;
-    }
-    elsif($_ =~ /^GA\/GA:/ ){                 ## Single-end
-      (undef,$number_CTOB) = split /\t/;
-      # warn "Number CTOB SE >> $number_CTOB <<\n";
-    }
-
-    elsif($_ =~ /^CT\/GA\/GA:/ ){             ## Paired-end
-      (undef,$number_OB) = split /\t/;
-      # warn "Number OB PE >> $number_OB <<\n";
-    }
-    elsif($_ =~ /^CT\/GA:/ ){                 ## Single-end
-      (undef,$number_OB) = split /\t/;
-      # warn "Number OB SE >> $number_OB <<\n";
-    }
-  }
-
-  $counting{sequences_count}                               += $total_seqs;
-  $counting{unique_best_alignment_count}                   += $unique;
-  $counting{no_single_alignment_found}                     += $no_aln;
-  $counting{unsuitable_sequence_count}                     += $multiple;
-  $counting{genomic_sequence_could_not_be_extracted_count} += $no_genomic;
-
-  $counting{total_meCHH_count}                             += $meth_CHH;
-  $counting{total_meCHG_count}                             += $meth_CHG;
-  $counting{total_meCpG_count}                             += $meth_CpG;
-  if ($bowtie2){
-    $counting{total_meC_unknown_count}                     += $meth_unknown;
-  }
-
-  $counting{total_unmethylated_CHH_count}                  += $unmeth_CHH;
-  $counting{total_unmethylated_CHG_count}                  += $unmeth_CHG;
-  $counting{total_unmethylated_CpG_count}                  += $unmeth_CpG;
-  if ($bowtie2){
-    $counting{total_unmethylated_C_unknown_count}          += $unmeth_unknown;
-  }
-
-  if ($single_end){
-    $counting{CT_CT_count}    += $number_OT;
-    $counting{CT_GA_count}    += $number_OB;
-    $counting{GA_CT_count}    += $number_CTOT;
-    $counting{GA_GA_count}    += $number_CTOB;
-  }
-  else{
-    # paired-end
-    $counting{GA_CT_CT_count} += $number_CTOT;
-    $counting{CT_GA_CT_count} += $number_OT;
-    $counting{GA_CT_GA_count} += $number_CTOB;
-    $counting{CT_GA_GA_count} += $number_OB;
-  }
-}
-
-sub merge_individual_ambiguous_files{
-
-  my ($temp_ambiguous,$original_filename,$single_end,$paired_information) = @_;
-  my $ambiguous_file = $original_filename;
-  $ambiguous_file =~ s/.*\///; # removing path information
-
-  if ($prefix){
-    $ambiguous_file = "${prefix}.${ambiguous_file}";
-  }
-
-  if ($single_end){
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file = "${basename}_ambiguous_reads.fq.gz";
-      }
-      else{
-	$ambiguous_file = "${basename}_ambiguous_reads.fa.gz";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file =~ s/$/_ambiguous_reads.fq.gz/;
-      }
-      else{
-	$ambiguous_file =~ s/$/_ambiguous_reads.fa.gz/;
-      }
-    }
-  }
-  else{ # paired-end
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file = "${basename}_ambiguous_reads${paired_information}.fq.gz";
-      }
-      else{
-	$ambiguous_file = "${basename}_ambiguous_reads${paired_information}.fa.gz";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file =~ s/$/_ambiguous_reads${paired_information}.fq.gz/;
-      }
-      else{
-	$ambiguous_file =~ s/$/_ambiguous_reads${paired_information}.fa.gz/;
-      }
-    }
-  }
-
-  foreach my $temp(@$temp_ambiguous){
-    $temp =~ s/.*\///; # removing path information
-  }
-
-  open (AMBIGUOUS,"| gzip -c - > $output_dir$ambiguous_file") or die "Failed to write to $ambiguous_file: $!\n";
-  warn "Now merging ambiguous sequences @$temp_ambiguous into >>> $output_dir$ambiguous_file <<<\n";
-
-  foreach my $temp(@$temp_ambiguous){
-    warn "Merging from file >> $temp <<\n";
-    if ($temp =~ /gz$/){
-      open (IN,"zcat ${output_dir}$temp |") or die "Failed to read from ambiguous temp file '${output_dir}$temp'\n";
-    }
-    else{
-      open (IN,"${output_dir}$temp") or die "Failed to read from ambiguous temp file '${output_dir}$temp'\n";
-    }
-
-    while (<IN>){
-      print AMBIGUOUS;
-    }
-    close IN or warn "Failed to close filehandle\n";
-  }
-  warn "\n";
-
-  close AMBIGUOUS or warn "Failed to close output filehandle AMBIGUOUS\n\n";
-}
-
-
-sub merge_individual_unmapped_files{
-
-  my ($temp_unmapped,$original_filename,$single_end,$paired_information) = @_;
-  my $unmapped_file = $original_filename;
-  $unmapped_file =~ s/.*\///; # removing path information
-
-  if ($prefix){
-    $unmapped_file = "${prefix}.${unmapped_file}";
-  }
-
-  if ($single_end){
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file = "${basename}_unmapped_reads.fq.gz";
-      }
-      else{
-	$unmapped_file = "${basename}_unmapped_reads.fa.gz";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file =~ s/$/_unmapped_reads.fq.gz/;
-      }
-      else{
-	$unmapped_file =~ s/$/_unmapped_reads.fa.gz/;
-      }
-    }
-  }
-  else{ # paired-end
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file = "${basename}_unmapped_reads${paired_information}.fq.gz";
-      }
-      else{
-	$unmapped_file = "${basename}_unmapped_reads${paired_information}.fa.gz";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file =~ s/$/_unmapped_reads${paired_information}.fq.gz/;
-      }
-      else{
-	$unmapped_file =~ s/$/_unmapped_reads${paired_information}.fa.gz/;
-      }
-    }
-  }
-
-  foreach my $temp(@$temp_unmapped){
-    $temp =~ s/.*\///; # removing path information
-  }
-
-  open (UNMAPPED,"| gzip -c - > ${output_dir}${unmapped_file}") or die "Failed to write to ${output_dir}${unmapped_file}: $!\n";
-  warn "Now merging unmapped sequences @$temp_unmapped into >>> ${output_dir}${unmapped_file} <<<\n";
-
-  foreach my $temp(@$temp_unmapped){
-    warn "Merging from file >> $temp <<\n";
-    if ($temp =~ /gz$/){
-      open (IN,"zcat ${output_dir}${temp} |") or die "Failed to read from unmapped temp file '${output_dir}$temp'\n";
-    }
-    else{
-      open (IN,"${output_dir}${temp}") or die "Failed to read from unmapped temp file '${output_dir}${temp}'\n";
-    }
-
-    while (<IN>){
-      print UNMAPPED;
-    }
-    close IN or warn "Failed to close filehandle\n";
-  }
-  warn "\n";
-
-  close UNMAPPED or warn "Failed to close output filehandle UNMAPPED\n\n";
-}
-
-
-sub merge_individual_BAM_files{
-
-  my ($tempbam,$original_filename,$single_end) = @_;
-  my $merged_name = $original_filename;
-
-  # warn "merged name is: $merged_name\n";
-  $merged_name =~ s/.*\///; # deleting path information
-  # warn "merged name is: $merged_name\n"; sleep(1);
-
-  foreach my $temp_bam(@$tempbam){
-    $temp_bam =~ s/.*\///; # deleting path information
-  }
-
-  if ($prefix){
-    $merged_name = "$prefix.$merged_name";
-  }
-
-  if ($single_end){
-    if ($bowtie2){ # BAM format is the default for Bowtie 2
-      $merged_name .= '_bismark_bt2.bam';
-    }
-    else{          # BAM is the default output
-      $merged_name .= '_bismark.bam';
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      $merged_name = "${basename}.bam";
-    }
-  }
-  else{
-    if ($bowtie2){ # BAM format is the default for Bowtie 2
-      $merged_name .= '_bismark_bt2_pe.bam';
-    }
-    else{          # BAM is the default output
-      $merged_name .= '_bismark_pe.bam';
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      $merged_name = "${basename}_pe.bam";
-    }
-  }
-
-  warn "Now merging BAM files @$tempbam into >>> $merged_name <<<\n";
-  open (OUT,"| $samtools_path view -bSh 2>/dev/null - > ${output_dir}${merged_name}") or die "Failed to write to $merged_name: $!\n";
-  my $first = 0;
-
-  foreach my $temp_bam(@$tempbam){
-    # $temp_bam =~ s/.*\///; # deleting path information
-
-    warn "Merging from file >> $temp_bam <<\n";
-
-    if ($first > 0){
-      open (IN,"$samtools_path view ${output_dir}${temp_bam} |") or die "Failed to read from BAM file ${output_dir}${temp_bam}\n";
-    }
-    else{ # only for the first file we print the header as well
-      open (IN,"$samtools_path view -h ${output_dir}${temp_bam} |") or die "Failed to read from BAM file ${output_dir}${temp_bam}\n";
-    }
-
-    while (<IN>){
-      print OUT;
-    }
-    close IN or warn "Failed to close filehandle\n";
-    ++$first;
-  }
-  warn "\n";
-
-  close OUT or warn "Failed to close output filehandle\n\n";
-}
-
-sub start_methylation_call_procedure_single_ends {
-  my ($sequence_file,$C_to_T_infile,$G_to_A_infile,$pid) = @_;
-  my ($dir,$filename);
-
-  if ($sequence_file =~ /\//){
-    ($dir,$filename) = $sequence_file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $sequence_file;
-  }
-
-  ### printing all alignments to a results file
-  my $outfile = $filename;
-  if ($prefix){
-    $outfile = "$prefix.$outfile";
-  }
-  if ($bowtie2){ # SAM format is the default for Bowtie 2
-    $outfile =~ s/$/_bismark_bt2.sam/;
-  }
-  elsif ($vanilla){ # vanilla custom Bismark output single-end output (like Bismark versions 0.5.X)
-    $outfile =~ s/$/_bismark.txt/;
-  }
-  else{ # SAM is the default output
-    $outfile =~ s/$/_bismark.sam/;
-  }
-
-  if ($basename){ # Output file basename is set using the -B argument
-    $outfile = "${basename}.sam";
-  }
-
-  $bam = 0 unless (defined $bam);
-
-  if ($bam == 1){ ### Samtools is installed, writing out BAM directly
-    $outfile =~ s/sam$/bam/;
-    open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  elsif($bam == 2){ ### no Samtools found on system. Using GZIP compression instead
-    $outfile .= '.gz';
-    open (OUT,"| gzip -c - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  else{ # uncompressed ouput, default
-    open (OUT,'>',"$output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-
-  warn "\n>>> Writing bisulfite mapping results to $output_dir$outfile <<<\n\n";
-  sleep(1);
-
-  if ($vanilla){
-    print OUT "Bismark version: $bismark_version\n";
-  }
-
-  ### printing alignment and methylation call summary to a report file
-  my $reportfile = $filename;
-  if ($prefix){
-    $reportfile = "$prefix.$reportfile";
-  }
-  if ($bowtie2){
-    $reportfile =~ s/$/_bismark_bt2_SE_report.txt/;
-  }
-  else{
-    $reportfile =~ s/$/_bismark_SE_report.txt/;
-  }
-
-  if ($basename){ # Output file basename is set using the -B argument
-    $reportfile = "${basename}_SE_report.txt";
-  }
-
-  open (REPORT,'>',"$output_dir$reportfile") or die "Failed to write to $reportfile: $!\n";
-  print REPORT "Bismark report for: $sequence_file (version: $bismark_version)\n";
-
-  if ($unmapped){
-    my $unmapped_file = $filename;
-    if ($prefix){
-      $unmapped_file = "$prefix.$unmapped_file";
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file = "${basename}_unmapped_reads.fq";
-      }
-      else{
-	$unmapped_file = "${basename}_unmapped_reads.fa";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_file =~ s/$/_unmapped_reads.fq/;
-      }
-      else{
-	$unmapped_file =~ s/$/_unmapped_reads.fa/;
-      }
-    }
-
-    open (UNMAPPED,'>',"$output_dir$unmapped_file") or die "Failed to write to $unmapped_file: $!\n";
-    warn "Unmapped sequences will be written to $output_dir$unmapped_file\n";
-  }
-
-  if ($ambiguous){
-    my $ambiguous_file = $filename;
-
-    if ($prefix){
-      $ambiguous_file = "$prefix.$ambiguous_file";
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file =  "${basename}_ambiguous_reads.fq";
-      }
-      else{
-	$ambiguous_file =  "${basename}_ambiguous_reads.fa";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$ambiguous_file =~ s/$/_ambiguous_reads.fq/;
-      }
-      else{
-	$ambiguous_file =~ s/$/_ambiguous_reads.fa/;
-      }
-    }
-    open (AMBIG,'>',"$output_dir$ambiguous_file") or die "Failed to write to $ambiguous_file: $!\n";
-    warn "Ambiguously mapping sequences will be written to $output_dir$ambiguous_file\n";
-  }
-
-  if ($directional){
-    print REPORT "Option '--directional' specified (default mode): alignments to complementary strands (CTOT, CTOB) were ignored (i.e. not performed)\n";
-  }
-  elsif ($pbat){
-    print REPORT "Option '--pbat' specified: alignments to original strands (OT and OB) strands were ignored (i.e. not performed)\n";
-  }
-  else{
-    print REPORT "Option '--non_directional' specified: alignments to all strands were being performed (OT, OB, CTOT, CTOB)\n";
-  }
-
-  if ($bowtie2){
-    print REPORT "Bismark was run with Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    print REPORT "Bismark was run with Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  ### if 2 or more files are provided we can hold the genome in memory and don't need to read it in a second time
-  unless (%chromosomes){
-    my $cwd = getcwd; # storing the path of the current working directory
-    print "Current working directory is: $cwd\n\n";
-    read_genome_into_memory($cwd);
-  }
-
-  unless ($vanilla or $sam_no_hd){
-    generate_SAM_header();
-  }
-
-  ### Input file is in FastA format
-  if ($sequence_file_format eq 'FASTA'){
-    process_single_end_fastA_file_for_methylation_call($sequence_file,$C_to_T_infile,$G_to_A_infile,$pid);
-  }
-  ### Input file is in FastQ format
-  else{
-    process_single_end_fastQ_file_for_methylation_call($sequence_file,$C_to_T_infile,$G_to_A_infile,$pid);
-  }
-}
-
-sub start_methylation_call_procedure_paired_ends {
-  my ($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid) = @_;
-
-  my ($dir_1,$filename_1);
-
-  if ($sequence_file_1 =~ /\//){
-    ($dir_1,$filename_1) = $sequence_file_1 =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename_1 = $sequence_file_1;
-  }
-
-  my ($dir_2,$filename_2);
-
-  if  ($sequence_file_2 =~ /\//){
-    ($dir_2,$filename_2) = $sequence_file_2 =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename_2 = $sequence_file_2;
-  }
-
-  ### printing all alignments to a results file
-  my $outfile = $filename_1;
-
-  if ($prefix){
-    $outfile = "$prefix.$outfile";
-  }
-  if ($bowtie2){ # SAM format is the default Bowtie 2 output
-    $outfile =~ s/$/_bismark_bt2_pe.sam/;
-  }
-  elsif ($vanilla){ # vanilla custom Bismark paired-end output (like Bismark versions 0.5.X)
-    $outfile =~ s/$/_bismark_pe.txt/;
-  }
-  else{ # SAM format is the default Bowtie 1 output
-    $outfile =~ s/$/_bismark_pe.sam/;
-  }
-
-  if ($basename){ # Output file basename is set using the -B argument
-    $outfile = "${basename}_pe.sam";
-  }
-
-
-  $bam = 0 unless (defined $bam);
-
-  if ($bam == 1){ ### Samtools is installed, writing out BAM directly
-    $outfile =~ s/sam$/bam/;
-    open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  elsif($bam == 2){ ### no Samtools found on system. Using GZIP compression instead
-    $outfile .= '.gz';
-    open (OUT,"| gzip -c - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  else{ # uncompressed ouput, default
-    open (OUT,'>',"$output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-
-  warn "\n>>> Writing bisulfite mapping results to $outfile <<<\n\n";
-  sleep(1);
-
-  if ($vanilla){
-    print OUT "Bismark version: $bismark_version\n";
-  }
-
-  ### printing alignment and methylation call summary to a report file
-  my $reportfile = $filename_1;
-  if ($prefix){
-    $reportfile = "$prefix.$reportfile";
-  }
-
-  if ($bowtie2){
-    $reportfile =~ s/$/_bismark_bt2_PE_report.txt/;
-  }
-  else{
-    $reportfile =~ s/$/_bismark_PE_report.txt/;
-  }
-
-  if ($basename){ # Output file basename is set using the -B argument
-    $reportfile = "${basename}_PE_report.txt";
-  }
-
-  open (REPORT,'>',"$output_dir$reportfile") or die "Failed to write to $reportfile: $!\n";
-  print REPORT "Bismark report for: $sequence_file_1 and $sequence_file_2 (version: $bismark_version)\n";
-
-  if ($bowtie2){
-    print REPORT "Bismark was run with Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n";
-  }
-  else{
-    print REPORT "Bismark was run with Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n";
-  }
-
-
-  ### Unmapped read output
-  if ($unmapped){
-    my $unmapped_1 = $filename_1;
-    my $unmapped_2 = $filename_2;
-
-    if ($prefix){
-      $unmapped_1 = "$prefix.$unmapped_1";
-      $unmapped_2 = "$prefix.$unmapped_2";
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_1 = "${basename}_unmapped_reads_1.fq";
-	$unmapped_2 = "${basename}_unmapped_reads_2.fq";
-      }
-      else{
-	$unmapped_1 = "${basename}_unmapped_reads_1.fa";
-	$unmapped_2 = "${basename}_unmapped_reads_2.fa";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$unmapped_1 =~ s/$/_unmapped_reads_1.fq/;
-	$unmapped_2 =~ s/$/_unmapped_reads_2.fq/;
-      }
-      else{
-	$unmapped_1 =~ s/$/_unmapped_reads_1.fa/;
-	$unmapped_2 =~ s/$/_unmapped_reads_2.fa/;
-      }
-    }
-
-    open (UNMAPPED_1,'>',"$output_dir$unmapped_1") or die "Failed to write to $unmapped_1: $!\n";
-    open (UNMAPPED_2,'>',"$output_dir$unmapped_2") or die "Failed to write to $unmapped_2: $!\n";
-    print "Unmapped sequences will be written to $unmapped_1 and $unmapped_2\n";
-  }
-
-  if ($ambiguous){
-    my $amb_1 = $filename_1;
-    my $amb_2 = $filename_2;
-
-    if ($prefix){
-      $amb_1 = "$prefix.$amb_1";
-      $amb_2 = "$prefix.$amb_2";
-    }
-
-    if ($basename){ # Output file basename is set using the -B argument
-      if ($sequence_file_format eq 'FASTQ'){
-	$amb_1 = "${basename}_ambiguous_reads_1.fq";
-	$amb_2 = "${basename}_ambiguous_reads_2.fq";
-      }
-      else{
-	$amb_1 = "${basename}_ambiguous_reads_1.fa";
-	$amb_2 = "${basename}_ambiguous_reads_2.fa";
-      }
-    }
-    else{
-      if ($sequence_file_format eq 'FASTQ'){
-	$amb_1 =~ s/$/_ambiguous_reads_1.fq/;
-	$amb_2 =~ s/$/_ambiguous_reads_2.fq/;
-      }
-      else{
-	$amb_1 =~ s/$/_ambiguous_reads_1.fa/;
-	$amb_2 =~ s/$/_ambiguous_reads_2.fa/;
-      }
-    }
- 
-    open (AMBIG_1,'>',"$output_dir$amb_1") or die "Failed to write to $amb_1: $!\n";
-    open (AMBIG_2,'>',"$output_dir$amb_2") or die "Failed to write to $amb_2: $!\n";
-    print "Ambiguously mapping sequences will be written to $amb_1 and $amb_2\n";
-  }
-
-  if ($directional){
-    print REPORT "Option '--directional' specified (default mode): alignments to complementary strands (CTOT, CTOB) were ignored (i.e. not performed)\n\n";
-  }
-  elsif ($pbat){
-    print REPORT "Option '--pbat' specified: alignments to original strands (OT, OB) were ignored (i.e. not performed)\n\n";
-  }
-  else{
-    print REPORT "Option '--non_directional' specified: alignments to all strands were being performed (OT, OB, CTOT, CTOB)\n\n";
-  }
-
-
-
-
-  ### if 2 or more files are provided we might still hold the genome in memory and don't need to read it in a second time
-  unless (%chromosomes){
-    my $cwd = getcwd; # storing the path of the current working directory
-    warn "Current working directory is: $cwd\n\n";
-    read_genome_into_memory($cwd);
-  }
-
-  unless ($vanilla or $sam_no_hd){
-    generate_SAM_header();
-  }
-
-  ### Input files are in FastA format
-  if ($sequence_file_format eq 'FASTA'){
-    process_fastA_files_for_paired_end_methylation_calls($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid);
-  }
-  ### Input files are in FastQ format
-  else{
-    process_fastQ_files_for_paired_end_methylation_calls($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid);
-  }
-}
-
-sub print_final_analysis_report_single_end{
-  my ($C_to_T_infile,$G_to_A_infile,$pid,$merge_multi) = @_;
-
-  if ($merge_multi){
-    warn "Printing a final merged alignment report for all individual sub-reports\n\n";
-  }
-  else{
-    ### All sequences from the original sequence file have been analysed now
-    ### deleting temporary C->T or G->A infiles
-
-    if ($directional){
-      my $deletion_successful =  unlink "$temp_dir$C_to_T_infile";
-      if ($deletion_successful == 1){
-	warn "\nSuccessfully deleted the temporary file $temp_dir$C_to_T_infile\n\n";
-      }
-      else{
-	warn "Could not delete temporary file $C_to_T_infile properly $!\n";
-      }
-    }
-    elsif ($pbat){
-      my $deletion_successful =  unlink "$temp_dir$G_to_A_infile";
-      if ($deletion_successful == 1){
-	warn "\nSuccessfully deleted the temporary file $temp_dir$G_to_A_infile\n\n";
-      }
-      else{
-	warn "Could not delete temporary file $G_to_A_infile properly $!\n";
-      }
-    }
-    else{
-      my $deletion_successful =  unlink "$temp_dir$C_to_T_infile","$temp_dir$G_to_A_infile";
-      if ($deletion_successful == 2){
-	warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile and $temp_dir$G_to_A_infile\n\n";
-      }
-      else{
-	warn "Could not delete temporary files properly $!\n";
-      }
-    }
-  }
-
-  ### printing a final report for the alignment procedure
-  print REPORT "Final Alignment report\n",'='x22,"\n";
-  warn "Final Alignment report\n",'='x22,"\n";
-  #  foreach my $index (0..$#fhs){
-  #    print "$fhs[$index]->{name}\n";
-  #    print "$fhs[$index]->{seen}\talignments on the correct strand in total\n";
-  #    print "$fhs[$index]->{wrong_strand}\talignments were discarded (nonsensical alignments)\n\n";
-  #  }
-
-  ### printing a final report for the methylation call procedure
-  warn "Sequences analysed in total:\t$counting{sequences_count}\n";
-  print REPORT "Sequences analysed in total:\t$counting{sequences_count}\n";
-  my $percent_alignable_sequences;
-
-  if ($counting{sequences_count} == 0){
-    $percent_alignable_sequences = 0;
-  }
-  else{
-    $percent_alignable_sequences = sprintf ("%.1f",$counting{unique_best_alignment_count}*100/$counting{sequences_count});
-  }
-
-  warn "Number of alignments with a unique best hit from the different alignments:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequences}%\n\n";
-  print REPORT "Number of alignments with a unique best hit from the different alignments:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequences}%\n";
-
-  ### percentage of low complexity reads overruled because of low complexity (thereby creating a bias for highly methylated reads),
-  ### only calculating the percentage if there were any overruled alignments
-  if ($counting{low_complexity_alignments_overruled_count}){
-    my $percent_overruled_low_complexity_alignments = sprintf ("%.1f",$counting{low_complexity_alignments_overruled_count}*100/$counting{sequences_count});
-    #   print REPORT "Number of low complexity alignments which were overruled to have a unique best hit rather than discarding them:\t$counting{low_complexity_alignments_overruled_count}\t(${percent_overruled_low_complexity_alignments}%)\n";
-  }
-
-  print "Sequences with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print "Sequences did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print "Sequences which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print "Number of sequences with unique best (first) alignment came from the bowtie output:\n";
-  print join ("\n","CT/CT:\t$counting{CT_CT_count}\t((converted) top strand)","CT/GA:\t$counting{CT_GA_count}\t((converted) bottom strand)","GA/CT:\t$counting{GA_CT_count}\t(complementary to (converted) top strand)","GA/GA:\t$counting{GA_GA_count}\t(complementary to (converted) bottom strand)"),"\n\n";
-
-  print REPORT "Sequences with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print REPORT "Sequences did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print REPORT "Sequences which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print REPORT "Number of sequences with unique best (first) alignment came from the bowtie output:\n";
-  print REPORT join ("\n","CT/CT:\t$counting{CT_CT_count}\t((converted) top strand)","CT/GA:\t$counting{CT_GA_count}\t((converted) bottom strand)","GA/CT:\t$counting{GA_CT_count}\t(complementary to (converted) top strand)","GA/GA:\t$counting{GA_GA_count}\t(complementary to (converted) bottom strand)"),"\n\n";
-
-  if ($directional){
-    print "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-    print REPORT "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-  }
-
-  ### detailed information about Cs analysed
-  warn "Final Cytosine Methylation Report\n",'='x33,"\n";
-  my $total_number_of_C = $counting{total_meCHH_count}+$counting{total_meCHG_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CpG_count};
-  warn "Total number of C's analysed:\t$total_number_of_C\n\n";
-  warn "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  warn "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  warn "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    warn "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n";
-  }
-  warn "\n";
-
-  warn "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  warn "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  warn "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    warn "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n";
-  }
-  warn "\n";
-
-  print REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-  print REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-  print REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  print REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  print REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n";
-  }
-  print REPORT "\n";
-
-  print REPORT "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  print REPORT "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  print REPORT "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n";
-  }
-  print REPORT "\n";
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meC_unknown;
-  if (($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}) > 0){
-    $percent_meC_unknown = sprintf("%.1f",100*$counting{total_meC_unknown_count}/($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}));
-  }
-
-
-  ### printing methylated CpG percentage if applicable
-  if ($percent_meCpG){
-    warn "C methylated in CpG context:\t${percent_meCpG}%\n";
-    print REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (CHG context) if applicable
-  if ($percent_meCHG){
-    warn "C methylated in CHG context:\t${percent_meCHG}%\n";
-    print REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (CHH context) if applicable
-  if ($percent_meCHH){
-    warn "C methylated in CHH context:\t${percent_meCHH}%\n";
-    print REPORT "C methylated in CHH context:\t${percent_meCHH}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (Unknown C context) if applicable
-  if ($bowtie2){
-    if ($percent_meC_unknown){
-      warn "C methylated in Unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-      print REPORT "C methylated in Unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in Unknown context (CN or CHN) if value was 0\n";
-      print REPORT "Can't determine percentage of methylated Cs in Unknown context (CN or CHN) if value was 0\n";
-    }
-  }
-  print REPORT "\n\n";
-  warn "\n\n";
-
-  if ($seqID_contains_tabs){
-    warn "The sequence IDs in the provided file contain tab-stops which might prevent sequence alignments. If this happened, please replace all tab characters within the seqID field with spaces before running Bismark.\n\n";
-    print REPORT "The sequence IDs in the provided file contain tab-stops which might prevent sequence alignments. If this happened, please replace all tab characters within the seqID field with spaces before running Bismark.\n\n";
-  }
-}
-
-
-sub print_final_analysis_report_paired_ends{
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid,$merge_multi) = @_;
-
-  if ($merge_multi){
-    warn "Printing a final merged alignment report for all individual sub-reports\n\n";
-  }
-  else{
-    ### All sequences from the original sequence file have been analysed now, therefore deleting temporary C->T or G->A infiles
-    if ($directional){
-      if ($G_to_A_infile_2){
-	my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1","$temp_dir$G_to_A_infile_2";
-	if ($deletion_successful == 2){
-	  warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile_1 and $temp_dir$G_to_A_infile_2\n\n";
-	}
-	else{
-	  warn "Could not delete temporary files $temp_dir$C_to_T_infile_1 and $temp_dir$G_to_A_infile_2 properly: $!\n";
-	}
-      }
-      else{ # for paired-end FastQ infiles with Bowtie1 there is only one file to delete
-	my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1";
-	if ($deletion_successful == 1){
-	  warn "\nSuccessfully deleted the temporary file $temp_dir$C_to_T_infile_1\n\n";
-	}
-	else{
-	  warn "Could not delete temporary file $temp_dir$C_to_T_infile_1 properly: $!\n";
-	}
-      }
-    }
-    else{
-      if ($G_to_A_infile_2 and $C_to_T_infile_2){
-	my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1","$temp_dir$G_to_A_infile_1","$temp_dir$C_to_T_infile_2","$temp_dir$G_to_A_infile_2";
-	if ($deletion_successful == 4){
-	  warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile_1, $temp_dir$G_to_A_infile_1, $temp_dir$C_to_T_infile_2 and $temp_dir$G_to_A_infile_2\n\n";
-	}
-	else{
-	  warn "Could not delete temporary files properly: $!\n";
-	}
-      }
-      else{ # for paired-end FastQ infiles with Bowtie1 there are only two files to delete
-	my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1","$temp_dir$G_to_A_infile_1";
-	if ($deletion_successful == 2){
-	  warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile_1 and $temp_dir$G_to_A_infile_1\n\n";
-	}
-	else{
-	  warn "Could not delete temporary files properly: $!\n";
-	}
-      }
-    }
-  }
-
-  ### printing a final report for the alignment procedure
-  warn "Final Alignment report\n",'='x22,"\n";
-  print REPORT "Final Alignment report\n",'='x22,"\n";
-  #  foreach my $index (0..$#fhs){
-  #    print "$fhs[$index]->{name}\n";
-  #    print "$fhs[$index]->{seen}\talignments on the correct strand in total\n";
-  #    print "$fhs[$index]->{wrong_strand}\talignments were discarded (nonsensical alignments)\n\n";
-  #  }
-
-  ### printing a final report for the methylation call procedure
-  warn "Sequence pairs analysed in total:\t$counting{sequences_count}\n";
-  print REPORT "Sequence pairs analysed in total:\t$counting{sequences_count}\n";
-
-  my $percent_alignable_sequence_pairs;
-  if ($counting{sequences_count} == 0){
-    $percent_alignable_sequence_pairs = 0;
-  }
-  else{
-    $percent_alignable_sequence_pairs = sprintf ("%.1f",$counting{unique_best_alignment_count}*100/$counting{sequences_count});
-  }
-  print "Number of paired-end alignments with a unique best hit:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequence_pairs}%\n\n";
-  print REPORT "Number of paired-end alignments with a unique best hit:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequence_pairs}% \n";
-
-  print "Sequence pairs with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print "Sequence pairs did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print "Sequence pairs which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print "Number of sequence pairs with unique best (first) alignment came from the bowtie output:\n";
-  print join ("\n","CT/GA/CT:\t$counting{CT_GA_CT_count}\t((converted) top strand)","GA/CT/CT:\t$counting{GA_CT_CT_count}\t(complementary to (converted) top strand)","GA/CT/GA:\t$counting{GA_CT_GA_count}\t(complementary to (converted) bottom strand)","CT/GA/GA:\t$counting{CT_GA_GA_count}\t((converted) bottom strand)"),"\n\n";
-
-
-  print REPORT "Sequence pairs with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print REPORT "Sequence pairs did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print REPORT "Sequence pairs which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print REPORT "Number of sequence pairs with unique best (first) alignment came from the bowtie output:\n";
-  print REPORT join ("\n","CT/GA/CT:\t$counting{CT_GA_CT_count}\t((converted) top strand)","GA/CT/CT:\t$counting{GA_CT_CT_count}\t(complementary to (converted) top strand)","GA/CT/GA:\t$counting{GA_CT_GA_count}\t(complementary to (converted) bottom strand)","CT/GA/GA:\t$counting{CT_GA_GA_count}\t((converted) bottom strand)"),"\n\n";
-  ### detailed information about Cs analysed
-
-  if ($directional){
-    print "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-    print REPORT "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-  }
-
-  warn "Final Cytosine Methylation Report\n",'='x33,"\n";
-  print REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-  my $total_number_of_C = $counting{total_meCHG_count}+ $counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-  warn "Total number of C's analysed:\t$total_number_of_C\n\n";
-  warn "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  warn "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  warn "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    warn "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n";
-  }
-  warn "\n";
-
-  warn "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  warn "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  warn "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    warn "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n";
-  }
-  warn "\n";
-
-  print REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-  print REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  print REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  print REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n\n";
-  }
-  print REPORT "\n";
-
-  print REPORT "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  print REPORT "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  print REPORT "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n\n";
-  }
-  print REPORT "\n";
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meC_unknown;
-  if (($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}) > 0){
-    $percent_meC_unknown = sprintf("%.1f",100*$counting{total_meC_unknown_count}/($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}));
-  }
-
-
-  ### printing methylated CpG percentage if applicable
-  if ($percent_meCpG){
-    warn "C methylated in CpG context:\t${percent_meCpG}%\n";
-    print REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage in CHG context if applicable
-  if ($percent_meCHG){
-    warn "C methylated in CHG context:\t${percent_meCHG}%\n";
-    print REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage in CHH context if applicable
-  if ($percent_meCHH){
-    warn "C methylated in CHH context:\t${percent_meCHH}%\n";
-    print REPORT "C methylated in CHH context:\t${percent_meCHH}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (Unknown C context) if applicable
-  if ($bowtie2){
-    if ($percent_meC_unknown){
-      warn "C methylated in unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-      print REPORT "C methylated in unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in unknown context (CN or CHN) if value was 0\n";
-      print REPORT "Can't determine percentage of methylated Cs in unknown context (CN or CHN) if value was 0\n";
-    }
-  }
-  print REPORT "\n\n";
-  warn "\n\n";
-
-}
-
-sub process_single_end_fastA_file_for_methylation_call{
-  my ($sequence_file,$C_to_T_infile,$G_to_A_infile,$pid) = @_;
-  ### this is a FastA sequence file; we need the actual sequence to compare it against the genomic sequence in order to make a methylation call.
-  ### Now reading in the sequence file sequence by sequence and see if the current sequence was mapped to one (or both) of the converted genomes in either
-  ### the C->T or G->A version
-
-  ### gzipped version of the infile
-  if ($sequence_file =~ /\.gz$/){
-    open (IN,"zcat $sequence_file |") or die $!;
-  }
-  else{
-    open (IN,$sequence_file) or die $!;
-  }
-
-  my $count = 0;
-
-  warn "\nReading in the sequence file $sequence_file\n";
-  while (1) {
-    # last if ($counting{sequences_count} > 100);
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    last unless ($identifier and $sequence);
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequences so far\n";
-    }
-    chomp $sequence;
-    chomp $identifier;
-
-    $identifier =~ s/^>//; # deletes the > at the beginning of FastA headers
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_single_end_bowtie2 (uc$sequence,$identifier);
-    }
-    else{
-      $return = check_bowtie_results_single_end(uc$sequence,$identifier); # default Bowtie 1
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequence to ambiguous.out if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      print AMBIG ">$identifier\n";	
-      print AMBIG "$sequence\n";
-    }
-
-    # print the sequence to <unmapped.out> file if --un was specified
-    elsif ($unmapped and $return == 1){
-      print UNMAPPED ">$identifier\n";	
-      print UNMAPPED "$sequence\n";
-    }
-  }
-  print "Processed $counting{sequences_count} sequences in total\n\n";
-
-  print_final_analysis_report_single_end($C_to_T_infile,$G_to_A_infile,$pid);
-
-}
-
-sub process_single_end_fastQ_file_for_methylation_call{
-
-  my ($sequence_file,$C_to_T_infile,$G_to_A_infile,$pid) = @_;
-
-  ### this is the Illumina sequence file; we need the actual sequence to compare it against the genomic sequence in order to make a methylation call.
-  ### Now reading in the sequence file sequence by sequence and see if the current sequence was mapped to one (or both) of the converted genomes in either
-  ### the C->T or G->A version
-
-  ### gzipped version of the infile
-  if ($sequence_file =~ /\.gz$/){
-    open (IN,"zcat $sequence_file |") or die $!;
-  }
-  else{
-    open (IN,$sequence_file) or die $!;
-  }
-
-  my $count = 0;
-
-  warn "\nReading in the sequence file $sequence_file\n";
-  while (1) {
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    my $identifier_2 = <IN>;
-    my $quality_value = <IN>;
-    last unless ($identifier and $sequence and $identifier_2 and $quality_value);
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequences so far\n";
-    }
-    chomp $sequence;
-    chomp $identifier;
-    chomp $quality_value;
-
-    $identifier =~ s/^\@//;  # deletes the @ at the beginning of Illumin FastQ headers
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_single_end_bowtie2 (uc$sequence,$identifier,$quality_value);
-    }
-    else{
-      $return = check_bowtie_results_single_end(uc$sequence,$identifier,$quality_value); # default Bowtie 1
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequence to ambiguous.out if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      print AMBIG "\@$identifier\n";	
-      print AMBIG "$sequence\n";
-      print AMBIG $identifier_2;	
-      print AMBIG "$quality_value\n";
-    }
-
-    # print the sequence to <unmapped.out> file if --un was specified
-    elsif ($unmapped and $return == 1){
-      print UNMAPPED "\@$identifier\n";	
-      print UNMAPPED "$sequence\n";
-      print UNMAPPED $identifier_2;	
-      print UNMAPPED "$quality_value\n";
-    }
-  }
-  print "Processed $counting{sequences_count} sequences in total\n\n";
-
-  print_final_analysis_report_single_end($C_to_T_infile,$G_to_A_infile,$pid);
-
-}
-
-sub process_fastA_files_for_paired_end_methylation_calls{
-  my ($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid) = @_;
-  ### Processing the two FastA sequence files; we need the actual sequences of both reads to compare them against the genomic sequence in order to
-  ### make a methylation call. The sequence idetifier per definition needs to be the same for a sequence pair used for paired-end mapping.
-  ### Now reading in the sequence files sequence by sequence and see if the current sequences produced an alignment to one (or both) of the
-  ### converted genomes (either the C->T or G->A version)
-
-  ### gzipped version of the infiles
-  if ($sequence_file_1 =~ /\.gz$/ and $sequence_file_2 =~ /\.gz$/){
-    open (IN1,"zcat $sequence_file_1 |") or die "Failed to open zcat pipe to $sequence_file_1 $!\n";
-    open (IN2,"zcat $sequence_file_2 |") or die "Failed to open zcat pipe to $sequence_file_2 $!\n";
-  }
-  else{
-    open (IN1,$sequence_file_1) or die $!;
-    open (IN2,$sequence_file_2) or die $!;
-  }
-
-  warn "\nReading in the sequence files $sequence_file_1 and $sequence_file_2\n";
-  ### Both files are required to have the exact same number of sequences, therefore we can process the sequences jointly one by one
-
-  my $count = 0;
-
-  while (1) {
-    # reading from the first input file
-    my $identifier_1 = <IN1>;
-    my $sequence_1 = <IN1>;
-    # reading from the second input file
-    my $identifier_2 = <IN2>;
-    my $sequence_2 = <IN2>;
-    last unless ($identifier_1 and $sequence_1 and $identifier_2 and $sequence_2);
-
-    $identifier_1 = fix_IDs($identifier_1); # this is to avoid problems with truncated read ID when they contain white spaces
-    $identifier_2 = fix_IDs($identifier_2);
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequence pairs so far\n";
-    }
-    my $orig_identifier_1 = $identifier_1;
-    my $orig_identifier_2 = $identifier_2;
-
-    chomp $sequence_1;
-    chomp $identifier_1;
-    chomp $sequence_2;
-    chomp $identifier_2;
-
-    $identifier_1 =~ s/^>//; # deletes the > at the beginning of FastA headers
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_paired_ends_bowtie2 (uc$sequence_1,uc$sequence_2,$identifier_1);
-    }
-    else{
-      $return = check_bowtie_results_paired_ends (uc$sequence_1,uc$sequence_2,$identifier_1);
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequences to ambiguous_1 and _2 if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      print AMBIG_1 $orig_identifier_1;	
-      print AMBIG_1 "$sequence_1\n";
-      print AMBIG_2 $orig_identifier_2;	
-      print AMBIG_2 "$sequence_2\n";
-    }
-
-    # print the sequences to unmapped_1.out and unmapped_2.out if --un was specified
-    elsif ($unmapped and $return == 1){
-      print UNMAPPED_1 $orig_identifier_1;	
-      print UNMAPPED_1 "$sequence_1\n";
-      print UNMAPPED_2 $orig_identifier_2;	
-      print UNMAPPED_2 "$sequence_2\n";
-    }
-  }
-
-  warn "Processed $counting{sequences_count} sequences in total\n\n";
-
-  close OUT or die $!;
-
-  print_final_analysis_report_paired_ends($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid);
-
-}
-
-sub process_fastQ_files_for_paired_end_methylation_calls{
-  my ($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid) = @_;
-  ### Processing the two Illumina sequence files; we need the actual sequence of both reads to compare them against the genomic sequence in order to
-  ### make a methylation call. The sequence identifier per definition needs to be same for a sequence pair used for paired-end alignments.
-  ### Now reading in the sequence files sequence by sequence and see if the current sequences produced a paired-end alignment to one (or both)
-  ### of the converted genomes (either C->T or G->A version)
-
-  ### gzipped version of the infiles
-  if ($sequence_file_1 =~ /\.gz$/ and $sequence_file_2 =~ /\.gz$/){
-    open (IN1,"zcat $sequence_file_1 |") or die "Failed to open zcat pipe to $sequence_file_1 $!\n";
-    open (IN2,"zcat $sequence_file_2 |") or die "Failed to open zcat pipe to $sequence_file_2 $!\n";
-  }
-  else{
-    open (IN1,$sequence_file_1) or die $!;
-    open (IN2,$sequence_file_2) or die $!;
-  }
-
-  my $count = 0;
-
-  warn "\nReading in the sequence files $sequence_file_1 and $sequence_file_2\n";
-  ### Both files are required to have the exact same number of sequences, therefore we can process the sequences jointly one by one
-  while (1) {
-    # reading from the first input file
-    my $identifier_1 = <IN1>;
-    my $sequence_1 = <IN1>;
-    my $ident_1 = <IN1>;         # not needed
-    my $quality_value_1 = <IN1>; # not needed
-    # reading from the second input file
-    my $identifier_2 = <IN2>;
-    my $sequence_2 = <IN2>;
-    my $ident_2 = <IN2>;         # not needed
-    my $quality_value_2 = <IN2>; # not needed
-    last unless ($identifier_1 and $sequence_1 and $quality_value_1 and $identifier_2 and $sequence_2 and $quality_value_2);
-
-    $identifier_1 = fix_IDs($identifier_1); # this is to avoid problems with truncated read ID when they contain white spaces
-    $identifier_2 = fix_IDs($identifier_2);
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequence pairs so far\n";
-    }
-
-    my $orig_identifier_1 = $identifier_1;
-    my $orig_identifier_2 = $identifier_2;
-
-    chomp $sequence_1;
-    chomp $identifier_1;
-    chomp $sequence_2;
-    chomp $identifier_2;
-    chomp $quality_value_1;
-    chomp $quality_value_2;
-
-    $identifier_1 =~ s/^\@//;  # deletes the @ at the beginning of the FastQ ID
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_paired_ends_bowtie2 (uc$sequence_1,uc$sequence_2,$identifier_1,$quality_value_1,$quality_value_2);
-    }
-    else{
-      $return = check_bowtie_results_paired_ends (uc$sequence_1,uc$sequence_2,$identifier_1,$quality_value_1,$quality_value_2);
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequences to ambiguous_1 and _2 if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      # seq_1
-      print AMBIG_1 $orig_identifier_1;	
-      print AMBIG_1 "$sequence_1\n";
-      print AMBIG_1 $ident_1;	
-      print AMBIG_1 "$quality_value_1\n";
-	# seq_2
-      print AMBIG_2 $orig_identifier_2;	
-      print AMBIG_2 "$sequence_2\n";
-      print AMBIG_2 $ident_2;	
-      print AMBIG_2 "$quality_value_2\n";
-    }
-
-    # print the sequences to unmapped_1.out and unmapped_2.out if --un was specified
-    elsif ($unmapped and $return == 1){
-      # seq_1
-      print UNMAPPED_1 $orig_identifier_1;	
-      print UNMAPPED_1 "$sequence_1\n";
-      print UNMAPPED_1 $ident_1;	
-      print UNMAPPED_1 "$quality_value_1\n";
-      # seq_2
-      print UNMAPPED_2 $orig_identifier_2;	
-      print UNMAPPED_2 "$sequence_2\n";
-      print UNMAPPED_2 $ident_2;	
-      print UNMAPPED_2 "$quality_value_2\n";
-    }
-  }
-
-  warn "Processed $counting{sequences_count} sequences in total\n\n";
-
-  close OUT or die $!;
-
-  print_final_analysis_report_paired_ends($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2,$pid);
-
-}
-
-sub check_bowtie_results_single_end{
-  my ($sequence,$identifier,$quality_value) = @_;
-
-  unless ($quality_value){ # FastA sequences get assigned a quality value of Phred 40 throughout
-    $quality_value = 'I'x(length$sequence);
-  }
-
-  my %mismatches = ();
-  ### reading from the bowtie output files to see if this sequence aligned to a bisulfite converted genome
-  foreach my $index (0..$#fhs){
-
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line} and defined $fhs[$index]->{last_seq_id});
-    ### if the sequence we are currently looking at produced an alignment we are doing various things with it
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-      ###############################################################
-      ### STEP I Now processing the alignment stored in last_line ###
-      ###############################################################
-      my $valid_alignment_found_1 = decide_whether_single_end_alignment_is_valid($index,$identifier);
-      ### sequences can fail at this point if there was only 1 seq in the wrong orientation, or if there were 2 seqs, both in the wrong orientation
-      ### we only continue to extract useful information about this alignment if 1 was returned
-      if ($valid_alignment_found_1 == 1){
-	### Bowtie outputs which made it this far are in the correct orientation, so we can continue to analyse the alignment itself
-	### need to extract the chromosome number from the bowtie output (which is either XY_cf (complete forward) or XY_cr (complete reverse)
-	my ($id,$strand,$mapped_chromosome,$position,$bowtie_sequence,$mismatch_info) = (split (/\t/,$fhs[$index]->{last_line},-1))[0,1,2,3,4,7];
-
-	unless($mismatch_info){
-	  $mismatch_info = '';
-	}
-
-	chomp $mismatch_info;
-	my $chromosome;
-	if ($mapped_chromosome =~ s/_(CT|GA)_converted$//){
-	  $chromosome = $mapped_chromosome;
-	}
-	else{
-	  die "Chromosome number extraction failed for $mapped_chromosome\n";
-	}
-	### Now extracting the number of mismatches to the converted genome
-	my $number_of_mismatches;
-	if ($mismatch_info eq ''){
-	  $number_of_mismatches = 0;
-	}
-	elsif ($mismatch_info =~ /^\d/){
-	  my @mismatches = split (/,/,$mismatch_info);
-	  $number_of_mismatches = scalar @mismatches;
-	}
-	else{
-	  die "Something weird is going on with the mismatch field:\t>>> $mismatch_info <<<\n";
-	}
-	### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	my $alignment_location = join (":",$chromosome,$position);
-	### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	### strand) were methylated and therefore protected. It is not needed to overwrite the same positional entry with a second entry for the same
-	### location (the genomic sequence extraction and methylation would not be affected by this, only the thing which would change is the index
-	### number for the found alignment)
-	unless (exists $mismatches{$number_of_mismatches}->{$alignment_location}){
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{seq_id}=$id;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{bowtie_sequence}=$bowtie_sequence;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{index}=$index;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{position}=$position;
-	}
-	$number_of_mismatches = undef;
-	##################################################################################################################################################
-	### STEP II Now reading in the next line from the bowtie filehandle. The next alignment can either be a second alignment of the same sequence or a
-	### a new sequence. In either case we will store the next line in @fhs ->{last_line}. In case the alignment is already the next entry, a 0 will
-	### be returned as $valid_alignment_found and it will then be processed in the next round only.
-	##################################################################################################################################################
-	my $newline = $fhs[$index]->{fh}-> getline();
-	if ($newline){
-	  my ($seq_id) = split (/\t/,$newline);
-	  $fhs[$index]->{last_seq_id} = $seq_id;
-	  $fhs[$index]->{last_line} = $newline;
-	}
-	else {
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of bowtie output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line} = undef;
-	  next;
-	}	
-	my $valid_alignment_found_2 = decide_whether_single_end_alignment_is_valid($index,$identifier);
-	### we only continue to extract useful information about this second alignment if 1 was returned
-	if ($valid_alignment_found_2 == 1){
-	  ### If the second Bowtie output made it this far it is in the correct orientation, so we can continue to analyse the alignment itself
-	  ### need to extract the chromosome number from the bowtie output (which is either XY_cf (complete forward) or XY_cr (complete reverse)
-	  my ($id,$strand,$mapped_chromosome,$position,$bowtie_sequence,$mismatch_info) = (split (/\t/,$fhs[$index]->{last_line},-1))[0,1,2,3,4,7];
-	  unless($mismatch_info){
-	    $mismatch_info = '';
-	  }	
-	  chomp $mismatch_info;
-
-	  my $chromosome;	
-	  if ($mapped_chromosome =~ s/_(CT|GA)_converted$//){
-	    $chromosome = $mapped_chromosome;
-	  }
-	  else{
-	    die "Chromosome number extraction failed for $mapped_chromosome\n";
-	  }
-
-	  ### Now extracting the number of mismatches to the converted genome
-	  my $number_of_mismatches;
-	  if ($mismatch_info eq ''){
-	    $number_of_mismatches = 0;
-	  }
-	  elsif ($mismatch_info =~ /^\d/){
-	    my @mismatches = split (/,/,$mismatch_info);
-	    $number_of_mismatches = scalar @mismatches;
-	  }
-	  else{
-	    die "Something weird is going on with the mismatch field\n";
-	  }
-	  ### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	  ### extracting the chromosome number from the bowtie output (see above)
-	  my $alignment_location = join (":",$chromosome,$position);
-	  ### In the special case that two differently converted sequences align against differently converted genomes, but to the same position
-	  ### with the same number of mismatches (or perfect matches), the chromosome, position and number of mismatches are the same. In this
-	  ### case we are not writing the same entry out a second time.
-	  unless (exists $mismatches{$number_of_mismatches}->{$alignment_location}){
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{seq_id}=$id;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{bowtie_sequence}=$bowtie_sequence;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{index}=$index;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{position}=$position;
-	  }
-	  ####################################################################################################################################
-	  #### STEP III Now reading in one more line which has to be the next alignment to be analysed. Adding it to @fhs ->{last_line}    ###
-	  ####################################################################################################################################
-	  $newline = $fhs[$index]->{fh}-> getline();
-	  if ($newline){
-	    my ($seq_id) = split (/\t/,$newline);
-	    die "The same seq ID occurred more than twice in a row\n" if ($seq_id eq $identifier);
-	    $fhs[$index]->{last_seq_id} = $seq_id;
-	    $fhs[$index]->{last_line} = $newline;
-	    next;
-	  }	
-	  else {
-	    # assigning undef to last_seq_id and last_line and jumping to the next index (end of bowtie output)
-	    $fhs[$index]->{last_seq_id} = undef;
-	    $fhs[$index]->{last_line} = undef;
-	    next;
-	  }
-	  ### still within the 2nd sequence in correct orientation found	
-	}
-	### still withing the 1st sequence in correct orientation found
-      }
-      ### still within the if (last_seq_id eq identifier) condition
-    }
-    ### still within foreach index loop
-  }
-  ### if there was not a single alignment found for a certain sequence we will continue with the next sequence in the sequence file
-  unless(%mismatches){
-    $counting{no_single_alignment_found}++;
-    if ($unmapped){
-      return 1; ### We will print this sequence out as unmapped sequence if --un unmapped.out has been specified
-    }
-    else{
-      return;
-    }
-  }
-  #######################################################################################################################################################
-  #######################################################################################################################################################
-  ### We are now looking if there is a unique best alignment for a certain sequence. This means we are sorting in ascending order and look at the     ###
-  ### sequence with the lowest amount of mismatches. If there is only one single best position we are going to store the alignment information in the ###
-  ### meth_call variables, if there are multiple hits with the same amount of (lowest) mismatches we are discarding the sequence altogether           ###
-  #######################################################################################################################################################
-  #######################################################################################################################################################
-  ### Going to use the variable $sequence_fails as a memory if a sequence could not be aligned uniquely (set to 1 then)
-  my $sequence_fails = 0;
-  ### Declaring an empty hash reference which will store all information we need for the methylation call
-  my $methylation_call_params; # hash reference!
-  ### sorting in ascending order
-  foreach my $mismatch_number (sort {$a<=>$b} keys %mismatches){
-
-    ### if there is only 1 entry in the hash with the lowest number of mismatches we accept it as the best alignment
-    if (scalar keys %{$mismatches{$mismatch_number}} == 1){
-      for my $unique_best_alignment (keys %{$mismatches{$mismatch_number}}){
-	$methylation_call_params->{$identifier}->{bowtie_sequence} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence};
-	$methylation_call_params->{$identifier}->{chromosome} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{chromosome};
-	$methylation_call_params->{$identifier}->{position} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{position};
-	$methylation_call_params->{$identifier}->{index} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{index};
-    	$methylation_call_params->{$identifier}->{number_of_mismatches} = $mismatch_number;
-      }
-    }
-    elsif (scalar keys %{$mismatches{$mismatch_number}} == 3){
-      ### If there are 3 sequences with the same number of lowest mismatches we can discriminate 2 cases: (i) all 3 alignments are unique best hits and
-      ### come from different alignments processes (== indices) or (ii) one sequence alignment (== index) will give a unique best alignment, whereas a
-      ### second one will produce 2 (or potentially many) alignments for the same sequence but in a different conversion state or against a different genome
-      ### version (or both). This becomes especially relevant for highly converted sequences in which all Cs have been converted to Ts in the bisulfite
-      ### reaction. E.g.
-      ### CAGTCACGCGCGCGCG will become
-      ### TAGTTATGTGTGTGTG in the CT transformed version, which will ideally still give the correct alignment in the CT->CT alignment condition.
-      ### If the same read will then become G->A transformed as well however, the resulting sequence will look differently and potentially behave
-      ### differently in a GA->GA alignment and this depends on the methylation state of the original sequence!:
-      ### G->A conversion:
-      ### highly methylated: CAATCACACACACACA
-      ### highly converted : TAATTATATATATATA <== this sequence has a reduced complexity (only 2 bases left and not 3), and it is more likely to produce
-      ### an alignment with a low complexity genomic region than the one above. This would normally lead to the entire sequence being kicked out as the
-      ### there will be 3 alignments with the same number of lowest mismatches!! This in turn means that highly methylated and thereby not converted
-      ### sequences are more likely to pass the alignment step, thereby creating a bias for methylated reads compared to their non-methylated counterparts.
-      ### We do not want any bias, whatsover. Therefore if we have 1 sequence producing a unique best alignment and the second and third conditions
-      ### producing alignments only after performing an additional (theoretical) conversion we want to keep the best alignment with the lowest number of
-      ### additional transliterations performed. Thus we want to have a look at the level of complexity of the sequences producing the alignment.
-      ### In the above example the number of transliterations required to transform the actual sequence
-      ### to the C->T version would be TAGTTATGTGTGTGTG -> TAGTTATGTGTGTGTG = 0; (assuming this gives the correct alignment)
-      ### in the G->A case it would be TAGTTATGTGTGTGTG -> TAATTATATATATATA = 6; (assuming this gives multiple wrong alignments)
-      ### if the sequence giving a unique best alignment required a lower number of transliterations than the second best sequence yielding alignments
-      ### while requiring a much higher number of transliterations, we are going to accept the unique best alignment with the lowest number of performed
-      ### transliterations. As a threshold which does scale we will start with the number of tranliterations of the lowest best match x 2 must still be
-      ### smaller than the number of tranliterations of the second best sequence. Everything will be flagged with $sequence_fails = 1 and discarded.
-      my @three_candidate_seqs;
-      foreach my $composite_location (keys (%{$mismatches{$mismatch_number}}) ){
-	my $transliterations_performed;
-	if ($mismatches{$mismatch_number}->{$composite_location}->{index} == 0 or $mismatches{$mismatch_number}->{$composite_location}->{index} == 1){
-	  $transliterations_performed = determine_number_of_transliterations_performed($sequence,'CT');
-	}
-	elsif ($mismatches{$mismatch_number}->{$composite_location}->{index} == 2 or $mismatches{$mismatch_number}->{$composite_location}->{index} == 3){
-	  $transliterations_performed = determine_number_of_transliterations_performed($sequence,'GA');
-	}
-	else{
-	  die "unexpected index number range $!\n";
-	}
-	push @three_candidate_seqs,{
-				    index =>$mismatches{$mismatch_number}->{$composite_location}->{index},
-				    bowtie_sequence => $mismatches{$mismatch_number}->{$composite_location}->{bowtie_sequence},
-				    mismatch_number => $mismatch_number,
-				    chromosome => $mismatches{$mismatch_number}->{$composite_location}->{chromosome},
-				    position => $mismatches{$mismatch_number}->{$composite_location}->{position},
-				    seq_id => $mismatches{$mismatch_number}->{$composite_location}->{seq_id},
-				    transliterations_performed => $transliterations_performed,
-				   };
-      }
-      ### sorting in ascending order for the lowest number of transliterations performed
-      @three_candidate_seqs = sort {$a->{transliterations_performed} <=> $b->{transliterations_performed}} @three_candidate_seqs;
-      my $first_array_element = $three_candidate_seqs[0]->{transliterations_performed};
-      my $second_array_element = $three_candidate_seqs[1]->{transliterations_performed};
-      my $third_array_element = $three_candidate_seqs[2]->{transliterations_performed};
-      # print "$first_array_element\t$second_array_element\t$third_array_element\n";
-      if (($first_array_element*2) < $second_array_element){
-	$counting{low_complexity_alignments_overruled_count}++;
-	### taking the index with the unique best hit and over ruling low complexity alignments with 2 hits
-	$methylation_call_params->{$identifier}->{bowtie_sequence} = $three_candidate_seqs[0]->{bowtie_sequence};
-	$methylation_call_params->{$identifier}->{chromosome} = $three_candidate_seqs[0]->{chromosome};
-	$methylation_call_params->{$identifier}->{position} = $three_candidate_seqs[0]->{position};
-	$methylation_call_params->{$identifier}->{index} = $three_candidate_seqs[0]->{index};
-	$methylation_call_params->{$identifier}->{number_of_mismatches} = $mismatch_number;
-	# print "Overruled low complexity alignments! Using $first_array_element and disregarding $second_array_element and $third_array_element\n";
-      }
-      else{
-	$sequence_fails = 1;
-      }
-    }
-    else{
-      $sequence_fails = 1;
-    }
-    ### after processing the alignment with the lowest number of mismatches we exit
-    last;
-  }
-  ### skipping the sequence completely if there were multiple alignments with the same amount of lowest mismatches found at different positions
-  if ($sequence_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-    if ($ambiguous){
-      return 2; # => exits to next sequence, and prints it out to multiple_alignments.out if --ambiguous has been specified
-    }
-    if ($unmapped){
-      return 1; # => exits to next sequence, and prints it out to unmapped.out if --un has been specified
-    }
-    else{
-      return 0; # => exits to next sequence (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 2) or ($methylation_call_params->{$identifier}->{index} == 3) ){
-      #    warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence has not been rejected so far it will have a unique best alignment
-  $counting{unique_best_alignment_count}++;
-  extract_corresponding_genomic_sequence_single_end($identifier,$methylation_call_params);
-
-  ### check test to see if the genomic sequence we extracted has the same length as the observed sequence+2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence}) != length($sequence)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  ### otherwise we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call} = methylation_call($identifier,$sequence,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence},$methylation_call_params->{$identifier}->{read_conversion});
-
-  print_bisulfite_mapping_result_single_end($identifier,$sequence,$methylation_call_params,$quality_value);
-  return 0; ## otherwise 1 will be returned by default, which would print the sequence to unmapped.out
-}
-
-sub check_bowtie_results_single_end_bowtie2{
-  my ($sequence,$identifier,$quality_value) = @_;
-
-
-  unless ($quality_value){ # FastA sequences get assigned a quality value of Phred 40 throughout
-    $quality_value = 'I'x(length$sequence);
-  }
-
-  # as of version Bowtie 2 2.0.0 beta7, when input reads are unpaired, Bowtie 2 no longer removes the trailing /1 or /2 from the read name.
-  # $identifier =~ s/\/[1234567890]+$//; # some sequencers don't just have /1 or /2 at the end of read IDs
-  # print "sequence $sequence\nid $identifier\nquality: '$quality_value'\n";
-
-  my $alignment_ambiguous = 0;
-  my $best_AS_so_far;   ## we need to keep a memory of the best alignment score so far
-  my $amb_same_thread = 0;   ## if a reads primary and secondary alignments have the same alignment score we set this to true.
-
-  my %alignments = ();
-
-  ### reading from the Bowtie 2 output filehandles
-  foreach my $index (0..$#fhs){
-    #  print "Index: $index\n";
-    #   print "$fhs[$index]->{last_line}\n";
-    #   print "$fhs[$index]->{last_seq_id}\n";
-    # sleep (1);
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line} and defined $fhs[$index]->{last_seq_id});
-
-    ### if the sequence we are currently looking at produced an alignment we are doing various things with it
-    # print "last seq id: $fhs[$index]->{last_seq_id} and identifier: $identifier\n";
-
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-      #  SAM format specifications for Bowtie 2
-      #  (1) Name of read that aligned
-      #  (2) Sum of all applicable flags. Flags relevant to Bowtie are:
-      #        1 The read is one of a pair
-      #        2 The alignment is one end of a proper paired-end alignment
-      #        4 The read has no reported alignments
-      #        8 The read is one of a pair and has no reported alignments
-      #       16 The alignment is to the reverse reference strand
-      #       32 The other mate in the paired-end alignment is aligned to the reverse reference strand
-      #       64 The read is mate 1 in a pair
-      #      128 The read is mate 2 in a pair
-      #      256 The read has multiple mapping states
-      #  (3) Name of reference sequence where alignment occurs (unmapped reads have a *)
-      #  (4) 1-based offset into the forward reference strand where leftmost character of the alignment occurs (0 for unmapped reads)
-      #  (5) Mapping quality (255 means MAPQ is not available)
-      #  (6) CIGAR string representation of alignment (* if unavailable)
-      #  (7) Name of reference sequence where mate's alignment occurs. Set to = if the mate's reference sequence is the same as this alignment's, or * if there is no mate.
-      #  (8) 1-based offset into the forward reference strand where leftmost character of the mate's alignment occurs. Offset is 0 if there is no mate.
-      #  (9) Inferred fragment size. Size is negative if the mate's alignment occurs upstream of this alignment. Size is 0 if there is no mate.
-      # (10) Read sequence (reverse-complemented if aligned to the reverse strand)
-      # (11) ASCII-encoded read qualities (reverse-complemented if the read aligned to the reverse strand). The encoded quality values are on the Phred quality scale and the encoding is ASCII-offset by 33 (ASCII char !), similarly to a FASTQ file.
-      # (12) Optional fields. Fields are tab-separated. bowtie2 outputs zero or more of these optional fields for each alignment, depending on the type of the alignment:
-      # AS:i:<N> Alignment score. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if SAM record is for an aligned read.
-      # XS:i:<N> Alignment score for second-best alignment. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if the SAM record is for an aligned read and more than one alignment was found for the read.
-      # YS:i:<N> Alignment score for opposite mate in the paired-end alignment. Only present if the SAM record is for a read that aligned as part of a paired-end alignment.
-      # XN:i:<N> The number of ambiguous bases in the reference covering this alignment. Only present if SAM record is for an aligned read.
-      # XM:i:<N> The number of mismatches in the alignment. Only present if SAM record is for an aligned read.
-      # XO:i:<N> The number of gap opens, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # XG:i:<N> The number of gap extensions, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # NM:i:<N> The edit distance; that is, the minimal number of one-nucleotide edits (substitutions, insertions and deletions) needed to transform the read string into the reference string. Only present if SAM record is for an aligned read.
-      # YF:Z:<N> String indicating reason why the read was filtered out. See also: Filtering. Only appears for reads that were filtered out.
-      # MD:Z:<S> A string representation of the mismatched reference bases in the alignment. See SAM format specification for details. Only present if SAM record is for an aligned read.
-
-      my ($id,$flag,$mapped_chromosome,$position,$mapping_quality,$cigar,$bowtie_sequence,$qual) = (split (/\t/,$fhs[$index]->{last_line}))[0,1,2,3,4,5,9,10];
-
-      ### If a sequence has no reported alignments there will be a single output line with a bit-wise flag value of 4. We can store the next alignment and move on to the next Bowtie 2 instance
-      if ($flag == 4){
-	## reading in the next alignment, which must be the next sequence
-	my $newline = $fhs[$index]->{fh}-> getline();
-	if ($newline){
-	  chomp $newline;
-	  my ($seq_id) = split (/\t/,$newline);
-	  $fhs[$index]->{last_seq_id} = $seq_id;
-	  $fhs[$index]->{last_line} = $newline;
-	  if ($seq_id eq $identifier){
-	    die "Sequence with ID $identifier did not produce any alignment, but next seq-ID was also $fhs[$index]->{last_seq_id}!\n";
-	  }
-	  next; # next instance
-	}
-	else{
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line} = undef;
-	  next;
-	}
-      }
-
-      # if there are one or more proper alignments we can extract the chromosome number
-      my $chromosome;
-      if ($mapped_chromosome =~ s/_(CT|GA)_converted$//){
-	$chromosome = $mapped_chromosome;
-      }
-      else{
-	die "Chromosome number extraction failed for $mapped_chromosome\n";
-      }
-
-      ### We will use the optional field to determine the best alignment. Later on we extract the number of mismatches and/or indels from the CIGAR string
-      my ($alignment_score,$second_best,$MD_tag);
-      my @fields = split (/\t/,$fhs[$index]->{last_line});
-
-      foreach (11..$#fields){
-	if ($fields[$_] =~ /AS:i:(.*)/){
-	  $alignment_score = $1;
-	}
-	elsif ($fields[$_] =~ /XS:i:(.*)/){
-	  $second_best = $1;
-	}
-	elsif ($fields[$_] =~ /MD:Z:(.*)/){
-	  $MD_tag = $1;
-	}
-      }
-
-      if (!defined $best_AS_so_far){
-	$best_AS_so_far = $alignment_score;
-	# warn "First alignment score, setting \$best_AS_so_far to $best_AS_so_far\n";
-      }
-      else{
-	if ($alignment_score > $best_AS_so_far){ # AS are generally negative with a maximum of 0
-	  $best_AS_so_far = $alignment_score;
-	  # warn "Found better alignment score ($alignment_score), setting \$best_AS_so_far to $best_AS_so_far\n";
-	  # resetting the ambiguous within thread memory (if applicable at all)
-	  # warn "Resetting amb within thread value to 0\n";
-	  $amb_same_thread = 0;
-	}
-	else{
-	  # warn "current alignment (AS $alignment_score) isn't better than the best so far ($best_AS_so_far). Not changing anything\n";
-	}
-      }
-
-      # warn "First  best alignment_score is: '$alignment_score'\n";
-      # warn "MD tag is: '$MD_tag'\n";
-      die "Failed to extract alignment score ($alignment_score) and MD tag ($MD_tag) from line $fhs[$index]->{last_line}!\n" unless (defined $alignment_score and defined $MD_tag);
-
-      if (defined $second_best){
-	# warn "second best alignment_score is: '$second_best'\n\n";
-
-	# If the first alignment score is the same as the alignment score of the second best hit we keep a memory of this
-	if ($alignment_score == $second_best){
-
-	  # checking to see if this read produced the best alignment
-	  if ($alignment_score == $best_AS_so_far){  # yes this read is the best one so far, however it is ambiguous
-	    # warn "Read is ambiguous within the same thread, or otherwise as good as the best one so far. Setting \$amb_same_thread to 1 for currently best AS: $best_AS_so_far\n";
-	    $amb_same_thread = 1;
-	  }
-	  else{
-	    # warn "This read has a worse alignments score than the best alignment so far and will be ignored even though it is ambiguous in itself\n";
-	  }
-	  ### if there is a better alignment later on -> fine. If not, the read will get booted altogether
-
-	  ## need to read and discard all additional ambiguous reads until we reach the next sequence
-	  until ($fhs[$index]->{last_seq_id} ne $identifier){
-	    my $newline = $fhs[$index]->{fh}-> getline();
-	    if ($newline){
-	      chomp $newline;
-	      my ($seq_id) = split (/\t/,$newline);
-	      $fhs[$index]->{last_seq_id} = $seq_id;
-	      $fhs[$index]->{last_line} = $newline;
-	    }
-	    else{
-	      # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line} = undef;
-	      last; # break free in case we have reached the end of the alignment output
-	    }
-	  }
-	  #  warn "Index: $index\tThe current Seq-ID is $identifier, skipped all ambiguous sequences until the next ID which is: $fhs[$index]->{last_seq_id}\n";
-	}
-	else{ # the next best alignment has a lower alignment score than the current read, so we can safely store the current alignment
-
-	  my $alignment_location = join (":",$chromosome,$position);
-	
-	  ### If a sequence aligns to exactly the same location with a perfect match twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	  ### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
-	  ### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
-	  ### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 1, i.e. OT and OB 
-	
-	  unless (exists $alignments{$alignment_location}){
-	    $alignments{$alignment_location}->{seq_id} = $id; 
-	    $alignments{$alignment_location}->{alignment_score} = $alignment_score;
-	    $alignments{$alignment_location}->{alignment_score_second_best} = $second_best;
-	    $alignments{$alignment_location}->{bowtie_sequence} = $bowtie_sequence;
-	    $alignments{$alignment_location}->{index} = $index;
-	    $alignments{$alignment_location}->{chromosome} = $chromosome;
-	    $alignments{$alignment_location}->{position} = $position;
-	    $alignments{$alignment_location}->{CIGAR} = $cigar;
-	    $alignments{$alignment_location}->{MD_tag} = $MD_tag;
-	  }
-	
-	  ### now reading and discarding all (inferior) alignments of this sequencing read until we hit the next sequence
-	  until ($fhs[$index]->{last_seq_id} ne $identifier){
-	    my $newline = $fhs[$index]->{fh}-> getline();
-	    if ($newline){
-	      chomp $newline;
-	      my ($seq_id) = split (/\t/,$newline);
-	      $fhs[$index]->{last_seq_id} = $seq_id;
-	      $fhs[$index]->{last_line} = $newline;
-	    }
-	    else{
-	      # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line} = undef;
-	      last; # break free in case we have reached the end of the alignment output
-	    }
-	  }
-	  #  warn "Index: $index\tThe current Seq-ID is $identifier, skipped all ambiguous sequences until the next ID which is: $fhs[$index]->{last_seq_id}\n";
-	}
-      }
-      else{ # there is no second best hit, so we can just store this one and read in the next sequence
-	
-	my $alignment_location = join (":",$chromosome,$position);
-	
-	### If a sequence aligns to exactly the same location with a perfect match twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
-	### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
-	### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 1, i.e. OT and OB 
-
-	unless (exists $alignments{$alignment_location}){
-	  $alignments{$alignment_location}->{seq_id} = $id; 
-	  $alignments{$alignment_location}->{alignment_score} = $alignment_score;
-	  $alignments{$alignment_location}->{alignment_score_second_best} = undef;
-	  $alignments{$alignment_location}->{bowtie_sequence} = $bowtie_sequence;
-	  $alignments{$alignment_location}->{index} = $index;
-	  $alignments{$alignment_location}->{chromosome} = $chromosome;
-	  $alignments{$alignment_location}->{position} = $position;
-	  $alignments{$alignment_location}->{MD_tag} = $MD_tag;
-	  $alignments{$alignment_location}->{CIGAR} = $cigar;
-	}
-	
-	my $newline = $fhs[$index]->{fh}-> getline();
-	if ($newline){
-	  chomp $newline;
-	  my ($seq_id) = split (/\t/,$newline);
-	  $fhs[$index]->{last_seq_id} = $seq_id;
-	  $fhs[$index]->{last_line} = $newline;
-	  if ($seq_id eq $identifier){
-	    die "Sequence with ID $identifier did not have a second best alignment, but next seq-ID was also $fhs[$index]->{last_seq_id}!\n";
-	  }
-	}
-	else{
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line} = undef;
-	}
-      }
-    }
-  }
-
-  ### If there were several equally good alignments for the best alignment score we will boot the read
-  if ($amb_same_thread){
-    # warn "\$alignment_ambiguous now: $alignment_ambiguous\n";
-    $alignment_ambiguous = 1;
-    # warn "\$alignment_ambiguous now: $alignment_ambiguous\n";
-  }
-  else{
-    # warn "alignment won't be considered ambiguous. This time....\n";
-  }
-
-  ### if the read produced several ambiguous alignments already now can returning already now. If --ambiguous or --unmapped was specified the read sequence will be printed out.
-  if ($alignment_ambiguous == 1){
-    $counting{unsuitable_sequence_count}++;
-    ### report that the sequence has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-    # my $ambiguous_read_output = join("\t",$identifier,'256','*','0','0','*','*','0','0',$sequence,$quality_value);
-    # print "$ambiguous_read_output\n";
-
-    if ($ambiguous){
-      return 2; # => exits to next sequence, and prints it out to _ambiguous_reads.txt if '--ambiguous' was specified
-    }
-    elsif ($unmapped){
-      return 1; # => exits to next sequence, and prints it out to _unmapped_reads.txt if '--unmapped' but not '--ambiguous' was specified
-    }
-    else{
-      return 0;
-    }
-  }
-
-  ### if there was no alignment found for a certain sequence at all we continue with the next sequence in the sequence file
-  unless(%alignments){
-    $counting{no_single_alignment_found}++;
-    # my $unmapped_read_output = join("\t",$identifier,'4','*','0','0','*','*','0','0',$sequence,$quality_value);
-    # print  "$unmapped_read_output\n";
-    if ($unmapped){
-      return 1; # => exits to next sequence, and prints it out to _unmapped_reads.txt if '--unmapped' was specified
-    }
-    else{
-      return 0; # default
-    }
-  }
-
-  #######################################################################################################################################################
-
-  ### If the sequence was not rejected so far we are now looking if there is a unique best alignment among all alignment instances. If there is only one
-  ### single best position we are going to store the alignment information in the $meth_call variable. If there are multiple hits with the same (highest)
-  ### alignment score we are discarding the sequence altogether.
-  ### For end-to-end alignments the maximum alignment score can be 0, each mismatch can receive penalties up to 6, and each gap receives penalties for
-  ### opening (5) and extending (3 per bp) the gap.
-
-  #######################################################################################################################################################
-
-  my $methylation_call_params; # hash reference which will store all information we need for the methylation call
-  my $sequence_fails = 0; # Going to use $sequence_fails as a 'memory' if a sequence could not be aligned uniquely (set to 1 then)
-
-  ### print contents of %alignments for debugging
-  #   if (scalar keys %alignments > 1){
-  #     print "\n******\n";
-  #     foreach my $alignment_location (sort {$a cmp $b} keys %alignments){
-  #       print "Loc:  $alignment_location\n";
-  #       print "ID:   $alignments{$alignment_location}->{seq_id}\n";
-  #       print "AS:   $alignments{$alignment_location}->{alignment_score}\n";
-  #       print "Seq:  $alignments{$alignment_location}->{bowtie_sequence}\n";
-  #       print "Index $alignments{$alignment_location}->{index}\n";
-  #       print "Chr:  $alignments{$alignment_location}->{chromosome}\n";
-  #       print "pos:  $alignments{$alignment_location}->{position}\n";
-  #       print "MD:   $alignments{$alignment_location}->{MD_tag}\n\n";
-  #     }
-  #     print "\n******\n";
-  #   }
-
-  ### if there is only 1 entry in the hash with we accept it as the best alignment
-  if (scalar keys %alignments == 1){
-    for my $unique_best_alignment (keys %alignments){
-      $methylation_call_params->{$identifier}->{bowtie_sequence} = $alignments{$unique_best_alignment}->{bowtie_sequence};
-      $methylation_call_params->{$identifier}->{chromosome}      = $alignments{$unique_best_alignment}->{chromosome};
-      $methylation_call_params->{$identifier}->{position}        = $alignments{$unique_best_alignment}->{position};
-      $methylation_call_params->{$identifier}->{index}           = $alignments{$unique_best_alignment}->{index};
-      $methylation_call_params->{$identifier}->{alignment_score} = $alignments{$unique_best_alignment}->{alignment_score};
-      $methylation_call_params->{$identifier}->{alignment_score_second_best} = $alignments{$unique_best_alignment}->{alignment_score_second_best};
-      $methylation_call_params->{$identifier}->{MD_tag}          = $alignments{$unique_best_alignment}->{MD_tag};
-      $methylation_call_params->{$identifier}->{CIGAR}           = $alignments{$unique_best_alignment}->{CIGAR};
-    }
-  }
-
-  ### otherwise we are going to find out if there is a best match among the multiple alignments, or whether there are 2 or more equally good alignments (in which case
-  ### we boot the sequence altogether
-  elsif (scalar keys %alignments >= 2  and scalar keys %alignments <= 4){
-    my $best_alignment_score;
-    my $best_alignment_location;
-    foreach my $alignment_location (sort {$alignments{$b}->{alignment_score} <=> $alignments{$a}->{alignment_score}} keys %alignments){
-      # print "$alignments{$alignment_location}->{alignment_score}\n";
-      unless (defined $best_alignment_score){
-	$best_alignment_score = $alignments{$alignment_location}->{alignment_score};
-	$best_alignment_location = $alignment_location;
-	# print "setting best alignment score: $best_alignment_score\n";
-      }
-      else{
-	### if the second best alignment has the same alignment score as the first one, the sequence will get booted
-	if ($alignments{$alignment_location}->{alignment_score} == $best_alignment_score){
-	  # warn "Same alignment score, the sequence will get booted!\n";
-	  $sequence_fails = 1;
-	  last; # exiting after the second alignment since we know that the sequence has ambiguous alignments
-	}
-	### else we are going to store the best alignment for further processing
-	else{
-	  $methylation_call_params->{$identifier}->{bowtie_sequence} = $alignments{$best_alignment_location}->{bowtie_sequence};
-	  $methylation_call_params->{$identifier}->{chromosome}      = $alignments{$best_alignment_location}->{chromosome};
-	  $methylation_call_params->{$identifier}->{position}        = $alignments{$best_alignment_location}->{position};
-	  $methylation_call_params->{$identifier}->{index}           = $alignments{$best_alignment_location}->{index};
-	  $methylation_call_params->{$identifier}->{alignment_score} = $alignments{$best_alignment_location}->{alignment_score};
-	  $methylation_call_params->{$identifier}->{MD_tag}          = $alignments{$best_alignment_location}->{MD_tag};
-	  $methylation_call_params->{$identifier}->{CIGAR}           = $alignments{$best_alignment_location}->{CIGAR};
-	  if (defined $alignments{$best_alignment_location}->{alignment_score_second_best} and $alignments{$best_alignment_location}-> {alignment_score_second_best} > $alignments{$alignment_location}->{alignment_score}) {
-	    $methylation_call_params->{$identifier}->{alignment_score_second_best} = $alignments{$best_alignment_location}->{alignment_score_second_best};
-	  }
-	  else {
-	    $methylation_call_params->{$identifier}->{alignment_score_second_best} = $alignments{$alignment_location}->{alignment_score};
-	  }
-	  last; # exiting after processing the second alignment since the sequence produced a unique best alignment
-	}
-      }
-    }
-  }
-  else{
-    die "There are too many potential hits for this sequence (1-4 expected, but found: ",scalar keys %alignments,")\n";;
-  }
-
-  ### skipping the sequence completely if there were multiple alignments with the same best alignment score at different positions
-  if ($sequence_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-
-    ### report that the sequence has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-    # my $ambiguous_read_output = join("\t",$identifier,'256','*','0','0','*','*','0','0',$sequence,$quality_value);
-    # print OUT "$ambiguous_read_output\n";
-
-    if ($ambiguous){
-      return 2; # => exits to next sequence, and prints it out (in FastQ format) to _ambiguous_reads.txt if '--ambiguous' was specified
-    }
-    elsif ($unmapped){
-      return 1; # => exits to next sequence, and prints it out (in FastQ format) to _unmapped_reads.txt if '--unmapped' but not '--ambiguous' was specified
-    }
-    else{
-      return 0; # => exits to next sequence (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 2) or ($methylation_call_params->{$identifier}->{index} == 3) ){
-      # warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence has not been rejected so far it has a unique best alignment
-  $counting{unique_best_alignment_count}++;
-
-  ### Now we need to extract a genomic sequence that exactly corresponds to the reported alignment. This potentially means that we need to deal with insertions or deletions as well
-  extract_corresponding_genomic_sequence_single_end_bowtie2 ($identifier,$methylation_call_params);
-
-  ### check test to see if the genomic sequence we extracted has the same length as the observed sequence+2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence}) != length($sequence)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  # Compute MAPQ value
-  $methylation_call_params->{$identifier}->{mapq} = calc_mapq (length($sequence), undef,
-							       $methylation_call_params->{$identifier}->{alignment_score},
-							       $methylation_call_params->{$identifier}->{alignment_score_second_best});
-
-
-
-  ### otherwise we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call} = methylation_call($identifier,$sequence,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence},$methylation_call_params->{$identifier}->{read_conversion});
-  print_bisulfite_mapping_result_single_end_bowtie2 ($identifier,$sequence,$methylation_call_params,$quality_value);
-  return 0; ## if a sequence got this far we do not want to print it to unmapped or ambiguous.out
-}
-
-
-sub determine_number_of_transliterations_performed{
-  my ($sequence,$read_conversion) = @_;
-  my $number_of_transliterations;
-  if ($read_conversion eq 'CT'){
-    $number_of_transliterations = $sequence =~ tr/C/T/;
-  }
-  elsif ($read_conversion eq 'GA'){
-    $number_of_transliterations = $sequence =~ tr/G/A/;
-  }
-  else{
-    die "Read conversion mode of the read was not specified $!\n";
-  }
-  return $number_of_transliterations;
-}
-
-sub decide_whether_single_end_alignment_is_valid{
-  my ($index,$identifier) = @_;
-
-  # extracting from Bowtie 1 format
-  my ($id,$strand) = (split (/\t/,$fhs[$index]->{last_line}))[0,1];
-
-  ### ensuring that the entry is the correct sequence
-  if (($id eq $fhs[$index]->{last_seq_id}) and ($id eq $identifier)){
-    ### checking the orientation of the alignment. We need to discriminate between 8 different conditions, however only 4 of them are theoretically
-    ### sensible alignments
-    my $orientation = ensure_sensical_alignment_orientation_single_end ($index,$strand);
-    ### If the orientation was correct can we move on
-    if ($orientation == 1){
-      return 1; ### 1st possibility for a sequence to pass
-    }
-    ### If the alignment was in the wrong orientation we need to read in a new line
-    elsif($orientation == 0){
-      my $newline = $fhs[$index]->{fh}->getline();
-      if ($newline){
-		($id,$strand) = (split (/\t/,$newline))[0,1];
-		
-	### ensuring that the next entry is still the correct sequence
-	if ($id eq $identifier){
-	  ### checking orientation again
-	  $orientation = ensure_sensical_alignment_orientation_single_end ($index,$strand);
-	  ### If the orientation was correct can we move on
-	  if ($orientation == 1){
-	    $fhs[$index]->{last_seq_id} = $id;
-	    $fhs[$index]->{last_line} = $newline;
-	    return 1; ### 2nd possibility for a sequence to pass
-	  }
-	  ### If the alignment was in the wrong orientation again we need to read in yet another new line and store it in @fhs
-	  elsif ($orientation == 0){
-	    $newline = $fhs[$index]->{fh}->getline();
-	    if ($newline){
-	      my ($seq_id) = split (/\t/,$newline);
-	      ### check if the next line still has the same seq ID (must not happen), and if not overwrite the current seq-ID and bowtie output with
-	      ### the same fields of the just read next entry
-	      die "Same seq ID 3 or more times in a row!(should be 2 max) $!" if ($seq_id eq $identifier);
-	      $fhs[$index]->{last_seq_id} = $seq_id;
-	      $fhs[$index]->{last_line} = $newline;
-	      return 0; # not processing anything this round as the alignment currently stored in last_line was in the wrong orientation
-	    }
-	    else{
-	      # assigning undef to last_seq_id and last_line (end of bowtie output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line} = undef;
-	      return 0; # not processing anything as the alignment currently stored in last_line was in the wrong orientation
-	    }
-	  }
-	  else{
-	    die "The orientation of the alignment must be either correct or incorrect\n";
-	  }
-	}
-	### the sequence we just read in is already the next sequence to be analysed -> store it in @fhs
-	else{
-	  $fhs[$index]->{last_seq_id} = $id;
-	  $fhs[$index]->{last_line} = $newline;
-	  return 0; # processing the new alignment result only in the next round
-	}
-      }
-      else {
-	# assigning undef to last_seq_id and last_line (end of bowtie output)
-	$fhs[$index]->{last_seq_id} = undef;
-	$fhs[$index]->{last_line} = undef;
-	return 0; # not processing anything as the alignment currently stored in last_line was in the wrong orientation
-      }
-    }
-    else{
-      die "The orientation of the alignment must be either correct or incorrect\n";
-    }
-  }
-  ### the sequence stored in @fhs as last_line is already the next sequence to be analysed -> analyse next round
-  else{
-    return 0;
-  }
-}
-#########################
-### BOWTIE 1 | PAIRED-END
-#########################
-
-sub check_bowtie_results_paired_ends{
-  my ($sequence_1,$sequence_2,$identifier,$quality_value_1,$quality_value_2) = @_;
-
-  ### quality values are not given for FastA files, so they are initialised with a Phred quality of 40
-  unless ($quality_value_1){
-    $quality_value_1 = 'I'x(length$sequence_1);
-  }
-  unless ($quality_value_2){
-    $quality_value_2 = 'I'x(length$sequence_2);
-  }
-
-  #  warn "$identifier\n$fhs[0]->{last_seq_id}\n$fhs[1]->{last_seq_id}\n$fhs[2]->{last_seq_id}\n$fhs[3]->{last_seq_id}\n\n";
-  #  sleep (1);
-  my %mismatches = ();
-  ### reading from the bowtie output files to see if this sequence pair aligned to a bisulfite converted genome
-
-
-  ### for paired end reads we are reporting alignments to the OT strand first (index 0), then the OB strand (index 3!!), similiar to the single end way.
-  ### alignments to the complementary strands are reported afterwards (CTOT got index 1, and CTOB got index 2).
-  ### This is needed so that alignments which either contain no single C or G or reads which contain only protected Cs are reported to the original strands (OT and OB)
-  ### Before the complementary strands. Remember that it does not make any difference for the methylation calls, but it will matter if alignment to the complementary
-  ### strands are not being reported by specifying --directional
-
-  foreach my $index (0,3,1,2){
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line_1} and $fhs[$index]->{last_line_2} and defined $fhs[$index]->{last_seq_id});
-    ### if the sequence pair we are currently looking at produced an alignment we are doing various things with it
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-      # print "$identifier\n$fhs[$index]->{last_seq_id}\n\n";
-
-      ##################################################################################
-      ### STEP I Processing the entry which is stored in last_line_1 and last_line_2 ###
-      ##################################################################################
-      my $valid_alignment_found = decide_whether_paired_end_alignment_is_valid($index,$identifier);
-      ### sequences can fail at this point if there was only 1 alignment in the wrong orientation, or if there were 2 aligments both in the wrong
-      ### orientation. We only continue to extract useful information about this alignment if 1 was returned
-      if ($valid_alignment_found == 1){
-	### Bowtie outputs which made it this far are in the correct orientation, so we can continue to analyse the alignment itself.
-	### we store the useful information in %mismatches
-	my ($id_1,$strand_1,$mapped_chromosome_1,$position_1,$bowtie_sequence_1,$mismatch_info_1) = (split (/\t/,$fhs[$index]->{last_line_1},-1))[0,1,2,3,4,7];
-	my ($id_2,$strand_2,$mapped_chromosome_2,$position_2,$bowtie_sequence_2,$mismatch_info_2) = (split (/\t/,$fhs[$index]->{last_line_2},-1))[0,1,2,3,4,7];
-	chomp $mismatch_info_1;
-	chomp $mismatch_info_2;
-	
-	### need to extract the chromosome number from the bowtie output (which is either XY_CT_converted or XY_GA_converted
-	my ($chromosome_1,$chromosome_2);
-	if ($mapped_chromosome_1 =~ s/_(CT|GA)_converted$//){
-	  $chromosome_1 = $mapped_chromosome_1;
-	}	
-	else{
-	  die "Chromosome number extraction failed for $mapped_chromosome_1\n";
-	}
-	if ($mapped_chromosome_2 =~ s/_(CT|GA)_converted$//){
-	  $chromosome_2 = $mapped_chromosome_2;
-	}
-	else{
-	  die "Chromosome number extraction failed for $mapped_chromosome_2\n";
-	}
-	
-	### Now extracting the number of mismatches to the converted genome
-	my $number_of_mismatches_1;
-	my $number_of_mismatches_2;
-	if ($mismatch_info_1 eq ''){
-	  $number_of_mismatches_1 = 0;
-	}
-	elsif ($mismatch_info_1 =~ /^\d/){
-	  my @mismatches = split (/,/,$mismatch_info_1);
-	  $number_of_mismatches_1 = scalar @mismatches;
-	}
-	else{
-	  die "Something weird is going on with the mismatch field\n";
-	}
-	if ($mismatch_info_2 eq ''){
-	  $number_of_mismatches_2 = 0;
-	}
-	elsif ($mismatch_info_2 =~ /^\d/){
-	  my @mismatches = split (/,/,$mismatch_info_2);
-	  $number_of_mismatches_2 = scalar @mismatches;
-	}
-	else{
-	  die "Something weird is going on with the mismatch field\n";
-	}
-	### To decide whether a sequence pair has a unique best alignment we will look at the lowest sum of mismatches from both alignments
-	my $sum_of_mismatches = $number_of_mismatches_1+$number_of_mismatches_2;
-	### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	die "Position 1 is higher than position 2" if ($position_1 > $position_2);
-	die "Paired-end alignments need to be on the same chromosome\n" unless ($chromosome_1 eq $chromosome_2);
-	my $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	### strand) were methylated and therefore protected. It is not needed to overwrite the same positional entry with a second entry for the same
-	### location (the genomic sequence extraction and methylation would not be affected by this, only the thing which would change is the index
-	### number for the found alignment)
-	unless (exists $mismatches{$sum_of_mismatches}->{$alignment_location}){
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{seq_id}=$id_1; # either is fine
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_1}=$bowtie_sequence_1;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_2}=$bowtie_sequence_2;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{index}=$index;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome_1; # either is fine
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_1}=$position_1;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_2}=$position_2;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_1} = $number_of_mismatches_1;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_2} = $number_of_mismatches_2;
-	}
-	###################################################################################################################################################
-	### STEP II Now reading in the next 2 lines from the bowtie filehandle. If there are 2 next lines in the alignments filehandle it can either    ###
-	### be a second alignment of the same sequence pair or a new sequence pair. In any case we will just add it to last_line_1 and last_line _2.    ###
-	### If it is the alignment of the next sequence pair, 0 will be returned as $valid_alignment_found, so it will not be processed any further in  ###
-	### this round                                                                                                                                  ###
-	###################################################################################################################################################
-	my $newline_1 = $fhs[$index]->{fh}-> getline();
-	my $newline_2 = $fhs[$index]->{fh}-> getline();
-
-	if ($newline_1 and $newline_2){
-	  my ($seq_id_1) = split (/\t/,$newline_1);
-	  my ($seq_id_2) = split (/\t/,$newline_2);
-	
-	  if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-	    $fhs[$index]->{last_seq_id} = $seq_id_1;
-	  }
-	  elsif ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-	    $fhs[$index]->{last_seq_id} = $seq_id_2;
-	  }
-	  else{
-	    die "Either read 1 or read 2 needs to end on '/1'\n";
-	  }
-	
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-	}
-	else {
-	  # assigning undef to last_seq_id and both last_lines and jumping to the next index (end of bowtie output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line_1} = undef;
-	  $fhs[$index]->{last_line_2} = undef;
-	  next; # jumping to the next index
-	}
-	### Now processing the entry we just stored in last_line_1 and last_line_2
-	$valid_alignment_found = decide_whether_paired_end_alignment_is_valid($index,$identifier);
-	### only processing the alignment further if 1 was returned. 0 will be returned either if the alignment is already the next sequence pair to
-	### be analysed or if it was a second alignment of the current sequence pair but in the wrong orientation
-	if ($valid_alignment_found == 1){
-	  ### we store the useful information in %mismatches
-	  ($id_1,$strand_1,$mapped_chromosome_1,$position_1,$bowtie_sequence_1,$mismatch_info_1) = (split (/\t/,$fhs[$index]->{last_line_1}))[0,1,2,3,4,7];
-	  ($id_2,$strand_2,$mapped_chromosome_2,$position_2,$bowtie_sequence_2,$mismatch_info_2) = (split (/\t/,$fhs[$index]->{last_line_2}))[0,1,2,3,4,7];
-	  chomp $mismatch_info_1;
-	  chomp $mismatch_info_2;
-	  ### need to extract the chromosome number from the bowtie output (which is either _CT_converted or _GA_converted)
-	  if ($mapped_chromosome_1 =~ s/_(CT|GA)_converted$//){
-	    $chromosome_1 = $mapped_chromosome_1;
-	  }	
-	  else{
-	    die "Chromosome number extraction failed for $mapped_chromosome_1\n";
-	  }
-	  if ($mapped_chromosome_2 =~ s/_(CT|GA)_converted$//){
-	    $chromosome_2 = $mapped_chromosome_2;
-	  }
-	  else{
-	    die "Chromosome number extraction failed for $mapped_chromosome_2\n";
-	  }
-	
-	  $number_of_mismatches_1='';
-	  $number_of_mismatches_2='';
-	  ### Now extracting the number of mismatches to the converted genome
-	  if ($mismatch_info_1 eq ''){
-	    $number_of_mismatches_1 = 0;
-	  }
-	  elsif ($mismatch_info_1 =~ /^\d/){
-	    my @mismatches = split (/,/,$mismatch_info_1);
-	    $number_of_mismatches_1 = scalar @mismatches;
-	  }
-	  else{
-	    die "Something weird is going on with the mismatch field\n";
-	  }
-	  if ($mismatch_info_2 eq ''){
-	    $number_of_mismatches_2 = 0;
-	  }
-	  elsif ($mismatch_info_2 =~ /^\d/){
-	    my @mismatches = split (/,/,$mismatch_info_2);
-	    $number_of_mismatches_2 = scalar @mismatches;
-	  }
-	  else{
-	    die "Something weird is going on with the mismatch field\n";
-	  }
-	  ### To decide whether a sequence pair has a unique best alignment we will look at the lowest sum of mismatches from both alignments
-	  $sum_of_mismatches = $number_of_mismatches_1+$number_of_mismatches_2;
-	  ### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	  die "position 1 is greater than position 2" if ($position_1 > $position_2);
-	  die "Paired-end alignments need to be on the same chromosome\n" unless ($chromosome_1 eq $chromosome_2);
-	  $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	  ### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	  ### strand) were methylated and therefore protected. It is not needed to overwrite the same positional entry with a second entry for the same
-	  ### location (the genomic sequence extraction and methylation would not be affected by this, only the thing which would change is the index
-	  ### number for the found alignment)
-	  unless (exists $mismatches{$sum_of_mismatches}->{$alignment_location}){
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{seq_id}=$id_1; # either is fine
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_1}=$bowtie_sequence_1;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_2}=$bowtie_sequence_2;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{index}=$index;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome_1; # either is fine
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_1}=$position_1;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_2}=$position_2;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_1} = $number_of_mismatches_1;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_2} = $number_of_mismatches_2;
-	  }
-	  ###############################################################################################################################################
-	  ### STEP III Now reading in two more lines. These have to be the next entry and we will just add assign them to last_line_1 and last_line_2 ###
-	  ###############################################################################################################################################
-	  $newline_1 = $fhs[$index]->{fh}-> getline();
-	  $newline_2 = $fhs[$index]->{fh}-> getline();
-
-	  if ($newline_1 and $newline_2){
-	    my ($seq_id_1) = split (/\t/,$newline_1);
-	    my ($seq_id_2) = split (/\t/,$newline_2);
-
-	    if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-	      $fhs[$index]->{last_seq_id} = $seq_id_1;
-	    }
-	    if ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-	      $fhs[$index]->{last_seq_id} = $seq_id_2;
-	    }
-	    $fhs[$index]->{last_line_1} = $newline_1;
-	    $fhs[$index]->{last_line_2} = $newline_2;
-	  }
-	  else {
-	    # assigning undef to last_seq_id and both last_lines and jumping to the next index (end of bowtie output)
-	    $fhs[$index]->{last_seq_id} = undef;
-	    $fhs[$index]->{last_line_1} = undef;
-	    $fhs[$index]->{last_line_2} = undef;
-	    next; # jumping to the next index
-	  }
-	  ### within the 2nd sequence pair alignment in correct orientation found
-	}
-	### within the 1st sequence pair alignment in correct orientation found
-      }
-      ### still within the (last_seq_id eq identifier) condition
-    }
-    ### still within foreach index loop
-  }
-  ### if there was no single alignment found for a certain sequence we will continue with the next sequence in the sequence file
-  unless(%mismatches){
-    $counting{no_single_alignment_found}++;
-    return 1; ### We will print this sequence out as unmapped sequence if --un unmapped.out has been specified
-  }
-  ### Going to use the variable $sequence_pair_fails as a 'memory' if a sequence could not be aligned uniquely (set to 1 then)
-  my $sequence_pair_fails = 0;
-  ### Declaring an empty hash reference which will store all information we need for the methylation call
-  my $methylation_call_params; # hash reference!
-  ### We are now looking if there is a unique best alignment for a certain sequence. This means we are sorting in ascending order and look at the
-  ### sequence with the lowest amount of mismatches. If there is only one single best position we are going to store the alignment information in the
-  ### meth_call variables, if there are multiple hits with the same amount of (lowest) mismatches we are discarding the sequence altogether
-  foreach my $mismatch_number (sort {$a<=>$b} keys %mismatches){
-    #dev print "Number of mismatches: $mismatch_number\t$identifier\t$sequence_1\t$sequence_2\n";
-    foreach my $entry (keys (%{$mismatches{$mismatch_number}}) ){
-      #dev print "$mismatch_number\t$entry\t$mismatches{$mismatch_number}->{$entry}->{index}\n";
-      # print join("\t",$mismatch_number,$mismatches{$mismatch_number}->{$entry}->{seq_id},$sequence,$mismatches{$mismatch_number}->{$entry}->{bowtie_sequence},$mismatches{$mismatch_number}->{$entry}->{chromosome},$mismatches{$mismatch_number}->{$entry}->{position},$mismatches{$mismatch_number}->{$entry}->{index}),"\n";
-    }
-    if (scalar keys %{$mismatches{$mismatch_number}} == 1){
-      #  print "Unique best alignment for sequence pair $sequence_1\t$sequence_1\n";
-      for my $unique_best_alignment (keys %{$mismatches{$mismatch_number}}){
-	$methylation_call_params->{$identifier}->{seq_id} = $identifier;
- 	$methylation_call_params->{$identifier}->{bowtie_sequence_1} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence_1};
-	$methylation_call_params->{$identifier}->{bowtie_sequence_2} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence_2};
-       	$methylation_call_params->{$identifier}->{chromosome} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{chromosome};
-      	$methylation_call_params->{$identifier}->{start_seq_1} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{start_seq_1};
-	$methylation_call_params->{$identifier}->{start_seq_2} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{start_seq_2};
-	$methylation_call_params->{$identifier}->{alignment_end} = ($mismatches{$mismatch_number}->{$unique_best_alignment}->{start_seq_2}+length($mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence_2}));
-	$methylation_call_params->{$identifier}->{index} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{index};
-     	$methylation_call_params->{$identifier}->{number_of_mismatches_1} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{number_of_mismatches_1};
-	$methylation_call_params->{$identifier}->{number_of_mismatches_2} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{number_of_mismatches_2};
-      }
-    }
-    else{
-      $sequence_pair_fails = 1;
-    }
-    ### after processing the alignment with the lowest number of mismatches we exit
-    last;
-  }
-  ### skipping the sequence completely if there were multiple alignments with the same amount of lowest mismatches found at different positions
-  if ($sequence_pair_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-    if ($ambiguous){
-      return 2; # => exits to next sequence pair, and prints both seqs out to multiple_alignments_1 and -2 if --ambiguous has been specified
-    }
-    if ($unmapped){
-      return 1; # => exits to next sequence pair, and prints both seqs out to unmapped_1 and _2  if --un has been specified
-    }
-    else{
-      return 0; # => exits to next sequence (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 1) or ($methylation_call_params->{$identifier}->{index} == 2) ){
-      #    warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence has not been rejected so far it does have a unique best alignment
-  $counting{unique_best_alignment_count}++;
-  extract_corresponding_genomic_sequence_paired_ends($identifier,$methylation_call_params);
-
-  ### check test to see if the genomic sequences we extracted has the same length as the observed sequences +2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1}) != length($sequence_1)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{start_seq_1}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2}) != length($sequence_2)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{start_seq_2}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  ### otherwise we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call_1} = methylation_call($identifier,$sequence_1,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1},$methylation_call_params->{$identifier}->{read_conversion_1});
-  $methylation_call_params->{$identifier}->{methylation_call_2} = methylation_call($identifier,$sequence_2,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2},$methylation_call_params->{$identifier}->{read_conversion_2});
-
-  print_bisulfite_mapping_results_paired_ends($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2);
-  return 0; ## otherwise 1 will be returned by default, which would print the sequence pair to unmapped_1 and _2
-}
-
-#########################
-### BOWTIE 2 | PAIRED-END
-#########################
-
-sub check_bowtie_results_paired_ends_bowtie2{
-  my ($sequence_1,$sequence_2,$identifier,$quality_value_1,$quality_value_2) = @_;
-
-  ### quality values are not given for FastA files, so they are initialised with a Phred quality of 40
-  unless ($quality_value_1){
-    $quality_value_1 = 'I'x(length$sequence_1);
-  }
-
-  unless ($quality_value_2){
-    $quality_value_2 = 'I'x(length$sequence_2);
-  }
-
-
-  # print "$identifier\n$fhs[0]->{last_seq_id}\n$fhs[1]->{last_seq_id}\n$fhs[2]->{last_seq_id}\n$fhs[3]->{last_seq_id}\n\n";
-
-
-  my %alignments;
-  my $alignment_ambiguous = 0;
-  my $best_AS_so_far;   ## we need to keep a memory of the best alignment score so far
-  my $amb_same_thread = 0;   ## if a reads primary and secondary alignments have the same alignment score we set this to true.
-
-  ### reading from the Bowtie 2 output filehandles
-
-  ### for paired end reads we are reporting alignments to the OT strand first (index 0), then the OB strand (index 3!!), similiar to the single end way.
-  ### alignments to the complementary strands are reported afterwards (CTOT got index 1, and CTOB got index 2).
-  ### This is needed so that alignments which either contain no single C or G or reads which contain only protected Cs are reported to the original strands (OT and OB)
-  ### Before the complementary strands. Remember that it does not make any difference for the methylation calls, but it will matter if alignments to the complementary
-  ### strands are not being reported when '--directional' is specified
-
-  foreach my $index (0,3,1,2){
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line_1} and $fhs[$index]->{last_line_2} and defined $fhs[$index]->{last_seq_id});
-
-    ### if the sequence pair we are currently looking at produced an alignment we are doing various things with it
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-
-      my ($id_1,$flag_1,$mapped_chromosome_1,$position_1,$mapping_quality_1,$cigar_1,$bowtie_sequence_1,$qual_1) = (split (/\t/,$fhs[$index]->{last_line_1}))[0,1,2,3,4,5,9,10];
-      my ($id_2,$flag_2,$mapped_chromosome_2,$position_2,$mapping_quality_2,$cigar_2,$bowtie_sequence_2,$qual_2) = (split (/\t/,$fhs[$index]->{last_line_2}))[0,1,2,3,4,5,9,10];
-      #  print "Index: $index\t$fhs[$index]->{last_line_1}\n";
-      #  print "Index: $index\t$fhs[$index]->{last_line_2}\n";	
-      #  print join ("\t",$id_1,$flag_1,$mapped_chromosome_1,$position_1,$mapping_quality_1,$cigar_1,$bowtie_sequence_1,$qual_1),"\n";
-      #  print join ("\t",$id_2,$flag_2,$mapped_chromosome_2,$position_2,$mapping_quality_2,$cigar_2,$bowtie_sequence_2,$qual_2),"\n";
-      $id_1 =~ s/\/1$//;
-      $id_2 =~ s/\/2$//;
-
-      #  SAM format specifications for Bowtie 2
-      #  (1) Name of read that aligned
-      #  (2) Sum of all applicable flags. Flags relevant to Bowtie are:
-      #        1 The read is one of a pair
-      #        2 The alignment is one end of a proper paired-end alignment
-      #        4 The read has no reported alignments
-      #        8 The read is one of a pair and has no reported alignments
-      #       16 The alignment is to the reverse reference strand
-      #       32 The other mate in the paired-end alignment is aligned to the reverse reference strand
-      #       64 The read is mate 1 in a pair
-      #      128 The read is mate 2 in a pair
-      #      256 The read has multiple mapping states
-      #  (3) Name of reference sequence where alignment occurs (unmapped reads have a *)
-      #  (4) 1-based offset into the forward reference strand where leftmost character of the alignment occurs (0 for unmapped reads)
-      #  (5) Mapping quality (255 means MAPQ is not available)
-      #  (6) CIGAR string representation of alignment (* if unavailable)
-      #  (7) Name of reference sequence where mate's alignment occurs. Set to = if the mate's reference sequence is the same as this alignment's, or * if there is no mate.
-      #  (8) 1-based offset into the forward reference strand where leftmost character of the mate's alignment occurs. Offset is 0 if there is no mate.
-      #  (9) Inferred fragment size. Size is negative if the mate's alignment occurs upstream of this alignment. Size is 0 if there is no mate.
-      # (10) Read sequence (reverse-complemented if aligned to the reverse strand)
-      # (11) ASCII-encoded read qualities (reverse-complemented if the read aligned to the reverse strand). The encoded quality values are on the Phred quality scale and the encoding is ASCII-offset by 33 (ASCII char !), similarly to a FASTQ file.
-      # (12) Optional fields. Fields are tab-separated. bowtie2 outputs zero or more of these optional fields for each alignment, depending on the type of the alignment:
-      # AS:i:<N> Alignment score. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if SAM record is for an aligned read.
-      # XS:i:<N> Alignment score for second-best alignment. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if the SAM record is for an aligned read and more than one alignment was found for the read.
-      # YS:i:<N> Alignment score for opposite mate in the paired-end alignment. Only present if the SAM record is for a read that aligned as part of a paired-end alignment.
-      # XN:i:<N> The number of ambiguous bases in the reference covering this alignment. Only present if SAM record is for an aligned read.
-      # XM:i:<N> The number of mismatches in the alignment. Only present if SAM record is for an aligned read.
-      # XO:i:<N> The number of gap opens, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # XG:i:<N> The number of gap extensions, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # NM:i:<N> The edit distance; that is, the minimal number of one-nucleotide edits (substitutions, insertions and deletions) needed to transform the read string into the reference string. Only present if SAM record is for an aligned read.
-      # YF:Z:<N> String indicating reason why the read was filtered out. See also: Filtering. Only appears for reads that were filtered out.
-      # MD:Z:<S> A string representation of the mismatched reference bases in the alignment. See SAM format specification for details. Only present if SAM record is for an aligned read.
-
-      ### If a sequence has no reported alignments there will be a single output line per sequence with a bit-wise flag value of 77 for read 1 (1+4+8+64), or 141 for read 2 (1+4+8+128).
-      ### We can store the next alignment and move on to the next Bowtie 2 instance
-      if ($flag_1 == 77 and $flag_2 == 141){
-	## reading in the next alignment, which must be the next sequence
-	my $newline_1 = $fhs[$index]->{fh}-> getline();
-	my $newline_2 = $fhs[$index]->{fh}-> getline();
-	
-	if ($newline_1 and $newline_2){
-	  chomp $newline_1;
-	  chomp $newline_2;
-	  my ($seq_id_1) = split (/\t/,$newline_1);
-	  my ($seq_id_2) = split (/\t/,$newline_2);
-	  $seq_id_1 =~ s/\/1$//;
-	  $seq_id_2 =~ s/\/2$//;
-	  $fhs[$index]->{last_seq_id} = $seq_id_1;
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-
-	  #  print "current sequence ($identifier) did not map, reading in next sequence\n";
-	  #  print "$index\t$fhs[$index]->{last_seq_id}\n";
-	  #  print "$index\t$fhs[$index]->{last_line_1}\n";
-	  #  print "$index\t$fhs[$index]->{last_line_2}\n";
-	  next; # next instance
-	}
-	else{
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line_1} = undef;
-	  $fhs[$index]->{last_line_2} = undef;
-	  next;
-	}
-      }
-
-      ### If there are one or more proper alignments we can extract the chromosome number
-      my ($chromosome_1,$chromosome_2);
-      if ($mapped_chromosome_1 =~ s/_(CT|GA)_converted$//){
-	$chromosome_1 = $mapped_chromosome_1;
-      }	
-      else{
-	die "Chromosome number extraction failed for $mapped_chromosome_1\n";
-      }
-      if ($mapped_chromosome_2 =~ s/_(CT|GA)_converted$//){
-	$chromosome_2 = $mapped_chromosome_2;
-      }
-      else{
-	die "Chromosome number extraction failed for $mapped_chromosome_2\n";
-      }
-
-      die "Paired-end alignments need to be on the same chromosome\n" unless ($chromosome_1 eq $chromosome_2);
-
-      ### We will use the optional fields to determine the best alignments. Later on we extract the number of mismatches and/or indels from the CIGAR string
-      my ($alignment_score_1,$alignment_score_2,$second_best_1,$second_best_2,$MD_tag_1,$MD_tag_2);
-
-      my @fields_1 = split (/\t/,$fhs[$index]->{last_line_1});
-      my @fields_2 = split (/\t/,$fhs[$index]->{last_line_2});
-
-      foreach (11..$#fields_1){
-	if ($fields_1[$_] =~ /AS:i:(.*)/){
-	  $alignment_score_1 = $1;
-	}
-	elsif ($fields_1[$_] =~ /XS:i:(.*)/){
-	  $second_best_1 = $1;
-	}
-	elsif ($fields_1[$_] =~ /MD:Z:(.*)/){
-	  $MD_tag_1 = $1;
-	}
-      }
-
-      foreach (11..$#fields_2){
-	if ($fields_2[$_] =~ /AS:i:(.*)/){
-	  $alignment_score_2 = $1;
-	}
-	elsif ($fields_2[$_] =~ /XS:i:(.*)/){
-	  $second_best_2 = $1;
-	}
-	elsif ($fields_2[$_] =~ /MD:Z:(.*)/){
-	  $MD_tag_2 = $1;
-	}
-      }
-
-      die "Failed to extract alignment score 1 ($alignment_score_1) and MD tag ($MD_tag_1)!\nlast alignment 1: $fhs[$index]->{last_line_1}\nlast alignment 2: $fhs[$index]->{last_line_2}\n" unless (defined $alignment_score_1 and defined $MD_tag_1);
-      die "Failed to extract alignment score 2 ($alignment_score_2) and MD tag ($MD_tag_2)!\nlast alignment 1: $fhs[$index]->{last_line_1}\nlast alignment 2: $fhs[$index]->{last_line_2}\n" unless (defined $alignment_score_2 and defined $MD_tag_2);
-
-      # warn "First read 1 alignment score is: '$alignment_score_1'\n";
-      # warn "First read 2 alignment score is: '$alignment_score_2'\n";
-      # warn "MD tag 1 is: '$MD_tag_1'\n";
-      # warn "MD tag 2 is: '$MD_tag_2'\n";
-
-      ### To decide whether a sequence pair has a unique best alignment we will look at the highest sum of alignment scores from both alignments
-      my $sum_of_alignment_scores_1 = $alignment_score_1 + $alignment_score_2 ;
-      # warn "sum of alignment scores: $sum_of_alignment_scores_1\n\n";
-
-      if (!defined $best_AS_so_far){
-	$best_AS_so_far = $sum_of_alignment_scores_1;
-	# warn "First alignment score, setting \$best_AS_so_far to $best_AS_so_far\n";
-      }
-      else{
-	if ($sum_of_alignment_scores_1 > $best_AS_so_far){ # AS are generally negative with a maximum of 0
-	  $best_AS_so_far = $sum_of_alignment_scores_1;
-	  # warn "Found better sum of alignment scores ($sum_of_alignment_scores), setting \$best_AS_so_far to $best_AS_so_far\n";
-	  # resetting the ambiguous within thread memory (if applicable at all)
-	  # warn "Resetting amb within thread value to 0\n";
-	  $amb_same_thread = 0;
-	}
-	else{
-	  # warn "current alignment (AS $sum_of_alignment_scores) isn't better than the best so far ($best_AS_so_far). Not changing anything\n";
-	}
-      }
-
-      if (defined $second_best_1 and defined $second_best_2){
-	my $sum_of_alignment_scores_second_best = $second_best_1 + $second_best_2;
-	# warn "Second best alignment_score_1 is: '$second_best_1'\n";
-	# warn "Second best alignment_score_2 is: '$second_best_2'\n";
-	# warn "Second best alignment sum of alignment scores is: '$sum_of_alignment_scores_second_best'\n";
-	
-	# If the first alignment score for the first read pair is the same as the alignment score of the second best hit we we keep a memory of this
-	if ($sum_of_alignment_scores_1 == $sum_of_alignment_scores_second_best){
-
-	  # checking to see if this read pair produced the best alignment
-	  if ($sum_of_alignment_scores_1 == $best_AS_so_far){  # yes this is the best read pair so far, either within the thread or between threads, however it is ambiguous
-	    # warn "Read pair is ambiguous within the same thread, or otherwise as good as the best one so far. Setting \$amb_same_thread to 1 for currently best AS: $best_AS_so_far\n";
-	    $amb_same_thread = 1;
-	  }
-	  else{
-	    # warn "This read pair has a worse alignment score than the best alignment so far and will be ignored even though it is ambiguous in itself\n";
-	  }
-
-	  ### if there is a better alignment later on -> fine. If not, the read will get booted altogether one way or another
-
- 	  ## need to read and discard all additional ambiguous reads until we reach the next sequence
- 	  until ($fhs[$index]->{last_seq_id} ne $identifier){
- 	    my $newline_1 = $fhs[$index]->{fh}-> getline();
-	    my $newline_2 = $fhs[$index]->{fh}-> getline();
-	    if ($newline_1 and $newline_2){
-	      chomp $newline_1;
-	      chomp $newline_2;
-	      my ($seq_id_1) = split (/\t/,$newline_1);
-	      my ($seq_id_2) = split (/\t/,$newline_2);
-	      $seq_id_1 =~ s/\/1$//;
-	      $seq_id_2 =~ s/\/2$//;
-	      # print "New Seq IDs:\t$seq_id_1\t$seq_id_2\n";
-
-	      $fhs[$index]->{last_seq_id} = $seq_id_1;
-	      $fhs[$index]->{last_line_1} = $newline_1;
-	      $fhs[$index]->{last_line_2} = $newline_2;
-		}
- 	    else{
- 	      # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
- 	      $fhs[$index]->{last_seq_id} = undef;
- 	      $fhs[$index]->{last_line_1} = undef;
-	      $fhs[$index]->{last_line_2} = undef;
-	      last; # break free if the end of the alignment output was reached
- 	    }
- 	  }
-	  #  if ($fhs[$index]->{last_seq_id}){
-	  #    warn "Index: $index\tThis Seq-ID is $identifier, skipped all ambiguous sequences until the next ID which is: $fhs[$index]->{last_seq_id}\n";
-	  #  }
-	}
- 	else{ # the next best alignment has a lower alignment score than the current read, so we can safely store the current alignment
-	
-	  my $alignment_location;
-	  if ($position_1 <= $position_2){
-	    $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	  }
-	  elsif($position_2 < $position_1){	
-	    $alignment_location = join(":",$chromosome_1,$position_2,$position_1);
-	  }
-	
- 	  ### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
- 	  ### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
- 	  ### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
- 	  ### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 3, i.e. OT and OB 
-	
-	  unless (exists $alignments{$alignment_location}){
-	    $alignments{$alignment_location}->{seq_id} = $id_1;
- 	    $alignments{$alignment_location}->{alignment_score_1} = $alignment_score_1;
-	    $alignments{$alignment_location}->{alignment_score_2} = $alignment_score_2;
-	    $alignments{$alignment_location}->{sum_of_alignment_scores} = $sum_of_alignment_scores_1;
-	    $alignments{$alignment_location}->{sum_of_alignment_scores_second_best} = $sum_of_alignment_scores_second_best;
-	    $alignments{$alignment_location}->{bowtie_sequence_1} = $bowtie_sequence_1;
-	    $alignments{$alignment_location}->{bowtie_sequence_2} = $bowtie_sequence_2;
-	    $alignments{$alignment_location}->{index} = $index;
- 	    $alignments{$alignment_location}->{chromosome} = $chromosome_1; # either is fine
- 	    $alignments{$alignment_location}->{position_1} = $position_1;
-	    $alignments{$alignment_location}->{position_2} = $position_2;
- 	    $alignments{$alignment_location}->{mismatch_info_1} = $MD_tag_1;
- 	    $alignments{$alignment_location}->{mismatch_info_2} = $MD_tag_2;
-	    $alignments{$alignment_location}->{CIGAR_1} = $cigar_1;
-	    $alignments{$alignment_location}->{CIGAR_2} = $cigar_2;
-	    $alignments{$alignment_location}->{flag_1} = $flag_1;
-	    $alignments{$alignment_location}->{flag_2} = $flag_2;
- 	  }
-	  # warn "added best of several alignments to \%alignments hash\n";
-	
- 	  ### now reading and discarding all (inferior) alignments of this read pair until we hit the next sequence
-	  until ($fhs[$index]->{last_seq_id} ne $identifier){
- 	    my $newline_1 = $fhs[$index]->{fh}-> getline();
-	    my $newline_2 = $fhs[$index]->{fh}-> getline();
-	    if ($newline_1 and $newline_2){
-	      chomp $newline_1;
-	      chomp $newline_2;
-	      my ($seq_id_1) = split (/\t/,$newline_1);
-	      my ($seq_id_2) = split (/\t/,$newline_2);
-	      $seq_id_1 =~ s/\/1$//;
-	      $seq_id_2 =~ s/\/2$//;
-	      # print "New Seq IDs:\t$seq_id_1\t$seq_id_2\n";
-
-	      $fhs[$index]->{last_seq_id} = $seq_id_1;
-	      $fhs[$index]->{last_line_1} = $newline_1;
-	      $fhs[$index]->{last_line_2} = $newline_2;
-	    }
- 	    else{
- 	      # assigning undef to last_seq_id and last_line_1 and _2 and jumping to the next index (end of Bowtie 2 output)
- 	      $fhs[$index]->{last_seq_id} = undef;
- 	      $fhs[$index]->{last_line_1} = undef;
-	      $fhs[$index]->{last_line_2} = undef;
-	      last; # break free if the end of the alignment output was reached
- 	    }
-	  }
-	  # if($fhs[$index]->{last_seq_id}){
-	  #   warn "Index: $index\tThis Seq-ID is $identifier, skipped all other alignments until the next ID was reached which is: $fhs[$index]->{last_seq_id}\n";
-	  # }
-	}	
-      }
-      else{ # there is no second best hit, so we can just store this one and read in the next sequence
-	
-	my $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	# print "$alignment_location\n";
-	### If a sequence aligns to exactly the same location with a perfect match twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
- 	### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
- 	### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
- 	### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 3, i.e. OT and OB
-
-	unless (exists $alignments{$alignment_location}){
-	  $alignments{$alignment_location}->{seq_id} = $id_1;
-	  $alignments{$alignment_location}->{alignment_score_1} = $alignment_score_1;
-	  $alignments{$alignment_location}->{alignment_score_2} = $alignment_score_2;
-	  $alignments{$alignment_location}->{sum_of_alignment_scores} = $sum_of_alignment_scores_1;
-	  $alignments{$alignment_location}->{sum_of_alignment_scores_second_best} = undef;
-	  $alignments{$alignment_location}->{bowtie_sequence_1} = $bowtie_sequence_1;
-	  $alignments{$alignment_location}->{bowtie_sequence_2} = $bowtie_sequence_2;
-	  $alignments{$alignment_location}->{index} = $index;
-	  $alignments{$alignment_location}->{chromosome} = $chromosome_1; # either is fine
-	  $alignments{$alignment_location}->{position_1} = $position_1;
-	  $alignments{$alignment_location}->{position_2} = $position_2;
-	  $alignments{$alignment_location}->{mismatch_info_1} = $MD_tag_1;
-	  $alignments{$alignment_location}->{mismatch_info_2} = $MD_tag_2;
-	  $alignments{$alignment_location}->{CIGAR_1} = $cigar_1;
-	  $alignments{$alignment_location}->{CIGAR_2} = $cigar_2;
-	  $alignments{$alignment_location}->{flag_1} = $flag_1;
-	  $alignments{$alignment_location}->{flag_2} = $flag_2;
-	}
-	
-	# warn "added unique alignment to \%alignments hash\n";
-
-	# Now reading and storing the next read pair
-	my $newline_1 = $fhs[$index]->{fh}-> getline();
-	my $newline_2 = $fhs[$index]->{fh}-> getline();
-	if ($newline_1 and $newline_2){
-	  chomp $newline_1;
-	  chomp $newline_2;
-	  # print "$newline_1\n";
-	  # print "$newline_2\n";
-	  my ($seq_id_1) = split (/\t/,$newline_1);
-	  my ($seq_id_2) = split (/\t/,$newline_2);
-	  $seq_id_1 =~ s/\/1$//;
-	  $seq_id_2 =~ s/\/2$//;
-	  # print "New Seq IDs:\t$seq_id_1\t$seq_id_2\n";
-
-	  $fhs[$index]->{last_seq_id} = $seq_id_1;
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-
-	  if ($seq_id_1 eq $identifier){
- 	    die "Sequence with ID $identifier did not have a second best alignment, but next seq-ID was also $fhs[$index]->{last_seq_id}!\n";
- 	  }
-  	}
-	else{
-	  # assigning undef to last_seq_id and last_line_1 and _2 and jumping to the next index (end of Bowtie 2 output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line_1} = undef;
-	  $fhs[$index]->{last_line_2} = undef;
-	}
-      }
-    }
-  }
-
-  ### If there were several equally good alignments for the best alignment score we will boot the read
-  if ($amb_same_thread){
-    # warn "\$alignment_ambiguous now: $alignment_ambiguous\n";
-    $alignment_ambiguous = 1;
-    # warn "\$alignment_ambiguous now: $alignment_ambiguous\n";
-  }
-  else{
-    # warn "alignment won't be considered ambiguous. This time....\n";
-  }
-
-
-  ### if the read produced several ambiguous alignments for a single instance of Bowtie 2 we can return already now. If --ambiguous was specified the read sequence will be printed out in FastQ format
-  if ($alignment_ambiguous == 1){
-    $counting{unsuitable_sequence_count}++;
-    ### report that the sequence pair has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-    #  my $ambiguous_read_1 = join("\t",$identifier.'/1','256','*','0','0','*','*','0','0',$sequence_1,$quality_value_1);
-    #  my $ambiguous_read_2 = join("\t",$identifier.'/2','256','*','0','0','*','*','0','0',$sequence_2,$quality_value_2);
-    #  print "$ambiguous_read_1\n";
-    #  print "$ambiguous_read_2\n";
-
-    if ($ambiguous){
-      return 2; # => exits to next sequence pair, and prints it out to _ambiguous_reads_1.txt and _ambiguous_reads_2.txt if '--ambiguous' was specified
-    }
-    elsif ($unmapped){
-      return 1; # => exits to next sequence pair, and prints it out to _unmapped_reads_1.txt and _unmapped_reads_2.txt if '--unmapped' but not '--ambiguous' was specified
-    }
-    else{
-      return 0;
-    }
-  }
-
-  ### if no alignment was found for a certain sequence at all we continue with the next sequence in the sequence file
-  unless (%alignments){
-    $counting{no_single_alignment_found}++;
-
-    # my $unmapped_read_1 = join("\t",$identifier.'/1','77','*','0','0','*','*','0','0',$sequence_1,$quality_value_1);
-    # my $unmapped_read_2 = join("\t",$identifier.'/2','141','*','0','0','*','*','0','0',$sequence_2,$quality_value_2);
-    # print "$unmapped_read_1\n";
-    # print "$unmapped_read_2\n";
-    if ($unmapped){
-      return 1; # => exits to next sequence pair, and prints it out to _unmapped_reads_1.txt and _unmapped_read_2.txt if '--unmapped' was specified
-    }
-    else{
-      return 0;
-    }
-  }
-
-  #######################################################################################################################################################
-
-  ### If the sequence pair was not rejected so far we are now looking if there is a unique best alignment among all alignment instances. If there is only one
-  ### single best position we are going to store the alignment information in the $meth_call variable. If there are multiple hits with the same (highest)
-  ### alignment score we are discarding the sequence pair altogether.
-  ### For end-to-end alignments the maximum alignment score is 0, each mismatch receives a penalty of 6, and each gap receives penalties for opening (5)
-  ### and extending (3 per bp) the gap.
-
-  #######################################################################################################################################################
-
-  ### Declaring an empty hash reference which will store all information we need for the methylation call
-  my $methylation_call_params; # hash reference
-  my $sequence_pair_fails = 0; # using $sequence_pair_fails as a 'memory' if a sequence could not be aligned uniquely (set to 1 then)
-
-  ### print contents of %alignments for debugging
-  ##  if (scalar keys %alignments >= 1){
-  #     print "\n******\n";
-  #     foreach my $alignment_location (sort {$a cmp $b} keys %alignments){
-  #       print "Loc:  $alignment_location\n";
-  #       print "ID:      $alignments{$alignment_location}->{seq_id}\n";
-  #       print "AS_1:    $alignments{$alignment_location}->{alignment_score_1}\n";
-  #       print "AS_2:    $alignments{$alignment_location}->{alignment_score_2}\n";
-  #       print "Seq_1:   $alignments{$alignment_location}->{bowtie_sequence_1}\n";
-  #       print "Seq_2:   $alignments{$alignment_location}->{bowtie_sequence_2}\n";
-  #       print "Index    $alignments{$alignment_location}->{index}\n";
-  #       print "Chr:     $alignments{$alignment_location}->{chromosome}\n";
-  #       print "Pos_1:   $alignments{$alignment_location}->{position_1}\n";
-  #       print "Pos_2:   $alignments{$alignment_location}->{position_2}\n";
-  #       print "CIGAR_1: $alignments{$alignment_location}->{CIGAR_1}\n";
-  #       print "CIGAR_2: $alignments{$alignment_location}->{CIGAR_2}\n";
-  #       print "MD_1:    $alignments{$alignment_location}->{mismatch_info_1}\n";
-  #       print "MD_2:    $alignments{$alignment_location}->{mismatch_info_2}\n";
-  #       print "Flag 1:  $alignments{$alignment_location}->{flag_1}\n";
-  #       print "Flag 2:  $alignments{$alignment_location}->{flag_2}\n";
-  #    }
-  #    print "\n******\n";
-  #  }
-
-  ### if there is only 1 entry in the %alignments hash we accept it as the best alignment
-  if (scalar keys %alignments == 1){
-    for my $unique_best_alignment (keys %alignments){
-      $methylation_call_params->{$identifier}->{bowtie_sequence_1} = $alignments{$unique_best_alignment}->{bowtie_sequence_1};
-      $methylation_call_params->{$identifier}->{bowtie_sequence_2} = $alignments{$unique_best_alignment}->{bowtie_sequence_2};
-      $methylation_call_params->{$identifier}->{chromosome}        = $alignments{$unique_best_alignment}->{chromosome};
-      $methylation_call_params->{$identifier}->{position_1}        = $alignments{$unique_best_alignment}->{position_1};
-      $methylation_call_params->{$identifier}->{position_2}        = $alignments{$unique_best_alignment}->{position_2};
-      $methylation_call_params->{$identifier}->{index}             = $alignments{$unique_best_alignment}->{index};
-      $methylation_call_params->{$identifier}->{alignment_score_1} = $alignments{$unique_best_alignment}->{alignment_score_1};
-      $methylation_call_params->{$identifier}->{alignment_score_2} = $alignments{$unique_best_alignment}->{alignment_score_2};
-      $methylation_call_params->{$identifier}->{sum_of_alignment_scores} = $alignments{$unique_best_alignment}->{sum_of_alignment_scores};
-      $methylation_call_params->{$identifier}->{sum_of_alignment_scores_second_best} = $alignments{$unique_best_alignment}->{sum_of_alignment_scores_second_best};
-      $methylation_call_params->{$identifier}->{mismatch_info_1}   = $alignments{$unique_best_alignment}->{mismatch_info_1};
-      $methylation_call_params->{$identifier}->{mismatch_info_2}   = $alignments{$unique_best_alignment}->{mismatch_info_2};
-      $methylation_call_params->{$identifier}->{CIGAR_1}           = $alignments{$unique_best_alignment}->{CIGAR_1};
-      $methylation_call_params->{$identifier}->{CIGAR_2}           = $alignments{$unique_best_alignment}->{CIGAR_2};
-      $methylation_call_params->{$identifier}->{flag_1}            = $alignments{$unique_best_alignment}->{flag_1};
-      $methylation_call_params->{$identifier}->{flag_2}            = $alignments{$unique_best_alignment}->{flag_2};
-    }
-  }
-
-  ### otherwise we are going to find out if there is a best match among the multiple alignments, or whether there are 2 or more equally good alignments (in which case
-  ### we boot the sequence pair altogether)
-  elsif (scalar keys %alignments >= 2  and scalar keys %alignments <= 4){
-    my $best_sum_of_alignment_scores;
-    my $best_alignment_location;
-    foreach my $alignment_location (sort {$alignments{$b}->{sum_of_alignment_scores} <=> $alignments{$a}->{sum_of_alignment_scores}} keys %alignments){
-
-      # warn "$alignments{$alignment_location}->{sum_of_alignment_scores}\n"; sleep(1);
-
-      unless (defined $best_sum_of_alignment_scores){
-	$best_sum_of_alignment_scores = $alignments{$alignment_location}->{sum_of_alignment_scores};
-	$best_alignment_location = $alignment_location;
-	# print "setting best alignment score to: $best_sum_of_alignment_scores\n";
-      }
-      else{
-	### if the second best alignment has the same sum of alignment scores as the first one, the sequence pair will get booted
-	if ($alignments{$alignment_location}->{sum_of_alignment_scores} == $best_sum_of_alignment_scores){
-	  # warn "Same sum of alignment scores for 2 different alignments, the sequence pair will get booted!\n";
-	  $sequence_pair_fails = 1;
-	  last; # exiting since we know that the sequence has ambiguous alignments
-	}
-	### else we are going to store the best alignment for further processing
-	else{
-	  $methylation_call_params->{$identifier}->{bowtie_sequence_1} = $alignments{$best_alignment_location}->{bowtie_sequence_1};
-	  $methylation_call_params->{$identifier}->{bowtie_sequence_2} = $alignments{$best_alignment_location}->{bowtie_sequence_2};
-	  $methylation_call_params->{$identifier}->{chromosome}        = $alignments{$best_alignment_location}->{chromosome};
-	  $methylation_call_params->{$identifier}->{position_1}        = $alignments{$best_alignment_location}->{position_1};
-	  $methylation_call_params->{$identifier}->{position_2}        = $alignments{$best_alignment_location}->{position_2};
-	  $methylation_call_params->{$identifier}->{index}             = $alignments{$best_alignment_location}->{index};
-	  $methylation_call_params->{$identifier}->{alignment_score_1} = $alignments{$best_alignment_location}->{alignment_score_1};
-	  $methylation_call_params->{$identifier}->{alignment_score_2} = $alignments{$best_alignment_location}->{alignment_score_2};
-	  $methylation_call_params->{$identifier}->{sum_of_alignment_scores} = $alignments{$best_alignment_location}->{sum_of_alignment_scores};
-	  $methylation_call_params->{$identifier}->{mismatch_info_1}   = $alignments{$best_alignment_location}->{mismatch_info_1};
-	  $methylation_call_params->{$identifier}->{mismatch_info_2}   = $alignments{$best_alignment_location}->{mismatch_info_2};
-	  $methylation_call_params->{$identifier}->{CIGAR_1}           = $alignments{$best_alignment_location}->{CIGAR_1};
-	  $methylation_call_params->{$identifier}->{CIGAR_2}           = $alignments{$best_alignment_location}->{CIGAR_2};
-	  $methylation_call_params->{$identifier}->{flag_1}            = $alignments{$best_alignment_location}->{flag_1};
-	  $methylation_call_params->{$identifier}->{flag_2}            = $alignments{$best_alignment_location}->{flag_2};
-
-	  if (defined $alignments{$best_alignment_location}->{sum_of_alignment_scores_second_best} and ( $alignments{$best_alignment_location}->{sum_of_alignment_scores_second_best} > $alignments{$alignment_location}->{sum_of_alignment_scores} )) {
-	    $methylation_call_params->{$identifier}->{sum_of_alignment_scores_second_best} = $alignments{$best_alignment_location}->{sum_of_alignment_scores_second_best};
-	  }
-	  else {
-	    $methylation_call_params->{$identifier}->{sum_of_alignment_scores_second_best} = $alignments{$alignment_location}->{sum_of_alignment_scores};
-	  }
-
-	  last; # exiting since the sequence produced a unique best alignment
-	}
-      }
-    }
-  }
-  else{
-    die "There are too many potential hits for this sequence pair (1-4 expected, but found: '",scalar keys %alignments,"')\n";;
-  }
-
-  ### skipping the sequence completely if there were multiple alignments with the same best sum of alignment scores at different positions
-  if ($sequence_pair_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-
-    ### report that the sequence has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-    # my $ambiguous_read_1 = join("\t",$identifier.'/1','256','*','0','0','*','*','0','0',$sequence_1,$quality_value_1);
-    # my $ambiguous_read_2 = join("\t",$identifier.'/2','256','*','0','0','*','*','0','0',$sequence_2,$quality_value_2);
-    # warn "$ambiguous_read_1\n";
-    # warn "$ambiguous_read_2\n";
-
-    if ($ambiguous){
-      return 2; # => exits to next sequence pair, and prints it out (in FastQ format) to _ambiguous_reads_1.txt and _ambiguous_reads_2.txt if '--ambiguous' was specified
-      }
-    elsif ($unmapped){
-      return 1; # => exits to next sequence pair, and prints it out (in FastQ format) to _unmapped_reads_1.txt and _unmapped_reads_2.txt if '--unmapped' but not '--ambiguous' was specified
-    }
-    else{
-      return 0; # => exits to next sequence pair (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 1) or ($methylation_call_params->{$identifier}->{index} == 2) ){
-      #    warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence pair has not been rejected so far it does have a unique best alignment
-  $counting{unique_best_alignment_count}++;
-  extract_corresponding_genomic_sequence_paired_ends_bowtie2($identifier,$methylation_call_params);
-
-  ### check to see if the genomic sequences we extracted has the same length as the observed sequences +2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1}) != length($sequence_1)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position_1}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2}) != length($sequence_2)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position_2}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  ### Compute MAPQ value
-  $methylation_call_params->{$identifier}->{mapq} = calc_mapq (length($sequence_1), length($sequence_2),
-                                                                           $methylation_call_params->{$identifier}->{sum_of_alignment_scores},
-                                                                           $methylation_call_params->{$identifier}->{sum_of_alignment_scores_second_best});
-
-
-  ### now we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call_1} = methylation_call($identifier,$sequence_1,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1},$methylation_call_params->{$identifier}->{read_conversion_1});
-  $methylation_call_params->{$identifier}->{methylation_call_2} = methylation_call($identifier,$sequence_2,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2},$methylation_call_params->{$identifier}->{read_conversion_2});
-  # warn "$methylation_call_params->{$identifier}->{read_conversion_2}\n";
-  # warn "  $sequence_2\n";
-  # warn "$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2}\n";
-  # warn "  $methylation_call_params->{$identifier}->{methylation_call_2}\n";
-
-  print_bisulfite_mapping_results_paired_ends_bowtie2($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2);
-  return 0; ## otherwise 1 will be returned by default, which would print the sequence pair to unmapped_1 and _2
-}
-
-###
-
-# Compute MAPQ value for a read or read pair as in Bowtie2-2.2.2 (specifically, V2 of the MAPQ calculator: "class BowtieMapq2")
-# assuming end-to-end alignment with the default calculation of the minimum alignment score
-
-sub calc_mapq {
-  my ($read1Len, $read2Len, $AS_best, $AS_secBest) = @_;
-
-  my $scMin = $score_min_intercept + $score_min_slope * $read1Len;
-  ### read2Len is only defined for paired-end reads, so for single-end mode we can just a score min value for read 1
-  if (defined $read2Len){
-    $scMin   += $score_min_intercept + $score_min_slope * $read2Len;
-  }
-
-  my $diff = abs$scMin; # scores can vary by up to this much (since max AS is 0 for end-to-end alignment)
-  my $bestOver = $AS_best - $scMin;
-
-  if (!defined $AS_secBest) {
-    if    ($bestOver >= $diff * 0.8) { return 42; }
-    elsif ($bestOver >= $diff * 0.7) { return 40; }
-    elsif ($bestOver >= $diff * 0.6) { return 24; }
-    elsif ($bestOver >= $diff * 0.5) { return 23; }
-    elsif ($bestOver >= $diff * 0.4) { return  8; }
-    elsif ($bestOver >= $diff * 0.3) { return  3; }
-    else                             { return  0; }
-  } else {
-    my $bestDiff = abs(abs($AS_best) - abs($AS_secBest));
-    if ($bestDiff >= $diff * 0.9) {
-      if ($bestOver == $diff) {
-	return 39;
-      } else {
-	return 33;
-      }
-    } elsif ($bestDiff >= $diff * 0.8) {
-      if ($bestOver == $diff) {
-	return 38;
-      } else {
-	return 27;
-      }
-    } elsif ($bestDiff >= $diff * 0.7) {
-      if ($bestOver == $diff) {
-	return 37;
-      } else {
-	return 26;
-      }
-    } elsif ($bestDiff >= $diff * 0.6) {
-      if ($bestOver == $diff) {
-	return 36;
-      } else {
-	return 22;
-      }
-    } elsif ($bestDiff >= $diff * 0.5) {
-      if ($bestOver == $diff) {
-	return 35;
-      } elsif ($bestOver >= $diff * 0.84) {
-	return 25;
-      } elsif ($bestOver >= $diff * 0.68) {
-	return 16;
-      } else {
-	return 5;
-      }
-    } elsif ($bestDiff >= $diff * 0.4) {
-      if ($bestOver == $diff) {
-	return 34;
-      } elsif ($bestOver >= $diff * 0.84) {
-	return 21;
-      } elsif ($bestOver >= $diff * 0.68) {
-	return 14;
-      } else {
-	return 4;
-      }
-    } elsif ($bestDiff >= $diff * 0.3) {
-      if ($bestOver == $diff) {
-	return 32;
-      } elsif ($bestOver >= $diff * 0.88) {
-	return 18;
-      } elsif ($bestOver >= $diff * 0.67) {
-	return 15;
-      } else {
-	return 3;
-      }
-    } elsif ($bestDiff >= $diff * 0.2) {
-      if ($bestOver == $diff) {
-	return 31;
-      } elsif ($bestOver >= $diff * 0.88) {
-	return 17;
-      } elsif ($bestOver >= $diff * 0.67) {
-	return 11;
-      } else {
-	return 0;
-      }
-    } elsif ($bestDiff >= $diff * 0.1) {
-      if ($bestOver == $diff) {
-	return 30;
-      } elsif ($bestOver >= $diff * 0.88) {
-	return 12;
-      } elsif ($bestOver >= $diff * 0.67) {
-	return 7;
-      } else {
-	return 0;
-      }
-    } elsif ($bestDiff > 0) {
-      if ($bestOver >= $diff * 0.67) {
-	return 6;
-      } else {
-	return 2;
-      }
-    } else {
-      if ($bestOver >= $diff * 0.67) {
-	return 1;
-      } else {
-	return 0;
-      }
-    }
-  }
-}
-
-
-###
-
-sub decide_whether_paired_end_alignment_is_valid{
-  my ($index,$identifier) = @_;
-  my ($id_1,$strand_1,$mapped_chromosome_1,$position_1,$bowtie_sequence_1,$mismatch_info_1) = (split (/\t/,$fhs[$index]->{last_line_1},-1))[0,1,2,3,4,7];
-  my ($id_2,$strand_2,$mapped_chromosome_2,$position_2,$bowtie_sequence_2,$mismatch_info_2) = (split (/\t/,$fhs[$index]->{last_line_2},-1))[0,1,2,3,4,7];
-  chomp $mismatch_info_1;
-  chomp $mismatch_info_2;
-  my $seq_id_1 = $id_1;
-  my $seq_id_2 = $id_2;
-  $seq_id_1 =~ s/\/1$//; # removing the read /1
-  $seq_id_2 =~ s/\/1$//; # removing the read /1
-
-  ### ensuring that the current entry is the correct sequence
-  if ($seq_id_1 eq $identifier or $seq_id_2 eq $identifier){
-    ### checking the orientation of the alignment. We need to discriminate between 8 different conditions, however only 4 of them are theoretically
-    ### sensible alignments
-    my $orientation = ensure_sensical_alignment_orientation_paired_ends ($index,$id_1,$strand_1,$id_2,$strand_2);
-    ### If the orientation was correct can we move on
-    if ($orientation == 1){
-      return 1; ### 1st possibility for A SEQUENCE-PAIR TO PASS
-    }
-    ### If the alignment was in the wrong orientation we need to read in two new lines
-    elsif($orientation == 0){
-      my $newline_1 = $fhs[$index]->{fh}->getline();
-      my $newline_2 = $fhs[$index]->{fh}->getline();
-      if ($newline_1 and $newline_2){
-	### extract detailed information about the alignment again (from $newline_1 and $newline_2 this time)
-	($id_1,$strand_1) = (split (/\t/,$newline_1))[0,1];
-	($id_2,$strand_2) = (split (/\t/,$newline_2))[0,1];
-
-	my $seqid;
-	$seq_id_1 = $id_1;
-	$seq_id_2 = $id_2;
-	# we need to capture the first read (ending on /1)
-	if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-	  $seqid = $seq_id_1;
-	}
-	elsif ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-	  $seqid = $seq_id_2;
-	}
-	else{
-	  die "One of the two reads needs to end on /1!!";
-	}
-	
-	### ensuring that the next entry is still the correct sequence
-	if ($seq_id_1 eq $identifier or  $seq_id_2 eq $identifier){
-	  ### checking orientation again
-	  $orientation = ensure_sensical_alignment_orientation_paired_ends ($index,$id_1,$strand_1,$id_2,$strand_2);
-	  ### If the orientation was correct can we move on
-	  if ($orientation == 1){
-	    ### Writing the current sequence to last_line_1 and last_line_2
-	    $fhs[$index]->{last_seq_id} = $seqid;
-	    $fhs[$index]->{last_line_1} = $newline_1;
-	    $fhs[$index]->{last_line_2} = $newline_2;
-	    return 1; ### 2nd possibility for a SEQUENCE-PAIR TO PASS
-	  }
-	  ### If the alignment was in the wrong orientation again we need to read in yet another 2 new lines and store them in @fhs (this must be
-	  ### the next entry)
-	  elsif ($orientation == 0){
-	    $newline_1 = $fhs[$index]->{fh}->getline();
-	    $newline_2 = $fhs[$index]->{fh}->getline();
-	    if ($newline_1 and $newline_2){
-	      ($seq_id_1) = split (/\t/,$newline_1);
-	      ($seq_id_2) = split (/\t/,$newline_2);
-	
-	      $seqid = '';
-	      if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-		$seqid = $seq_id_1;
-	      }
-	      elsif ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-		$seqid = $seq_id_2;
-	      }
-	      else{
-		die "One of the two reads needs to end on /1!!";
-	      }
-	
-	      ### check if the next 2 lines still have the same seq ID (must not happen), and if not overwrite the current seq-ID and bowtie output with
-	      ### the same fields of the just read next entry
-	      die "Same seq ID 3 or more times in a row!(should be 2 max)" if ($seqid eq $identifier);
-	      $fhs[$index]->{last_seq_id} = $seqid;
-	      $fhs[$index]->{last_line_1} = $newline_1;
-	      $fhs[$index]->{last_line_2} = $newline_2;
-	      return 0; # not processing anything this round as the alignment currently stored in last_line_1 and _2 was in the wrong orientation
-	    }
-	    else {
-	      ### assigning undef to last_seq_id and last_line (end of bowtie output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line_1} = undef;
-	      $fhs[$index]->{last_line_2} = undef;
-	      return 0; # not processing anything as the alignment currently stored in last_line_1 and _2 was in the wrong orientation
-	    }
-	  }
-	  else{
-	    die "The orientation of the alignment must be either correct or incorrect\n";
-	  }
-	}
-	### the sequence pair we just read in is already the next sequence pair to be analysed -> store it in @fhs
-	else{
-	  $fhs[$index]->{last_seq_id} = $seqid;
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-	  return 0; # processing the new alignment result only in the next round
-	}
-      }
-      else {
-	# assigning undef to last_seq_id and both last_lines (end of bowtie output)
-	$fhs[$index]->{last_seq_id} = undef;
-	$fhs[$index]->{last_line_1} = undef;
-	$fhs[$index]->{last_line_2} = undef;
-	return 0; # not processing anything as the alignment currently stored in last_line_1 and _2 was in the wrong orientation
-      }
-    }
-    else{
-      die "The orientation of the alignment must be either correct or incorrect\n";
-    }
-  }
-  ### the sequence pair stored in @fhs as last_line_1 and last_line_2 is already the next sequence pair to be analysed -> analyse next round
-  else{
-    return 0;
-  }
-}
-
-### EXTRACT GENOMIC SEQUENCE | BOWTIE 1 | PAIRED-END
-
-sub extract_corresponding_genomic_sequence_paired_ends {
-  my ($sequence_identifier,$methylation_call_params) = @_;
-  ### A bisulfite sequence pair for 1 location in the genome can theoretically be on any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-  my $alignment_read_1;
-  my $alignment_read_2;
-  my $read_conversion_info_1;
-  my $read_conversion_info_2;
-  my $genome_conversion;
-
-  ### Now extracting the same sequence from the mouse genomic sequence, +2 extra bases at oone of the ends so that we can also make a CpG, CHG or CHH methylation call
-  ### if the C happens to be at the first or last position of the actually observed sequence
-  my $non_bisulfite_sequence_1;
-  my $non_bisulfite_sequence_2;
-
-  ### all alignments reported by bowtie have the + alignment first and the - alignment as the second one irrespective of whether read 1 or read 2 was
-  ### the + alignment. We however always read in sequences read 1 then read 2, so if read 2 is the + alignment we need to swap the extracted genomic
-  ### sequences around!
-  ### results from CT converted read 1 plus GA converted read 2 vs. CT converted genome (+/- orientation alignments are reported only)
-  if ($methylation_call_params->{$sequence_identifier}->{index} == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_GA_CT_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'CT';
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is read 1)
-    ### for hits on the forward strand we need to capture 2 extra bases at the 3' end
-
-    $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{start_seq_1},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ##CHH change
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is read 2)
-    ### As the second conversion is GA we need to capture 1 base 3', so that it is a 5' base after reverse complementation
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{start_seq_2}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+1){ ## CHH change to +1
-
-      $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2}),length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2);
-      ### the reverse strand sequence needs to be reverse complemented
-      $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-    }
-    else{
-       $non_bisulfite_sequence_2 = '';
-     }
-   }
-
-   ### results from GA converted read 1 plus CT converted read 2 vs. GA converted genome (+/- orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 1){
-    ### [Index 1, sequence originated from complementary to (converted) reverse strand]
-    $counting{GA_CT_GA_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'GA';
-
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is read 1)
-    ### as we need to make the methylation call for the base 5' of the first base (GA conversion!) we need to capture 2 extra bases at the 5' end
-    if ($methylation_call_params->{$sequence_identifier}->{start_seq_1}-1 > 0){ ## CHH change to -1
-      $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{start_seq_1}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ### CHH change to -2/+2
-    }
-    else{
-      $non_bisulfite_sequence_1 = '';
-    }
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is read 2)
-    ### As we are doing a CT comparison for the reverse strand we are taking 2 bases extra at the 5' end, so it is a 3' base after reverse complementation
-    $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2})-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2); ### CHH change to -2/+2
-    ### the reverse strand sequence needs to be reverse complemented
-    $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-  }
-
-  ### results from GA converted read 1 plus CT converted read 2 vs. CT converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 2){
-    ### [Index 2, sequence originated from the complementary to (converted) forward strand]
-    $counting{GA_CT_CT_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'CT';
-
-    ### Here we switch the sequence information round!!  non_bisulfite_sequence_1 will later correspond to the read 1!!!!
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is READ 2), read 1 is in - orientation on the reverse strand
-    ### As read 1 is GA converted we need to capture 2 extra 3' bases which will be 2 extra 5' base after reverse complementation
-    $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2}),length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2); ### CHH change to +2
-    ### the reverse strand sequence needs to be reverse complemented
-    $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is READ 1)
-    ### non_bisulfite_sequence_2 will later correspond to the read 2!!!!
-    ### Read 2 is CT converted so we need to capture 2 extra 3' bases
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > ($methylation_call_params->{$sequence_identifier}->{start_seq_1})+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+1){ ## CHH change to +1
-      $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_1}),length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ## CHH changed from +1 to +2
-    }
-    else{
-      $non_bisulfite_sequence_2 = '';
-    }
-  }
-
-  ### results from CT converted read 1 plus GA converted read 2 vs. GA converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 3){
-    ### [Index 3, sequence originated from the (converted) reverse strand]
-    $counting{CT_GA_GA_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'GA';
-
-    ### Here we switch the sequence information round!!  non_bisulfite_sequence_1 will later correspond to the read 1!!!!
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is READ 2), read 1 is in - orientation on the reverse strand
-    ### As read 1 is CT converted we need to capture 2 extra 5' bases which will be 2 extra 3' base after reverse complementation
-    if ( ($methylation_call_params->{$sequence_identifier}->{start_seq_2}-1) > 0){ ## CHH changed to -1
-      $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2})-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2); ### CHH changed to -2/+2
-      ### the reverse strand sequence needs to be reverse complemented
-      $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-    }
-    else{
-      $non_bisulfite_sequence_1 = '';
-    }
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is READ 1)
-    ### non_bisulfite_sequence_2 will later correspond to the read 2!!!!
-    ### Read 2 is GA converted so we need to capture 2 extra 5' bases
-    $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_1})-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ### CHH changed to -2/+2
-  }
-  else{
-    die "Too many bowtie result filehandles\n";
-  }
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_1} = $alignment_read_1;
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_2} = $alignment_read_2;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_1} = $read_conversion_info_1;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_2} = $read_conversion_info_2;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-}
-
-### EXTRACT GENOMIC SEQUENCE BOWTIE 2 | PAIRED-END
-
-sub extract_corresponding_genomic_sequence_paired_ends_bowtie2{
-  my ($sequence_identifier,$methylation_call_params) = @_;
-  ### A bisulfite sequence pair for 1 location in the genome can theoretically be on any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-
-  my $cigar_1 = $methylation_call_params->{$sequence_identifier}->{CIGAR_1};
-  my $cigar_2 = $methylation_call_params->{$sequence_identifier}->{CIGAR_2};
-  my $flag_1 =  $methylation_call_params->{$sequence_identifier}->{flag_1};
-  my $flag_2 =  $methylation_call_params->{$sequence_identifier}->{flag_2};
-
-  my $contains_deletion_1 = 0;
-  my $contains_deletion_2 = 0;
-  if ($cigar_1 =~ /D/){
-    $contains_deletion_1 = 1;
-    if ($verbose){ warn "$cigar_1\n$methylation_call_params->{$sequence_identifier}->{mismatch_info_1}\n";}
-  }
-  if ($cigar_2 =~ /D/){
-    $contains_deletion_2 = 1;
-    if ($verbose){ warn "$cigar_2\n$methylation_call_params->{$sequence_identifier}->{mismatch_info_2}\n";}
-  }
-
-  # warn "$cigar_1\t$cigar_2\t$flag_1\t$flag_2\n";
-  ### We are now extracting the corresponding genomic sequence, +2 extra bases at the end (or start) so that we can also make a CpG methylation call and
-  ### in addition make differential calls for Cs in CHG or CHH context if the C happens to be at the last (or first)  position of the actually observed sequence
-
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-  my $alignment_read_1;
-  my $alignment_read_2;
-  my $read_conversion_info_1;
-  my $read_conversion_info_2;
-  my $genome_conversion;
-
-  ### Now extracting the same sequence from the mouse genomic sequence, +2 extra bases at one of the ends so that we can also make a CpG, CHG or CHH methylation call
-  ### if the C happens to be at the last position of the actually observed sequence
-  my $non_bisulfite_sequence_1 = '';
-  my $non_bisulfite_sequence_2 = '';
-  my $genomic_seq_for_MD_tag_1 = ''; # this sequence contains potential deletions in the genome as well so that we can generate a proper MD tag for the SAM output
-  my $genomic_seq_for_MD_tag_2 = '';
-
-  ### Positions in SAM format are 1 based, so we need to subract 1 when getting substrings
-  my $pos_1 = $methylation_call_params->{$sequence_identifier}->{position_1}-1;
-  my $pos_2 = $methylation_call_params->{$sequence_identifier}->{position_2}-1;
-
-  # parsing CIGAR 1 string
-  my @len_1 = split (/\D+/,$cigar_1); # storing the length per operation
-  my @ops_1 = split (/\d+/,$cigar_1); # storing the operation
-  shift @ops_1; # remove the empty first element
-  die "CIGAR 1 string contained a non-matching number of lengths and operations\n" unless (scalar @len_1 == scalar @ops_1);
-  # parsing CIGAR 2 string
-  my @len_2 = split (/\D+/,$cigar_2); # storing the length per operation
-  my @ops_2 = split (/\d+/,$cigar_2); # storing the operation
-  shift @ops_2; # remove the empty first element
-  die "CIGAR 2 string contained a non-matching number of lengths and operations\n" unless (scalar @len_2 == scalar @ops_2);
-
-  my $indels_1 = 0; # adding these to the hemming distance value (needed for the NM field in the final SAM output
-  my $indels_2 = 0;
-
-  ### Extracting read 1 genomic sequence ###
-
-  # extracting 2 additional bp at the 5' end (read 1)
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 1) or ($methylation_call_params->{$sequence_identifier}->{index} == 3) ){
-    # checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless ( ($pos_1-2) > 0){# exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag_1} = $genomic_seq_for_MD_tag_1;
-      return;
-    }
-    $non_bisulfite_sequence_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1-2,2);
-  }
-
-  foreach (0..$#len_1){
-    if ($ops_1[$_] eq 'M'){
-      # extracting genomic sequence
-      $non_bisulfite_sequence_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1,$len_1[$_]);
-      if ($contains_deletion_1){
-	$genomic_seq_for_MD_tag_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1,$len_1[$_]);
-      }
-      #   warn "$non_bisulfite_sequence_1\n";
-      # adjusting position
-      $pos_1 += $len_1[$_];
-    }
-    elsif ($ops_1[$_] eq 'I'){ # insertion in the read sequence
-      # we simply add padding Xs instead of finding genomic sequence. This will not be used to infer methylation calls, and we can later ignore it for the generation of the MD;Z: tag
-      $non_bisulfite_sequence_1 .= 'X' x $len_1[$_];
-      if ($contains_deletion_1){
-	$genomic_seq_for_MD_tag_1 .= 'X' x $len_1[$_];
-      }
-      # warn "$non_bisulfite_sequence_1\n";
-      # position doesn't need adjusting
-
-      ### 03 06 2014: In fact we don't need to add anything to the hemming distance for insertions since we use padding Xs which will fail a base by base comparison in hemming_dist()
-      # indels_1 += $len_1[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif ($ops_1[$_] eq 'D'){ # deletion in the read sequence
-      # we do not add any genomic sequence but only adjust the position
-      # we do however need to add the genomic sequence to $genomic_seq_for_MD-tag so we can create a proper MD tag later
-      if ($contains_deletion_1){
-	$genomic_seq_for_MD_tag_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1,$len_1[$_]);
-      }
-      #     warn "Just adjusting the position by: ",$len_1[$_],"bp\n";
-      $pos_1 += $len_1[$_];
-      $indels_1 += $len_1[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif($cigar_1 =~ tr/[NSHPX=]//){ # if these (for standard mapping) illegal characters exist we die
-      die "The CIGAR 1 string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-    }
-    else{
-      die "The CIGAR 1 string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-    }
-  }
-
-  ### 3' end of read 1
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 0) or ($methylation_call_params->{$sequence_identifier}->{index} == 2) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) >= $pos_1+2){# exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      return;
-    }
-
-    $non_bisulfite_sequence_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1,2);
-  }
-
-
-  ### Extracting read 2 genomic sequence ###
-
-  ### 5' end of read 2
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 1) or ($methylation_call_params->{$sequence_identifier}->{index} == 3) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless ( ($pos_2-2) >= 0){# exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-      $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag_2} = $genomic_seq_for_MD_tag_2;
-      return;
-    }
-    $non_bisulfite_sequence_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2-2,2);
-  }
-
-  foreach (0..$#len_2){
-    if ($ops_2[$_] eq 'M'){
-      # extracting genomic sequence
-      $non_bisulfite_sequence_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2,$len_2[$_]);
-      if ($contains_deletion_2){
-	$genomic_seq_for_MD_tag_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2,$len_2[$_]);
-      }
-      # warn "$non_bisulfite_sequence_2\n";
-      # adjusting position
-      $pos_2 += $len_2[$_];
-    }
-    elsif ($ops_2[$_] eq 'I'){ # insertion in the read sequence
-      # we simply add padding Xs instead of finding genomic sequence. This will not be used to infer methylation calls and we can ignore this later during the generation of the MD:Z: tag
-      $non_bisulfite_sequence_2 .= 'X' x $len_2[$_];
-      if ($contains_deletion_2){
-	$genomic_seq_for_MD_tag_2 .= 'X' x $len_2[$_];
-      }
-      # warn "$non_bisulfite_sequence_2\n";
-      # position doesn't need adjusting
-
-      ### 03 06 2014: In fact we don't need to add anything to the hemming distance for insertions since we use padding Xs which will fail a base by base comparison in hemming_dist()
-      # $indels_2 += $len_2[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif ($ops_2[$_] eq 'D'){ # deletion in the read sequence
-      # we do not add any genomic sequence but only adjust the position
-      # we do however need to add the genomic sequence to $genomic_seq_for_MD-tag so we can create a proper MD tag later
-      if ($contains_deletion_2){
-	$genomic_seq_for_MD_tag_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2,$len_2[$_]);
-      }
-      # warn "Just adjusting the position by: ",$len_2[$_],"bp\n";
-      $pos_2 += $len_2[$_];
-      $indels_2 += $len_2[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif($cigar_2 =~ tr/[NSHPX=]//){ # if these (for standard mapping) illegal characters exist we die
-      die "The CIGAR 2 string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-    }
-    else{
-      die "The CIGAR 2 string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-    }
-  }
-
-  ### 3' end of read 2
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 0) or ($methylation_call_params->{$sequence_identifier}->{index} == 2) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) >= $pos_2+2){# exiting with en empty genomic sequence otherwise
-      # need to set read 1 as well now to prevent warning
-      #  warn "'$non_bisulfite_sequence_1'\n'$non_bisulfite_sequence_2'\n\n";
-      #  sleep(5);
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-      return;
-    }
-    $non_bisulfite_sequence_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2,2);
-  }
-
-  ### all paired-end alignments reported by Bowtie 2 have the Read 1 alignment first and the Read 2 alignment as the second one irrespective of whether read 1 or read 2 was
-  ### the + alignment. We also read in sequences read 1 then read 2 so they should correspond perfectly
-
-  ### results from CT converted read 1 plus GA converted read 2 vs. CT converted genome (+/- orientation alignments are reported only)
-  if ($methylation_call_params->{$sequence_identifier}->{index} == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_GA_CT_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'CT';
-    ### Read 1 is always the forward hit
-    ### Read 2 is will always on the reverse strand, so it needs to be reverse complemented
-    $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-    if ($contains_deletion_2){
-      $genomic_seq_for_MD_tag_2 = reverse_complement($genomic_seq_for_MD_tag_2);
-    }
-  }
-
-  ### results from GA converted read 1 plus CT converted read 2 vs. GA converted genome (+/- orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 1){
-    ### [Index 1, sequence originated from complementary to (converted) bottom strand]
-    $counting{GA_CT_GA_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'GA';
-    ### Read 1 is always the forward hit
-    ### Read 2 is will always on the reverse strand, so it needs to be reverse complemented
-    $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-    if ($contains_deletion_2){
-      $genomic_seq_for_MD_tag_2 = reverse_complement($genomic_seq_for_MD_tag_2);
-    }
-  }
-
-  ### results from GA converted read 1 plus CT converted read 2 vs. CT converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 2){
-    ### [Index 2, sequence originated from the complementary to (converted) top strand]
-    $counting{GA_CT_CT_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'CT';
-
-    ### Read 1 (the reverse strand) genomic sequence needs to be reverse complemented
-    $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-    if ($contains_deletion_1){
-      $genomic_seq_for_MD_tag_1 = reverse_complement($genomic_seq_for_MD_tag_1);
-    }
-  }
-
-  ### results from CT converted read 1 plus GA converted read 2 vs. GA converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 3){
-    ### [Index 3, sequence originated from the (converted) reverse strand]
-    $counting{CT_GA_GA_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'GA';
-    ### Read 1 (the reverse strand) genomic sequence needs to be reverse complemented
-    $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-    if ($contains_deletion_1){
-      $genomic_seq_for_MD_tag_1 = reverse_complement($genomic_seq_for_MD_tag_1);
-    }
-  }
-  else{
-    die "Too many bowtie result filehandles\n";
-  }
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_1} = $alignment_read_1;
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_2} = $alignment_read_2;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_1} = $read_conversion_info_1;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_2} = $read_conversion_info_2;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-  $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag_1} = $genomic_seq_for_MD_tag_1;
-  $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag_2} = $genomic_seq_for_MD_tag_2;
-  
-  ## the end position of a read is stored in $pos
-  $methylation_call_params->{$sequence_identifier}->{end_position_1} = $pos_1;
-  $methylation_call_params->{$sequence_identifier}->{end_position_2} = $pos_2;
-  $methylation_call_params->{$sequence_identifier}->{indels_1} = $indels_1;
-  $methylation_call_params->{$sequence_identifier}->{indels_2} = $indels_2;
-}
-
-##########################################
-### PRINT SINGLE END RESULTS: Bowtie 1 ###
-##########################################
-
-sub print_bisulfite_mapping_result_single_end{
-  my ($identifier,$sequence,$methylation_call_params,$quality_value)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value = convert_phred64_quals_to_phred33($quality_value);
-  }
-  elsif ($solexa){
-    $quality_value = convert_solexa_quals_to_phred33($quality_value);
-  }
-
-  ### We will add +1 bp to the starting position of single-end reads, as Bowtie 1 reports the index and not the bp position. 
-  $methylation_call_params->{$identifier}->{position} += 1;
-	
-  ### writing every uniquely mapped read and its methylation call to the output file
-  if ($vanilla){
-    my $bowtie1_output = join("\t",$identifier,$methylation_call_params->{$identifier}->{alignment_strand},$methylation_call_params->{$identifier}->{chromosome},$methylation_call_params->{$identifier}->{position},$methylation_call_params->{$identifier}->{end_position},$sequence,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence},$methylation_call_params->{$identifier}->{methylation_call},$methylation_call_params->{$identifier}->{read_conversion},$methylation_call_params->{$identifier}->{genome_conversion},$quality_value);
-    print OUT "$bowtie1_output\n";
-  }
-  else{ # SAM output, default since Bismark v1.0.0
-    single_end_SAM_output($identifier,$sequence,$methylation_call_params,$quality_value); # at the end of the script
-  }
-}
-
-##########################################
-### PRINT SINGLE END RESULTS: Bowtie 2 ###
-##########################################
-
-sub print_bisulfite_mapping_result_single_end_bowtie2{
-  my ($identifier,$sequence,$methylation_call_params,$quality_value)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value = convert_phred64_quals_to_phred33($quality_value);
-  }
-  elsif ($solexa){
-    $quality_value = convert_solexa_quals_to_phred33($quality_value);
-  }
-
-  ### writing every mapped read and its methylation call to the SAM output file (unmapped and ambiguous reads were already printed)
-	single_end_SAM_output($identifier,$sequence,$methylation_call_params,$quality_value); # at the end of the script
-}
-
-##########################################
-### PRINT PAIRED END ESULTS: Bowtie 1  ###
-##########################################
-
-sub print_bisulfite_mapping_results_paired_ends{
-  my ($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value_1 = convert_phred64_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_phred64_quals_to_phred33($quality_value_2);
-  }
-  elsif ($solexa){
-    $quality_value_1 = convert_solexa_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_solexa_quals_to_phred33($quality_value_2);
-  }
-
-  ### We will add +1 bp to the start position of paired-end reads, as Bowtie 1 reports the index and not the bp position. (End position is already 1-based)
-  $methylation_call_params->{$identifier}->{start_seq_1} += 1;
-
-  ### writing every single aligned read and its methylation call to the output file
-  if ($vanilla){	
-    my $bowtie1_output_paired_end = join("\t",$identifier,$methylation_call_params->{$identifier}->{alignment_read_1},$methylation_call_params->{$identifier}->{chromosome},$methylation_call_params->{$identifier}->{start_seq_1},$methylation_call_params->{$identifier}->{alignment_end},$sequence_1,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1},$methylation_call_params->{$identifier}->{methylation_call_1},$sequence_2,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2},$methylation_call_params->{$identifier}->{methylation_call_2},$methylation_call_params->{$identifier}->{read_conversion_1},$methylation_call_params->{$identifier}->{genome_conversion},$quality_value_1,$quality_value_2);
-    print OUT "$bowtie1_output_paired_end\n";
-  }
-  else{ # SAM output, default since Bismark v1.0.0
-    paired_end_SAM_output($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2); # at the end of the script
-  }
-
-}
-
-##########################################
-### PRINT PAIRED END ESULTS: Bowtie 2  ###
-##########################################
-
-sub print_bisulfite_mapping_results_paired_ends_bowtie2{
-  my ($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value_1 = convert_phred64_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_phred64_quals_to_phred33($quality_value_2);
-  }
-  elsif ($solexa){
-    $quality_value_1 = convert_solexa_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_solexa_quals_to_phred33($quality_value_2);
-  }
-
-  ### writing every single aligned read and its methylation call to the output file  (unmapped and ambiguous reads were already printed)
-  paired_end_SAM_output($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2); # at the end of the script
-
-}
-	
-	
-sub convert_phred64_quals_to_phred33{
-
-  my $qual = shift;
-  my @quals = split (//,$qual);
-  my @new_quals;
-
-  foreach my $index (0..$#quals){
-    my $phred_score = convert_phred64_quality_string_into_phred_score ($quals[$index]);
-    my $phred33_quality_string = convert_phred_score_into_phred33_quality_string ($phred_score);
-    $new_quals[$index] = $phred33_quality_string;
-  }
-
-  my $phred33_quality = join ("",@new_quals);
-  return $phred33_quality;
-}
-
-sub convert_solexa_quals_to_phred33{
-
-  my $qual = shift;
-  my @quals = split (//,$qual);
-  my @new_quals;
-
-  foreach my $index (0..$#quals){
-    my $phred_score = convert_solexa_pre1_3_quality_string_into_phred_score ($quals[$index]);
-    my $phred33_quality_string = convert_phred_score_into_phred33_quality_string ($phred_score);
-    $new_quals[$index] = $phred33_quality_string;
-  }
-
-  my $phred33_quality = join ("",@new_quals);
-  return $phred33_quality;
-}
-
-sub convert_phred_score_into_phred33_quality_string{
-  my $qual = shift;
-  $qual = chr($qual+33);
-  return $qual;
-}
-
-sub convert_phred64_quality_string_into_phred_score{
-  my $string = shift;
-  my $qual = ord($string)-64;
-  return $qual;
-}
-
-sub convert_solexa_pre1_3_quality_string_into_phred_score{
-  ### We will just use 59 as the offset here as all Phred Scores between 10 and 40 look exactly the same, there is only a minute difference for values between 0 and 10
-  my $string = shift;
-  my $qual = ord($string)-59;
-  return $qual;
-}
-
-
-sub extract_corresponding_genomic_sequence_single_end {
-  my ($sequence_identifier,$methylation_call_params) = @_;
-  ### A bisulfite sequence for 1 location in the genome can theoretically be any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-  my $alignment_strand;
-  my $read_conversion_info;
-  my $genome_conversion;
-  ### Also extracting the corresponding genomic sequence, +2 extra bases at the end so that we can also make a CpG methylation call and
-  ### in addition make differential calls for Cs non-CpG context, which will now be divided into CHG and CHH methylation,
-  ### if the C happens to be at the last position of the actually observed sequence
-  my $non_bisulfite_sequence;
-  ### depending on the conversion we want to make need to capture 1 extra base at the 3' end
-
-  my $pbat_index_modifier = 0;
-
-  if ($pbat){
-    $pbat_index_modifier += 2; # (we are simply not running indexes 0 or 1!
-  }
-
-  ### results from CT converted read vs. CT converted genome (+ orientation alignments are reported only)
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_CT_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'CT';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+1){ ## CHH changed to +1
-      ### + 2 extra base at the 3' end
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to +2
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from CT converted reads vs. GA converted genome (- orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 1){
-    ### [Index 1, sequence originated from (converted) reverse strand]
-    $counting{CT_GA_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'GA';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if ($methylation_call_params->{$sequence_identifier}->{position}-2 >= 0){ ## CHH changed to -2 # 02 02 2012 Changed this to >= from >
-      ### Extracting 2 extra 5' bases on forward strand which will become 2 extra 3' bases after reverse complementation
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to -2/+2
-      ## reverse complement!
-      $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from GA converted reads vs. CT converted genome (- orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 2){
-    ### [Index 2, sequence originated from complementary to (converted) forward strand]
-    $counting{GA_CT_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'CT';
-
-    ### +2 extra bases on the forward strand 3', which will become 2 extra 5' bases after reverse complementation
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+1){ ## changed to +1 on 02 02 2012
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to +2
-      ## reverse complement!
-      $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from GA converted reads vs. GA converted genome (+ orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 3){
-    ### [Index 3, sequence originated from complementary to (converted) reverse strand]
-    $counting{GA_GA_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'GA';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if ($methylation_call_params->{$sequence_identifier}->{position}-2 >= 0){ ## CHH changed to +2 # 02 02 2012 Changed this to >= from >
-      ### +2 extra base at the 5' end as we are nominally checking the converted reverse strand
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to -2/+2
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-  else{
-    die "Too many bowtie result filehandles\n";
-  }
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_strand} = $alignment_strand;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion} = $read_conversion_info;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-
-  ### at this point we can also determine the end position of a read
-  $methylation_call_params->{$sequence_identifier}->{end_position} = $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence});
-}
-
-
-sub extract_corresponding_genomic_sequence_single_end_bowtie2{
-  my ($sequence_identifier,$methylation_call_params) = @_;
-
-  my $MD_tag = $methylation_call_params->{$sequence_identifier}->{MD_tag};
-  my $cigar  = $methylation_call_params->{$sequence_identifier}->{CIGAR};
-
-  my $contains_deletion = 0;
-  if ($cigar =~ /D/){
-    $contains_deletion = 1;
-    # warn "$cigar\n$MD_tag\n";
-  }
-  ### A bisulfite sequence for 1 location in the genome can theoretically be any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-  my $alignment_strand;
-  my $read_conversion_info;
-  my $genome_conversion;
-
-  ### We are now extracting the corresponding genomic sequence, +2 extra bases at the end (or start) so that we can also make a CpG methylation call and
-  ### in addition make differential calls for Cs in CHG or CHH context if the C happens to be at the last (or first)  position of the actually observed sequence
-  my $non_bisulfite_sequence = '';
-  my $genomic_seq_for_MD_tag = ''; # this sequence contains potential deletions in the genome as well so that we can generate a proper MD tag for the SAM output
-
-  ### Positions in SAM format are 1 based, so we need to subract 1 when getting substrings
-  my $pos = $methylation_call_params->{$sequence_identifier}->{position}-1;
-
-  # parsing CIGAR string
-  my @len = split (/\D+/,$cigar); # storing the length per operation
-  my @ops = split (/\d+/,$cigar); # storing the operation
-  shift @ops; # remove the empty first element
-  die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-  my $pbat_index_modifier = 0;
-
-  if ($pbat){
-    $pbat_index_modifier += 2; # (we are simply not running indexes 0 or 1!
-  }
-
-  ### If the sequence aligns best as CT converted reads vs. GA converted genome (OB, index 1) or GA converted reads vs. GA converted genome (CTOB, index 3)
-  if ( (($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 1) or (($methylation_call_params->{$sequence_identifier}->{index}  + $pbat_index_modifier) == 3) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless ( ($pos-2) >= 0){ # exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-      $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag} = $genomic_seq_for_MD_tag;
-      return;
-    }
-    $non_bisulfite_sequence .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos-2,2);
-  }
-
-  my $indels = 0;	
-
-  foreach (0..$#len){
-    if ($ops[$_] eq 'M'){
-      #extracting genomic sequence
-      $non_bisulfite_sequence .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos,$len[$_]);
-      if ($contains_deletion){
-	$genomic_seq_for_MD_tag .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos,$len[$_]);
-      }
-      # adjusting position
-      $pos += $len[$_];
-    }
-    elsif ($ops[$_] eq 'I'){ # insertion in the read sequence
-      # we simply add padding Xs instead of finding genomic sequence. This will not be used to infer methylation calls and we can later ignore it better during the generation of the MD:Z-tag
-      $non_bisulfite_sequence .= 'X' x $len[$_];
-      if ($contains_deletion){
-	$genomic_seq_for_MD_tag .= 'X' x $len[$_];
-      }
-      # warn "$non_bisulfite_sequence\n";
-      # position doesn't need to be adjusting
-
-      ### 03 06 2014: In fact we don't need to add anything to the hemming distance for insertions since we use padding Xs which will fail the base by base comparison in hemming_dist()
-      # $indels += $len[$_]; # adding this to $indels so we can determine the hemming distance for the SAM output (= single-base substitutions (mismatches, insertions, deletions)
-    }
-    elsif ($ops[$_] eq 'D'){ # deletion in the read sequence
-      # we do not add any genomic sequence but only adjust the position
-
-      # we do however add the genomic sequence to the $genomic_sequence for MD-tag determination if the CIGAR string contained a deletion
-      if ($contains_deletion){
-	$genomic_seq_for_MD_tag .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos,$len[$_]);
-      }
-      $pos += $len[$_];
-      $indels += $len[$_]; # adding this to $indels so we can determine the hemming distance for the SAM output (= single-base substitutions (mismatches, insertions, deletions)
-    }
-    elsif($cigar =~ tr/[NSHPX=]//){ # if these (for standard mapping) illegal characters exist we die
-      die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-    }
-    else{
-      die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-    }
-  }
-
-  ### If the sequence aligns best as CT converted reads vs. CT converted genome (OT, index 0) or GA converted reads vs. CT converted genome (CTOT, index 2)
-  if ( ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 0) or ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 2) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) >= $pos+2){ # exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-      $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag} = $genomic_seq_for_MD_tag;
-      return;
-    }
-    $non_bisulfite_sequence .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos,2);
-    # print "$methylation_call_params->{$sequence_identifier}->{bowtie_sequence}\n$non_bisulfite_sequence\n";
-  }
-
-
-  ### results from CT converted read vs. CT converted genome (+ orientation alignments are reported only)
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_CT_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'CT';
-  }
-
-  ### results from CT converted reads vs. GA converted genome (- orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 1){
-    ### [Index 1, sequence originated from (converted) reverse strand]
-    $counting{CT_GA_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'GA';
-
-    ### reverse complement!
-    $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    if ($contains_deletion){
-      $genomic_seq_for_MD_tag = reverse_complement($genomic_seq_for_MD_tag);
-    }
-  }
-
-  ### results from GA converted reads vs. CT converted genome (- orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 2){
-    ### [Index 2, sequence originated from complementary to (converted) forward strand]
-    $counting{GA_CT_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'CT';
-
-    ### reverse complement!
-    $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    if ($contains_deletion){
-      $genomic_seq_for_MD_tag = reverse_complement($genomic_seq_for_MD_tag);
-    }
-  }
-
-  ### results from GA converted reads vs. GA converted genome (+ orientation alignments are reported only)
-  elsif ( ($methylation_call_params->{$sequence_identifier}->{index} + $pbat_index_modifier) == 3){
-    ### [Index 3, sequence originated from complementary to (converted) reverse strand]
-    $counting{GA_GA_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'GA';
-
-  }
-  else{
-    die "Too many Bowtie 2 result filehandles\n";
-  }
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_strand} = $alignment_strand;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion} = $read_conversion_info;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-  $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag} = $genomic_seq_for_MD_tag;
-
-  # if ($contains_deletion){
-  #   warn "non-bis: $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence}\n";
-  #   warn "MD-seq:  $methylation_call_params->{$sequence_identifier}->{genomic_seq_for_MD_tag}\n";
-  # }
-
-  ### the end position of a read is stored in $pos
-  $methylation_call_params->{$sequence_identifier}->{end_position} = $pos;
-  $methylation_call_params->{$sequence_identifier}->{indels} = $indels;
-}
-
-### METHYLATION CALL
-
-sub methylation_call{
-  my ($identifier,$sequence_actually_observed,$genomic_sequence,$read_conversion) = @_;
-  ### splitting both the actually observed sequence and the genomic sequence up into single bases so we can compare them one by one
-  my @seq = split(//,$sequence_actually_observed);
-  my @genomic = split(//,$genomic_sequence);
-  #  print join ("\n",$identifier,$sequence_actually_observed,$genomic_sequence,$read_conversion),"\n";
-  ### Creating a match-string with different characters for non-cytosine bases (disregarding mismatches here), methyl-Cs or non-methyl Cs in either
-  ### CpG, CHH or CHG context
-
-  #################################################################
-  ### . for bases not involving cytosines                       ###
-  ### X for methylated C in CHG context (was protected)         ###
-  ### x for not methylated C in CHG context (was converted)     ###
-  ### H for methylated C in CHH context (was protected)         ###
-  ### h for not methylated C in CHH context (was converted)     ###
-  ### Z for methylated C in CpG context (was protected)         ###
-  ### z for not methylated C in CpG context (was converted)     ###
-  ### U for methylated C in unknown context (was protected)     ###
-  ### u for not methylated C in unknwon context (was converted) ###
-  #################################################################
-
-  my @match =();
-  warn "length of \@seq: ",scalar @seq,"\tlength of \@genomic: ",scalar @genomic,"\n" unless (scalar @seq eq (scalar@genomic-2)); ## CHH changed to -2
-  my $methyl_CHH_count = 0;
-  my $methyl_CHG_count = 0;
-  my $methyl_CpG_count = 0;
-  my $methyl_C_unknown_count = 0;
-  my $unmethylated_CHH_count = 0;
-  my $unmethylated_CHG_count = 0;
-  my $unmethylated_CpG_count = 0;
-  my $unmethylated_C_unknown_count = 0;
-
-  if ($read_conversion eq 'CT'){
-    for my $index (0..$#seq) {
-      if ($seq[$index] eq $genomic[$index]) {
-	### The residue can only be a C if it was not converted to T, i.e. protected my methylation
-	if ($genomic[$index] eq 'C') {
-	  ### If the residue is a C we want to know if it was in CpG context or in any other context
-	  my $downstream_base = $genomic[$index+1];
-	
-	  if ($downstream_base eq 'G'){
-	    ++$methyl_CpG_count;
-	    push @match,'Z'; # protected C, methylated, in CpG context
-	  }
-	  elsif ($downstream_base eq 'N'){ # if the downstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$methyl_C_unknown_count;
-	    push @match,'U'; # protected C, methylated, in Unknown context
-	  }	
-	  else {
-	    ### C in not in CpG-context, determining the second downstream base context
-	    my $second_downstream_base = $genomic[$index+2];
-	
-	    if ($second_downstream_base eq 'G'){
-	      ++$methyl_CHG_count;
-	      push @match,'X'; # protected C, methylated, in CHG context
-	    }
-	    elsif ($second_downstream_base eq 'N'){
-	      ++$methyl_C_unknown_count; # if the second downstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'U'; # protected C, methylated, in Unknown context
-	    }
-	    else{
-	      ++$methyl_CHH_count;
-	      push @match,'H'; # protected C, methylated, in CHH context
-	    }
-	  }
-	}
-	else {
-	  push @match, '.';
-	}
-      }
-      elsif ($seq[$index] ne $genomic[$index]) {
-	### for the methylation call we are only interested in mismatches involving cytosines (in the genomic sequence) which were converted into Ts
-	### in the actually observed sequence
-	if ($genomic[$index] eq 'C' and $seq[$index] eq 'T') {
-	  ### If the residue was converted to T we want to know if it was in CpG, CHG or CHH  context
-	  my $downstream_base = $genomic[$index+1];
-	
-	  if ($downstream_base eq 'G'){
-	    ++$unmethylated_CpG_count;
-	    push @match,'z'; # converted C, not methylated, in CpG context
-	  }
-	  elsif ($downstream_base eq 'N'){ # if the downstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$unmethylated_C_unknown_count;
-	    push @match,'u'; # converted C, not methylated, in Unknown context
-	  }
-	  else{
-	    ### C in not in CpG-context, determining the second downstream base context
-	    my $second_downstream_base = $genomic[$index+2];
-	
-	    if ($second_downstream_base eq 'G'){
-	      ++$unmethylated_CHG_count;
-	      push @match,'x'; # converted C, not methylated, in CHG context
-	    }
-	    elsif ($second_downstream_base eq 'N'){
-	      ++$unmethylated_C_unknown_count; # if the second downstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'u'; # converted C, not methylated, in Unknown context
-	    }
-	    else{
-	      ++$unmethylated_CHH_count;
-	      push @match,'h'; # converted C, not methylated, in CHH context
-	    }
-	  }
-	}
-	### all other mismatches are not of interest for a methylation call
-	else {
-	  push @match,'.';
-	}
-      }
-      else{
-	die "There can be only 2 possibilities\n";
-      }
-    }
-  }
-  elsif ($read_conversion eq 'GA'){
-    # print join ("\n",'***',$identifier,$sequence_actually_observed,$genomic_sequence,$read_conversion,'***'),"\n";
-
-    for my $index (0..$#seq) {
-      if ($seq[$index] eq $genomic[$index+2]) {
-	### The residue can only be a G if the C on the other strand was not converted to T, i.e. protected my methylation
-	if ($genomic[$index+2] eq 'G') {
-	  ### If the residue is a G we want to know if the C on the other strand was in CpG, CHG or CHH context, therefore we need
-	  ### to look if the base upstream is a C
-
-	  my $upstream_base = $genomic[$index+1];
-	
-	  if ($upstream_base eq 'C'){
-	    ++$methyl_CpG_count;
-	    push @match,'Z'; # protected C on opposing strand, methylated, in CpG context
-	  }
-	  elsif ($upstream_base eq 'N'){ # if the upstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$methyl_C_unknown_count;
-	    push @match,'U'; # protected C on opposing strand, methylated, in Unknown context
-	  }
-	  else{
-	    ### C in not in CpG-context, determining the second upstream base context
-	    my $second_upstream_base = $genomic[$index];
-	
-	    if ($second_upstream_base eq 'C'){
-	      ++$methyl_CHG_count;
-	      push @match,'X'; # protected C on opposing strand, methylated, in CHG context
-	    }
-	    elsif ($second_upstream_base eq 'N'){
-	      ++$methyl_C_unknown_count; # if the second upstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'U'; # protected C, methylated, in Unknown context
-	    }
-	    else{
-	      ++$methyl_CHH_count;
-	      push @match,'H'; # protected C on opposing strand, methylated, in CHH context
-	    }
-	  }
-	}
-	else{
-	  push @match, '.';
-	}
-      }
-      elsif ($seq[$index] ne $genomic[$index+2]) {
-	### for the methylation call we are only interested in mismatches involving cytosines (in the genomic sequence) which were converted to Ts
-	### on the opposing strand, so G to A conversions in the actually observed sequence
-	if ($genomic[$index+2] eq 'G' and $seq[$index] eq 'A') {
-	  ### If the C residue on the opposing strand was converted to T then we will see an A in the currently observed sequence. We want to know if
-	  ### the C on the opposing strand was it was in CpG, CHG or CHH context, therefore we need to look one (or two) bases upstream!
-
-	  my $upstream_base = $genomic[$index+1];
-
-	  if ($upstream_base eq 'C'){
-	    ++$unmethylated_CpG_count;
-	    push @match,'z'; # converted C on opposing strand, not methylated, in CpG context
-	  }
-	  elsif ($upstream_base eq 'N'){ # if the upstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$unmethylated_C_unknown_count;
-	    push @match,'u'; # converted C on opposing strand, not methylated, in Unknown context
-	  }
-	  else{
-	    ### C in not in CpG-context, determining the second upstream base context
-	    my $second_upstream_base = $genomic[$index];
-	
-	    if ($second_upstream_base eq 'C'){
-	      ++$unmethylated_CHG_count;
-	      push @match,'x'; # converted C on opposing strand, not methylated, in CHG context
-	    }
-	    elsif ($second_upstream_base eq 'N'){
-	      ++$unmethylated_C_unknown_count; # if the second upstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'u'; # converted C on opposing strand, not methylated, in Unknown context
-	    }
-	    else{
-	      ++$unmethylated_CHH_count;
-	      push @match,'h'; # converted C on opposing strand, not methylated, in CHH context
-	    }
-	  }
-	}
-	### all other mismatches are not of interest for a methylation call
-	else {
-	  push @match,'.';
-	}
-      }
-      else{
-	die "There can be only 2 possibilities\n";
-      }
-    }
-  }
-  else{
-    die "Strand conversion info is required to perform a methylation call\n";
-  }
-
-  my $methylation_call = join ("",@match);
-
-  $counting{total_meCHH_count} += $methyl_CHH_count;
-  $counting{total_meCHG_count} += $methyl_CHG_count;
-  $counting{total_meCpG_count} += $methyl_CpG_count;
-  $counting{total_meC_unknown_count} += $methyl_C_unknown_count;
-  $counting{total_unmethylated_CHH_count} += $unmethylated_CHH_count;
-  $counting{total_unmethylated_CHG_count} += $unmethylated_CHG_count;
-  $counting{total_unmethylated_CpG_count} += $unmethylated_CpG_count;
-  $counting{total_unmethylated_C_unknown_count} += $unmethylated_C_unknown_count;
-
-  # print "\n$sequence_actually_observed\n$genomic_sequence\n",@match,"\n$read_conversion\n\n";
-
-  return $methylation_call;
-}
-
-sub read_genome_into_memory{
-    ## working directoy
-    my $cwd = shift;
-    ## reading in and storing the specified genome in the %chromosomes hash
-    chdir ($genome_folder) or die "Can't move to $genome_folder: $!";
-    warn "Now reading in and storing sequence information of the genome specified in: $genome_folder\n\n";
-
-    my @chromosome_filenames =  <*.fa>;
-
-    ### if there aren't any genomic files with the extension .fa we will look for files with the extension .fasta
-    unless (@chromosome_filenames){
-      @chromosome_filenames =  <*.fasta>;
-    }
-
-    unless (@chromosome_filenames){
-      die "The specified genome folder $genome_folder does not contain any sequence files in FastA format (with .fa or .fasta file extensions)\n";
-    }
-
-    my $SQ_count = 0;
-
-    foreach my $chromosome_filename (@chromosome_filenames){
-
-	open (CHR_IN,$chromosome_filename) or die "Failed to read from sequence file $chromosome_filename $!\n";
-	### first line needs to be a fastA header
-	my $first_line = <CHR_IN>;
-	chomp $first_line;
-	$first_line =~ s/\r//;
-	### Extracting chromosome name from the FastA header
-	my $chromosome_name = extract_chromosome_name($first_line);
-	my $sequence;
-
-	while (<CHR_IN>){
-	  chomp;
-	  $_ =~ s/\r//; # removing carriage returns if present
-	  if ($_ =~ /^>/){
-	
-	    ### storing the previous chromosome in the %chromosomes hash, only relevant for Multi-Fasta-Files (MFA)
-	    if (exists $chromosomes{$chromosome_name}){
-	      print "chr $chromosome_name (",length $sequence ," bp)\n";
-	      die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name!\n";
-	    }
-	    else {
-	      if (length($sequence) == 0){
-		warn "Chromosome $chromosome_name in the multi-fasta file $chromosome_filename did not contain any sequence information!\n";
-	      }
-	      print "chr $chromosome_name (",length $sequence ," bp)\n";
-	      $chromosomes{$chromosome_name} = $sequence;
-	      $SQ_order{$SQ_count} = $chromosome_name;
-
-	      ++$SQ_count;
-
-	    }
-	    ### resetting the sequence variable
-	    $sequence = '';
-	    ### setting new chromosome name
-	    $chromosome_name = extract_chromosome_name($_);
-	  }
-	  else{
-	    $sequence .= uc$_;
-	  }
-	}
-	
- 	### Processing last chromosome of a multi Fasta File or the only entry in case of single entry FastA files
-
-	if (exists $chromosomes{$chromosome_name}){
-	    print "chr $chromosome_name (",length $sequence ," bp)\t";
-	    die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name.\n";
-	}
-	else{
-	    if (length($sequence) == 0){
-		warn "Chromosome $chromosome_name in the file $chromosome_filename did not contain any sequence information!\n";
-	    }
-
-	    ++$SQ_count;
-
-	    print "chr $chromosome_name (",length $sequence ," bp)\n";
-	    $chromosomes{$chromosome_name} = $sequence;
-	    $SQ_order{$SQ_count} = $chromosome_name;
-	}
-    }
-    print "\n";
-    chdir $cwd or die "Failed to move to directory $cwd\n";
-}
-
-sub extract_chromosome_name {
-    ## Bowtie seems to extract the first string after the inition > in the FASTA file, so we are doing this as well
-    my $fasta_header = shift;
-    if ($fasta_header =~ s/^>//){
-	my ($chromosome_name) = split (/\s+/,$fasta_header);
-	return $chromosome_name;
-    }
-    else{
-	die "The specified chromosome ($fasta_header) file doesn't seem to be in FASTA format as required!\n";
-    }
-}
-
-sub reverse_complement{
-  my $sequence = shift;
-  $sequence =~ tr/CATG/GTAC/;
-  $sequence = reverse($sequence);
-  return $sequence;
-}
-
-sub biTransformFastAFiles {
-  my $file = shift;
-  my ($dir,$filename);
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"zcat $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  if ($gzip){
-    $C_to_T_infile =~ s/$/_C_to_T.fa.gz/;
-    $G_to_A_infile =~ s/$/_G_to_A.fa.gz/;
-  }
-  else{
-    $C_to_T_infile =~ s/$/_C_to_T.fa/;
-    $G_to_A_infile =~ s/$/_G_to_A.fa/;
-  }
-
-  if ($prefix){
-    #  warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    #  warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-
-  if ($gzip){
-    open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-  }
-  else{
-    open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-  }
-
-  unless ($directional){
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-    if ($gzip){
-      open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-  }
-
-  my $count = 0;
-
-  while (1){
-    my $header = <IN>;
-    my $sequence= <IN>;
-    last unless ($header and $sequence);
-
-    $header = fix_IDs($header); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence = uc$sequence; # make input file case insensitive
-
-    # detecting if the input file contains tab stops, as this is likely to result in no alignments
-    if (index($header,"\t") != -1){
-      $seqID_contains_tabs++;
-    }
-
-    ### small check if the sequence seems to be in FastA format
-    die "Input file doesn't seem to be in FastA format at sequence $count: $!\n" unless ($header =~ /^>.*/);
-
-    my $sequence_C_to_T = $sequence;
-    $sequence_C_to_T =~ tr/C/T/;
-    print CTOT "$header$sequence_C_to_T";
-
-    unless ($directional){
-      my $sequence_G_to_A = $sequence;
-      $sequence_G_to_A =~ tr/G/A/;
-      print GTOA "$header$sequence_G_to_A";
-    }
-  }
-  close CTOT or die "Failed to close filehandle $!\n";
-
-  if ($directional){
-    warn "\nCreated C -> T converted versions of the FastA file $filename ($count sequences in total)\n\n";
-  }
-  else{
-    close GTOA or die "Failed to close filehandle $!\n";
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastA file $filename ($count sequences in total)\n\n";
-  }
-  return ($C_to_T_infile,$G_to_A_infile);
-}
-
-sub biTransformFastAFiles_paired_end {
-  my ($file,$read_number) = @_;
-
-  if ($gzip){
-    warn "GZIP compression of temporary files is not supported for paired-end FastA data. Continuing to write uncompressed files\n";
-    sleep (2);
-  }
-
-  my ($dir,$filename);
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"zcat $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  $C_to_T_infile =~ s/$/_C_to_T.fa/;
-  $G_to_A_infile =~ s/$/_G_to_A.fa/;
-
-  if ($prefix){
-    #  warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    #  warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-      open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-    }
-    elsif ($read_number == 2){
-      warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-    else{
-      die "Read number needs to be 1 or 2, but was: $read_number\n\n";
-    }
-  }
-  else{ # all four strand output
-    warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-    open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-    open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-  }
-
-  my $count = 0;
-
-  while (1){
-    my $header = <IN>;
-    my $sequence= <IN>;
-    last unless ($header and $sequence);
-
-    $header = fix_IDs($header); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence = uc$sequence; # make input file case insensitive
-
-    # detecting if the input file contains tab stops, as this is likely to result in no alignments
-    if (index($header,"\t") != -1){
-      $seqID_contains_tabs++;
-    }
-
-    ## small check if the sequence seems to be in FastA format
-    die "Input file doesn't seem to be in FastA format at sequence $count: $!\n" unless ($header =~ /^>/);
-
-    if ($read_number == 1){
-      if ($bowtie2){
-	$header =~ s/$/\/1\/1/;
-      }
-      else{	
-	$header =~ s/$/\/1/;
-      }
-    }
-    elsif ($read_number == 2){
-      if ($bowtie2){
-	$header =~ s/$/\/2\/2/;
-      }
-      else{
-	$header =~ s/$/\/2/;
-      }
-    }
-    else{
-      die "Read number needs to be 1 or 2, but was: $read_number\n\n";
-    }
-    my $sequence_C_to_T = my $sequence_G_to_A = $sequence;
-
-    $sequence_C_to_T =~ tr/C/T/;
-    $sequence_G_to_A =~ tr/G/A/;
-
-    if ($directional){
-
-      if ($read_number == 1){
-	print CTOT "$header$sequence_C_to_T";
-      }
-      elsif ($read_number == 2){
-	print GTOA "$header$sequence_G_to_A";
-      }
-    }
-    else{
-      print CTOT "$header$sequence_C_to_T";
-      print GTOA "$header$sequence_G_to_A";
-    }
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "\nCreated C -> T converted version of the FastA file $filename ($count sequences in total)\n\n";
-    }
-    else{
-      warn "\nCreated G -> A converted version of the FastA file $filename ($count sequences in total)\n\n";
-    }
-  }
-  else{
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastA file $filename ($count sequences in total)\n\n";
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      return ($C_to_T_infile);
-    }
-    else{
-      return ($G_to_A_infile);
-    }
-  }
-  else{
-    return ($C_to_T_infile,$G_to_A_infile);
-  }
-}
-
-
-sub biTransformFastQFiles {
-  my $file = shift;
-  my ($dir,$filename);
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"zcat $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  if ($prefix){
-    # warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    # warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  if ($pbat){ # PBAT-Seq
-    if ($gzip){
-      $G_to_A_infile =~ s/$/_G_to_A.fastq.gz/;
-    }
-    else{
-      $G_to_A_infile =~ s/$/_G_to_A.fastq/;
-    }
-
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-
-    if ($gzip){
-      open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-  }
-  else{ # directional or non-directional
-    if ($gzip){
-      $C_to_T_infile =~ s/$/_C_to_T.fastq.gz/;
-    }
-    else{
-      $C_to_T_infile =~ s/$/_C_to_T.fastq/;
-    }
-
-    warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-
-    if ($gzip){
-      open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n"; # uncompressed option
-    }
-
-    unless ($directional){
-      if ($gzip){
-	$G_to_A_infile =~ s/$/_G_to_A.fastq.gz/;
-      }
-      else{
-	$G_to_A_infile =~ s/$/_G_to_A.fastq/;
-      }
-
-      warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-
-      if ($gzip){
-	open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-      }
-      else{
-	open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-      }
-    }
-  }
-
-  my $count = 0;
-  while (1){
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    my $identifier2 = <IN>;
-    my $quality_score = <IN>;
-    last unless ($identifier and $sequence and $identifier2 and $quality_score);
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence = uc$sequence; # make input file case insensitive
-
-    # detecting if the input file contains tab stops, as this is likely to result in no alignments
-    if (index($identifier,"\t") != -1){
-      $seqID_contains_tabs++;
-    }
-
-    ## small check if the sequence file appears to be a FastQ file
-    if ($count == 1){
-      if ($identifier !~ /^\@/ or $identifier2 !~ /^\+/){
-	die "Input file doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-    }
-
-    if ($pbat){
-      my $sequence_G_to_A = $sequence;
-      $sequence_G_to_A =~ tr/G/A/;
-      print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-    }
-    else{ # directional or non-directional
-      my $sequence_C_to_T = $sequence;
-      $sequence_C_to_T =~ tr/C/T/;
-      print CTOT join ('',$identifier,$sequence_C_to_T,$identifier2,$quality_score);
-
-      unless ($directional){
-	my $sequence_G_to_A = $sequence;
-	$sequence_G_to_A =~ tr/G/A/;
-	print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-      }
-    }
-  }
-
-  if ($directional){
-    close CTOT or die "Failed to close filehandle $!\n";
-    warn "\nCreated C -> T converted version of the FastQ file $filename ($count sequences in total)\n\n";
-  }
-  elsif($pbat){
-    warn "\nCreated G -> A converted version of the FastQ file $filename ($count sequences in total)\n\n";
-    close GTOA or die "Failed to close filehandle $!\n";
-    return ($G_to_A_infile);
-  }
-  else{
-    close CTOT or die "Failed to close filehandle $!\n";
-    close GTOA or die "Failed to close filehandle $!\n";
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastQ file $filename ($count sequences in total)\n\n";
-  }
-
-  return ($C_to_T_infile,$G_to_A_infile);
-}
-
-sub biTransformFastQFiles_paired_end {
-  my ($file,$read_number) = @_;
-  my ($dir,$filename);
-
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"zcat $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  if ($gzip){
-    $C_to_T_infile =~ s/$/_C_to_T.fastq.gz/;
-    $G_to_A_infile =~ s/$/_G_to_A.fastq.gz/;
-  }
-  else{
-    $C_to_T_infile =~ s/$/_C_to_T.fastq/;
-    $G_to_A_infile =~ s/$/_G_to_A.fastq/;
-  }
-
-  if ($prefix){
-    #  warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    #  warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-      if ($gzip){
-	open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-      }
-      else{
-	open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-      }
-    }
-    elsif ($read_number == 2){
-      warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-      if ($gzip){
-	open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-      }
-      else{
-	open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-      }
-    }
-    else{
-      die "Read number needs to be 1 or 2, but was $read_number!\n\n";
-    }
-  }
-  else{
-    warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-    if ($gzip){
-      open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-      open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-  }
-
-  my $count = 0;
-  while (1){
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    my $identifier2 = <IN>;
-    my $quality_score = <IN>;
-    last unless ($identifier and $sequence and $identifier2 and $quality_score);
-    ++$count;
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence= uc$sequence; # make input file case insensitive
-
-    ## small check if the sequence file appears to be a FastQ file
-    if ($count == 1){
-      if ($identifier !~ /^\@/ or $identifier2 !~ /^\+/){
-	die "Input file doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-    }
-    my $sequence_C_to_T = my $sequence_G_to_A = $sequence;
-
-    if ($read_number == 1){
-      if ($bowtie2){
-	$identifier =~ s/$/\/1\/1/;
-      }
-      else{
-	$identifier =~ s/$/\/1/;
-      }
-    }
-    elsif ($read_number == 2){
-      if ($bowtie2){
-	$identifier =~ s/$/\/2\/2/;
-      }
-      else{
-	$identifier =~ s/$/\/2/;
-      }
-    }
-    else{
-      die "Read number needs to be 1 or 2\n";
-    }
-
-    $sequence_C_to_T =~ tr/C/T/;
-    $sequence_G_to_A =~ tr/G/A/;
-
-    if ($directional){
-      if ($read_number == 1){
-	print CTOT join ('',$identifier,$sequence_C_to_T,$identifier2,$quality_score);
-      }
-      else{
-	print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-      }
-    }
-    else{
-      print CTOT join ('',$identifier,$sequence_C_to_T,$identifier2,$quality_score);
-      print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-    }
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "\nCreated C -> T converted version of the FastQ file $filename ($count sequences in total)\n\n";
-    }
-    else{
-      warn "\nCreated G -> A converted version of the FastQ file $filename ($count sequences in total)\n\n";
-    }
-  }
-  else{
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastQ file $filename ($count sequences in total)\n\n";
-  }
-  if ($directional){
-    if ($read_number == 1){
-      close CTOT or die "Failed to close filehandle $!\n";
-      return ($C_to_T_infile);
-    }
-    else{
-      close GTOA or die "Failed to close filehandle $!\n";
-      return ($G_to_A_infile);
-    }
-  }
-  else{
-    close CTOT or die "Failed to close filehandle $!\n";
-    close GTOA or die "Failed to close filehandle $!\n";
-    return ($C_to_T_infile,$G_to_A_infile);
-  }
-}
-
-
-### SPECIAL BOWTIE 1 PAIRED-END FORMAT FOR GZIPPED OUTPUT FILES
-
-sub biTransformFastQFiles_paired_end_bowtie1_gzip {
-  my ($file_1,$file_2) = @_;
-  my ($dir,$filename);
-
-  if ($file_1 =~ /\//){
-    ($dir,$filename) = $file_1 =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file_1;
-  }
-
-  ### gzipped version of infile 1
-  if ($file_1 =~ /\.gz$/){
-    open (IN_1,"zcat $file_1 |") or die "Couldn't read from file $file_1: $!\n";
-  }
-  else{
-    open (IN_1,$file_1) or die "Couldn't read from file $file_1: $!\n";
-  }
-  ### gzipped version of infile 2
-  if ($file_2 =~ /\.gz$/){
-    open (IN_2,"zcat $file_2 |") or die "Couldn't read from file $file_2: $!\n";
-  }
-  else{
-    open (IN_2,$file_2) or die "Couldn't read from file $file_2: $!\n";
-  }
-
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file_1 and $file_2\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file_1 and $file_2\n";
-    sleep (1);
-  }
-
-  my $CT_plus_GA_infile = my $GA_plus_CT_infile = $filename;
-
-  if ($prefix){
-    # warn "Prefixing $prefix:\nold: $CT_plus_GA_infile\nold: $GA_plus_CT_infile\n\n";
-    $CT_plus_GA_infile = "$prefix.$CT_plus_GA_infile";
-    $GA_plus_CT_infile = "$prefix.$GA_plus_CT_infile";
-    # warn "Prefixing $prefix:\nnew: $CT_plus_GA_infile\nnew: $GA_plus_CT_infile\n\n";
-  }
-
-  $CT_plus_GA_infile =~ s/$/.CT_plus_GA.fastq.gz/;
-  $GA_plus_CT_infile =~ s/$/.GA_plus_CT.fastq.gz/;
-  # warn "Prefixing $prefix:\nnew: $CT_plus_GA_infile\nnew: $GA_plus_CT_infile\n\n";
-
-  warn "Writing a C -> T converted version of $file_1 and a G -> A converted version of $file_2 to $temp_dir$CT_plus_GA_infile\n";
-  open (CTPLUSGA,"| gzip -c - > ${temp_dir}${CT_plus_GA_infile}") or die "Can't write to file: $!\n";
-  # open (CTPLUSGA,'>',"$temp_dir$CT_plus_GA_infile") or die "Couldn't write to file $!\n";
-
-  unless ($directional){
-    print "Writing a G -> A converted version of $file_1 and a C -> T converted version of $file_2 to $temp_dir$GA_plus_CT_infile\n";
-    open (GAPLUSCT,"| gzip -c - > ${temp_dir}${GA_plus_CT_infile}") or die "Can't write to file: $!\n";
-  }
-
-  ### for Bowtie 1 we need to write a single gzipped file with 1 line per pair of sequences in the the following format:
-  ### <seq-ID>     <sequence #1 mate>     <quality #1 mate>     <sequence #2 mate>     <quality #2 mate>
-
-  my $count = 0;
-  while (1){
-    my $identifier_1 = <IN_1>;
-    my $sequence_1 = <IN_1>;
-    my $identifier2_1 = <IN_1>;
-    my $quality_score_1 = <IN_1>;
-
-    my $identifier_2 = <IN_2>;
-    my $sequence_2 = <IN_2>;
-    my $identifier2_2 = <IN_2>;
-    my $quality_score_2 = <IN_2>;
-
-    last unless ($identifier_1 and $sequence_1 and $identifier2_1 and $quality_score_1 and $identifier_2 and $sequence_2 and $identifier2_2 and $quality_score_2);
-
-    ++$count;
-
-    ## small check if the sequence file appears to be a FastQ file
-    if ($count == 1){
-      if ($identifier_1 !~ /^\@/ or $identifier2_1 !~ /^\+/){
-	die "Input file 1 doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-      if ($identifier_2 !~ /^\@/ or $identifier2_2 !~ /^\+/){
-	die "Input file 2 doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-    }
-
-    $identifier_1 = fix_IDs($identifier_1); # this is to avoid problems with truncated read ID when they contain white spaces
-    chomp $identifier_1;
-    chomp $sequence_1;
-    chomp $sequence_2;
-    chomp $quality_score_1;
-    chomp $quality_score_2;
-
-    $identifier_1 =~ s/^\@//;
-    $identifier_1 =~ s/$/\/1/; #adding an extra /1 to the end which is being removed by Bowtie otherwise (which leads to no sequences alignments whatsoever)
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence_1 = uc$sequence_1; # make input file 1 case insensitive
-    $sequence_2 = uc$sequence_2; # make input file 2 case insensitive
-
-    # print "$identifier_1\t$sequence_1\t$quality_score_1\t$sequence_2\t$quality_score_2\n";
-    my $sequence_1_C_to_T = $sequence_1;
-    my $sequence_2_G_to_A = $sequence_2;
-    $sequence_1_C_to_T =~ tr/C/T/;
-    $sequence_2_G_to_A =~ tr/G/A/;
-
-    print CTPLUSGA "$identifier_1\t$sequence_1_C_to_T\t$quality_score_1\t$sequence_2_G_to_A\t$quality_score_2\n";
-
-    unless ($directional){
-      my $sequence_1_G_to_A = $sequence_1;
-      my $sequence_2_C_to_T = $sequence_2;
-      $sequence_1_G_to_A =~ tr/G/A/;
-      $sequence_2_C_to_T =~ tr/C/T/;
-      print GAPLUSCT "$identifier_1\t$sequence_1_G_to_A\t$quality_score_1\t$sequence_2_C_to_T\t$quality_score_2\n";
-    }
-  }
-
-  close CTPLUSGA or die "Couldn't close filehandle\n";
-  warn "\nCreated C -> T converted version of FastQ file '$file_1' and G -> A converted version of FastQ file '$file_2' ($count sequences in total)\n";
-
-  if ($directional){
-    warn "\n";
-    return ($CT_plus_GA_infile);
-  }
-  else{
-    close GAPLUSCT or die "Couldn't close filehandle\n";
-    warn "Created G -> A converted version of FastQ file '$file_1' and C -> T converted version of FastQ file '$file_2' ($count sequences in total)\n\n";
-    return ($CT_plus_GA_infile,$GA_plus_CT_infile);
-  }
-}
-
-
-sub fix_IDs{
-  my $id = shift;
-  $id =~ s/[ \t]+/_/g; # replace spaces or tabs with underscores
-  return $id;
-}
-
-sub ensure_sensical_alignment_orientation_single_end{
-  my $index = shift; # index number if the sequence produced an alignment
-  my $strand = shift;
-  ###  setting $orientation to 1 if it is in the correct orientation, and leave it 0 if it is the nonsensical wrong one
-  my $orientation = 0;
-  ##############################################################################################################
-  ## FORWARD converted read against FORWARD converted genome (read: C->T.....C->T..      genome:C->T.......C->T)
-  ## here we only want reads in the forward (+) orientation
-  if ($fhs[$index]->{name} eq 'CTreadCTgenome') {
-    ### if the alignment is (+) we count it, and return 1 for a correct orientation
-    if ($strand eq '+') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (-) the alignment is nonsensical
-    elsif ($strand eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  }
-  ###############################################################################################################
-  ## FORWARD converted read against reverse converted genome (read: C->T.....C->T..      genome: G->A.......G->A)
-  ## here we only want reads in the forward (-) orientation
-  elsif ($fhs[$index]->{name} eq 'CTreadGAgenome') {
-    ### if the alignment is (-) we count it and return 1 for a correct orientation
-    if ($strand eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (+) the alignment is nonsensical
-    elsif ($strand eq '+') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  }
-  ###############################################################################################################
-  ## Reverse converted read against FORWARD converted genome (read: G->A.....G->A..      genome: C->T.......C->T)
-  ## here we only want reads in the forward (-) orientation
-  elsif ($fhs[$index]->{name} eq 'GAreadCTgenome') {
-    ### if the alignment is (-) we count it and return 1 for a correct orientation
-    if ($strand eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (+) the alignment is nonsensical
-    elsif ($strand eq '+') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  }
-  ###############################################################################################################
-  ## Reverse converted read against reverse converted genome (read: G->A.....G->A..      genome: G->A.......G->A)
-  ## here we only want reads in the forward (+) orientation
-  elsif ($fhs[$index]->{name} eq 'GAreadGAgenome') {
-    ### if the alignment is (+) we count it and return 1 for a correct orientation
-    if ($strand eq '+') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (-) the alignment is nonsensical
-    elsif ($strand eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  } else{
-    die "One of the above conditions must be true\n";
-  }
-}
-
-sub ensure_sensical_alignment_orientation_paired_ends{
-  my ($index,$id_1,$strand_1,$id_2,$strand_2) = @_; # index number if the sequence produced an alignment
-  ###  setting $orientation to 1 if it is in the correct orientation, and leave it 0 if it is the nonsensical wrong one
-  my $orientation = 0;
-  ##############################################################################################################
-  ## [Index 0, sequence originated from (converted) forward strand]
-  ## CT converted read 1
-  ## GA converted read 2
-  ## CT converted genome
-  ## here we only want read 1 in (+) orientation and read 2 in (-) orientation
-  if ($fhs[$index]->{name} eq 'CTread1GAread2CTgenome') {
-    ### if the paired-end alignment is read1 (+) and read2 (-) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  ###############################################################################################################
-  ## [Index 1, sequence originated from (converted) reverse strand]
-  ## GA converted read 1
-  ## CT converted read 2
-  ## GA converted genome
-  ## here we only want read 1 in (+) orientation and read 2 in (-) orientation
-  elsif ($fhs[$index]->{name} eq 'GAread1CTread2GAgenome') {
-    ### if the paired-end alignment is read1 (+) and read2 (-) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  ###############################################################################################################
-  ## [Index 2, sequence originated from complementary to (converted) forward strand]
-  ## GA converted read 1
-  ## CT converted read 2
-  ## CT converted genome
-  ## here we only want read 1 in (-) orientation and read 2 in (+) orientation
-  elsif ($fhs[$index]->{name} eq 'GAread1CTread2CTgenome') {
-    ### if the paired-end alignment is read1 (-) and read2 (+) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  ###############################################################################################################
-  ## [Index 3, sequence originated from complementary to (converted) reverse strand]
-  ## CT converted read 1
-  ## GA converted read 2
-  ## GA converted genome
-  ## here we only want read 1 in (+) orientation and read 2 in (-) orientation
-  elsif ($fhs[$index]->{name} eq 'CTread1GAread2GAgenome') {
-    ### if the paired-end alignment is read1 (-) and read2 (+) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  else{
-    die "One of the above conditions must be true\n";
-  }
-}
-
-#####################################################################################################################################################
-
-### Bowtie 1 (default) | PAIRED-END | FASTA
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastA {
-
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-
-  if ($directional){
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_1 and $C_to_T_infile_2 and $G_to_A_infile_2 (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional){
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next;
-      }
-    }
-
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    warn "Now starting a Bowtie paired-end alignment for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile_1} and $temp_dir$fh->{inputfile_2}, with the options: $bt_options)\n";
-    open ($fh->{fh},"$path_to_bowtie $bt_options $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-
-    my $line_1 = $fh->{fh}->getline();
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	die "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains either read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains either read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | PAIRED-END | FASTA
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 {
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-  if ($directional){
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_1 and $C_to_T_infile_2 and $G_to_A_infile_2 (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional){
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next;
-      }
-    }
-
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-
-    warn "Now starting a Bowtie 2 paired-end alignment for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile_1} and $temp_dir$fh->{inputfile_2}, with the options: $bt2_options))\n";
-    open ($fh->{fh},"$path_to_bowtie $bt2_options -x $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else{
-	last; # no alignment output
-      }
-    }
-
-    my $line_1 = $_;
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 /1 tag if present (remember that Bowtie2 clips off /1 or /2 line endings itself, so we added /1/1 or /2/2 to start with
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 /2 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	warn "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains either read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains either read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-### Bowtie 1 (default) | PAIRED-END | FASTQ
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastQ {
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-
-  if ($directional){
-    warn "Input file is $C_to_T_infile_1 and $G_to_A_infile_2 (FastQ)\n";
-  }
-  elsif($pbat){
-    warn "Input file is $G_to_A_infile_1 and $C_to_T_infile_2 (FastQ; PBAT-Seq)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 and $G_to_A_infile_1 and $C_to_T_infile_2 (non-directional; FastQ)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the data structure above
-  if ($directional or $pbat){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional or $pbat){
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next; # skipping unwanted filehandles
-      }
-    }
-
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    if ($gzip){
-      warn "Now starting a Bowtie paired-end alignment for $fh->{name} (reading in sequences from ${temp_dir}$fh->{inputfile_1}, with the options: $bt_options)\n";
-      open ($fh->{fh},"zcat ${temp_dir}$fh->{inputfile_1} | $path_to_bowtie $bt_options $fh->{bisulfiteIndex} --12 - |") or die "Can't open pipe to bowtie: $!";
-    }
-    else{
-      warn "Now starting a Bowtie paired-end alignment for $fh->{name} (reading in sequences from ${temp_dir}$fh->{inputfile_1} and ${temp_dir}$fh->{inputfile_2}, with the options: $bt_options))\n";
-      sleep(5);
-      open ($fh->{fh},"$path_to_bowtie $bt_options $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-    }
-
-    my $line_1 = $fh->{fh}->getline();
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	die "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | PAIRED-END | FASTQ
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 {
-
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-  if ($directional){
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 (FastQ)\n";
-  }
-  elsif ($pbat){
-    warn "Input files are $G_to_A_infile_1 and $C_to_T_infile_2 (FastQ)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_1 and $C_to_T_infile_2 and $G_to_A_infile_2 (FastQ)\n";
-  }
-
-  ## Now starting up 4 instances of Bowtie 2 feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the
-  ## data structure above
-  if ($directional or $pbat){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional or $pbat){ # skipping unwanted filehandles
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next;
-      }
-    }
-
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-
-    warn "Now starting a Bowtie 2 paired-end alignment for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile_1} and $temp_dir$fh->{inputfile_2}, with the options: $bt2_options))\n";
-    open ($fh->{fh},"$path_to_bowtie $bt2_options -x $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else{
-	last; # no alignment output
-      }
-    }
-
-    my $line_1 = $_;
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 tag if present (remember that Bowtie2 clips off /1 or /2 line endings itself, so we added /1/1 or /2/2 to start with
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	die "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-#####################################################################################################################################################
-
-### Bowtie 1 (default) | SINGLE-END | FASTA
-sub single_end_align_fragments_to_bisulfite_genome_fastA {
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    warn "Now starting the Bowtie aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options: $bt_options)\n";
-    if ($gzip){
-      open ($fh->{fh},"zcat $temp_dir$fh->{inputfile} | $path_to_bowtie $bt_options $fh->{bisulfiteIndex} - |") or die "Can't open pipe to bowtie: $!";
-    }
-    else{
-      open ($fh->{fh},"$path_to_bowtie $bt_options $fh->{bisulfiteIndex} $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie: $!"; # command for uncompressed data
-    }
-
-    # if Bowtie produces an alignment we store the first line of the output
-    $_ = $fh->{fh}->getline();
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the bowtie output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | SINGLE-END | FASTA
-sub single_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 {
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-
-    warn "Now starting the Bowtie 2 aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options: $bt2_options)\n";
-    open ($fh->{fh},"$path_to_bowtie $bt2_options -x $fh->{bisulfiteIndex} -U $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie 2: $!";
-
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else{
-	last; # no alignment output
-      }
-    }
-
-    # Bowtie 2 outputs a result line even for sequences without any alignments. We thus store the first line of the output
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the Bowtie output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefinded. This should only happen at the end of a file for Bowtie 2 output
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-
-### Bowtie 1 (default) | SINGLE-END | FASTQ
-sub single_end_align_fragments_to_bisulfite_genome_fastQ {
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastQ)\n";
-  }
-  elsif($pbat){
-    warn "Input file is $G_to_A_infile (FastQ)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastQ)\n";
-  }
-
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## the data structure above
-  if ($directional or $pbat){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    warn "Now starting the Bowtie aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options: $bt_options)\n";
-    sleep (5);
-
-    if ($gzip){
-      open ($fh->{fh},"zcat $temp_dir$fh->{inputfile} | $path_to_bowtie $bowtie_options $fh->{bisulfiteIndex} - |") or die "Can't open pipe to bowtie: $!";
-    }
-    else{
-      open ($fh->{fh},"$path_to_bowtie $bowtie_options $fh->{bisulfiteIndex} $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie: $!"; # command for uncompressed data
-    }
-
-    # if Bowtie produces an alignment we store the first line of the output
-    $_ = $fh->{fh}->getline();
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the Bowtie output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | SINGLE-END | FASTQ
-sub single_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 {
-
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastQ)\n\n";
-  }
-  elsif ($pbat){
-    warn "Input file is $G_to_A_infile (FastQ)\n\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastQ)\n\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie 2 feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## the data structure above
-  if ($directional or $pbat){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-    warn "Now starting the Bowtie 2 aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options $bt2_options)\n";
-    warn "Using Bowtie 2 index: $fh->{bisulfiteIndex}\n\n";
-
-    open ($fh->{fh},"$path_to_bowtie $bt2_options -x $fh->{bisulfiteIndex} -U $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie: $!";
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      # warn "$_\n";
-      # sleep(1);
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else {
-	last;
-      }
-    }
-
-    # Bowtie 2 outputs a result line even for sequences without any alignments. We thus store the first line of the output
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the Bowtie 2 output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-      # warn "storing $id and\n$_\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefined. This should only happen at the end of a file for Bowtie 2 output
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-###########################################################################################################################################
-
-sub reset_counters_and_fhs{
-  my $filename = shift;
-  %counting=(
-	     total_meCHH_count => 0,
-	     total_meCHG_count => 0,
-	     total_meCpG_count => 0,
-	     total_meC_unknown_count => 0,
-	     total_unmethylated_CHH_count => 0,
-	     total_unmethylated_CHG_count => 0,
-	     total_unmethylated_CpG_count => 0,
-	     total_unmethylated_C_unknown_count => 0,
-	     sequences_count => 0,
-	     no_single_alignment_found => 0,
-	     unsuitable_sequence_count => 0,
-	     genomic_sequence_could_not_be_extracted_count => 0,
-	     unique_best_alignment_count => 0,
-	     low_complexity_alignments_overruled_count => 0,
-	     CT_CT_count => 0, #(CT read/CT genome, original top strand)
-	     CT_GA_count => 0, #(CT read/GA genome, original bottom strand)
-	     GA_CT_count => 0, #(GA read/CT genome, complementary to original top strand)
-	     GA_GA_count => 0, #(GA read/GA genome, complementary to original bottom strand)
-	     CT_GA_CT_count => 0, #(CT read1/GA read2/CT genome, original top strand)
-	     GA_CT_GA_count => 0, #(GA read1/CT read2/GA genome, complementary to original bottom strand)
-	     GA_CT_CT_count => 0, #(GA read1/CT read2/CT genome, complementary to original top strand)
-	     CT_GA_GA_count => 0, #(CT read1/GA read2/GA genome, original bottom strand)
-	     alignments_rejected_count => 0, # only relevant if --directional was specified
-	    );
-
-  if ($directional){
-    if ($filename =~ ','){ # paired-end files
-      @fhs=(
-	    { name => 'CTreadCTgenome',
-	      strand_identity => 'con ori forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'CTreadGAgenome',
-	      strand_identity => 'con ori reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadCTgenome',
-	      strand_identity => 'compl ori con forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadGAgenome',
-	    strand_identity => 'compl ori con reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-    else{ # single-end files
-      @fhs=(
-	    { name => 'CTreadCTgenome',
-	      strand_identity => 'con ori forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'CTreadGAgenome',
-	      strand_identity => 'con ori reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-  }
-  elsif($pbat){
-    if ($filename =~ ','){ # paired-end files
-      @fhs=(
-	    { name => 'CTreadCTgenome',
-	      strand_identity => 'con ori forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'CTreadGAgenome',
-	      strand_identity => 'con ori reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadCTgenome',
-	      strand_identity => 'compl ori con forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadGAgenome',
-	    strand_identity => 'compl ori con reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-    else{ # single-end files
-      @fhs=(
-	    { name => 'GAreadCTgenome',
-	      strand_identity => 'compl ori con forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadGAgenome',
-	      strand_identity => 'compl ori con reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-  }
-  else{
-    @fhs=(
-	  { name => 'CTreadCTgenome',
-	    strand_identity => 'con ori forward',
-	    bisulfiteIndex => $CT_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	  { name => 'CTreadGAgenome',
-	    strand_identity => 'con ori reverse',
-	    bisulfiteIndex => $GA_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	  { name => 'GAreadCTgenome',
-	    strand_identity => 'compl ori con forward',
-	    bisulfiteIndex => $CT_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	  { name => 'GAreadGAgenome',
-	    strand_identity => 'compl ori con reverse',
-	    bisulfiteIndex => $GA_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	 );
-  }
-}
-
-
-sub process_command_line{
-  my @bowtie_options;
-  my $help;
-  my $mates1;
-  my $mates2;
-  my $path_to_bowtie;
-  my $fastq;
-  my $fasta;
-  my $skip;
-  my $qupto;
-  my $phred64;
-  my $phred33;
-  my $solexa;
-  my $mismatches;
-  my $seed_length;
-  my $best;
-  my $sequence_format;
-  my $version;
-  my $quiet;
-  my $chunk;
-  my $non_directional;
-  my $ceiling;
-  my $maxins;
-  my $minins;
-  my $unmapped;
-  my $multi_map;
-  my $output_dir;
-  my $bowtie2;
-  my $vanilla;
-  my $sam_no_hd;
-  my $seed_extension_fails;
-  my $reseed_repetitive_seeds;
-  my $most_valid_alignments;
-  my $score_min;
-  my $parallel;
-  my $temp_dir;
-  my $rdg;
-  my $rfg;
-  my $non_bs_mm;
-  my $samtools_path;
-  my $bam;
-  my $gzip;
-  my $pbat;
-  my $prefix;
-  my $old_flag;
-  my $basename;
-  my $sam;
-  my $multicore;
-
-  my $command_line = GetOptions ('help|man'                => \$help,
-				 '1=s'                     => \$mates1,
-				 '2=s'                     => \$mates2,
-				 'path_to_bowtie=s'        => \$path_to_bowtie,
-				 'f|fasta'                 => \$fasta,
-				 'q|fastq'                 => \$fastq,
-				 's|skip=i'                => \$skip,
-				 'u|upto=i'                => \$qupto,
-				 'phred33-quals'           => \$phred33,
-				 'phred64-quals|solexa1'   => \$phred64,
-				 'solexa-quals'            => \$solexa,
-				 'n|seedmms=i'             => \$mismatches,
-				 'l|seedlen=i'             => \$seed_length,
-				 'no_best'                 => \$best,
-				 'version'                 => \$version,
-				 'quiet'                   => \$quiet,
-				 'chunkmbs=i'              => \$chunk,
-				 'non_directional'         => \$non_directional,
-				 'I|minins=i'              => \$minins,
-				 'X|maxins=i'              => \$maxins,
-				 'e|maqerr=i'              => \$ceiling,
-				 'un|unmapped'             => \$unmapped,
-				 'ambiguous'               => \$multi_map,
-				 'o|output_dir=s'          => \$output_dir,
-				 'bowtie2'                 => \$bowtie2,
-				 'vanilla'                 => \$vanilla,
-				 'sam-no-hd'               => \$sam_no_hd,
-				 'D=i'                     => \$seed_extension_fails,
-				 'R=i'                     => \$reseed_repetitive_seeds,
-				 'score_min=s'             => \$score_min,
-				 'most_valid_alignments=i' => \$most_valid_alignments,
-				 'p=i'                     => \$parallel,
-				 'temp_dir=s'              => \$temp_dir,
-				 'rdg=s'                   => \$rdg,
-				 'rfg=s'                   => \$rfg,
-				 'non_bs_mm'               => \$non_bs_mm,
-				 'samtools_path=s'         => \$samtools_path,
-				 'bam'                     => \$bam,
-				 'gzip'                    => \$gzip,
-				 'pbat'                    => \$pbat,
-				 'prefix=s'                => \$prefix,
-				 'old_flag'                => \$old_flag,
-				 'B|basename=s'            => \$basename,
-				 'sam'                     => \$sam,
-				 'multicore=i'             => \$multicore,
-				);
-
-
-  ### EXIT ON ERROR if there were errors with any of the supplied options
-  unless ($command_line){
-    die "Please respecify command line options\n";
-  }
-  ### HELPFILE
-  if ($help){
-    print_helpfile();
-    exit;
-  }
-  if ($version){
-    print << "VERSION";
-
-
-          Bismark - Bisulfite Mapper and Methylation Caller.
-
-                       Bismark Version: $bismark_version 
-        Copyright 2010-15 Felix Krueger, Babraham Bioinformatics
-              www.bioinformatics.babraham.ac.uk/projects/
-
-
-VERSION
-    exit;
-  }
-
-
-  ##########################
-  ### PROCESSING OPTIONS ###
-  ##########################
-
-  unless ($bowtie2){
-    $bowtie2 = 0;
-  }
-  unless ($sam_no_hd){
-    $sam_no_hd =0;
-  }
-
-  ### PATH TO BOWTIE
-  ### if a special path to Bowtie 1/2 was specified we will use that one, otherwise it is assumed that Bowtie 1/2 is in the PATH
-  if ($path_to_bowtie){
-    unless ($path_to_bowtie =~ /\/$/){
-      $path_to_bowtie =~ s/$/\//;
-    }
-    if (-d $path_to_bowtie){
-      if ($bowtie2){
-	$path_to_bowtie = "${path_to_bowtie}bowtie2";
-      }
-      else{
-	$path_to_bowtie = "${path_to_bowtie}bowtie";
-      }
-    }
-    else{
-      die "The path to bowtie provided ($path_to_bowtie) is invalid (not a directory)!\n";
-    }
-  }
-  else{
-    if ($bowtie2){
-      $path_to_bowtie = 'bowtie2';
-      warn "Path to Bowtie 2 specified as: $path_to_bowtie\n";  }
-    else{
-      $path_to_bowtie = 'bowtie';
-      warn "Path to Bowtie specified as: $path_to_bowtie\n";
-    }
-  }
-
-
-  if ($sam){
-    warn "Output format manually set as SAM\n";
-  }
-  else{
-    $bam = 1;
-    warn "Output format is BAM (default)\n";
-  }
-
-  ### OUTPUT REQUESTED AS BAM FILE (default)
-  if ($bam){
-    if ($vanilla){
-      die "Specifying BAM output is not compatible with \"--vanilla\" format. Please respecify\n\n";
-    }
-
-    ### PATH TO SAMTOOLS
-    if (defined $samtools_path){
-      # if Samtools was specified as full command
-      if ($samtools_path =~ /samtools$/){
-	if (-e $samtools_path){
-	  # Samtools executable found
-	}
-	else{
-	  die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-	}
-      }
-      else{
-	unless ($samtools_path =~ /\/$/){
-	  $samtools_path =~ s/$/\//;
-	}
-	$samtools_path .= 'samtools';
-   	if (-e $samtools_path){
-	  # Samtools executable found
-	}
-	else{
-	  die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-	}
-      }
-
-      warn "Alignments will be written out in BAM format. Samtools path provided as: '$samtools_path'\n";
-      $bam = 1;
-    }
-    # Check whether Samtools is in the PATH if no path was supplied by the user
-    else{
-      if (!system "which samtools >/dev/null 2>&1"){ # STDOUT is binned, STDERR is redirected to STDOUT. Returns 0 if samtools is in the PATH
-	$samtools_path = `which samtools`;
-	chomp $samtools_path;
-	warn "Alignments will be written out in BAM format. Samtools found here: '$samtools_path'\n";
-	$bam = 1;
-      }
-    }
-
-    unless (defined $samtools_path){
-      $bam = 2;
-      warn "Did not find Samtools on the system. Alignments will be compressed with GZIP instead (.sam.gz)\n";
-    }
-    sleep (1);
-  }
-
-
-  ####################################
-  ### PROCESSING ARGUMENTS
-
-  ### GENOME FOLDER
-  my $genome_folder = shift @ARGV; # mandatory
-  unless ($genome_folder){
-    warn "Genome folder was not specified!\n";
-    print_helpfile();
-    exit;
-  }
-
-  ### checking that the genome folder, all subfolders and the required bowtie index files exist
-  unless ($genome_folder =~/\/$/){
-    $genome_folder =~ s/$/\//;
-  }
-
-  if (chdir $genome_folder){
-    my $absolute_genome_folder = getcwd; ## making the genome folder path absolute
-    unless ($absolute_genome_folder =~/\/$/){
-      $absolute_genome_folder =~ s/$/\//;
-    }
-    warn "Reference genome folder provided is $genome_folder\t(absolute path is '$absolute_genome_folder)'\n";
-    $genome_folder = $absolute_genome_folder;
-  }
-  else{
-    die "Failed to move to $genome_folder: $!\nUSAGE: bismark [options] <genome_folder> {-1 <mates1> -2 <mates2> | <singles>} [<hits>]    (--help for more details)\n";
-  }
-
-  my $CT_dir = "${genome_folder}Bisulfite_Genome/CT_conversion/";
-  my $GA_dir = "${genome_folder}Bisulfite_Genome/GA_conversion/";
-
-  my $bt2_small_index_present = 1;
-  my $bt2_large_index_present = 1;
-
-  if ($bowtie2){ ### Bowtie 2
-
-    ### Checking for small indixes first (ending in .bt2)
-
-    # checking the integrity of $CT_dir
-    chdir $CT_dir or die "Failed to move to directory $CT_dir: $!\n";
-
-    my @CT_bowtie_index = ('BS_CT.1.bt2','BS_CT.2.bt2','BS_CT.3.bt2','BS_CT.4.bt2','BS_CT.rev.1.bt2','BS_CT.rev.2.bt2');
-    foreach my $file(@CT_bowtie_index){
-      unless (-f $file){
-	warn "The Bowtie 2 index of the C->T converted genome seems to be faulty or non-existant ('$file'). Please run the bismark_genome_preparation before running Bismark\n";
-	$bt2_small_index_present = 0;
-      }
-    }
-    # checking the integrity of $GA_dir
-    chdir $GA_dir or die "Failed to move to directory $GA_dir: $!\n";
-    my @GA_bowtie_index = ('BS_GA.1.bt2','BS_GA.2.bt2','BS_GA.3.bt2','BS_GA.4.bt2','BS_GA.rev.1.bt2','BS_GA.rev.2.bt2');
-
-    foreach my $file(@GA_bowtie_index){
-      unless (-f $file){
-	warn "The Bowtie 2 index of the G->A converted genome seems to be faulty or non-existant ('$file'). Please run bismark_genome_preparation before running Bismark\n";
-	$bt2_small_index_present = 0;
-      }
-    }
-
-    ### Using the small index preferentially
-    if ($bt2_small_index_present){
-      $bt2_large_index_present = 0;
-    }
-    else{  # only checking for large indexes if the 'normal' one can't be found
-      warn "\nCouldn't find a traditional small Bowtie 2 index for the genome specified (ending in .bt2). Now searching for a large index instead (64-bit index ending in .bt2l)...\n";
-
-      ### If no small small indexes were found we look for large indexes (64-bit indexes, ending in .bt2l)
-
-      # checking the integrity of $CT_dir
-      chdir $CT_dir or die "Failed to move to directory $CT_dir: $!\n";
-
-      @CT_bowtie_index = ('BS_CT.1.bt2l','BS_CT.2.bt2l','BS_CT.3.bt2l','BS_CT.4.bt2l','BS_CT.rev.1.bt2l','BS_CT.rev.2.bt2l');
-      foreach my $file(@CT_bowtie_index){
-	unless (-f $file){
-	  die "The Bowtie 2 index of the C->T converted genome seems to be faulty or non-existant ('$file'). Please run the bismark_genome_preparation before running Bismark\n";
-	  $bt2_large_index_present = 0;  }
-      }
-
-      ### checking the integrity of $GA_dir
-      chdir $GA_dir or die "Failed to move to directory $GA_dir: $!\n";
-      @GA_bowtie_index = ('BS_GA.1.bt2l','BS_GA.2.bt2l','BS_GA.3.bt2l','BS_GA.4.bt2l','BS_GA.rev.1.bt2l','BS_GA.rev.2.bt2l');
-
-      foreach my $file(@GA_bowtie_index){
-	unless (-f $file){
-	  die "The Bowtie 2 index of the G->A converted genome seems to be faulty or non-existant ('$file'). Please run bismark_genome_preparation before running Bismark\n";
-	  $bt2_large_index_present = 0;
-	}
-      }
-
-      if ($bt2_large_index_present){
-	warn "64-bit large genome Bowtie 2 index found...\n";
-      }
-      else{
-	die "Failed to detect either a standard (.bt2) or 64-bit (.bt2l) Bowtie 2 index for the genome specified. Please run the bismark_genome_preparation before launching Bismark\n\n";
-      }
-    }
-
-  }
-
-  else{ ### Bowtie 1 (default)
-    ### checking the integrity of $CT_dir
-    chdir $CT_dir or die "Failed to move to directory $CT_dir: $!\n";
-    my @CT_bowtie_index = ('BS_CT.1.ebwt','BS_CT.2.ebwt','BS_CT.3.ebwt','BS_CT.4.ebwt','BS_CT.rev.1.ebwt','BS_CT.rev.2.ebwt');
-    foreach my $file(@CT_bowtie_index){
-      unless (-f $file){
-	die "The Bowtie index of the C->T converted genome seems to be faulty ($file doesn't exist). Please run bismark_genome_preparation before running Bismark.\n";
-      }
-    }
-    ### checking the integrity of $GA_dir
-    chdir $GA_dir or die "Failed to move to directory $GA_dir: $!\n";
-    my @GA_bowtie_index = ('BS_GA.1.ebwt','BS_GA.2.ebwt','BS_GA.3.ebwt','BS_GA.4.ebwt','BS_GA.rev.1.ebwt','BS_GA.rev.2.ebwt');
-    foreach my $file(@GA_bowtie_index){
-      unless (-f $file){
-	die "The Bowtie index of the G->A converted genome seems to be faulty ($file doesn't exist). Please run bismark_genome_preparation before running Bismark.\n";
-      }
-    }
-  }
-
-  my $CT_index_basename = "${CT_dir}BS_CT";
-  my $GA_index_basename = "${GA_dir}BS_GA";
-
-  ### INPUT OPTIONS
-
-  ### SEQUENCE FILE FORMAT
-  ### exits if both fastA and FastQ were specified
-  if ($fasta and $fastq){
-    die "Only one sequence filetype can be specified (fastA or fastQ)\n";
-  }
-
-  ### unless fastA is specified explicitely, fastQ sequence format is expected by default
-  if ($fasta){
-    print "FastA format specified\n";
-    $sequence_format = 'FASTA';
-    push @bowtie_options, '-f';
-  }
-  elsif ($fastq){
-    print "FastQ format specified\n";
-    $sequence_format = 'FASTQ';
-    push @bowtie_options, '-q';
-  }
-  else{
-    $fastq = 1;
-    print "FastQ format assumed (by default)\n";
-    $sequence_format = 'FASTQ';
-    push @bowtie_options, '-q';
-  }
-
-  ### SKIP
-  if ($skip){
-    warn "Skipping the first $skip reads from the input file\n";
-    # push @bowtie_options,"-s $skip";
-  }
-
-  ### UPTO
-  if ($qupto){
-    warn "Processing sequences up to read no. $qupto from the input file\n";
-    if ($bowtie2){
-      #      push @bowtie_options,"--upto $qupto"; ## slightly changed for Bowtie 2
-    }
-    else{
-      #     push @bowtie_options,"--qupto $qupto";
-    }
-  }
-
-  ### QUALITY VALUES
-  if (($phred33 and $phred64) or ($phred33 and $solexa) or ($phred64 and $solexa)){
-    die "You can only specify one type of quality value at a time! (--phred33-quals or --phred64-quals or --solexa-quals)";
-  }
-  if ($phred33){ ## if nothing else is specified $phred33 will be used as default by both Bowtie 1 and 2.
-    # Phred quality values work only when -q is specified
-    unless ($fastq){
-      die "Phred quality values works only when -q (FASTQ) is specified\n";
-    }
-    if ($bowtie2){
-      push @bowtie_options,"--phred33";
-    }
-    else{
-      push @bowtie_options,"--phred33-quals";
-    }
-  }
-  if ($phred64){
-    # Phred quality values work only when -q is specified
-    unless ($fastq){
-      die "Phred quality values work only when -q (FASTQ) is specified\n";
-    }
-    if ($bowtie2){
-      push @bowtie_options,"--phred64";
-    }
-    else{
-      push @bowtie_options,"--phred64-quals";
-    }
-  }
-  else{
-    $phred64 = 0;
-  }
-
-  if ($solexa){
-    if ($bowtie2){
-      die "The option '--solexa-quals' is not compatible with Bowtie 2. Please respecify!\n";
-    }
-    # Solexa to Phred value conversion works only when -q is specified
-    unless ($fastq){
-      die "Conversion from Solexa to Phred quality values works only when -q (FASTQ) is specified\n";
-    }
-    push @bowtie_options,"--solexa-quals";
-  }
-  else{
-    $solexa = 0;
-  }
-
-  ### ALIGNMENT OPTIONS
-
-  ### MISMATCHES
-  if (defined $mismatches){
-    if ($bowtie2){
-      if ($mismatches == 0 or $mismatches == 1){
-	push @bowtie_options,"-N $mismatches";
-      }
-      else{
-	die "Please set the number of multiseed mismatches for Bowtie 2 with '-N <int>' (where <int> can be 0 or 1)\n";
-      }
-    }
-    else{
-      if ($mismatches >= 0 and $mismatches <= 3){
-	push @bowtie_options,"-n $mismatches";
-      }
-      else{
-	die "Please set the number of seed mismatches for Bowtie 1 with '-n <int>' (where <int> can be 0,1,2 or 3)\n";
-      }
-    }
-  }
-  else{
-    unless ($bowtie2){
-      push @bowtie_options,"-n 1"; # setting -n to 1 by default (for use with Bowtie only) because it is much quicker than the default mode of -n 2
-    }
-  }
-
-  ### SEED LENGTH
-  if (defined $seed_length){
-    if ($bowtie2){
-      push @bowtie_options,"-L $seed_length";
-    }
-    else{
-      push @bowtie_options,"-l $seed_length";
-    }
-  }
-
-  ### MISMATCH CEILING
-  if (defined $ceiling){
-    die "The option '-e' is not compatible with Bowtie 2. Please respecify options\n" if ($bowtie2);
-    push @bowtie_options,"-e $ceiling";
-  }
-
-
-  ### BOWTIE 2 EFFORT OPTIONS
-
-  ### CONSECUTIVE SEED EXTENSION FAILS
-  if (defined $seed_extension_fails){
-    die "The option '-D <int>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    push @bowtie_options,"-D $seed_extension_fails";
-  }
-
-  ### RE-SEEDING REPETITIVE SEEDS
-  if (defined $reseed_repetitive_seeds){
-    die "The option '-R <int>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    push @bowtie_options,"-R $reseed_repetitive_seeds";
-  }
-
-
-  ### BOWTIE 2 SCORING OPTIONS
-
-  my ($score_min_intercept, $score_min_slope);
-
-  if ($score_min){
-    die "The option '--score_min <func>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-
-    unless ($score_min =~ /^L,(.+),(.+)$/){
-      die "The option '--score_min <func>' needs to be in the format <L,value,value> . Please consult \"setting up functions\" in the Bowtie 2 manual for further information\n\n";
-    }
-    ($score_min_intercept, $score_min_slope) = ($1, $2);
-    push @bowtie_options,"--score-min L,$score_min_intercept,$score_min_slope"; # default setting, more stringent than normal Bowtie2
-  }
-  else{
-    if ($bowtie2){
-      ($score_min_intercept, $score_min_slope) = (0, -0.2);
-      push @bowtie_options,"--score-min L,$score_min_intercept,$score_min_slope"; # default setting, more stringent than normal Bowtie2
-    }
-  }
-
-  ### BOWTIE 2 READ GAP OPTIONS
-  my ($insertion_open,$insertion_extend,$deletion_open,$deletion_extend);
-
-  if ($rdg){
-    die "The option '--rdg <int1>,<int2>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    if ($rdg =~ /^(\d+),(\d+)$/){
-      $deletion_open = $1;
-      $deletion_extend = $2;
-    }
-    else{
-      die "The option '--rdg <int1>,<int2>' needs to be in the format <integer,integer> . Please consult \"setting up functions\" in the Bowtie 2 manual for further information\n\n";
-    }
-    push @bowtie_options,"--rdg $rdg";
-  }
-  else{
-    $deletion_open = 5;
-    $deletion_extend = 3;
-  }
-
-  ### BOWTIE 2 REFERENCE GAP OPTIONS
-  if ($rfg){
-    die "The option '--rfg <int1>,<int2>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    if ($rfg =~ /^(\d+),(\d+)$/){
-      $insertion_open = $1;
-      $insertion_extend = $2;
-    }
-    else{
-      die "The option '--rfg <int1>,<int2>' needs to be in the format <integer,integer> . Please consult \"setting up functions\" in the Bowtie 2 manual for further information\n\n";
-    }
-    push @bowtie_options,"--rfg $rfg";
-  }
-  else{
-    $insertion_open = 5;
-    $insertion_extend = 3;
-  }
-
-
-  ### BOWTIE 2 PARALLELIZATION OPTIONS
-  if (defined $parallel){
-    die "The parallelization switch '-p' only works for Bowtie 2. Please respecify!" unless ($bowtie2);
-  }
-  if ($bowtie2){
-    if ($parallel){
-      die "Please select a value for -p of 2 or more!\n" unless ($parallel > 1);
-      if ($parallel > 4){
-	warn "Attention: using more than 4 cores per alignment thread has been reported to have diminishing returns. If possible try to limit -p to a value of 4\n"; sleep(2);
-      }
-      push @bowtie_options,"-p $parallel";
-      push @bowtie_options,'--reorder'; ## re-orders the bowtie 2 output so that it does match the input files. This is abolutely required for parallelization to work.
-      print "Each Bowtie 2 instance is going to be run with $parallel threads. Please monitor performance closely and tune down if needed!\n";
-      sleep (2);
-    }
-  }
-
-  ### REPORTING OPTIONS
-
-  if ($bowtie2){
-    push @bowtie_options,'--ignore-quals'; ## All mismatches will receive penalty for mismatches as if they were of high quality, which is 6 by default
-
-    ### Option -M is deprecated since Bowtie 2 version 2.0.0 beta7. I'll leave this option commented out for a while
-    if(defined $most_valid_alignments){
-
-      warn "\nThe option -M is now deprecated (as of Bowtie 2 version 2.0.0 beta7). What used to be called -M mode is still the default mode. Use the -D and -R options to adjust the effort expended to find valid alignments.\n\n";
-    }
-  }
-  else{ # Because of the way Bismark works we will always use the reporting option -k 2 (report up to 2 valid alignments) for Bowtie 1
-    push @bowtie_options,'-k 2';
-  }
-
-  ### --BEST
-  if ($bowtie2){
-    if ($best){    # Bowtie 2 does away with the concept of --best, so one can also not select --no-best when Bowtie 2 is to be used
-      die "The option '--no-best' is not compatible with Bowtie 2. Please respecify options\n";
-    }
-  }
-  else{
-    # --best is the default option for Bowtie 1, specifying --no-best can turn it off (e.g. to speed up alignment process)
-    unless ($best){
-      push @bowtie_options,'--best';
-    }
-  }
-
-  ### VANILLA BISMARK (BOWTIE 1) OUTPUT
-  if ($vanilla){
-    if ($bowtie2){
-      die "The options --bowtie2 and the --vanilla are not compatible. Please respecify!\n\n";
-    }
-  }
-  else{
-    $vanilla = 0;
-  }
-
-  ### PAIRED-END MAPPING
-  if ($mates1){
-    my @mates1 = (split (/,/,$mates1));
-    die "Paired-end mapping requires the format: -1 <mates1> -2 <mates2>, please respecify!\n" unless ($mates2);
-    my @mates2 = (split(/,/,$mates2));
-    unless (scalar @mates1 == scalar @mates2){
-      die "Paired-end mapping requires the same amounnt of mate1 and mate2 files, please respecify! (format: -1 <mates1> -2 <mates2>)\n";
-    }
-    while (1){
-      my $mate1 = shift @mates1;
-      my $mate2 = shift @mates2;
-      last unless ($mate1 and $mate2);
-      push @filenames,"$mate1,$mate2";
-    }
-    if ($bowtie2){
-      push @bowtie_options,'--no-mixed';     ## By default Bowtie 2 is not looking for single-end alignments if it can't find concordant or discordant alignments
-      push @bowtie_options,'--no-discordant';## By default Bowtie 2 is not looking for discordant alignments if it can't find concordant ones
-    }
-
-    if ($old_flag){
-      warn "\nUsing FLAG values for paired-end SAM output used up to Bismark v0.8.2. In addition, paired-end sequences will have /1 and /2 appended to their read IDs\n\n" unless($vanilla);
-      sleep(3);
-    }
-  }
-  elsif ($mates2){
-    die "Paired-end mapping requires the format: -1 <mates1> -2 <mates2>, please respecify!\n";
-  }
-
-  ### SINGLE-END MAPPING
-  # Single-end mapping will be performed if no mate pairs for paired-end mapping have been specified
-  my $singles;
-  unless ($mates1 and $mates2){
-    $singles = join (',',@ARGV);
-    unless ($singles){
-      die "\nNo filename supplied! Please specify one or more files for single-end Bismark mapping!\n";
-    }
-    $singles =~ s/\s/,/g;
-    @filenames = (split(/,/,$singles));
-    warn "\nFiles to be analysed:\n";
-    warn "@filenames\n\n";
-    sleep (3);
-  }
-
-  ### MININUM INSERT SIZE (PAIRED-END ONLY)
-  if (defined $minins){
-    die "-I/--minins can only be used for paired-end mapping!\n\n" if ($singles);
-    push @bowtie_options,"--minins $minins";
-  }
-
-  ### MAXIMUM INSERT SIZE (PAIRED-END ONLY)
-  if (defined $maxins){
-    die "-X/--maxins can only be used for paired-end mapping!\n\n" if ($singles);
-    push @bowtie_options,"--maxins $maxins";
-  }
-  else{
-    unless ($singles){
-      push @bowtie_options,'--maxins 500';
-    }
-  }
-
-  ### QUIET prints nothing  besides alignments (suppresses warnings)
-  if ($quiet){
-    push @bowtie_options,'--quiet';
-  }
-
-  ### CHUNKMBS needed to be increased to avoid memory exhaustion warnings for Bowtie 1, particularly for --best (and paired-end) alignments
-  unless ($bowtie2){ # Bowtie 2 does not have a chunkmbs option
-    if (defined $chunk){
-      push @bowtie_options,"--chunkmbs $chunk";
-    }
-    else{
-      push @bowtie_options,'--chunkmbs 512'; ## setting the default to 512MB (up from 64 default)
-    }
-  }
-
-
-  ### SUMMARY OF ALL BOWTIE OPTIONS
-  my $bowtie_options = join (' ',@bowtie_options);
-
-
-  ### STRAND-SPECIFIC LIBRARIES
-  my $directional;
-  if ($non_directional){
-    die "A library can only be specified to be either non-directional or a PBAT-Seq library. Please respecify!\n\n" if ($pbat);
-    warn "Library was specified to be not strand-specific (non-directional), therefore alignments to all four possible bisulfite strands (OT, CTOT, OB and CTOB) will be reported\n";
-    sleep (1);
-    $directional = 0;
-  }
-  elsif($pbat){
-    die "The option --pbat is currently not compatible with --gzip. Please run alignments with uncompressed temporary files, i.e. lose the option --gzip\n" if ($gzip);
-    die "The option --pbat is currently only working with FastQ files. Please respecify (i.e. lose the option -f)!\n" if ($fasta);
-
-    warn "Library was specified as PBAT-Seq (Post-Bisulfite Adapter Tagging), only performing alignments to the complementary strands (CTOT and CTOB)\n";
-    sleep (1);
-    $directional = 0;
-  }
-  else{
-    warn "Library is assumed to be strand-specific (directional), alignments to strands complementary to the original top or bottom strands will be ignored (i.e. not performed!)\n";
-    sleep (1);
-    $directional = 1; # default behaviour
-  }
-
-  ### UNMAPPED SEQUENCE OUTPUT
-  $unmapped = 0 unless ($unmapped);
-
-  ### AMBIGUOUS ALIGNMENT SEQUENCE OUTPUT
-  $multi_map = 0 unless ($multi_map);
-
-
-  ### OUTPUT DIRECTORY
-
-  chdir $parent_dir or die "Failed to move back to current working directory\n";
-  if ($output_dir){
-    unless ($output_dir =~ /\/$/){
-      $output_dir =~ s/$/\//;
-    }
-
-    if (chdir $output_dir){
-      $output_dir = getcwd; #  making the path absolute
-      unless ($output_dir =~ /\/$/){
-	$output_dir =~ s/$/\//;
-      }
-    }
-    else{
-      mkdir $output_dir or die "Unable to create directory $output_dir $!\n";
-      warn "Created output directory $output_dir!\n\n";
-      chdir $output_dir or die "Failed to move to $output_dir\n";
-      $output_dir = getcwd; #  making the path absolute
-      unless ($output_dir =~ /\/$/){
-	$output_dir =~ s/$/\//;
-      }
-    }
-    warn "Output will be written into the directory: $output_dir\n";
-  }
-  else{
-    $output_dir = '';
-  }
-
-  ### TEMPORARY DIRECTORY for C->T and G->A transcribed files
-
-  chdir $parent_dir or die "Failed to move back to current working directory\n";
-  if ($temp_dir){
-    warn "\nUsing temp directory: $temp_dir\n";
-    unless ($temp_dir =~ /\/$/){
-      $temp_dir =~ s/$/\//;
-    }
-
-    if (chdir $temp_dir){
-      $temp_dir = getcwd; #  making the path absolute
-      unless ($temp_dir =~ /\/$/){
-	$temp_dir =~ s/$/\//;
-      }
-    }
-    else{
-      mkdir $temp_dir or die "Unable to create directory $temp_dir $!\n";
-      warn "Created temporary directory $temp_dir!\n\n";
-      chdir $temp_dir or die "Failed to move to $temp_dir\n";
-      $temp_dir = getcwd; #  making the path absolute
-      unless ($temp_dir =~ /\/$/){
-	$temp_dir =~ s/$/\//;
-      }
-    }
-    warn "Temporary files will be written into the directory: $temp_dir\n";
-  }
-  else{
-    $temp_dir = '';
-  }
-
-  ### OPTIONAL NON-BS MISMATCH OUTPUT AS EXTRA COLUMN IN SAM FILE
-  if ($non_bs_mm){
-    if ($vanilla){
-      die "Option '--non_bs_mm' may only be specified for output in SAM format. Please respecify!\n";
-    }
-  }
-
-  ### PREFIX FOR OUTPUT FILES
-  if ($prefix){
-    # removing trailing dots
-
-    $prefix =~ s/\.+$//;
-
-    warn "Using the following prefix for output files: $prefix\n\n";
-    sleep(1);
-  }
-
-  if (defined $multicore){
-    unless ($multicore > 0){
-      die "Core usage needs to be set to 1 or more (currently selected $multicore). Please respecify!\n";
-    }
-    if ($multicore > 20){
-      warn "Core usage currently set to more than 20 threads. This might fail horribly but let's see how it goes... (set value: $multicore)\n\n";
-    }
-    if ($sam){
-      die "The multicore function currently requires the output to be in BAM format, so please lose either option --sam or --multi\n";
-    }
-  }
-  else{
-    $multicore = 1; # default. Single-thread mode
-    warn "Setting parallelization to single-threaded (default)\n\n";
-  }
-
-  if ($basename and $multicore > 1){
-    die "Specifying --basename in conjuction with --multicore is currently not supported (but we are aiming to fix this soon). Please lose either --basename or --multicore to proceed\n\n";
-  }
-
-  return ($genome_folder,$CT_index_basename,$GA_index_basename,$path_to_bowtie,$sequence_format,$bowtie_options,$directional,$unmapped,$multi_map,$phred64,$solexa,$output_dir,$bowtie2,$vanilla,$sam_no_hd,$skip,$qupto,$temp_dir,$non_bs_mm,$insertion_open,$insertion_extend,$deletion_open,$deletion_extend,$gzip,$bam,$samtools_path,$pbat,$prefix,$old_flag,$basename,$score_min_intercept,$score_min_slope,$bt2_large_index_present,$multicore);
-}
-
-
-
-sub generate_SAM_header{
-
-  print OUT "\@HD\tVN:1.0\tSO:unsorted\n";          # @HD = header, VN = version, SO = sort order
-
-  #  Unordered printing of @SQ headers
-  #  foreach my $chr (keys %chromosomes){
-  #    my $length = length ($chromosomes{$chr});
-  #    print "\@SQ\tSN:$chr\tLN:$length\n";
-  #    print OUT "\@SQ\tSN:$chr\tLN:$length\n";        # @SQ = sequence, SN = seq name, LN = length
-  #  }
-
-  foreach my $chr (sort {$a<=>$b} keys %SQ_order){
-    # warn "$chr\t$SQ_order{$chr}\n";
-    my $length = length ($chromosomes{$SQ_order{$chr}});
-    print OUT "\@SQ\tSN:$SQ_order{$chr}\tLN:$length\n"; # @SQ = sequence, SN = seq name, LN = length
-  }
-
-  print OUT "\@PG\tID:Bismark\tVN:$bismark_version\tCL:\"bismark $command_line\"\n";        # @PG = program, ID = unique identifier, PN = program name name, VN = program version
-
-}
-
-### I would like to thank the following individuals for their valuable contributions to the Bismark SAM output format:
-### O. Tam (2010), C. Whelan (2011), E. Vidal (2011), T. McBryan (2011), P. Hickey (2011), A. Dei Rossi (2014)
-
-sub single_end_SAM_output{
-
-  my ($id,$actual_seq,$methylation_call_params,$qual) = @_;
-  my $strand            = $methylation_call_params->{$id}->{alignment_strand};
-  my $chr               = $methylation_call_params->{$id}->{chromosome};	
-  my $start             = $methylation_call_params->{$id}->{position};	
-  my $stop              = $methylation_call_params->{$id}->{end_position};	
-  my $ref_seq           = $methylation_call_params->{$id}->{unmodified_genomic_sequence};
-  my $methcall          = $methylation_call_params->{$id}->{methylation_call};
-  my $read_conversion   = $methylation_call_params->{$id}->{read_conversion};
-  my $genome_conversion = $methylation_call_params->{$id}->{genome_conversion};
-  my $number_of_mismatches;
-
-  if ($bowtie2){
-    $number_of_mismatches= $methylation_call_params->{$id}->{alignment_score};	
-  }
-  else{
-    $number_of_mismatches= $methylation_call_params->{$id}->{number_of_mismatches};
-  }
-
-  ### This is a description of the bitwise FLAG field which needs to be set for the SAM file taken from: "The SAM Format Specification (v1.4-r985), September 7, 2011"
-  ## FLAG: bitwise FLAG. Each bit is explained in the following table:
-  ## Bit    Description                                                Comment                                Value
-  ## 0x1    template has multiple segments in sequencing               0: single-end 1: paired end            value: 2**0 (  1)
-  ## 0x2    each segment properly aligned according to the aligner     true only for paired-end alignments    value: 2**1 (  2)
-  ## 0x4    segment unmapped                                           ---                                           ---
-  ## 0x8    next segment in the template unmapped                      ---                                           ---
-  ## 0x10   SEQ being reverse complemented                                                                    value: 2**4 ( 16)
-  ## 0x20   SEQ of the next segment in the template being reversed                                            value: 2**5 ( 32)
-  ## 0x40   the first segment in the template                          read 1                                 value: 2**6 ( 64)
-  ## 0x80   the last segment in the template                           read 2                                 value: 2**7 (128)
-  ## 0x100  secondary alignment                                        ---                                           ---
-  ## 0x200  not passing quality controls                               ---                                           ---
-  ## 0x400  PCR or optical duplicate                                   ---                                           ---
-
-  #####
-
-  my $flag;                                                           # FLAG variable used for SAM format.
-  if ($strand eq "+"){
-    if ($read_conversion eq 'CT' and $genome_conversion eq 'CT'){
-      $flag = 0;                                                      # 0 for "+" strand (OT)
-    }
-    elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA'){
-      $flag = 16;                                                     # 16 for "-" strand (CTOB, yields information for the original bottom strand)
-    }
-    else{
-      die "Unexpected strand and read/genome conversion: strand: $strand, read conversion: $read_conversion, genome_conversion: $genome_conversion\n\n";
-    }
-  }
-  elsif ($strand eq "-"){
-    if ($read_conversion eq 'CT' and $genome_conversion eq 'GA'){
-      $flag = 16;                                                     # 16 for "-" strand (OB)
-    }
-    elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT'){
-      $flag = 0;                                                      # 0 for "+" strand (CTOT, yields information for the original top strand)
-    }
-    else{
-      die "Unexpected strand and read/genome conversion: strand: $strand, read conversion: $read_conversion, genome_conversion: $genome_conversion\n\n";
-    }
-  }
-  else{
-    die "Unexpected strand information: $strand\n\n";
-  }
-
-  #####
-
-  my $mapq;
-
-  if ($bowtie2){
-    $mapq = $methylation_call_params->{$id}->{mapq};
-  }
-  else{
-    $mapq = 255;                                                      # Mapping quality is unavailable for use with Bowtie
-  }
-
-  #####
-
-  my $cigar;
-  if ($bowtie2){
-    $cigar = $methylation_call_params->{$id}->{CIGAR};                # Actual CIGAR string reported by Bowtie 2
-  }
-  else{
-    $cigar = length($actual_seq) . "M";                               # Bowtie 1 output does not contain indels (only matches and mismatches)
-  }
-
-  #####	
-
-  my $rnext = "*";                                                    # Paired-end variable
-
-  #####
-
-  my $pnext = 0;                                                      # Paired-end variable
-
-  #####
-
-  my $tlen = 0;                                                       # Paired-end variable
-
-  #####
-
-  if ($read_conversion eq 'CT'){
-    $ref_seq = substr($ref_seq, 0, length($ref_seq) - 2);    # Removes additional nucleotides from the 3' end. This only works for the original top or bottom strands
-  }
-  else{
-    $ref_seq = substr($ref_seq, 2, length($ref_seq) - 2);    # Removes additional nucleotides from the 5' end. This works for the complementary strands in non-directional libraries
-  }
-
-  if ($strand eq '-'){
-    $actual_seq = revcomp($actual_seq);                               # Sequence represented on the forward genomic strand
-    $ref_seq = revcomp($ref_seq);                                     # Required for comparison with actual sequence
-    if ($cigar =~ /D/){
-      $methylation_call_params->{$id}->{genomic_seq_for_MD_tag} = revcomp( $methylation_call_params->{$id}->{genomic_seq_for_MD_tag} );
-    }
-    $qual = reverse $qual;                                            # if the sequence was reverse-complemented the quality string needs to be reversed as well
-  }
-
-  #####
-
-  my $hemming_dist = hemming_dist($actual_seq,$ref_seq);              # Edit distance to the reference, i.e. minimal number of one-nucleotide edits needed to transform the read string
-                                                                      # into the reference string. hemming_dist()
-  if ($bowtie2){
-    $hemming_dist += $methylation_call_params->{$id}->{indels};       # Adding the number of inserted/deleted bases which we parsed while getting the genomic sequence
-  }
-
-  my $NM_tag = "NM:i:$hemming_dist";                                  # Optional tag NM: edit distance based on nucleotide differences
-
-  #####
-
-  my $MD_tag = make_mismatch_string($actual_seq, $ref_seq,$cigar,$methylation_call_params->{$id}->{genomic_seq_for_MD_tag});    # Optional tag MD: string providing mismatched reference bases in the alignment (this does include indel information)
-  #  my $XX_tag = make_mismatch_string($actual_seq, $ref_seq);        # Optional tag XX: string providing mismatched reference bases in the alignment (NO indel information!)
-
-  #####
-
-  my $XM_tag;                                                         # Optional tag XM: Methylation Call String
-  if ($strand eq '+'){
-    $XM_tag = "XM:Z:$methcall";
-  }
-  elsif ($strand eq '-'){
-    $XM_tag = 'XM:Z:'.reverse $methcall;                              # if the sequence was reverse-complemented the methylation call string needs to be reversed as well
-  }
-
-  #####
-
-  my $XR_tag = "XR:Z:$read_conversion";                               # Optional tag XR: Read Conversion
-
-  #####
-
-  my $XG_tag = "XG:Z:$genome_conversion";                             # Optional tag XG: Genome Conversion
-
-  #####
-
-  # Optionally calculating number of mismatches for Bowtie 2 alignments
-
-  if ($non_bs_mm) {
-    if ($bowtie2) {
-
-      $number_of_mismatches =~ s/-//; # removing the minus sign	
-	
-	### if Bowtie 2 was used we need to analyse the CIGAR string whether the read contained any indels to determine the number of mismatches
-	if ($cigar =~ /(D|I)/) {
-	  # warn "$cigar\n";
-	
-	  # parsing CIGAR string
-	  my @len = split (/\D+/,$cigar); # storing the length per operation
-	  my @ops = split (/\d+/,$cigar); # storing the operation
-	  shift @ops;		# remove the empty first element
-	  die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-	
-	  foreach (0..$#len) {
-	    if ($ops[$_] eq 'M') {
-	      # warn "skipping\n";
-	      next;		# irrelevant
-	    }
-	    elsif ($ops[$_] eq 'I') {	# insertion in the read sequence
-	      $number_of_mismatches -= $insertion_open;
-	      $number_of_mismatches -= $len[$_] * $insertion_extend;
-	      # warn "Insertion: Subtracting $ops[$_], length $len[$_], open: $insertion_open, extend: $insertion_extend\n";
-	    }
-	    elsif ($ops[$_] eq 'D') {	# deletion in the read sequence
-	      $number_of_mismatches -= $deletion_open;
-	      $number_of_mismatches -= $len[$_] * $deletion_extend;
-	      # warn "Deletion: Subtracting $ops[$_], length $len[$_], open: $deletion_open, extend: $deletion_extend\n";
-	    }
-	    elsif ($cigar =~ tr/[NSHPX=]//) {	# if these (for standard mapping) illegal characters exist we die
-	      die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-	    }
-	    else {
-	      die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-	    }
-	  }
-	  # warn "Alignment score $number_of_mismatches\n";
-	  # print "Mismatches $number_of_mismatches\n\n";
-	}
-      ### Now we have InDel corrected alignment scores
-
-      ### if the actual sequence contained Ns we need to adjust the number of mismatches. Ns receive a penalty of -1, but normal mismatches receive -6. This might still break if the
-      ### sequence contained more than 5 Ns, but this should occur close to never
-
-      my $seq_N_count = $number_of_mismatches % 6; # modulo 6 will return the integer rest after the division
-      # warn "N count: $seq_N_count\n";
-      $number_of_mismatches = int ($number_of_mismatches / 6) + $seq_N_count;
-      # warn "MM    $number_of_mismatches\n";
-    }
-  }
-
-  ####
-
-  my $XA_tag = "XA:Z:$number_of_mismatches";
-
-  #####
-
-  # SAM format: QNAME, FLAG, RNAME, 1-based POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL, optional fields
-  ### optionally print number of non-bisulfite mismatches
-  if ($non_bs_mm){
-    print OUT join("\t",($id,$flag,$chr,$start,$mapq,$cigar,$rnext,$pnext,$tlen,$actual_seq,$qual,$NM_tag,$MD_tag,$XM_tag,$XR_tag,$XG_tag,$XA_tag)),"\n";
-  }
-  else{ # default
-    # SAM format: QNAME, FLAG, RNAME, 1-based POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL, optional fields
-    print OUT join("\t",($id,$flag,$chr,$start,$mapq,$cigar,$rnext,$pnext,$tlen,$actual_seq,$qual,$NM_tag,$MD_tag,$XM_tag,$XR_tag,$XG_tag)),"\n";
-  }
-}
-
-sub paired_end_SAM_output{
-
-  my ($id,$actual_seq_1,$actual_seq_2,$methylation_call_params,$qual_1,$qual_2) = @_;
-  my $strand_1                = $methylation_call_params->{$id}->{alignment_read_1}; # Bowtie 1 only reports the read 1 alignment strand
-  my $strand_2                = $methylation_call_params->{$id}->{alignment_read_2};
-  my $chr                     = $methylation_call_params->{$id}->{chromosome};	
-  my $ref_seq_1               = $methylation_call_params->{$id}->{unmodified_genomic_sequence_1};
-  my $ref_seq_2               = $methylation_call_params->{$id}->{unmodified_genomic_sequence_2};
-  my $methcall_1              = $methylation_call_params->{$id}->{methylation_call_1};
-  my $methcall_2              = $methylation_call_params->{$id}->{methylation_call_2};
-  my $read_conversion_1       = $methylation_call_params->{$id}->{read_conversion_1};
-  my $read_conversion_2       = $methylation_call_params->{$id}->{read_conversion_2};
-  my $genome_conversion       = $methylation_call_params->{$id}->{genome_conversion};
-
-  my $id_1;
-  my $id_2;
-
-  if ($old_flag){
-    $id_1 = $id.'/1';
-    $id_2 = $id.'/2';
-  }
-  else{
-    $id_1 = $id; # appending /1 or /2 confuses some downstream programs such as Picard
-    $id_2 = $id;
-  }
-
-  # Allows all degenerate nucleotide sequences in reference genome
-  # die "Reference sequence ($ref_seq_1) contains invalid nucleotides!\n" if $ref_seq_1 =~ /[^ACTGNRYMKSWBDHVX]/i; # X are padded nucleotides in case of insertions in the read
-  # die "Reference sequence ($ref_seq_2) contains invalid nucleotides!\n" if $ref_seq_2 =~ /[^ACTGNRYMKSWBDHVX]/i;
-
-  my $index; # used to store the srand origin of the alignment in a less convoluted way
-
-  if ($read_conversion_1 eq 'CT' and $genome_conversion eq 'CT'){
-    $index = 0; ## this is OT   (original top strand)
-  }	
-  elsif ($read_conversion_1 eq 'GA' and $genome_conversion eq 'GA'){
-    $index = 1; ## this is CTOB (complementary to OB)
-  }
-  elsif ($read_conversion_1 eq 'GA' and $genome_conversion eq 'CT'){
-    $index = 2; ## this is CTOT (complementary to OT)
-  }
-  elsif ($read_conversion_1 eq 'CT' and $genome_conversion eq 'GA'){
-    $index = 3; ## this is OB   (original bottom)
-  }
-  else {
-    die "Unexpected combination of read 1 and genome conversion: $read_conversion_1 / $genome_conversion\n";
-  }
-
-  my $number_of_mismatches_1;
-  my $number_of_mismatches_2;
-
-  if ($bowtie2){ # Bowtie 2 reports always as read 1 then read 2, so this is fine
-    $number_of_mismatches_1  = $methylation_call_params->{$id}->{alignment_score_1}; # only needed for custom allele-specific output, not the default!
-    $number_of_mismatches_2  = $methylation_call_params->{$id}->{alignment_score_2};
-  }
-  else{ # Bowtie 1 reports always the leftmost read first. That means we have to reverse the strings if the first read aligned in reverse orientation
-    if ($index == 2 or $index == 3){ # CTOT or OB
-      $number_of_mismatches_1  = $methylation_call_params->{$id}->{number_of_mismatches_2}; # only needed for custom allele-specific output, not the default!
-      $number_of_mismatches_2  = $methylation_call_params->{$id}->{number_of_mismatches_1};
-    }
-    else{ # if the first read aligned in forward direction it is like for Bowtie 2
-      $number_of_mismatches_1  = $methylation_call_params->{$id}->{number_of_mismatches_1}; # only needed for custom allele-specific output, not the default!
-      $number_of_mismatches_2  = $methylation_call_params->{$id}->{number_of_mismatches_2};
-    }
-  }
-
-
-	
-  ### we need to remove 2 bp of the genomic sequence as we were extracting read + 2bp long fragments to make a methylation call at the
-  ### first or last position.
-
-  if ($index == 0 or $index == 3){ # OT or OB
-    $ref_seq_1 = substr($ref_seq_1,0,length($ref_seq_1)-2);
-    $ref_seq_2 = substr($ref_seq_2,2,length($ref_seq_2)-2);
-  }
-  else{ # CTOT or CTOB
-    $ref_seq_1 = substr($ref_seq_1,2,length($ref_seq_1)-2);
-    $ref_seq_2 = substr($ref_seq_2,0,length($ref_seq_2)-2);
-  }
-
-  #####
-
-  my $start_read_1;
-  my $start_read_2;
-  # adjusting end positions
-
-  if ($bowtie2){
-    $start_read_1 = $methylation_call_params->{$id}->{position_1};
-    $start_read_2 = $methylation_call_params->{$id}->{position_2};
-  }
-  else{ # Bowtie 1 output. $strand_1 stores the alignment of Read 1
-    if ($strand_1 eq '+'){ # Read 1 aligns to the + strand
-      $start_read_1 = $methylation_call_params->{$id}->{start_seq_1};
-      $start_read_2 = $methylation_call_params->{$id}->{alignment_end} - length ($actual_seq_2) + 1;
-    }
-    else{ # read 1 is on the - strand
-      $start_read_1 = $methylation_call_params->{$id}->{alignment_end} - length ($actual_seq_1) + 1;
-      $start_read_2 = $methylation_call_params->{$id}->{start_seq_1};
-    }
-  }
-
-  #####
-
-  my $end_read_1;
-  my $end_read_2;
-  # adjusting end positions
-
-  if ($bowtie2){
-    $end_read_1 = $methylation_call_params->{$id}->{end_position_1};
-    $end_read_2 = $methylation_call_params->{$id}->{end_position_2};
-  }
-  else{ # Bowtie 1 output. $strand_1 stores the alignment of Read 1
-    if ($strand_1 eq '+'){ # Read 1 aligns to the + strand
-      $end_read_1 = $methylation_call_params->{$id}->{start_seq_1} + length ($actual_seq_1)-1;
-      $end_read_2 = $methylation_call_params->{$id}->{alignment_end};
-      }
-    else{
-      $end_read_1 = $methylation_call_params->{$id}->{alignment_end};
-      $end_read_2 = $methylation_call_params->{$id}->{start_seq_1} + length ($actual_seq_2)-1;
-    }
-  }
-
-  #####
-
-  ### This is a description of the bitwise FLAG field which needs to be set for the SAM file taken from: "The SAM Format Specification (v1.4-r985), September 7, 2011"
-  ## FLAG: bitwise FLAG. Each bit is explained in the following table:
-  ## Bit    Description                                                Comment                                Value
-  ## 0x1    template having multiple segments in sequencing            0: single-end 1: paired end            value: 2^^0 (  1)
-  ## 0x2    each segment properly aligned according to the aligner     true only for paired-end alignments    value: 2^^1 (  2)
-  ## 0x4    segment unmapped                                           ---                                           ---
-  ## 0x8    next segment in the template unmapped                      ---                                           ---
-  ## 0x10   SEQ being reverse complemented                             - strand alignment                     value: 2^^4 ( 16)
-  ## 0x20   SEQ of the next segment in the template being reversed     + strand alignment                     value: 2^^5 ( 32)
-  ## 0x40   the first segment in the template                          read 1                                 value: 2^^6 ( 64)
-  ## 0x80   the last segment in the template                           read 2                                 value: 2^^7 (128)
-  ## 0x100  secondary alignment                                        ---                                           ---
-  ## 0x200  not passing quality controls                               ---                                           ---
-  ## 0x400  PCR or optical duplicate                                   ---                                           ---
-
-  ### As the FLAG value do not consider that there might be 4 different bisulfite strands of DNA, we are trying to make FLAG tags which take the strand identity into account
-
-  # strands OT and CTOT will be treated as aligning to the top strand (both sequences are scored as aligning to the top strand)
-  # strands OB and CTOB will be treated as aligning to the bottom strand (both sequences are scored as reverse complemented sequences)
-
-  my $flag_1;                                                            # FLAG variable used for SAM format
-  my $flag_2;
-
-  ### The new default FLAG values have been suggested by Peter Hickey, Australia
-
-  if ($index == 0){       # OT
-    unless ($old_flag){
-      $flag_1 = 99;                                                      # PH: Read 1 is on the + strand and Read 2 is reversed  (1+2+32+64)
-      $flag_2 = 147;                                                     # PH: Read 2 is on - strand but informative for the OT  (1+2+16+128)
-    }
-    else{
-      $flag_1 = 67;                                                      # Read 1 is on the + strand  (1+2+64) (Read 2 is technically reverse-complemented, but we do not score it)
-      $flag_2 = 131;                                                     # Read 2 is on - strand but informative for the OT        (1+2+128)
-    }
-  }
-  elsif ($index == 1){    # CTOB
-    unless($old_flag){
-      $flag_1 = 83;                                                      # PH: Read 1 is on the - strand, mapped in proper pair and Read 1 is reversed  (1+2+16+64)
-      $flag_2 = 163;                                                     # PH: read 2 is on the - strand, mapped in proper pair and Read 1 is reversed  (1+2+32+128)
-    }
-    else{
-      $flag_1 = 115;                                                     # Read 1 is on the + strand, we score for OB  (1+2+16+32+64)
-      $flag_2 = 179;                                                     # Read 2 is on the - strand  (1+2+16+32+128)
-    }
-  }
-  elsif ($index == 2){    # CTOT
-    unless ($old_flag){
-      $flag_1 = 99;                                                      # PH: Read 1 is on the + strand and Read 2 is reversed  (1+2+32+64)
-      $flag_2 = 147;                                                     # PH: Read 2 is on - strand but informative for the OT  (1+2+16+128)
-    }
-    else{
-      $flag_1 = 67;                                                      # Read 1 is on the - strand (CTOT) strand, but we score it for OT (1+2+64)
-      $flag_2 = 131;                                                     # Read 2 is on the + strand, score it for OT (1+2+128)
-    }
-  }
-  elsif ($index == 3){    # OB
-    unless ($old_flag){
-      $flag_1 = 83;                                                      # PH: Read 1 is on the - strand, mapped in proper pair and Read 1 is reversed  (1+2+16+64)
-      $flag_2 = 163;                                                     # PH: read 2 is on the - strand, mapped in proper pair and Read 1 is reversed  (1+2+32+128)
-    }
-    else{
-      $flag_1 = 115;                                                     # Read 1 is on the - strand, we score for OB  (1+2+16+32+64)
-      $flag_2 = 179;                                                     # Read 2 is on the + strand  (1+2+16+32+128)
-    }
-  }
-
-  #####
-
-  my $mapq;
-
-  if ($bowtie2){
-    $mapq = $methylation_call_params->{$id}->{mapq};
-  }
-  else{
-    $mapq = 255;                                                       # Mapping quality is unavailable for use with Bowtie
-  }
-
-  #####
-
-  my $cigar_1;
-  my $cigar_2;
-
-  if ($bowtie2){
-    $cigar_1 = $methylation_call_params->{$id}->{CIGAR_1};             # Actual CIGAR string reported by Bowtie 2
-    $cigar_2 = $methylation_call_params->{$id}->{CIGAR_2};
-  }
-  else{
-    $cigar_1 = length($actual_seq_1) . "M";                            # Assume no indels for Bowtie 1  mapping (only matches and mismatches)
-    $cigar_2 = length($actual_seq_2) . "M";
-  }
-
-  #####
-
-  my $rnext = '=';                                                     # Chromosome of mate; applies to both reads
-
-  #####
-
-  my $pnext_1 = $start_read_2;                                         # Leftmost position of mate
-  my $pnext_2 = $start_read_1;
-
-  #####
-
-  my $tlen_1;                                                          # signed observed Template LENgth (or inferred fragment size)
-  my $tlen_2;
-
-  if ($bowtie2){
-
-    if ($start_read_1 <= $start_read_2){
-
-      # Read 1 alignment is leftmost
-
-      if ($end_read_2 >= $end_read_1){
-	
-	# ------------------------->     read 1   reads overlapping
-	#  <-------------------------    read 2
-	#
-	# or
-	#
-	# ------------------------->     read 1
-	#   <-----------------------     read 2   read 2 contained within read 1
-	#
-	# or
-	#
-	# ------------------------->     read 1   reads 1 and 2 exactly overlapping
-	# <-------------------------     read 2
-	#
-
-	# dovetailing of reads is not enabled for Bowtie 2 alignments
-
-	$tlen_1 = $end_read_2 - $start_read_1 + 1;                         # Leftmost read has a + sign,
-	$tlen_2 = $start_read_1 - $end_read_2 - 1;                         # Rightmost read has a - sign
-      }
-      elsif ($end_read_2 < $end_read_1){
-
-	# ------------------------->     read 1
-	#       <-----------             read 2   read 2 contained within read 1
-	#
-	# or
-	#
-	# ------------------------->     read 1
-	# <------------------------      read 2   read 2 contained within read 1
-
-	# start and end of read 2  are fully contained within read 1, using the length of read 1 for the TLEN variable
-	$tlen_1 = $end_read_1 - $start_read_1 + 1;          # Set to length of read 1   Leftmost read has a + sign,
-	$tlen_2 = ($end_read_1 - $start_read_1 + 1) * -1;   # Set to length of read 1   Rightmost read has a - sign. well this is debatable. Changed this
-                                                            ### as a request by frozenlyse on SeqAnswers on 24 July 2013
-      }
-
-    }
-
-    elsif ($start_read_2 < $start_read_1){
-
-      if ($end_read_1 >= $end_read_2){
-
-      # Read 2 alignment is leftmost
-
-	# ------------------------->     read 2   reads overlapping
-	#  <-------------------------    read 1
-	#
-	# or
-	#
-	# ------------------------->     read 2
-	#   <-----------------------     read 1   read 1 contained within read 2
-	#
-	#
-
-	$tlen_2 = $end_read_1 - $start_read_2 + 1;                         # Leftmost read has a + sign,
-	$tlen_1 = $start_read_2 - $end_read_1 - 1;                         # Rightmost read has a - sign
-      }
-      elsif ($end_read_1 < $end_read_2){
-
-	# ------------------------->     read 2
-	#       <-----------             read 1   read 1 contained within read 2
-	#
-	# or
-	#
-	# ------------------------->     read 2
-	#  <------------------------      read 1   read 1 contained within read 2
-	
-	# start and end of read 1  are fully contained within read 2, using the length of read 2 for the TLEN variable
-	$tlen_1 = ($end_read_2 - $start_read_2 + 1) * -1;          # Set to length of read 2   Shorter read receives a - sign,
-	$tlen_2 = $end_read_2 - $start_read_2 + 1;                 # Set to length of read 2   Longer read receives a +. Well this is debatable. Changed this
-	                                                           ### as a request by frozenlyse on SeqAnswers on 24 July 2013
-     }
-    }
-  }
-
-  else{ # Bowtie 1
-
-    if ($end_read_2 >= $end_read_1){
-      # Read 1 alignment is leftmost
-      # ------------------------->  read 1
-      #  <------------------------- read 2
-      # this is the most extreme case for Bowtie 1 alignments, reads do not contain each other, also no dovetailing
-
-      $tlen_1 = $end_read_2 - $start_read_1 + 1;                         # Leftmost read has a + sign,
-      $tlen_2 = $start_read_1 - $end_read_2 - 1;                         # Rightmost read has a - sign
-    }
-    else{
-      # Read 2 alignment is leftmost
-      # ------------------------->  read 2
-      #  <------------------------- read 1
-      # this is the most extreme case for Bowtie 1 alignments, reads do not contain each other, also no dovetailing
-
-      $tlen_2 = $end_read_1 - $start_read_2 + 1;                         # Leftmost read has a + sign,
-      $tlen_1 = $start_read_2 - $end_read_1 - 1;                         # Rightmost read has a - sign
-    }
-  }
-
-  #####
-
-  # adjusting the strand of the sequence before we use them to generate mismatch strings
-  if ($strand_1 eq '-'){
-    $actual_seq_1 = revcomp($actual_seq_1);                            # Sequence represented on the forward genomic strand
-    $ref_seq_1 = revcomp($ref_seq_1);                                  # Required for comparison with actual sequence
-    if ($cigar_1 =~ /D/){
-      $methylation_call_params->{$id}->{genomic_seq_for_MD_tag_1} = revcomp( $methylation_call_params->{$id}->{genomic_seq_for_MD_tag_1} );
-    }
-    $qual_1 = reverse $qual_1;                                         # we need to reverse the quality string as well
-  }
-  if ($strand_2 eq '-'){
-    $actual_seq_2 = revcomp($actual_seq_2);                            # Mate sequence represented on the forward genomic strand
-    $ref_seq_2 = revcomp($ref_seq_2);                                  # Required for comparison with actual sequence
-    if ($cigar_2 =~ /D/){
-      $methylation_call_params->{$id}->{genomic_seq_for_MD_tag_2} = revcomp( $methylation_call_params->{$id}->{genomic_seq_for_MD_tag_2} );
-    }
-    $qual_2 = reverse $qual_2;                                         # If the sequence gets reverse complemented we reverse the quality string as well
-  }
-
-  #  print "$actual_seq_1\n$ref_seq_1\n\n";
-  #  print "$actual_seq_2\n$ref_seq_2\n\n";
-
-  #####
-
-  my $hemming_dist_1 = hemming_dist($actual_seq_1,$ref_seq_1);         # Minimal number of one-nucleotide edits needed to transform the read string into the reference sequence
-  my $hemming_dist_2 = hemming_dist($actual_seq_2,$ref_seq_2);
-  if ($bowtie2){
-    $hemming_dist_1 += $methylation_call_params->{$id}->{indels_1};    # Adding the number of inserted/deleted bases which we parsed while getting the genomic sequence
-    $hemming_dist_2 += $methylation_call_params->{$id}->{indels_2};    # Adding the number of inserted/deleted bases which we parsed while getting the genomic sequence
-  }
-  my $NM_tag_1 = "NM:i:$hemming_dist_1";                               # Optional tag NM: edit distance based on nucleotide differences
-  my $NM_tag_2 = "NM:i:$hemming_dist_2";                               # Optional tag NM: edit distance based on nucleotide differences
-
-  #####
-
-  my $MD_tag_1 = make_mismatch_string($actual_seq_1,$ref_seq_1,$cigar_1,$methylation_call_params->{$id}->{genomic_seq_for_MD_tag_1}); # Optional tag MD: String providing mismatched reference bases in the alignment (including indel information)
-  my $MD_tag_2 = make_mismatch_string($actual_seq_2,$ref_seq_2,$cigar_2,$methylation_call_params->{$id}->{genomic_seq_for_MD_tag_2});
-
-  #  my $XX_tag_1 = make_mismatch_string($actual_seq_1,$ref_seq_1);       # Optional tag XX: String providing mismatched reference bases in the alignment (NO indel information!)
-  #  my $XX_tag_2 = make_mismatch_string($actual_seq_2,$ref_seq_2);
-
-  #####
-
-  my $XM_tag_1;                                                        # Optional tag XM: Methylation call string
-  my $XM_tag_2;
-
-  if ($strand_1 eq '-'){
-    $XM_tag_1 = 'XM:Z:'.reverse $methcall_1;                           # Needs to be reversed if the sequence was reverse complemented
-  }
-  else{
-    $XM_tag_1 = "XM:Z:$methcall_1";
-  }
-
-  if ($strand_2 eq '-'){
-    $XM_tag_2 = 'XM:Z:'.reverse $methcall_2;                           # Needs to be reversed if the sequence was reverse complemented
-  }
-  else{
-    $XM_tag_2 = "XM:Z:$methcall_2";
-  }
-
-  #####
-
-  my $XR_tag_1 = "XR:Z:$read_conversion_1";                            # Optional tag XR: Read 1 conversion state
-  my $XR_tag_2 = "XR:Z:$read_conversion_2";                            # Optional tag XR: Read 2 conversion state
-
-  #####
-
-  my $XG_tag = "XG:Z:$genome_conversion";                              # Optional tag XG: Genome Conversion state; valid for both reads
-
-  #####
-
-  # Optionally calculating number of mismatches for Bowtie 2 alignments
-
-  if ($non_bs_mm) {
-    if ($bowtie2) {
-
-      $number_of_mismatches_1 =~ s/-//; # removing the minus sign	
-      $number_of_mismatches_2 =~ s/-//;
-
-      ### if Bowtie 2 was used we need to analyse the CIGAR strings whether the reads contained any indels to determine the number of mismatches
-
-      ### CIGAR 1
-      if ($cigar_1 =~ /(D|I)/) {
-	# warn "$cigar_1\n";
-
-	# parsing CIGAR string
-	my @len = split (/\D+/,$cigar_1); # storing the length per operation
-	my @ops = split (/\d+/,$cigar_1); # storing the operation
-	shift @ops;		# remove the empty first element
-	die "CIGAR string '$cigar_1' contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-	
-	foreach (0..$#len) {
-	  if ($ops[$_] eq 'M') {
-	    # warn "skipping\n";
-	    next;		# irrelevant
-	  }
-	  elsif ($ops[$_] eq 'I') {	# insertion in the read sequence
-	    $number_of_mismatches_1 -= $insertion_open;
-	    $number_of_mismatches_1 -= $len[$_] * $insertion_extend;
-	    # warn "Insertion: Subtracting $ops[$_], length $len[$_], open: $insertion_open, extend: $insertion_extend\n";
-	  }
-	  elsif ($ops[$_] eq 'D') {	# deletion in the read sequence
-	    $number_of_mismatches_1 -= $deletion_open;
-	    $number_of_mismatches_1 -= $len[$_] * $deletion_extend;
-	    # warn "Deletion: Subtracting $ops[$_], length $len[$_], open: $deletion_open, extend: $deletion_extend\n";
-	  }
-	  elsif ($cigar_1 =~ tr/[NSHPX=]//) {	# if these (for standard mapping) illegal characters exist we die
-	    die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-	  }
-	  else {
-	    die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-	  }
-	}
-
-	# warn "Alignment score $number_of_mismatches_1\n";
-	# print "Mismatches $number_of_mismatches_1\n\n";
-      }
-
-      ### CIGAR 2
-      if ($cigar_2 =~ /(D|I)/) {
-	# warn "$cigar_2\n";
-
-	# parsing CIGAR string
-	my @len = split (/\D+/,$cigar_2); # storing the length per operation
-	my @ops = split (/\d+/,$cigar_2); # storing the operation
-	shift @ops;		# remove the empty first element
-	die "CIGAR string '$cigar_2' contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-	
-	foreach (0..$#len) {
-	  if ($ops[$_] eq 'M') {
-	    # warn "skipping\n";
-	    next; #irrelevant
-	  }
-	  elsif ($ops[$_] eq 'I') {	# insertion in the read sequence
-	    $number_of_mismatches_2 -= $insertion_open;
-	    $number_of_mismatches_2 -= $len[$_] * $insertion_extend;
-	    # warn "Insertion: Subtracting $ops[$_], length $len[$_], open: $insertion_open, extend: $insertion_extend\n";
-	  }
-	  elsif ($ops[$_] eq 'D') {	# deletion in the read sequence
-	    $number_of_mismatches_2 -= $deletion_open;
-	    $number_of_mismatches_2 -= $len[$_] * $deletion_extend;
-	    # warn "Deletion: Subtracting $ops[$_], length $len[$_], open: $deletion_open, extend: $deletion_extend\n";
-	  }
-	  elsif ($cigar_2 =~ tr/[NSHPX=]//) {	# if these (for standard mapping) illegal characters exist we die
-	    die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-	  }
-	  else {
-	    die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-	  }
-	}
-      }
-
-      ### Now we have InDel corrected Alignment scores
-
-      ### if the actual sequence contained Ns we need to adjust the number of mismatches. Ns receive a penalty of -1, but normal mismatches receive -6. This might still break if the
-      ### sequence contained more than 5 Ns, but this should occur close to never
-
-      my $seq_1_N_count = $number_of_mismatches_1 % 6; # modulo 6 will return the integer rest after the division
-      my $seq_2_N_count = $number_of_mismatches_2 % 6;
-      #   warn "N count 1: $seq_1_N_count\n";
-      #   warn "N count 2: $seq_2_N_count\n";
-
-      $number_of_mismatches_1 = int ($number_of_mismatches_1 / 6) + $seq_1_N_count;
-      $number_of_mismatches_2 = int ($number_of_mismatches_2 / 6) + $seq_2_N_count;
-
-      # warn "MM1    $number_of_mismatches_1 \n";
-      # warn "MM2    $number_of_mismatches_2 \n";
-    }
-  }
-
-  ####
-
-  my $XA_tag = "XA:Z:$number_of_mismatches_1";
-  my $XB_tag = "XB:Z:$number_of_mismatches_2";
-
-
-  # SAM format: QNAME, FLAG, RNAME, 1-based POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL, optional fields
-  ### optionally print number of non-bisulfite mismatches
-  if ($non_bs_mm){
-    print OUT join("\t", ($id_1, $flag_1, $chr, $start_read_1, $mapq, $cigar_1, $rnext, $pnext_1, $tlen_1, $actual_seq_1, $qual_1, $NM_tag_1, $MD_tag_1, $XM_tag_1,$XR_tag_1,$XG_tag,$XA_tag)), "\n";
-    print OUT join("\t", ($id_2, $flag_2, $chr, $start_read_2, $mapq, $cigar_2, $rnext, $pnext_2, $tlen_2, $actual_seq_2, $qual_2, $NM_tag_2, $MD_tag_2, $XM_tag_2,$XR_tag_2,$XG_tag,$XB_tag)), "\n";
-  }
-  else{ # default
-    print OUT join("\t", ($id_1, $flag_1, $chr, $start_read_1, $mapq, $cigar_1, $rnext, $pnext_1, $tlen_1, $actual_seq_1, $qual_1, $NM_tag_1, $MD_tag_1, $XM_tag_1,$XR_tag_1,$XG_tag)), "\n";
-    print OUT join("\t", ($id_2, $flag_2, $chr, $start_read_2, $mapq, $cigar_2, $rnext, $pnext_2, $tlen_2, $actual_seq_2, $qual_2, $NM_tag_2, $MD_tag_2, $XM_tag_2,$XR_tag_2,$XG_tag)), "\n";
-  }
-}
-
-sub revcomp{
-  my $seq = shift or die "Missing seq to reverse complement\n";
-  $seq = reverse $seq;
-  $seq =~ tr/ACTGactg/TGACTGAC/;
-  return $seq;
-}
-
-sub hemming_dist{
-  my $matches = 0;
-  my @actual_seq = split //,(shift @_);
-  my @ref_seq = split //,(shift @_);
-
-  foreach (0..$#actual_seq){
-    ++$matches if ($actual_seq[$_] eq $ref_seq[$_]);
-  }
-  return my $hd = scalar @actual_seq - $matches;
-}
-
-
-### Getting rid of the bitwise comparison because even though the initial comparison is nice and quick, the regex loop looking for non-null bytes characters isn't. We might
-### as well do a substring loop to start with, which enables us to generate proper MD:Z: flags that also take proper care of InDels
-### 05 June 2014
-
-
-sub make_mismatch_string{
-  my ($actual_seq,$ref_seq,$cigar,$md_sequence) = @_;
-
-  my $MD_tag = "MD:Z:";
-  my $prev_matching = 0;
-  my $last_char;
-
-  my $ref_base;
-  my $actual_base;
-
-  foreach my $pos ( 0..(length$actual_seq) - 1 ){
-
-    $actual_base = substr($actual_seq,$pos,1);
-    $ref_base    = substr($ref_seq,$pos,1);
-    # if ($verbose){ warn "reference: $ref_base\tseen base: $actual_base\n";}
-
-    if ( $actual_base eq $ref_base ){
-      ++$prev_matching;
-    }
-    else{
-      # If the mismatch is due to an insertion we simply move on, else we print the previously matching bases as well as the mismatching genomic base
-      if ($ref_base eq 'X'){
-	# if ($verbose){ warn "The genome base was an artificually padded '$ref_base' due to an insertion in the read at this position. Just ignoring it for the MD tag\n"; sleep(1);}
-      }
-      else{
-	# if ($verbose){ warn "previous matching bases: $prev_matching\n";}
-
-	### There is a mismatch between the sequence and the genome. First we need to write out how may bases matched until now
-	if ($prev_matching == 0){
-	  # if ($verbose){ warn "Got a mismatch either at the very start or next to another mismatch. Need to add a padding 0 as well as the mismatch\n";}
-	  # if ($verbose){ warn "${prev_matching}$ref_base\n";}
-	  $MD_tag .= $prev_matching;
-	  $MD_tag .= $ref_base;
-	}
-	else{
-	  # if ($verbose){ warn "${prev_matching}$ref_base\n";}
-	  $MD_tag .= $prev_matching;
-	  $MD_tag .= $ref_base;
-	}
-	
-	$prev_matching = 0; # resetting $prev_matching
-      }
-
-    }
-
-  }
-  ### appending the number of matches one last time
-  $MD_tag .= $prev_matching;
-
-
-  ### If the read contains deletion(s) we need to take care of these in the MD-tag as well
-  if ($cigar =~ /D/){
-    my $deletions_total = 0;
-    while ($cigar =~ /D/g){
-      ++$deletions_total;
-    }
-    if ($verbose){ warn "Read contains $deletions_total deletions in total\n\n";}
-
-    if ($verbose){ warn "There was a deletion in the read!\n";}
-    if ($verbose){ warn "actual:\t$actual_seq\nref:\t$ref_seq\nMD-seq:\t$md_sequence\nMD-tag: $MD_tag\n";}
-
-    # parsing CIGAR string
-    my @len = split (/\D+/,$cigar); # storing the length per operation
-    my @ops = split (/\d+/,$cigar); # storing the operation
-    shift @ops; # remove the empty first element
-    die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-    my $MD_pos_so_far = 0;
-    my $deletions_processed = 0;
-    my $del_pos = 0;
-    my $deleted_bases = '';
-    my $new_MD = $1 if ($MD_tag =~ /MD:Z:(.*)/);
-    my $md_index_already_processed;
-
-    my @md = split //,$new_MD;
-
-    if ($verbose){ warn "New MD-tag:  $new_MD\n\n";}
-    $MD_tag = "MD:Z:"; ### reconstituting a new MD-tag
-    $new_MD = ''; # using this to build up a new string that will replace the old \@md
-
-    if ($verbose){ warn "CIGAR string; $cigar\n";}
-    ### determining end position of a read
-    foreach my $index(0..$#len){
-
-      if ($ops[$index] eq 'M'){  # matching bases
-	$del_pos += $len[$index];
-	if ($verbose){ warn "Operation is 'M', adding $len[$index] bp\n";}
-      }
-      elsif($ops[$index] eq 'I'){ # insertion
-	$del_pos += $len[$index];
-	### need to add insertions in the read to MD pos so far!
-	$MD_pos_so_far += $len[$index];
-	if ($verbose){ warn "Operation is 'I',  adding $len[$index] bp\n";}
-	}
-      elsif($ops[$index] eq 'D'){ # deletion
-	if ($verbose){ warn "Operation is 'D', extracting $len[$index] bp\n";}
-	$deleted_bases = substr($md_sequence,$del_pos,$len[$index]);
-	if ($verbose){ warn "Deleted bases: $deleted_bases\n\n";}
-
-	### Now we need to process the MD-tag so far and write out everything up until this point, inlcuding the deletion
-	if ($verbose){ warn "Now processing the MD-tag\n";}
-	my $op;
-
-	my $this_deletion_processed;
-	my $md_processed_so_far;
-	my $current_md_index;
-
-  	foreach my $el (@md){
-	
-	  unless (defined $current_md_index){
-	    $current_md_index = 0; # first element = index 0
-	  }
-	  else{
-	    ++$current_md_index;
-	  }
-
-	  if ($md_index_already_processed and ($current_md_index <= $md_index_already_processed)){
-	    if ($verbose){ warn "This has to be another deletion within the same read. Currently processing index $current_md_index, but have already processed $md_index_already_processed indexes previously\n";}
-	    $new_MD .= $el;
-	    next;
-	  }
-	
-	  if ($verbose){ warn "Current element: $el\n";}
-	  unless (defined $op){ # initialize
-	    $op = $el;
-	    if ($verbose){ warn "Initializing \$op as $op\n";}
-	    next;
-	  }
-
-	  if ($deletions_processed == $deletions_total){
-	    if ($verbose){ warn "Processed $deletions_processed in the read so far, out of $deletions_total total. Just appending elements until the end of the string: here $el\n";}
-	    $MD_tag .= $el;
-	    $new_MD .= $el;
-	    next;
-	  }
-	  # this only occurs when there are more deletions in the read but we want to regenerate a new MD tag
-	  if ($this_deletion_processed){
-	    $new_MD .= $el;
-	    next;
-	  }
-
-	  if ($op =~ /^\d+$/){
-	    if ($verbose){ warn "Operation so far was a digit: $op\n";}
-	    if ($el =~ /\d/){
-	      $op .= $el;
-	      if ($verbose){ warn "Appending current operation $el. New operation is: $op\n";}
-	      next;
-	    }
-	    else{
-	      if ($verbose){ warn "current element is a word character: $el\n";}
-
-	      ### Need to determine if the matching operation length includes the deletion position
-	      if ($verbose){ warn "Processing operation $op and adding it to MD pos which is so far: $MD_pos_so_far; deletion pos is $del_pos.\n";}
-	      $MD_pos_so_far += $op;
-	      if ($verbose){ warn "MD pos so far: $MD_pos_so_far\n";}
-	      if ($MD_pos_so_far < $del_pos){
-		if ($verbose){ warn "Doesn't cover the deletion yet. Writing back out.\n";}
-		$MD_tag .= $op;
-		$new_MD .= $op;
-		if ($verbose){ warn "Setting new operation to: $el\n";}
-		$op = $el; # setting new $op
-	      }
-	      else{
-		if ($verbose){ warn "Here we go, this operation covers the deletion position!!\n";}
-		### splitting up the number of matching bases in number before and after the deletion
-
-		my $pos_after_deletion = $MD_pos_so_far - $del_pos;
-		my $pos_before_deletion = $op - $pos_after_deletion;
-		if ($verbose){ warn "Splitting up previous operation '$op' into pos before deletion: ${pos_before_deletion} and pos_after_deletion: $pos_after_deletion\n";}	
-		$MD_tag .= "${pos_before_deletion}^${deleted_bases}";
-		$new_MD .= "${pos_before_deletion}^${deleted_bases}${pos_after_deletion}";
-		if ($verbose){ warn "\$newMD after adjusting for the current deletion: $new_MD\n";}
-
-		#adjusting the MD_position by the number of bases after the deletion
-		$MD_pos_so_far -= $pos_after_deletion;
-		if ($verbose){ warn "MD after adjusting for deletion: $MD_pos_so_far\n";	}
-		### also appending the current element because we are writing out the rest of the MD-string unchanged to $new_MD
-		$new_MD .= $el;
-	
-		$deletions_processed += 1;
-		$this_deletion_processed = 1;
-
-		if ($deletions_processed == $deletions_total){ # this was the last deletion of the read
-		  if ($verbose){ warn "This was the last deletion in the read ($deletions_processed out of $deletions_total total). Continuing to append \$pos_after_deletion (${pos_after_deletion})..\n";}
-		  $MD_tag .= "${pos_after_deletion}";
-		
-		  ### also appending the current element because we are writing out the rest of the MD-string unchanged
-		  if ($verbose){ warn "also appending the current element $el\n";}
-		  $MD_tag .= $el;
-		  ### Finally also adding the length of the deletion to $del_pos
-		  $del_pos += $len[$index];
-		  if ($verbose){ warn "Adding length of the deletion itself (",$len[$index],") to \$del_pos: currently at $del_pos\n";}	
-		}	
-		else{
-		  if ($verbose){ warn "This wasn't the last deletion in the read. Substituting the last operation with the current deletion and reconstituting \@md\n";}
-		  if ($verbose){ warn "Adding length of deletion string '${pos_before_deletion}^${deleted_bases}' (",length("${pos_before_deletion}^${deleted_bases}")," - length of current operation (",length$op,") to current_md_index\n";}
-
-		
-		  ### This migh need looking at!!
-		
-		  $current_md_index = $current_md_index + length("${pos_before_deletion}^${deleted_bases}") - length$op;
-		  if ($verbose){  warn "Current index = $current_md_index\n";}
-		
-		  if ($verbose){ warn "Setting \$md_index_already_processed to ",$current_md_index-1,"\n";}
-		  $md_index_already_processed = $current_md_index - 1;
-		
-		  if ($verbose){ warn "Exiting now and waiting for the next deletion\n";}
-
-		  ### Finally also adding the length of the deletion to $del_pos
-		  $del_pos += $len[$index];
-		  $MD_pos_so_far += $len[$index];	
-		  if ($verbose){ warn "Adding length of the deletion itself (",$len[$index],") to \$del_pos: currently at $del_pos\n";}
-		  if ($verbose){ warn "MD-tag so far: $MD_tag ~~\n";}
-		  #setting $op to en empty string so it is not being processed as the last element
-		  $op = '';
-		  # last; # exiting the loop and processing the CIGAR string further until we hit the next deletion	
-		}
-	      }
-	    }
-	    if ($verbose){  warn "MD-tag so far: $MD_tag ~~\n";}
-	  }
-	  else{
-	    if ($verbose){  warn "Operation so far was a word character: $op\n";}
-	    if ($el =~ /\d+/){
-	      # processing the previous mismatch position
-	      $MD_tag .= $op;
-	      $new_MD .= $op;
-	      $MD_pos_so_far += length($op);
-	      if ($verbose){  warn "Writing out mismatching base $op and adding length ",length($op),"\n";}
-	    }
-	    else{
-	      # this should never occur since mismatches are followed by a 0 or another digit
-	      die "current element is a another word character: $el. This should never happen!\n";
-	    }
-	    if ($verbose){ warn "Setting new operation to: $el\n";}
-	    $op = $el; # setting new $op
-	    if ($verbose){  warn "MD-tag so far: $MD_tag ~~\n";}
-	  }
-	}
-
-	### need to consider last element if it was a digit or number and we are expecting the deletion in the last element of the MD-tag
- 	if ($op =~ /\d+/ and $deletions_processed < $deletions_total){
-	  if ($verbose){ warn "\n\nlast operation was $op\n";}
- 	  if ($verbose){ warn "Processing operation $op; deletion pos is $del_pos. MD so far was: $MD_pos_so_far\n";}
-	
- 	  $MD_pos_so_far += $op;
-	  if ($verbose){ warn "Adding $op to MD pos so far: $MD_pos_so_far\n";}
-	  if ($verbose){ warn "Deletions already processed: $deletions_processed, del total: $deletions_total\n\n";}
- 	  if ($MD_pos_so_far >= $del_pos){
-	    if ($verbose){ warn "Here we go, this operation covers the deletion position!!\n";}
- 	    ### splitting up the number of matching bases in number before and after the deletion
-	
- 	    my $pos_after_deletion = $MD_pos_so_far - $del_pos;
- 	    my $pos_before_deletion = $op - $pos_after_deletion;
-	    if ($verbose){  warn "Splitting up previous operation '$op' into pos before deletion: ${pos_before_deletion} and pos_after_deletion: $pos_after_deletion\n";}
-	
-	    $MD_tag .= "${pos_before_deletion}^${deleted_bases}";
-	    $new_MD .= "${pos_before_deletion}^${deleted_bases}${pos_after_deletion}";
-		
-	    #adjusting the MD_position by the number of bases after the deletion
-	    $MD_pos_so_far -= $pos_after_deletion;
-	    if ($verbose){ warn "MD after adjusting for deletion: $MD_pos_so_far\n";	}
-
-	    $deletions_processed += 1;
-	    $this_deletion_processed = 1;
-
-	    if ($deletions_processed == $deletions_total){ # this was the last deletion of the read
-	      if ($verbose){ warn "This was the last deletion in the read ($deletions_processed out of $deletions_total total). Continuing to append \$pos_after_deletion (${pos_after_deletion})..\n";}
-	      $MD_tag .= "${pos_after_deletion}";
-	
-	    }	
-	    else{
-	      if ($verbose){ warn "This wasn't the last deletion in the read. Substituting the last operation with the current deletion and reconstituting \@md\n";}
-	      if ($verbose){ warn "Adding length of deletion string '${pos_before_deletion}^${deleted_bases}' (",length("${pos_before_deletion}^${deleted_bases}")," - length of current operation (",length$op,") to current_md_index\n";}
-	
-	      $current_md_index = $current_md_index + length("${pos_before_deletion}^${deleted_bases}") - length$op;
-	      if ($verbose){  warn "Current index = $current_md_index\n";}
-		
-	      if ($verbose){ warn "Setting \$md_index_already_processed to ",$current_md_index-1,"\n";}
-	      # since we are no longer in the loop we don't have to subtract 1 from $current_md_index (tit hasn't been incremented in the first place...)
-	      $md_index_already_processed = $current_md_index;
-		
-	      if ($verbose){ warn "Exiting now and waiting for the next deletion\n";}
-
-	      $MD_pos_so_far += $len[$index];	
-	      if ($verbose){ warn "MD-tag so far: $MD_tag ~~\n";}
-	    }
-	    ### Finally also adding the length of the deletion to $del_pos
-	    $del_pos += $len[$index];
-	    if ($verbose){ warn "Adding length of the deletion itself (",$len[$index],") to \$del_pos: currently at $del_pos\n";}	
-	  }
-	  else{
-	    die "Something went wrong, we haven't seen a deletion so far even though we should have...\n\n";
-	  }
- 	}
-
-	# forming a new @md
-	@md = split //,$new_MD;
-	$new_MD = '';
-	if ($verbose){ warn "New \@md array: @md\n\n";}
-	if ($verbose){ warn "MD-tag so far: $MD_tag ~~\nnew_MD so far: $new_MD\n\n";}
-
-      }
-      else{
-	die "Found CIGAR operations other than M, I, D or N: '$ops[$index]'. Not allowed at the moment\n";
-      }
-    }
-
-  }
-  if ($verbose){  warn "Returning MD-tag: $MD_tag\n";}
-  return $MD_tag;
-
-}
-
-### Getting rid of the bitwise comparison because even though the initial comparison is nice and quick, the regex loop looking for non-null bytes characters isn't. We might
-### as well do a substring loop to start with, which enables us to generate proper MD:Z: flags that also take proper care of InDels
-# sub make_mismatch_string{
-#   my $actual_seq = shift or die "Missing actual sequence\n";
-#   my $ref_seq = shift or die "Missing reference sequence\n";
-#   my $XX_tag = "XX:Z:";
-
-#   my $tmp = ($actual_seq ^ $ref_seq);                    # Bitwise comparison
-
-#   warn "'$tmp'\n"; sleep(1);
-#   my $prev_mm_pos = 0;
-
-#   while($tmp =~ /[^\0]/g){                               # Where bitwise comparison showed a difference
-#     my $nuc_match = pos($tmp) - $prev_mm_pos - 1;        # Generate number of nucleotide that matches since last mismatch
-#     my $nuc_mm = substr($ref_seq, pos($tmp) - 1, 1) if pos($tmp) <= length($ref_seq);  # Obtain reference nucleotide that was different from the actual read
-#     $XX_tag .= "$nuc_match" if $nuc_match > 0;           # Ignore if mismatches are adjacent to each other
-#     $XX_tag .= "$nuc_mm" if defined $nuc_mm;             # Ignore if there is no mismatch (prevents uninitialized string concatenation)
-#     $prev_mm_pos = pos($tmp);                            # Position of last mismatch
-#   }
-#   my $end_matches = length($ref_seq) - $prev_mm_pos;     # Provides number of matches from last mismatch till end of sequence
-#   $XX_tag .= "$end_matches" if $end_matches > 0;         # Ignore if mismatch is at the end of sequence
-#   return $XX_tag;
-# }
-
-
-
-sub print_helpfile{
-  print << "HOW_TO";
-
-
-     This program is free software: you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published by
-     the Free Software Foundation, either version 3 of the License, or
-     (at your option) any later version.
-
-     This program is distributed in the hope that it will be useful,
-     but WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-     GNU General Public License for more details.
-     You should have received a copy of the GNU General Public License
-     along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-
-
-DESCRIPTION
-
-
-The following is a brief description of command line options and arguments to control the Bismark
-bisulfite mapper and methylation caller. Bismark takes in FastA or FastQ files and aligns the
-reads to a specified bisulfite genome. Sequence reads are transformed into a bisulfite converted forward strand
-version (C->T conversion) or into a bisulfite treated reverse strand (G->A conversion of the forward strand).
-Each of these reads are then aligned to bisulfite treated forward strand index of a reference genome
-(C->T converted) and a bisulfite treated reverse strand index of the genome (G->A conversion of the
-forward strand, by doing this alignments will produce the same positions). These 4 instances of Bowtie (1 or 2)
-are run in parallel. The sequence file(s) are then read in again sequence by sequence to pull out the original
-sequence from the genome and determine if there were any protected C's present or not.
-
-As of version 0.7.0 Bismark will only run 2 alignment threads for OT and OB in parallel, the 4 strand mode can be
-re-enabled by using --non_directional.
-
-The final output of Bismark is in SAM format by default. For Bowtie 1 one can alos choose to report the old
-'vanilla' output format, which is a single tab delimited file with all sequences that have a unique best
-alignment to any of the 4 possible strands of a bisulfite PCR product. Both formats are described in more detail below.
-
-
-USAGE: bismark [options] <genome_folder> {-1 <mates1> -2 <mates2> | <singles>}
-
-
-ARGUMENTS:
-
-<genome_folder>          The path to the folder containing the unmodified reference genome
-                         as well as the subfolders created by the Bismark_Genome_Preparation
-                         script (/Bisulfite_Genome/CT_conversion/ and /Bisulfite_Genome/GA_conversion/).
-                         Bismark expects one or more fastA files in this folder (file extension: .fa
-                         or .fasta). The path can be relative or absolute.
-
--1 <mates1>              Comma-separated list of files containing the #1 mates (filename usually includes
-                         "_1"), e.g. flyA_1.fq,flyB_1.fq). Sequences specified with this option must
-                         correspond file-for-file and read-for-read with those specified in <mates2>.
-                         Reads may be a mix of different lengths. Bismark will produce one mapping result
-                         and one report file per paired-end input file pair.
-
--2 <mates2>              Comma-separated list of files containing the #2 mates (filename usually includes
-                         "_2"), e.g. flyA_1.fq,flyB_1.fq). Sequences specified with this option must
-                         correspond file-for-file and read-for-read with those specified in <mates1>.
-                         Reads may be a mix of different lengths.
-
-<singles>                A comma- or space-separated list of files containing the reads to be aligned (e.g.
-                         lane1.fq,lane2.fq lane3.fq). Reads may be a mix of different lengths. Bismark will
-                         produce one mapping result and one report file per input file.
-
-
-OPTIONS:
-
-
-Input:
-
--q/--fastq               The query input files (specified as <mate1>,<mate2> or <singles> are FASTQ
-                         files (usually having extension .fg or .fastq). This is the default. See also
-                         --solexa-quals.
-
--f/--fasta               The query input files (specified as <mate1>,<mate2> or <singles> are FASTA
-                         files (usually havin extension .fa, .mfa, .fna or similar). All quality values
-                         are assumed to be 40 on the Phred scale. FASTA files are expected to contain both
-                         the read name and the sequence on a single line (and not spread over several lines).
-
--s/--skip <int>          Skip (i.e. do not align) the first <int> reads or read pairs from the input.
-
--u/--upto <int>          Only aligns the first <int> reads or read pairs from the input. Default: no limit.
-
---phred33-quals          FASTQ qualities are ASCII chars equal to the Phred quality plus 33. Default: on.
-
---phred64-quals          FASTQ qualities are ASCII chars equal to the Phred quality plus 64. Default: off.
-
---solexa-quals           Convert FASTQ qualities from solexa-scaled (which can be negative) to phred-scaled
-                         (which can't). The formula for conversion is: 
-                         phred-qual = 10 * log(1 + 10 ** (solexa-qual/10.0)) / log(10). Used with -q. This
-                         is usually the right option for use with (unconverted) reads emitted by the GA
-                         Pipeline versions prior to 1.3. Works only for Bowtie 1. Default: off.
-
---solexa1.3-quals        Same as --phred64-quals. This is usually the right option for use with (unconverted)
-                         reads emitted by GA Pipeline version 1.3 or later. Default: off.
-
---path_to_bowtie         The full path </../../> to the Bowtie (1 or 2) installation on your system. If not
-                         specified it is assumed that Bowtie (1 or 2) is in the PATH.
-
-
-Alignment:
-
--n/--seedmms <int>       The maximum number of mismatches permitted in the "seed", i.e. the first L base pairs
-                         of the read (where L is set with -l/--seedlen). This may be 0, 1, 2 or 3 and the 
-                         default is 1. This option is only available for Bowtie 1 (for Bowtie 2 see -N).
-
--l/--seedlen             The "seed length"; i.e., the number of bases of the high quality end of the read to
-                         which the -n ceiling applies. The default is 28. Bowtie (and thus Bismark) is faster for
-                         larger values of -l. This option is only available for Bowtie 1 (for Bowtie 2 see -L).
-
--e/--maqerr <int>        Maximum permitted total of quality values at all mismatched read positions throughout
-                         the entire alignment, not just in the "seed". The default is 70. Like Maq, bowtie rounds
-                         quality values to the nearest 10 and saturates at 30. This value is not relevant for
-                         Bowtie 2.
-
---chunkmbs <int>         The number of megabytes of memory a given thread is given to store path descriptors in
-                         --best mode. Best-first search must keep track of many paths at once to ensure it is
-                         always extending the path with the lowest cumulative cost. Bowtie tries to minimize the
-                         memory impact of the descriptors, but they can still grow very large in some cases. If
-                         you receive an error message saying that chunk memory has been exhausted in --best mode,
-                         try adjusting this parameter up to dedicate more memory to the descriptors. This value
-                         is not relevant for Bowtie 2. Default: 512.
-
--I/--minins <int>        The minimum insert size for valid paired-end alignments. E.g. if -I 60 is specified and
-                         a paired-end alignment consists of two 20-bp alignments in the appropriate orientation
-                         with a 20-bp gap between them, that alignment is considered valid (as long as -X is also
-                         satisfied). A 19-bp gap would not be valid in that case. Default: 0.
-
--X/--maxins <int>        The maximum insert size for valid paired-end alignments. E.g. if -X 100 is specified and
-                         a paired-end alignment consists of two 20-bp alignments in the proper orientation with a
-                         60-bp gap between them, that alignment is considered valid (as long as -I is also satisfied).
-                         A 61-bp gap would not be valid in that case. Default: 500.
-
---multicore <int>        Sets the number of parallel instances of Bismark to be run concurrently. This forks the
-                         Bismark alignment step very early on so that each individual Spawn of Bismark processes
-                         only every n-th sequence (n being set by --multicore). Once all processes have completed,
-                         the individual BAM files, mapping reports, unmapped or ambiguous FastQ files are merged
-                         into single files in very much the same way as they would have been generated running Bismark
-                         conventionally with only a single instance.
-
-                         If system resources are plentiful this is a viable option to speed up the alignment process
-                         (we observed a near linear speed increase for up to --multicore 8 tested). However, please note
-                         that a typical Bismark run will use several cores already (Bismark itself, 2 or 4 threads of
-                         Bowtie/Bowtie2, Samtools, gzip etc...) and ~10-16GB of memory depending on the choice of aligner
-                         and genome. WARNING: Bismark Parallel (BP?) is resource hungry! Each value of --multicore specified
-                         will effectively lead to a linear increase in compute and memory requirements, so --multicore 4 for
-                         e.g. the GRCm38 mouse genome will probably use ~20 cores and eat ~40GB or RAM, but at the same time
-                         reduce the alignment time to ~25-30%. You have been warned.
-
-
-
-Bowtie 1 Reporting:
-
--k <2>                   Due to the way Bismark works Bowtie will report up to 2 valid alignments. This option
-                         will be used by default.
-
---best                   Make Bowtie guarantee that reported singleton alignments are "best" in terms of stratum
-                         (i.e. number of mismatches, or mismatches in the seed in the case if -n mode) and in
-                         terms of the quality; e.g. a 1-mismatch alignment where the mismatch position has Phred
-                         quality 40 is preferred over a 2-mismatch alignment where the mismatched positions both
-                         have Phred quality 10. When --best is not specified, Bowtie may report alignments that
-                         are sub-optimal in terms of stratum and/or quality (though an effort is made to report
-                         the best alignment). --best mode also removes all strand bias. Note that --best does not
-                         affect which alignments are considered "valid" by Bowtie, only which valid alignments
-                         are reported by Bowtie. Bowtie is about 1-2.5 times slower when --best is specified.
-                         Default: on.
-
---no_best                Disables the --best option which is on by default. This can speed up the alignment process,
-                         e.g. for testing purposes, but for credible results it is not recommended to disable --best.
-
-
-Output:
-
---non_directional        The sequencing library was constructed in a non strand-specific manner, alignments to all four
-                         bisulfite strands will be reported. Default: OFF.
-
-                         (The current Illumina protocol for BS-Seq is directional, in which case the strands complementary
-                         to the original strands are merely theoretical and should not exist in reality. Specifying directional
-                         alignments (which is the default) will only run 2 alignment threads to the original top (OT)
-                         or bottom (OB) strands in parallel and report these alignments. This is the recommended option
-                         for sprand-specific libraries).
-
---pbat                   This options may be used for PBAT-Seq libraries (Post-Bisulfite Adapter Tagging; Kobayashi et al.,
-                         PLoS Genetics, 2012). This is essentially the exact opposite of alignments in 'directional' mode,
-                         as it will only launch two alignment threads to the CTOT and CTOB strands instead of the normal OT
-                         and OB ones. Use this option only if you are certain that your libraries were constructed following
-                         a PBAT protocol (if you don't know what PBAT-Seq is you should not specify this option). The option
-                         --pbat works only for FastQ files (in both Bowtie and Bowtie 2 mode) and using uncompressed
-                         temporary files only).
-
---sam-no-hd              Suppress SAM header lines (starting with @). This might be useful when very large input files are
-                         split up into several smaller files to run concurrently and the output files are to be merged.
-
---quiet                  Print nothing besides alignments.
-
---vanilla                Performs bisulfite mapping with Bowtie 1 and prints the 'old' output (as in Bismark 0.5.X) instead
-                         of SAM format output.
-
--un/--unmapped           Write all reads that could not be aligned to a file in the output directory. Written reads will
-                         appear as they did in the input, without any translation of quality values that may have
-                         taken place within Bowtie or Bismark. Paired-end reads will be written to two parallel files with _1
-                         and _2 inserted in their filenames, i.e. _unmapped_reads_1.txt and unmapped_reads_2.txt. Reads
-                         with more than one valid alignment with the same number of lowest mismatches (ambiguous mapping)
-                         are also written to _unmapped_reads.txt unless the option --ambiguous is specified as well.
-
---ambiguous              Write all reads which produce more than one valid alignment with the same number of lowest
-                         mismatches or other reads that fail to align uniquely to a file in the output directory.
-                         Written reads will appear as they did in the input, without any of the translation of quality
-                         values that may have taken place within Bowtie or Bismark. Paired-end reads will be written to two
-                         parallel files with _1 and _2 inserted in theit filenames, i.e. _ambiguous_reads_1.txt and
-                         _ambiguous_reads_2.txt. These reads are not written to the file specified with --un.
-
--o/--output_dir <dir>    Write all output files into this directory. By default the output files will be written into
-                         the same folder as the input file(s). If the specified folder does not exist, Bismark will attempt
-                         to create it first. The path to the output folder can be either relative or absolute.
-
---temp_dir <dir>         Write temporary files to this directory instead of into the same directory as the input files. If
-                         the specified folder does not exist, Bismark will attempt to create it first. The path to the
-                         temporary folder can be either relative or absolute.
-
---non_bs_mm              Optionally outputs an extra column specifying the number of non-bisulfite mismatches a read during the
-                         alignment step. This option is only available for SAM format. In Bowtie 2 context, this value is
-                         just the number of actual non-bisulfite mismatches and ignores potential insertions or deletions.
-                         The format for single-end reads and read 1 of paired-end reads is 'XA:Z:number of mismatches'
-                         and 'XB:Z:number of mismatches' for read 2 of paired-end reads.
-
---gzip                   Temporary bisulfite conversion files will be written out in a GZIP compressed form to save disk
-                         space. This option is available for most alignment modes but is not available for paired-end FastA
-                         files. This option might be somewhat slower than writing out uncompressed files, but this awaits
-                         further testing.
-
---sam                    The output will be written out in SAM format instead of the default BAM format. Bismark will
-                         attempt to use the path to Samtools that was specified with '--samtools_path', or, if it hasn't
-                         been specified, attempt to find Samtools in the PATH. If no installation of Samtools can be found,
-                         the SAM output will be compressed with GZIP instead (yielding a .sam.gz output file).
-
---samtools_path          The path to your Samtools installation, e.g. /home/user/samtools/. Does not need to be specified
-                         explicitly if Samtools is in the PATH already.
-
---prefix <prefix>        Prefixes <prefix> to the output filenames. Trailing dots will be replaced by a single one. For
-                         example, '--prefix test' with 'file.fq' would result in the output file 'test.file.fq_bismark.sam' etc.
-
--B/--basename <basename> Write all output to files starting with this base file name. For example, '--basename foo'
-                         would result in the files 'foo.sam' and 'foo_SE_report.txt' (or its paired-end equivalent). Takes
-                         precedence over --prefix.
-
---old_flag               Only in paired-end SAM mode, uses the FLAG values used by Bismark v0.8.2 and before. In addition,
-                         this options appends /1 and /2 to the read IDs for reads 1 and 2 relative to the input file. Since
-                         both the appended read IDs and custom FLAG values may cause problems with some downstream tools 
-                         such as Picard, new defaults were implemented as of version 0.8.3.
-
-
-                                             default                         old_flag
-                                       ===================              ===================
-                                       Read 1       Read 2              Read 1       Read 2
-
-                              OT:         99          147                  67          131
-
-                              OB:         83          163                 115          179
-
-                              CTOT:       99          147                  67          131
-
-                              CTOB:       83          163                 115          179
-
-
-Other:
-
--h/--help                Displays this help file.
-
--v/--version             Displays version information.
-
-
-BOWTIE 2 SPECIFIC OPTIONS
-
---bowtie2                Uses Bowtie 2 instead of Bowtie 1. Bismark limits Bowtie 2 to only perform end-to-end
-                         alignments, i.e. searches for alignments involving all read characters (also called 
-                         untrimmed or unclipped alignments). Bismark assumes that raw sequence data is adapter
-                         and/or quality trimmed where appropriate. Both small (.bt2) and large (.bt2l) Bowtie 2
-                         indexes are supported. Default: off.
-
-Bowtie 2 alignment options:
-
--N <int>                 Sets the number of mismatches to allowed in a seed alignment during multiseed alignment.
-                         Can be set to 0 or 1. Setting this higher makes alignment slower (often much slower)
-                         but increases sensitivity. Default: 0. This option is only available for Bowtie 2 (for
-                         Bowtie 1 see -n).
-
--L <int>                 Sets the length of the seed substrings to align during multiseed alignment. Smaller values
-                         make alignment slower but more senstive. Default: the --sensitive preset of Bowtie 2 is
-                         used by default, which sets -L to 20. This option is only available for Bowtie 2 (for
-                         Bowtie 1 see -l).
-
---ignore-quals           When calculating a mismatch penalty, always consider the quality value at the mismatched
-                         position to be the highest possible, regardless of the actual value. I.e. input is treated
-                         as though all quality values are high. This is also the default behavior when the input
-                         doesn't specify quality values (e.g. in -f mode). This option is invariable and on by default.
-
-
-Bowtie 2 paired-end options:
-
---no-mixed               This option disables Bowtie 2's behavior to try to find alignments for the individual mates if
-                         it cannot find a concordant or discordant alignment for a pair. This option is invariable and
-                         and on by default.
-
---no-discordant          Normally, Bowtie 2 looks for discordant alignments if it cannot find any concordant alignments.
-                         A discordant alignment is an alignment where both mates align uniquely, but that does not
-                         satisfy the paired-end constraints (--fr/--rf/--ff, -I, -X). This option disables that behavior
-                         and it is on by default.
-
-
-Bowtie 2 effort options:
-
--D <int>                 Up to <int> consecutive seed extension attempts can "fail" before Bowtie 2 moves on, using
-                         the alignments found so far. A seed extension "fails" if it does not yield a new best or a
-                         new second-best alignment. Default: 15.
-
--R <int>                 <int> is the maximum number of times Bowtie 2 will "re-seed" reads with repetitive seeds.
-                         When "re-seeding," Bowtie 2 simply chooses a new set of reads (same length, same number of
-                         mismatches allowed) at different offsets and searches for more alignments. A read is considered
-                         to have repetitive seeds if the total number of seed hits divided by the number of seeds
-                         that aligned at least once is greater than 300. Default: 2.
-
-Bowtie 2 parallelization options:
-
-
--p NTHREADS              Launch NTHREADS parallel search threads (default: 1). Threads will run on separate processors/cores
-                         and synchronize when parsing reads and outputting alignments. Searching for alignments is highly
-                         parallel, and speedup is close to linear. Increasing -p increases Bowtie 2's memory footprint.
-                         E.g. when aligning to a human genome index, increasing -p from 1 to 8 increases the memory footprint
-                         by a few hundred megabytes. This option is only available if bowtie is linked with the pthreads
-                         library (i.e. if BOWTIE_PTHREADS=0 is not specified at build time). In addition, this option will
-                         automatically use the option '--reorder', which guarantees that output SAM records are printed in
-                         an order corresponding to the order of the reads in the original input file, even when -p is set
-                         greater than 1 (Bismark requires the Bowtie 2 output to be this way). Specifying --reorder and
-                         setting -p greater than 1 causes Bowtie 2 to run somewhat slower and use somewhat more memory then
-                         if --reorder were not specified. Has no effect if -p is set to 1, since output order will naturally
-                         correspond to input order in that case.
-
-Bowtie 2 Scoring options:
-
---score_min <func>       Sets a function governing the minimum alignment score needed for an alignment to be considered
-                         "valid" (i.e. good enough to report). This is a function of read length. For instance, specifying
-                         L,0,-0.2 sets the minimum-score function f to f(x) = 0 + -0.2 * x, where x is the read length.
-                         See also: setting function options at http://bowtie-bio.sourceforge.net/bowtie2. The default is
-                         L,0,-0.2.
-
---rdg <int1>,<int2>      Sets the read gap open (<int1>) and extend (<int2>) penalties. A read gap of length N gets a penalty
-                         of <int1> + N * <int2>. Default: 5, 3.
-
---rfg <int1>,<int2>      Sets the reference gap open (<int1>) and extend (<int2>) penalties. A reference gap of length N gets
-                         a penalty of <int1> + N * <int2>. Default: 5, 3.
-
-
-Bowtie 2 Reporting options:
-
--most_valid_alignments <int> This used to be the Bowtie 2 parameter -M. As of Bowtie 2 version 2.0.0 beta7 the option -M is
-                         deprecated. It will be removed in subsequent versions. What used to be called -M mode is still the
-                         default mode, but adjusting the -M setting is deprecated.  Use the -D and -R options to adjust the
-                         effort expended to find valid alignments.
-
-                         For reference, this used to be the old (now deprecated) description of -M:
-                         Bowtie 2 searches for at most <int>+1 distinct, valid alignments for each read. The search terminates when it
-                         can't find more distinct valid alignments, or when it finds <int>+1 distinct alignments, whichever
-                         happens first. Only the best alignment is reported. Information from the other alignments is used to
-                         estimate mapping quality and to set SAM optional fields, such as AS:i and XS:i. Increasing -M makes 
-                         Bowtie 2 slower, but increases the likelihood that it will pick the correct alignment for a read that
-                         aligns many places. For reads that have more than <int>+1 distinct, valid alignments, Bowtie 2 does not
-                         guarantee that the alignment reported is the best possible in terms of alignment score. -M is
-                         always used and its default value is set to 10.
-
-
-'VANILLA' Bismark  OUTPUT:
-
-Single-end output format (tab-separated):
-
- (1) <seq-ID>
- (2) <read alignment strand>
- (3) <chromosome>
- (4) <start position>
- (5) <end position>
- (6) <observed bisulfite sequence>
- (7) <equivalent genomic sequence>
- (8) <methylation call>
- (9) <read conversion
-(10) <genome conversion>
-(11) <read quality score (Phred33)>
-
-
-Paired-end output format (tab-separated):
- (1) <seq-ID>
- (2) <read 1 alignment strand>
- (3) <chromosome>
- (4) <start position>
- (5) <end position>
- (6) <observed bisulfite sequence 1>
- (7) <equivalent genomic sequence 1>
- (8) <methylation call 1>
- (9) <observed bisulfite sequence 2>
-(10) <equivalent genomic sequence 2>
-(11) <methylation call 2>
-(12) <read 1 conversion
-(13) <genome conversion>
-(14) <read 1 quality score (Phred33)>
-(15) <read 2 quality score (Phred33)>
-
-
-Bismark SAM OUTPUT (default):
-
- (1) QNAME  (seq-ID)
- (2) FLAG   (this flag tries to take the strand a bisulfite read originated from into account (this is different from ordinary DNA alignment flags!))
- (3) RNAME  (chromosome)
- (4) POS    (start position)
- (5) MAPQ   (always 255 for use with Bowtie)
- (6) CIGAR
- (7) RNEXT
- (8) PNEXT
- (9) TLEN
-(10) SEQ
-(11) QUAL   (Phred33 scale)
-(12) NM-tag (edit distance to the reference)
-(13) MD-tag (base-by-base mismatches to the reference (handles indels)
-(14) XM-tag (methylation call string)
-(15) XR-tag (read conversion state for the alignment)
-(16) XG-tag (genome conversion state for the alignment)
-(17) XA/XB-tag (non-bisulfite mismatches) (optional!)
-
-Each read of paired-end alignments is written out in a separate line in the above format.
-
-
-Last edited on 06 May 2015.
-
-HOW_TO
-}
--- a/new/bismark_genome_preparation	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,468 +0,0 @@
-#!/usr/bin/perl --
-use strict;
-use warnings;
-use Cwd;
-# use File::Path qw(rmtree);
-$|++;
-
-
-## This program is Copyright (C) 2010-15, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-use Getopt::Long;
-use Cwd;
-
-my $verbose;
-my $help;
-my $version;
-my $man;
-my $path_to_bowtie;
-my $multi_fasta;
-my $single_fasta;
-my $bowtie2;
-
-my $bismark_version = 'v0.14.3';
-
-GetOptions ('verbose' => \$verbose,
-	    'help' => \$help,
-	    'man' => \$man,
-	    'version' => \$version,
-	    'path_to_bowtie:s' => \$path_to_bowtie,
-	    'single_fasta' => \$single_fasta,
-	    'bowtie2' => \$bowtie2,
-	   );
-
-if ($help or $man){
-  print_helpfile();
-  exit;
-}
-
-if ($version){
-  print << "VERSION";
-
-          Bismark - Bisulfite Mapper and Methylation Caller.
-
-          Bismark Genome Preparation Version: $bismark_version
-        Copyright 2010-15 Felix Krueger, Babraham Bioinformatics
-              www.bioinformatics.babraham.ac.uk/projects/
-
-VERSION
-    exit;
-}
-
-my $genome_folder = shift @ARGV; # mandatory
-my %chromosomes; # checking if chromosome names are unique (required)
-
-# Ensuring a genome folder has been specified
-if ($genome_folder){
-  unless ($genome_folder =~ /\/$/){
-    $genome_folder =~ s/$/\//;
-  }
-  $verbose and print "Path to genome folder specified as: $genome_folder\n";
-  chdir $genome_folder or die "Could't move to directory $genome_folder. Make sure the directory exists! $!";
-
-  # making the genome folder path abolsolute so it won't break if the path was specified relative
-  $genome_folder = getcwd;
-  unless ($genome_folder =~ /\/$/){
-    $genome_folder =~ s/$/\//;
-  }
-}
-else{
-  die "Please specify a genome folder to be used for bisulfite conversion\n\n";
-}
-
-
-my $CT_dir;
-my $GA_dir;
-
-
-if ($single_fasta){
-  print "Writing individual genomes out into single-entry fasta files (one per chromosome)\n\n";
-  $multi_fasta = 0;
-}
-else{
-  print "Writing bisulfite genomes out into a single MFA (multi FastA) file\n\n";
-  $single_fasta = 0;
-  $multi_fasta = 1;
-}
-
-my @filenames = create_bisulfite_genome_folders();
-
-process_sequence_files ();
-
-launch_bowtie_indexer();
-
-sub launch_bowtie_indexer{
-  if ($bowtie2){
-    print "Bismark Genome Preparation - Step III: Launching the Bowtie 2 indexer\n";
-  }
-  else{
-    print "Bismark Genome Preparation - Step III: Launching the Bowtie (1) indexer\n";
-  }
-  print "Please be aware that this process can - depending on genome size - take up to several hours!\n";
-  sleep(5);
-
-  ### if the path to bowtie was specfified explicitely
-  if ($path_to_bowtie){
-    if ($bowtie2){
-      $path_to_bowtie =~ s/$/bowtie2-build/;
-    }
-    else{
-      $path_to_bowtie =~ s/$/bowtie-build/;
-    }
-  }
-  ### otherwise we assume that bowtie-build is in the path
-  else{
-    if ($bowtie2){
-      $path_to_bowtie = 'bowtie2-build';
-    }
-    else{
-      $path_to_bowtie = 'bowtie-build';
-    }
-  }
-
-  $verbose and print "\n";
-
-  ### Forking the program to run 2 instances of Bowtie-build or Bowtie2-build (= the Bowtie (1/2) indexer)
-  my $pid = fork();
-
-  # parent process
-  if ($pid){
-    sleep(1);
-    chdir $CT_dir or die "Unable to change directory: $!\n";
-    $verbose and warn "Preparing indexing of CT converted genome in $CT_dir\n";
-    my @fasta_files = <*.fa>;
-    my $file_list = join (',',@fasta_files);
-    $verbose and print "Parent process: Starting to index C->T converted genome with the following command:\n\n";
-    $verbose and print "$path_to_bowtie -f $file_list BS_CT\n\n";
-
-    sleep (11);
-    exec ("$path_to_bowtie","-f","$file_list","BS_CT");
-  }
-
-  # child process
-  elsif ($pid == 0){
-    sleep(2);
-    chdir $GA_dir or die "Unable to change directory: $!\n";
-    $verbose and warn "Preparing indexing of GA converted genome in $GA_dir\n";
-    my @fasta_files = <*.fa>;
-    my $file_list = join (',',@fasta_files);
-    $verbose and print "Child process: Starting to index G->A converted genome with the following command:\n\n";
-    $verbose and print "$path_to_bowtie -f $file_list BS_GA\n\n";
-    $verbose and print "(starting in 10 seconds)\n";
-    sleep(10);
-    exec ("$path_to_bowtie","-f","$file_list","BS_GA");
-  }
-
-  # if the platform doesn't support the fork command we will run the indexing processes one after the other
-  else{
-    print "Forking process was not successful, therefore performing the indexing sequentially instead\n";
-    sleep(10);
-
-    ### moving to CT genome folder
-    $verbose and warn "Preparing to index CT converted genome in $CT_dir\n";
-    chdir $CT_dir or die "Unable to change directory: $!\n";
-    my @fasta_files = <*.fa>;
-    my $file_list = join (',',@fasta_files);
-    $verbose and print "$file_list\n\n";
-    sleep(2);
-    system ("$path_to_bowtie","-f","$file_list","BS_CT");
-    @fasta_files=();
-    $file_list= '';
-
-    ### moving to GA genome folder
-    $verbose and warn "Preparing to index GA converted genome in $GA_dir\n";
-    chdir $GA_dir or die "Unable to change directory: $!\n";
-    @fasta_files = <*.fa>;
-    $file_list = join (',',@fasta_files);
-    $verbose and print "$file_list\n\n";
-    sleep(2);
-    exec ("$path_to_bowtie","-f","$file_list","BS_GA");
-  }
-}
-
-
-sub process_sequence_files {
-
-  my ($total_CT_conversions,$total_GA_conversions) = (0,0);
-  $verbose and print "Bismark Genome Preparation - Step II: Bisulfite converting reference genome\n\n";
-  sleep (3);
-
-  $verbose and print "conversions performed:\n";
-  $verbose and print join("\t",'chromosome','C->T','G->A'),"\n";
-
-
-  ### If someone wants to index a genome which consists of thousands of contig and scaffold files we need to write the genome conversions into an MFA file
-  ### Otherwise the list of comma separated chromosomes we provide for bowtie-build will get too long for the kernel to handle
-  ### This is now the default option
-
-  if ($multi_fasta){
-    ### Here we just use one multi FastA file name, append .CT_conversion or .GA_conversion and print all sequence conversions into these files
-    my $bisulfite_CT_conversion_filename = "$CT_dir/genome_mfa.CT_conversion.fa";
-    open (CT_CONVERT,'>',$bisulfite_CT_conversion_filename) or die "Can't write to file $bisulfite_CT_conversion_filename: $!\n";
-
-    my $bisulfite_GA_conversion_filename = "$GA_dir/genome_mfa.GA_conversion.fa";
-    open (GA_CONVERT,'>',$bisulfite_GA_conversion_filename) or die "Can't write to file $bisulfite_GA_conversion_filename: $!\n";
-  }
-
-  foreach my $filename(@filenames){
-    my ($chromosome_CT_conversions,$chromosome_GA_conversions) = (0,0);
-    open (IN,$filename) or die "Failed to read from sequence file $filename $!\n";
-    # warn "Reading chromosome information from $filename\n\n";
-
-    ### first line needs to be a fastA header
-    my $first_line = <IN>;
-    chomp $first_line;
-
-    ### Extracting chromosome name from the FastA header
-    my $chromosome_name = extract_chromosome_name($first_line);
-
-    ### Exiting if a chromosome with the same name was present already
-    if (exists $chromosomes{$chromosome_name}){
-      die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name!\n";
-    }
-    else{
-      $chromosomes{$chromosome_name}++;
-    }
-
-    ### alternatively, chromosomes can be written out into single-entry FastA files. This will only work for genomes with up to a few hundred chromosomes.
-    unless ($multi_fasta){
-      my $bisulfite_CT_conversion_filename = "$CT_dir/$chromosome_name";
-      $bisulfite_CT_conversion_filename =~ s/$/.CT_conversion.fa/;
-      open (CT_CONVERT,'>',$bisulfite_CT_conversion_filename) or die "Can't write to file $bisulfite_CT_conversion_filename: $!\n";
-
-      my $bisulfite_GA_conversion_filename = "$GA_dir/$chromosome_name";
-      $bisulfite_GA_conversion_filename =~ s/$/.GA_conversion.fa/;
-      open (GA_CONVERT,'>',$bisulfite_GA_conversion_filename) or die "Can't write to file $bisulfite_GA_conversion_filename: $!\n";
-    }
-
-    print CT_CONVERT ">",$chromosome_name,"_CT_converted\n"; # first entry
-    print GA_CONVERT ">",$chromosome_name,"_GA_converted\n"; # first entry
-
-
-    while (<IN>){
-
-      ### in case the line is a new fastA header
-      if ($_ =~ /^>/){
-	### printing out the stats for the previous chromosome
-	$verbose and print join ("\t",$chromosome_name,$chromosome_CT_conversions,$chromosome_GA_conversions),"\n";
-	### resetting the chromosome transliteration counters
-	($chromosome_CT_conversions,$chromosome_GA_conversions) = (0,0);
-	
-	### Extracting chromosome name from the additional FastA header
-	$chromosome_name = extract_chromosome_name($_);
-
-	### alternatively, chromosomes can be written out into single-entry FastA files. This will only work for genomes with up to a few hundred chromosomes.
-	unless ($multi_fasta){
-	  my $bisulfite_CT_conversion_filename = "$CT_dir/$chromosome_name";
-	  $bisulfite_CT_conversion_filename =~ s/$/.CT_conversion.fa/;
-	  open (CT_CONVERT,'>',$bisulfite_CT_conversion_filename) or die "Can't write to file $bisulfite_CT_conversion_filename: $!\n";
-	
-	  my $bisulfite_GA_conversion_filename = "$GA_dir/$chromosome_name";
-	  $bisulfite_GA_conversion_filename =~ s/$/.GA_conversion.fa/;
-	  open (GA_CONVERT,'>',$bisulfite_GA_conversion_filename) or die "Can't write to file $bisulfite_GA_conversion_filename: $!\n";
-	}
-
-	print CT_CONVERT ">",$chromosome_name,"_CT_converted\n";
-	print GA_CONVERT ">",$chromosome_name,"_GA_converted\n";
-      }
-
-      else{
-	my $sequence = uc$_;
-
-	### (I) First replacing all ambiguous sequence characters (such as M,S,R....) by N (G,A,T,C,N and the line endings \r and \n are added to a character group)
-	
-	$sequence =~ s/[^ATCGN\n\r]/N/g;
-	
-	### (II) Writing the chromosome out into a C->T converted version (equals forward strand conversion)
-	
-	my $CT_sequence = $sequence;
-	my $CT_transliterations_performed = ($CT_sequence =~ tr/C/T/); # converts all Cs into Ts
-	$total_CT_conversions += $CT_transliterations_performed;
-	$chromosome_CT_conversions += $CT_transliterations_performed;
-	
-	print CT_CONVERT $CT_sequence;
-	
-	### (III) Writing the chromosome out in a G->A converted version of the forward strand (this is equivalent to reverse-
-	### complementing the forward strand and then C->T converting it)
-	
-	my $GA_sequence = $sequence;
-	my $GA_transliterations_performed = ($GA_sequence =~ tr/G/A/); # converts all Gs to As on the forward strand
-	$total_GA_conversions += $GA_transliterations_performed;
-	$chromosome_GA_conversions += $GA_transliterations_performed;
-	
-	print GA_CONVERT $GA_sequence;
-	
-      }
-    }
-    $verbose and print join ("\t",$chromosome_name,$chromosome_CT_conversions,$chromosome_GA_conversions),"\n";
-  }
-  close (CT_CONVERT) or die "Failed to close filehandle: $!\n";
-  close (GA_CONVERT) or die "Failed to close filehandle: $!\n";
-
-
-  print "\nTotal number of conversions performed:\n";
-  print "C->T:\t$total_CT_conversions\n";
-  print "G->A:\t$total_GA_conversions\n";
-
-  warn "\nStep II - Genome bisulfite conversions - completed\n\n\n";
-}
-
-sub extract_chromosome_name {
-
-  my $header = shift;
-
-  ## Bowtie extracts the first string after the initial > in the FASTA file, so we are doing this as well
-
-  if ($header =~ s/^>//){
-    my ($chromosome_name) = split (/\s+/,$header);
-    return $chromosome_name;
-  }
-  else{
-    die "The specified chromosome file doesn't seem to be in FASTA format as required! $!\n";
-  }
-}
-
-sub create_bisulfite_genome_folders{
-
-  $verbose and print "Bismark Genome Preparation - Step I: Preparing folders\n\n";
-
-  if ($path_to_bowtie){
-    unless ($path_to_bowtie =~ /\/$/){
-      $path_to_bowtie =~ s/$/\//;
-    }
-    if (chdir $path_to_bowtie){
-      if ($bowtie2){
-	$verbose and print "Path to Bowtie 2 specified: $path_to_bowtie\n";
-      }
-      else{
-	$verbose and print "Path to Bowtie (1) specified: $path_to_bowtie\n";
-      }
-    }
-    else{
-      die "There was an error with the path to bowtie: $!\n";
-    }
-  }
-
-  chdir $genome_folder or die "Could't move to directory $genome_folder. Make sure the directory exists! $!";
-
-
-  # Exiting unless there are fastA files in the folder
-  my @filenames = <*.fa>;
-
-  ### if there aren't any genomic files with the extension .fa we will look for files with the extension .fasta
-  unless (@filenames){
-    @filenames =  <*.fasta>;
-  }
-
-  unless (@filenames){
-    die "The specified genome folder $genome_folder does not contain any sequence files in FastA format (with .fa or .fasta file extensions\n";
-  }
-
-  warn "Bisulfite Genome Indexer version $bismark_version (last modified 19 Sept 2013)\n\n";
-  sleep (3);
-
-  # creating a directory inside the genome folder to store the bisfulfite genomes unless it already exists
-  my $bisulfite_dir = "${genome_folder}Bisulfite_Genome/";
-  unless (-d $bisulfite_dir){
-    mkdir $bisulfite_dir or die "Unable to create directory $bisulfite_dir $!\n";
-    $verbose and print "Created Bisulfite Genome folder $bisulfite_dir\n";
-  }
-  else{
-    print "\nA directory called $bisulfite_dir already exists. Bisulfite converted sequences and/or already existing Bowtie (1 or 2) indices will be overwritten!\n\n";
-    sleep(5);
-  }
-
-  chdir $bisulfite_dir or die "Unable to move to $bisulfite_dir\n";
-  $CT_dir = "${bisulfite_dir}CT_conversion/";
-  $GA_dir = "${bisulfite_dir}GA_conversion/";
-
-  # creating 2 subdirectories to store a C->T (forward strand conversion) and a G->A (reverse strand conversion)
-  # converted version of the genome
-  unless (-d $CT_dir){
-    mkdir $CT_dir or die "Unable to create directory $CT_dir $!\n";
-    $verbose and print "Created Bisulfite Genome folder $CT_dir\n";
-  }
-  unless (-d $GA_dir){
-    mkdir $GA_dir or die "Unable to create directory $GA_dir $!\n";
-    $verbose and print "Created Bisulfite Genome folder $GA_dir\n";
-  }
-
-  # moving back to the original genome folder
-  chdir $genome_folder or die "Could't move to directory $genome_folder $!";
-  # $verbose and print "Moved back to genome folder folder $genome_folder\n";
-  warn "\nStep I - Prepare genome folders - completed\n\n\n";
-  return @filenames;
-}
-
-sub print_helpfile{
-  print << 'HOW_TO';
-
-
-DESCRIPTION
-
-This script is supposed to convert a specified reference genome into two different bisulfite
-converted versions and index them for alignments with Bowtie 1 (default), or Bowtie 2. The first
-bisulfite genome will have all Cs converted to Ts (C->T), and the other one will have all Gs
-converted to As (G->A). Both bisulfite genomes will be stored in subfolders within the reference
-genome folder. Once the bisulfite conversion has been completed the program will fork and launch
-two simultaneous instances of the Bowtie 1 or 2 indexer (bowtie-build or bowtie2-build). Be aware
-that the indexing process can take up to several hours; this will mainly depend on genome size
-and system resources.
-
-
-
-The following is a brief description of command line options and arguments to control the
-Bismark Genome Preparation:
-
-
-USAGE: bismark_genome_preparation [options] <arguments>
-
-
-OPTIONS:
-
---help/--man             Displays this help filea and exits.
-
---version                Displays version information and exits.
-
---verbose                Print verbose output for more details or debugging.
-
---path_to_bowtie </../>  The full path to the Bowtie 1 or Bowtie 2 installation on your system
-                         (depending on which aligner/indexer you intend to use). Unless this path
-                         is specified it is assumed that Bowtie is in the PATH.
-
---bowtie2                This will create bisulfite indexes for Bowtie 2. (Default: Bowtie 1).
-
---single_fasta           Instruct the Bismark Indexer to write the converted genomes into
-                         single-entry FastA files instead of making one multi-FastA file (MFA)
-                         per chromosome. This might be useful if individual bisulfite converted
-                         chromosomes are needed (e.g. for debugging), however it can cause a
-                         problem with indexing if the number of chromosomes is vast (this is likely
-                         to be in the range of several thousand files; the operating system can
-                         only handle lists up to a certain length, and some newly assembled
-                         genomes may contain 20000-50000 contigs of scaffold files which do exceed
-                         this list length limit).
-
-
-ARGUMENTS:
-
-<path_to_genome_folder>  The path to the folder containing the genome to be bisulfite converted.
-                         The Bismark Genome Preparation expects one or more fastA files in the folder
-                         (with the file extension: .fa or .fasta). Specifying this path is mandatory.
-
-
-This script was last modified on 16 Oct 2014.
-HOW_TO
-}
--- a/new/bismark_methylation_extractor	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,5875 +0,0 @@
-#!/usr/bin/perl
-use warnings;
-use strict;
-$|++;
-use Getopt::Long;
-use Cwd;
-use Carp;
-use FindBin qw($Bin);
-use lib "$Bin/../lib";
-
-## This program is Copyright (C) 2010-15, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-my @filenames; # input files
-my %counting;
-my $parent_dir = getcwd();
-
-my %fhs;
-
-my $version = 'v0.14.3';
-my ($ignore,$genomic_fasta,$single,$paired,$full,$report,$no_overlap,$merge_non_CpG,$vanilla,$output_dir,$no_header,$bedGraph,$remove,$coverage_threshold,$counts,$cytosine_report,$genome_folder,$zero,$CpG_only,$CX_context,$split_by_chromosome,$sort_size,$samtools_path,$gzip,$ignore_r2,$mbias_off,$mbias_only,$gazillion,$ample_mem,$ignore_3prime,$ignore_3prime_r2,$multicore) = process_commandline();
-
-
-### only needed for bedGraph output
-my @sorting_files; # if files are to be written to bedGraph format, these are the methylation extractor output files
-my @methylcalls = qw (0 0 0); # [0] = methylated, [1] = unmethylated, [2] = total
-my @bedfiles;
-
-### only needed for genome-wide cytosine methylation report
-my %chromosomes;
-
-my %mbias_1;
-my %mbias_2;
-
-
-##############################################################################################
-### Summarising Run Parameters
-##############################################################################################
-
-### METHYLATION EXTRACTOR
-
-warn "Summarising Bismark methylation extractor parameters:\n";
-warn '='x63,"\n";
-
-if ($single){
-  if ($vanilla){
-    warn "Bismark single-end vanilla format specified\n";
-  }
-  else{
-    warn "Bismark single-end SAM format specified (default)\n"; # default
-  }
-}
-elsif ($paired){
-  if ($vanilla){
-    warn "Bismark paired-end vanilla format specified\n";
-  }
-  else{
-    warn "Bismark paired-end SAM format specified (default)\n"; # default
-  }
-}
-
-warn "Number of cores to be used: $multicore\n";
-
-if ($single){
-  if ($ignore){
-    warn "First $ignore bp will be disregarded when processing the methylation call string\n";
-  }
-  if ($ignore_3prime){
-    warn "Last $ignore_3prime bp will be disregarded when processing the methylation call string\n";
-  }
-
-}
-else{ ## paired-end
-  if ($ignore){
-    warn "First $ignore bp will be disregarded when processing the methylation call string of Read 1\n";
-  }
-  if ($ignore_r2){
-    warn "First $ignore_r2 bp will be disregarded when processing the methylation call string of Read 2\n";
-  }
-
-  if ($ignore_3prime){
-    warn "Last $ignore_3prime bp will be disregarded when processing the methylation call string of Read 1\n";
-  }
-  if ($ignore_3prime_r2){
-    warn "Last $ignore_3prime_r2 bp will be disregarded when processing the methylation call string of Read 2\n";
-  }
-
-
-}
-
-
-if ($full){
-  warn "Strand-specific outputs will be skipped. Separate output files for cytosines in CpG, CHG and CHH context will be generated\n";
-}
-if ($merge_non_CpG){
-  warn "Merge CHG and CHH context to non-CpG context specified\n";
-}
-### output directory
-if ($output_dir eq ''){
-  warn "Output will be written to the current directory ('$parent_dir')\n";
-}
-else{
-  warn "Output path specified as: $output_dir\n";
-}
-
-
-sleep (1);
-
-### BEDGRAPH
-
-if ($bedGraph){
-  warn "\n\nSummarising bedGraph parameters:\n";
-  warn '='x63,"\n";
-
-  if ($counts){
-    warn "Generating additional output in bedGraph and coverage format\nbedGraph format:\t<Chromosome> <Start Position> <End Position> <Methylation Percentage>\ncoverage format:\t<Chromosome> <Start Position> <End Position> <Methylation Percentage> <count methylated> <count non-methylated>\n\n";
-  }
-  else{
-    warn "Generating additional sorted output in bedGraph format (output format: <Chromosome> <Start Position> <End Position> <Methylation Percentage>)\n";
-  }
-
-  ### Zero-based coordinates
-  if ($zero){
-    warn "Writing out an additional coverage file (ending in zero.cov) with 0-based start and 1-based end genomic coordinates (zero-based, half-open; user-defined)\n";
-  }
-
-  warn "Using a cutoff of $coverage_threshold read(s) to report cytosine positions\n";
-
-  if ($CX_context){
-    warn "Reporting and sorting methylation information for all cytosine context (sorting may take a long time, you have been warned ...)\n";
-  }
-  else{ # default
-    $CpG_only = 1;
-    warn "Reporting and sorting cytosine methylation information in CpG context only (default)\n";
-  }
-
-  if ($remove){
-    warn "White spaces in read ID names will be removed prior to sorting\n";
-  }
-
-  if ($ample_mem){
-    warn "Sorting chromosomal postions for the bedGraph step using arrays instead of using UNIX sort\n";
-  }
-  elsif (defined $sort_size){
-    warn "The bedGraph UNIX sort command will use the following memory setting:\t'$sort_size'. Temporary directory used for sorting is the output directory\n";
-  }
-  else{
-    warn "Setting a default memory usage for the bedGraph UNIX sort command to 2GB\n";
-  }
-
-
-
-  sleep (1);
-
-  if ($cytosine_report){
-    warn "\n\nSummarising genome-wide cytosine methylation report parameters:\n";
-    warn '='x63,"\n";
-    warn "Generating comprehensive genome-wide cytosine report\n(output format: <Chromosome> <Position> <Strand> <count methylated> <count non-methylated>  <C-context>  <trinucleotide context> )\n";
-
-
-    if ($CX_context){
-      warn "Reporting methylation for all cytosine contexts. Be aware that this will generate enormous files\n";
-    }
-    else{ # default
-      $CpG_only = 1;
-      warn "Reporting cytosine methylation in CpG context only (default)\n";
-    }
-
-    if ($split_by_chromosome){
-      warn "Splitting the cytosine report output up into individual files for each chromosome\n";
-    }
-
-    ### Zero-based coordinates
-    if ($zero){
-      warn "Using zero-based start and 1-based end genomic coordinates (zero-based, half-open; user-defined)\n";
-    }
-    else{ # default, 1-based coords
-      warn "Using 1-based genomic coordinates (default)\n";
-    }
-
-    ### GENOME folder
-    if ($genome_folder){
-      unless ($genome_folder =~/\/$/){
-	$genome_folder =~ s/$/\//;
-      }
-      warn "Genome folder was specified as $genome_folder\n";
-    }
-    else{
-      $genome_folder  = '/data/public/Genomes/Mouse/NCBIM37/';
-      warn "Using the default genome folder /data/public/Genomes/Mouse/NCBIM37/\n";
-    }
-    sleep (1);
-  }
-}
-
-warn "\n";
-sleep (1);
-
-######################################################
-### PROCESSING FILES
-######################################################
-
-foreach my $filename (@filenames){
-  # resetting counters and filehandles
-  %fhs = ();
-  %counting =(
-	      total_meCHG_count            => 0,
-	      total_meCHH_count            => 0,
-	      total_meCpG_count            => 0,
-	      total_unmethylated_CHG_count => 0,
-	      total_unmethylated_CHH_count => 0,
-	      total_unmethylated_CpG_count => 0,
-	      sequences_count              => 0,
-	      methylation_call_strings     => 0,
-	     );
-
-  @sorting_files = ();
-  @bedfiles = ();
-
-  %mbias_1 = ();
-  %mbias_2 = ();
-
-
-  ### performing a quick check to see if a paired-end SAM file has been sorted by positions which does interfere with the logic used by the extractor
-  unless ($vanilla){
-    if ($paired){
-      test_positional_sorting($filename);
-    }
-  }
-
-  my ($pid,$pids,$report_basename) = process_Bismark_results_file($filename);
-
-  if ($pid == 0){
-    warn "Finished processing child process. Exiting..\n";
-
-    #  ### Closing all filehandles of the child process so that the Bismark methylation extractor output doesn't get truncated due to buffering issues
-    #     foreach my $fh (keys %fhs) {
-    #       if ($fh =~ /^[1230]$/) {
-    # 	foreach my $context (keys %{$fhs{$fh}}) {
-    # 	  $fhs{$fh}->{$context}->flush;
-    # 	}
-    #       }
-    #       else{
-    # 	$fhs{$fh}->flush;
-    #       }
-    # }
-    exit 0;
-  }
-
-  ###
-  if ($pid and $multicore > 1){
-    warn "Now waiting for all child processes to complete\n";
-    sleep(1);
-
-    ### we need to ensure that we wait for all child processes to be finished before continuing
-    # warn "here are the child IDs: @$pids\n";
-    # warn "Looping through the child process IDs:\n";
-
-    foreach my $id (@$pids){
-      # print "$id\t";
-      my $kid = waitpid ($id,0);
-      # print "Returned: $kid\nExit status: $?\n";
-      unless ($? == 0){
-	warn "\nChild process terminated with exit signal: '$?'\n\n";
-      }
-    }
-  }
-
-  ### Closing all filehandles so that the Bismark methylation extractor output doesn't get truncated due to buffering issues
-  foreach my $fh (keys %fhs) {
-    if ($fh =~ /^[1230]$/) {
-      foreach my $context (keys %{$fhs{$fh}}) {
-	close $fhs{$fh}->{$context} or die $!;
-      }
-    }
-    else{
-      close $fhs{$fh} or die $!;
-    }
-  }
-
-  ### We need to stitch together a main splitting report from all individual parent/child processes
-  if ($multicore > 1){
-    merge_individual_splitting_reports($report_basename);
-    print_splitting_report();
-
-    merge_individual_mbias_reports($report_basename); # this updates the main %mbias_1 and  %mbias_2 data structures so we can proceed normally
-
-  }
-
-  unless ($mbias_off){
-    ### printing out all M-Bias data
-    produce_mbias_plots ($filename);    produce_mbias_plots ($filename);
-
-  }
-
-  unless ($mbias_only){
-    delete_unused_files();
-  }
-
-  if ($bedGraph){
-
-    my $out = (split (/\//,$filename))[-1]; # extracting the filename if a full path was specified
-    $out =~ s/gz$//;
-    $out =~ s/sam$//;
-    $out =~ s/bam$//;
-    $out =~ s/txt$//;
-    $out =~ s/$/bedGraph/;
-
-    my $bedGraph_output = $out;
-    my @args;
-
-    if ($remove){
-      push @args, '--remove';
-    }
-    if ($CX_context){
-      push @args, '--CX_context';
-    }
-    if ($no_header){
-      push @args, '--no_header';
-    }
-    if ($gazillion){
-      push @args, '--gazillion';
-    }
-    if ($ample_mem){
-      push @args, '--ample_memory';
-    }
-    if ($zero){
-      push @args, "--zero";
-    }
-
-    #   if ($counts){
-    #      push @args, "--counts";
-    #   }
-
-    push @args, "--buffer_size $sort_size";
-    push @args, "--cutoff $coverage_threshold";
-    push @args, "--output $bedGraph_output";
-    push @args, "--dir '$output_dir'";
-
-    ### adding all files to be sorted to @args
-    foreach my $f (@sorting_files){
-      push @args, $f;
-    }
-
-    #  print join "\t",@args,"\n";
-
-    system ("$Bin/bismark2bedGraph @args");
-
-    warn "Finished BedGraph conversion ...\n\n";
-    sleep(1);
-
-    # open (OUT,'>',$output_dir.$bedGraph_output) or die "Problems with the bedGraph output filename detected: file path: '$output_dir'\tfile name: '$bedGraph_output' $!";
-    # warn "Writing bedGraph to file: $bedGraph_output\n";
-    # process_bedGraph_output();
-    # close OUT or die $!;
-
-    ### genome-wide cytosine methylation report requires bedGraph processing anyway
-    if ($cytosine_report){
-
-      @args = (); # resetting @args
-      my $cytosine_out = $out;
-      $cytosine_out =~ s/bedGraph$//;
-
-      if ($CX_context){
-	$cytosine_out =~ s/$/CX_report.txt/;
-      }
-      else{
-	$cytosine_out =~ s/$/CpG_report.txt/;
-      }
-
-      push @args, "--output $cytosine_out";
-      push @args, "--dir '$output_dir'";
-      push @args, "--genome '$genome_folder'";
-      push @args, "--parent_dir '$parent_dir'";
-
-      if ($zero){
-	push @args, "--zero";
-      }
-      if ($CX_context){
-	push @args, '--CX_context';
-      }
-      if ($split_by_chromosome){
-	push @args, '--split_by_chromosome';
-      }
-
-      my $coverage_output = $bedGraph_output;
-      $coverage_output =~ s/bedGraph$/bismark.cov/;
-
-      push @args, $output_dir . $coverage_output; # this will be the infile
-
-      system ("$Bin/coverage2cytosine @args");
-      # generate_genome_wide_cytosine_report($bedGraph_output,$cytosine_out);
-      warn "\n\nFinished generating genome-wide cytosine report\n\n";
-    }
-  }
-}
-
-sub merge_individual_splitting_reports{
-
-  my $report_basename = shift;
-
-  my @splitting_reports; # only needed in multi-core mode to generate an overall report
-  foreach my $ext (1..$multicore){
-    push @splitting_reports, "$report_basename.$ext";
-  }
-  warn "\nMerging individual splitting reports into overall report: '$report_basename'\n";
-  warn "Merging from these individual files:\n";
-  print join ("\n",@splitting_reports),"\n\n";
-  sleep(1);
-
-  ##########
-  # resetting the counter first
-  %counting =(
-	      total_meCHG_count            => 0,
-	      total_meCHH_count            => 0,
-	      total_meCpG_count            => 0,
-	      total_unmethylated_CHG_count => 0,
-	      total_unmethylated_CHH_count => 0,
-	      total_unmethylated_CpG_count => 0,
-	      sequences_count              => 0,
-	      methylation_call_strings     => 0,
-	     );
-
-  # repopulating the merged counter
-  foreach my $file (@splitting_reports){
-    open (IR,$file) or die $!;
-    while (<IR>){
-      chomp;
-      my ($context,$count) = (split /\t/);
-      if ($context){
-	if ($context =~ /^Total C to T conversions in CpG context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_unmethylated_CpG_count} += $count;
-	}
-	elsif ($context =~ /^Total C to T conversions in CHG context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_unmethylated_CHG_count} += $count;
-	}
-	elsif ($context =~ /^Total C to T conversions in CHH context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_unmethylated_CHH_count} += $count;
-	}
-	elsif ($context =~ /^Total methylated C\'s in CpG context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_meCpG_count} += $count;
-	}
-	elsif ($context =~ /^Total methylated C\'s in CHG context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_meCHG_count} += $count;
-	}
-	elsif ($context =~ /^Total methylated C\'s in CHH context/){
-	  # warn "context: $context\ncount: $count\n";
-	  $counting{total_meCHH_count} += $count;
-	}
-	elsif ($context =~ /^line count/){
-	  # warn "Line count\ncount: $count\n";
-	  $counting{sequences_count} = $count; # always the same
-	}
-	elsif ($context =~ /^meth call strings/){
-	  # warn "Meth call strings\ncount: $count\n";
-	  $counting{methylation_call_strings} += $count;
-	}
-      }
-    }
-  }
-
-  # deleting the individual reports afterwards
-  foreach my $file (@splitting_reports){
-    unlink $file;
-  }
-}
-
-
-sub merge_individual_mbias_reports{
-
-  my $report_basename = shift;
-
-  my @mbias_reports; # only needed in multi-core mode to generate an overall report
-  foreach my $ext (1..$multicore){
-    push @mbias_reports, "$report_basename.${ext}.mbias";
-  }
-  warn "\nMerging individual M-bias reports into overall M-bias statistics from these $multicore individual files:\n";
-  print join ("\n",@mbias_reports),"\n\n";
-
-
-  ##########
-  # resetting the counters first, then repopulating them
-  %mbias_1 = ();
-  %mbias_2 = ();
-
-  # repopulating the merged counter
-  foreach my $file (@mbias_reports){
-    open (IR,$file) or die $!;
-
-    my $context;
-    my $read;
-
-    while (<IR>){
-      chomp;
-      # warn "$_\n"; sleep(1);
-      if ($_ =~ /context/){
-	$context = $1 if ($_ =~ /(\D{3}) context/);
-	# warn "Context set as $context\n";
-	
-	if ($_ =~ /R2/){
-	  $read = 'R2';
-	}
-	else{
-	  $read = 'R1';
-	}
-	# warn "Setting read identity to '$read'\n";
-	
-	# reading in 2 additional lines (===========, and header line)
-	$_ = <IR>;
-	#warn "discarding line $_\n";
-	$_ = <IR>;
-	#warn "discarding line $_\n";
-	next;
-      }
-      else{
-
-	if ($_ eq ''){
-	  # empty line, only occurs after a context has finished and before a new context starts
-	  next;
-	}
-
-	my ($pos,$meth,$unmeth) = (split /\t/);
-	# warn "$pos\t$meth\t$unmeth\n"; sleep(1);
-	if ($read eq 'R1'){
-	  $mbias_1{$context}->{$pos}->{meth} += $meth;
-	  $mbias_1{$context}->{$pos}->{un} += $unmeth;
-	}
-	elsif ($read eq 'R2'){
-	  $mbias_2{$context}->{$pos}->{meth} += $meth;
-	  $mbias_2{$context}->{$pos}->{un} += $unmeth;
-	}
-      }
-    }
-    close IR or warn "Had trouble closing filehandle for $file: $!\n";
-  }
-
-  # deleting the individual reports afterwards
-  foreach my $file (@mbias_reports){
-    unlink $file;
-  }
-}
-
-
-sub delete_unused_files{
-
-  warn "Deleting unused files ...\n\n"; sleep(1);
-
-  my $index = 0;
-
-  while ($index <= $#sorting_files){
-    if ($sorting_files[$index] =~ /gz$/){
-      open (USED,"zcat $sorting_files[$index] |") or die "Failed to read from methylation extractor output file $sorting_files[$index]: $!\n";
-    }
-    else{
-      open (USED,$sorting_files[$index]) or die "Failed to read from methylation extractor output file $sorting_files[$index]: $!\n";
-    }
-
-    my $used = 0;
-
-    while (<USED>){
-      next if (/^Bismark/);
-      if ($_){
-	$used = 1;
-	last;
-      }
-    }
-
-    if ($used){
-      warn "$sorting_files[$index] contains data ->\tkept\n";
-      ++$index;
-    }
-    else{
-
-      my $delete = unlink $sorting_files[$index];
-
-      if ($delete){
-	warn "$sorting_files[$index] was empty ->\tdeleted\n";
-      }
-      else{
-	warn "$sorting_files[$index] was empty, however deletion was unsuccessful: $!\n"
-      }
-
-      ### we also need to remove the element from @sorting_files
-      splice @sorting_files, $index, 1;
-    }
-  }
-  warn "\n\n"; ## can't close the piped filehandles at this point because it will die (unfortunately)
-}
-
-sub produce_mbias_plots{
-
-  my $filename = shift;
-
-  my $mbias = (split (/\//,$filename))[-1]; # extracting the filename if a full path was specified
-  $mbias =~ s/gz$//;
-  $mbias =~ s/sam$//;
-  $mbias =~ s/bam$//;
-  $mbias =~ s/txt$//;
-   my $mbias_graph_1 = my $mbias_graph_2 = $mbias;
-  $mbias_graph_1 = $output_dir . $mbias_graph_1 . 'M-bias_R1.png';
-  $mbias_graph_2 = $output_dir . $mbias_graph_2 . 'M-bias_R2.png';
-
-  $mbias =~ s/$/M-bias.txt/;
-
-  open (MBIAS,'>',"$output_dir$mbias") or die "Failed to open file for the M-bias data\n\n";
-
-  # determining maximum read length
-  my $max_length_1 = 0;
-  my $max_length_2 = 0;
-
-  foreach my $context (keys %mbias_1){
-    foreach my $pos (sort {$a<=>$b} keys %{$mbias_1{$context}}){
-      $max_length_1 = $pos unless ($max_length_1 >= $pos);
-    }
-  }
-  if ($paired){
-    foreach my $context (keys %mbias_2){
-      foreach my $pos (sort {$a<=>$b} keys %{$mbias_2{$context}}){
-	$max_length_2 = $pos unless ($max_length_2 >= $pos);
-      }
-    }
-  }
-
-  if ($single){
-    warn "Determining maximum read length for M-Bias plot\n";
-    warn "Maximum read length of Read 1: $max_length_1\n\n";
-  }
-  else{
-    warn "Determining maximum read lengths for M-Bias plots\n";
-    warn "Maximum read length of Read 1: $max_length_1\n";
-    warn "Maximum read length of Read 2: $max_length_2\n\n";
-  }
-  # sleep(3);
-
-  my @mbias_read1;
-  my @mbias_read2;
-
-  #Check whether the module GD::Graph:lines is installed
-  my $gd_graph_installed = 0;
-  eval{
-    require GD::Graph::lines;
-    GD::Graph::lines->import();
-  };
-
-  unless($@) { # syntax or routine error variable, set if something goes wrong in the last eval{ require ...}
-    $gd_graph_installed = 1;
-
-    #Check whether the module GD::Graph::colour is installed
-    eval{
-      require GD::Graph::colour;
-      GD::Graph::colour->import(qw(:colours :lists :files :convert));
-    };
-
-    if ($@) {
-      warn "Perl module GD::Graph::colour not found, skipping drawing M-bias plots (only writing out M-bias plot table)\n";
-      sleep(2);
-      $gd_graph_installed = 0;
-    }
-
-
-  }
-  else{
-    warn "Perl module GD::Graph::lines is not installed, skipping drawing M-bias plots (only writing out M-bias plot table)\n";
-    sleep(2);
-  }
-
-
-  my $graph_title;
-  my $graph1;
-  my $graph2;
-
-  if ( $gd_graph_installed){
-    $graph1 = GD::Graph::lines->new(800,600);
-    if ($paired){
-      $graph2 = GD::Graph::lines->new(800,600);
-    }
-  }
-
-  foreach my $context (qw(CpG CHG CHH)){
-    @{$mbias_read1[0]} = ();
-
-    if ($paired){
-      print MBIAS "$context context (R1)\n================\n";
-      $graph_title = 'M-bias (Read 1)';
-    }
-    else{
-      print MBIAS "$context context\n===========\n";
-      $graph_title = 'M-bias';
-    }
-    print MBIAS "position\tcount methylated\tcount unmethylated\t% methylation\tcoverage\n";
-
-    foreach my $pos (1..$max_length_1){
-
-      unless (defined $mbias_1{$context}->{$pos}->{meth}){
-	$mbias_1{$context}->{$pos}->{meth} = 0;
-      }
-      unless (defined $mbias_1{$context}->{$pos}->{un}){
-	$mbias_1{$context}->{$pos}->{un} = 0;
-      }
-
-      my $percent = '';
-      if (($mbias_1{$context}->{$pos}->{meth} + $mbias_1{$context}->{$pos}->{un}) > 0){
-	$percent = sprintf("%.2f",$mbias_1{$context}->{$pos}->{meth} * 100/ ( $mbias_1{$context}->{$pos}->{meth} + $mbias_1{$context}->{$pos}->{un}) );
-      }
-      my $coverage = $mbias_1{$context}->{$pos}->{un} + $mbias_1{$context}->{$pos}->{meth};
-
-      print MBIAS "$pos\t$mbias_1{$context}->{$pos}->{meth}\t$mbias_1{$context}->{$pos}->{un}\t$percent\t$coverage\n";
-      push @{$mbias_read1[0]},$pos;
-
-      if ($context eq 'CpG'){
-	push @{$mbias_read1[1]},$percent;
-	push @{$mbias_read1[4]},$coverage;
-      }
-      elsif ($context eq 'CHG'){
-	push @{$mbias_read1[2]},$percent;
-	push @{$mbias_read1[5]},$coverage;
-      }
-      elsif ($context eq 'CHH'){
-    	push @{$mbias_read1[3]},$percent;
-	push @{$mbias_read1[6]},$coverage;
-      }
-    }
-    print MBIAS "\n";
-  }
-
-  if ( $gd_graph_installed){
-
-    add_colour(nice_blue => [31,120,180]);
-    add_colour(nice_orange => [255,127,0]);
-    add_colour(nice_green => [51,160,44]);
-    add_colour(pale_blue => [153,206,227]);
-    add_colour(pale_orange => [253,204,138]);
-    add_colour(pale_green => [191,230,207]);
-
-    $graph1->set(
-		 x_label              => 'position (bp)',
-		 y1_label              => '% methylation',
-		 y2_label              => '# methylation calls',
-		 title                => $graph_title,
-		 line_width           => 2,
-		 x_max_value          => $max_length_1,
-		 x_min_value          => 0,
-		 y_tick_number        => 10,
-		 y_label_skip         => 2,
-		 y1_max_value          => 100,
-		 y1_min_value          => 0,
-		 y_label_skip         => 2,
-		 y2_min_value          => 0,
-		 x_label_skip         => 5,
-		 x_label_position     => 0.5,
-		 x_tick_offset        => -1,
-		 bgclr                => 'white',
-		 transparent          => 0,
-		 two_axes             => 1,
-		 use_axis             => [1,1,1,2,2,2],
-		 legend_placement     => 'RC',
-		 legend_spacing       => 6,
-		 legend_marker_width  => 24,
-		 legend_marker_height => 18,
-		 dclrs              => [ qw(nice_blue nice_orange nice_green pale_blue pale_orange pale_green)],
-		) or die $graph1->error;
-
-    $graph1->set_legend('CpG methylation','CHG methylation','CHH methylation','CpG total calls','CHG total calls','CHH total calls');
-
-    ### Failure to plot the MBIAS graph will now generate a warning instead of dieing (previous version below. Suggested by Andrew DeiRossi, 05 June 2014)
-    if (my $gd1 = $graph1->plot(\@mbias_read1)) {
-      open (MBIAS_G1,'>',$mbias_graph_1) or die "Failed to write to file for M-bias plot 1: $!\n\n";
-      binmode MBIAS_G1;
-      print MBIAS_G1 $gd1->png;
-    }
-    else {
-      warn "WARNING: Cannot generate read 1 M-bias plot: " , $graph1->error  , "\n\n";
-    }
-
-    #     my $gd1 = $graph1->plot(\@mbias_read1) or die $graph1->error;
-    #     open (MBIAS_G1,'>',$mbias_graph_1) or die "Failed to write to file for M-bias plot 1: $!\n\n";
-    #     binmode MBIAS_G1;
-    #     print MBIAS_G1 $gd1->png;
-  }
-
-  if ($paired){
-
-    foreach my $context (qw(CpG CHG CHH)){
-      @{$mbias_read2[0]} = ();
-
-      print MBIAS "$context context (R2)\n================\n";
-      print MBIAS "position\tcount methylated\tcount unmethylated\t% methylation\tcoverage\n";
-      foreach my $pos (1..$max_length_2){
-	
-	unless (defined $mbias_2{$context}->{$pos}->{meth}){
-	  $mbias_2{$context}->{$pos}->{meth} = 0;
-	}
-	unless (defined $mbias_2{$context}->{$pos}->{un}){
-	  $mbias_2{$context}->{$pos}->{un} = 0;
-	}
-
-	my $percent = '';
-	if (($mbias_2{$context}->{$pos}->{meth} + $mbias_2{$context}->{$pos}->{un}) > 0){
-	  $percent = sprintf("%.2f",$mbias_2{$context}->{$pos}->{meth} * 100/ ($mbias_2{$context}->{$pos}->{meth} + $mbias_2{$context}->{$pos}->{un}) );
-	}
-	my $coverage = $mbias_2{$context}->{$pos}->{un} + $mbias_2{$context}->{$pos}->{meth};
-
-	print MBIAS "$pos\t$mbias_2{$context}->{$pos}->{meth}\t$mbias_2{$context}->{$pos}->{un}\t$percent\t$coverage\n";
-	
-	push @{$mbias_read2[0]},$pos;
-	
-	if ($context eq 'CpG'){
-	  push @{$mbias_read2[1]},$percent;
-	  push @{$mbias_read2[4]},$coverage;
-	}
-	elsif ($context eq 'CHG'){
-	  push @{$mbias_read2[2]},$percent;
-	  push @{$mbias_read2[5]},$coverage;
-	}
-	elsif ($context eq 'CHH'){
-	  push @{$mbias_read2[3]},$percent;
-	  push @{$mbias_read2[6]},$coverage;
-	}
-      }	
-      print MBIAS "\n";
-    }
-
-    if ( $gd_graph_installed){
-
-      add_colour(nice_blue => [31,120,180]);
-      add_colour(nice_orange => [255,127,0]);
-      add_colour(nice_green => [51,160,44]);
-      add_colour(pale_blue => [153,206,227]);
-      add_colour(pale_orange => [253,204,138]);
-      add_colour(pale_green => [191,230,207]);
-
-      $graph2->set(
-		   x_label              => 'position (bp)',
-		   line_width           => 2,
-		   x_max_value          => $max_length_1,
-		   x_min_value          => 0,
-		   y_tick_number        => 10,
-		   y_label_skip         => 2,
-		   y1_max_value          => 100,
-		   y1_min_value          => 0,
-		   y_label_skip         => 2,
-		   y2_min_value          => 0,
-		   x_label_skip         => 5,
-		   x_label_position     => 0.5,
-		   x_tick_offset        => -1,
-		   bgclr                => 'white',
-		   transparent          => 0,
-		   two_axes             => 1,
-		   use_axis             => [1,1,1,2,2,2],
-		   legend_placement     => 'RC',
-		   legend_spacing       => 6,
-		   legend_marker_width  => 24,
-		   legend_marker_height => 18,
-		   dclrs                => [ qw(nice_blue nice_orange nice_green pale_blue pale_orange pale_green)],
-		   x_label              => 'position (bp)',
-		   y1_label             => '% methylation',
-		   y2_label             => '# calls',
-		   title                => 'M-bias (Read 2)',
-		  ) or die $graph2->error;
-
-      $graph2->set_legend('CpG methylation','CHG methylation','CHH methylation','CpG total calls','CHG total calls','CHH total calls');
-
-      ### Failure to plot the MBIAS graph will now generate a warning instead of dieing (previous version below. Suggested by Andrew DeiRossi, 05 June 2014)
-      if (my $gd2 = $graph2->plot(\@mbias_read2)) {
-        open (MBIAS_G2,'>',$mbias_graph_2) or die "Failed to write to file for M-bias plot 2: $!\n\n";
-        binmode MBIAS_G2;
-        print MBIAS_G2 $gd2->png;
-      }
-      else {
-        warn "WARNING: Cannot generate Read 2 M-bias plot: " , $graph2->error , "\n\n";
-      }
-
-      # my $gd2 = $graph2->plot(\@mbias_read2) or die $graph2->error;
-      # open (MBIAS_G2,'>',$mbias_graph_2) or die "Failed to write to file for M-bias plot 2: $!\n\n";
-      # binmode MBIAS_G2;
-      # print MBIAS_G2 $gd2->png;
-
-    }
-  }
-}
-
-sub process_commandline{
-  my $help;
-  my $single_end;
-  my $paired_end;
-  my $ignore;
-  my $ignore_r2;
-  my $genomic_fasta;
-  my $full;
-  my $report;
-  my $extractor_version;
-  my $no_overlap;
-  my $merge_non_CpG;
-  my $vanilla;
-  my $output_dir;
-  my $no_header;
-  my $bedGraph;
-  my $coverage_threshold = 1; # Minimum number of reads covering before calling methylation status
-  my $remove;
-  my $counts;
-  my $cytosine_report;
-  my $genome_folder;
-  my $zero;
-  my $CpG_only;
-  my $CX_context;
-  my $split_by_chromosome;
-  my $sort_size;
-  my $samtools_path;
-  my $gzip;
-  my $mbias_only;
-  my $mbias_off;
-  my $gazillion;
-  my $ample_mem;
-  my $include_overlap;
-  my $ignore_3prime;
-  my $ignore_3prime_r2;
-  my $multicore;
-
-  my $command_line = GetOptions ('help|man'             => \$help,
-				 'p|paired-end'         => \$paired_end,
-				 's|single-end'         => \$single_end,
-				 'fasta'                => \$genomic_fasta,
-				 'ignore=i'             => \$ignore,
-				 'ignore_r2=i'          => \$ignore_r2,
-				 'comprehensive'        => \$full,
-				 'report'               => \$report,
-				 'version'              => \$extractor_version,
-				 'no_overlap'           => \$no_overlap,
-				 'merge_non_CpG'        => \$merge_non_CpG,
-				 'vanilla'              => \$vanilla,
-				 'o|output=s'           => \$output_dir,
-				 'no_header'            => \$no_header,
-				 'bedGraph'             => \$bedGraph,
-				 "cutoff=i"             => \$coverage_threshold,
-				 "remove_spaces"        => \$remove,
-				 "counts"               => \$counts,
-				 "cytosine_report"      => \$cytosine_report,
-				 'g|genome_folder=s'    => \$genome_folder,
-				 "zero_based"           => \$zero,	
-				 "CX|CX_context"        => \$CX_context,
-				 "split_by_chromosome"  => \$split_by_chromosome,
-				 "buffer_size=s"        => \$sort_size,
-				 'samtools_path=s'      => \$samtools_path,
-				 'gzip'                 => \$gzip,
-				 'mbias_only'           => \$mbias_only,			
-				 'mbias_off'            => \$mbias_off,			
-				 'gazillion|scaffolds'  => \$gazillion,
-				 'ample_memory'         => \$ample_mem,
-				 'include_overlap'      => \$include_overlap,
-				 'ignore_3prime=i'      => \$ignore_3prime,
-				 'ignore_3prime_r2=i'   => \$ignore_3prime_r2,
-				 'multicore=i'          => \$multicore,
-	);
-
-  ### EXIT ON ERROR if there were errors with any of the supplied options
-  unless ($command_line){
-    die "Please respecify command line options\n";
-  }
-
-  ### HELPFILE
-  if ($help){
-    print_helpfile();
-    exit;
-  }
-
-  if ($extractor_version){
-    print << "VERSION";
-
-
-                           Bismark Methylation Extractor
-
-                         Bismark Extractor Version: $version
-              Copyright 2010-15 Felix Krueger, Babraham Bioinformatics
-                www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-
-VERSION
-    exit;
-  }
-
-
-  ### no files provided
-  unless (@ARGV){
-    die "You need to provide one or more Bismark files to create an individual C methylation output. Please respecify!\n";
-  }
-  @filenames = @ARGV;
-
-  warn "\n *** Bismark methylation extractor version $version ***\n\n";
-
-  ### M-BIAS ONLY
-  if ($mbias_only){
-
-    if ($mbias_off){
-      die "Options '--mbias_only' and '--mbias_off' are not compatible. Just pick one, mkay?\n";
-    }
-    if ($bedGraph){
-      die "Option '--mbias_only' skips all sorts of methylation extraction, including the bedGraph generation. Please respecify!\n";
-    }
-    if ($cytosine_report){
-      die "Option '--mbias_only' skips all sorts of methylation extraction, including the genome-wide cytosine methylation report generation. Please respecify!\n";
-    }
-    if ($merge_non_CpG){
-      warn "Option '--mbias_only' skips all sorts of methylation extraction, thus '--merge' won't have any effect\n";
-    }
-    if ($full){
-      warn "Option '--mbias_only' skips all sorts of methylation extraction, thus '--comprehensive' won't have any effect\n";
-    }
-    sleep(3);
-  }
-
-  ### PRINT A REPORT
-  unless ($report){
-    $report = 1; # making this the default
-  }
-
-  ### OUTPUT DIR PATH
-  if ($output_dir){
-    unless ($output_dir =~ /\/$/){
-      $output_dir =~ s/$/\//;
-    }
-  }
-  else{
-    $output_dir = '';
-  }
-
-  ### NO HEADER
-  unless ($no_header){
-    $no_header = 0;
-  }
-
-  ### OLD (VANILLA) OUTPUT FORMAT
-  unless ($vanilla){
-    $vanilla = 0;
-  }
-
-  if ($single_end){
-    $paired_end = 0;   ### SINGLE END ALIGNMENTS
-  }
-  elsif ($paired_end){
-    $single_end = 0;   ### PAIRED-END ALIGNMENTS
-  }
-  else{
-
-    ### we will try to determine whether the input file was a single-end or paired-end sequencing run from the SAM header
-
-    if ($vanilla){
-      die "Please specify whether the supplied file(s) are in Bismark single-end or paired-end format with '-s' or '-p'\n\n";
-    }
-    else{ # SAM/BAM format
-
-      my $file = $filenames[0];
-      warn "Trying to determine the type of mapping from the SAM header line of file $file\n"; sleep(1);
-	
-      ### if the user did not specify whether the alignment file was single-end or paired-end we are trying to get this information from the @PG header line in the SAM/BAM file
-      if ($file =~ /\.gz$/){
-	open (DETERMINE,"zcat $file |") or die "Unable to read from gzipped file $file: $!\n";
-      }
-      elsif ($file =~ /\.bam$/ || isBam($file) ){ ### this would allow to read BAM files that do not end in *.bam
-	open (DETERMINE,"samtools view -h $file |") or die "Unable to read from BAM file $file: $!\n";
-      }
-      else{
-	open (DETERMINE,$file) or die "Unable to read from $file: $!\n";
-      }
-
-      while (<DETERMINE>){
-	last unless (/^\@/);
-	if ($_ =~ /^\@PG/){
-	  # warn "found the \@PG line:\n";
-	  # warn "$_";
-	
-	  if ($_ =~ /\s+-1\s+/ and $_ =~ /\s+-2\s+/){
-	    warn "Treating file(s) as paired-end data (as extracted from \@PG line)\n\n"; sleep(1);
-	    $paired_end = 1;
-	    $single_end = 0;
-	  }
-	  else{
-	    warn "Treating file(s) as single-end data (as extracted from \@PG line)\n\n"; sleep(1);
-	    $paired_end = 0;
-	    $single_end = 1;
-	  }
-	}
-      }
-
-      # close DETERMINE or warn $!; # this always throws an error anyway...
-	
-    }
-  }
-
-  ### IGNORING <INT> 5' END 
-  # bases at the start of the read when processing the methylation call string
-  unless ($ignore){
-    $ignore = 0;
-  }
-
-  if (defined $ignore_r2){
-    die "You can only specify --ignore_r2 for paired-end result files\n" unless ($paired_end);
-  }
-  else{
-    $ignore_r2 = 0;
-  }
-
-  ### IGNORING <INT> 3' END
-  # bases at the end of the read when processing the methylation call string
-  unless ($ignore_3prime){
-    $ignore_3prime = 0;
-  }
-
-  if (defined $ignore_3prime_r2){
-    die "You can only specify --ignore_3prime_r2 for paired-end result files\n" unless ($paired_end);
-  }
-  else{
-    $ignore_3prime_r2 = 0;
-  }
-
-
-  ### NO OVERLAP
-  ### --no_overlap is the default (as of version 0.12.6), unless someone explicitly asks to include overlaps
-  if ($include_overlap){
-    die "The option '--include_overlap' can only be specified for paired-end input!\n" unless ($paired_end);
-    warn "Setting option '--inlcude_overlap' for paired-end data (user-defined)\n\n";
-    $no_overlap = 0;
-  }
-  else{ # default
-    if ($paired_end){
-      warn "Setting option '--no_overlap' since this is (normally) the right thing to do for paired-end data\n\n";
-      $no_overlap = 1;
-    }
-  }
-
-  ### COMPREHENSIVE OUTPUT
-  unless ($full){
-    $full = 0;
-  }
-
-  ### MERGE NON-CpG context
-  unless ($merge_non_CpG){
-    $merge_non_CpG = 0;
-  }
-
-  ### remove white spaces in read ID (needed for sorting using the sort command
-  unless ($remove){
-    $remove = 0;
-  }
-
-  ### COVERAGE THRESHOLD FOR bedGraph OUTPUT
-  if (defined $coverage_threshold){
-    unless ($coverage_threshold > 0){
-      die "Please select a coverage greater than 0 (positive integers only)\n";
-    }
-  }
-  else{
-    $coverage_threshold = 1;
-  }
-
-  ### SORT buffer size
-  if (defined $sort_size){
-    unless ($sort_size =~ /^\d+\%$/ or $sort_size =~ /^\d+(K|M|G|T)$/){
-      die "Please select a buffer size as percentage (e.g. --buffer_size 20%) or a number to be multiplied with K, M, G, T etc. (e.g. --buffer_size 20G). For more information on sort type 'info sort' on a command line\n";
-    }
-  }
-  else{
-    $sort_size = '2G';
-  }
-
-  if ($zero){
-    die "Option '--zero' is only available if  '--bedGraph' or '--cytosine_report' are specified as well. Please respecify\n" unless ($cytosine_report or $bedGraph);
-  }
-
-  if ($CX_context){
-    die "Option '--CX_context' is only available if  '--bedGraph' or '--cytosine_report' are specified as well. Please respecify\n" unless ($cytosine_report or $bedGraph);
-  }
-  else{
-    $CX_context = 0;
-  }
-
-  unless ($counts){
-    $counts = 1; # counts will always be set
-  }
-
-  if ($cytosine_report){
-
-    ### GENOME folder
-    if ($genome_folder){
-      unless ($genome_folder =~/\/$/){
-	$genome_folder =~ s/$/\//;
-      }
-    }
-    else{
-      die "Please specify a genome folder to proceed (full path only)\n";
-    }
-
-    unless ($bedGraph){
-      warn "Setting the option '--bedGraph' since this is required for the genome-wide cytosine report\n";
-      $bedGraph = 1;
-    }
-    unless ($counts){
-      # warn "Setting the option '--counts' since this is required for the genome-wide cytosine report\n";
-      $counts = 1;
-    }
-    warn "\n";
-  }
-
-  ### PATH TO SAMTOOLS
-  if (defined $samtools_path){
-    # if Samtools was specified as full command
-    if ($samtools_path =~ /samtools$/){
-      if (-e $samtools_path){
-	# Samtools executable found
-      }
-      else{
-	die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-      }
-    }
-    else{
-      unless ($samtools_path =~ /\/$/){
-	$samtools_path =~ s/$/\//;
-      }
-      $samtools_path .= 'samtools';
-      if (-e $samtools_path){
-	# Samtools executable found
-      }
-      else{
-	die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-      }
-    }
-  }
-  # Check whether Samtools is in the PATH if no path was supplied by the user
-  else{
-    if (!system "which samtools >/dev/null 2>&1"){ # STDOUT is binned, STDERR is redirected to STDOUT. Returns 0 if Samtools is in the PATH
-      $samtools_path = `which samtools`;
-      chomp $samtools_path;
-    }
-  }
-
-  unless (defined $samtools_path){
-    $samtools_path = '';
-  }
-
-
-  if ($gazillion){
-    if ($ample_mem){
-      die "You can't currently select '--ample_mem' together with '--gazillion'. Make your pick!\n\n";
-    }
-  }
-
-  if (defined $multicore){
-    unless ($multicore > 0){
-      die "Core usage needs to be set to 1 or more (currently selected $multicore). Please respecify!\n";
-    }
-    if ($multicore > 20){
-      warn "Core usage currently set to more than 20 threads. Let's see how this goes... (set value: $multicore)\n\n";
-    }
-  }
-  else{
-    $multicore = 1; # default. Single-thread mode
-    warn "Setting core usage to single-threaded (default). Consider using --multicore <int> to speed up the extraction process.\n\n";
-  }
-
-  return ($ignore,$genomic_fasta,$single_end,$paired_end,$full,$report,$no_overlap,$merge_non_CpG,$vanilla,$output_dir,$no_header,$bedGraph,$remove,$coverage_threshold,$counts,$cytosine_report,$genome_folder,$zero,$CpG_only,$CX_context,$split_by_chromosome,$sort_size,$samtools_path,$gzip,$ignore_r2,$mbias_off,$mbias_only,$gazillion,$ample_mem,$ignore_3prime,$ignore_3prime_r2,$multicore);
-}
-
-
-sub test_positional_sorting{
-
-  my $filename = shift;
-
-  print "\nNow testing Bismark result file $filename for positional sorting (which would be bad...)\t";
-  sleep(1);
-
-  if ($filename =~ /\.gz$/) {
-    open (TEST,"zcat $filename |") or die "Can't open gzipped file $filename: $!\n";
-  }
-  elsif ($filename =~ /bam$/ ||  isBam($filename) ){ ### this would allow to read BAM files that do not end in *.bam
-    if ($samtools_path){
-      open (TEST,"$samtools_path view -h $filename |") or die "Can't open BAM file $filename: $!\n";
-    }
-    else{
-      die "Sorry couldn't find an installation of Samtools. Either specifiy an alternative path using the option '--samtools_path /your/path/', or use a SAM file instead\n\n";
-    }
-  }
-  else {
-    open (TEST,$filename) or die "Can't open file $filename: $!\n";
-  }
-
-  my $count = 0;
-
-  while (<TEST>) {
-    if (/^\@/) {	     # testing header lines if they contain the @SO flag (for being sorted)
-      if (/^\@SO/) {
-	die "SAM/BAM header line '$_' indicates that the Bismark aligment file has been sorted by chromosomal positions which is is incompatible with correct methylation extraction. Please use an unsorted file instead\n\n";
-      }
-      next;
-    }
-    $count++;
-
-    last if ($count > 100000); # else we test the first 100000 sequences if they start with the same read ID
-
-    my ($id_1) = (split (/\t/));
-
-    ### reading the next line which should be read 2
-    $_ = <TEST>;
-    my ($id_2) = (split (/\t/));
-    last unless ($id_2);
-    ++$count;
-
-    if ($id_1 eq $id_2){
-      ### ids are the same
-      next;
-    }
-    else{ ### in previous versions of Bismark we appended /1 and /2 to the read IDs for easier eyeballing which read is which. These tags need to be removed first
-      my $id_1_trunc = $id_1;
-      $id_1_trunc =~ s/\/1$//;
-      my $id_2_trunc = $id_2;
-      $id_2_trunc =~ s/\/2$//;
-
-      unless ($id_1_trunc eq $id_2_trunc){
-	die "The IDs of Read 1 ($id_1) and Read 2 ($id_2) are not the same. This might be a result of sorting the paired-end SAM/BAM files by chromosomal position which is not compatible with correct methylation extraction. Please use an unsorted file instead\n\n";
-      }
-    }
-  }
-  #  close TEST or die $!; somehow fails on our cluster...
-  ### If it hasen't died so far then it seems the file is in the correct Bismark format (read 1 and read 2 of a pair directly following each other)
-  warn "...passed!\n";
-  sleep(1);
-
-}
-
-sub process_Bismark_results_file{
-
-  my $filename = shift;
-  my $report_filename = open_output_filehandles($filename);
-
-  ### disabling buffering so we don't run into problems with half written out lines...
-  foreach my $fh (keys %fhs){
-    if ($fh =~ /^[1230]$/) {
-      foreach my $context (keys %{$fhs{$fh}}) {
-	select($fhs{$fh}->{$context});
-	$|++;
-      }
-    }
-    else{
-      select($fhs{$fh});
-      $|++;
-    }
-  }
-  select(STDOUT);
-
-  ################################################
-  ################################################
-  ### multi-process handling
-  ###
-
-  my $offset = 1;
-  my $process_id;
-  my @pids;
-  if ($multicore > 1){
-
-    until ($offset == $multicore){
-      # warn "multicore: $multicore\noffset: $offset\n";
-      my $fork = fork;
-
-      if (defined $fork){
-	if ($fork != 0){
-	  $process_id = $fork;
-	  push @pids, $process_id;
-	  if ($offset < $multicore){
-	    ++$offset;
-	    # warn "I am the parent process, child pid: $fork\nIncrementing offset counter to: $offset\n\n";
-	  }
-	  else{
-	    # warn "Reached the number of maximum multicores. Proceeeding to processing...\n";
-	  }
-	}
-	elsif ($fork == 0){
-	  # warn "I am a child process, pid: $fork\nOffset counter is: $offset\nProceeding to processing...\n";
-	  $process_id = $fork;
-	  last;
-	}
-      }
-      else{
-	die "Forking unsuccessful. Proceeding using a single thread only\n";
-      }
-    }
-
-    # warn "\nThe thread identity\n===================\n";
-    if ($process_id){
-      # print "I am the parent process. My children are called:\n";
-      # print join ("\t",@pids),"\n";
-      # print "I am going to process the following line count: $offset\n\n";
-    }
-    elsif($process_id == 0){
-      # warn "I am a child process: Process ID: $process_id\n";
-      # warn "I am going to process the following line count: $offset\n\n";
-    }
-    else{
-      die "Process ID was: $process_id\n";
-    }
-  }
-  else{
-    # warn "Single-core mode: setting pid to 1\n";
-    $process_id = 1;
-  }
-
-  ################################################
-  ################################################
-  if ($process_id){
-    warn "Now reading in Bismark result file $filename\n";
-  }
-  else{
-    warn "\nNow reading in Bismark result file $filename\n\n";
-  }
-
-  if ($filename =~ /\.gz$/) {
-    open (IN,"zcat $filename |") or die "Can't open gzipped file $filename: $!\n";
-  }
-  elsif ($filename =~ /bam$/ || isBam($filename) ){ ### this would allow to read BAM files that do not end in *.bam
-    if ($samtools_path){
-      open (IN,"$samtools_path view -h $filename |") or die "Can't open BAM file $filename: $!\n";
-    }
-    else{
-      die "Sorry couldn't find an installation of Samtools. Either specifiy an alternative path using the option '--samtools_path /your/path/', or use a SAM file instead\n\n";
-    }
-  }
-  else {
-    open (IN,$filename) or die "Can't open file $filename: $!\n";
-  }
-
-  ### Vanilla and SAM output need to read different numbers of header lines
-  if ($vanilla) {
-    my $bismark_version = <IN>; ## discarding the Bismark version info
-    chomp $bismark_version;
-    $bismark_version =~ s/\r//; # replaces \r line feed
-    $bismark_version =~  s/Bismark version: //;
-    if ($bismark_version =~ /^\@/) {
-      warn "Detected \@ as the first character of the version information. Is it possible that the file is in SAM format?\n\n";
-      sleep (1);
-    }
-
-    unless ($version eq $bismark_version){
-      die "The methylation extractor and Bismark itself need to be of the same version!\n\nVersions used:\nmethylation extractor: '$version'\nBismark: '$bismark_version'\n";
-    }
-  } else {
-    # If the read is in SAM format (default) it can either start with @ header lines or start with alignments directly.
-    # We are reading from it further down
-  }
-
-  my $methylation_call_strings_processed = 0;
-  my $line_count = 0;
-
-  ### proceeding differently now for single-end or paired-end Bismark files
-
-  ### PROCESSING SINGLE-END RESULT FILES
-  if ($single) {
-
-    ### also proceeding differently now for SAM format or vanilla Bismark format files
-    if ($vanilla) {		# old vanilla Bismark output format
-      while (<IN>) {
-	++$line_count;
-	warn "Processed lines: $line_count\n" if ($line_count%500000==0);
-
-	if ( ($line_count - $offset)%$multicore == 0){
-	  # warn "line count: $line_count\noffset: $offset\n";
-	  # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-	  # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-	}
-	else{
-	  # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-	  next;
-	}
-	
-	### $seq here is the chromosomal sequence (to use for the repeat analysis for example)
-	my ($id,$strand,$chrom,$start,$seq,$meth_call,$read_conversion,$genome_conversion) = (split("\t"))[0,1,2,3,6,7,8,9];
-	
-	### we need to remove 2 bp of the genomic sequence as we were extracting read + 2bp long fragments to make a methylation call at the first or
-	### last position
-	chomp $genome_conversion;
-
-	my $index;
-	if ($meth_call) {
-
-	  if ($read_conversion eq 'CT' and $genome_conversion eq 'CT') { ## original top strand
-	    $index = 0;
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT') { ## complementary to original top strand
-	    $index = 1;
-	  } elsif ($read_conversion eq 'CT' and $genome_conversion eq 'GA') { ## original bottom strand
-	    $index = 3;
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA') { ## complementary to original bottom strand
-	    $index = 2;
-	  } else {
-	    die "Unexpected combination of read and genome conversion: '$read_conversion' / '$genome_conversion'\n";
-	  }
-	
-	  ### Clipping off the first <int> number of bases from the methylation call string as specified with --ignore <int>
-	  if ($ignore) {
-	    $meth_call = substr($meth_call,$ignore,length($meth_call)-$ignore);	
-	
-	    ### If we are clipping off some bases at the start we need to adjust the start position of the alignments accordingly!
-	    if ($strand eq '+') {
-	      $start += $ignore;
-	    }
-	    elsif ($strand eq '-') {
-	      $start += length($meth_call)-1; ## $meth_call is already shortened!
-	    }
-	    else {
-	      die "Alignment did not have proper strand information: $strand\n";
-	    }
-	  }
-	
-	  ### Clipping off the last <int> number of bases from the methylation call string as specified with --ignore_3prime <int>
-	  if ($ignore_3prime) {
-	
-	    $meth_call = substr($meth_call,0, (length($meth_call)) - $ignore_3prime);	
-	
-	    ### If we are clipping off some bases at the end we need to adjust the end position of the alignments accordingly
-	    if ($strand eq '+') {
-	      # clipping the 3' end does not affect the starting position # ignore 5' has already been taken care of, if relevant at all
-	    }
-	    elsif ($strand eq '-') {
-	      # here we need to discriminate if the start has been adjusted because of --ignore or not
-	      if ($ignore){
-		# position adjusted already, and because of this 3' trimming is irrelevant for the start position
-	      }
-	      else{
-		# Here we need to add the length ignore_3prime to the read starting position, adjustment of the start position will take place later in the methylation extraction step
-		$start += $ignore_3prime;
-	      }
-	    }
-	    else {
-	      die "Alignment did not have proper strand information: $strand\n";
-	    }
-	  }
-	  ### just as a comment, if --ignore has not been specified the starting position of reverse reads is adjusted later at the methylation extraction stage
-	
-	  ### printing out the methylation state of every C in the read
-	  print_individual_C_methylation_states_single_end($meth_call,$chrom,$start,$id,$strand,$index);
-	
-	  ++$methylation_call_strings_processed; # 1 per single-end result
-	}
-      }
-    } else {		  # processing single-end SAM format (default)
-      while (<IN>) {
-	chomp;
-	### SAM format can either start with header lines (starting with @) or start with alignments directly
-	if (/^\@/) {	     # skipping header lines (starting with @)
-	  warn "skipping SAM header line:\t$_\n" unless ($process_id == 0);
-	  next;
-	}
-
-	++$line_count;
-	#	warn "$line_count\n";
-	warn "Processed lines: $line_count\n" if ($line_count%500000 == 0);
-
-	if ( ($line_count - $offset)%$multicore == 0){
-	  # warn "line count: $line_count\noffset: $offset\n";
-	  # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-	  # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-	}
-	else{
-	  # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-	  next;
-	}
-	
-	# example read in SAM format
-	# 1_R1/1	67	5	103172224	255	40M	=	103172417	233	AATATTTTTTTTATTTTAAAATGTGTATTGATTTAAATTT	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	NM:i:4	XX:Z:4T1T24TT7	XM:Z:....h.h........................hh.......	XR:Z:CT	XG:Z:CT
-	###
-
-	# < 0.7.6 my ($id,$chrom,$start,$meth_call,$read_conversion,$genome_conversion) = (split("\t"))[0,2,3,13,14,15];
-	# < 0.7.6 $meth_call =~ s/^XM:Z://;
-	# < 0.7.6 $read_conversion =~ s/^XR:Z://;
-	# < 0.7.6 $genome_conversion =~ s/^XG:Z://;	
-
-	my ($id,$chrom,$start,$cigar) = (split("\t"))[0,2,3,5];
-
-	### detecting the following SAM flags in case the SAM entry was shuffled by CRAM or Goby compression/decompression
-	my $meth_call;	  ### Thanks to Zachary Zeno for this solution
-	my $read_conversion;
-	my $genome_conversion;
-	
-	while ( /(XM|XR|XG):Z:([^\t]+)/g ) {
-	  my $tag = $1;
-	  my $value = $2;
-
-	  if ($tag eq "XM") {
-	    $meth_call = $value;
-	    $meth_call =~ s/\r//;
-	  } elsif ($tag eq "XR") {
-	    $read_conversion = $value;
-	    $read_conversion =~ s/\r//;
-	  } elsif ($tag eq "XG") {
-	    $genome_conversion = $value;
-	    $genome_conversion =~ s/\r//;
-	  }
-	}
-
-	my $strand;
-	# warn "$meth_call\n$read_conversion\n$genome_conversion\n";
-	
-	my $index;
-	if ($meth_call) {
-	  if ($read_conversion eq 'CT' and $genome_conversion eq 'CT') { ## original top strand
-	    $index = 0;
-	    $strand = '+';
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT') { ## complementary to original top strand
-	    $index = 1;
-	    $strand = '-';
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA') { ## complementary to original bottom strand
-	    $index = 2;
-	    $strand = '+';
-	  } elsif ($read_conversion eq 'CT' and $genome_conversion eq 'GA') { ## original bottom strand
-	    $index = 3;
-	    $strand = '-';
-	  } else {
-	    die "Unexpected combination of read and genome conversion: '$read_conversion' / '$genome_conversion'\n";
-	  }
-	
-	  ### If the read is in SAM format we need to reverse the methylation call if the read has been reverse-complemented for the output
-	  if ($strand eq '-') {
-	    $meth_call = reverse $meth_call;
-	  }
-	  # warn "\n$meth_call\n";
-	
-	  ### IGNORE 5 PRIME: Clipping off the first <int> number of bases from the methylation call string as specified with --ignore <int>
-	  if ($ignore) {
-	    # warn "\n\n$meth_call\n";
-	    $meth_call = substr($meth_call,$ignore,length($meth_call)-$ignore);	
-	    # warn "$meth_call\n";sleep(1);
-
-	    ### If we are ignoring a part of the sequence we also need to adjust the cigar string accordingly
-
-	    my @len = split (/\D+/,$cigar); # storing the length per operation
-	    my @ops = split (/\d+/,$cigar); # storing the operation
-	    shift @ops;		# remove the empty first element
-	    die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-		
-	    my @comp_cigar; # building an array with all CIGAR operations
-	    foreach my $index (0..$#len) {
-	      foreach (1..$len[$index]) {
-		# print  "$ops[$index]";
-		push @comp_cigar, $ops[$index];
-	      }
-	    }
-	    # print "original CIGAR: $cigar\n";
-	    # print "original CIGAR: @comp_cigar\n";
-
-	    ### If we are clipping off some bases at the start we need to adjust the start position of the alignments accordingly!
-	    if ($strand eq '+') {
-	
-	      my $D_count = 0; # counting all deletions that affect the ignored genomic position, i.e. Deletions and insertions
-	      my $I_count = 0;
-
-	      for (1..$ignore) {
-		my $op = shift @comp_cigar; # adjusting composite CIGAR string by removing $ignore operations from the start
-		# print "$_ deleted $op\n";
-
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $D_count++;
-		  $op = shift @comp_cigar;
-		  # print "$_ deleted $op\n";
-		}
-		if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		  $I_count++;
-		}
-	      }
-	      $start += $ignore + $D_count - $I_count;
-	      # print "start $start\t ignore: $ignore\t D count: $D_count I_count: $I_count\n";
-	    }
-	    elsif ($strand eq '-') {
-
-	      for (1..$ignore) {
-		my $op = pop @comp_cigar; # adjusting composite CIGAR string by removing $ignore operations, here the last value of the array
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $op = pop @comp_cigar;
-		}
-	      }
-
-	      ### For reverse strand alignments we need to determine the number of matching bases (M) or deletions (D) in the read from the CIGAR
-	      ### string to be able to work out the starting position of the read which is on the 3' end of the sequence
-	      my $MD_count = 0;	# counting all operations that affect the genomic position, i.e. M and D. Insertions do not affect the start position
-	      foreach (@comp_cigar) {
-		++$MD_count if ($_ eq 'M' or $_ eq 'D');
-	      }
-	      $start += $MD_count - 1;
-	    }
-	
-	    ### reconstituting shortened CIGAR string
-	    my $new_cigar;
-	    my $count = 0;
-	    my $last_op;
-	    # print "ignore adjusted: @comp_cigar\n";
-	    foreach my $op (@comp_cigar) {
-	      unless (defined $last_op){
-		$last_op = $op;
-		++$count;
-		next;
-	      }
-	      if ($last_op eq $op) {
-		++$count;
-	      } else {
-		$new_cigar .= "$count$last_op";
-		$last_op = $op;
-		$count = 1;
-	      }
-	    }
-	    $new_cigar .= "$count$last_op"; # appending the last operation and count
-	    $cigar = $new_cigar;
-	    # print "ignore adjusted scalar: $cigar\n";
-	  }
-
-	  #######################
-	  ###  INGORE 3' END  ###
-	  #######################
-	
-	  # Clipping off the last <int> number of bases from the methylation call string as specified with --ignore_3prime <int>
-	  if ($ignore_3prime) {
-	    # warn "$meth_call\n";
-	    $meth_call = substr($meth_call,0, (length($meth_call)) - $ignore_3prime);	
-	    # warn "$meth_call\n";sleep(1);
-	
-	    ### If we are ignoring a part of the sequence we also need to adjust the cigar string accordingly
-
-	    my @len = split (/\D+/,$cigar); # storing the length per operation
-	    my @ops = split (/\d+/,$cigar); # storing the operation
-	    shift @ops;		# remove the empty first element
-	    die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-		
-	    my @comp_cigar; # building an array with all CIGAR operations
-	    foreach my $index (0..$#len) {
-	      foreach (1..$len[$index]) {
-		# print  "$ops[$index]";
-		push @comp_cigar, $ops[$index];
-	      }
-	    }
-
-	    # print "original CIGAR: $cigar\n";
-	    # print join ("",@comp_cigar),"\n";
-
-	    ### If we are clipping off some bases at the end we might have to adjust the start position of the alignments accordingly
-	    if ($strand eq '+') {
-
-	      ### clipping the 3' end does not affect the starting position of forward strand alignments
-	      # ignore 5' has already been taken care of at this stage, if relevant at all
-	
-	      for (1..$ignore_3prime) {
-		my $op = pop @comp_cigar; # adjusting composite CIGAR string by removing $ignore_3prime operations from the end
-		# print join ("",@comp_cigar),"\n";
-		# print "$_ deleted $op from 3' end\n";
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $op = pop @comp_cigar;
-		  # print join ("",@comp_cigar),"\n";
-		  # print "$_ deleted $op from 3' end\n";
-		}
-	      }
-	      # print "Final truncated CIGAR string:\n";
-	      # print join ("",@comp_cigar),"\n";
-	      # $start += $ignore + $D_count - $I_count;
-	      # print "start $start\t ignore_3prime: $ignore_3prime\t D count: $D_count I_count: $I_count\n";
-	    }
-	    elsif ($strand eq '-') {
-
-	      my $D_count = 0; # counting all deletions that affect the ignored genomic position, i.e. Deletions and insertions
-	      my $I_count = 0;
-	
-	      for (1..$ignore_3prime) {
-		my $op = shift @comp_cigar; # adjusting composite CIGAR string by removing $ignore_3prime operations, here the first value of the array
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $D_count++;
-		  $op = shift @comp_cigar;
-		}
-		if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		  $I_count++;
-		}
-	
-	      }
-	
-	      # here we need to discriminate if the start has been adjusted because of --ignore or not
-	      if ($ignore){
-		# the start position has already been modified for --ignore already, so we don't have to adjust the position again now
-	      }
-	      else{
-		# Here we need to add the length ignore_3prime to the read starting position
-		#  adjustment of the true starting position of this reverse read will take place later in the methylation extraction step
-		$start += $ignore_3prime + $D_count - $I_count;
-	      }
-	
-	    }
-	
-	    ### reconstituting shortened CIGAR string
-	    my $new_cigar;
-	    my $count = 0;
-	    my $last_op;
-	    # print "ignore_3prime adjusted:\n"; print join ("",@comp_cigar),"\n";
-	    foreach my $op (@comp_cigar) {
-	      unless (defined $last_op){
-		$last_op = $op;
-		++$count;
-		next;
-	      }
-	      if ($last_op eq $op) {
-		++$count;
-	      } else {
-		$new_cigar .= "$count$last_op";
-		$last_op = $op;
-		$count = 1;
-	      }
-	    }
-	    $new_cigar .= "$count$last_op"; # appending the last operation and count
-	    $cigar = $new_cigar;
-	    # print "ignore_3prime adjusted scalar: $cigar\n";
-	  }
-	}
-	### printing out the methylation state of every C in the read
-	print_individual_C_methylation_states_single_end($meth_call,$chrom,$start,$id,$strand,$index,$cigar);
-	
-	++$methylation_call_strings_processed; # 1 per single-end result
-      }
-    }
-  }
-
-  ### PROCESSING PAIRED-END RESULT FILES
-  elsif ($paired) {
-
-    ### proceeding differently now for SAM format or vanilla Bismark format files
-    if ($vanilla) {	# old vanilla Bismark paired-end output format
-      while (<IN>) {
-	++$line_count;
-	warn "processed line: $line_count\n" if ($line_count%500000 == 0);
-
-	if ( ($line_count - $offset)%$multicore == 0){
-	  # warn "line count: $line_count\noffset: $offset\n";
-	  # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-	  # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-	}
-	else{
-	  # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-	  next;
-	}
-
-	### $seq here is the chromosomal sequence (to use for the repeat analysis for example)
-	my ($id,$strand,$chrom,$start_read_1,$end_read_2,$seq_1,$meth_call_1,$seq_2,$meth_call_2,$first_read_conversion,$genome_conversion) = (split("\t"))[0,1,2,3,4,6,7,9,10,11,12,13];
-
-	my $index;
-	chomp $genome_conversion;
-	
-	if ($first_read_conversion eq 'CT' and $genome_conversion eq 'CT') {
-	  $index = 0;		## this is OT
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'GA') {
-	  $index = 2;		## this is CTOB!!!
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'CT') {
-	  $index = 1;		## this is CTOT!!!
-	} elsif ($first_read_conversion eq 'CT' and $genome_conversion eq 'GA') {
-	  $index = 3;		## this is OB
-	} else {
-	  die "Unexpected combination of read and genome conversion: $first_read_conversion / $genome_conversion\n";
-	}
-	
-	if ($meth_call_1 and $meth_call_2) {
-	  ### Clipping off the first <int> number of bases from the methylation call strings as specified with '--ignore <int>'
-
-	  ### IGNORE FROM 5' END
-	  if ($ignore) {
-	    $meth_call_1 = substr($meth_call_1,$ignore,length($meth_call_1)-$ignore);
-	
-	    ### we also need to adjust the start and end positions of the alignments accordingly if '--ignore' was specified
-	    $start_read_1 += $ignore;
-	  }
-	  if ($ignore_r2) {
-	    $meth_call_2 = substr($meth_call_2,$ignore_r2,length($meth_call_2)-$ignore_r2);
-	
-	    ### we also need to adjust the start and end positions of the alignments accordingly if '--ignore_r2' was specified
-	    $end_read_2   -= $ignore_r2;
-	  }
-
-	  ### IGNORE 3' END
-
-	  ### Clipping off the last <int> number of bases from the methylation call string of Read 1 as specified with --ignore_3prime <int>
-	  if ($ignore_3prime) {
-	    $meth_call_1 = substr($meth_call_1,0, length($meth_call_1) - $ignore_3prime);
-	    # we don't have to adjust the position now since the shortened methylation call will be fine, see below
-	  }
-	  ### Clipping off the last <int> number of bases from the methylation call string of Read 2 as specified with --ignore_3prime_r2 <int>
-	  if ($ignore_3prime_r2) {
-	    $meth_call_2 = substr($meth_call_2,0, length($meth_call_2) - $ignore_3prime_r2);
-	    # we don't have to adjust the position now since the shortened methylation call will be fine, see below
-	  }
-
-	  my $end_read_1;
-	  my $start_read_2;
-
-	  if ($strand eq '+') {
-
-	    $end_read_1 = $start_read_1 + length($meth_call_1) - 1;
-	    $start_read_2 = $end_read_2 - length($meth_call_2) + 1;
-	
-	    ## we first pass the first read which is in + orientation on the forward strand
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$start_read_1,$id,'+',$index,0,0,undef,1); # the last two values are CIGAR string and read identity
-	
-	    # we next pass the second read which is in - orientation on the reverse strand
-	    ### if --no_overlap was specified we also pass the end of read 1. If read 2 starts to overlap with read 1 we can stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$end_read_2,$id,'-',$index,$no_overlap,$end_read_1,undef,2);
-	  }
-	  else {
-	
-	    $end_read_1 = $start_read_1+length($meth_call_2)-1;	# read 1 is the second reported read!
-	    $start_read_2 = $end_read_2-length($meth_call_1)+1;	# read 2 is the first reported read!
-
-	    ## we first pass the first read which is in - orientation on the reverse strand
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$end_read_2,$id,'-',$index,0,0,undef,1);
-
-	    # we next pass the second read which is in + orientation on the forward strand
-	    ### if --no_overlap was specified we also pass the end of read 2. If read 2 starts to overlap with read 1 we will stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$start_read_1,$id,'+',$index,$no_overlap,$start_read_2,undef,2);
-	  }
-	
-	  $methylation_call_strings_processed += 2; # paired-end = 2 methylation calls
-	}	
-      }
-    }
-    else {	      # Bismark paired-end BAM/SAM output format (default)
-      while (<IN>) {
-	chomp;
-	### SAM format can either start with header lines (starting with @) or start with alignments directly
-	if (/^\@/) {	     # skipping header lines (starting with @)
-	  warn "skipping SAM header line:\t$_\n" unless ($process_id == 0); # no additional warnings for child procesess
-	  next;
-	}
-	
-	++$line_count;
-	warn "Processed lines: $line_count\n" if ($line_count%500000==0);
-	
-	if ( ($line_count - $offset)%$multicore == 0){
-	  # warn "line count: $line_count\noffset: $offset\n";
-	  # warn "Modulus: ",($line_count - $offset)%$multicore,"\n";
-	  # warn "processing this line $line_count (processID: $process_id with \$offset $offset)\n";
-	}
-	else{
-	  # warn "skipping line $line_count for processID: $process_id with \$offset $offset)\n";
-	  $_ = <IN>; # reading and skipping another line since this is the paired-end read
-	  next;
-	}
-
-	# example paired-end reads in SAM format (2 consecutive lines)
-	# 1_R1/1	67	5	103172224	255	40M	=	103172417	233	AATATTTTTTTTATTTTAAAATGTGTATTGATTTAAATTT	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	NM:i:4	XX:Z:4T1T24TT7	XM:Z:....h.h........................hh.......	XR:Z:CT	XG:Z:CT
-	# 1_R1/2	131	5	103172417	255	40M	=	103172224	-233	TATTTTTTTTTAGAGTATTTTTTAATGGTTATTAGATTTT	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	NM:i:6	XX:Z:T5T1T9T9T7T3	XM:Z:h.....h.h.........h.........h.......h...	XR:Z:GA	XG:Z:CT
-	
-	my ($id_1,$chrom,$start_read_1,$cigar_1) = (split("\t"))[0,2,3,5]; ### detecting the following SAM flags in case the SAM entry was shuffled by CRAM or Goby compression/decompression
-	my $meth_call_1;
-	my $first_read_conversion;
-	my $genome_conversion;
-	
-	while ( /(XM|XR|XG):Z:([^\t]+)/g ) {
-	  my $tag = $1;
-	  my $value = $2;
-
-	  if ($tag eq "XM") {
-	    $meth_call_1 = $value;
-	    $meth_call_1 =~ s/\r//;
-	  } elsif ($tag eq "XR") {
-	    $first_read_conversion = $value;
-	    $first_read_conversion =~ s/\r//;
-	  } elsif ($tag eq "XG") {
-	    $genome_conversion = $value;
-	    $genome_conversion =~ s/\r//;
-	  }
-	}
-
-	$_ = <IN>;		# reading in the paired read
-	chomp;
-	
-	my ($id_2,$start_read_2,$cigar_2) = (split("\t"))[0,3,5]; ### detecting the following SAM flags in case the SAM entry was shuffled by CRAM or Goby compression/decompression
-
-	my $meth_call_2;
-	my $second_read_conversion;
-	
-	while ( /(XM|XR):Z:([^\t]+)/g ) {
-	  my $tag = $1;
-	  my $value = $2;
-
-	  if ($tag eq "XM") {
-	    $meth_call_2 = $value;
-	    $meth_call_2 =~ s/\r//;
-	  } elsif ($tag eq "XR") {
-	    $second_read_conversion = $value;
-	    $second_read_conversion = s/\r//;
-	  }
-	}
-	
-	# < version 0.7.6 $genome_conversion =~ s/^XG:Z://;	
-	# chomp $genome_conversion; # in case it captured a new line character	# already removed
-
-	# print join ("\t",$meth_call_1,$meth_call_2,$first_read_conversion,$second_read_conversion,$genome_conversion),"\n";
-
-	my $index;
-	my $strand;
-
-	if ($first_read_conversion eq 'CT' and $genome_conversion eq 'CT') {
-	  $index = 0;		## this is OT
-	  $strand = '+';
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'CT') {
-	  $index = 1;		## this is CTOT
-	  $strand = '-';
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'GA') {
-	  $index = 2;		## this is CTOB
-	  $strand = '+';
-	} elsif ($first_read_conversion eq 'CT' and $genome_conversion eq 'GA') {
-	  $index = 3;		## this is OB
-	  $strand = '-';
-	} else {
-	  die "Unexpected combination of read and genome conversion: $first_read_conversion / $genome_conversion\n";
-	}
-
-	### reversing the methylation call of the read that was reverse-complemented
-	if ($strand eq '+') {
-	  $meth_call_2 = reverse $meth_call_2;
-	} else {
-	  $meth_call_1 = reverse $meth_call_1;
-	}
-	# warn "\n$meth_call_1\n$meth_call_2\n";
-
-	if ($meth_call_1 and $meth_call_2) {
-
-	  my $end_read_1;
-	
-	  ### READ 1
-	  my @len_1 = split (/\D+/,$cigar_1); # storing the length per operation
-	  my @ops_1 = split (/\d+/,$cigar_1); # storing the operation
-	  shift @ops_1;		# remove the empty first element
-
-	  die "CIGAR string contained a non-matching number of lengths and operations: $cigar_1\n".join(" ",@len_1)."\n".join(" ",@ops_1)."\n" unless (scalar @len_1 == scalar @ops_1);
-	
-	  my @comp_cigar_1; # building an array with all CIGAR operations
-	  foreach my $index (0..$#len_1) {
-	    foreach (1..$len_1[$index]) {
-	      # print  "$ops_1[$index]";
-	      push @comp_cigar_1, $ops_1[$index];
-	    }
-	  }
-	  # print "original CIGAR read 1: $cigar_1\n";
-	  # print "original CIGAR read 1: @comp_cigar_1\n";
-
-	  ### READ 2
-	  my @len_2 = split (/\D+/,$cigar_2); # storing the length per operation
-	  my @ops_2 = split (/\d+/,$cigar_2); # storing the operation
-	  shift @ops_2;		# remove the empty first element
-	  die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len_2 == scalar @ops_2);
-	  my @comp_cigar_2; # building an array with all CIGAR operations for read 2
-	  foreach my $index (0..$#len_2) {
-	    foreach (1..$len_2[$index]) {
-	      # print  "$ops_2[$index]";
-	      push @comp_cigar_2, $ops_2[$index];
-	    }
-	  }
-	  # print "original CIGAR read 2: $cigar_2\n";
-	  # print "original CIGAR read 2: @comp_cigar_2\n";
-	
-	  ##################################	
-	  ###  IGNORE BASES FROM 5' END  ###
-	  ##################################
-
-	  if ($ignore) {
-	    ### Clipping off the first <int> number of bases from the methylation call string as specified with '--ignore <int>' for read 1	
-	    ### the methylation calls have already been reversed where necessary
-
-	    if ( (length($meth_call_1) - $ignore) <= 0){
-	      # next; # skipping this read entirely if the read is shorter than the portion to be ignored
-	      $meth_call_1 = undef; # will skip this read entirely since the read is shorter than the portion to be ignored
-	    }
-	    else {
-	      $meth_call_1 = substr($meth_call_1,$ignore,length($meth_call_1)-$ignore);
-	
-	      if ($strand eq '+') {
-		
-		### if the (read 1) strand information is '+', read 1 needs to be trimmed from the start
-		my $D_count_1 = 0; # counting all deletions that affect the ignored genomic position for read 1, i.e. Deletions and insertions
-		my $I_count_1 = 0;
-		
-		for (1..$ignore) {
-		  my $op = shift @comp_cigar_1; # adjusting composite CIGAR string of read 1 by removing $ignore operations from the start
-		  # print "$_ deleted $op\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $D_count_1++;
-		    $op = shift @comp_cigar_1;
-		    # print "$_ deleted $op\n";
-		  }
-		  if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		    $I_count_1++;
-		  }
-		}
-		
-		$start_read_1 += $ignore + $D_count_1 - $I_count_1;
-		# print "start read 1 $start_read_1\t ignore: $ignore\t D count 1: $D_count_1\tI_count 1: $I_count_1\n";
-
-		# the start position of reads mapping to the reverse strand is being adjusted further below
-	      }
-	      elsif ($strand eq '-') {
-		
-		### if the (read 1) strand information is '-', read 1 needs to be trimmed from the back
-		for (1..$ignore) {
-		  my $op = pop @comp_cigar_1; # adjusting composite CIGAR string by removing $ignore operations, here the last value of the array
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $op = pop @comp_cigar_1;
-		  }
-		}
-		# the start position of reads mapping to the reverse strand is being adjusted further below
-		
-	      }
-	    }
-	  }
-	
-	  if ($ignore_r2) {
-	    ### Clipping off the first <int> number of bases from the methylation call string as specified with '--ignore_r2 <int>' for read 2	
-	    ### the methylation calls have already been reversed where necessary
-
-	    if ( (length($meth_call_2) - $ignore_r2) <= 0){
-	      # next; # skipping this read entirely if the read is shorter than the portion to be ignored # this would skip the entire read pair!
-	      $meth_call_2 = undef; # will skip this read entirely since the read is shorter than the portion to be ignored
-	    }
-	    else {
-	      $meth_call_2 = substr($meth_call_2,$ignore_r2,length($meth_call_2)-$ignore_r2);
-	
-	      ### If we are ignoring a part of the sequence we also need to adjust the cigar string accordingly
-	
-	      if ($strand eq '+') {
-		
-		### if the (read 1) strand information is '+', read 2 needs to be trimmed from the back
-
-		for (1..$ignore_r2) {
-		  my $op = pop @comp_cigar_2; # adjusting composite CIGAR string by removing $ignore operations, here the last value of the array
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $op = pop @comp_cigar_2;
-		  }
-		}
-		# the start position of reads mapping to the reverse strand is being adjusted further below
-	      }
-	      elsif ($strand eq '-') {
-	
-		### if the (read 1) strand information is '-', read 2 needs to be trimmed from the start
-		my $D_count_2 = 0; # counting all deletions that affect the ignored genomic position for read 2, i.e. Deletions and insertions
-		my $I_count_2 = 0;
-
-		for (1..$ignore_r2) {
-		  my $op = shift @comp_cigar_2; # adjusting composite CIGAR string of read 2 by removing $ignore operations from the start
-		  # print "$_ deleted $op\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $D_count_2++;
-		    $op = shift @comp_cigar_2;
-		    # print "$_ deleted $op\n";
-		  }
-		  if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		    $I_count_2++;
-		  }
-		}
-		
-		$start_read_2 += $ignore_r2 + $D_count_2 - $I_count_2;
-		# print "start read 2 $start_read_2\t ignore R2: $ignore_r2\t D count 2: $D_count_2\tI_count 2: $I_count_2\n";
-	      }
-	    }
-	  }
-	
-	  if ($ignore and $meth_call_1){ # if the methylation call string is undefined at this position we don't need any new CIGAR string
-	
-	    ### reconstituting shortened CIGAR string 1
-	    my $new_cigar_1;
-	    my $count_1 = 0;
-	    my $last_op_1;
-	    # print "ignore adjusted CIGAR 1: @comp_cigar_1\n";
-	    foreach my $op (@comp_cigar_1) {
-	      unless (defined $last_op_1){
-		$last_op_1 = $op;
-		++$count_1;
-		next;
-	      }
-	      if ($last_op_1 eq $op) {
-		++$count_1;
-	      } else {
-		$new_cigar_1 .= "$count_1$last_op_1";
-		$last_op_1 = $op;
-		$count_1 = 1;
-	      }
-	    }
-	    $new_cigar_1 .= "$count_1$last_op_1"; # appending the last operation and count
-	    $cigar_1 = $new_cigar_1;
-	    # print "ignore adjusted CIGAR 1 scalar: $cigar_1\n";
-	  }
-
-	  if ($ignore_r2 and $meth_call_2){ # if the methylation call string is undefined at this point we don't need any new CIGAR string
-
-	    ### reconstituting shortened CIGAR string 2
-	    my $new_cigar_2;
-	    my $count_2 = 0;
-	    my $last_op_2;
-	    # print "ignore adjusted CIGAR 2: @comp_cigar_2\n";
-	    foreach my $op (@comp_cigar_2) {
-	      unless (defined $last_op_2){
-		$last_op_2 = $op;
-		++$count_2;
-		next;
-	      }
-	      if ($last_op_2 eq $op) {
-		++$count_2;
-	      }
-	      else {
-		$new_cigar_2 .= "$count_2$last_op_2";
-		$last_op_2 = $op;
-		$count_2 = 1;
-	      }
-	    }
-	    $new_cigar_2 .= "$count_2$last_op_2"; # appending the last operation and count
-	    $cigar_2 = $new_cigar_2;
-	    # print "ignore_r2 adjusted CIGAR 2 scalar: $cigar_2\n";
-	  }
-
-	  ###########################
-	  ###  END IGNORE 5' END  ###
-	  ###########################
-
-	  ##################################
-	  ###  IGNORE BASES FROM 3' END  ###
-	  ##################################
-
-	  # print "CIGAR string before truncating 3' end (Read 1)\n";
-	  # print join ("",@comp_cigar_1),"\n";
-		
-	  if ($ignore_3prime and $meth_call_1) { # if the methylation call string is undefined at this point we don't need to process the read any further
-
-	    ### Clipping off the last <int> number of bases from the methylation call string as specified with '--ignore_3prime <int>' for read 1	
-	    ### the methylation calls have already been reversed where necessary
-
-	    if ( (length($meth_call_1) - $ignore_3prime) <= 0){
-	      $meth_call_1 = undef; # will skip this read entirely since the read is shorter than the portion to be ignored
-	    }
-	    else {
-	      $meth_call_1 = substr($meth_call_1,0,length($meth_call_1) - $ignore_3prime);
-	      # warn "truncated meth_call 1:\n$meth_call_1\n";
-	
-	      if ($strand eq '+') {
-
-		### if the (read 1) strand information is '+', clipping the 3' end does not affect the starting position of forward strand alignments
-		# ignore 5' has already been taken care of at this stage, if relevant at all
-		
-		for (1..$ignore_3prime) {
-		  my $op = pop @comp_cigar_1; # adjusting composite CIGAR string of read 1 by removing $ignore_3prime operations from the end
-		  # print "$_ deleted $op from 3' end\n";
-		  # print join ("",@comp_cigar_1),"\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $op = pop @comp_cigar_1;
-		    # print join ("",@comp_cigar_1),"\n";
-		    # print "$_ deleted $op from 3' end\n";
-		  }
-		}
-		
-		# print "Final truncated CIGAR string (Read 1):\n";
-		# print join ("",@comp_cigar_1),"\n";
-		
-	      }
-	      elsif ($strand eq '-') {
-
-		my $D_count_1 = 0; # counting all deletions that affect the ignored genomic position for read 1, i.e. Deletions and insertions
-		my $I_count_1 = 0;
-	
-		### if the (read 1) strand information is '-', the read 1 CIGAR string needs to be trimmed from the start
-		for (1..$ignore_3prime) {
-		  my $op = shift @comp_cigar_1; # adjusting composite CIGAR string by removing $ignore_3prime operations, here the first value of the array
-		  # print join ("",@comp_cigar_1),"\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $D_count_1++;
-		    $op = shift @comp_cigar_1;
-		    # print join ("",@comp_cigar_1),"\n";
-		  }
-
-		  if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		    $I_count_1++;
-		  }
-		}
-
-		# print "Final truncated CIGAR string reverse_read:\n";
-		# print join ("",@comp_cigar_1),"\n";
-		
-		# Here we need to add the length ignore_3prime to the read starting position
-		# adjustment of the true start position of this reverse read will take place later in the methylation extraction step
-		$start_read_1 += $ignore_3prime + $D_count_1 - $I_count_1;
-		
-	      }
-	    }
-	  }
-	
-	  if ($ignore_3prime_r2 and $meth_call_2) { # if the methylation call string is undefined at this point we don't need to process the read any further
-	
-	    ### Clipping off the last <int> number of bases from the methylation call string as specified with '--ignore_3prime_r2 <int>' for read 2	
-	    ### the methylation calls have already been reversed where necessary
-
-	    if ( (length($meth_call_2) - $ignore_3prime_r2) <= 0){
-	      $meth_call_2 = undef; # will skip this read entirely since the read is shorter than the portion to be ignored
-	    }
-	    else {
-	      $meth_call_2 = substr($meth_call_2,0,length($meth_call_2) - $ignore_3prime_r2);
-	      # warn "truncated meth_call 2:\n$meth_call_2\n";
-	
-	      ### If we are ignoring a part of the sequence we also need to adjust the cigar string and the positions accordingly
-	
-	      if ($strand eq '+') {
-		
-		### if the (read 1) strand information is '+', clipping the 3' end of read 2 does potentially affect the starting position of read 2 (reverse strand alignment)
-		### if the (read 1) strand information is '+', read 2 needs to be trimmed from the start
-		
-		my $D_count_2 = 0; # counting all deletions that affect the ignored genomic position for read 2, i.e. Deletions and insertions
-		my $I_count_2 = 0;
-		
-		for (1..$ignore_3prime_r2) {
-		  my $op = shift @comp_cigar_2; # adjusting composite CIGAR string by removing $ignore operations, here the first value of the array
-		  # print "$_ deleted $op from 3' end\n";
-		  # print join ("",@comp_cigar_2),"\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $D_count_2++;
-		    $op = shift @comp_cigar_2;
-		    # print "$_ deleted $op from 3' end\n";
-		    # print join ("",@comp_cigar_2),"\n";
-		  }
-
-		  if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		    $I_count_2++;
-		  }
-		}
-		
-		# print "Final truncated CIGAR string 2 (+ alignment):\n";
-		# print join ("",@comp_cigar_2),"\n";
-		
-		# Here we need to add the length ignore_3prime_r2 to the read starting position
-		# adjustment of the true start position of this reverse read will take place later in the methylation extraction step
-		$start_read_2 += $ignore_3prime_r2 + $D_count_2 - $I_count_2;
-		
-		# print "start read 2 $start_read_2\t ignore R2: $ignore_r2\t D count 2: $D_count_2\tI_count 2: $I_count_2\n";
-	      }
-	      elsif ($strand eq '-') {
-		### if the (read 1) strand information is '-', clipping the 3' end of read 2 does not affect its starting position (forward strand alignment)
-		### ignore_r2 5' has already been taken care of at this stage, if relevant at all
-		
-		### if the (read 1) strand information is '-', read 2 needs to be trimmed from the end
-		
-		for (1..$ignore_3prime_r2) {
-		  my $op = pop @comp_cigar_2; # adjusting composite CIGAR string of read 2 by removing $ignore operations from the start
-		  # print "$_ deleted $op\n";
-		  # print join ("",@comp_cigar_2),"\n";
-		
-		  while ($op eq 'D') { # repeating this for deletions (D)
-		    $op = pop @comp_cigar_2;
-		    # print "$_ deleted $op\n";
-		    # print join ("",@comp_cigar_2),"\n";
-		  }
-		}
-		
-		# print "Final truncated CIGAR string 2 (- alignment):\n";
-		# print join ("",@comp_cigar_2),"\n";
-		
-	      }
-	    }
-	  }
-	
-	  if ($ignore_3prime and $meth_call_1){ # if the methylation call string is undefined at this point we don't need any new CIGAR string
-	
-	    ### reconstituting shortened CIGAR string 1
-	    my $new_cigar_1;
-	    my $count_1 = 0;
-	    my $last_op_1;
-	    # print "ignore_3prime adjusted CIGAR 1: @comp_cigar_1\n";
-	    foreach my $op (@comp_cigar_1) {
-	      unless (defined $last_op_1){
-		$last_op_1 = $op;
-		++$count_1;
-		next;
-	      }
-	      if ($last_op_1 eq $op) {
-		++$count_1;
-	      }
-	      else {
-		$new_cigar_1 .= "$count_1$last_op_1";
-		$last_op_1 = $op;
-		$count_1 = 1;
-	      }
-	    }
-	    $new_cigar_1 .= "$count_1$last_op_1"; # appending the last operation and count
-	    $cigar_1 = $new_cigar_1;
-	    # warn "ignore_3prime adjusted CIGAR 1 scalar: $cigar_1\n";
-	  }
-
-	  if ($ignore_3prime_r2 and $meth_call_2){ # if the methylation call string is undefined at this point we don't need any new CIGAR string
-
-	    ### reconstituting shortened CIGAR string 2
-	    my $new_cigar_2;
-	    my $count_2 = 0;
-	    my $last_op_2;
-	    # print "ignore_3prime_r2 adjusted CIGAR 2: @comp_cigar_2\n";
-	    foreach my $op (@comp_cigar_2) {
-	      unless (defined $last_op_2){
-		$last_op_2 = $op;
-		++$count_2;
-		next;
-	      }
-	      if ($last_op_2 eq $op) {
-		++$count_2;
-	      }
-	      else {
-		$new_cigar_2 .= "$count_2$last_op_2";
-		$last_op_2 = $op;
-		$count_2 = 1;
-	      }
-	    }
-	    $new_cigar_2 .= "$count_2$last_op_2"; # appending the last operation and count
-	    $cigar_2 = $new_cigar_2;
-	    # warn "ignore_3prime_r2 adjusted CIGAR 2 scalar: $cigar_2\n";
-	  }
-
-	  ###########################
-	  ###  END IGNORE 3' END  ###
-	  ###########################
-
-
-	  ### Adjusting CIGAR string and starting position of reads in reverse orientation which we will pass to the extraction subroutine later on
-	
-	  if ($strand eq '+') {
-	    ### adjusting the start position for all reads mapping to the reverse strand, in this case read 2
-	    @comp_cigar_2  = reverse@comp_cigar_2; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-	    # print "reverse: @comp_cigar_2\n";
-	
-	    my $MD_count_1 = 0;
-	    foreach (@comp_cigar_1) {
-	      ++$MD_count_1 if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	    }
-
-	    my $MD_count_2 = 0;
-	    foreach (@comp_cigar_2) {
-	      ++$MD_count_2 if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	    }
-
-	    $end_read_1 = $start_read_1 + $MD_count_1 - 1;
-	    $start_read_2 += $MD_count_2 - 1; ## Passing on the start position on the reverse strand
-	  }
-	  else {
-	    ### adjusting the start position for all reads mapping to the reverse strand, in this case read 1
-	
-	    @comp_cigar_1  = reverse@comp_cigar_1; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-	    # print "reverse: @comp_cigar_1\n";
-
-	    my $MD_count_1 = 0;
-	    foreach (@comp_cigar_1) {
-	      ++$MD_count_1 if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	    }
-
-	    $end_read_1 = $start_read_1;	
-	    $start_read_1 +=  $MD_count_1 - 1; ### Passing on the start position on the reverse strand
-	  }
-
-	  if ($strand eq '+') {
-	    ## we first pass the first read which is in + orientation on the forward strand; the last value is the read identity
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$start_read_1,$id_1,'+',$index,0,0,$cigar_1,1);
-	
-	    # we next pass the second read which is in - orientation on the reverse strand
-	    ### if --no_overlap was specified we also pass the end of read 1. If read 2 starts to overlap with read 1 we can stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$start_read_2,$id_2,'-',$index,$no_overlap,$end_read_1,$cigar_2,2);
-	  }
-	  else {
-	    ## we first pass the first read which is in - orientation on the reverse strand
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$start_read_1,$id_1,'-',$index,0,0,$cigar_1,1);
-	
-	    # we next pass the second read which is in + orientation on the forward strand
-	    ### if --no_overlap was specified we also pass the end of read 1. If read 2 starts to overlap with read 1 we will stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$start_read_2,$id_2,'+',$index,$no_overlap,$end_read_1,$cigar_2,2);
-	  }
-	
-	  $methylation_call_strings_processed += 2; # paired-end = 2 methylation call strings
-	}	
-      }
-    }
-  } else {
-    die "Single-end or paired-end reads not specified properly\n";
-  }
-
-  $counting{sequences_count}          = $line_count;
-  $counting{methylation_call_strings} = $methylation_call_strings_processed;
-
-  if ($multicore == 1){
-    print_splitting_report ();
-  }
-  elsif ($multicore > 1){
-    print_splitting_report_multicore($report_filename,$offset,$line_count,$methylation_call_strings_processed);
-    print_mbias_report_multicore($report_filename,$offset,$line_count,$methylation_call_strings_processed);
-  }
-
-  return ($process_id,\@pids,$report_filename);
-
-}
-
-
-
-sub print_splitting_report{
-
-  ### Calculating methylation percentages if applicable
-  warn "\nProcessed $counting{sequences_count} lines in total\n";
-  warn "Total number of methylation call strings processed: $counting{methylation_call_strings}\n\n";
-  if ($report) {
-    print REPORT "\nProcessed $counting{sequences_count} lines in total\n";
-    print REPORT "Total number of methylation call strings processed: $counting{methylation_call_strings}\n\n";
-  }
-
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_non_CpG_methylation;
-  if ($merge_non_CpG){
-    if ( ($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}+$counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-      $percent_non_CpG_methylation = sprintf("%.1f",100* ( $counting{total_meCHH_count}+$counting{total_meCHG_count} ) / ( $counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}+$counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count} ) );
-    }
-  }
-
-  if ($report){
-    ### detailed information about Cs analysed
-    print REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-    my $total_number_of_C = $counting{total_meCHG_count}+$counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-    print REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-    print REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-    print REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-    print REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n\n";
-
-    print REPORT "Total C to T conversions in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-    print REPORT "Total C to T conversions in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-    print REPORT "Total C to T conversions in CHH context:\t$counting{total_unmethylated_CHH_count}\n\n";
-
-    ### calculating methylated CpG percentage if applicable
-    if ($percent_meCpG){
-      print REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-    }
-    else{
-      print REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    }
-
-    ### 2-Context Output
-    if ($merge_non_CpG){
-      if ($percent_non_CpG_methylation){
-	print REPORT "C methylated in non-CpG context:\t${percent_non_CpG_methylation}%\n\n\n";
-      }
-      else{
-	print REPORT "Can't determine percentage of methylated Cs in non-CpG context if value was 0\n\n\n";
-      }
-    }
-
-    ### 3 Context Output
-    else{
-      ### calculating methylated CHG percentage if applicable
-      if ($percent_meCHG){
-	print REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-      }
-      else{
-	print REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-      }
-
-      ### calculating methylated CHH percentage if applicable
-      if ($percent_meCHH){
-	print REPORT "C methylated in CHH context:\t${percent_meCHH}%\n\n\n";
-      }
-      else{
-	print REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n\n\n";
-      }
-    }
-  }
-
-  ### detailed information about Cs analysed for on-screen report
-  warn "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-  my $total_number_of_C = $counting{total_meCHG_count}+$counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-  warn "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-  warn "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  warn "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  warn"Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n\n";
-
-  warn "Total C to T conversions in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  warn "Total C to T conversions in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  warn"Total C to T conversions in CHH context:\t$counting{total_unmethylated_CHH_count}\n\n";
-
-  ### printing methylated CpG percentage if applicable
-  if ($percent_meCpG){
-    warn "C methylated in CpG context:\t${percent_meCpG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-  }
-
-  ### 2-Context Output
-  if ($merge_non_CpG){
-    if ($percent_non_CpG_methylation){
-      warn "C methylated in non-CpG context:\t${percent_non_CpG_methylation}%\n\n\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in non-CpG context if value was 0\n\n\n";
-    }
-  }
-
-  ### 3-Context Output
-  else{
-    ### printing methylated CHG percentage if applicable
-    if ($percent_meCHG){
-      warn "C methylated in CHG context:\t${percent_meCHG}%\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-    }
-
-    ### printing methylated CHH percentage if applicable
-    if ($percent_meCHH){
-      warn "C methylated in CHH context:\t${percent_meCHH}%\n\n\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in CHH context if value was 0\n\n\n";
-    }
-  }
-}
-
-###
-
-sub print_splitting_report_multicore{
-
-  my ($report_filename,$offset,$line_count,$meth_call_strings) = @_;
-
-  # warn "\$report_filename is $report_filename\n";
-  my $special_report = $report_filename.".$offset";
-
-  open (SPECIAL_REPORT,'>',$special_report) or die $!;
-  # warn "line count\t$line_count\n";
-  # warn "meth call strings\t$meth_call_strings\n";
-
-  print SPECIAL_REPORT "line count\t$line_count\n";
-  print SPECIAL_REPORT "meth call strings\t$meth_call_strings\n";
-
-  ### Calculating methylation percentages if applicable
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_non_CpG_methylation;
-  if ($merge_non_CpG){
-    if ( ($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}+$counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-      $percent_non_CpG_methylation = sprintf("%.1f",100* ( $counting{total_meCHH_count}+$counting{total_meCHG_count} ) / ( $counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}+$counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count} ) );
-    }
-  }
-
-  if ($report){
-
-    ### detailed information about Cs analysed
-    print SPECIAL_REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-    my $total_number_of_C = $counting{total_meCHG_count}+$counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-    print SPECIAL_REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-    print SPECIAL_REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-    print SPECIAL_REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-    print SPECIAL_REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n\n";
-
-    print SPECIAL_REPORT "Total C to T conversions in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-    print SPECIAL_REPORT "Total C to T conversions in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-    print SPECIAL_REPORT "Total C to T conversions in CHH context:\t$counting{total_unmethylated_CHH_count}\n\n";
-
-    ### calculating methylated CpG percentage if applicable
-    if ($percent_meCpG){
-      print SPECIAL_REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-    }
-    else{
-      print SPECIAL_REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    }
-
-    ### 2-Context Output
-    if ($merge_non_CpG){
-      if ($percent_non_CpG_methylation){
-	print SPECIAL_REPORT "C methylated in non-CpG context:\t${percent_non_CpG_methylation}%\n\n\n";
-      }
-      else{
-	print SPECIAL_REPORT "Can't determine percentage of methylated Cs in non-CpG context if value was 0\n\n\n";
-      }
-    }
-
-    ### 3 Context Output
-    else{
-      ### calculating methylated CHG percentage if applicable
-      if ($percent_meCHG){
-	print SPECIAL_REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-      }
-      else{
-	print SPECIAL_REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-      }
-
-      ### calculating methylated CHH percentage if applicable
-      if ($percent_meCHH){
-	print SPECIAL_REPORT "C methylated in CHH context:\t${percent_meCHH}%\n\n\n";
-      }
-      else{
-	print SPECIAL_REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n\n\n";
-      }
-    }
-  }
-  close SPECIAL_REPORT or warn "Failed to close filehandle for individual report $special_report\n";
-}
-
-
-###
-
-### INDIVIDUAL M-BIAS REPORTS
-
-sub print_mbias_report_multicore{
-
-  my ($report_filename,$offset,$line_count,$meth_call_strings) = @_;
-
-  # warn "\$report_filename is $report_filename\n";
-  my $special_mbias_report = $report_filename.".${offset}.mbias";
-
-  open (SPECIAL_MBIAS,'>',$special_mbias_report) or die $!;
-
-  # determining maximum read length
-  my $max_length_1 = 0;
-  my $max_length_2 = 0;
-
-  foreach my $context (keys %mbias_1){
-    foreach my $pos (sort {$a<=>$b} keys %{$mbias_1{$context}}){
-      $max_length_1 = $pos unless ($max_length_1 >= $pos);
-    }
-  }
-  if ($paired){
-    foreach my $context (keys %mbias_2){
-      foreach my $pos (sort {$a<=>$b} keys %{$mbias_2{$context}}){
-	$max_length_2 = $pos unless ($max_length_2 >= $pos);
-      }
-    }
-  }
-
-  if ($single){
-    # warn "Determining maximum read length for M-Bias plot\n";
-    # warn "Maximum read length of Read 1: $max_length_1\n\n";
-  }
-  else{
-    # warn "Determining maximum read lengths for M-Bias plots\n";
-    # warn "Maximum read length of Read 1: $max_length_1\n";
-    # warn "Maximum read length of Read 2: $max_length_2\n\n";
-  }
-
-  foreach my $context (qw(CpG CHG CHH)){
-
-    if ($paired){
-      print SPECIAL_MBIAS "$context context (R1)\n================\n";
-    }
-    else{
-      print SPECIAL_MBIAS "$context context\n===========\n";
-    }
-    print SPECIAL_MBIAS "position\tcount methylated\tcount unmethylated\t% methylation\tcoverage\n";
-
-    foreach my $pos (1..$max_length_1){
-
-      unless (defined $mbias_1{$context}->{$pos}->{meth}){
-	$mbias_1{$context}->{$pos}->{meth} = 0;
-      }
-      unless (defined $mbias_1{$context}->{$pos}->{un}){
-	$mbias_1{$context}->{$pos}->{un} = 0;
-      }
-
-      my $percent = '';
-      if (($mbias_1{$context}->{$pos}->{meth} + $mbias_1{$context}->{$pos}->{un}) > 0){
-	$percent = sprintf("%.2f",$mbias_1{$context}->{$pos}->{meth} * 100/ ( $mbias_1{$context}->{$pos}->{meth} + $mbias_1{$context}->{$pos}->{un}) );
-      }
-      my $coverage = $mbias_1{$context}->{$pos}->{un} + $mbias_1{$context}->{$pos}->{meth};
-
-      print SPECIAL_MBIAS "$pos\t$mbias_1{$context}->{$pos}->{meth}\t$mbias_1{$context}->{$pos}->{un}\t$percent\t$coverage\n";
-    }
-    print SPECIAL_MBIAS "\n";
-  }
-
-  if ($paired){
-
-    foreach my $context (qw(CpG CHG CHH)){
-
-      print SPECIAL_MBIAS "$context context (R2)\n================\n";
-      print SPECIAL_MBIAS "position\tcount methylated\tcount unmethylated\t% methylation\tcoverage\n";
-
-      foreach my $pos (1..$max_length_2){
-	
-	unless (defined $mbias_2{$context}->{$pos}->{meth}){
-	  $mbias_2{$context}->{$pos}->{meth} = 0;
-	}
-	unless (defined $mbias_2{$context}->{$pos}->{un}){
-	  $mbias_2{$context}->{$pos}->{un} = 0;
-	}
-
-	my $percent = '';
-	if (($mbias_2{$context}->{$pos}->{meth} + $mbias_2{$context}->{$pos}->{un}) > 0){
-	  $percent = sprintf("%.2f",$mbias_2{$context}->{$pos}->{meth} * 100/ ($mbias_2{$context}->{$pos}->{meth} + $mbias_2{$context}->{$pos}->{un}) );
-	}
-	my $coverage = $mbias_2{$context}->{$pos}->{un} + $mbias_2{$context}->{$pos}->{meth};
-
-	print SPECIAL_MBIAS "$pos\t$mbias_2{$context}->{$pos}->{meth}\t$mbias_2{$context}->{$pos}->{un}\t$percent\t$coverage\n";
-      }	
-    }
-  }
-
-  close SPECIAL_MBIAS or warn "Failed to close filehandle for individual M-bias report $special_mbias_report\n";
-}
-
-
-###
-
-
-sub print_individual_C_methylation_states_paired_end_files{
-
-  my ($meth_call,$chrom,$start,$id,$strand,$filehandle_index,$no_overlap,$end_read_1,$cigar,$read_identity) = @_;
-
-  unless (defined $meth_call) {
-    return; # skip this read
-  }
-
-  ### we will use the read identity for the M-bias plot to discriminate read 1 and read 2
-  die "Read identity was neither 1 nor 2: $read_identity\n\n" unless ($read_identity == 1 or $read_identity == 2);
-
-  my @methylation_calls = split(//,$meth_call);
-
-  #################################################################
-  ### . for bases not involving cytosines                       ###
-  ### X for methylated C in CHG context (was protected)         ###
-  ### x for not methylated C in CHG context (was converted)     ###
-  ### H for methylated C in CHH context (was protected)         ###
-  ### h for not methylated C in CHH context (was converted)     ###
-  ### Z for methylated C in CpG context (was protected)         ###
-  ### z for not methylated C in CpG context (was converted)     ###
-  ### U for methylated C in Unknown context (was protected)     ###
-  ### u for not methylated C in Unknown context (was converted) ###
-  #################################################################
-
-  my $methyl_CHG_count = 0;
-  my $methyl_CHH_count = 0;
-  my $methyl_CpG_count = 0;
-  my $unmethylated_CHG_count = 0;
-  my $unmethylated_CHH_count = 0;
-  my $unmethylated_CpG_count = 0;
-
-  my $pos_offset = 0; # this is only relevant for SAM reads with insertions or deletions
-  my $cigar_offset = 0; # again, this is only relevant for SAM reads containing indels
-  my @comp_cigar;
-
-  ### Checking whether the CIGAR string is a linear genomic match or whether if requires indel processing
-  if ($cigar =~ /^\d+M$/){
-    # this check speeds up the extraction process by up to 60%!!!
-  }
-  else{ # parsing CIGAR string
-    my @len;
-    my @ops;
-    @len = split (/\D+/,$cigar); # storing the length per operation
-    @ops = split (/\d+/,$cigar); # storing the operation
-    shift @ops; # remove the empty first element
-
-    die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-    foreach my $index (0..$#len){
-      foreach (1..$len[$index]){
-	# print  "$ops[$index]";
-	push @comp_cigar, $ops[$index];
-      }
-    }
-    # warn "\nDetected CIGAR string: $cigar\n";
-    # warn "Length of methylation call: ",length $meth_call,"\n";
-    # warn "number of operations: ",scalar @ops,"\n";
-    # warn "number of length digits: ",scalar @len,"\n\n";
-    # print @comp_cigar,"\n";
-    # print "$meth_call\n\n";
-    # sleep (1);
-  }
-
-  if ($strand eq '-') {
-
-    ### the  CIGAR string needs to be reversed, the methylation call has already been reversed above
-    if (@comp_cigar){
-      @comp_cigar  = reverse@comp_cigar; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-    }
-    #  print "reverse CIGAR string: @comp_cigar\n";
-
-    ### the start position of paired-end files has already been corrected, see above
-  }
-
-  ### THIS IS AN OPTIONAL 2-CONTEXT (CpG and non-CpG) SECTION IF --merge_non_CpG was specified
-
-  if ($merge_non_CpG) {
-    if ($no_overlap) { # this has to be read 2...
-
-      ### single-file CpG and non-CpG context output
-      if ($full) {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-	
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-	
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start+$index+$pos_offset >= $end_read_1) {
-	      return;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.'){}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	}
-	elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-	
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-	
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start-$index+$pos_offset <= $end_read_1) {
-	      return;
-	    }
-	
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	} else {
-	  die "The read orientation was neither + nor -: '$strand'\n";
-	}
-      }
-
-      ### strand-specific methylation output
-      else {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start+$index+$pos_offset >= $end_read_1) {
-	      return;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }	
-	  }
-	} elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start-$index+$pos_offset <= $end_read_1) {
-	      return;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }
-	  }
-	} else {
-	  die "The strand orientation was neither + nor -: '$strand'/n";
-	}
-      }
-    }
-
-    ### this is the default paired-end procedure allowing overlaps and using every single C position
-    ### Still within the 2-CONTEXT ONLY optional section
-    else {
-      ### single-file CpG and non-CpG context output
-      if ($full) {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	} elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	       if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	} else {
-	  die "The strand orientation as neither + nor -: '$strand'\n";
-	}
-      }
-
-      ### strand-specific methylation output
-      ### still within the 2-CONTEXT optional section
-      else {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	       if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }
-	  }
-	} elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }
-	  }
-	} else {
-	  die "The strand orientation as neither + nor -: '$strand'\n";
-	}
-      }
-    }
-  }
-
-  ############################################
-  ### THIS IS THE DEFAULT 3-CONTEXT OUTPUT ###
-  ############################################
-
-  elsif ($no_overlap) {
-    ### single-file CpG, CHG and CHH context output
-    if ($full) {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-	
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start+$index+$pos_offset >= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  } 
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start-$index+$pos_offset <= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-
-    ### strand-specific methylation output
-    else {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start+$index+$pos_offset >= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }	
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start-$index+$pos_offset <= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-  }
-
-  ### this is the paired-end procedure allowing overlaps and using every single C position
-  else {
-    ### single-file CpG, CHG and CHH context output
-    if ($full) {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-
-    ### strand-specific methylation output
-    else {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-  }
-}
-
-sub check_cigar_string {
-  my ($index,$cigar_offset,$pos_offset,$strand,$comp_cigar) = @_;
-  # print "$index\t$cigar_offset\t$pos_offset\t$strand\t";
-  my ($new_cigar_offset,$new_pos_offset) = (0,0);
-
-  if ($strand eq '+') {
-    #  print "### $strand strand @$comp_cigar[$index + $cigar_offset]\t";
-
-    if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-      #  warn "position needs no adjustment\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){ # insertion in the read sequence
-      $new_pos_offset -= 1; # we need to subtract the length of inserted bases from the genomic position
-      # warn "adjusted genomic position by -1 bp (insertion)\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-      $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-      $new_pos_offset += 1; # we need to add the length of deleted bases to get the genomic position
-      # warn "adjusted genomic position by +1 bp (deletion). Now looping through the CIGAR string until we hit another M or I\n";
-
-      while ( ($index + $cigar_offset + $new_cigar_offset)  < (scalar @$comp_cigar) ){	
-	if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-	  #  warn "position needs no adjustment\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){
-	  $new_pos_offset -= 1; # we need to subtract the length of inserted bases from the genomic position
-	  # warn "adjusted genomic position by another -1 bp (insertion)\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-	  $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-	  $new_pos_offset += 1; # we need to add the length of deleted bases to get the genomic position
-	  # warn "adjusted genomic position by another +1 bp (deletion)\n";
-	}
-	else{
-	  die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-	}
-      }
-    }
-    else{
-      die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-    }
-  }
-
-  elsif ($strand eq '-') {
-    # print "### $strand strand @$comp_cigar[$index + $cigar_offset]\t";
-
-    if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-     # warn "position needs no adjustment\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){ # insertion in the read sequence
-      $new_pos_offset += 1; # we need to add the length of inserted bases to the genomic position
-      # warn "adjusted genomic position by +1 bp (insertion)\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-      $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-      $new_pos_offset -= 1; # we need to subtract the length of deleted bases to get the genomic position
-      # warn "adjusted genomic position by -1 bp (deletion). Now looping through the CIGAR string until we hit another M or I\n";
-
-      while ( ($index + $cigar_offset + $new_cigar_offset)  < (scalar @$comp_cigar) ){	
-	if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-	  # warn "Found new 'M' operation; position needs no adjustment\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){
-	  $new_pos_offset += 1; # we need to subtract the length of inserted bases from the genomic position
-	  # warn "Found new 'I' operation; adjusted genomic position by another +1 bp (insertion)\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-	  $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-	  $new_pos_offset -= 1; # we need to subtract the length of deleted bases to get the genomic position
-	  # warn "adjusted genomic position by another -1 bp (deletion)\n";
-	}
-	else{
-	  die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-	}
-      }
-    }
-    else{
-      die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-    }
-  }
-  # print "new cigar offset: $new_cigar_offset\tnew pos offset: $new_pos_offset\n";
-  return ($new_cigar_offset,$new_pos_offset);
-}
-
-sub print_individual_C_methylation_states_single_end{
-
-  my ($meth_call,$chrom,$start,$id,$strand,$filehandle_index,$cigar) = @_;
-  my @methylation_calls = split(//,$meth_call);
-
-  #################################################################
-  ### . for bases not involving cytosines                       ###
-  ### X for methylated C in CHG context (was protected)         ###
-  ### x for not methylated C in CHG context (was converted)     ###
-  ### H for methylated C in CHH context (was protected)         ###
-  ### h for not methylated C in CHH context (was converted)     ###
-  ### Z for methylated C in CpG context (was protected)         ###
-  ### z for not methylated C in CpG context (was converted)     ###
-  #################################################################
-
-  my $methyl_CHG_count = 0;
-  my $methyl_CHH_count = 0;
-  my $methyl_CpG_count = 0;
-  my $unmethylated_CHG_count = 0;
-  my $unmethylated_CHH_count = 0;
-  my $unmethylated_CpG_count = 0;
-
-  my $pos_offset = 0; # this is only relevant for SAM reads with insertions or deletions
-  my $cigar_offset = 0; # again, this is only relevant for SAM reads containing indels
-
-  my @comp_cigar;
-
-  if ($cigar){ # parsing CIGAR string
-
-    ### Checking whether the CIGAR string is a linear genomic match or whether it requires indel processing
-    if ($cigar =~ /^\d+M$/){
-      #  warn "See!? I told you so! $cigar\n";
-      # sleep(1);
-    }
-    else{
-
-      my @len;
-      my @ops;
-
-      @len = split (/\D+/,$cigar); # storing the length per operation
-      @ops = split (/\d+/,$cigar); # storing the operation
-      shift @ops; # remove the empty first element
-      # die "CIGAR string contained a non-matching number of lengths and operations: id: $id\nmeth call: $meth_call\nCIGAR: $cigar\n".join(" ",@len)."\n".join(" ",@ops)."\n" unless (scalar @len == scalar @ops);
-      die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-      foreach my $index (0..$#len){
-	foreach (1..$len[$index]){
-	  # print  "$ops[$index]";
-	  push @comp_cigar, $ops[$index];
-	}
-      }
-    }
-    # warn "\nDetected CIGAR string: $cigar\n";
-    # warn "Length of methylation call: ",length $meth_call,"\n";
-    # warn "number of operations: ",scalar @ops,"\n";
-    # warn "number of length digits: ",scalar @len,"\n\n";
-    # print @comp_cigar,"\n";
-    # print "$meth_call\n\n";
-    # sleep (1);
-  }
-
-  ### adjusting the start position for all reads mapping to the reverse strand
-  if ($strand eq '-') {
-
-    if (@comp_cigar){ # only needed for SAM reads with InDels
-      @comp_cigar  = reverse@comp_cigar; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-      # print @comp_cigar,"\n";
-    }
-
-    unless ($ignore){  ### if --ignore was specified the start position has already been corrected
-
-      if ($cigar){ ### SAM format
-	if ($cigar =~ /^(\d+)M$/){ # linear match
-	  $start += $1 - 1;
-	}
-	else{ # InDel read
-	  my $MD_count = 0;
-	  foreach (@comp_cigar){
-	    ++$MD_count if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	  }
-	  $start += $MD_count - 1;
-	}
-      }
-      else{ ### vanilla format
-	$start += length($meth_call)-1;
-      }
-    }
-  }
-
-  ### THIS IS THE CpG and Non-CpG SECTION (OPTIONAL)
-
-  ### single-file CpG and other-context output
-  if ($full and $merge_non_CpG) {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	
-	if ($cigar and @comp_cigar){ # only needed for SAM alignments with InDels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-	
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  # print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  #  print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{CpG_context}} $line unless($mbias_only);
-	  # print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{CpG_context}} $line unless($mbias_only);
-	  # print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  # print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  # print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM entries with InDels
-	  # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  #print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  #print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{CpG_context}} $line unless($mbias_only);
-	  #print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{CpG_context}} $line unless($mbias_only);
-	  #print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  my $line = join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  #print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  my $line = join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n";
-	  print {$fhs{other_context}} $line unless($mbias_only);
-	  #print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.'){}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The strand information was neither + nor -: $strand\n";
-    }
-  }
-
-  ### strand-specific methylation output
-  elsif ($merge_non_CpG) {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-    	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The strand information was neither + nor -: $strand\n";
-    }
-  }
-
-  ### THIS IS THE 3-CONTEXT (CpG, CHG and CHH) DEFAULT SECTION
-
-  elsif ($full) {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-	
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-	
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The read had a strand orientation which was neither + nor -: $strand\n";
-    }
-  }
-
-  ### strand-specific methylation output
-  else {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index])."\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The strand information was neither + nor -: $strand\n";
-    }
-  }
-}
-
-sub open_output_filehandles{
-
-  my $filename = shift;
-
-  my $output_filename = (split (/\//,$filename))[-1];
-  my $report_filename = $output_filename;
-
-  ### OPENING OUTPUT-FILEHANDLES
-  if ($report) {
-    $report_filename =~ s/\.sam$//;
-    $report_filename =~ s/\.txt$//;
-    $report_filename =~ s/$/_splitting_report.txt/;
-    $report_filename = $output_dir . $report_filename;
-    open (REPORT,'>',$report_filename) or die "Failed to write to file $report_filename $!\n";
-  }
-
-  if ($report) {
-
-    print REPORT "$output_filename\n\n";
-    print REPORT "Parameters used to extract methylation information:\n";
-    print REPORT "Bismark Extractor Version: $version\n";
-
-    if ($paired) {
-      if ($vanilla) {
-	print REPORT "Bismark result file: paired-end (vanilla Bismark format)\n";
-      } else {
-	print REPORT "Bismark result file: paired-end (SAM format)\n"; # default
-      }
-    }
-
-    if ($single) {
-      if ($vanilla) {
-	print REPORT "Bismark result file: single-end (vanilla Bismark format)\n";
-      } else {
-	print REPORT "Bismark result file: single-end (SAM format)\n"; # default
-      }
-    }
-    if ($single){
-      if ($ignore) {
-	print REPORT "Ignoring first $ignore bp\n";
-      }
-      if ($ignore_3prime) {
-	print REPORT "Ignoring last $ignore_3prime bp\n";
-      }
-    }
-    else{ # paired-end
-      if ($ignore) {
-	print REPORT "Ignoring first $ignore bp of Read 1\n";
-      }
-      if ($ignore_r2){
-	print REPORT "Ignoring first $ignore_r2 bp of Read 2\n";
-      }
-
-      if ($ignore_3prime) {
-	print REPORT "Ignoring last $ignore_3prime bp of Read 1\n";
-      }
-      if ($ignore_3prime_r2){
-	print REPORT "Ignoring last $ignore_3prime_r2 bp of Read 2\n";
-      }
-
-    }
-
-    if ($full) {
-      print REPORT "Output specified: comprehensive\n";
-    } else {
-      print REPORT "Output specified: strand-specific (default)\n";
-    }
-
-    if ($no_overlap) {
-      print REPORT "No overlapping methylation calls specified\n";
-    }
-    if ($genomic_fasta) {
-      print REPORT "Genomic equivalent sequences will be printed out in FastA format\n";
-    }
-    if ($merge_non_CpG) {
-      print REPORT "Methylation in CHG and CHH context will be merged into \"non-CpG context\" output\n";
-    }
-
-    print REPORT "\n";
-  }
-
-  #####   open (OUT,"| gzip -c - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-
-  ### CpG-context and non-CpG context. THIS SECTION IS OPTIONAL
-  ### if --comprehensive AND --merge_non_CpG was specified we are only writing out one CpG-context and one Any-Other-context result file
-  if ($full and $merge_non_CpG) {
-    my $cpg_output = my $other_c_output = $output_filename;
-    ### C in CpG context
-    $cpg_output =~ s/^/CpG_context_/;
-    $cpg_output =~ s/sam$/txt/;
-    $cpg_output =~ s/bam$/txt/;
-    $cpg_output =~ s/$/.txt/ unless ($cpg_output =~ /\.txt$/);
-    $cpg_output = $output_dir . $cpg_output;
-
-    if ($gzip){
-      $cpg_output .= '.gz';
-      open ($fhs{CpG_context},"| gzip -c - > $cpg_output") or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-    }
-    else{ ### disclaimer: I am aware of "The Useless Use of Cat Awards", but I saw no other option...
-      open ($fhs{CpG_context},"| cat > $cpg_output") or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-      # open ($fhs{CpG_context},'>',$cpg_output) or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context to $cpg_output\n" unless($mbias_only);
-    push @sorting_files,$cpg_output;
-
-    unless ($no_header) {
-      print {$fhs{CpG_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### C in any other context than CpG
-    $other_c_output =~ s/^/Non_CpG_context_/;
-    $other_c_output =~ s/sam$/txt/;
-    $other_c_output =~ s/bam$/txt/;
-    $other_c_output =~ s/$/.txt/ unless ($other_c_output =~ /\.txt$/);
-    $other_c_output = $output_dir . $other_c_output;
-
-    if ($gzip){
-      $other_c_output .= '.gz';
-      open ($fhs{other_context},"| gzip -c - > $other_c_output") or die "Failed to write to $other_c_output $! \n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{other_context},"| cat > $other_c_output") or die "Failed to write to $other_c_output $!\n" unless($mbias_only);
-      #   open ($fhs{other_context},'>',$other_c_output) or die "Failed to write to $other_c_output $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in any other context to $other_c_output\n" unless($mbias_only);
-    push @sorting_files,$other_c_output;
-
-
-    unless ($no_header) {
-      print {$fhs{other_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-  }
-
-  ### if only --merge_non_CpG was specified we will write out 8 different output files, depending on where the (first) unique best alignment has been found
-  elsif ($merge_non_CpG) {
-
-    my $cpg_ot = my $cpg_ctot = my $cpg_ctob = my $cpg_ob = $output_filename;
-
-    ### For cytosines in CpG context
-    $cpg_ot =~ s/^/CpG_OT_/;
-    $cpg_ot =~ s/sam$/txt/;
-    $cpg_ot =~ s/bam$/txt/;
-    $cpg_ot =~ s/$/.txt/ unless ($cpg_ot =~ /\.txt$/);
-    $cpg_ot = $output_dir . $cpg_ot;
-
-    if ($gzip){
-      $cpg_ot .= '.gz';
-      open ($fhs{0}->{CpG},"| gzip -c - > $cpg_ot") or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{0}->{CpG},"| cat > $cpg_ot") or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-      # open ($fhs{0}->{CpG},'>',$cpg_ot) or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the original top strand to $cpg_ot\n" unless($mbias_only);
-    push @sorting_files,$cpg_ot;
-
-    unless($no_header){
-      print {$fhs{0}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ctot =~ s/^/CpG_CTOT_/;
-    $cpg_ctot =~ s/sam$/txt/;
-    $cpg_ctot =~ s/bam$/txt/;
-    $cpg_ctot =~ s/$/.txt/ unless ($cpg_ctot =~ /\.txt$/);
-    $cpg_ctot = $output_dir . $cpg_ctot;
-
-    if ($gzip){
-      $cpg_ctot .= '.gz';
-      open ($fhs{1}->{CpG},"| gzip -c - > $cpg_ctot") or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{1}->{CpG},"| cat > $cpg_ctot") or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-      # open ($fhs{1}->{CpG},'>',$cpg_ctot) or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the complementary to original top strand to $cpg_ctot\n" unless($mbias_only);
-    push @sorting_files,$cpg_ctot;
-
-    unless($no_header){
-      print {$fhs{1}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ctob =~ s/^/CpG_CTOB_/;
-    $cpg_ctob =~ s/sam$/txt/;
-    $cpg_ctob =~ s/bam$/txt/;
-    $cpg_ctob =~ s/$/.txt/ unless ($cpg_ctob =~ /\.txt$/);
-    $cpg_ctob = $output_dir . $cpg_ctob;
-
-    if ($gzip){
-      $cpg_ctob .= '.gz';
-      open ($fhs{2}->{CpG},"| gzip -c - > $cpg_ctob") or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{2}->{CpG},"| cat > $cpg_ctob") or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-      # open ($fhs{2}->{CpG},'>',$cpg_ctob) or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the complementary to original bottom strand to $cpg_ctob\n" unless($mbias_only);
-    push @sorting_files,$cpg_ctob;
-
-    unless($no_header){
-      print {$fhs{2}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ob =~ s/^/CpG_OB_/;
-    $cpg_ob =~ s/sam$/txt/;
-    $cpg_ob =~ s/bam$/txt/;
-    $cpg_ob =~ s/$/.txt/ unless ($cpg_ob =~ /\.txt$/);
-    $cpg_ob = $output_dir . $cpg_ob;
-
-    if ($gzip){
-      $cpg_ob .= '.gz';
-      open ($fhs{3}->{CpG},"| gzip -c - > $cpg_ob") or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{3}->{CpG},"| cat > $cpg_ob") or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-      # open ($fhs{3}->{CpG},'>',$cpg_ob) or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the original bottom strand to $cpg_ob\n\n" unless($mbias_only);
-    push @sorting_files,$cpg_ob;
-
-    unless($no_header){
-      print {$fhs{3}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### For cytosines in Non-CpG (CC, CT or CA) context
-    my $other_c_ot = my $other_c_ctot = my $other_c_ctob = my $other_c_ob = $output_filename;
-
-    $other_c_ot =~ s/^/Non_CpG_OT_/;
-    $other_c_ot =~ s/sam$/txt/;
-    $other_c_ot =~ s/bam$/txt/;
-    $other_c_ot =~ s/$/.txt/ unless ($other_c_ot =~ /\.txt$/);
-    $other_c_ot = $output_dir . $other_c_ot;
-
-    if ($gzip){
-      $other_c_ot .= '.gz';
-      open ($fhs{0}->{other_c},"| gzip -c - > $other_c_ot") or die "Failed to write to $other_c_ot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{0}->{other_c},"| cat > $other_c_ot") or die "Failed to write to $other_c_ot $!\n" unless($mbias_only);
-      # open ($fhs{0}->{other_c},'>',$other_c_ot) or die "Failed to write to $other_c_ot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in any other context from the original top strand to $other_c_ot\n" unless($mbias_only);
-    push @sorting_files,$other_c_ot;
-
-    unless($no_header){
-      print {$fhs{0}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $other_c_ctot =~ s/^/Non_CpG_CTOT_/;
-    $other_c_ctot =~ s/sam$/txt/;
-    $other_c_ctot =~ s/bam$/txt/;
-    $other_c_ctot =~ s/$/.txt/ unless ($other_c_ctot =~ /\.txt$/);
-    $other_c_ctot = $output_dir . $other_c_ctot;
-
-    if ($gzip){
-      $other_c_ctot .= '.gz';
-      open ($fhs{1}->{other_c},"| gzip -c - > $other_c_ctot") or die "Failed to write to $other_c_ctot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{1}->{other_c},"|  cat > $other_c_ctot") or die "Failed to write to $other_c_ctot $!\n" unless($mbias_only);
-      # open ($fhs{1}->{other_c},'>',$other_c_ctot) or die "Failed to write to $other_c_ctot $!\n" unless($mbias_only);
-   }
-
-    warn "Writing result file containing methylation information for C in any other context from the complementary to original top strand to $other_c_ctot\n" unless($mbias_only);
-    push @sorting_files,$other_c_ctot;
-
-    unless($no_header){
-      print {$fhs{1}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $other_c_ctob =~ s/^/Non_CpG_CTOB_/;
-    $other_c_ctob =~ s/sam$/txt/;
-    $other_c_ctob =~ s/bam$/txt/;
-    $other_c_ctob =~ s/$/.txt/ unless ($other_c_ctob =~ /\.txt$/);
-    $other_c_ctob = $output_dir . $other_c_ctob;
-
-    if ($gzip){
-      $other_c_ctob .= '.gz';
-      open ($fhs{2}->{other_c},"| gzip -c - > $other_c_ctob") or die "Failed to write to $other_c_ctob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{2}->{other_c},"| cat > $other_c_ctob") or die "Failed to write to $other_c_ctob $!\n" unless($mbias_only);
-      # open ($fhs{2}->{other_c},'>',$other_c_ctob) or die "Failed to write to $other_c_ctob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in any other context from the complementary to original bottom strand to $other_c_ctob\n" unless($mbias_only);
-    push @sorting_files,$other_c_ctob;
-
-    unless($no_header){
-      print {$fhs{2}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $other_c_ob =~ s/^/Non_CpG_OB_/;
-    $other_c_ob =~ s/sam$/txt/;
-    $other_c_ob =~ s/sam$/txt/;
-    $other_c_ob =~ s/$/.txt/ unless ($other_c_ob =~ /\.txt$/);
-    $other_c_ob = $output_dir . $other_c_ob;
-
-    if ($gzip){
-      $other_c_ob .= '.gz';
-      open ($fhs{3}->{other_c},"| gzip -c - > $other_c_ob") or die "Failed to write to $other_c_ob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{3}->{other_c},"| cat > $other_c_ob") or die "Failed to write to $other_c_ob $!\n" unless($mbias_only);
-      # open ($fhs{3}->{other_c},'>',$other_c_ob) or die "Failed to write to $other_c_ob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in any other context from the original bottom strand to $other_c_ob\n\n" unless($mbias_only);
-    push @sorting_files,$other_c_ob;
-
-    unless($no_header){
-      print {$fhs{3}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-  }
-  ### THIS SECTION IS THE DEFAULT (CpG, CHG and CHH context)
-
-  ### if --comprehensive was specified we are only writing one file per context
-  elsif ($full) {
-    my $cpg_output = my $chg_output =  my $chh_output = $output_filename;
-    ### C in CpG context
-    $cpg_output =~ s/^/CpG_context_/;
-    $cpg_output =~ s/sam$/txt/;
-    $cpg_output =~ s/bam$/txt/;
-    $cpg_output =~ s/$/.txt/ unless ($cpg_output =~ /\.txt$/);
-    $cpg_output = $output_dir . $cpg_output;
-
-    if ($gzip){
-      $cpg_output .= '.gz';
-      open ($fhs{CpG_context},"| gzip -c - > $cpg_output") or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{CpG_context},"| cat > $cpg_output") or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-      # open ($fhs{CpG_context},'>',$cpg_output) or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context to $cpg_output\n" unless($mbias_only);
-    push @sorting_files,$cpg_output;
-
-    unless($no_header){
-      print {$fhs{CpG_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### C in CHG context
-    $chg_output =~ s/^/CHG_context_/;
-    $chg_output =~ s/sam$/txt/;
-    $chg_output =~ s/bam$/txt/;
-    $chg_output =~ s/$/.txt/ unless ($chg_output =~ /\.txt$/);
-    $chg_output = $output_dir . $chg_output;
-
-    if ($gzip){
-      $chg_output .= '.gz';
-      open ($fhs{CHG_context},"| gzip -c - > $chg_output") or die "Failed to write to $chg_output $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{CHG_context},"| cat > $chg_output") or die "Failed to write to $chg_output $!\n" unless($mbias_only);
-      # open ($fhs{CHG_context},'>',$chg_output) or die "Failed to write to $chg_output $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHG context to $chg_output\n" unless($mbias_only);
-    push @sorting_files,$chg_output;
-
-    unless($no_header){
-      print {$fhs{CHG_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### C in CHH context
-    $chh_output =~ s/^/CHH_context_/;
-    $chh_output =~ s/sam$/txt/;
-    $chh_output =~ s/bam$/txt/;
-    $chh_output =~ s/$/.txt/ unless ($chh_output =~ /\.txt$/);
-    $chh_output = $output_dir . $chh_output;
-
-    if ($gzip){
-      $chh_output .= '.gz';
-      open ($fhs{CHH_context},"| gzip -c - > $chh_output") or die "Failed to write to $chh_output $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{CHH_context},"| cat > $chh_output") or die "Failed to write to $chh_output $!\n" unless($mbias_only);
-      # open ($fhs{CHH_context},'>',$chh_output) or die "Failed to write to $chh_output $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHH context to $chh_output\n" unless($mbias_only);
-    push @sorting_files, $chh_output;
-
-    unless($no_header){
-      print {$fhs{CHH_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-  }
-  ### else we will write out 12 different output files, depending on where the (first) unique best alignment was found
-  else {
-    my $cpg_ot = my $cpg_ctot = my $cpg_ctob = my $cpg_ob = $output_filename;
-
-    ### For cytosines in CpG context
-    $cpg_ot =~ s/^/CpG_OT_/;
-    $cpg_ot =~ s/sam$/txt/;
-    $cpg_ot =~ s/bam$/txt/;
-    $cpg_ot =~ s/$/.txt/ unless ($cpg_ot =~ /\.txt$/);
-    $cpg_ot = $output_dir . $cpg_ot;
-
-    if ($gzip){
-      $cpg_ot .= '.gz';
-      open ($fhs{0}->{CpG},"| gzip -c - > $cpg_ot") or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{0}->{CpG},"| cat > $cpg_ot") or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-      # open ($fhs{0}->{CpG},'>',$cpg_ot) or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the original top strand to $cpg_ot\n" unless($mbias_only);
-    push @sorting_files,$cpg_ot;
-
-    unless($no_header){
-      print {$fhs{0}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ctot =~ s/^/CpG_CTOT_/;
-    $cpg_ctot =~ s/sam$/txt/;
-    $cpg_ctot =~ s/bam$/txt/;
-    $cpg_ctot =~ s/$/.txt/ unless ($cpg_ctot =~ /\.txt$/);
-    $cpg_ctot = $output_dir . $cpg_ctot;
-
-    if ($gzip){
-      $cpg_ctot .= '.gz';
-      open ($fhs{1}->{CpG},"| gzip -c - > $cpg_ctot") or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{1}->{CpG},"| cat > $cpg_ctot") or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-      # open ($fhs{1}->{CpG},'>',$cpg_ctot) or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the complementary to original top strand to $cpg_ctot\n" unless($mbias_only);
-    push @sorting_files,$cpg_ctot;
-
-    unless($no_header){
-      print {$fhs{1}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ctob =~ s/^/CpG_CTOB_/;
-    $cpg_ctob =~ s/sam$/txt/;
-    $cpg_ctob =~ s/bam$/txt/;
-    $cpg_ctob =~ s/$/.txt/ unless ($cpg_ctob =~ /\.txt$/);
-    $cpg_ctob = $output_dir . $cpg_ctob;
-
-    if ($gzip){
-      $cpg_ctob .= '.gz';
-      open ($fhs{2}->{CpG},"| gzip -c - > $cpg_ctob") or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{2}->{CpG},"| cat > $cpg_ctob") or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-      # open ($fhs{2}->{CpG},'>',$cpg_ctob) or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the complementary to original bottom strand to $cpg_ctob\n" unless($mbias_only);
-    push @sorting_files,$cpg_ctob;
-
-    unless($no_header){
-      print {$fhs{2}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ob =~ s/^/CpG_OB_/;
-    $cpg_ob =~ s/sam$/txt/;
-    $cpg_ob =~ s/bam$/txt/;
-    $cpg_ob =~ s/$/.txt/ unless ($cpg_ob =~ /\.txt$/);
-    $cpg_ob = $output_dir . $cpg_ob;
-
-    if ($gzip){
-      $cpg_ob .= '.gz';
-      open ($fhs{3}->{CpG},"| gzip -c - > $cpg_ob") or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{3}->{CpG},"| cat > $cpg_ob") or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-      # open ($fhs{3}->{CpG},'>',$cpg_ob) or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the original bottom strand to $cpg_ob\n\n" unless($mbias_only);
-    push @sorting_files,$cpg_ob;
-
-    unless($no_header){
-      print {$fhs{3}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### For cytosines in CHG context
-    my $chg_ot = my $chg_ctot = my $chg_ctob = my $chg_ob = $output_filename;
-
-    $chg_ot =~ s/^/CHG_OT_/;
-    $chg_ot =~ s/sam$/txt/;
-    $chg_ot =~ s/bam$/txt/;
-    $chg_ot =~ s/$/.txt/ unless ($chg_ot =~ /\.txt$/);
-    $chg_ot = $output_dir . $chg_ot;
-
-    if ($gzip){
-      $chg_ot .= '.gz';
-      open ($fhs{0}->{CHG},"| gzip -c - > $chg_ot") or die "Failed to write to $chg_ot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{0}->{CHG},"| cat > $chg_ot") or die "Failed to write to $chg_ot $!\n" unless($mbias_only);
-      # open ($fhs{0}->{CHG},'>',$chg_ot) or die "Failed to write to $chg_ot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHG context from the original top strand to $chg_ot\n" unless($mbias_only);
-    push @sorting_files,$chg_ot;
-
-    unless($no_header){
-      print {$fhs{0}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chg_ctot =~ s/^/CHG_CTOT_/;
-    $chg_ctot =~ s/sam$/txt/;
-    $chg_ctot =~ s/bam$/txt/;
-    $chg_ctot =~ s/$/.txt/ unless ($chg_ctot =~ /\.txt$/);
-    $chg_ctot = $output_dir . $chg_ctot;
-
-    if ($gzip){
-      $chg_ctot .= '.gz';
-      open ($fhs{1}->{CHG},"| gzip -c - > $chg_ctot") or die "Failed to write to $chg_ctot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{1}->{CHG},"| cat > $chg_ctot") or die "Failed to write to $chg_ctot $!\n" unless($mbias_only);
-      # open ($fhs{1}->{CHG},'>',$chg_ctot) or die "Failed to write to $chg_ctot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHG context from the complementary to original top strand to $chg_ctot\n" unless($mbias_only);
-    push @sorting_files,$chg_ctot;
-
-    unless($no_header){
-      print {$fhs{1}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chg_ctob =~ s/^/CHG_CTOB_/;
-    $chg_ctob =~ s/sam$/txt/;
-    $chg_ctob =~ s/bam$/txt/;
-    $chg_ctob =~ s/$/.txt/ unless ($chg_ctob =~ /\.txt$/);
-    $chg_ctob = $output_dir . $chg_ctob;
-
-    if ($gzip){
-      $chg_ctob .= '.gz';
-      open ($fhs{2}->{CHG},"| gzip -c - > $chg_ctob") or die "Failed to write to $chg_ctob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{2}->{CHG},"| cat > $chg_ctob") or die "Failed to write to $chg_ctob $!\n" unless($mbias_only);
-      # open ($fhs{2}->{CHG},'>',$chg_ctob) or die "Failed to write to $chg_ctob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHG context from the complementary to original bottom strand to $chg_ctob\n" unless($mbias_only);
-    push @sorting_files,$chg_ctob;
-
-    unless($no_header){
-      print {$fhs{2}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chg_ob =~ s/^/CHG_OB_/;
-    $chg_ob =~ s/sam$/txt/;
-    $chg_ob =~ s/bam$/txt/;
-    $chg_ob =~ s/$/.txt/ unless ($chg_ob =~ /\.txt$/);
-    $chg_ob = $output_dir . $chg_ob;
-
-    if ($gzip){
-      $chg_ob .= '.gz';
-      open ($fhs{3}->{CHG},"| gzip -c - > $chg_ob") or die "Failed to write to $chg_ob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{3}->{CHG},"| cat > $chg_ob") or die "Failed to write to $chg_ob $!\n" unless($mbias_only);
-      # open ($fhs{3}->{CHG},'>',$chg_ob) or die "Failed to write to $chg_ob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHG context from the original bottom strand to $chg_ob\n\n" unless($mbias_only);
-    push @sorting_files,$chg_ob;
-
-    unless($no_header){
-      print {$fhs{3}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### For cytosines in CHH context
-    my $chh_ot = my $chh_ctot = my $chh_ctob = my $chh_ob = $output_filename;
-
-    $chh_ot =~ s/^/CHH_OT_/;
-    $chh_ot =~ s/sam$/txt/;
-    $chh_ot =~ s/bam$/txt/;
-    $chh_ot =~ s/$/.txt/ unless ($chh_ot =~ /\.txt$/);
-    $chh_ot = $output_dir . $chh_ot;
-
-    if ($gzip){
-      $chh_ot .= '.gz';
-      open ($fhs{0}->{CHH},"| gzip -c - > $chh_ot") or die "Failed to write to $chh_ot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{0}->{CHH},"| cat > $chh_ot") or die "Failed to write to $chh_ot $!\n" unless($mbias_only);
-      # open ($fhs{0}->{CHH},'>',$chh_ot) or die "Failed to write to $chh_ot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHH context from the original top strand to $chh_ot\n" unless($mbias_only);
-    push @sorting_files,$chh_ot;
-
-    unless($no_header){
-      print {$fhs{0}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chh_ctot =~ s/^/CHH_CTOT_/;
-    $chh_ctot =~ s/sam$/txt/;
-    $chh_ctot =~ s/bam$/txt/;
-    $chh_ctot =~ s/$/.txt/ unless ($chh_ctot =~ /\.txt$/);
-    $chh_ctot = $output_dir . $chh_ctot;
-
-    if ($gzip){
-      $chh_ctot .= '.gz';
-      open ($fhs{1}->{CHH},"| gzip -c - > $chh_ctot") or die "Failed to write to $chh_ctot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{1}->{CHH},"| cat > $chh_ctot") or die "Failed to write to $chh_ctot $!\n" unless($mbias_only);
-      # open ($fhs{1}->{CHH},'>',$chh_ctot) or die "Failed to write to $chh_ctot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHH context from the complementary to original top strand to $chh_ctot\n" unless($mbias_only);
-    push @sorting_files,$chh_ctot;
-
-    unless($no_header){
-      print {$fhs{1}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chh_ctob =~ s/^/CHH_CTOB_/;
-    $chh_ctob =~ s/sam$/txt/;
-    $chh_ctob =~ s/bam$/txt/;
-    $chh_ctob =~ s/$/.txt/ unless ($chh_ctob =~ /\.txt$/);
-    $chh_ctob = $output_dir . $chh_ctob;
-
-    if ($gzip){
-      $chh_ctob .= '.gz';
-      open ($fhs{2}->{CHH},"| gzip -c - > $chh_ctob") or die "Failed to write to $chh_ctob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{2}->{CHH},"| cat > $chh_ctob") or die "Failed to write to $chh_ctob $!\n" unless($mbias_only);
-      # open ($fhs{2}->{CHH},'>',$chh_ctob) or die "Failed to write to $chh_ctob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHH context from the complementary to original bottom strand to $chh_ctob\n" unless($mbias_only);
-    push @sorting_files,$chh_ctob;
-
-    unless($no_header){
-      print {$fhs{2}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chh_ob =~ s/^/CHH_OB_/;
-    $chh_ob =~ s/sam$/txt/;
-    $chh_ob =~ s/bam$/txt/;
-    $chh_ob =~ s/$/.txt/ unless ($chh_ob =~ /\.txt$/);
-    $chh_ob = $output_dir . $chh_ob;
-
-    if ($gzip){
-      $chh_ob .= '.gz';
-      open ($fhs{3}->{CHH},"| gzip -c - > $chh_ob") or die "Failed to write to $chh_ob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{3}->{CHH},"| cat > $chh_ob") or die "Failed to write to $chh_ob $!\n" unless($mbias_only);
-      # open ($fhs{3}->{CHH},'>',$chh_ob) or die "Failed to write to $chh_ob $!\n" unless($mbias_only);
-   }
-
-    warn "Writing result file containing methylation information for C in CHH context from the original bottom strand to $chh_ob\n\n" unless($mbias_only);
-    push @sorting_files,$chh_ob;
-
-    unless($no_header){
-      print {$fhs{3}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-  }
-  return $report_filename;
-}
-
-sub isBam{
-
-  my $filename = shift;
-
-  # reading the first line of the input file to see if it is a BAM file in disguise (i.e. a BAM file that does not end in *.bam which may be produced by Galaxy)
-  open (DISGUISE,"zcat $filename |") or die "Failed to open filehandle DISGUISE for $filename\n\n";
-
-  ### when BAM files read through a zcat stream they start with BAM...
-  my $bam_in_disguise = <DISGUISE>;
-  # warn "BAM in disguise: $bam_in_disguise\n\n";
-
-  if ($bam_in_disguise){
-    if ($bam_in_disguise =~ /^BAM/){
-      close (DISGUISE) or warn "Had trouble closing filehandle BAM in disguise: $!\n";
-      return 1;
-    }
-    else{
-      close (DISGUISE) or warn "Had trouble closing filehandle BAM in disguise: $!\n";
-     return 0;
-    }
-  }
-  else{
-    close (DISGUISE) or warn "Had trouble closing filehandle BAM in disguise: $!\n";
-    return 0;
-  }
-}
-
-
-sub print_helpfile{
-
- print << 'HOW_TO';
-
-
-DESCRIPTION
-
-The following is a brief description of all options to control the Bismark
-methylation extractor. The script reads in a bisulfite read alignment results file 
-produced by the Bismark bisulfite mapper and extracts the methylation information
-for individual cytosines. This information is found in the methylation call field
-which can contain the following characters:
-
-       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-       ~~~   X   for methylated C in CHG context                      ~~~
-       ~~~   x   for not methylated C CHG                             ~~~
-       ~~~   H   for methylated C in CHH context                      ~~~
-       ~~~   h   for not methylated C in CHH context                  ~~~
-       ~~~   Z   for methylated C in CpG context                      ~~~
-       ~~~   z   for not methylated C in CpG context                  ~~~
-       ~~~   U   for methylated C in Unknown context (CN or CHN       ~~~
-       ~~~   u   for not methylated C in Unknown context (CN or CHN)  ~~~
-       ~~~   .   for any bases not involving cytosines                ~~~
-       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The methylation extractor outputs result files for cytosines in CpG, CHG and CHH
-context (this distinction is actually already made in Bismark itself). As the methylation
-information for every C analysed can produce files which easily have tens or even hundreds of
-millions of lines, file sizes can become very large and more difficult to handle. The C
-methylation info additionally splits cytosine methylation calls up into one of the four possible
-strands a given bisulfite read aligned against:
-
-             OT      original top strand
-             CTOT    complementary to original top strand
-
-             OB      original bottom strand
-             CTOB    complementary to original bottom strand
-
-Thus, by default twelve individual output files are being generated per input file (unless
---comprehensive is specified, see below). The output files can be imported into a genome
-viewer, such as SeqMonk, and re-combined into a single data group if desired (in fact
-unless the bisulfite reads were generated preserving directionality it doesn't make any
-sense to look at the data in a strand-specific manner). Strand-specific output files can
-optionally be skipped, in which case only three output files for CpG, CHG or CHH context
-will be generated. For both the strand-specific and comprehensive outputs there is also
-the option to merge both non-CpG contexts (CHG and CHH) into one single non-CpG context.
-
-
-The output files are in the following format (tab delimited):
-
-<sequence_id>     <strand>      <chromosome>     <position>     <methylation call>
-
-
-USAGE: methylation_extractor [options] <filenames>
-
-
-ARGUMENTS:
-==========
-
-<filenames>              A space-separated list of Bismark result files in SAM format from
-                         which methylation information is extracted for every cytosine in
-                         the reads. For alignment files in the older custom Bismark output
-                         see option '--vanilla'.
-
-OPTIONS:
-
--s/--single-end          Input file(s) are Bismark result file(s) generated from single-end
-                         read data. Specifying either --single-end or --paired-end is
-                         mandatory.
-
--p/--paired-end          Input file(s) are Bismark result file(s) generated from paired-end
-                         read data. Specifying either --paired-end or --single-end is
-                         mandatory.
-
---vanilla                The Bismark result input file(s) are in the old custom Bismark format
-                         (up to version 0.5.x) and not in SAM format which is the default as
-                         of Bismark version 0.6.x or higher. Default: OFF.
-
---no_overlap             For paired-end reads it is theoretically possible that read_1 and
-                         read_2 overlap. This option avoids scoring overlapping methylation
-                         calls twice (only methylation calls of read 1 are used for in the process
-                         since read 1 has historically higher quality basecalls than read 2).
-                         Whilst this option removes a bias towards more methylation calls
-                         in the center of sequenced fragments it may de facto remove a sizable
-                         proportion of the data. This option is on by default for paired-end data
-                         but can be disabled using --include_overlap. Default: ON.
-
---include_overlap        For paired-end data all methylation calls will be extracted irrespective of
-                         of whether they overlap or not. Default: OFF.
-
---ignore <int>           Ignore the first <int> bp from the 5' end of Read 1 (or single-end alignment
-                         files) when processing the methylation call string. This can remove e.g. a
-                         restriction enzyme site at the start of each read or any other source of
-                         bias (such as PBAT-Seq data).
-
---ignore_r2 <int>        Ignore the first <int> bp from the 5' end of Read 2 of paired-end sequencing
-                         results only. Since the first couple of bases in Read 2 of BS-Seq experiments
-                         show a severe bias towards non-methylation as a result of end-repairing
-                         sonicated fragments with unmethylated cytosines (see M-bias plot), it is
-                         recommended that the first couple of bp of Read 2 are removed before
-                         starting downstream analysis. Please see the section on M-bias plots in the
-                         Bismark User Guide for more details.
-
---ignore_3prime <int>    Ignore the last <int> bp from the 3' end of Read 1 (or single-end alignment
-                         files) when processing the methylation call string. This can remove unwanted
-                         biases from the end of reads.
-
---ignore_3prime_r2 <int> Ignore the last <int> bp from the 3' end of Read 2 of paired-end sequencing
-                         results only. This can remove unwanted biases from the end of reads.
-
---comprehensive          Specifying this option will merge all four possible strand-specific
-                         methylation info into context-dependent output files. The default
-
-                         contexts are:
-                          - CpG context
-                          - CHG context
-                          - CHH context
-
---merge_non_CpG          This will produce two output files (in --comprehensive mode) or eight
-                         strand-specific output files (default) for Cs in
-                          - CpG context
-                          - non-CpG context
-
---report                 Prints out a short methylation summary as well as the paramaters used to run
-                         this script. Default: ON.
-
---no_header              Suppresses the Bismark version header line in all output files for more convenient
-                         batch processing.
-
--o/--output DIR          Allows specification of a different output directory (absolute or relative
-                         path). If not specified explicitely, the output will be written to the current directory.
-
---samtools_path          The path to your Samtools installation, e.g. /home/user/samtools/. Does not need to be specified
-                         explicitly if Samtools is in the PATH already.
-
---gzip                   The methylation extractor files (CpG_OT_..., CpG_OB_... etc) will be written out in
-                         a GZIP compressed form to save disk space. This option does not work on bedGraph and
-                         genome-wide cytosine reports as they are 'tiny' anyway.
-
---version                Displays version information.
-
--h/--help                Displays this help file and exits.
-
---mbias_only             The methylation extractor will read the entire file but only output the M-bias table and plots as 
-                         well as a report (optional) and then quit. Default: OFF.
-
---mbias_off              The methylation extractor will process the entire file as usual but doesn't write out any M-bias report.
-                         Only recommended for users who deliberately want to keep an earlier version of the M-bias report. 
-                         Default: OFF.
-
---multicore <int>        Sets the number of cores to be used for the methylation extraction process. If system resources
-                         are plentiful this is a viable option to speed up the extraction process (we observed a near linear
-                         speed increase for up to 10 cores used). Please note that a typical process of extracting a BAM file
-                         and writing out '.gz' output streams will in fact use ~3 cores per value of --multicore <int>
-                         specified (1 for the methylation extractor itself, 1 for a Samtools stream, 1 for GZIP stream), so
-                         --multicore 10 is likely to use around 30 cores of system resources. This option has no bearing
-                         on the bismark2bedGraph or genome-wide cytosine report processes.
-
-
-
-
-bedGraph specific options:
-==========================
-
---bedGraph               After finishing the methylation extraction, the methylation output is written into a
-                         sorted bedGraph file that reports the position of a given cytosine and its methylation 
-                         state (in %, see details below). The methylation extractor output is temporarily split up into
-                         temporary files, one per chromosome (written into the current directory or folder
-                         specified with -o/--output); these temp files are then used for sorting and deleted
-                         afterwards. By default, only cytosines in CpG context will be sorted. The option
-                         '--CX_context' may be used to report all cytosines irrespective of sequence context
-                         (this will take MUCH longer!). The default folder for temporary files during the sorting
-                         process is the output directory. The bedGraph conversion step is performed by the external
-                         module 'bismark2bedGraph'; this script needs to reside in the same folder as the 
-                         bismark_methylation_extractor itself.
-
---zero_based             Write out an additional coverage file (ending in .zero.cov) that uses 0-based genomic start
-                         and 1-based genomic end coordinates (zero-based, half-open), like used in the bedGraph file,
-                         instead of using 1-based coordinates throughout. Default: OFF.
-
-
---cutoff [threshold]     The minimum number of times a methylation state has to be seen for that nucleotide
-                         before its methylation percentage is reported. Default: 1.
-
---remove_spaces          Replaces whitespaces in the sequence ID field with underscores to allow sorting.
-
---CX/--CX_context        The sorted bedGraph output file contains information on every single cytosine that was covered
-                         in the experiment irrespective of its sequence context. This applies to both forward and
-                         reverse strands. Please be aware that this option may generate large temporary and output files
-                         and may take a long time to sort (up to many hours). Default: OFF.
-                         (i.e. Default = CpG context only).
-
---buffer_size <string>   This allows you to specify the main memory sort buffer when sorting the methylation information.
-                         Either specify a percentage of physical memory by appending % (e.g. --buffer_size 50%) or
-			 a multiple of 1024 bytes, e.g. 'K' multiplies by 1024, 'M' by 1048576 and so on for 'T' etc. 
-                         (e.g. --buffer_size 20G). For more information on sort type 'info sort' on a command line.
-                         Defaults to 2G.
-
---scaffolds/--gazillion  Users working with unfinished genomes sporting tens or even hundreds of thousands of
-                         scaffolds/contigs/chromosomes frequently encountered errors with pre-sorting reads to
-                         individual chromosome files. These errors were caused by the operating system's limit
-                         of the number of filehandle that can be written to at any one time (typically 1024; to
-                         find out this limit on Linux, type: ulimit -a).
-                         To bypass the limitation of open filehandles, the option --scaffolds does not pre-sort
-                         methylation calls into individual chromosome files. Instead, all input files are
-                         temporarily merged into a single file (unless there is only a single file), and this
-                         file will then be sorted by both chromosome AND position using the Unix sort command.
-                         Please be aware that this option might take a looooong time to complete, depending on
-                         the size of the input files, and the memory you allocate to this process (see --buffer_size).
-                         Nevertheless, it seems to be working.
-
---ample_memory           Using this option will not sort chromosomal positions using the UNIX 'sort' command, but will
-                         instead use two arrays to sort methylated and unmethylated calls. This may result in a faster
-                         sorting process of very large files, but this comes at the cost of a larger memory footprint
-                         (two arrays of the length of the largest human chromosome 1 (~250M bp) consume around 16GB
-                         of RAM). Due to overheads in creating and looping through these arrays it seems that it will
-                         actually be *slower* for small files (few million alignments), and we are currently testing at
-                         which point it is advisable to use this option. Note that --ample_memory is not compatible
-                         with options '--scaffolds/--gazillion' (as it requires pre-sorted files to begin with).
-
-
-
-Genome-wide cytosine methylation report specific options:
-=========================================================
-
---cytosine_report        After the conversion to bedGraph has completed, the option '--cytosine_report' produces a
-                         genome-wide methylation report for all cytosines in the genome. By default, the output uses 1-based
-                         chromosome coordinates (zero-based start coords are optional) and reports CpG context only (all
-                         cytosine context is optional). The output considers all Cs on both forward and reverse strands and
-                         reports their position, strand, trinucleotide content and methylation state (counts are 0 if not
-                         covered). The cytosine report conversion step is performed by the external module
-                         'coverage2cytosine'; this script needs to reside in the same folder as the bismark_methylation_extractor
-                         itself.
-
---CX/--CX_context        The output file contains information on every single cytosine in the genome irrespective of
-                         its context. This applies to both forward and reverse strands. Please be aware that this will
-                         generate output files with > 1.1 billion lines for a mammalian genome such as human or mouse.
-                         Default: OFF (i.e. Default = CpG context only).
-
---zero_based             Uses 0-based genomic coordinates instead of 1-based coordinates. Default: OFF.
-
---genome_folder <path>   Enter the genome folder you wish to use to extract sequences from (full path only). Accepted
-                         formats are FastA files ending with '.fa' or '.fasta'. Specifying a genome folder path is mandatory.
-
---split_by_chromosome    Writes the output into individual files for each chromosome instead of a single output file. Files
-                         will be named to include the input filename and the chromosome number.
-
-
-
-OUTPUT:
-
-The bismark_methylation_extractor output is in the form:
-========================================================
-<seq-ID>  <methylation state*>  <chromosome>  <start position (= end position)>  <methylation call>
-
-* Methylated cytosines receive a '+' orientation,
-* Unmethylated cytosines receive a '-' orientation.
-
-
-
-The bedGraph output (optional) looks like this (tab-delimited; 0-based start coords, 1-based end coords):
-=========================================================================================================
-
-track type=bedGraph (header line)
-
-<chromosome>  <start position>  <end position>  <methylation percentage>
-
-
-
-The coverage output looks like this (tab-delimited, 1-based genomic coords; zero-based half-open coordinates available with '--zero_based'):
-============================================================================================================================================
-
-<chromosome>  <start position>  <end position>  <methylation percentage>  <count methylated>  <count non-methylated>
-
-
-
-The genome-wide cytosine methylation output file is tab-delimited in the following format:
-==========================================================================================
-<chromosome>  <position>  <strand>  <count methylated>  <count non-methylated>  <C-context>  <trinucleotide context>
-
-
-
-This script was last modified on 22 April 2015.
-
-HOW_TO
-}
--- a/old/bismark	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,7959 +0,0 @@
-#!/usr/bin/perl --
-use strict;
-use warnings;
-use IO::Handle;
-use Cwd;
-$|++;
-use Getopt::Long;
-
-
-## This program is Copyright (C) 2010-13, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-
-my $parent_dir = getcwd;
-my $bismark_version = 'v0.10.0';
-my $command_line = join (" ",@ARGV);
-
-### before processing the command line we will replace --solexa1.3-quals with --phred64-quals as the '.' in the option name will cause Getopt::Long to fail
-foreach my $arg (@ARGV){
-  if ($arg eq '--solexa1.3-quals'){
-    $arg = '--phred64-quals';
-  }
-}
-my @filenames;   # will be populated by processing the command line
-
-my ($genome_folder,$CT_index_basename,$GA_index_basename,$path_to_bowtie,$sequence_file_format,$bowtie_options,$directional,$unmapped,$ambiguous,$phred64,$solexa,$output_dir,$bowtie2,$vanilla,$sam_no_hd,$skip,$upto,$temp_dir,$non_bs_mm,$insertion_open,$insertion_extend,$deletion_open,$deletion_extend,$gzip,$bam,$samtools_path,$pbat,$prefix,$old_flag) = process_command_line();
-
-my @fhs;         # stores alignment process names, bisulfite index location, bowtie filehandles and the number of times sequences produced an alignment
-my %chromosomes; # stores the chromosome sequences of the mouse genome
-my %counting;    # counting various events
-
-my $seqID_contains_tabs;
-
-foreach my $filename (@filenames){
-
-  chdir $parent_dir or die "Unable to move to initial working directory $!\n";
-  ### resetting the counting hash and fhs
-  reset_counters_and_fhs($filename);
-  $seqID_contains_tabs = 0;
-
-  ### PAIRED-END ALIGNMENTS
-  if ($filename =~ ','){
-    my ($C_to_T_infile_1,$G_to_A_infile_1); # to be made from mate1 file
-
-    $fhs[0]->{name} = 'CTread1GAread2CTgenome';
-    $fhs[1]->{name} = 'GAread1CTread2GAgenome';
-    $fhs[2]->{name} = 'GAread1CTread2CTgenome';
-    $fhs[3]->{name} = 'CTread1GAread2GAgenome';
-
-    warn "\nPaired-end alignments will be performed\n",'='x39,"\n\n";
-
-    my ($filename_1,$filename_2) = (split (/,/,$filename));
-    warn "The provided filenames for paired-end alignments are $filename_1 and $filename_2\n";
-
-    ### additional variables only for paired-end alignments
-    my ($C_to_T_infile_2,$G_to_A_infile_2); # to be made from mate2 file
-
-    ### FastA format
-    if ($sequence_file_format eq 'FASTA'){
-      warn "Input files are in FastA format\n";
-
-      if ($directional){
-	($C_to_T_infile_1) = biTransformFastAFiles_paired_end ($filename_1,1); # also passing the read number
-	($G_to_A_infile_2) = biTransformFastAFiles_paired_end ($filename_2,2);
-
-	$fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	$fhs[1]->{inputfile_1} = undef;
-	$fhs[1]->{inputfile_2} = undef;
-	$fhs[2]->{inputfile_1} = undef;
-	$fhs[2]->{inputfile_2} = undef;
-	$fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-      }
-      else{
-	($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastAFiles_paired_end ($filename_1,1); # also passing the read number
-	($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastAFiles_paired_end ($filename_2,2);
-
-	$fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	$fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	$fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-      }
-
-      if ($bowtie2){
-	paired_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-      }
-      else{
-	paired_end_align_fragments_to_bisulfite_genome_fastA ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-      }
-    }
-
-    ### FastQ format
-    else{
-      warn "Input files are in FastQ format\n";
-      if ($directional){
-	if ($bowtie2){
-	  ($C_to_T_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	  ($G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	  $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	  $fhs[1]->{inputfile_1} = undef;
-	  $fhs[1]->{inputfile_2} = undef;
-	  $fhs[2]->{inputfile_1} = undef;
-	  $fhs[2]->{inputfile_2} = undef;
-	  $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	}
-	else{ # Bowtie 1 alignments
-	  if ($gzip){
-	    ($C_to_T_infile_1) = biTransformFastQFiles_paired_end_bowtie1_gzip ($filename_1,$filename_2); # passing both reads at the same time
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1; # this file contains both read 1 and read 2 in tab delimited format
-	    $fhs[0]->{inputfile_2} = undef; # no longer needed
-	    $fhs[1]->{inputfile_1} = undef;
-	    $fhs[1]->{inputfile_2} = undef;
-	    $fhs[2]->{inputfile_1} = undef;
-	    $fhs[2]->{inputfile_2} = undef;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1; # this file contains both read 1 and read 2 in tab delimited format
-	    $fhs[3]->{inputfile_2} = undef; # no longer needed
-	  }
-	  else{
-	    ($C_to_T_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	    ($G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	    $fhs[1]->{inputfile_1} = undef;
-	    $fhs[1]->{inputfile_2} = undef;
-	    $fhs[2]->{inputfile_1} = undef;
-	    $fhs[2]->{inputfile_2} = undef;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	  }
-	}
-      }
-      elsif($pbat){ # PBAT-Seq
-	### At the moment we are only performing uncompressed FastQ alignments with Bowtie1
-	($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	$fhs[0]->{inputfile_1} = undef;
-	$fhs[0]->{inputfile_2} = undef;
-	$fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	$fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	$fhs[3]->{inputfile_1} = undef;
-	$fhs[3]->{inputfile_2} = undef;
-      }
-      else{
-	if ($bowtie2){
-	  ($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	  ($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	  $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	  $fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	  $fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	  $fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	  $fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	  $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	  $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	}
-	else{ # Bowtie 1 alignments
-	  if ($gzip){
-	    ($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end_bowtie1_gzip ($filename_1,$filename_2); # passing both reads at the same time
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[0]->{inputfile_2} = undef; # not needed for compressed temp files
-	    $fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[1]->{inputfile_2} = undef;
-	    $fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[2]->{inputfile_2} = undef;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[3]->{inputfile_2} = undef; # not needed for compressed temp files
-	  }
-	  else{ #uncompressed temp files
-	    ($C_to_T_infile_1,$G_to_A_infile_1) = biTransformFastQFiles_paired_end ($filename_1,1); # also passing the read number
-	    ($C_to_T_infile_2,$G_to_A_infile_2) = biTransformFastQFiles_paired_end ($filename_2,2);
-	
-	    $fhs[0]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[0]->{inputfile_2} = $G_to_A_infile_2;
-	    $fhs[1]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[1]->{inputfile_2} = $C_to_T_infile_2;
-	    $fhs[2]->{inputfile_1} = $G_to_A_infile_1;
-	    $fhs[2]->{inputfile_2} = $C_to_T_infile_2;
-	    $fhs[3]->{inputfile_1} = $C_to_T_infile_1;
-	    $fhs[3]->{inputfile_2} = $G_to_A_infile_2;
-	  }
-	}
-      }
-      if ($bowtie2){
-	paired_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-      }
-      else{
-       	paired_end_align_fragments_to_bisulfite_genome_fastQ ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);	
-      }
-    }
-    start_methylation_call_procedure_paired_ends($filename_1,$filename_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-  }
-
-  ### Else we are performing SINGLE-END ALIGNMENTS
-  else{
-    warn "\nSingle-end alignments will be performed\n",'='x39,"\n\n";
-    ### Initialising bisulfite conversion filenames
-    my ($C_to_T_infile,$G_to_A_infile);
-
-
-    ### FastA format
-    if ($sequence_file_format eq 'FASTA'){
-      warn "Inut file is in FastA format\n";
-      if ($directional){
-	($C_to_T_infile) = biTransformFastAFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-      }
-      else{
-	($C_to_T_infile,$G_to_A_infile) = biTransformFastAFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-	$fhs[2]->{inputfile} = $fhs[3]->{inputfile} = $G_to_A_infile;
-      }
-
-      ### Creating 4 different bowtie filehandles and storing the first entry
-      if ($bowtie2){
-	single_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 ($C_to_T_infile,$G_to_A_infile);
-      }
-      else{
-	single_end_align_fragments_to_bisulfite_genome_fastA ($C_to_T_infile,$G_to_A_infile);
-      }
-    }
-
-    ## FastQ format
-    else{
-      warn "Input file is in FastQ format\n";
-      if ($directional){
-	($C_to_T_infile) = biTransformFastQFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-      }
-      elsif($pbat){
-	($G_to_A_infile) = biTransformFastQFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $G_to_A_infile; # PBAT-Seq only uses the G to A converted files
-      }
-      else{
-	($C_to_T_infile,$G_to_A_infile) = biTransformFastQFiles ($filename);
-	$fhs[0]->{inputfile} = $fhs[1]->{inputfile} = $C_to_T_infile;
-	$fhs[2]->{inputfile} = $fhs[3]->{inputfile} = $G_to_A_infile;
-      }
-
-      ### Creating up to 4 different bowtie filehandles and storing the first entry
-      if ($bowtie2){
-	single_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 ($C_to_T_infile,$G_to_A_infile);
-      }
-      elsif ($pbat){
-	single_end_align_fragments_to_bisulfite_genome_fastQ (undef,$G_to_A_infile);
-      }
-      else{
-	single_end_align_fragments_to_bisulfite_genome_fastQ ($C_to_T_infile,$G_to_A_infile);
-      }
-    }
-
-    start_methylation_call_procedure_single_ends($filename,$C_to_T_infile,$G_to_A_infile);
-
-  }
-}
-
-sub start_methylation_call_procedure_single_ends {
-  my ($sequence_file,$C_to_T_infile,$G_to_A_infile) = @_;
-  my ($dir,$filename);
-
-  if ($sequence_file =~ /\//){
-    ($dir,$filename) = $sequence_file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $sequence_file;
-  }
-
-  ### printing all alignments to a results file
-  my $outfile = $filename;
-  if ($prefix){
-    $outfile = "$prefix.$outfile";
-  }
-
-
-  if ($bowtie2){ # SAM format is the default for Bowtie 2
-    $outfile =~ s/$/_bismark_bt2.sam/;
-  }
-  elsif ($vanilla){ # vanilla custom Bismark output single-end output (like Bismark versions 0.5.X)
-    $outfile =~ s/$/_bismark.txt/;
-  }
-  else{ # SAM is the default output
-    $outfile =~ s/$/_bismark.sam/;
-  }
-
-  $bam = 0 unless (defined $bam);
-
-  if ($bam == 1){ ### Samtools is installed, writing out BAM directly
-    $outfile =~ s/sam/bam/;
-    open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  elsif($bam == 2){ ### no Samtools found on system. Using GZIP compression instead
-    $outfile .= '.gz';
-    open (OUT,"| gzip -c - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  else{ # uncompressed ouput, default
-    open (OUT,'>',"$output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-
-  warn "\n>>> Writing bisulfite mapping results to $output_dir$outfile <<<\n\n";
-  sleep(1);
-
-  if ($vanilla){
-    print OUT "Bismark version: $bismark_version\n";
-  }
-
-  ### printing alignment and methylation call summary to a report file
-  my $reportfile = $filename;
-  if ($prefix){
-    $reportfile = "$prefix.$reportfile";
-  }
-
-  if ($bowtie2){
-    $reportfile =~ s/$/_bismark_bt2_SE_report.txt/;
-  }
-  else{
-    $reportfile =~ s/$/_bismark_SE_report.txt/;
-  }
-
-  open (REPORT,'>',"$output_dir$reportfile") or die "Failed to write to $reportfile: $!\n";
-  print REPORT "Bismark report for: $sequence_file (version: $bismark_version)\n";
-
-  if ($unmapped){
-    my $unmapped_file = $filename;
-    if ($prefix){
-      $unmapped_file = "$prefix.$unmapped_file";
-    }
-
-    $unmapped_file =~ s/$/_unmapped_reads.txt/;
-    open (UNMAPPED,'>',"$output_dir$unmapped_file") or die "Failed to write to $unmapped_file: $!\n";
-    print "Unmapped sequences will be written to $output_dir$unmapped_file\n";
-  }
-  if ($ambiguous){
-    my $ambiguous_file = $filename;
-    if ($prefix){
-      $ambiguous_file = "$prefix.$ambiguous_file";
-    }
-    $ambiguous_file =~ s/$/_ambiguous_reads.txt/;
-    open (AMBIG,'>',"$output_dir$ambiguous_file") or die "Failed to write to $ambiguous_file: $!\n";
-    print "Ambiguously mapping sequences will be written to $output_dir$ambiguous_file\n";
-  }
-
-  if ($directional){
-    print REPORT "Option '--directional' specified: alignments to complementary strands will be ignored (i.e. not performed!)\n";
-  }
-  print REPORT "Bowtie was run against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-
-
-  ### if 2 or more files are provided we can hold the genome in memory and don't need to read it in a second time
-  unless (%chromosomes){
-    my $cwd = getcwd; # storing the path of the current working directory
-    print "Current working directory is: $cwd\n\n";
-    read_genome_into_memory($cwd);
-  }
-
-  unless ($vanilla or $sam_no_hd){
-    generate_SAM_header();
-  }
-
-  ### Input file is in FastA format
-  if ($sequence_file_format eq 'FASTA'){
-    process_single_end_fastA_file_for_methylation_call($sequence_file,$C_to_T_infile,$G_to_A_infile);
-  }
-  ### Input file is in FastQ format
-  else{
-    process_single_end_fastQ_file_for_methylation_call($sequence_file,$C_to_T_infile,$G_to_A_infile);
-  }
-}
-
-sub start_methylation_call_procedure_paired_ends {
-  my ($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-
-  my ($dir_1,$filename_1);
-
-  if ($sequence_file_1 =~ /\//){
-    ($dir_1,$filename_1) = $sequence_file_1 =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename_1 = $sequence_file_1;
-  }
-
-  my ($dir_2,$filename_2);
-
-  if  ($sequence_file_2 =~ /\//){
-    ($dir_2,$filename_2) = $sequence_file_2 =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename_2 = $sequence_file_2;
-  }
-
-  ### printing all alignments to a results file
-  my $outfile = $filename_1; 
-
-  if ($prefix){
-    $outfile = "$prefix.$outfile";
-  }
-
-  if ($bowtie2){ # SAM format is the default Bowtie 2 output
-    $outfile =~ s/$/_bismark_bt2_pe.sam/;
-  }
-  elsif ($vanilla){ # vanilla custom Bismark paired-end output (like Bismark versions 0.5.X)
-    $outfile =~ s/$/_bismark_pe.txt/;
-  }
-  else{ # SAM format is the default Bowtie 1 output
-    $outfile =~ s/$/_bismark_pe.sam/;
-  }
-
-  $bam = 0 unless (defined $bam);
-
-  if ($bam == 1){ ### Samtools is installed, writing out BAM directly
-    $outfile =~ s/sam/bam/;
-    open (OUT,"| $samtools_path view -bSh 2>/dev/null - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  elsif($bam == 2){ ### no Samtools found on system. Using GZIP compression instead
-    $outfile .= '.gz';
-    open (OUT,"| gzip -c - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-  else{ # uncompressed ouput, default
-    open (OUT,'>',"$output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-  }
-
-  warn "\n>>> Writing bisulfite mapping results to $outfile <<<\n\n";
-  sleep(1);
-
-  if ($vanilla){
-    print OUT "Bismark version: $bismark_version\n";
-  }
-
-  ### printing alignment and methylation call summary to a report file
-  my $reportfile = $filename_1;
-  if ($prefix){
-    $reportfile = "$prefix.$reportfile";
-  }
-
-  if ($bowtie2){
-    $reportfile =~ s/$/_bismark_bt2_PE_report.txt/;
-  }
-  else{
-    $reportfile =~ s/$/_bismark_PE_report.txt/;
-  }
-
-  open (REPORT,'>',"$output_dir$reportfile") or die "Failed to write to $reportfile: $!\n";
-  print REPORT "Bismark report for: $sequence_file_1 and $sequence_file_2 (version: $bismark_version)\n";
-  print REPORT "Bowtie was run against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-
-
-  ### Unmapped read output
-  if ($unmapped){
-    my $unmapped_1 = $filename_1;
-    my $unmapped_2 = $filename_2;
-    if ($prefix){
-      $unmapped_1 = "$prefix.$unmapped_1";
-      $unmapped_2 = "$prefix.$unmapped_2";
-    }
-    $unmapped_1 =~ s/$/_unmapped_reads_1.txt/;
-    $unmapped_2 =~ s/$/_unmapped_reads_2.txt/;
-    open (UNMAPPED_1,'>',"$output_dir$unmapped_1") or die "Failed to write to $unmapped_1: $!\n";
-    open (UNMAPPED_2,'>',"$output_dir$unmapped_2") or die "Failed to write to $unmapped_2: $!\n";
-    print "Unmapped sequences will be written to $unmapped_1 and $unmapped_2\n";
-  }
-
-  if ($ambiguous){
-    my $amb_1 = $filename_1;
-    my $amb_2 = $filename_2;
-    if ($prefix){
-      $amb_1 = "$prefix.$amb_1";
-      $amb_2 = "$prefix.$amb_2";
-    }
-
-    $amb_1 =~ s/$/_ambiguous_reads_1.txt/;
-    $amb_2 =~ s/$/_ambiguous_reads_2.txt/;
-    open (AMBIG_1,'>',"$output_dir$amb_1") or die "Failed to write to $amb_1: $!\n";
-    open (AMBIG_2,'>',"$output_dir$amb_2") or die "Failed to write to $amb_2: $!\n";
-    print "Ambiguously mapping sequences will be written to $amb_1 and $amb_2\n";
-  }
-
-  if ($directional){
-    print REPORT "Option '--directional' specified: alignments to complementary strands will be ignored (i.e. not performed)\n";
-  }
-
-  ### if 2 or more files are provided we might still hold the genome in memory and don't need to read it in a second time
-  unless (%chromosomes){
-    my $cwd = getcwd; # storing the path of the current working directory
-    print "Current working directory is: $cwd\n\n";
-    read_genome_into_memory($cwd);
-  }
-
-  unless ($vanilla or $sam_no_hd){
-    generate_SAM_header();
-  }
-
-  ### Input files are in FastA format
-  if ($sequence_file_format eq 'FASTA'){
-    process_fastA_files_for_paired_end_methylation_calls($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-  }
-  ### Input files are in FastQ format
-  else{
-    process_fastQ_files_for_paired_end_methylation_calls($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-  }
-}
-
-sub print_final_analysis_report_single_end{
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  ### All sequences from the original sequence file have been analysed now
-  ### deleting temporary C->T or G->A infiles
-
-  if ($directional){
-    my $deletion_successful =  unlink "$temp_dir$C_to_T_infile";
-    if ($deletion_successful == 1){
-      warn "\nSuccessfully deleted the temporary file $temp_dir$C_to_T_infile\n\n";
-    }
-    else{
-      warn "Could not delete temporary file $C_to_T_infile properly $!\n";
-    }
-  }
-  elsif ($pbat){
-    my $deletion_successful =  unlink "$temp_dir$G_to_A_infile";
-    if ($deletion_successful == 1){
-      warn "\nSuccessfully deleted the temporary file $temp_dir$G_to_A_infile\n\n";
-    }
-    else{
-      warn "Could not delete temporary file $G_to_A_infile properly $!\n";
-    }
-  }
-  else{
-    my $deletion_successful =  unlink "$temp_dir$C_to_T_infile","$temp_dir$G_to_A_infile";
-    if ($deletion_successful == 2){
-      warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile and $temp_dir$G_to_A_infile\n\n";
-    }
-    else{
-      warn "Could not delete temporary files properly $!\n";
-    }
-  }
-
-  ### printing a final report for the alignment procedure
-  print REPORT "Final Alignment report\n",'='x22,"\n";
-  warn "Final Alignment report\n",'='x22,"\n";
-  #  foreach my $index (0..$#fhs){
-  #    print "$fhs[$index]->{name}\n";
-  #    print "$fhs[$index]->{seen}\talignments on the correct strand in total\n";
-  #    print "$fhs[$index]->{wrong_strand}\talignments were discarded (nonsensical alignments)\n\n";
-  #  }
-
-  ### printing a final report for the methylation call procedure
-  warn "Sequences analysed in total:\t$counting{sequences_count}\n";
-  print REPORT "Sequences analysed in total:\t$counting{sequences_count}\n";
-  my $percent_alignable_sequences;
-
-  if ($counting{sequences_count} == 0){
-    $percent_alignable_sequences = 0;
-  }
-  else{
-    $percent_alignable_sequences = sprintf ("%.1f",$counting{unique_best_alignment_count}*100/$counting{sequences_count});
-  }
-
-  warn "Number of alignments with a unique best hit from the different alignments:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequences}%\n\n";
-  print REPORT "Number of alignments with a unique best hit from the different alignments:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequences}%\n";
-
-  ### percentage of low complexity reads overruled because of low complexity (thereby creating a bias for highly methylated reads),
-  ### only calculating the percentage if there were any overruled alignments
-  if ($counting{low_complexity_alignments_overruled_count}){
-    my $percent_overruled_low_complexity_alignments = sprintf ("%.1f",$counting{low_complexity_alignments_overruled_count}*100/$counting{sequences_count});
-    #   print REPORT "Number of low complexity alignments which were overruled to have a unique best hit rather than discarding them:\t$counting{low_complexity_alignments_overruled_count}\t(${percent_overruled_low_complexity_alignments}%)\n";
-  }
-
-  print "Sequences with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print "Sequences did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print "Sequences which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print "Number of sequences with unique best (first) alignment came from the bowtie output:\n";
-  print join ("\n","CT/CT:\t$counting{CT_CT_count}\t((converted) top strand)","CT/GA:\t$counting{CT_GA_count}\t((converted) bottom strand)","GA/CT:\t$counting{GA_CT_count}\t(complementary to (converted) top strand)","GA/GA:\t$counting{GA_GA_count}\t(complementary to (converted) bottom strand)"),"\n\n";
-
-  print REPORT "Sequences with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print REPORT "Sequences did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print REPORT "Sequences which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print REPORT "Number of sequences with unique best (first) alignment came from the bowtie output:\n";
-  print REPORT join ("\n","CT/CT:\t$counting{CT_CT_count}\t((converted) top strand)","CT/GA:\t$counting{CT_GA_count}\t((converted) bottom strand)","GA/CT:\t$counting{GA_CT_count}\t(complementary to (converted) top strand)","GA/GA:\t$counting{GA_GA_count}\t(complementary to (converted) bottom strand)"),"\n\n";
-
-  if ($directional){
-    print "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-    print REPORT "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-  }
-
-  ### detailed information about Cs analysed
-  warn "Final Cytosine Methylation Report\n",'='x33,"\n";
-  my $total_number_of_C = $counting{total_meCHH_count}+$counting{total_meCHG_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CpG_count};
-  warn "Total number of C's analysed:\t$total_number_of_C\n\n";
-  warn "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  warn "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  warn "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    warn "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n";
-  }
-  warn "\n";
-
-  warn "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  warn "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  warn "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    warn "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n";
-  }
-  warn "\n";
-
-  print REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-  print REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-  print REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  print REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  print REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n";
-  }
-  print REPORT "\n";
-
-  print REPORT "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  print REPORT "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  print REPORT "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n";
-  }
-  print REPORT "\n";
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meC_unknown;
-  if (($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}) > 0){
-    $percent_meC_unknown = sprintf("%.1f",100*$counting{total_meC_unknown_count}/($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}));
-  }
-
-
-  ### printing methylated CpG percentage if applicable
-  if ($percent_meCpG){
-    warn "C methylated in CpG context:\t${percent_meCpG}%\n";
-    print REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (CHG context) if applicable
-  if ($percent_meCHG){
-    warn "C methylated in CHG context:\t${percent_meCHG}%\n";
-    print REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (CHH context) if applicable
-  if ($percent_meCHH){
-    warn "C methylated in CHH context:\t${percent_meCHH}%\n";
-    print REPORT "C methylated in CHH context:\t${percent_meCHH}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (Unknown C context) if applicable
-  if ($bowtie2){
-    if ($percent_meC_unknown){
-      warn "C methylated in Unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-      print REPORT "C methylated in Unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in Unknown context (CN or CHN) if value was 0\n";
-      print REPORT "Can't determine percentage of methylated Cs in Unknown context (CN or CHN) if value was 0\n";
-    }
-  }
-  print REPORT "\n\n";
-  warn "\n\n";
-
-  if ($seqID_contains_tabs){
-    warn "The sequence IDs in the provided file contain tab-stops which might prevent sequence alignments. If this happened, please replace all tab characters within the seqID field with spaces before running Bismark.\n\n";
-    print REPORT "The sequence IDs in the provided file contain tab-stops which might prevent sequence alignments. If this happened, please replace all tab characters within the seqID field with spaces before running Bismark.\n\n";
-  }
-
-
-  ###########################################################################################################################################
-  ### create pie-chart with mapping stats
-  ###########################################################################################################################################
-
-
-  my $filename;
-  if ($pbat){
-    $filename = $G_to_A_infile;
-  }
-  else{
-    $filename = $C_to_T_infile;
-  }
-
-  my $pie_chart = (split (/\//,$filename))[-1]; # extracting the filename if a full path was specified
-  $pie_chart =~ s/gz$//;
-  $pie_chart =~ s/_C_to_T\.fastq$//;
-  $pie_chart =~ s/_G_to_A\.fastq$//;
-
-  #  if ($prefix){
-  #    $pie_chart = "$prefix.$pie_chart"; # this is now being taken care of in file transformation
-  # }
-  $pie_chart = "${output_dir}${pie_chart}_bismark_SE.alignment_overview.png";
-
-
-  #Check whether the module GD::Graph is installed
-  my $gd_graph_installed = 0;
-  eval{
-    require GD::Graph::pie;
-    GD::Graph::pie->import();
-  };
-
-  unless($@) {
-    $gd_graph_installed = 1;
-  }
-  else{
-    warn "Perl module GD::Graph::pie is not installed, skipping graphical alignment summary\n";
-    sleep(2);
-  }
-
-  if ($gd_graph_installed){
-    warn "Generating pie chart\n\n";
-    sleep(1);
-    my $graph = GD::Graph::pie->new(600,600);
-
-    my $percent_unaligned;
-    my $percent_multiple;
-    my $percent_unextractable;
-
-    if ($counting{sequences_count}){
-      $percent_unaligned = sprintf ("%.1f",$counting{no_single_alignment_found}*100/$counting{sequences_count});
-      $percent_multiple = sprintf ("%.1f",$counting{unsuitable_sequence_count}*100/$counting{sequences_count});
-      $percent_unextractable = sprintf ("%.1f",$counting{genomic_sequence_could_not_be_extracted_count}*100/$counting{sequences_count});
-    }
-    else{
-      $percent_unaligned = $percent_multiple = $percent_unextractable = 'N/A';
-    }
-
-    my @aln_stats = (
-		     ["Uniquely aligned $percent_alignable_sequences%","Unaligned $percent_unaligned%","Multiple alignments $percent_multiple%","sequence unextractable $percent_unextractable%"],
-		     [$counting{unique_best_alignment_count},$counting{no_single_alignment_found},$counting{unsuitable_sequence_count},$counting{genomic_sequence_could_not_be_extracted_count}],
-		    );
-
-    $graph->set( 
-		start_angle => 180,
-		'3d' => 0,
-		label => 'Alignment stats (single-end)',
-		suppress_angle => 2,    # Only label slices of sufficient size
-		transparent => 0,
-		dclrs => [ qw(red lorange dgreen cyan) ],
-	       ) or die $graph->error;
-
-    my $gd = $graph->plot(\@aln_stats) or die $graph->error;
-
-    open (PIE,'>',$pie_chart) or die "Failed to write to file for alignments pie chart: $!\n\n";
-    binmode PIE;
-    print PIE $gd->png;
-  }
-
-  warn "====================\nBismark run complete\n====================\n\n";
-
-}
-
-
-sub print_final_analysis_report_paired_ends{
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-  ### All sequences from the original sequence file have been analysed now, therefore deleting temporary C->T or G->A infiles
-  if ($directional){
-    if ($G_to_A_infile_2){
-      my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1","$temp_dir$G_to_A_infile_2";
-      if ($deletion_successful == 2){
-	warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile_1 and $temp_dir$G_to_A_infile_2\n\n";
-      }
-      else{
-	warn "Could not delete temporary files $temp_dir$C_to_T_infile_1 and $temp_dir$G_to_A_infile_2 properly: $!\n";
-      }
-    }
-    else{ # for paired-end FastQ infiles with Bowtie1 there is only one file to delete
-      my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1";
-      if ($deletion_successful == 1){
-	warn "\nSuccessfully deleted the temporary file $temp_dir$C_to_T_infile_1\n\n";
-      }
-      else{
-	warn "Could not delete temporary file $temp_dir$C_to_T_infile_1 properly: $!\n";
-      }
-    }
-  }
-  else{
-    if ($G_to_A_infile_2 and $C_to_T_infile_2){
-      my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1","$temp_dir$G_to_A_infile_1","$temp_dir$C_to_T_infile_2","$temp_dir$G_to_A_infile_2";
-      if ($deletion_successful == 4){
-	warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile_1, $temp_dir$G_to_A_infile_1, $temp_dir$C_to_T_infile_2 and $temp_dir$G_to_A_infile_2\n\n";
-      }
-      else{
-	warn "Could not delete temporary files properly: $!\n";
-      }
-    }
-    else{ # for paired-end FastQ infiles with Bowtie1 there are only two files to delete
-      my $deletion_successful =  unlink "$temp_dir$C_to_T_infile_1","$temp_dir$G_to_A_infile_1";
-      if ($deletion_successful == 2){
-	warn "\nSuccessfully deleted the temporary files $temp_dir$C_to_T_infile_1 and $temp_dir$G_to_A_infile_1\n\n";
-      }
-      else{
-	warn "Could not delete temporary files properly: $!\n";
-      }
-    }
-  }
-
-  ### printing a final report for the alignment procedure
-  warn "Final Alignment report\n",'='x22,"\n";
-  print REPORT "Final Alignment report\n",'='x22,"\n";
-  #  foreach my $index (0..$#fhs){
-  #    print "$fhs[$index]->{name}\n";
-  #    print "$fhs[$index]->{seen}\talignments on the correct strand in total\n";
-  #    print "$fhs[$index]->{wrong_strand}\talignments were discarded (nonsensical alignments)\n\n";
-  #  }
-
-  ### printing a final report for the methylation call procedure
-  warn "Sequence pairs analysed in total:\t$counting{sequences_count}\n";
-  print REPORT "Sequence pairs analysed in total:\t$counting{sequences_count}\n";
-
-  my $percent_alignable_sequence_pairs;
-  if ($counting{sequences_count} == 0){
-    $percent_alignable_sequence_pairs = 0;
-  }
-  else{
-    $percent_alignable_sequence_pairs = sprintf ("%.1f",$counting{unique_best_alignment_count}*100/$counting{sequences_count});
-  }
-  print "Number of paired-end alignments with a unique best hit:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequence_pairs}%\n\n";
-  print REPORT "Number of paired-end alignments with a unique best hit:\t$counting{unique_best_alignment_count}\nMapping efficiency:\t${percent_alignable_sequence_pairs}% \n";
-
-  print "Sequence pairs with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print "Sequence pairs did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print "Sequence pairs which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print "Number of sequence pairs with unique best (first) alignment came from the bowtie output:\n";
-  print join ("\n","CT/GA/CT:\t$counting{CT_GA_CT_count}\t((converted) top strand)","GA/CT/CT:\t$counting{GA_CT_CT_count}\t(complementary to (converted) top strand)","GA/CT/GA:\t$counting{GA_CT_GA_count}\t(complementary to (converted) bottom strand)","CT/GA/GA:\t$counting{CT_GA_GA_count}\t((converted) bottom strand)"),"\n\n";
-
-
-  print REPORT "Sequence pairs with no alignments under any condition:\t$counting{no_single_alignment_found}\n";
-  print REPORT "Sequence pairs did not map uniquely:\t$counting{unsuitable_sequence_count}\n";
-  print REPORT "Sequence pairs which were discarded because genomic sequence could not be extracted:\t$counting{genomic_sequence_could_not_be_extracted_count}\n\n";
-  print REPORT "Number of sequence pairs with unique best (first) alignment came from the bowtie output:\n";
-  print REPORT join ("\n","CT/GA/CT:\t$counting{CT_GA_CT_count}\t((converted) top strand)","GA/CT/CT:\t$counting{GA_CT_CT_count}\t(complementary to (converted) top strand)","GA/CT/GA:\t$counting{GA_CT_GA_count}\t(complementary to (converted) bottom strand)","CT/GA/GA:\t$counting{CT_GA_GA_count}\t((converted) bottom strand)"),"\n\n";
-  ### detailed information about Cs analysed
-
-  if ($directional){
-    print "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-    print REPORT "Number of alignments to (merely theoretical) complementary strands being rejected in total:\t$counting{alignments_rejected_count}\n\n";
-  }
-
-  warn "Final Cytosine Methylation Report\n",'='x33,"\n";
-  print REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-  my $total_number_of_C = $counting{total_meCHG_count}+ $counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-  warn "Total number of C's analysed:\t$total_number_of_C\n\n";
-  warn "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  warn "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  warn "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    warn "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n";
-  }
-  warn "\n";
-
-  warn "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  warn "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  warn "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    warn "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n";
-  }
-  warn "\n";
-
-  print REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-  print REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  print REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  print REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total methylated C's in Unknown context:\t$counting{total_meC_unknown_count}\n\n";
-  }
-  print REPORT "\n";
-
-  print REPORT "Total unmethylated C's in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  print REPORT "Total unmethylated C's in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  print REPORT "Total unmethylated C's in CHH context:\t$counting{total_unmethylated_CHH_count}\n";
-  if ($bowtie2){
-    print REPORT "Total unmethylated C's in Unknown context:\t$counting{total_unmethylated_C_unknown_count}\n\n";
-  }
-  print REPORT "\n";
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meC_unknown;
-  if (($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}) > 0){
-    $percent_meC_unknown = sprintf("%.1f",100*$counting{total_meC_unknown_count}/($counting{total_meC_unknown_count}+$counting{total_unmethylated_C_unknown_count}));
-  }
-
-
-  ### printing methylated CpG percentage if applicable
-  if ($percent_meCpG){
-    warn "C methylated in CpG context:\t${percent_meCpG}%\n";
-    print REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage in CHG context if applicable
-  if ($percent_meCHG){
-    warn "C methylated in CHG context:\t${percent_meCHG}%\n";
-    print REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-  }
-
-  ### printing methylated C percentage in CHH context if applicable
-  if ($percent_meCHH){
-    warn "C methylated in CHH context:\t${percent_meCHH}%\n";
-    print REPORT "C methylated in CHH context:\t${percent_meCHH}%\n";
-  }
-  else{
-    warn "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-    print REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n";
-  }
-
-  ### printing methylated C percentage (Unknown C context) if applicable
-  if ($bowtie2){
-    if ($percent_meC_unknown){
-      warn "C methylated in unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-      print REPORT "C methylated in unknown context (CN or CHN):\t${percent_meC_unknown}%\n";
-    }
-    else{
-      warn "Can't determine percentage of methylated Cs in unknown context (CN or CHN) if value was 0\n";
-      print REPORT "Can't determine percentage of methylated Cs in unknown context (CN or CHN) if value was 0\n";
-    }
-  }
-  print REPORT "\n\n";
-  warn "\n\n";
-
-
-  ############################################################################################################################################
-  ### create pie-chart with mapping stats
-  ###########################################################################################################################################
-
-  my $filename;
-  if ($pbat){
-    $filename = $G_to_A_infile_1;
-  }
-  else{
-    $filename = $C_to_T_infile_1;
-  }
-
-  my $pie_chart = (split (/\//,$filename))[-1]; # extracting the filename if a full path was specified
-  $pie_chart =~ s/gz$//;
-  $pie_chart =~ s/_C_to_T.fastq$//;
-  $pie_chart =~ s/_G_to_A.fastq$//;
-  ### special format for gzipped PE Bowtie1 files
-  $pie_chart =~ s/\.CT_plus_GA\.fastq\.$//;
-  $pie_chart =~ s/\.GA_plus_CT\.fastq\.$//;
-
-  if ($prefix){
-    # prefix is now being prepended to the temp files already
-    # $pie_chart = "$prefix.$pie_chart";
-  }
-  $pie_chart = "${output_dir}${pie_chart}_bismark_PE.alignment_overview.png";
-
-  #Check whether the module GD::Graph is installed
-  my $gd_graph_installed = 0;
-  eval{
-    require GD::Graph::pie;
-    GD::Graph::pie->import();
-  };
-
-  unless($@) {
-    $gd_graph_installed = 1;
-  }
-  else{
-    warn "Perl module GD::Graph::pie is not installed, skipping graphical alignment summary\n";
-    sleep(2);
-  }
-
-  if ($gd_graph_installed){
-    warn "Generating pie chart\n\n";
-    sleep(1);
-    my $graph = GD::Graph::pie->new(600,600);
-
-    my $percent_unaligned;
-    my $percent_multiple;
-    my $percent_unextractable;
-
-    if ($counting{sequences_count}){
-      $percent_unaligned = sprintf ("%.1f",$counting{no_single_alignment_found}*100/$counting{sequences_count});
-      $percent_multiple = sprintf ("%.1f",$counting{unsuitable_sequence_count}*100/$counting{sequences_count});
-      $percent_unextractable = sprintf ("%.1f",$counting{genomic_sequence_could_not_be_extracted_count}*100/$counting{sequences_count});
-    }
-    else{
-      $percent_unaligned = $percent_multiple = $percent_unextractable = 'N/A';
-    }
-
-    my @aln_stats = (
-		     ["Uniquely aligned pairs $percent_alignable_sequence_pairs%","Unaligned $percent_unaligned%","Multiple alignments $percent_multiple%","sequence unextractable $percent_unextractable%"],
-		     [$counting{unique_best_alignment_count},$counting{no_single_alignment_found},$counting{unsuitable_sequence_count},$counting{genomic_sequence_could_not_be_extracted_count}],
-		    );
-
-    # push @{$mbias_read1[0]},$pos;
-
-    $graph->set( 
-		start_angle => 180,
-		'3d' => 0,
-		label => 'Alignment stats (paired-end)',
-		suppress_angle => 2,    # Only label slices of sufficient size
-		transparent => 0,
-		dclrs => [ qw(red lorange dgreen cyan) ],
-	       ) or die $graph->error;
-
-    my $gd = $graph->plot(\@aln_stats) or die $graph->error;
-
-    open (PIE,'>',$pie_chart) or die "Failed to write to file for alignments pie chart: $!\n\n";
-    binmode PIE;
-    print PIE $gd->png;
-  }
-
-  warn "====================\nBismark run complete\n====================\n\n";
-
-}
-
-sub process_single_end_fastA_file_for_methylation_call{
-  my ($sequence_file,$C_to_T_infile,$G_to_A_infile) = @_;
-  ### this is a FastA sequence file; we need the actual sequence to compare it against the genomic sequence in order to make a methylation call.
-  ### Now reading in the sequence file sequence by sequence and see if the current sequence was mapped to one (or both) of the converted genomes in either
-  ### the C->T or G->A version
-
-  ### gzipped version of the infile
-  if ($sequence_file =~ /\.gz$/){
-    open (IN,"zcat $sequence_file |") or die $!;
-  }
-  else{
-    open (IN,$sequence_file) or die $!;
-  }
-
-  my $count = 0;
-
-  warn "\nReading in the sequence file $sequence_file\n";
-  while (1) {
-    # last if ($counting{sequences_count} > 100);
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    last unless ($identifier and $sequence);
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequences so far\n";
-    }
-    chomp $sequence;
-    chomp $identifier;
-
-    $identifier =~ s/^>//; # deletes the > at the beginning of FastA headers
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_single_end_bowtie2 (uc$sequence,$identifier);
-    }
-    else{
-      $return = check_bowtie_results_single_end(uc$sequence,$identifier); # default Bowtie 1
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequence to ambiguous.out if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      print AMBIG ">$identifier\n";	
-      print AMBIG "$sequence\n";
-    }
-
-    # print the sequence to <unmapped.out> file if --un was specified
-    elsif ($unmapped and $return == 1){
-      print UNMAPPED ">$identifier\n";	
-      print UNMAPPED "$sequence\n";
-    }
-  }
-  print "Processed $counting{sequences_count} sequences in total\n\n";
-
-  print_final_analysis_report_single_end($C_to_T_infile,$G_to_A_infile);
-
-}
-
-sub process_single_end_fastQ_file_for_methylation_call{
-  my ($sequence_file,$C_to_T_infile,$G_to_A_infile) = @_;
-  ### this is the Illumina sequence file; we need the actual sequence to compare it against the genomic sequence in order to make a methylation call.
-  ### Now reading in the sequence file sequence by sequence and see if the current sequence was mapped to one (or both) of the converted genomes in either
-  ### the C->T or G->A version
-
-  ### gzipped version of the infile
-  if ($sequence_file =~ /\.gz$/){
-    open (IN,"zcat $sequence_file |") or die $!;
-  }
-  else{
-    open (IN,$sequence_file) or die $!;
-  }
-
-  my $count = 0;
-
-  warn "\nReading in the sequence file $sequence_file\n";
-  while (1) {
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    my $identifier_2 = <IN>;
-    my $quality_value = <IN>;
-    last unless ($identifier and $sequence and $identifier_2 and $quality_value);
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequences so far\n";
-    }
-    chomp $sequence;
-    chomp $identifier;
-    chomp $quality_value;
-
-    $identifier =~ s/^\@//;  # deletes the @ at the beginning of Illumin FastQ headers
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_single_end_bowtie2 (uc$sequence,$identifier,$quality_value);
-    }
-    else{
-      $return = check_bowtie_results_single_end(uc$sequence,$identifier,$quality_value); # default Bowtie 1
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequence to ambiguous.out if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      print AMBIG "\@$identifier\n";	
-      print AMBIG "$sequence\n";
-      print AMBIG $identifier_2;	
-      print AMBIG "$quality_value\n";
-    }
-
-    # print the sequence to <unmapped.out> file if --un was specified
-    elsif ($unmapped and $return == 1){
-      print UNMAPPED "\@$identifier\n";	
-      print UNMAPPED "$sequence\n";
-      print UNMAPPED $identifier_2;	
-      print UNMAPPED "$quality_value\n";
-    }
-  }
-  print "Processed $counting{sequences_count} sequences in total\n\n";
-
-  print_final_analysis_report_single_end($C_to_T_infile,$G_to_A_infile);
-
-}
-
-sub process_fastA_files_for_paired_end_methylation_calls{
-  my ($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-  ### Processing the two FastA sequence files; we need the actual sequences of both reads to compare them against the genomic sequence in order to
-  ### make a methylation call. The sequence idetifier per definition needs to be the same for a sequence pair used for paired-end mapping.
-  ### Now reading in the sequence files sequence by sequence and see if the current sequences produced an alignment to one (or both) of the
-  ### converted genomes (either the C->T or G->A version)
-
-  ### gzipped version of the infiles
-  if ($sequence_file_1 =~ /\.gz$/ and $sequence_file_2 =~ /\.gz$/){
-    open (IN1,"zcat $sequence_file_1 |") or die "Failed to open zcat pipe to $sequence_file_1 $!\n";
-    open (IN2,"zcat $sequence_file_2 |") or die "Failed to open zcat pipe to $sequence_file_2 $!\n";
-  }
-  else{
-    open (IN1,$sequence_file_1) or die $!;
-    open (IN2,$sequence_file_2) or die $!;
-  }
-
-  warn "\nReading in the sequence files $sequence_file_1 and $sequence_file_2\n";
-  ### Both files are required to have the exact same number of sequences, therefore we can process the sequences jointly one by one
-
-  my $count = 0;
-
-  while (1) {
-    # reading from the first input file
-    my $identifier_1 = <IN1>;
-    my $sequence_1 = <IN1>;
-    # reading from the second input file
-    my $identifier_2 = <IN2>;
-    my $sequence_2 = <IN2>;
-    last unless ($identifier_1 and $sequence_1 and $identifier_2 and $sequence_2);
-
-    $identifier_1 = fix_IDs($identifier_1); # this is to avoid problems with truncated read ID when they contain white spaces
-    $identifier_2 = fix_IDs($identifier_2);
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequence pairs so far\n";
-    }
-    my $orig_identifier_1 = $identifier_1;
-    my $orig_identifier_2 = $identifier_2;
-
-    chomp $sequence_1;
-    chomp $identifier_1;
-    chomp $sequence_2;
-    chomp $identifier_2;
-
-    $identifier_1 =~ s/^>//; # deletes the > at the beginning of FastA headers
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_paired_ends_bowtie2 (uc$sequence_1,uc$sequence_2,$identifier_1);
-    }
-    else{
-      $return = check_bowtie_results_paired_ends (uc$sequence_1,uc$sequence_2,$identifier_1);
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequences to ambiguous_1 and _2 if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      print AMBIG_1 $orig_identifier_1;	
-      print AMBIG_1 "$sequence_1\n";
-      print AMBIG_2 $orig_identifier_2;	
-      print AMBIG_2 "$sequence_2\n";
-    }
-
-    # print the sequences to unmapped_1.out and unmapped_2.out if --un was specified
-    elsif ($unmapped and $return == 1){
-      print UNMAPPED_1 $orig_identifier_1;	
-      print UNMAPPED_1 "$sequence_1\n";
-      print UNMAPPED_2 $orig_identifier_2;	
-      print UNMAPPED_2 "$sequence_2\n";
-    }
-  }
-
-  warn "Processed $counting{sequences_count} sequences in total\n\n";
-
-  close OUT or die $!;
-
-  print_final_analysis_report_paired_ends($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-
-}
-
-sub process_fastQ_files_for_paired_end_methylation_calls{
-  my ($sequence_file_1,$sequence_file_2,$C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-  ### Processing the two Illumina sequence files; we need the actual sequence of both reads to compare them against the genomic sequence in order to
-  ### make a methylation call. The sequence identifier per definition needs to be same for a sequence pair used for paired-end alignments.
-  ### Now reading in the sequence files sequence by sequence and see if the current sequences produced a paired-end alignment to one (or both)
-  ### of the converted genomes (either C->T or G->A version)
-
-  ### gzipped version of the infiles
-  if ($sequence_file_1 =~ /\.gz$/ and $sequence_file_2 =~ /\.gz$/){
-    open (IN1,"zcat $sequence_file_1 |") or die "Failed to open zcat pipe to $sequence_file_1 $!\n";
-    open (IN2,"zcat $sequence_file_2 |") or die "Failed to open zcat pipe to $sequence_file_2 $!\n";
-  }
-  else{
-    open (IN1,$sequence_file_1) or die $!;
-    open (IN2,$sequence_file_2) or die $!;
-  }
-
-  my $count = 0;
-
-  warn "\nReading in the sequence files $sequence_file_1 and $sequence_file_2\n";
-  ### Both files are required to have the exact same number of sequences, therefore we can process the sequences jointly one by one
-  while (1) {
-    # reading from the first input file
-    my $identifier_1 = <IN1>;
-    my $sequence_1 = <IN1>;
-    my $ident_1 = <IN1>;         # not needed
-    my $quality_value_1 = <IN1>; # not needed
-    # reading from the second input file
-    my $identifier_2 = <IN2>;
-    my $sequence_2 = <IN2>;
-    my $ident_2 = <IN2>;         # not needed
-    my $quality_value_2 = <IN2>; # not needed
-    last unless ($identifier_1 and $sequence_1 and $quality_value_1 and $identifier_2 and $sequence_2 and $quality_value_2);
-
-    $identifier_1 = fix_IDs($identifier_1); # this is to avoid problems with truncated read ID when they contain white spaces
-    $identifier_2 = fix_IDs($identifier_2);
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $counting{sequences_count}++;
-    if ($counting{sequences_count}%1000000==0) {
-      warn "Processed $counting{sequences_count} sequence pairs so far\n";
-    }
-
-    my $orig_identifier_1 = $identifier_1;
-    my $orig_identifier_2 = $identifier_2;
-
-    chomp $sequence_1;
-    chomp $identifier_1;
-    chomp $sequence_2;
-    chomp $identifier_2;
-    chomp $quality_value_1;
-    chomp $quality_value_2;
-
-    $identifier_1 =~ s/^\@//;  # deletes the @ at the beginning of the FastQ ID
-
-    my $return;
-    if ($bowtie2){
-      $return = check_bowtie_results_paired_ends_bowtie2 (uc$sequence_1,uc$sequence_2,$identifier_1,$quality_value_1,$quality_value_2);
-    }
-    else{
-      $return = check_bowtie_results_paired_ends (uc$sequence_1,uc$sequence_2,$identifier_1,$quality_value_1,$quality_value_2);
-    }
-
-    unless ($return){
-      $return = 0;
-    }
-
-    # print the sequences to ambiguous_1 and _2 if --ambiguous was specified
-    if ($ambiguous and $return == 2){
-      # seq_1
-      print AMBIG_1 $orig_identifier_1;	
-      print AMBIG_1 "$sequence_1\n";
-      print AMBIG_1 $ident_1;	
-      print AMBIG_1 "$quality_value_1\n";
-	# seq_2
-      print AMBIG_2 $orig_identifier_2;	
-      print AMBIG_2 "$sequence_2\n";
-      print AMBIG_2 $ident_2;	
-      print AMBIG_2 "$quality_value_2\n";
-    }
-
-    # print the sequences to unmapped_1.out and unmapped_2.out if --un was specified
-    elsif ($unmapped and $return == 1){
-      # seq_1
-      print UNMAPPED_1 $orig_identifier_1;	
-      print UNMAPPED_1 "$sequence_1\n";
-      print UNMAPPED_1 $ident_1;	
-      print UNMAPPED_1 "$quality_value_1\n";
-      # seq_2
-      print UNMAPPED_2 $orig_identifier_2;	
-      print UNMAPPED_2 "$sequence_2\n";
-      print UNMAPPED_2 $ident_2;	
-      print UNMAPPED_2 "$quality_value_2\n";
-    }
-  }
-
-  warn "Processed $counting{sequences_count} sequences in total\n\n";
-
-  close OUT or die $!;
-
-  print_final_analysis_report_paired_ends($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2);
-
-}
-
-sub check_bowtie_results_single_end{
-  my ($sequence,$identifier,$quality_value) = @_;
-
-  unless ($quality_value){ # FastA sequences get assigned a quality value of Phred 40 throughout
-    $quality_value = 'I'x(length$sequence);
-  }
-
-  my %mismatches = ();
-  ### reading from the bowtie output files to see if this sequence aligned to a bisulfite converted genome
-  foreach my $index (0..$#fhs){
-
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line} and defined $fhs[$index]->{last_seq_id});
-    ### if the sequence we are currently looking at produced an alignment we are doing various things with it
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-      ###############################################################
-      ### STEP I Now processing the alignment stored in last_line ###
-      ###############################################################
-      my $valid_alignment_found_1 = decide_whether_single_end_alignment_is_valid($index,$identifier);
-      ### sequences can fail at this point if there was only 1 seq in the wrong orientation, or if there were 2 seqs, both in the wrong orientation
-      ### we only continue to extract useful information about this alignment if 1 was returned
-      if ($valid_alignment_found_1 == 1){
-	### Bowtie outputs which made it this far are in the correct orientation, so we can continue to analyse the alignment itself
-	### need to extract the chromosome number from the bowtie output (which is either XY_cf (complete forward) or XY_cr (complete reverse)
-	my ($id,$strand,$mapped_chromosome,$position,$bowtie_sequence,$mismatch_info) = (split (/\t/,$fhs[$index]->{last_line},-1))[0,1,2,3,4,7];
-
-	unless($mismatch_info){
-	  $mismatch_info = '';
-	}
-
-	chomp $mismatch_info;
-	my $chromosome;
-	if ($mapped_chromosome =~ s/_(CT|GA)_converted$//){
-	  $chromosome = $mapped_chromosome;
-	}
-	else{
-	  die "Chromosome number extraction failed for $mapped_chromosome\n";
-	}
-	### Now extracting the number of mismatches to the converted genome
-	my $number_of_mismatches;
-	if ($mismatch_info eq ''){
-	  $number_of_mismatches = 0;
-	}
-	elsif ($mismatch_info =~ /^\d/){
-	  my @mismatches = split (/,/,$mismatch_info);
-	  $number_of_mismatches = scalar @mismatches;
-	}
-	else{
-	  die "Something weird is going on with the mismatch field:\t>>> $mismatch_info <<<\n";
-	}
-	### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	my $alignment_location = join (":",$chromosome,$position);
-	### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	### strand) were methylated and therefore protected. It is not needed to overwrite the same positional entry with a second entry for the same
-	### location (the genomic sequence extraction and methylation would not be affected by this, only the thing which would change is the index
-	### number for the found alignment)
-	unless (exists $mismatches{$number_of_mismatches}->{$alignment_location}){
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{seq_id}=$id;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{bowtie_sequence}=$bowtie_sequence;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{index}=$index;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome;
-	  $mismatches{$number_of_mismatches}->{$alignment_location}->{position}=$position;
-	}
-	$number_of_mismatches = undef;
-	##################################################################################################################################################
-	### STEP II Now reading in the next line from the bowtie filehandle. The next alignment can either be a second alignment of the same sequence or a
-	### a new sequence. In either case we will store the next line in @fhs ->{last_line}. In case the alignment is already the next entry, a 0 will
-	### be returned as $valid_alignment_found and it will then be processed in the next round only.
-	##################################################################################################################################################
-	my $newline = $fhs[$index]->{fh}-> getline();
-	if ($newline){
-	  my ($seq_id) = split (/\t/,$newline);
-	  $fhs[$index]->{last_seq_id} = $seq_id;
-	  $fhs[$index]->{last_line} = $newline;
-	}
-	else {
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of bowtie output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line} = undef;
-	  next;
-	}	
-	my $valid_alignment_found_2 = decide_whether_single_end_alignment_is_valid($index,$identifier);
-	### we only continue to extract useful information about this second alignment if 1 was returned
-	if ($valid_alignment_found_2 == 1){
-	  ### If the second Bowtie output made it this far it is in the correct orientation, so we can continue to analyse the alignment itself
-	  ### need to extract the chromosome number from the bowtie output (which is either XY_cf (complete forward) or XY_cr (complete reverse)
-	  my ($id,$strand,$mapped_chromosome,$position,$bowtie_sequence,$mismatch_info) = (split (/\t/,$fhs[$index]->{last_line},-1))[0,1,2,3,4,7];
-	  unless($mismatch_info){
-	    $mismatch_info = '';
-	  }	
-	  chomp $mismatch_info;
-
-	  my $chromosome;	
-	  if ($mapped_chromosome =~ s/_(CT|GA)_converted$//){
-	    $chromosome = $mapped_chromosome;
-	  }
-	  else{
-	    die "Chromosome number extraction failed for $mapped_chromosome\n";
-	  }
-
-	  ### Now extracting the number of mismatches to the converted genome
-	  my $number_of_mismatches;
-	  if ($mismatch_info eq ''){
-	    $number_of_mismatches = 0;
-	  }
-	  elsif ($mismatch_info =~ /^\d/){
-	    my @mismatches = split (/,/,$mismatch_info);
-	    $number_of_mismatches = scalar @mismatches;
-	  }
-	  else{
-	    die "Something weird is going on with the mismatch field\n";
-	  }
-	  ### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	  ### extracting the chromosome number from the bowtie output (see above)
-	  my $alignment_location = join (":",$chromosome,$position);
-	  ### In the special case that two differently converted sequences align against differently converted genomes, but to the same position
-	  ### with the same number of mismatches (or perfect matches), the chromosome, position and number of mismatches are the same. In this
-	  ### case we are not writing the same entry out a second time.
-	  unless (exists $mismatches{$number_of_mismatches}->{$alignment_location}){
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{seq_id}=$id;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{bowtie_sequence}=$bowtie_sequence;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{index}=$index;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome;
-	    $mismatches{$number_of_mismatches}->{$alignment_location}->{position}=$position;
-	  }
-	  ####################################################################################################################################
-	  #### STEP III Now reading in one more line which has to be the next alignment to be analysed. Adding it to @fhs ->{last_line}    ###
-	  ####################################################################################################################################
-	  $newline = $fhs[$index]->{fh}-> getline();
-	  if ($newline){
-	    my ($seq_id) = split (/\t/,$newline);
-	    die "The same seq ID occurred more than twice in a row\n" if ($seq_id eq $identifier);
-	    $fhs[$index]->{last_seq_id} = $seq_id;
-	    $fhs[$index]->{last_line} = $newline;
-	    next;
-	  }	
-	  else {
-	    # assigning undef to last_seq_id and last_line and jumping to the next index (end of bowtie output)
-	    $fhs[$index]->{last_seq_id} = undef;
-	    $fhs[$index]->{last_line} = undef;
-	    next;
-	  }
-	  ### still within the 2nd sequence in correct orientation found	
-	}
-	### still withing the 1st sequence in correct orientation found
-      }
-      ### still within the if (last_seq_id eq identifier) condition
-    }
-    ### still within foreach index loop
-  }
-  ### if there was not a single alignment found for a certain sequence we will continue with the next sequence in the sequence file
-  unless(%mismatches){
-    $counting{no_single_alignment_found}++;
-    if ($unmapped){
-      return 1; ### We will print this sequence out as unmapped sequence if --un unmapped.out has been specified
-    }
-    else{
-      return;
-    }
-  }
-  #######################################################################################################################################################
-  #######################################################################################################################################################
-  ### We are now looking if there is a unique best alignment for a certain sequence. This means we are sorting in ascending order and look at the     ###
-  ### sequence with the lowest amount of mismatches. If there is only one single best position we are going to store the alignment information in the ###
-  ### meth_call variables, if there are multiple hits with the same amount of (lowest) mismatches we are discarding the sequence altogether           ###
-  #######################################################################################################################################################
-  #######################################################################################################################################################
-  ### Going to use the variable $sequence_fails as a 'memory' if a sequence could not be aligned uniquely (set to 1 then)
-  my $sequence_fails = 0;
-  ### Declaring an empty hash reference which will store all information we need for the methylation call
-  my $methylation_call_params; # hash reference!
-  ### sorting in ascending order
-  foreach my $mismatch_number (sort {$a<=>$b} keys %mismatches){
-
-    ### if there is only 1 entry in the hash with the lowest number of mismatches we accept it as the best alignment
-    if (scalar keys %{$mismatches{$mismatch_number}} == 1){
-      for my $unique_best_alignment (keys %{$mismatches{$mismatch_number}}){
-	$methylation_call_params->{$identifier}->{bowtie_sequence} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence};
-	$methylation_call_params->{$identifier}->{chromosome} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{chromosome};
-	$methylation_call_params->{$identifier}->{position} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{position};
-	$methylation_call_params->{$identifier}->{index} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{index};
-    	$methylation_call_params->{$identifier}->{number_of_mismatches} = $mismatch_number;
-      }
-    }
-    elsif (scalar keys %{$mismatches{$mismatch_number}} == 3){
-      ### If there are 3 sequences with the same number of lowest mismatches we can discriminate 2 cases: (i) all 3 alignments are unique best hits and
-      ### come from different alignments processes (== indices) or (ii) one sequence alignment (== index) will give a unique best alignment, whereas a
-      ### second one will produce 2 (or potentially many) alignments for the same sequence but in a different conversion state or against a different genome
-      ### version (or both). This becomes especially relevant for highly converted sequences in which all Cs have been converted to Ts in the bisulfite
-      ### reaction. E.g.
-      ### CAGTCACGCGCGCGCG will become
-      ### TAGTTATGTGTGTGTG in the CT transformed version, which will ideally still give the correct alignment in the CT->CT alignment condition.
-      ### If the same read will then become G->A transformed as well however, the resulting sequence will look differently and potentially behave
-      ### differently in a GA->GA alignment and this depends on the methylation state of the original sequence!:
-      ### G->A conversion:
-      ### highly methylated: CAATCACACACACACA
-      ### highly converted : TAATTATATATATATA <== this sequence has a reduced complexity (only 2 bases left and not 3), and it is more likely to produce
-      ### an alignment with a low complexity genomic region than the one above. This would normally lead to the entire sequence being kicked out as the
-      ### there will be 3 alignments with the same number of lowest mismatches!! This in turn means that highly methylated and thereby not converted
-      ### sequences are more likely to pass the alignment step, thereby creating a bias for methylated reads compared to their non-methylated counterparts.
-      ### We do not want any bias, whatsover. Therefore if we have 1 sequence producing a unique best alignment and the second and third conditions
-      ### producing alignments only after performing an additional (theoretical) conversion we want to keep the best alignment with the lowest number of
-      ### additional transliterations performed. Thus we want to have a look at the level of complexity of the sequences producing the alignment.
-      ### In the above example the number of transliterations required to transform the actual sequence
-      ### to the C->T version would be TAGTTATGTGTGTGTG -> TAGTTATGTGTGTGTG = 0; (assuming this gives the correct alignment)
-      ### in the G->A case it would be TAGTTATGTGTGTGTG -> TAATTATATATATATA = 6; (assuming this gives multiple wrong alignments)
-      ### if the sequence giving a unique best alignment required a lower number of transliterations than the second best sequence yielding alignments
-      ### while requiring a much higher number of transliterations, we are going to accept the unique best alignment with the lowest number of performed
-      ### transliterations. As a threshold which does scale we will start with the number of tranliterations of the lowest best match x 2 must still be
-      ### smaller than the number of tranliterations of the second best sequence. Everything will be flagged with $sequence_fails = 1 and discarded.
-      my @three_candidate_seqs;
-      foreach my $composite_location (keys (%{$mismatches{$mismatch_number}}) ){
-	my $transliterations_performed;
-	if ($mismatches{$mismatch_number}->{$composite_location}->{index} == 0 or $mismatches{$mismatch_number}->{$composite_location}->{index} == 1){
-	  $transliterations_performed = determine_number_of_transliterations_performed($sequence,'CT');
-	}
-	elsif ($mismatches{$mismatch_number}->{$composite_location}->{index} == 2 or $mismatches{$mismatch_number}->{$composite_location}->{index} == 3){
-	  $transliterations_performed = determine_number_of_transliterations_performed($sequence,'GA');
-	}
-	else{
-	  die "unexpected index number range $!\n";
-	}
-	push @three_candidate_seqs,{
-				    index =>$mismatches{$mismatch_number}->{$composite_location}->{index},
-				    bowtie_sequence => $mismatches{$mismatch_number}->{$composite_location}->{bowtie_sequence},
-				    mismatch_number => $mismatch_number,
-				    chromosome => $mismatches{$mismatch_number}->{$composite_location}->{chromosome},
-				    position => $mismatches{$mismatch_number}->{$composite_location}->{position},
-				    seq_id => $mismatches{$mismatch_number}->{$composite_location}->{seq_id},
-				    transliterations_performed => $transliterations_performed,
-				   };
-      }
-      ### sorting in ascending order for the lowest number of transliterations performed
-      @three_candidate_seqs = sort {$a->{transliterations_performed} <=> $b->{transliterations_performed}} @three_candidate_seqs;
-      my $first_array_element = $three_candidate_seqs[0]->{transliterations_performed};
-      my $second_array_element = $three_candidate_seqs[1]->{transliterations_performed};
-      my $third_array_element = $three_candidate_seqs[2]->{transliterations_performed};
-      # print "$first_array_element\t$second_array_element\t$third_array_element\n";
-      if (($first_array_element*2) < $second_array_element){
-	$counting{low_complexity_alignments_overruled_count}++;
-	### taking the index with the unique best hit and over ruling low complexity alignments with 2 hits
-	$methylation_call_params->{$identifier}->{bowtie_sequence} = $three_candidate_seqs[0]->{bowtie_sequence};
-	$methylation_call_params->{$identifier}->{chromosome} = $three_candidate_seqs[0]->{chromosome};
-	$methylation_call_params->{$identifier}->{position} = $three_candidate_seqs[0]->{position};
-	$methylation_call_params->{$identifier}->{index} = $three_candidate_seqs[0]->{index};
-	$methylation_call_params->{$identifier}->{number_of_mismatches} = $mismatch_number;
-	# print "Overruled low complexity alignments! Using $first_array_element and disregarding $second_array_element and $third_array_element\n";
-      }
-      else{
-	$sequence_fails = 1;
-      }
-    }
-    else{
-      $sequence_fails = 1;
-    }
-    ### after processing the alignment with the lowest number of mismatches we exit
-    last;
-  }
-  ### skipping the sequence completely if there were multiple alignments with the same amount of lowest mismatches found at different positions
-  if ($sequence_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-    if ($ambiguous){
-      return 2; # => exits to next sequence, and prints it out to multiple_alignments.out if --ambiguous has been specified
-    }
-    if ($unmapped){
-      return 1; # => exits to next sequence, and prints it out to unmapped.out if --un has been specified
-    }
-    else{
-      return 0; # => exits to next sequence (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 2) or ($methylation_call_params->{$identifier}->{index} == 3) ){
-      #    warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence has not been rejected so far it will have a unique best alignment
-  $counting{unique_best_alignment_count}++;
-  if ($pbat){
-    extract_corresponding_genomic_sequence_single_end_pbat($identifier,$methylation_call_params);
-  }
-  else{
-    extract_corresponding_genomic_sequence_single_end($identifier,$methylation_call_params);
-  }
-
-  ### check test to see if the genomic sequence we extracted has the same length as the observed sequence+2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence}) != length($sequence)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  ### otherwise we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call} = methylation_call($identifier,$sequence,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence},$methylation_call_params->{$identifier}->{read_conversion});
-
-  print_bisulfite_mapping_result_single_end($identifier,$sequence,$methylation_call_params,$quality_value);
-  return 0; ## otherwise 1 will be returned by default, which would print the sequence to unmapped.out
-}
-
-sub check_bowtie_results_single_end_bowtie2{
-  my ($sequence,$identifier,$quality_value) = @_;
-
-
-  unless ($quality_value){ # FastA sequences get assigned a quality value of Phred 40 throughout
-    $quality_value = 'I'x(length$sequence);
-  }
-
-  # as of version Bowtie 2 2.0.0 beta7, when input reads are unpaired, Bowtie 2 no longer removes the trailing /1 or /2 from the read name.
-  # $identifier =~ s/\/[1234567890]+$//; # some sequencers don't just have /1 or /2 at the end of read IDs
-  # print "sequence $sequence\nid $identifier\nquality: '$quality_value'\n";
-
-  my $alignment_ambiguous = 0;
-
-  my %alignments = ();
-
-  ### reading from the Bowtie 2 output filehandles
-  foreach my $index (0..$#fhs){
-    #  print "Index: $index\n";
-    #   print "$fhs[$index]->{last_line}\n";
-    #   print "$fhs[$index]->{last_seq_id}\n";
-    # sleep (1);
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line} and defined $fhs[$index]->{last_seq_id});
-
-    ### if the sequence we are currently looking at produced an alignment we are doing various things with it
-    # print "last seq id: $fhs[$index]->{last_seq_id} and identifier: $identifier\n";
-
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-      #  SAM format specifications for Bowtie 2
-      #  (1) Name of read that aligned
-      #  (2) Sum of all applicable flags. Flags relevant to Bowtie are:
-      #        1 The read is one of a pair
-      #        2 The alignment is one end of a proper paired-end alignment
-      #        4 The read has no reported alignments
-      #        8 The read is one of a pair and has no reported alignments
-      #       16 The alignment is to the reverse reference strand
-      #       32 The other mate in the paired-end alignment is aligned to the reverse reference strand
-      #       64 The read is mate 1 in a pair
-      #      128 The read is mate 2 in a pair
-      #      256 The read has multiple mapping states
-      #  (3) Name of reference sequence where alignment occurs (unmapped reads have a *)
-      #  (4) 1-based offset into the forward reference strand where leftmost character of the alignment occurs (0 for unmapped reads)
-      #  (5) Mapping quality (255 means MAPQ is not available)
-      #  (6) CIGAR string representation of alignment (* if unavailable)
-      #  (7) Name of reference sequence where mate's alignment occurs. Set to = if the mate's reference sequence is the same as this alignment's, or * if there is no mate.
-      #  (8) 1-based offset into the forward reference strand where leftmost character of the mate's alignment occurs. Offset is 0 if there is no mate.
-      #  (9) Inferred fragment size. Size is negative if the mate's alignment occurs upstream of this alignment. Size is 0 if there is no mate.
-      # (10) Read sequence (reverse-complemented if aligned to the reverse strand)
-      # (11) ASCII-encoded read qualities (reverse-complemented if the read aligned to the reverse strand). The encoded quality values are on the Phred quality scale and the encoding is ASCII-offset by 33 (ASCII char !), similarly to a FASTQ file.
-      # (12) Optional fields. Fields are tab-separated. bowtie2 outputs zero or more of these optional fields for each alignment, depending on the type of the alignment:
-      # AS:i:<N> Alignment score. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if SAM record is for an aligned read.
-      # XS:i:<N> Alignment score for second-best alignment. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if the SAM record is for an aligned read and more than one alignment was found for the read.
-      # YS:i:<N> Alignment score for opposite mate in the paired-end alignment. Only present if the SAM record is for a read that aligned as part of a paired-end alignment.
-      # XN:i:<N> The number of ambiguous bases in the reference covering this alignment. Only present if SAM record is for an aligned read.
-      # XM:i:<N> The number of mismatches in the alignment. Only present if SAM record is for an aligned read.
-      # XO:i:<N> The number of gap opens, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # XG:i:<N> The number of gap extensions, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # NM:i:<N> The edit distance; that is, the minimal number of one-nucleotide edits (substitutions, insertions and deletions) needed to transform the read string into the reference string. Only present if SAM record is for an aligned read.
-      # YF:Z:<N> String indicating reason why the read was filtered out. See also: Filtering. Only appears for reads that were filtered out.
-      # MD:Z:<S> A string representation of the mismatched reference bases in the alignment. See SAM format specification for details. Only present if SAM record is for an aligned read.
-
-      my ($id,$flag,$mapped_chromosome,$position,$mapping_quality,$cigar,$bowtie_sequence,$qual) = (split (/\t/,$fhs[$index]->{last_line}))[0,1,2,3,4,5,9,10];
-
-      ### If a sequence has no reported alignments there will be a single output line with a bit-wise flag value of 4. We can store the next alignment and move on to the next Bowtie 2 instance
-      if ($flag == 4){
-	## reading in the next alignment, which must be the next sequence
-	my $newline = $fhs[$index]->{fh}-> getline();
-	if ($newline){
-	  chomp $newline;
-	  my ($seq_id) = split (/\t/,$newline);
-	  $fhs[$index]->{last_seq_id} = $seq_id;
-	  $fhs[$index]->{last_line} = $newline;
-	  if ($seq_id eq $identifier){
-	    die "Sequence with ID $identifier did not produce any alignment, but next seq-ID was also $fhs[$index]->{last_seq_id}!\n";
-	  }
-	  next; # next instance
-	}
-	else{
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line} = undef;
-	  next;
-	}
-      }
-
-      # if there are one or more proper alignments we can extract the chromosome number
-      my $chromosome;
-      if ($mapped_chromosome =~ s/_(CT|GA)_converted$//){
-	$chromosome = $mapped_chromosome;
-      }
-      else{
-	die "Chromosome number extraction failed for $mapped_chromosome\n";
-      }
-
-      ### We will use the optional field to determine the best alignment. Later on we extract the number of mismatches and/or indels from the CIGAR string
-      my ($alignment_score,$second_best,$MD_tag);
-      my @fields = split (/\t/,$fhs[$index]->{last_line});
-
-      foreach (11..$#fields){
-	if ($fields[$_] =~ /AS:i:(.*)/){
-	  $alignment_score = $1;
-	}
-	elsif ($fields[$_] =~ /XS:i:(.*)/){
-	  $second_best = $1;
-	}
-	elsif ($fields[$_] =~ /MD:Z:(.*)/){
-	  $MD_tag = $1;
-	}
-      }
-
-      #      warn "First  best alignment_score is: '$alignment_score'\n";
-      #     warn "MD tag is: '$MD_tag'\n";
-      die "Failed to extract alignment score ($alignment_score) and MD tag ($MD_tag)!\n" unless (defined $alignment_score and defined $MD_tag);
-
-      if (defined $second_best){
-	#	warn "second best alignment_score is: '$second_best'\n\n";
-
-	# If the first alignment score is the same as the alignment score of the second best hit we are going to boot this sequence altogether
-	if ($alignment_score == $second_best){
-	  $alignment_ambiguous = 1;
-	  ## need to read and discard all additional ambiguous reads until we reach the next sequence
-	  until ($fhs[$index]->{last_seq_id} ne $identifier){
-	    my $newline = $fhs[$index]->{fh}-> getline();
-	    if ($newline){
-	      chomp $newline;
-	      my ($seq_id) = split (/\t/,$newline);
-	      $fhs[$index]->{last_seq_id} = $seq_id;
-	      $fhs[$index]->{last_line} = $newline;
-	    }
-	    else{
-	      # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line} = undef;
-	      last; # break free in case we have reached the end of the alignment output
-	    }
-	  }
-	  #  warn "Index: $index\tThe current Seq-ID is $identifier, skipped all ambiguous sequences until the next ID which is: $fhs[$index]->{last_seq_id}\n";
-	}
-	else{ # the next best alignment has a lower alignment score than the current read, so we can safely store the current alignment
-
-	  my $alignment_location = join (":",$chromosome,$position);
-	
-	  ### If a sequence aligns to exactly the same location with a perfect match twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	  ### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
-	  ### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
-	  ### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 1, i.e. OT and OB 
-	
-	  unless (exists $alignments{$alignment_location}){
-	    $alignments{$alignment_location}->{seq_id} = $id; 
-	    $alignments{$alignment_location}->{alignment_score} = $alignment_score;
-	    $alignments{$alignment_location}->{bowtie_sequence} = $bowtie_sequence;
-	    $alignments{$alignment_location}->{index} = $index;
-	    $alignments{$alignment_location}->{chromosome} = $chromosome;
-	    $alignments{$alignment_location}->{position} = $position;
-	    $alignments{$alignment_location}->{CIGAR} = $cigar;
-	    $alignments{$alignment_location}->{MD_tag} = $MD_tag;
-	  }
-	
-	  ### now reading and discarding all (inferior) alignments of this sequencing read until we hit the next sequence
-	  until ($fhs[$index]->{last_seq_id} ne $identifier){
-	    my $newline = $fhs[$index]->{fh}-> getline();
-	    if ($newline){
-	      chomp $newline;
-	      my ($seq_id) = split (/\t/,$newline);
-	      $fhs[$index]->{last_seq_id} = $seq_id;
-	      $fhs[$index]->{last_line} = $newline;
-	    }
-	    else{
-	      # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line} = undef;
-	      last; # break free in case we have reached the end of the alignment output
-	    }
-	  }
-	  #  warn "Index: $index\tThe current Seq-ID is $identifier, skipped all ambiguous sequences until the next ID which is: $fhs[$index]->{last_seq_id}\n";
-	}
-      }
-      else{ # there is no second best hit, so we can just store this one and read in the next sequence
-	
-	my $alignment_location = join (":",$chromosome,$position);
-	
-	### If a sequence aligns to exactly the same location with a perfect match twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
-	### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
-	### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 1, i.e. OT and OB 
-
-	unless (exists $alignments{$alignment_location}){
-	  $alignments{$alignment_location}->{seq_id} = $id; 
-	  $alignments{$alignment_location}->{alignment_score} = $alignment_score;
-	  $alignments{$alignment_location}->{bowtie_sequence} = $bowtie_sequence;
-	  $alignments{$alignment_location}->{index} = $index;
-	  $alignments{$alignment_location}->{chromosome} = $chromosome;
-	  $alignments{$alignment_location}->{position} = $position;
-	  $alignments{$alignment_location}->{MD_tag} = $MD_tag;
-	  $alignments{$alignment_location}->{CIGAR} = $cigar;
-	}
-	
-	my $newline = $fhs[$index]->{fh}-> getline();
-	if ($newline){
-	  chomp $newline;
-	  my ($seq_id) = split (/\t/,$newline);
-	  $fhs[$index]->{last_seq_id} = $seq_id;
-	  $fhs[$index]->{last_line} = $newline;
-	  if ($seq_id eq $identifier){
-	    die "Sequence with ID $identifier did not have a second best alignment, but next seq-ID was also $fhs[$index]->{last_seq_id}!\n";
-	  }
-	}
-	else{
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line} = undef;
-	}
-      }
-    }
-  }
-
-  ### if the read produced several ambiguous alignments already now can returning already now. If --ambiguous or --unmapped was specified the read sequence will be printed out.
-  if ($alignment_ambiguous == 1){
-    $counting{unsuitable_sequence_count}++;
-    ### report that the sequence has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-    # my $ambiguous_read_output = join("\t",$identifier,'256','*','0','0','*','*','0','0',$sequence,$quality_value);
-    # print "$ambiguous_read_output\n";
-
-    if ($ambiguous){
-      return 2; # => exits to next sequence, and prints it out to _ambiguous_reads.txt if '--ambiguous' was specified
-    }
-    elsif ($unmapped){
-      return 1; # => exits to next sequence, and prints it out to _unmapped_reads.txt if '--unmapped' but not '--ambiguous' was specified
-    }
-    else{
-      return 0;
-    }
-  }
-
-  ### if there was no alignment found for a certain sequence at all we continue with the next sequence in the sequence file
-  unless(%alignments){
-    $counting{no_single_alignment_found}++;
-    # my $unmapped_read_output = join("\t",$identifier,'4','*','0','0','*','*','0','0',$sequence,$quality_value);
-    # print  "$unmapped_read_output\n";
-    if ($unmapped){
-      return 1; # => exits to next sequence, and prints it out to _unmapped_reads.txt if '--unmapped' was specified
-    }
-    else{
-      return 0; # default
-    }
-  }
-
-  #######################################################################################################################################################
-
-  ### If the sequence was not rejected so far we are now looking if there is a unique best alignment among all alignment instances. If there is only one
-  ### single best position we are going to store the alignment information in the $meth_call variable. If there are multiple hits with the same (highest)
-  ### alignment score we are discarding the sequence altogether.
-  ### For end-to-end alignments the maximum alignment score can be 0, each mismatch can receive penalties up to 6, and each gap receives penalties for
-  ### opening (5) and extending (3 per bp) the gap.
-
-  #######################################################################################################################################################
-
-  my $methylation_call_params; # hash reference which will store all information we need for the methylation call
-  my $sequence_fails = 0; # Going to use $sequence_fails as a 'memory' if a sequence could not be aligned uniquely (set to 1 then)
-
-  ### print contents of %alignments for debugging
-  #   if (scalar keys %alignments > 1){
-  #     print "\n******\n";
-  #     foreach my $alignment_location (sort {$a cmp $b} keys %alignments){
-  #       print "Loc:  $alignment_location\n";
-  #       print "ID:   $alignments{$alignment_location}->{seq_id}\n";
-  #       print "AS:   $alignments{$alignment_location}->{alignment_score}\n";
-  #       print "Seq:  $alignments{$alignment_location}->{bowtie_sequence}\n";
-  #       print "Index $alignments{$alignment_location}->{index}\n";
-  #       print "Chr:  $alignments{$alignment_location}->{chromosome}\n";
-  #       print "pos:  $alignments{$alignment_location}->{position}\n";
-  #       print "MD:   $alignments{$alignment_location}->{MD_tag}\n\n";
-  #     }
-  #     print "\n******\n";
-  #   }
-
-  ### if there is only 1 entry in the hash with we accept it as the best alignment
-  if (scalar keys %alignments == 1){
-    for my $unique_best_alignment (keys %alignments){
-      $methylation_call_params->{$identifier}->{bowtie_sequence} = $alignments{$unique_best_alignment}->{bowtie_sequence};
-      $methylation_call_params->{$identifier}->{chromosome}      = $alignments{$unique_best_alignment}->{chromosome};
-      $methylation_call_params->{$identifier}->{position}        = $alignments{$unique_best_alignment}->{position};
-      $methylation_call_params->{$identifier}->{index}           = $alignments{$unique_best_alignment}->{index};
-      $methylation_call_params->{$identifier}->{alignment_score} = $alignments{$unique_best_alignment}->{alignment_score};
-      $methylation_call_params->{$identifier}->{MD_tag}          = $alignments{$unique_best_alignment}->{MD_tag};
-      $methylation_call_params->{$identifier}->{CIGAR}           = $alignments{$unique_best_alignment}->{CIGAR};
-    }
-  }
-
-  ### otherwise we are going to find out if there is a best match among the multiple alignments, or whether there are 2 or more equally good alignments (in which case
-  ### we boot the sequence altogether
-  elsif (scalar keys %alignments >= 2  and scalar keys %alignments <= 4){
-    my $best_alignment_score;
-    my $best_alignment_location;
-    foreach my $alignment_location (sort {$alignments{$b}->{alignment_score} <=> $alignments{$a}->{alignment_score}} keys %alignments){
-      # print "$alignments{$alignment_location}->{alignment_score}\n";
-      unless (defined $best_alignment_score){
-	$best_alignment_score = $alignments{$alignment_location}->{alignment_score};
-	$best_alignment_location = $alignment_location;
-	# print "setting best alignment score: $best_alignment_score\n";
-      }
-      else{
-	### if the second best alignment has the same alignment score as the first one, the sequence will get booted
-	if ($alignments{$alignment_location}->{alignment_score} == $best_alignment_score){
-	  # warn "Same alignment score, the sequence will get booted!\n";
-	  $sequence_fails = 1;
-	  last; # exiting after the second alignment since we know that the sequence has ambiguous alignments
-	}
-	### else we are going to store the best alignment for further processing
-	else{
-	  $methylation_call_params->{$identifier}->{bowtie_sequence} = $alignments{$best_alignment_location}->{bowtie_sequence};
-	  $methylation_call_params->{$identifier}->{chromosome}      = $alignments{$best_alignment_location}->{chromosome};
-	  $methylation_call_params->{$identifier}->{position}        = $alignments{$best_alignment_location}->{position};
-	  $methylation_call_params->{$identifier}->{index}           = $alignments{$best_alignment_location}->{index};
-	  $methylation_call_params->{$identifier}->{alignment_score} = $alignments{$best_alignment_location}->{alignment_score};
-	  $methylation_call_params->{$identifier}->{MD_tag}          = $alignments{$best_alignment_location}->{MD_tag};
-	  $methylation_call_params->{$identifier}->{CIGAR}           = $alignments{$best_alignment_location}->{CIGAR};
-	  last; # exiting after processing the second alignment since the sequence produced a unique best alignment
-	}
-      }
-    }
-  }
-  else{
-    die "There are too many potential hits for this sequence (1-4 expected, but found: ",scalar keys %alignments,")\n";;
-  }
-
-  ### skipping the sequence completely if there were multiple alignments with the same best alignment score at different positions
-  if ($sequence_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-
-    ### report that the sequence has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-    # my $ambiguous_read_output = join("\t",$identifier,'256','*','0','0','*','*','0','0',$sequence,$quality_value);
-    # print OUT "$ambiguous_read_output\n";
-
-    if ($ambiguous){
-      return 2; # => exits to next sequence, and prints it out (in FastQ format) to _ambiguous_reads.txt if '--ambiguous' was specified
-    }
-    elsif ($unmapped){
-      return 1; # => exits to next sequence, and prints it out (in FastQ format) to _unmapped_reads.txt if '--unmapped' but not '--ambiguous' was specified
-    }
-    else{
-      return 0; # => exits to next sequence (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 2) or ($methylation_call_params->{$identifier}->{index} == 3) ){
-      # warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence has not been rejected so far it has a unique best alignment
-  $counting{unique_best_alignment_count}++;
-
-  ### Now we need to extract a genomic sequence that exactly corresponds to the reported alignment. This potentially means that we need to deal with insertions or deletions as well
-  extract_corresponding_genomic_sequence_single_end_bowtie2 ($identifier,$methylation_call_params);
-
-  ### check test to see if the genomic sequence we extracted has the same length as the observed sequence+2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence}) != length($sequence)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-
-  ### otherwise we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call} = methylation_call($identifier,$sequence,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence},$methylation_call_params->{$identifier}->{read_conversion});
-  print_bisulfite_mapping_result_single_end_bowtie2 ($identifier,$sequence,$methylation_call_params,$quality_value);
-  return 0; ## if a sequence got this far we do not want to print it to unmapped or ambiguous.out
-}
-
-
-sub determine_number_of_transliterations_performed{
-  my ($sequence,$read_conversion) = @_;
-  my $number_of_transliterations;
-  if ($read_conversion eq 'CT'){
-    $number_of_transliterations = $sequence =~ tr/C/T/;
-  }
-  elsif ($read_conversion eq 'GA'){
-    $number_of_transliterations = $sequence =~ tr/G/A/;
-  }
-  else{
-    die "Read conversion mode of the read was not specified $!\n";
-  }
-  return $number_of_transliterations;
-}
-
-sub decide_whether_single_end_alignment_is_valid{
-  my ($index,$identifier) = @_;
-
-  # extracting from Bowtie 1 format
-  my ($id,$strand) = (split (/\t/,$fhs[$index]->{last_line}))[0,1];
-
-  ### ensuring that the entry is the correct sequence
-  if (($id eq $fhs[$index]->{last_seq_id}) and ($id eq $identifier)){
-    ### checking the orientation of the alignment. We need to discriminate between 8 different conditions, however only 4 of them are theoretically
-    ### sensible alignments
-    my $orientation = ensure_sensical_alignment_orientation_single_end ($index,$strand);
-    ### If the orientation was correct can we move on
-    if ($orientation == 1){
-      return 1; ### 1st possibility for a sequence to pass
-    }
-    ### If the alignment was in the wrong orientation we need to read in a new line
-    elsif($orientation == 0){
-      my $newline = $fhs[$index]->{fh}->getline();
-      if ($newline){
-		($id,$strand) = (split (/\t/,$newline))[0,1];
-		
-	### ensuring that the next entry is still the correct sequence
-	if ($id eq $identifier){
-	  ### checking orientation again
-	  $orientation = ensure_sensical_alignment_orientation_single_end ($index,$strand);
-	  ### If the orientation was correct can we move on
-	  if ($orientation == 1){
-	    $fhs[$index]->{last_seq_id} = $id;
-	    $fhs[$index]->{last_line} = $newline;
-	    return 1; ### 2nd possibility for a sequence to pass
-	  }
-	  ### If the alignment was in the wrong orientation again we need to read in yet another new line and store it in @fhs
-	  elsif ($orientation == 0){
-	    $newline = $fhs[$index]->{fh}->getline();
-	    if ($newline){
-	      my ($seq_id) = split (/\t/,$newline);
-	      ### check if the next line still has the same seq ID (must not happen), and if not overwrite the current seq-ID and bowtie output with
-	      ### the same fields of the just read next entry
-	      die "Same seq ID 3 or more times in a row!(should be 2 max) $!" if ($seq_id eq $identifier);
-	      $fhs[$index]->{last_seq_id} = $seq_id;
-	      $fhs[$index]->{last_line} = $newline;
-	      return 0; # not processing anything this round as the alignment currently stored in last_line was in the wrong orientation
-	    }
-	    else{
-	      # assigning undef to last_seq_id and last_line (end of bowtie output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line} = undef;
-	      return 0; # not processing anything as the alignment currently stored in last_line was in the wrong orientation
-	    }
-	  }
-	  else{
-	    die "The orientation of the alignment must be either correct or incorrect\n";
-	  }
-	}
-	### the sequence we just read in is already the next sequence to be analysed -> store it in @fhs
-	else{
-	  $fhs[$index]->{last_seq_id} = $id;
-	  $fhs[$index]->{last_line} = $newline;
-	  return 0; # processing the new alignment result only in the next round
-	}
-      }
-      else {
-	# assigning undef to last_seq_id and last_line (end of bowtie output)
-	$fhs[$index]->{last_seq_id} = undef;
-	$fhs[$index]->{last_line} = undef;
-	return 0; # not processing anything as the alignment currently stored in last_line was in the wrong orientation
-      }
-    }
-    else{
-      die "The orientation of the alignment must be either correct or incorrect\n";
-    }
-  }
-  ### the sequence stored in @fhs as last_line is already the next sequence to be analysed -> analyse next round
-  else{
-    return 0;
-  }
-}
-#########################
-### BOWTIE 1 | PAIRED-END
-#########################
-
-sub check_bowtie_results_paired_ends{
-  my ($sequence_1,$sequence_2,$identifier,$quality_value_1,$quality_value_2) = @_;
-
-  ### quality values are not given for FastA files, so they are initialised with a Phred quality of 40
-  unless ($quality_value_1){
-    $quality_value_1 = 'I'x(length$sequence_1);
-  }
-  unless ($quality_value_2){
-    $quality_value_2 = 'I'x(length$sequence_2);
-  }
-
-  #  warn "$identifier\n$fhs[0]->{last_seq_id}\n$fhs[1]->{last_seq_id}\n$fhs[2]->{last_seq_id}\n$fhs[3]->{last_seq_id}\n\n";
-  #  sleep (1);
-  my %mismatches = ();
-  ### reading from the bowtie output files to see if this sequence pair aligned to a bisulfite converted genome
-
-
-  ### for paired end reads we are reporting alignments to the OT strand first (index 0), then the OB strand (index 3!!), similiar to the single end way.
-  ### alignments to the complementary strands are reported afterwards (CTOT got index 1, and CTOB got index 2).
-  ### This is needed so that alignments which either contain no single C or G or reads which contain only protected Cs are reported to the original strands (OT and OB)
-  ### Before the complementary strands. Remember that it does not make any difference for the methylation calls, but it will matter if alignment to the complementary
-  ### strands are not being reported by specifying --directional
-
-  foreach my $index (0,3,1,2){
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line_1} and $fhs[$index]->{last_line_2} and defined $fhs[$index]->{last_seq_id});
-    ### if the sequence pair we are currently looking at produced an alignment we are doing various things with it
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-      # print "$identifier\n$fhs[$index]->{last_seq_id}\n\n";
-
-      ##################################################################################
-      ### STEP I Processing the entry which is stored in last_line_1 and last_line_2 ###
-      ##################################################################################
-      my $valid_alignment_found = decide_whether_paired_end_alignment_is_valid($index,$identifier);
-      ### sequences can fail at this point if there was only 1 alignment in the wrong orientation, or if there were 2 aligments both in the wrong
-      ### orientation. We only continue to extract useful information about this alignment if 1 was returned
-      if ($valid_alignment_found == 1){
-	### Bowtie outputs which made it this far are in the correct orientation, so we can continue to analyse the alignment itself.
-	### we store the useful information in %mismatches
-	my ($id_1,$strand_1,$mapped_chromosome_1,$position_1,$bowtie_sequence_1,$mismatch_info_1) = (split (/\t/,$fhs[$index]->{last_line_1},-1))[0,1,2,3,4,7];
-	my ($id_2,$strand_2,$mapped_chromosome_2,$position_2,$bowtie_sequence_2,$mismatch_info_2) = (split (/\t/,$fhs[$index]->{last_line_2},-1))[0,1,2,3,4,7];
-	chomp $mismatch_info_1;
-	chomp $mismatch_info_2;
-	
-	### need to extract the chromosome number from the bowtie output (which is either XY_CT_converted or XY_GA_converted
-	my ($chromosome_1,$chromosome_2);
-	if ($mapped_chromosome_1 =~ s/_(CT|GA)_converted$//){
-	  $chromosome_1 = $mapped_chromosome_1;
-	}	
-	else{
-	  die "Chromosome number extraction failed for $mapped_chromosome_1\n";
-	}
-	if ($mapped_chromosome_2 =~ s/_(CT|GA)_converted$//){
-	  $chromosome_2 = $mapped_chromosome_2;
-	}
-	else{
-	  die "Chromosome number extraction failed for $mapped_chromosome_2\n";
-	}
-	
-	### Now extracting the number of mismatches to the converted genome
-	my $number_of_mismatches_1;
-	my $number_of_mismatches_2;
-	if ($mismatch_info_1 eq ''){
-	  $number_of_mismatches_1 = 0;
-	}
-	elsif ($mismatch_info_1 =~ /^\d/){
-	  my @mismatches = split (/,/,$mismatch_info_1);
-	  $number_of_mismatches_1 = scalar @mismatches;
-	}
-	else{
-	  die "Something weird is going on with the mismatch field\n";
-	}
-	if ($mismatch_info_2 eq ''){
-	  $number_of_mismatches_2 = 0;
-	}
-	elsif ($mismatch_info_2 =~ /^\d/){
-	  my @mismatches = split (/,/,$mismatch_info_2);
-	  $number_of_mismatches_2 = scalar @mismatches;
-	}
-	else{
-	  die "Something weird is going on with the mismatch field\n";
-	}
-	### To decide whether a sequence pair has a unique best alignment we will look at the lowest sum of mismatches from both alignments
-	my $sum_of_mismatches = $number_of_mismatches_1+$number_of_mismatches_2;
-	### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	die "Position 1 is higher than position 2" if ($position_1 > $position_2);
-	die "Paired-end alignments need to be on the same chromosome\n" unless ($chromosome_1 eq $chromosome_2);
-	my $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	### strand) were methylated and therefore protected. It is not needed to overwrite the same positional entry with a second entry for the same
-	### location (the genomic sequence extraction and methylation would not be affected by this, only the thing which would change is the index
-	### number for the found alignment)
-	unless (exists $mismatches{$sum_of_mismatches}->{$alignment_location}){
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{seq_id}=$id_1; # either is fine
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_1}=$bowtie_sequence_1;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_2}=$bowtie_sequence_2;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{index}=$index;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome_1; # either is fine
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_1}=$position_1;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_2}=$position_2;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_1} = $number_of_mismatches_1;
-	  $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_2} = $number_of_mismatches_2;
-	}
-	###################################################################################################################################################
-	### STEP II Now reading in the next 2 lines from the bowtie filehandle. If there are 2 next lines in the alignments filehandle it can either    ###
-	### be a second alignment of the same sequence pair or a new sequence pair. In any case we will just add it to last_line_1 and last_line _2.    ###
-	### If it is the alignment of the next sequence pair, 0 will be returned as $valid_alignment_found, so it will not be processed any further in  ###
-	### this round                                                                                                                                  ###
-	###################################################################################################################################################
-	my $newline_1 = $fhs[$index]->{fh}-> getline();
-	my $newline_2 = $fhs[$index]->{fh}-> getline();
-
-	if ($newline_1 and $newline_2){
-	  my ($seq_id_1) = split (/\t/,$newline_1);
-	  my ($seq_id_2) = split (/\t/,$newline_2);
-	
-	  if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-	    $fhs[$index]->{last_seq_id} = $seq_id_1;
-	  }
-	  elsif ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-	    $fhs[$index]->{last_seq_id} = $seq_id_2;
-	  }
-	  else{
-	    die "Either read 1 or read 2 needs to end on '/1'\n";
-	  }
-	
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-	}
-	else {
-	  # assigning undef to last_seq_id and both last_lines and jumping to the next index (end of bowtie output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line_1} = undef;
-	  $fhs[$index]->{last_line_2} = undef;
-	  next; # jumping to the next index
-	}
-	### Now processing the entry we just stored in last_line_1 and last_line_2
-	$valid_alignment_found = decide_whether_paired_end_alignment_is_valid($index,$identifier);
-	### only processing the alignment further if 1 was returned. 0 will be returned either if the alignment is already the next sequence pair to
-	### be analysed or if it was a second alignment of the current sequence pair but in the wrong orientation
-	if ($valid_alignment_found == 1){
-	  ### we store the useful information in %mismatches
-	  ($id_1,$strand_1,$mapped_chromosome_1,$position_1,$bowtie_sequence_1,$mismatch_info_1) = (split (/\t/,$fhs[$index]->{last_line_1}))[0,1,2,3,4,7];
-	  ($id_2,$strand_2,$mapped_chromosome_2,$position_2,$bowtie_sequence_2,$mismatch_info_2) = (split (/\t/,$fhs[$index]->{last_line_2}))[0,1,2,3,4,7];
-	  chomp $mismatch_info_1;
-	  chomp $mismatch_info_2;
-	  ### need to extract the chromosome number from the bowtie output (which is either _CT_converted or _GA_converted)
-	  if ($mapped_chromosome_1 =~ s/_(CT|GA)_converted$//){
-	    $chromosome_1 = $mapped_chromosome_1;
-	  }	
-	  else{
-	    die "Chromosome number extraction failed for $mapped_chromosome_1\n";
-	  }
-	  if ($mapped_chromosome_2 =~ s/_(CT|GA)_converted$//){
-	    $chromosome_2 = $mapped_chromosome_2;
-	  }
-	  else{
-	    die "Chromosome number extraction failed for $mapped_chromosome_2\n";
-	  }
-	
-	  $number_of_mismatches_1='';
-	  $number_of_mismatches_2='';
-	  ### Now extracting the number of mismatches to the converted genome
-	  if ($mismatch_info_1 eq ''){
-	    $number_of_mismatches_1 = 0;
-	  }
-	  elsif ($mismatch_info_1 =~ /^\d/){
-	    my @mismatches = split (/,/,$mismatch_info_1);
-	    $number_of_mismatches_1 = scalar @mismatches;
-	  }
-	  else{
-	    die "Something weird is going on with the mismatch field\n";
-	  }
-	  if ($mismatch_info_2 eq ''){
-	    $number_of_mismatches_2 = 0;
-	  }
-	  elsif ($mismatch_info_2 =~ /^\d/){
-	    my @mismatches = split (/,/,$mismatch_info_2);
-	    $number_of_mismatches_2 = scalar @mismatches;
-	  }
-	  else{
-	    die "Something weird is going on with the mismatch field\n";
-	  }
-	  ### To decide whether a sequence pair has a unique best alignment we will look at the lowest sum of mismatches from both alignments
-	  $sum_of_mismatches = $number_of_mismatches_1+$number_of_mismatches_2;
-	  ### creating a composite location variable from $chromosome and $position and storing the alignment information in a temporary hash table
-	  die "position 1 is greater than position 2" if ($position_1 > $position_2);
-	  die "Paired-end alignments need to be on the same chromosome\n" unless ($chromosome_1 eq $chromosome_2);
-	  $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	  ### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
-	  ### strand) were methylated and therefore protected. It is not needed to overwrite the same positional entry with a second entry for the same
-	  ### location (the genomic sequence extraction and methylation would not be affected by this, only the thing which would change is the index
-	  ### number for the found alignment)
-	  unless (exists $mismatches{$sum_of_mismatches}->{$alignment_location}){
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{seq_id}=$id_1; # either is fine
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_1}=$bowtie_sequence_1;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{bowtie_sequence_2}=$bowtie_sequence_2;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{index}=$index;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{chromosome}=$chromosome_1; # either is fine
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_1}=$position_1;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{start_seq_2}=$position_2;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_1} = $number_of_mismatches_1;
-	    $mismatches{$sum_of_mismatches}->{$alignment_location}->{number_of_mismatches_2} = $number_of_mismatches_2;
-	  }
-	  ###############################################################################################################################################
-	  ### STEP III Now reading in two more lines. These have to be the next entry and we will just add assign them to last_line_1 and last_line_2 ###
-	  ###############################################################################################################################################
-	  $newline_1 = $fhs[$index]->{fh}-> getline();
-	  $newline_2 = $fhs[$index]->{fh}-> getline();
-
-	  if ($newline_1 and $newline_2){
-	    my ($seq_id_1) = split (/\t/,$newline_1);
-	    my ($seq_id_2) = split (/\t/,$newline_2);
-
-	    if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-	      $fhs[$index]->{last_seq_id} = $seq_id_1;
-	    }
-	    if ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-	      $fhs[$index]->{last_seq_id} = $seq_id_2;
-	    }
-	    $fhs[$index]->{last_line_1} = $newline_1;
-	    $fhs[$index]->{last_line_2} = $newline_2;
-	  }
-	  else {
-	    # assigning undef to last_seq_id and both last_lines and jumping to the next index (end of bowtie output)
-	    $fhs[$index]->{last_seq_id} = undef;
-	    $fhs[$index]->{last_line_1} = undef;
-	    $fhs[$index]->{last_line_2} = undef;
-	    next; # jumping to the next index
-	  }
-	  ### within the 2nd sequence pair alignment in correct orientation found
-	}
-	### within the 1st sequence pair alignment in correct orientation found
-      }
-      ### still within the (last_seq_id eq identifier) condition
-    }
-    ### still within foreach index loop
-  }
-  ### if there was no single alignment found for a certain sequence we will continue with the next sequence in the sequence file
-  unless(%mismatches){
-    $counting{no_single_alignment_found}++;
-    return 1; ### We will print this sequence out as unmapped sequence if --un unmapped.out has been specified
-  }
-  ### Going to use the variable $sequence_pair_fails as a 'memory' if a sequence could not be aligned uniquely (set to 1 then)
-  my $sequence_pair_fails = 0;
-  ### Declaring an empty hash reference which will store all information we need for the methylation call
-  my $methylation_call_params; # hash reference!
-  ### We are now looking if there is a unique best alignment for a certain sequence. This means we are sorting in ascending order and look at the
-  ### sequence with the lowest amount of mismatches. If there is only one single best position we are going to store the alignment information in the
-  ### meth_call variables, if there are multiple hits with the same amount of (lowest) mismatches we are discarding the sequence altogether
-  foreach my $mismatch_number (sort {$a<=>$b} keys %mismatches){
-    #dev print "Number of mismatches: $mismatch_number\t$identifier\t$sequence_1\t$sequence_2\n";
-    foreach my $entry (keys (%{$mismatches{$mismatch_number}}) ){
-      #dev print "$mismatch_number\t$entry\t$mismatches{$mismatch_number}->{$entry}->{index}\n";
-      # print join("\t",$mismatch_number,$mismatches{$mismatch_number}->{$entry}->{seq_id},$sequence,$mismatches{$mismatch_number}->{$entry}->{bowtie_sequence},$mismatches{$mismatch_number}->{$entry}->{chromosome},$mismatches{$mismatch_number}->{$entry}->{position},$mismatches{$mismatch_number}->{$entry}->{index}),"\n";
-    }
-    if (scalar keys %{$mismatches{$mismatch_number}} == 1){
-      #  print "Unique best alignment for sequence pair $sequence_1\t$sequence_1\n";
-      for my $unique_best_alignment (keys %{$mismatches{$mismatch_number}}){
-	$methylation_call_params->{$identifier}->{seq_id} = $identifier;
- 	$methylation_call_params->{$identifier}->{bowtie_sequence_1} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence_1};
-	$methylation_call_params->{$identifier}->{bowtie_sequence_2} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence_2};
-       	$methylation_call_params->{$identifier}->{chromosome} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{chromosome};
-      	$methylation_call_params->{$identifier}->{start_seq_1} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{start_seq_1};
-	$methylation_call_params->{$identifier}->{start_seq_2} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{start_seq_2};
-	$methylation_call_params->{$identifier}->{alignment_end} = ($mismatches{$mismatch_number}->{$unique_best_alignment}->{start_seq_2}+length($mismatches{$mismatch_number}->{$unique_best_alignment}->{bowtie_sequence_2}));
-	$methylation_call_params->{$identifier}->{index} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{index};
-     	$methylation_call_params->{$identifier}->{number_of_mismatches_1} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{number_of_mismatches_1};
-	$methylation_call_params->{$identifier}->{number_of_mismatches_2} = $mismatches{$mismatch_number}->{$unique_best_alignment}->{number_of_mismatches_2};
-      }
-    }
-    else{
-      $sequence_pair_fails = 1;
-    }
-    ### after processing the alignment with the lowest number of mismatches we exit
-    last;
-  }
-  ### skipping the sequence completely if there were multiple alignments with the same amount of lowest mismatches found at different positions
-  if ($sequence_pair_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-    if ($ambiguous){
-      return 2; # => exits to next sequence pair, and prints both seqs out to multiple_alignments_1 and -2 if --ambiguous has been specified
-    }
-    if ($unmapped){
-      return 1; # => exits to next sequence pair, and prints both seqs out to unmapped_1 and _2  if --un has been specified
-    }
-    else{
-      return 0; # => exits to next sequence (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 1) or ($methylation_call_params->{$identifier}->{index} == 2) ){
-      #    warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence has not been rejected so far it does have a unique best alignment
-  $counting{unique_best_alignment_count}++;
-  extract_corresponding_genomic_sequence_paired_ends($identifier,$methylation_call_params);
-
-  ### check test to see if the genomic sequences we extracted has the same length as the observed sequences +2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1}) != length($sequence_1)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{start_seq_1}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2}) != length($sequence_2)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{start_seq_2}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  ### otherwise we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call_1} = methylation_call($identifier,$sequence_1,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1},$methylation_call_params->{$identifier}->{read_conversion_1});
-  $methylation_call_params->{$identifier}->{methylation_call_2} = methylation_call($identifier,$sequence_2,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2},$methylation_call_params->{$identifier}->{read_conversion_2});
-
-  print_bisulfite_mapping_results_paired_ends($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2);
-  return 0; ## otherwise 1 will be returned by default, which would print the sequence pair to unmapped_1 and _2
-}
-
-#########################
-### BOWTIE 2 | PAIRED-END
-#########################
-
-sub check_bowtie_results_paired_ends_bowtie2{
-  my ($sequence_1,$sequence_2,$identifier,$quality_value_1,$quality_value_2) = @_;
-
-  ### quality values are not given for FastA files, so they are initialised with a Phred quality of 40
-  unless ($quality_value_1){
-    $quality_value_1 = 'I'x(length$sequence_1);
-  }
-
-  unless ($quality_value_2){
-    $quality_value_2 = 'I'x(length$sequence_2);
-  }
-
-
-  # print "$identifier\n$fhs[0]->{last_seq_id}\n$fhs[1]->{last_seq_id}\n$fhs[2]->{last_seq_id}\n$fhs[3]->{last_seq_id}\n\n";
-
-
-  my %alignments;
-  my $alignment_ambiguous = 0;
-
-  ### reading from the Bowtie 2 output filehandles
-
-  ### for paired end reads we are reporting alignments to the OT strand first (index 0), then the OB strand (index 3!!), similiar to the single end way.
-  ### alignments to the complementary strands are reported afterwards (CTOT got index 1, and CTOB got index 2).
-  ### This is needed so that alignments which either contain no single C or G or reads which contain only protected Cs are reported to the original strands (OT and OB)
-  ### Before the complementary strands. Remember that it does not make any difference for the methylation calls, but it will matter if alignments to the complementary
-  ### strands are not being reported when '--directional' is specified
-
-  foreach my $index (0,3,1,2){
-    ### skipping this index if the last alignment has been set to undefined already (i.e. end of bowtie output)
-    next unless ($fhs[$index]->{last_line_1} and $fhs[$index]->{last_line_2} and defined $fhs[$index]->{last_seq_id});
-
-    ### if the sequence pair we are currently looking at produced an alignment we are doing various things with it
-    if ($fhs[$index]->{last_seq_id} eq $identifier) {
-
-      my ($id_1,$flag_1,$mapped_chromosome_1,$position_1,$mapping_quality_1,$cigar_1,$bowtie_sequence_1,$qual_1) = (split (/\t/,$fhs[$index]->{last_line_1}))[0,1,2,3,4,5,9,10];
-      my ($id_2,$flag_2,$mapped_chromosome_2,$position_2,$mapping_quality_2,$cigar_2,$bowtie_sequence_2,$qual_2) = (split (/\t/,$fhs[$index]->{last_line_2}))[0,1,2,3,4,5,9,10];
-      #  print "Index: $index\t$fhs[$index]->{last_line_1}\n";
-      #  print "Index: $index\t$fhs[$index]->{last_line_2}\n";	
-      #  print join ("\t",$id_1,$flag_1,$mapped_chromosome_1,$position_1,$mapping_quality_1,$cigar_1,$bowtie_sequence_1,$qual_1),"\n";
-      #  print join ("\t",$id_2,$flag_2,$mapped_chromosome_2,$position_2,$mapping_quality_2,$cigar_2,$bowtie_sequence_2,$qual_2),"\n";
-      $id_1 =~ s/\/1$//;
-      $id_2 =~ s/\/2$//;
-
-      #  SAM format specifications for Bowtie 2
-      #  (1) Name of read that aligned
-      #  (2) Sum of all applicable flags. Flags relevant to Bowtie are:
-      #        1 The read is one of a pair
-      #        2 The alignment is one end of a proper paired-end alignment
-      #        4 The read has no reported alignments
-      #        8 The read is one of a pair and has no reported alignments
-      #       16 The alignment is to the reverse reference strand
-      #       32 The other mate in the paired-end alignment is aligned to the reverse reference strand
-      #       64 The read is mate 1 in a pair
-      #      128 The read is mate 2 in a pair
-      #      256 The read has multiple mapping states
-      #  (3) Name of reference sequence where alignment occurs (unmapped reads have a *)
-      #  (4) 1-based offset into the forward reference strand where leftmost character of the alignment occurs (0 for unmapped reads)
-      #  (5) Mapping quality (255 means MAPQ is not available)
-      #  (6) CIGAR string representation of alignment (* if unavailable)
-      #  (7) Name of reference sequence where mate's alignment occurs. Set to = if the mate's reference sequence is the same as this alignment's, or * if there is no mate.
-      #  (8) 1-based offset into the forward reference strand where leftmost character of the mate's alignment occurs. Offset is 0 if there is no mate.
-      #  (9) Inferred fragment size. Size is negative if the mate's alignment occurs upstream of this alignment. Size is 0 if there is no mate.
-      # (10) Read sequence (reverse-complemented if aligned to the reverse strand)
-      # (11) ASCII-encoded read qualities (reverse-complemented if the read aligned to the reverse strand). The encoded quality values are on the Phred quality scale and the encoding is ASCII-offset by 33 (ASCII char !), similarly to a FASTQ file.
-      # (12) Optional fields. Fields are tab-separated. bowtie2 outputs zero or more of these optional fields for each alignment, depending on the type of the alignment:
-      # AS:i:<N> Alignment score. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if SAM record is for an aligned read.
-      # XS:i:<N> Alignment score for second-best alignment. Can be negative. Can be greater than 0 in --local mode (but not in --end-to-end mode). Only present if the SAM record is for an aligned read and more than one alignment was found for the read.
-      # YS:i:<N> Alignment score for opposite mate in the paired-end alignment. Only present if the SAM record is for a read that aligned as part of a paired-end alignment.
-      # XN:i:<N> The number of ambiguous bases in the reference covering this alignment. Only present if SAM record is for an aligned read.
-      # XM:i:<N> The number of mismatches in the alignment. Only present if SAM record is for an aligned read.
-      # XO:i:<N> The number of gap opens, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # XG:i:<N> The number of gap extensions, for both read and reference gaps, in the alignment. Only present if SAM record is for an aligned read.
-      # NM:i:<N> The edit distance; that is, the minimal number of one-nucleotide edits (substitutions, insertions and deletions) needed to transform the read string into the reference string. Only present if SAM record is for an aligned read.
-      # YF:Z:<N> String indicating reason why the read was filtered out. See also: Filtering. Only appears for reads that were filtered out.
-      # MD:Z:<S> A string representation of the mismatched reference bases in the alignment. See SAM format specification for details. Only present if SAM record is for an aligned read.
-
-      ### If a sequence has no reported alignments there will be a single output line per sequence with a bit-wise flag value of 77 for read 1 (1+4+8+64), or 141 for read 2 (1+4+8+128).
-      ### We can store the next alignment and move on to the next Bowtie 2 instance
-      if ($flag_1 == 77 and $flag_2 == 141){
-	## reading in the next alignment, which must be the next sequence
-	my $newline_1 = $fhs[$index]->{fh}-> getline();
-	my $newline_2 = $fhs[$index]->{fh}-> getline();
-	
-	if ($newline_1 and $newline_2){
-	  chomp $newline_1;
-	  chomp $newline_2;
-	  my ($seq_id_1) = split (/\t/,$newline_1);
-	  my ($seq_id_2) = split (/\t/,$newline_2);
-	  $seq_id_1 =~ s/\/1$//;
-	  $seq_id_2 =~ s/\/2$//;
-	  $fhs[$index]->{last_seq_id} = $seq_id_1;
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-
-	  #  print "current sequence ($identifier) did not map, reading in next sequence\n";
-	  #  print "$index\t$fhs[$index]->{last_seq_id}\n";
-	  #  print "$index\t$fhs[$index]->{last_line_1}\n";
-	  #  print "$index\t$fhs[$index]->{last_line_2}\n";
-	  next; # next instance
-	}
-	else{
-	  # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line_1} = undef;
-	  $fhs[$index]->{last_line_2} = undef;
-	  next;
-	}
-      }
-
-      ### If there are one or more proper alignments we can extract the chromosome number
-      my ($chromosome_1,$chromosome_2);
-      if ($mapped_chromosome_1 =~ s/_(CT|GA)_converted$//){
-	$chromosome_1 = $mapped_chromosome_1;
-      }	
-      else{
-	die "Chromosome number extraction failed for $mapped_chromosome_1\n";
-      }
-      if ($mapped_chromosome_2 =~ s/_(CT|GA)_converted$//){
-	$chromosome_2 = $mapped_chromosome_2;
-      }
-      else{
-	die "Chromosome number extraction failed for $mapped_chromosome_2\n";
-      }
-
-      die "Paired-end alignments need to be on the same chromosome\n" unless ($chromosome_1 eq $chromosome_2);
-
-      ### We will use the optional fields to determine the best alignments. Later on we extract the number of mismatches and/or indels from the CIGAR string
-      my ($alignment_score_1,$alignment_score_2,$second_best_1,$second_best_2,$MD_tag_1,$MD_tag_2);
-
-      my @fields_1 = split (/\t/,$fhs[$index]->{last_line_1});
-      my @fields_2 = split (/\t/,$fhs[$index]->{last_line_2});
-
-      foreach (11..$#fields_1){
-	if ($fields_1[$_] =~ /AS:i:(.*)/){
-	  $alignment_score_1 = $1;
-	}
-	elsif ($fields_1[$_] =~ /XS:i:(.*)/){
-	  $second_best_1 = $1;
-	}
-	elsif ($fields_1[$_] =~ /MD:Z:(.*)/){
-	  $MD_tag_1 = $1;
-	}
-      }
-
-      foreach (11..$#fields_2){
-	if ($fields_2[$_] =~ /AS:i:(.*)/){
-	  $alignment_score_2 = $1;
-	}
-	elsif ($fields_2[$_] =~ /XS:i:(.*)/){
-	  $second_best_2 = $1;
-	}
-	elsif ($fields_2[$_] =~ /MD:Z:(.*)/){
-	  $MD_tag_2 = $1;
-	}
-      }
-
-      die "Failed to extract alignment score 1 ($alignment_score_1) and MD tag ($MD_tag_1)!\nlast alignment 1: $fhs[$index]->{last_line_1}\nlast alignment 2: $fhs[$index]->{last_line_2}\n" unless (defined $alignment_score_1 and defined $MD_tag_1);
-      die "Failed to extract alignment score 2 ($alignment_score_2) and MD tag ($MD_tag_2)!\nlast alignment 1: $fhs[$index]->{last_line_1}\nlast alignment 2: $fhs[$index]->{last_line_2}\n" unless (defined $alignment_score_2 and defined $MD_tag_2);
-
-      # warn "First read 1 alignment score is: '$alignment_score_1'\n";
-      # warn "First read 2 alignment score is: '$alignment_score_2'\n";
-      # warn "MD tag 1 is: '$MD_tag_1'\n";
-      # warn "MD tag 2 is: '$MD_tag_2'\n";
-
-      ### To decide whether a sequence pair has a unique best alignment we will look at the highest sum of alignment scores from both alignments
-      my $sum_of_alignment_scores_1 = $alignment_score_1 + $alignment_score_2 ;
-      # print "sum of alignment scores: $sum_of_alignment_scores_1\n\n";
-
-      if (defined $second_best_1 and defined $second_best_2){
-	my $sum_of_alignment_scores_second_best = $second_best_1 + $second_best_2;
-	# warn "Second best alignment_score_1 is: '$second_best_1'\n";
-	# warn "Second best alignment_score_2 is: '$second_best_2'\n";
-	# warn "Second best alignment sum of alignment scores is: '$sum_of_alignment_scores_second_best'\n";
-
-	# If the first alignment score for the first read pair is the same as the alignment score of the second best hit we are going to boot this sequence pair altogether
-	if ($sum_of_alignment_scores_1 == $sum_of_alignment_scores_second_best){
-	  $alignment_ambiguous = 1;
-	  # print "This read will be chucked (AS==XS detected)!\n";
-
- 	  ## need to read and discard all additional ambiguous reads until we reach the next sequence
- 	  until ($fhs[$index]->{last_seq_id} ne $identifier){
- 	    my $newline_1 = $fhs[$index]->{fh}-> getline();
-	    my $newline_2 = $fhs[$index]->{fh}-> getline();
-	    if ($newline_1 and $newline_2){
-	      chomp $newline_1;
-	      chomp $newline_2;
-	      my ($seq_id_1) = split (/\t/,$newline_1);
-	      my ($seq_id_2) = split (/\t/,$newline_2);
-	      $seq_id_1 =~ s/\/1$//;
-	      $seq_id_2 =~ s/\/2$//;
-	      # print "New Seq IDs:\t$seq_id_1\t$seq_id_2\n";
-
-	      $fhs[$index]->{last_seq_id} = $seq_id_1;
-	      $fhs[$index]->{last_line_1} = $newline_1;
-	      $fhs[$index]->{last_line_2} = $newline_2;
-		}
- 	    else{
- 	      # assigning undef to last_seq_id and last_line and jumping to the next index (end of Bowtie 2 output)
- 	      $fhs[$index]->{last_seq_id} = undef;
- 	      $fhs[$index]->{last_line_1} = undef;
-	      $fhs[$index]->{last_line_2} = undef;
-	      last; # break free if the end of the alignment output was reached
- 	    }
- 	  }
-	  #  if ($fhs[$index]->{last_seq_id}){
-	  #    warn "Index: $index\tThis Seq-ID is $identifier, skipped all ambiguous sequences until the next ID which is: $fhs[$index]->{last_seq_id}\n";
-	  #  }
-	}
- 	else{ # the next best alignment has a lower alignment score than the current read, so we can safely store the current alignment
-	
-	  my $alignment_location;
-	  if ($position_1 <= $position_2){
-	    $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	  }
-	  elsif($position_2 < $position_1){	
-	    $alignment_location = join(":",$chromosome_1,$position_2,$position_1);
-	  }
-	
- 	  ### If a sequence aligns to exactly the same location twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
- 	  ### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
- 	  ### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
- 	  ### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 3, i.e. OT and OB 
-	
-	  unless (exists $alignments{$alignment_location}){
-	    $alignments{$alignment_location}->{seq_id} = $id_1;
- 	    $alignments{$alignment_location}->{alignment_score_1} = $alignment_score_1;
-	    $alignments{$alignment_location}->{alignment_score_2} = $alignment_score_2;
-	    $alignments{$alignment_location}->{sum_of_alignment_scores} = $sum_of_alignment_scores_1;
-	    $alignments{$alignment_location}->{bowtie_sequence_1} = $bowtie_sequence_1;
-	    $alignments{$alignment_location}->{bowtie_sequence_2} = $bowtie_sequence_2;
-	    $alignments{$alignment_location}->{index} = $index;
- 	    $alignments{$alignment_location}->{chromosome} = $chromosome_1; # either is fine
- 	    $alignments{$alignment_location}->{position_1} = $position_1;
-	    $alignments{$alignment_location}->{position_2} = $position_2;
- 	    $alignments{$alignment_location}->{mismatch_info_1} = $MD_tag_1;
- 	    $alignments{$alignment_location}->{mismatch_info_2} = $MD_tag_2;
-	    $alignments{$alignment_location}->{CIGAR_1} = $cigar_1;
-	    $alignments{$alignment_location}->{CIGAR_2} = $cigar_2;
-	    $alignments{$alignment_location}->{flag_1} = $flag_1;
-	    $alignments{$alignment_location}->{flag_2} = $flag_2;
- 	  }
-	  # warn "added best of several alignments to \%alignments hash\n";
-	
- 	  ### now reading and discarding all (inferior) alignments of this read pair until we hit the next sequence
-	  until ($fhs[$index]->{last_seq_id} ne $identifier){
- 	    my $newline_1 = $fhs[$index]->{fh}-> getline();
-	    my $newline_2 = $fhs[$index]->{fh}-> getline();
-	    if ($newline_1 and $newline_2){
-	      chomp $newline_1;
-	      chomp $newline_2;
-	      my ($seq_id_1) = split (/\t/,$newline_1);
-	      my ($seq_id_2) = split (/\t/,$newline_2);
-	      $seq_id_1 =~ s/\/1$//;
-	      $seq_id_2 =~ s/\/2$//;
-	      # print "New Seq IDs:\t$seq_id_1\t$seq_id_2\n";
-
-	      $fhs[$index]->{last_seq_id} = $seq_id_1;
-	      $fhs[$index]->{last_line_1} = $newline_1;
-	      $fhs[$index]->{last_line_2} = $newline_2;
-	    }
- 	    else{
- 	      # assigning undef to last_seq_id and last_line_1 and _2 and jumping to the next index (end of Bowtie 2 output)
- 	      $fhs[$index]->{last_seq_id} = undef;
- 	      $fhs[$index]->{last_line_1} = undef;
-	      $fhs[$index]->{last_line_2} = undef;
-	      last; # break free if the end of the alignment output was reached
- 	    }
-	  }
-	  # if($fhs[$index]->{last_seq_id}){
-	  #   warn "Index: $index\tThis Seq-ID is $identifier, skipped all other alignments until the next ID was reached which is: $fhs[$index]->{last_seq_id}\n";
-	  # }
-	}	
-      }
-      else{ # there is no second best hit, so we can just store this one and read in the next sequence
-	
-	my $alignment_location = join(":",$chromosome_1,$position_1,$position_2);
-	# print "$alignment_location\n";
-	### If a sequence aligns to exactly the same location with a perfect match twice the sequence does either not contain any C or G, or all the Cs (or Gs on the reverse
- 	### strand) were methylated and therefore protected. Alternatively it will align better in one condition than in the other. In any case, it is not needed to overwrite
- 	### the same positional entry with a second entry for the same location, as the genomic sequence extraction and methylation call would not be affected by this. The only
- 	### thing which would change is the index number for the found alignment). We will continue to assign these alignments to the first indexes 0 and 3, i.e. OT and OB 
-
-	unless (exists $alignments{$alignment_location}){
-	  $alignments{$alignment_location}->{seq_id} = $id_1;
-	  $alignments{$alignment_location}->{alignment_score_1} = $alignment_score_1;
-	  $alignments{$alignment_location}->{alignment_score_2} = $alignment_score_2;
-	  $alignments{$alignment_location}->{sum_of_alignment_scores} = $sum_of_alignment_scores_1;
-	  $alignments{$alignment_location}->{bowtie_sequence_1} = $bowtie_sequence_1;
-	  $alignments{$alignment_location}->{bowtie_sequence_2} = $bowtie_sequence_2;
-	  $alignments{$alignment_location}->{index} = $index;
-	  $alignments{$alignment_location}->{chromosome} = $chromosome_1; # either is fine
-	  $alignments{$alignment_location}->{position_1} = $position_1;
-	  $alignments{$alignment_location}->{position_2} = $position_2;
-	  $alignments{$alignment_location}->{mismatch_info_1} = $MD_tag_1;
-	  $alignments{$alignment_location}->{mismatch_info_2} = $MD_tag_2;
-	  $alignments{$alignment_location}->{CIGAR_1} = $cigar_1;
-	  $alignments{$alignment_location}->{CIGAR_2} = $cigar_2;
-	  $alignments{$alignment_location}->{flag_1} = $flag_1;
-	  $alignments{$alignment_location}->{flag_2} = $flag_2;
-	}
-	
-	# warn "added unique alignment to \%alignments hash\n";
-
-	# Now reading and storing the next read pair
-	my $newline_1 = $fhs[$index]->{fh}-> getline();
-	my $newline_2 = $fhs[$index]->{fh}-> getline();
-	if ($newline_1 and $newline_2){
-	  chomp $newline_1;
-	  chomp $newline_2;
-	  # print "$newline_1\n";
-	  # print "$newline_2\n";
-	  my ($seq_id_1) = split (/\t/,$newline_1);
-	  my ($seq_id_2) = split (/\t/,$newline_2);
-	  $seq_id_1 =~ s/\/1$//;
-	  $seq_id_2 =~ s/\/2$//;
-	  # print "New Seq IDs:\t$seq_id_1\t$seq_id_2\n";
-
-	  $fhs[$index]->{last_seq_id} = $seq_id_1;
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-
-	  if ($seq_id_1 eq $identifier){
- 	    die "Sequence with ID $identifier did not have a second best alignment, but next seq-ID was also $fhs[$index]->{last_seq_id}!\n";
- 	  }
-  	}
-	else{
-	  # assigning undef to last_seq_id and last_line_1 and _2 and jumping to the next index (end of Bowtie 2 output)
-	  $fhs[$index]->{last_seq_id} = undef;
-	  $fhs[$index]->{last_line_1} = undef;
-	  $fhs[$index]->{last_line_2} = undef;
-	}
-      }
-    }
-  }
-
-  ### if the read produced several ambiguous alignments for a single instance of Bowtie 2 we can return already now. If --ambiguous was specified the read sequence will be printed out in FastQ format
-  if ($alignment_ambiguous == 1){
-    $counting{unsuitable_sequence_count}++;
-    ### report that the sequence pair has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-    #  my $ambiguous_read_1 = join("\t",$identifier.'/1','256','*','0','0','*','*','0','0',$sequence_1,$quality_value_1);
-    #  my $ambiguous_read_2 = join("\t",$identifier.'/2','256','*','0','0','*','*','0','0',$sequence_2,$quality_value_2);
-    #  print "$ambiguous_read_1\n";
-    #  print "$ambiguous_read_2\n";
-
-    if ($ambiguous){
-      return 2; # => exits to next sequence pair, and prints it out to _ambiguous_reads_1.txt and _ambiguous_reads_2.txt if '--ambiguous' was specified
-    }
-    elsif ($unmapped){
-      return 1; # => exits to next sequence pair, and prints it out to _unmapped_reads_1.txt and _unmapped_reads_2.txt if '--unmapped' but not '--ambiguous' was specified
-    }
-    else{
-      return 0;
-    }
-  }
-
-  ### if no alignment was found for a certain sequence at all we continue with the next sequence in the sequence file
-  unless (%alignments){
-    $counting{no_single_alignment_found}++;
-
-    # my $unmapped_read_1 = join("\t",$identifier.'/1','77','*','0','0','*','*','0','0',$sequence_1,$quality_value_1);
-    # my $unmapped_read_2 = join("\t",$identifier.'/2','141','*','0','0','*','*','0','0',$sequence_2,$quality_value_2);
-    # print "$unmapped_read_1\n";
-    # print "$unmapped_read_2\n";
-    if ($unmapped){
-      return 1; # => exits to next sequence pair, and prints it out to _unmapped_reads_1.txt and _unmapped_read_2.txt if '--unmapped' was specified
-    }
-    else{
-      return 0;
-    }
-  }
-
-  #######################################################################################################################################################
-
-  ### If the sequence pair was not rejected so far we are now looking if there is a unique best alignment among all alignment instances. If there is only one
-  ### single best position we are going to store the alignment information in the $meth_call variable. If there are multiple hits with the same (highest)
-  ### alignment score we are discarding the sequence pair altogether.
-  ### For end-to-end alignments the maximum alignment score is 0, each mismatch receives a penalty of 6, and each gap receives penalties for opening (5)
-  ### and extending (3 per bp) the gap.
-
-  #######################################################################################################################################################
-
-  ### Declaring an empty hash reference which will store all information we need for the methylation call
-  my $methylation_call_params; # hash reference
-  my $sequence_pair_fails = 0; # using $sequence_pair_fails as a 'memory' if a sequence could not be aligned uniquely (set to 1 then)
-
-  ### print contents of %alignments for debugging
-  ##  if (scalar keys %alignments >= 1){
-  #     print "\n******\n";
-  #     foreach my $alignment_location (sort {$a cmp $b} keys %alignments){
-  #       print "Loc:  $alignment_location\n";
-  #       print "ID:      $alignments{$alignment_location}->{seq_id}\n";
-  #       print "AS_1:    $alignments{$alignment_location}->{alignment_score_1}\n";
-  #       print "AS_2:    $alignments{$alignment_location}->{alignment_score_2}\n";
-  #       print "Seq_1:   $alignments{$alignment_location}->{bowtie_sequence_1}\n";
-  #       print "Seq_2:   $alignments{$alignment_location}->{bowtie_sequence_2}\n";
-  #       print "Index    $alignments{$alignment_location}->{index}\n";
-  #       print "Chr:     $alignments{$alignment_location}->{chromosome}\n";
-  #       print "Pos_1:   $alignments{$alignment_location}->{position_1}\n";
-  #       print "Pos_2:   $alignments{$alignment_location}->{position_2}\n";
-  #       print "CIGAR_1: $alignments{$alignment_location}->{CIGAR_1}\n";
-  #       print "CIGAR_2: $alignments{$alignment_location}->{CIGAR_2}\n";
-  #       print "MD_1:    $alignments{$alignment_location}->{mismatch_info_1}\n";
-  #       print "MD_2:    $alignments{$alignment_location}->{mismatch_info_2}\n";
-  #       print "Flag 1:  $alignments{$alignment_location}->{flag_1}\n";
-  #       print "Flag 2:  $alignments{$alignment_location}->{flag_2}\n";
-  #    }
-  #    print "\n******\n";
-  #  }
-
-  ### if there is only 1 entry in the %alignments hash we accept it as the best alignment
-  if (scalar keys %alignments == 1){
-    for my $unique_best_alignment (keys %alignments){
-      $methylation_call_params->{$identifier}->{bowtie_sequence_1} = $alignments{$unique_best_alignment}->{bowtie_sequence_1};
-      $methylation_call_params->{$identifier}->{bowtie_sequence_2} = $alignments{$unique_best_alignment}->{bowtie_sequence_2};
-      $methylation_call_params->{$identifier}->{chromosome}        = $alignments{$unique_best_alignment}->{chromosome};
-      $methylation_call_params->{$identifier}->{position_1}        = $alignments{$unique_best_alignment}->{position_1};
-      $methylation_call_params->{$identifier}->{position_2}        = $alignments{$unique_best_alignment}->{position_2};
-      $methylation_call_params->{$identifier}->{index}             = $alignments{$unique_best_alignment}->{index};
-      $methylation_call_params->{$identifier}->{alignment_score_1} = $alignments{$unique_best_alignment}->{alignment_score_1};
-      $methylation_call_params->{$identifier}->{alignment_score_2} = $alignments{$unique_best_alignment}->{alignment_score_2};
-      $methylation_call_params->{$identifier}->{sum_of_alignment_scores} = $alignments{$unique_best_alignment}->{sum_of_alignment_scores};
-      $methylation_call_params->{$identifier}->{mismatch_info_1}   = $alignments{$unique_best_alignment}->{mismatch_info_1};
-      $methylation_call_params->{$identifier}->{mismatch_info_2}   = $alignments{$unique_best_alignment}->{mismatch_info_2};
-      $methylation_call_params->{$identifier}->{CIGAR_1}           = $alignments{$unique_best_alignment}->{CIGAR_1};
-      $methylation_call_params->{$identifier}->{CIGAR_2}           = $alignments{$unique_best_alignment}->{CIGAR_2};
-      $methylation_call_params->{$identifier}->{flag_1}            = $alignments{$unique_best_alignment}->{flag_1};
-      $methylation_call_params->{$identifier}->{flag_2}            = $alignments{$unique_best_alignment}->{flag_2};
-    }
-  }
-
-  ### otherwise we are going to find out if there is a best match among the multiple alignments, or whether there are 2 or more equally good alignments (in which case
-  ### we boot the sequence pair altogether)
-  elsif (scalar keys %alignments >= 2  and scalar keys %alignments <= 4){
-    my $best_sum_of_alignment_scores;
-    my $best_alignment_location;
-    foreach my $alignment_location (sort {$alignments{$b}->{sum_of_alignment_scores} <=> $alignments{$a}->{sum_of_alignment_scores}} keys %alignments){
-      # print "$alignments{$alignment_location}->{sum_of_alignment_scores}\n";
-      unless (defined $best_sum_of_alignment_scores){
-	$best_sum_of_alignment_scores = $alignments{$alignment_location}->{sum_of_alignment_scores};
-	$best_alignment_location = $alignment_location;
-	# print "setting best alignment score to: $best_sum_of_alignment_scores\n";
-      }
-      else{
-	### if the second best alignment has the same sum of alignment scores as the first one, the sequence pair will get booted
-	if ($alignments{$alignment_location}->{sum_of_alignment_scores} == $best_sum_of_alignment_scores){
-	  # warn "Same sum of alignment scores for 2 different alignments, the sequence pair will get booted!\n";
-	  $sequence_pair_fails = 1;
-	  last; # exiting since we know that the sequence has ambiguous alignments
-	}
-	### else we are going to store the best alignment for further processing
-	else{
-	  $methylation_call_params->{$identifier}->{bowtie_sequence_1} = $alignments{$best_alignment_location}->{bowtie_sequence_1};
-	  $methylation_call_params->{$identifier}->{bowtie_sequence_2} = $alignments{$best_alignment_location}->{bowtie_sequence_2};
-	  $methylation_call_params->{$identifier}->{chromosome}        = $alignments{$best_alignment_location}->{chromosome};
-	  $methylation_call_params->{$identifier}->{position_1}        = $alignments{$best_alignment_location}->{position_1};
-	  $methylation_call_params->{$identifier}->{position_2}        = $alignments{$best_alignment_location}->{position_2};
-	  $methylation_call_params->{$identifier}->{index}             = $alignments{$best_alignment_location}->{index};
-	  $methylation_call_params->{$identifier}->{alignment_score_1} = $alignments{$best_alignment_location}->{alignment_score_1};
-	  $methylation_call_params->{$identifier}->{alignment_score_2} = $alignments{$best_alignment_location}->{alignment_score_2};
-	  $methylation_call_params->{$identifier}->{sum_of_alignment_scores} = $alignments{$best_alignment_location}->{sum_of_alignment_scores};
-	  $methylation_call_params->{$identifier}->{mismatch_info_1}   = $alignments{$best_alignment_location}->{mismatch_info_1};
-	  $methylation_call_params->{$identifier}->{mismatch_info_2}   = $alignments{$best_alignment_location}->{mismatch_info_2};
-	  $methylation_call_params->{$identifier}->{CIGAR_1}           = $alignments{$best_alignment_location}->{CIGAR_1};
-	  $methylation_call_params->{$identifier}->{CIGAR_2}           = $alignments{$best_alignment_location}->{CIGAR_2};
-	  $methylation_call_params->{$identifier}->{flag_1}            = $alignments{$best_alignment_location}->{flag_1};
-	  $methylation_call_params->{$identifier}->{flag_2}            = $alignments{$best_alignment_location}->{flag_2};
-	  last; # exiting since the sequence produced a unique best alignment
-	}
-      }
-    }
-  }
-  else{
-    die "There are too many potential hits for this sequence pair (1-4 expected, but found: '",scalar keys %alignments,"')\n";;
-  }
-
-  ### skipping the sequence completely if there were multiple alignments with the same best sum of alignment scores at different positions
-  if ($sequence_pair_fails == 1){
-    $counting{unsuitable_sequence_count}++;
-
-    ### report that the sequence has multiple hits with bitwise flag 256. We can print the sequence to the result file straight away and skip everything else
-    # my $ambiguous_read_1 = join("\t",$identifier.'/1','256','*','0','0','*','*','0','0',$sequence_1,$quality_value_1);
-    # my $ambiguous_read_2 = join("\t",$identifier.'/2','256','*','0','0','*','*','0','0',$sequence_2,$quality_value_2);
-    # print "$ambiguous_read_1\n";
-    # print "$ambiguous_read_2\n";
-
-    if ($ambiguous){
-      return 2; # => exits to next sequence pair, and prints it out (in FastQ format) to _ambiguous_reads_1.txt and _ambiguous_reads_2.txt if '--ambiguous' was specified
-      }
-    elsif ($unmapped){
-      return 1; # => exits to next sequence pair, and prints it out (in FastQ format) to _unmapped_reads_1.txt and _unmapped_reads_2.txt if '--unmapped' but not '--ambiguous' was specified
-    }
-    else{
-      return 0; # => exits to next sequence pair (default)
-    }
-  }
-
-  ### --DIRECTIONAL
-  ### If the option --directional has been specified the user wants to consider only alignments to the original top strand or the original bottom strand. We will therefore
-  ### discard all alignments to strands complementary to the original strands, as they should not exist in reality due to the library preparation protocol
-  if ($directional){
-    if ( ($methylation_call_params->{$identifier}->{index} == 1) or ($methylation_call_params->{$identifier}->{index} == 2) ){
-      #    warn "Alignment rejected! (index was: $methylation_call_params->{$identifier}->{index})\n";
-      $counting{alignments_rejected_count}++;
-      return 0;
-    }
-  }
-
-  ### If the sequence pair has not been rejected so far it does have a unique best alignment
-  $counting{unique_best_alignment_count}++;
-  extract_corresponding_genomic_sequence_paired_ends_bowtie2($identifier,$methylation_call_params);
-
-  ### check to see if the genomic sequences we extracted has the same length as the observed sequences +2, and only then we perform the methylation call
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1}) != length($sequence_1)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position_1}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-  if (length($methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2}) != length($sequence_2)+2){
-    warn "Chromosomal sequence could not be extracted for\t$identifier\t$methylation_call_params->{$identifier}->{chromosome}\t$methylation_call_params->{$identifier}->{position_2}\n";
-    $counting{genomic_sequence_could_not_be_extracted_count}++;
-    return 0;
-  }
-
-  ### now we are set to perform the actual methylation call
-  $methylation_call_params->{$identifier}->{methylation_call_1} = methylation_call($identifier,$sequence_1,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1},$methylation_call_params->{$identifier}->{read_conversion_1});
-  $methylation_call_params->{$identifier}->{methylation_call_2} = methylation_call($identifier,$sequence_2,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2},$methylation_call_params->{$identifier}->{read_conversion_2});
-  # print "$methylation_call_params->{$identifier}->{read_conversion_2}\n";
-  # print "  $sequence_2\n";
-  # print "$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2}\n";
-  # print "  $methylation_call_params->{$identifier}->{methylation_call_2}\n";
-
-  print_bisulfite_mapping_results_paired_ends_bowtie2($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2);
-  return 0; ## otherwise 1 will be returned by default, which would print the sequence pair to unmapped_1 and _2
-}
-
-###
-
-sub decide_whether_paired_end_alignment_is_valid{
-  my ($index,$identifier) = @_;
-  my ($id_1,$strand_1,$mapped_chromosome_1,$position_1,$bowtie_sequence_1,$mismatch_info_1) = (split (/\t/,$fhs[$index]->{last_line_1},-1))[0,1,2,3,4,7];
-  my ($id_2,$strand_2,$mapped_chromosome_2,$position_2,$bowtie_sequence_2,$mismatch_info_2) = (split (/\t/,$fhs[$index]->{last_line_2},-1))[0,1,2,3,4,7];
-  chomp $mismatch_info_1;
-  chomp $mismatch_info_2;
-  my $seq_id_1 = $id_1;
-  my $seq_id_2 = $id_2;
-  $seq_id_1 =~ s/\/1$//; # removing the read /1
-  $seq_id_2 =~ s/\/1$//; # removing the read /1
-
-  ### ensuring that the current entry is the correct sequence
-  if ($seq_id_1 eq $identifier or $seq_id_2 eq $identifier){
-    ### checking the orientation of the alignment. We need to discriminate between 8 different conditions, however only 4 of them are theoretically
-    ### sensible alignments
-    my $orientation = ensure_sensical_alignment_orientation_paired_ends ($index,$id_1,$strand_1,$id_2,$strand_2);
-    ### If the orientation was correct can we move on
-    if ($orientation == 1){
-      return 1; ### 1st possibility for A SEQUENCE-PAIR TO PASS
-    }
-    ### If the alignment was in the wrong orientation we need to read in two new lines
-    elsif($orientation == 0){
-      my $newline_1 = $fhs[$index]->{fh}->getline();
-      my $newline_2 = $fhs[$index]->{fh}->getline();
-      if ($newline_1 and $newline_2){
-	### extract detailed information about the alignment again (from $newline_1 and $newline_2 this time)
-	($id_1,$strand_1) = (split (/\t/,$newline_1))[0,1];
-	($id_2,$strand_2) = (split (/\t/,$newline_2))[0,1];
-
-	my $seqid;
-	$seq_id_1 = $id_1;
-	$seq_id_2 = $id_2;
-	# we need to capture the first read (ending on /1)
-	if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-	  $seqid = $seq_id_1;
-	}
-	elsif ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-	  $seqid = $seq_id_2;
-	}
-	else{
-	  die "One of the two reads needs to end on /1!!";
-	}
-	
-	### ensuring that the next entry is still the correct sequence
-	if ($seq_id_1 eq $identifier or  $seq_id_2 eq $identifier){
-	  ### checking orientation again
-	  $orientation = ensure_sensical_alignment_orientation_paired_ends ($index,$id_1,$strand_1,$id_2,$strand_2);
-	  ### If the orientation was correct can we move on
-	  if ($orientation == 1){
-	    ### Writing the current sequence to last_line_1 and last_line_2
-	    $fhs[$index]->{last_seq_id} = $seqid;
-	    $fhs[$index]->{last_line_1} = $newline_1;
-	    $fhs[$index]->{last_line_2} = $newline_2;
-	    return 1; ### 2nd possibility for a SEQUENCE-PAIR TO PASS
-	  }
-	  ### If the alignment was in the wrong orientation again we need to read in yet another 2 new lines and store them in @fhs (this must be
-	  ### the next entry)
-	  elsif ($orientation == 0){
-	    $newline_1 = $fhs[$index]->{fh}->getline();
-	    $newline_2 = $fhs[$index]->{fh}->getline();
-	    if ($newline_1 and $newline_2){
-	      ($seq_id_1) = split (/\t/,$newline_1);
-	      ($seq_id_2) = split (/\t/,$newline_2);
-	
-	      $seqid = '';
-	      if ($seq_id_1 =~ s/\/1$//){ # removing the read /1 tag
-		$seqid = $seq_id_1;
-	      }
-	      elsif ($seq_id_2 =~ s/\/1$//){ # removing the read /1 tag
-		$seqid = $seq_id_2;
-	      }
-	      else{
-		die "One of the two reads needs to end on /1!!";
-	      }
-	
-	      ### check if the next 2 lines still have the same seq ID (must not happen), and if not overwrite the current seq-ID and bowtie output with
-	      ### the same fields of the just read next entry
-	      die "Same seq ID 3 or more times in a row!(should be 2 max)" if ($seqid eq $identifier);
-	      $fhs[$index]->{last_seq_id} = $seqid;
-	      $fhs[$index]->{last_line_1} = $newline_1;
-	      $fhs[$index]->{last_line_2} = $newline_2;
-	      return 0; # not processing anything this round as the alignment currently stored in last_line_1 and _2 was in the wrong orientation
-	    }
-	    else {
-	      ### assigning undef to last_seq_id and last_line (end of bowtie output)
-	      $fhs[$index]->{last_seq_id} = undef;
-	      $fhs[$index]->{last_line_1} = undef;
-	      $fhs[$index]->{last_line_2} = undef;
-	      return 0; # not processing anything as the alignment currently stored in last_line_1 and _2 was in the wrong orientation
-	    }
-	  }
-	  else{
-	    die "The orientation of the alignment must be either correct or incorrect\n";
-	  }
-	}
-	### the sequence pair we just read in is already the next sequence pair to be analysed -> store it in @fhs
-	else{
-	  $fhs[$index]->{last_seq_id} = $seqid;
-	  $fhs[$index]->{last_line_1} = $newline_1;
-	  $fhs[$index]->{last_line_2} = $newline_2;
-	  return 0; # processing the new alignment result only in the next round
-	}
-      }
-      else {
-	# assigning undef to last_seq_id and both last_lines (end of bowtie output)
-	$fhs[$index]->{last_seq_id} = undef;
-	$fhs[$index]->{last_line_1} = undef;
-	$fhs[$index]->{last_line_2} = undef;
-	return 0; # not processing anything as the alignment currently stored in last_line_1 and _2 was in the wrong orientation
-      }
-    }
-    else{
-      die "The orientation of the alignment must be either correct or incorrect\n";
-    }
-  }
-  ### the sequence pair stored in @fhs as last_line_1 and last_line_2 is already the next sequence pair to be analysed -> analyse next round
-  else{
-    return 0;
-  }
-}
-
-### EXTRACT GENOMIC SEQUENCE | BOWTIE 1 | PAIRED-END
-
-sub extract_corresponding_genomic_sequence_paired_ends {
-  my ($sequence_identifier,$methylation_call_params) = @_;
-  ### A bisulfite sequence pair for 1 location in the genome can theoretically be on any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-  my $alignment_read_1;
-  my $alignment_read_2;
-  my $read_conversion_info_1;
-  my $read_conversion_info_2;
-  my $genome_conversion;
-
-  ### Now extracting the same sequence from the mouse genomic sequence, +2 extra bases at oone of the ends so that we can also make a CpG, CHG or CHH methylation call
-  ### if the C happens to be at the first or last position of the actually observed sequence
-  my $non_bisulfite_sequence_1;
-  my $non_bisulfite_sequence_2;
-
-  ### all alignments reported by bowtie have the + alignment first and the - alignment as the second one irrespective of whether read 1 or read 2 was
-  ### the + alignment. We however always read in sequences read 1 then read 2, so if read 2 is the + alignment we need to swap the extracted genomic
-  ### sequences around!
-  ### results from CT converted read 1 plus GA converted read 2 vs. CT converted genome (+/- orientation alignments are reported only)
-  if ($methylation_call_params->{$sequence_identifier}->{index} == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_GA_CT_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'CT';
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is read 1)
-    ### for hits on the forward strand we need to capture 2 extra bases at the 3' end
-
-    $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{start_seq_1},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ##CHH change
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is read 2)
-    ### As the second conversion is GA we need to capture 1 base 3', so that it is a 5' base after reverse complementation
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{start_seq_2}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+1){ ## CHH change to +1
-
-      $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2}),length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2);
-      ### the reverse strand sequence needs to be reverse complemented
-      $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-    }
-    else{
-       $non_bisulfite_sequence_2 = '';
-     }
-   }
-
-   ### results from GA converted read 1 plus CT converted read 2 vs. GA converted genome (+/- orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 1){
-    ### [Index 1, sequence originated from complementary to (converted) reverse strand]
-    $counting{GA_CT_GA_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'GA';
-
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is read 1)
-    ### as we need to make the methylation call for the base 5' of the first base (GA conversion!) we need to capture 2 extra bases at the 5' end
-    if ($methylation_call_params->{$sequence_identifier}->{start_seq_1}-1 > 0){ ## CHH change to -1
-      $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{start_seq_1}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ### CHH change to -2/+2
-    }
-    else{
-      $non_bisulfite_sequence_1 = '';
-    }
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is read 2)
-    ### As we are doing a CT comparison for the reverse strand we are taking 2 bases extra at the 5' end, so it is a 3' base after reverse complementation
-    $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2})-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2); ### CHH change to -2/+2
-    ### the reverse strand sequence needs to be reverse complemented
-    $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-  }
-
-  ### results from GA converted read 1 plus CT converted read 2 vs. CT converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 2){
-    ### [Index 2, sequence originated from the complementary to (converted) forward strand]
-    $counting{GA_CT_CT_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'CT';
-
-    ### Here we switch the sequence information round!!  non_bisulfite_sequence_1 will later correspond to the read 1!!!!
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is READ 2), read 1 is in - orientation on the reverse strand
-    ### As read 1 is GA converted we need to capture 2 extra 3' bases which will be 2 extra 5' base after reverse complementation
-    $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2}),length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2); ### CHH change to +2
-    ### the reverse strand sequence needs to be reverse complemented
-    $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is READ 1)
-    ### non_bisulfite_sequence_2 will later correspond to the read 2!!!!
-    ### Read 2 is CT converted so we need to capture 2 extra 3' bases
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > ($methylation_call_params->{$sequence_identifier}->{start_seq_1})+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+1){ ## CHH change to +1
-      $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_1}),length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ## CHH changed from +1 to +2
-    }
-    else{
-      $non_bisulfite_sequence_2 = '';
-    }
-  }
-
-  ### results from CT converted read 1 plus GA converted read 2 vs. GA converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 3){
-    ### [Index 3, sequence originated from the (converted) reverse strand]
-    $counting{CT_GA_GA_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'GA';
-
-    ### Here we switch the sequence information round!!  non_bisulfite_sequence_1 will later correspond to the read 1!!!!
-    ### SEQUENCE 1 (this is always the forward hit, in this case it is READ 2), read 1 is in - orientation on the reverse strand
-    ### As read 1 is CT converted we need to capture 2 extra 5' bases which will be 2 extra 3' base after reverse complementation
-    if ( ($methylation_call_params->{$sequence_identifier}->{start_seq_2}-1) > 0){ ## CHH changed to -1
-      $non_bisulfite_sequence_1 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_2})-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_2})+2); ### CHH changed to -2/+2
-      ### the reverse strand sequence needs to be reverse complemented
-      $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-    }
-    else{
-      $non_bisulfite_sequence_1 = '';
-    }
-
-    ### SEQUENCE 2 (this will always be on the reverse strand, in this case it is READ 1)
-    ### non_bisulfite_sequence_2 will later correspond to the read 2!!!!
-    ### Read 2 is GA converted so we need to capture 2 extra 5' bases
-    $non_bisulfite_sequence_2 = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},($methylation_call_params->{$sequence_identifier}->{start_seq_1})-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence_1})+2); ### CHH changed to -2/+2
-  }
-  else{
-    die "Too many bowtie result filehandles\n";
-  }
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_1} = $alignment_read_1;
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_2} = $alignment_read_2;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_1} = $read_conversion_info_1;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_2} = $read_conversion_info_2;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-}
-
-### EXTRACT GENOMIC SEQUENCE BOWTIE 2 | PAIRED-END
-
-sub extract_corresponding_genomic_sequence_paired_ends_bowtie2{
-  my ($sequence_identifier,$methylation_call_params) = @_;
-  ### A bisulfite sequence pair for 1 location in the genome can theoretically be on any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-
-  my $cigar_1 = $methylation_call_params->{$sequence_identifier}->{CIGAR_1};
-  my $cigar_2 = $methylation_call_params->{$sequence_identifier}->{CIGAR_2};
-  my $flag_1 =  $methylation_call_params->{$sequence_identifier}->{flag_1};
-  my $flag_2 =  $methylation_call_params->{$sequence_identifier}->{flag_2};
-  # print "$cigar_1\t$cigar_2\t$flag_1\t$flag_2\n";
-  # sleep(10);
-  ### We are now extracting the corresponding genomic sequence, +2 extra bases at the end (or start) so that we can also make a CpG methylation call and
-  ### in addition make differential calls for Cs in CHG or CHH context if the C happens to be at the last (or first)  position of the actually observed sequence
-
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-  my $alignment_read_1;
-  my $alignment_read_2;
-  my $read_conversion_info_1;
-  my $read_conversion_info_2;
-  my $genome_conversion;
-
-  ### Now extracting the same sequence from the mouse genomic sequence, +2 extra bases at one of the ends so that we can also make a CpG, CHG or CHH methylation call
-  ### if the C happens to be at the last position of the actually observed sequence
-  my $non_bisulfite_sequence_1 = '';
-  my $non_bisulfite_sequence_2 = '';
-
-  ### Positions in SAM format are 1 based, so we need to subract 1 when getting substrings
-  my $pos_1 = $methylation_call_params->{$sequence_identifier}->{position_1}-1;
-  my $pos_2 = $methylation_call_params->{$sequence_identifier}->{position_2}-1;
-
-  # parsing CIGAR 1 string
-  my @len_1 = split (/\D+/,$cigar_1); # storing the length per operation
-  my @ops_1 = split (/\d+/,$cigar_1); # storing the operation
-  shift @ops_1; # remove the empty first element
-  die "CIGAR 1 string contained a non-matching number of lengths and operations\n" unless (scalar @len_1 == scalar @ops_1);
-  # parsing CIGAR 2 string
-  my @len_2 = split (/\D+/,$cigar_2); # storing the length per operation
-  my @ops_2 = split (/\d+/,$cigar_2); # storing the operation
-  shift @ops_2; # remove the empty first element
-  die "CIGAR 2 string contained a non-matching number of lengths and operations\n" unless (scalar @len_2 == scalar @ops_2);
-
-  my $indels_1 = 0; # addiong these to the hemming distance value (needed for the NM field in the final SAM output
-  my $indels_2 = 0;
-
-  ### Extracting read 1 genomic sequence ###
-
-  # extracting 2 additional bp at the 5' end (read 1)
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 1) or ($methylation_call_params->{$sequence_identifier}->{index} == 3) ){
-    # checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless ( ($pos_1-2) > 0){# exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      return;
-    }
-    $non_bisulfite_sequence_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1-2,2);
-  }
-
-  foreach (0..$#len_1){
-    if ($ops_1[$_] eq 'M'){
-      # extracting genomic sequence
-      $non_bisulfite_sequence_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1,$len_1[$_]);
-      #   warn "$non_bisulfite_sequence_1\n";
-      # adjusting position
-      $pos_1 += $len_1[$_];
-    }
-    elsif ($ops_1[$_] eq 'I'){ # insertion in the read sequence
-      # we simply add padding Ns instead of finding genomic sequence. This will not be used to infer methylation calls
-      $non_bisulfite_sequence_1 .= 'N' x $len_1[$_];
-      #    warn "$non_bisulfite_sequence_1\n";
-      # position doesn't need adjusting
-	  $indels_1 += $len_1[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif ($ops_1[$_] eq 'D'){ # deletion in the read sequence
-      # we do not add any genomic sequence but only adjust the position
-      #     warn "Just adjusting the position by: ",$len_1[$_],"bp\n";
-      $pos_1 += $len_1[$_];
-	  $indels_1 += $len_1[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif($cigar_1 =~ tr/[NSHPX=]//){ # if these (for standard mapping) illegal characters exist we die
-      die "The CIGAR 1 string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-    }
-    else{
-      die "The CIGAR 1 string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-    }
-  }
-
-  ### 3' end of read 1
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 0) or ($methylation_call_params->{$sequence_identifier}->{index} == 2) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) >= $pos_1+2){# exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      return;
-    }
-
-    $non_bisulfite_sequence_1 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_1,2);
-  }
-
-
-  ### Extracting read 2 genomic sequence ###
-
-  ### 5' end of read 2
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 1) or ($methylation_call_params->{$sequence_identifier}->{index} == 3) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless ( ($pos_2-2) >= 0){# exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-      return;
-    }
-    $non_bisulfite_sequence_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2-2,2);
-  }
-
-  foreach (0..$#len_2){
-    if ($ops_2[$_] eq 'M'){
-      # extracting genomic sequence
-      $non_bisulfite_sequence_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2,$len_2[$_]);
-      # warn "$non_bisulfite_sequence_2\n";
-      # adjusting position
-      $pos_2 += $len_2[$_];
-    }
-    elsif ($ops_2[$_] eq 'I'){ # insertion in the read sequence
-      # we simply add padding Ns instead of finding genomic sequence. This will not be used to infer methylation calls
-      $non_bisulfite_sequence_2 .= 'N' x $len_2[$_];
-      # warn "$non_bisulfite_sequence_2\n";
-      # position doesn't need adjusting
-	  $indels_2 += $len_2[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif ($ops_2[$_] eq 'D'){ # deletion in the read sequence
-      # we do not add any genomic sequence but only adjust the position
-      # warn "Just adjusting the position by: ",$len_2[$_],"bp\n";
-      $pos_2 += $len_2[$_];
-	  $indels_2 += $len_2[$_]; # adding to $indels_1 to determine the hemming distance (= single base mismatches, insertions or deletions) for the SAM output
-    }
-    elsif($cigar_2 =~ tr/[NSHPX=]//){ # if these (for standard mapping) illegal characters exist we die
-      die "The CIGAR 2 string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-    }
-    else{
-      die "The CIGAR 2 string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-    }
-  }
-
-  ### 3' end of read 2
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 0) or ($methylation_call_params->{$sequence_identifier}->{index} == 2) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) >= $pos_2+2){# exiting with en empty genomic sequence otherwise
-      # need to set read 1 as well now to prevent warning
-      #  warn "'$non_bisulfite_sequence_1'\n'$non_bisulfite_sequence_2'\n\n";
-      #  sleep(5);
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-      return;
-    }
-    $non_bisulfite_sequence_2 .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos_2,2);
-  }
-
-  ### all paired-end alignments reported by Bowtie 2 have the Read 1 alignment first and the Read 2 alignment as the second one irrespective of whether read 1 or read 2 was
-  ### the + alignment. We also read in sequences read 1 then read 2 so they should correspond perfectly
-
-  ### results from CT converted read 1 plus GA converted read 2 vs. CT converted genome (+/- orientation alignments are reported only)
-  if ($methylation_call_params->{$sequence_identifier}->{index} == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_GA_CT_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'CT';
-    ### Read 1 is always the forward hit
-    ### Read 2 is will always on the reverse strand, so it needs to be reverse complemented
-    $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-  }
-
-  ### results from GA converted read 1 plus CT converted read 2 vs. GA converted genome (+/- orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 1){
-    ### [Index 1, sequence originated from complementary to (converted) bottom strand]
-    $counting{GA_CT_GA_count}++;
-    $alignment_read_1 = '+';
-    $alignment_read_2 = '-';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'GA';
-    ### Read 1 is always the forward hit
-    ### Read 2 is will always on the reverse strand, so it needs to be reverse complemented
-    $non_bisulfite_sequence_2 = reverse_complement($non_bisulfite_sequence_2);
-  }
-
-  ### results from GA converted read 1 plus CT converted read 2 vs. CT converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 2){
-    ### [Index 2, sequence originated from the complementary to (converted) top strand]
-    $counting{GA_CT_CT_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'GA';
-    $read_conversion_info_2 = 'CT';
-    $genome_conversion = 'CT';
-
-    ### Read 1 (the reverse strand) genomic sequence needs to be reverse complemented
-    $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-  }
-
-  ### results from CT converted read 1 plus GA converted read 2 vs. GA converted genome (-/+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 3){
-    ### [Index 3, sequence originated from the (converted) reverse strand]
-    $counting{CT_GA_GA_count}++;
-    $alignment_read_1 = '-';
-    $alignment_read_2 = '+';
-    $read_conversion_info_1 = 'CT';
-    $read_conversion_info_2 = 'GA';
-    $genome_conversion = 'GA';
-    ### Read 1 (the reverse strand) genomic sequence needs to be reverse complemented
-    $non_bisulfite_sequence_1 = reverse_complement($non_bisulfite_sequence_1);
-  }
-  else{
-    die "Too many bowtie result filehandles\n";
-  }
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_1} = $alignment_read_1;
-  $methylation_call_params->{$sequence_identifier}->{alignment_read_2} = $alignment_read_2;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_1} = $read_conversion_info_1;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion_2} = $read_conversion_info_2;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_1} = $non_bisulfite_sequence_1;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence_2} = $non_bisulfite_sequence_2;
-  ## the end position of a read is stored in $pos
-  $methylation_call_params->{$sequence_identifier}->{end_position_1} = $pos_1;
-  $methylation_call_params->{$sequence_identifier}->{end_position_2} = $pos_2;
-  $methylation_call_params->{$sequence_identifier}->{indels_1} = $indels_1;
-  $methylation_call_params->{$sequence_identifier}->{indels_2} = $indels_2;
-}
-
-##########################################
-### PRINT SINGLE END RESULTS: Bowtie 1 ###
-##########################################
-
-sub print_bisulfite_mapping_result_single_end{
-  my ($identifier,$sequence,$methylation_call_params,$quality_value)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value = convert_phred64_quals_to_phred33($quality_value);
-  }
-  elsif ($solexa){
-    $quality_value = convert_solexa_quals_to_phred33($quality_value);
-  }
-
-  ### We will add +1 bp to the starting position of single-end reads, as Bowtie 1 reports the index and not the bp position. 
-  $methylation_call_params->{$identifier}->{position} += 1;
-	
-  ### writing every uniquely mapped read and its methylation call to the output file
-  if ($vanilla){
-    my $bowtie1_output = join("\t",$identifier,$methylation_call_params->{$identifier}->{alignment_strand},$methylation_call_params->{$identifier}->{chromosome},$methylation_call_params->{$identifier}->{position},$methylation_call_params->{$identifier}->{end_position},$sequence,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence},$methylation_call_params->{$identifier}->{methylation_call},$methylation_call_params->{$identifier}->{read_conversion},$methylation_call_params->{$identifier}->{genome_conversion},$quality_value);
-    print OUT "$bowtie1_output\n";
-  }
-  else{ # SAM output, default since Bismark v1.0.0
-    single_end_SAM_output($identifier,$sequence,$methylation_call_params,$quality_value); # at the end of the script
-  }
-}
-
-##########################################
-### PRINT SINGLE END RESULTS: Bowtie 2 ###
-##########################################
-
-sub print_bisulfite_mapping_result_single_end_bowtie2{
-  my ($identifier,$sequence,$methylation_call_params,$quality_value)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value = convert_phred64_quals_to_phred33($quality_value);
-  }
-  elsif ($solexa){
-    $quality_value = convert_solexa_quals_to_phred33($quality_value);
-  }
-
-  ### writing every mapped read and its methylation call to the SAM output file (unmapped and ambiguous reads were already printed)
-	single_end_SAM_output($identifier,$sequence,$methylation_call_params,$quality_value); # at the end of the script
-}
-
-##########################################
-### PRINT PAIRED END ESULTS: Bowtie 1  ###
-##########################################
-
-sub print_bisulfite_mapping_results_paired_ends{
-  my ($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value_1 = convert_phred64_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_phred64_quals_to_phred33($quality_value_2);
-  }
-  elsif ($solexa){
-    $quality_value_1 = convert_solexa_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_solexa_quals_to_phred33($quality_value_2);
-  }
-
-  ### We will add +1 bp to the start position of paired-end reads, as Bowtie 1 reports the index and not the bp position. (End position is already 1-based)
-  $methylation_call_params->{$identifier}->{start_seq_1} += 1;
-
-  ### writing every single aligned read and its methylation call to the output file
-  if ($vanilla){	
-    my $bowtie1_output_paired_end = join("\t",$identifier,$methylation_call_params->{$identifier}->{alignment_read_1},$methylation_call_params->{$identifier}->{chromosome},$methylation_call_params->{$identifier}->{start_seq_1},$methylation_call_params->{$identifier}->{alignment_end},$sequence_1,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_1},$methylation_call_params->{$identifier}->{methylation_call_1},$sequence_2,$methylation_call_params->{$identifier}->{unmodified_genomic_sequence_2},$methylation_call_params->{$identifier}->{methylation_call_2},$methylation_call_params->{$identifier}->{read_conversion_1},$methylation_call_params->{$identifier}->{genome_conversion},$quality_value_1,$quality_value_2);
-    print OUT "$bowtie1_output_paired_end\n";
-  }
-  else{ # SAM output, default since Bismark v1.0.0
-    paired_end_SAM_output($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2); # at the end of the script
-  }
-
-}
-
-##########################################
-### PRINT PAIRED END ESULTS: Bowtie 2  ###
-##########################################
-
-sub print_bisulfite_mapping_results_paired_ends_bowtie2{
-  my ($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2)= @_;
-
-  ### we will output the FastQ quality in Sanger encoding (Phred 33 scale)
-  if ($phred64){
-    $quality_value_1 = convert_phred64_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_phred64_quals_to_phred33($quality_value_2);
-  }
-  elsif ($solexa){
-    $quality_value_1 = convert_solexa_quals_to_phred33($quality_value_1);
-    $quality_value_2 = convert_solexa_quals_to_phred33($quality_value_2);
-  }
-
-  ### writing every single aligned read and its methylation call to the output file  (unmapped and ambiguous reads were already printed)
-  paired_end_SAM_output($identifier,$sequence_1,$sequence_2,$methylation_call_params,$quality_value_1,$quality_value_2); # at the end of the script
-
-}
-	
-	
-sub convert_phred64_quals_to_phred33{
-
-  my $qual = shift;
-  my @quals = split (//,$qual);
-  my @new_quals;
-
-  foreach my $index (0..$#quals){
-    my $phred_score = convert_phred64_quality_string_into_phred_score ($quals[$index]);
-    my $phred33_quality_string = convert_phred_score_into_phred33_quality_string ($phred_score);
-    $new_quals[$index] = $phred33_quality_string;
-  }
-
-  my $phred33_quality = join ("",@new_quals);
-  return $phred33_quality;
-}
-
-sub convert_solexa_quals_to_phred33{
-
-  my $qual = shift;
-  my @quals = split (//,$qual);
-  my @new_quals;
-
-  foreach my $index (0..$#quals){
-    my $phred_score = convert_solexa_pre1_3_quality_string_into_phred_score ($quals[$index]);
-    my $phred33_quality_string = convert_phred_score_into_phred33_quality_string ($phred_score);
-    $new_quals[$index] = $phred33_quality_string;
-  }
-
-  my $phred33_quality = join ("",@new_quals);
-  return $phred33_quality;
-}
-
-sub convert_phred_score_into_phred33_quality_string{
-  my $qual = shift;
-  $qual = chr($qual+33);
-  return $qual;
-}
-
-sub convert_phred64_quality_string_into_phred_score{
-  my $string = shift;
-  my $qual = ord($string)-64;
-  return $qual;
-}
-
-sub convert_solexa_pre1_3_quality_string_into_phred_score{
-  ### We will just use 59 as the offset here as all Phred Scores between 10 and 40 look exactly the same, there is only a minute difference for values between 0 and 10
-  my $string = shift;
-  my $qual = ord($string)-59;
-  return $qual;
-}
-
-
-sub extract_corresponding_genomic_sequence_single_end {
-  my ($sequence_identifier,$methylation_call_params) = @_;
-  ### A bisulfite sequence for 1 location in the genome can theoretically be any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-  my $alignment_strand;
-  my $read_conversion_info;
-  my $genome_conversion;
-  ### Also extracting the corresponding genomic sequence, +2 extra bases at the end so that we can also make a CpG methylation call and
-  ### in addition make differential calls for Cs non-CpG context, which will now be divided into CHG and CHH methylation,
-  ### if the C happens to be at the last position of the actually observed sequence
-  my $non_bisulfite_sequence;
-  ### depending on the conversion we want to make need to capture 1 extra base at the 3' end
-
-  ### results from CT converted read vs. CT converted genome (+ orientation alignments are reported only)
-  if ($methylation_call_params->{$sequence_identifier}->{index} == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_CT_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'CT';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+1){ ## CHH changed to +1
-      ### + 2 extra base at the 3' end
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to +2
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from CT converted reads vs. GA converted genome (- orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 1){
-    ### [Index 1, sequence originated from (converted) reverse strand]
-    $counting{CT_GA_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'GA';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if ($methylation_call_params->{$sequence_identifier}->{position}-2 >= 0){ ## CHH changed to -2 # 02 02 2012 Changed this to >= from >
-      ### Extracting 2 extra 5' bases on forward strand which will become 2 extra 3' bases after reverse complementation
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to -2/+2
-      ## reverse complement!
-      $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from GA converted reads vs. CT converted genome (- orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 2){
-    ### [Index 2, sequence originated from complementary to (converted) forward strand]
-    $counting{GA_CT_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'CT';
-
-    ### +2 extra bases on the forward strand 3', which will become 2 extra 5' bases after reverse complementation
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+1){ ## changed to +1 on 02 02 2012
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to +2
-      ## reverse complement!
-      $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from GA converted reads vs. GA converted genome (+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 3){
-    ### [Index 3, sequence originated from complementary to (converted) reverse strand]
-    $counting{GA_GA_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'GA';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if ($methylation_call_params->{$sequence_identifier}->{position}-2 >= 0){ ## CHH changed to +2 # 02 02 2012 Changed this to >= from >
-      ### +2 extra base at the 5' end as we are nominally checking the converted reverse strand
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to -2/+2
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-  else{
-    die "Too many bowtie result filehandles\n";
-  }
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_strand} = $alignment_strand;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion} = $read_conversion_info;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-
-  ### at this point we can also determine the end position of a read
-  $methylation_call_params->{$sequence_identifier}->{end_position} = $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence});
-}
-
-sub extract_corresponding_genomic_sequence_single_end_pbat {
-  my ($sequence_identifier,$methylation_call_params) = @_;
-  ### A bisulfite sequence for 1 location in the genome can theoretically be any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-  my $alignment_strand;
-  my $read_conversion_info;
-  my $genome_conversion;
-  ### Also extracting the corresponding genomic sequence, +2 extra bases at the end so that we can also make a CpG methylation call and
-  ### in addition make differential calls for Cs non-CpG context, which will now be divided into CHG and CHH methylation,
-  ### if the C happens to be at the last position of the actually observed sequence
-  my $non_bisulfite_sequence;
-  ### depending on the conversion we want to make need to capture 1 extra base at the 3' end
-
-  my $pbat_index = $methylation_call_params->{$sequence_identifier}->{index} + 2; # (we are simply not running indexes 0 or 1!
-
-  ### results from CT converted read vs. CT converted genome (+ orientation alignments are reported only)
-  if ($pbat_index == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_CT_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'CT';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+1){ ## CHH changed to +1
-      ### + 2 extra base at the 3' end
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to +2
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from CT converted reads vs. GA converted genome (- orientation alignments are reported only)
-  elsif ($pbat_index == 1){
-    ### [Index 1, sequence originated from (converted) reverse strand]
-    $counting{CT_GA_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'GA';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if ($methylation_call_params->{$sequence_identifier}->{position}-2 >= 0){ ## CHH changed to -2 # 02 02 2012 Changed this to >= from >
-      ### Extracting 2 extra 5' bases on forward strand which will become 2 extra 3' bases after reverse complementation
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to -2/+2
-      ## reverse complement!
-      $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from GA converted reads vs. CT converted genome (- orientation alignments are reported only)
-  elsif ($pbat_index == 2){
-    ### [Index 2, sequence originated from complementary to (converted) forward strand]
-    $counting{GA_CT_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'CT';
-
-    ### +2 extra bases on the forward strand 3', which will become 2 extra 5' bases after reverse complementation
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) > $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+1){ ## changed to +1 on 02 02 2012
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position},length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to +2
-      ## reverse complement!
-      $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-
-  ### results from GA converted reads vs. GA converted genome (+ orientation alignments are reported only)
-  elsif ($pbat_index == 3){
-    ### [Index 3, sequence originated from complementary to (converted) reverse strand]
-    $counting{GA_GA_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'GA';
-
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    if ($methylation_call_params->{$sequence_identifier}->{position}-2 >= 0){ ## CHH changed to +2 # 02 02 2012 Changed this to >= from >
-      ### +2 extra base at the 5' end as we are nominally checking the converted reverse strand
-      $non_bisulfite_sequence = substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$methylation_call_params->{$sequence_identifier}->{position}-2,length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence})+2); ## CHH changed to -2/+2
-    }
-    else{
-      $non_bisulfite_sequence = '';
-    }
-  }
-  else{
-    die "Too many bowtie result filehandles\n";
-  }
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_strand} = $alignment_strand;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion} = $read_conversion_info;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-
-  ### at this point we can also determine the end position of a read
-  $methylation_call_params->{$sequence_identifier}->{end_position} = $methylation_call_params->{$sequence_identifier}->{position}+length($methylation_call_params->{$sequence_identifier}->{bowtie_sequence});
-}
-
-
-sub extract_corresponding_genomic_sequence_single_end_bowtie2{
-  my ($sequence_identifier,$methylation_call_params) = @_;
-
-  my $MD_tag = $methylation_call_params->{$sequence_identifier}->{mismatch_info};
-  my $cigar = $methylation_call_params->{$sequence_identifier}->{CIGAR};
-
-  ### A bisulfite sequence for 1 location in the genome can theoretically be any of the 4 possible converted strands. We are also giving the
-  ### sequence a 'memory' of the conversion we are expecting which we will need later for the methylation call
-
-  ### the alignment_strand information is needed to determine which strand of the genomic sequence we are comparing the read against,
-  ### the read_conversion information is needed to know whether we are looking for C->T or G->A substitutions
-  my $alignment_strand;
-  my $read_conversion_info;
-  my $genome_conversion;
-  ### We are now extracting the corresponding genomic sequence, +2 extra bases at the end (or start) so that we can also make a CpG methylation call and
-  ### in addition make differential calls for Cs in CHG or CHH context if the C happens to be at the last (or first)  position of the actually observed sequence
-  my $non_bisulfite_sequence = '';
-
-  ### Positions in SAM format are 1 based, so we need to subract 1 when getting substrings
-  my $pos = $methylation_call_params->{$sequence_identifier}->{position}-1;
-
-  # parsing CIGAR string
-  my @len = split (/\D+/,$cigar); # storing the length per operation
-  my @ops = split (/\d+/,$cigar); # storing the operation
-  shift @ops; # remove the empty first element
-  die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-  ### If the sequence aligns best as CT converted reads vs. GA converted genome (OB, index 1) or GA converted reads vs. GA converted genome (CTOB, index 3)
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 1) or ($methylation_call_params->{$sequence_identifier}->{index} == 3) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless ( ($pos-2) >= 0){ # exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-      return;
-    }
-    $non_bisulfite_sequence .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos-2,2);
-  }
-  my $indels = 0;	
-
-  foreach (0..$#len){
-    if ($ops[$_] eq 'M'){
-      #extracting genomic sequence
-      $non_bisulfite_sequence .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos,$len[$_]);
-      # adjusting position
-      $pos += $len[$_];
-    }
-    elsif ($ops[$_] eq 'I'){ # insertion in the read sequence
-      # we simply add padding Ns instead of finding genomic sequence. This will not be used to infer methylation calls
-      $non_bisulfite_sequence .= 'N' x $len[$_];
-      # warn "$non_bisulfite_sequence\n";
-      # position doesn't need to be adjusting
-      $indels += $len[$_]; # adding this to $indels so we can determine the hemming distance for the SAM output (= single-base substitutions (mismatches, insertions, deletions)
-    }
-    elsif ($ops[$_] eq 'D'){ # deletion in the read sequence
-      # we do not add any genomic sequence but only adjust the position
-      $pos += $len[$_];
-      $indels += $len[$_]; # adding this to $indels so we can determine the hemming distance for the SAM output (= single-base substitutions (mismatches, insertions, deletions)
-    }
-    elsif($cigar =~ tr/[NSHPX=]//){ # if these (for standard mapping) illegal characters exist we die
-      die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-    }
-    else{
-      die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-    }
-  }
-
-  ### If the sequence aligns best as CT converted reads vs. CT converted genome (OT, index 0) or GA converted reads vs. CT converted genome (CTOT, index 2)
-  if ( ($methylation_call_params->{$sequence_identifier}->{index} == 0) or ($methylation_call_params->{$sequence_identifier}->{index} == 2) ){
-    ## checking if the substring will be valid or if we can't extract the sequence because we are right at the edge of a chromosome
-    unless (length($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}}) >= $pos+2){ # exiting with en empty genomic sequence otherwise
-      $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-      return;
-    }
-    $non_bisulfite_sequence .= substr ($chromosomes{$methylation_call_params->{$sequence_identifier}->{chromosome}},$pos,2);
-    # print "$methylation_call_params->{$sequence_identifier}->{bowtie_sequence}\n$non_bisulfite_sequence\n";
-  }
-
-
-
-  ### results from CT converted read vs. CT converted genome (+ orientation alignments are reported only)
-  if ($methylation_call_params->{$sequence_identifier}->{index} == 0){
-    ### [Index 0, sequence originated from (converted) forward strand]
-    $counting{CT_CT_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'CT';
-  }
-
-  ### results from CT converted reads vs. GA converted genome (- orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 1){
-    ### [Index 1, sequence originated from (converted) reverse strand]
-    $counting{CT_GA_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'CT';
-    $genome_conversion = 'GA';
-
-    ### reverse complement!
-    $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-  }
-
-  ### results from GA converted reads vs. CT converted genome (- orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 2){
-    ### [Index 2, sequence originated from complementary to (converted) forward strand]
-    $counting{GA_CT_count}++;
-    $alignment_strand = '-';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'CT';
-
-    ### reverse complement!
-    $non_bisulfite_sequence = reverse_complement($non_bisulfite_sequence);
-  }
-
-  ### results from GA converted reads vs. GA converted genome (+ orientation alignments are reported only)
-  elsif ($methylation_call_params->{$sequence_identifier}->{index} == 3){
-    ### [Index 3, sequence originated from complementary to (converted) reverse strand]
-    $counting{GA_GA_count}++;
-    $alignment_strand = '+';
-    $read_conversion_info = 'GA';
-    $genome_conversion = 'GA';
-
-  }
-  else{
-    die "Too many Bowtie 2 result filehandles\n";
-  }
-
-  $methylation_call_params->{$sequence_identifier}->{alignment_strand} = $alignment_strand;
-  $methylation_call_params->{$sequence_identifier}->{read_conversion} = $read_conversion_info;
-  $methylation_call_params->{$sequence_identifier}->{genome_conversion} = $genome_conversion;
-  $methylation_call_params->{$sequence_identifier}->{unmodified_genomic_sequence} = $non_bisulfite_sequence;
-
-  ### the end position of a read is stored in $pos
-  $methylation_call_params->{$sequence_identifier}->{end_position} = $pos;
-  $methylation_call_params->{$sequence_identifier}->{indels} = $indels;
-}
-
-### METHYLATION CALL
-
-sub methylation_call{
-  my ($identifier,$sequence_actually_observed,$genomic_sequence,$read_conversion) = @_;
-  ### splitting both the actually observed sequence and the genomic sequence up into single bases so we can compare them one by one
-  my @seq = split(//,$sequence_actually_observed);
-  my @genomic = split(//,$genomic_sequence);
-  #  print join ("\n",$identifier,$sequence_actually_observed,$genomic_sequence,$read_conversion),"\n";
-  ### Creating a match-string with different characters for non-cytosine bases (disregarding mismatches here), methyl-Cs or non-methyl Cs in either
-  ### CpG, CHH or CHG context
-
-  #################################################################
-  ### . for bases not involving cytosines                       ###
-  ### X for methylated C in CHG context (was protected)         ###
-  ### x for not methylated C in CHG context (was converted)     ###
-  ### H for methylated C in CHH context (was protected)         ###
-  ### h for not methylated C in CHH context (was converted)     ###
-  ### Z for methylated C in CpG context (was protected)         ###
-  ### z for not methylated C in CpG context (was converted)     ###
-  ### U for methylated C in unknown context (was protected)     ###
-  ### u for not methylated C in unknwon context (was converted) ###
-  #################################################################
-
-  my @match =();
-  warn "length of \@seq: ",scalar @seq,"\tlength of \@genomic: ",scalar @genomic,"\n" unless (scalar @seq eq (scalar@genomic-2)); ## CHH changed to -2
-  my $methyl_CHH_count = 0;
-  my $methyl_CHG_count = 0;
-  my $methyl_CpG_count = 0;
-  my $methyl_C_unknown_count = 0;
-  my $unmethylated_CHH_count = 0;
-  my $unmethylated_CHG_count = 0;
-  my $unmethylated_CpG_count = 0;
-  my $unmethylated_C_unknown_count = 0;
-
-  if ($read_conversion eq 'CT'){
-    for my $index (0..$#seq) {
-      if ($seq[$index] eq $genomic[$index]) {
-	### The residue can only be a C if it was not converted to T, i.e. protected my methylation
-	if ($genomic[$index] eq 'C') {
-	  ### If the residue is a C we want to know if it was in CpG context or in any other context
-	  my $downstream_base = $genomic[$index+1];
-	
-	  if ($downstream_base eq 'G'){
-	    ++$methyl_CpG_count;
-	    push @match,'Z'; # protected C, methylated, in CpG context
-	  }
-	  elsif ($downstream_base eq 'N'){ # if the downstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$methyl_C_unknown_count;
-	    push @match,'U'; # protected C, methylated, in Unknown context
-	  }	
-	  else {
-	    ### C in not in CpG-context, determining the second downstream base context
-	    my $second_downstream_base = $genomic[$index+2];
-	
-	    if ($second_downstream_base eq 'G'){
-	      ++$methyl_CHG_count;
-	      push @match,'X'; # protected C, methylated, in CHG context
-	    }
-	    elsif ($second_downstream_base eq 'N'){
-	      ++$methyl_C_unknown_count; # if the second downstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'U'; # protected C, methylated, in Unknown context
-	    }
-	    else{
-	      ++$methyl_CHH_count;
-	      push @match,'H'; # protected C, methylated, in CHH context
-	    }
-	  }
-	}
-	else {
-	  push @match, '.';
-	}
-      }
-      elsif ($seq[$index] ne $genomic[$index]) {
-	### for the methylation call we are only interested in mismatches involving cytosines (in the genomic sequence) which were converted into Ts
-	### in the actually observed sequence
-	if ($genomic[$index] eq 'C' and $seq[$index] eq 'T') {
-	  ### If the residue was converted to T we want to know if it was in CpG, CHG or CHH  context
-	  my $downstream_base = $genomic[$index+1];
-	
-	  if ($downstream_base eq 'G'){
-	    ++$unmethylated_CpG_count;
-	    push @match,'z'; # converted C, not methylated, in CpG context
-	  }
-	  elsif ($downstream_base eq 'N'){ # if the downstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$unmethylated_C_unknown_count;
-	    push @match,'u'; # converted C, not methylated, in Unknown context
-	  }
-	  else{
-	    ### C in not in CpG-context, determining the second downstream base context
-	    my $second_downstream_base = $genomic[$index+2];
-	
-	    if ($second_downstream_base eq 'G'){
-	      ++$unmethylated_CHG_count;
-	      push @match,'x'; # converted C, not methylated, in CHG context
-	    }
-	    elsif ($second_downstream_base eq 'N'){
-	      ++$unmethylated_C_unknown_count; # if the second downstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'u'; # converted C, not methylated, in Unknown context
-	    }
-	    else{
-	      ++$unmethylated_CHH_count;
-	      push @match,'h'; # converted C, not methylated, in CHH context
-	    }
-	  }
-	}
-	### all other mismatches are not of interest for a methylation call
-	else {
-	  push @match,'.';
-	}
-      }
-      else{
-	die "There can be only 2 possibilities\n";
-      }
-    }
-  }
-  elsif ($read_conversion eq 'GA'){
-    # print join ("\n",'***',$identifier,$sequence_actually_observed,$genomic_sequence,$read_conversion,'***'),"\n";
-
-    for my $index (0..$#seq) {
-      if ($seq[$index] eq $genomic[$index+2]) {
-	### The residue can only be a G if the C on the other strand was not converted to T, i.e. protected my methylation
-	if ($genomic[$index+2] eq 'G') {
-	  ### If the residue is a G we want to know if the C on the other strand was in CpG, CHG or CHH context, therefore we need
-	  ### to look if the base upstream is a C
-
-	  my $upstream_base = $genomic[$index+1];
-	
-	  if ($upstream_base eq 'C'){
-	    ++$methyl_CpG_count;
-	    push @match,'Z'; # protected C on opposing strand, methylated, in CpG context
-	  }
-	  elsif ($upstream_base eq 'N'){ # if the upstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$methyl_C_unknown_count;
-	    push @match,'U'; # protected C on opposing strand, methylated, in Unknown context
-	  }
-	  else{
-	    ### C in not in CpG-context, determining the second upstream base context
-	    my $second_upstream_base = $genomic[$index];
-	
-	    if ($second_upstream_base eq 'C'){
-	      ++$methyl_CHG_count;
-	      push @match,'X'; # protected C on opposing strand, methylated, in CHG context
-	    }
-	    elsif ($second_upstream_base eq 'N'){
-	      ++$methyl_C_unknown_count; # if the second upstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'U'; # protected C, methylated, in Unknown context
-	    }
-	    else{
-	      ++$methyl_CHH_count;
-	      push @match,'H'; # protected C on opposing strand, methylated, in CHH context
-	    }
-	  }
-	}
-	else{
-	  push @match, '.';
-	}
-      }
-      elsif ($seq[$index] ne $genomic[$index+2]) {
-	### for the methylation call we are only interested in mismatches involving cytosines (in the genomic sequence) which were converted to Ts
-	### on the opposing strand, so G to A conversions in the actually observed sequence
-	if ($genomic[$index+2] eq 'G' and $seq[$index] eq 'A') {
-	  ### If the C residue on the opposing strand was converted to T then we will see an A in the currently observed sequence. We want to know if
-	  ### the C on the opposing strand was it was in CpG, CHG or CHH context, therefore we need to look one (or two) bases upstream!
-
-	  my $upstream_base = $genomic[$index+1];
-
-	  if ($upstream_base eq 'C'){
-	    ++$unmethylated_CpG_count;
-	    push @match,'z'; # converted C on opposing strand, not methylated, in CpG context
-	  }
-	  elsif ($upstream_base eq 'N'){ # if the upstream base was an N we cannot really be sure about the sequence context (as it might have been a CG)
-	    ++$unmethylated_C_unknown_count;
-	    push @match,'u'; # converted C on opposing strand, not methylated, in Unknown context
-	  }
-	  else{
-	    ### C in not in CpG-context, determining the second upstream base context
-	    my $second_upstream_base = $genomic[$index];
-	
-	    if ($second_upstream_base eq 'C'){
-	      ++$unmethylated_CHG_count;
-	      push @match,'x'; # converted C on opposing strand, not methylated, in CHG context
-	    }
-	    elsif ($second_upstream_base eq 'N'){
-	      ++$unmethylated_C_unknown_count; # if the second upstream base was an N we cannot really be sure about the sequence context (as it might have been a CHH or CHG)
-	      push @match,'u'; # converted C on opposing strand, not methylated, in Unknown context
-	    }
-	    else{
-	      ++$unmethylated_CHH_count;
-	      push @match,'h'; # converted C on opposing strand, not methylated, in CHH context
-	    }
-	  }
-	}
-	### all other mismatches are not of interest for a methylation call
-	else {
-	  push @match,'.';
-	}
-      }
-      else{
-	die "There can be only 2 possibilities\n";
-      }
-    }
-  }
-  else{
-    die "Strand conversion info is required to perform a methylation call\n";
-  }
-
-  my $methylation_call = join ("",@match);
-
-  $counting{total_meCHH_count} += $methyl_CHH_count;
-  $counting{total_meCHG_count} += $methyl_CHG_count;
-  $counting{total_meCpG_count} += $methyl_CpG_count;
-  $counting{total_meC_unknown_count} += $methyl_C_unknown_count;
-  $counting{total_unmethylated_CHH_count} += $unmethylated_CHH_count;
-  $counting{total_unmethylated_CHG_count} += $unmethylated_CHG_count;
-  $counting{total_unmethylated_CpG_count} += $unmethylated_CpG_count;
-  $counting{total_unmethylated_C_unknown_count} += $unmethylated_C_unknown_count;
-
-  # print "\n$sequence_actually_observed\n$genomic_sequence\n",@match,"\n$read_conversion\n\n";
-  return $methylation_call;
-}
-
-sub read_genome_into_memory{
-    ## working directoy
-    my $cwd = shift;
-    ## reading in and storing the specified genome in the %chromosomes hash
-    chdir ($genome_folder) or die "Can't move to $genome_folder: $!";
-    print "Now reading in and storing sequence information of the genome specified in: $genome_folder\n\n";
-
-    my @chromosome_filenames =  <*.fa>;
-
-    ### if there aren't any genomic files with the extension .fa we will look for files with the extension .fasta
-    unless (@chromosome_filenames){
-      @chromosome_filenames =  <*.fasta>;
-    }
-
-    unless (@chromosome_filenames){
-      die "The specified genome folder $genome_folder does not contain any sequence files in FastA format (with .fa or .fasta file extensions)\n";
-    }
-
-    foreach my $chromosome_filename (@chromosome_filenames){
-
-	open (CHR_IN,$chromosome_filename) or die "Failed to read from sequence file $chromosome_filename $!\n";
-	### first line needs to be a fastA header
-	my $first_line = <CHR_IN>;
-	chomp $first_line;
-	$first_line =~ s/\r//;
-	
-	### Extracting chromosome name from the FastA header
-	my $chromosome_name = extract_chromosome_name($first_line);
-	
-	my $sequence;
-	while (<CHR_IN>){
-	    chomp;
-	    $_ =~ s/\r//;
-	    if ($_ =~ /^>/){
-		### storing the previous chromosome in the %chromosomes hash, only relevant for Multi-Fasta-Files (MFA)
-		if (exists $chromosomes{$chromosome_name}){
-		    print "chr $chromosome_name (",length $sequence ," bp)\n";
-		    die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name!\n";
-		}
-		else {
-		    if (length($sequence) == 0){
-			warn "Chromosome $chromosome_name in the multi-fasta file $chromosome_filename did not contain any sequence information!\n";
-		    }
-		    print "chr $chromosome_name (",length $sequence ," bp)\n";
-		    $chromosomes{$chromosome_name} = $sequence;
-		}
-		### resetting the sequence variable
-		$sequence = '';
-		### setting new chromosome name
-		$chromosome_name = extract_chromosome_name($_);
-	    }
-	    else{
-		$sequence .= uc$_;
-	    }
-	}
-	
-	if (exists $chromosomes{$chromosome_name}){
-	    print "chr $chromosome_name (",length $sequence ," bp)\t";
-	    die "Exiting because chromosome name already exists. Please make sure all chromosomes have a unique name.\n";
-	}
-	else{
-	    if (length($sequence) == 0){
-		warn "Chromosome $chromosome_name in the file $chromosome_filename did not contain any sequence information!\n";
-	    }
-	    print "chr $chromosome_name (",length $sequence ," bp)\n";
-	    $chromosomes{$chromosome_name} = $sequence;
-	}
-    }
-    print "\n";
-    chdir $cwd or die "Failed to move to directory $cwd\n";
-}
-
-sub extract_chromosome_name {
-    ## Bowtie seems to extract the first string after the inition > in the FASTA file, so we are doing this as well
-    my $fasta_header = shift;
-    if ($fasta_header =~ s/^>//){
-	my ($chromosome_name) = split (/\s+/,$fasta_header);
-	return $chromosome_name;
-    }
-    else{
-	die "The specified chromosome ($fasta_header) file doesn't seem to be in FASTA format as required!\n";
-    }
-}
-
-sub reverse_complement{
-  my $sequence = shift;
-  $sequence =~ tr/CATG/GTAC/;
-  $sequence = reverse($sequence);
-  return $sequence;
-}
-
-sub biTransformFastAFiles {
-  my $file = shift;
-  my ($dir,$filename);
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"zcat $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  if ($gzip){
-    $C_to_T_infile =~ s/$/_C_to_T.fa.gz/;
-    $G_to_A_infile =~ s/$/_G_to_A.fa.gz/;
-  }
-  else{
-    $C_to_T_infile =~ s/$/_C_to_T.fa/;
-    $G_to_A_infile =~ s/$/_G_to_A.fa/;
-  }
-
-  if ($prefix){
-    #  warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    #  warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-
-  if ($gzip){
-    open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-  }
-  else{
-    open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-  }
-
-  unless ($directional){
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-    if ($gzip){
-      open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-  }
-
-  my $count = 0;
-
-  while (1){
-    my $header = <IN>;
-    my $sequence= <IN>;
-    last unless ($header and $sequence);
-
-    $header = fix_IDs($header); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence = uc$sequence; # make input file case insensitive
-
-    # detecting if the input file contains tab stops, as this is likely to result in no alignments
-    if (index($header,"\t") != -1){
-      $seqID_contains_tabs++;
-    }
-
-    ### small check if the sequence seems to be in FastA format
-    die "Input file doesn't seem to be in FastA format at sequence $count: $!\n" unless ($header =~ /^>.*/);
-
-    my $sequence_C_to_T = $sequence;
-    $sequence_C_to_T =~ tr/C/T/;
-    print CTOT "$header$sequence_C_to_T";
-
-    unless ($directional){
-      my $sequence_G_to_A = $sequence;
-      $sequence_G_to_A =~ tr/G/A/;
-      print GTOA "$header$sequence_G_to_A";
-    }
-  }
-  close CTOT or die "Failed to close filehandle $!\n";
-
-  if ($directional){
-    warn "\nCreated C -> T converted versions of the FastA file $filename ($count sequences in total)\n\n";
-  }
-  else{
-    close GTOA or die "Failed to close filehandle $!\n";
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastA file $filename ($count sequences in total)\n\n";
-  }
-  return ($C_to_T_infile,$G_to_A_infile);
-}
-
-sub biTransformFastAFiles_paired_end {
-  my ($file,$read_number) = @_;
-
-  if ($gzip){
-    warn "GZIP compression of temporary files is not supported for paired-end FastA data. Continuing to write uncompressed files\n";
-    sleep (2);
-  }
-
-  my ($dir,$filename);
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"zcat $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  $C_to_T_infile =~ s/$/_C_to_T.fa/;
-  $G_to_A_infile =~ s/$/_G_to_A.fa/;
-
-  if ($prefix){
-    #  warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    #  warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-      open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-    }
-    elsif ($read_number == 2){
-      warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-    else{
-      die "Read number needs to be 1 or 2, but was: $read_number\n\n";
-    }
-  }
-  else{ # all four strand output
-    warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-    open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-    open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-  }
-
-  my $count = 0;
-
-  while (1){
-    my $header = <IN>;
-    my $sequence= <IN>;
-    last unless ($header and $sequence);
-
-    $header = fix_IDs($header); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence = uc$sequence; # make input file case insensitive
-
-    # detecting if the input file contains tab stops, as this is likely to result in no alignments
-    if (index($header,"\t") != -1){
-      $seqID_contains_tabs++;
-    }
-
-    ## small check if the sequence seems to be in FastA format
-    die "Input file doesn't seem to be in FastA format at sequence $count: $!\n" unless ($header =~ /^>/);
-
-    if ($read_number == 1){
-      if ($bowtie2){
-	$header =~ s/$/\/1\/1/;
-      }
-      else{	
-	$header =~ s/$/\/1/;
-      }
-    }
-    elsif ($read_number == 2){
-      if ($bowtie2){
-	$header =~ s/$/\/2\/2/;
-      }
-      else{
-	$header =~ s/$/\/2/;
-      }
-    }
-    else{
-      die "Read number needs to be 1 or 2, but was: $read_number\n\n";
-    }
-    my $sequence_C_to_T = my $sequence_G_to_A = $sequence;
-
-    $sequence_C_to_T =~ tr/C/T/;
-    $sequence_G_to_A =~ tr/G/A/;
-
-    if ($directional){
-
-      if ($read_number == 1){
-	print CTOT "$header$sequence_C_to_T";
-      }
-      elsif ($read_number == 2){
-	print GTOA "$header$sequence_G_to_A";
-      }
-    }
-    else{
-      print CTOT "$header$sequence_C_to_T";
-      print GTOA "$header$sequence_G_to_A";
-    }
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "\nCreated C -> T converted version of the FastA file $filename ($count sequences in total)\n\n";
-    }
-    else{
-      warn "\nCreated G -> A converted version of the FastA file $filename ($count sequences in total)\n\n";
-    }
-  }
-  else{
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastA file $filename ($count sequences in total)\n\n";
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      return ($C_to_T_infile);
-    }
-    else{
-      return ($G_to_A_infile);
-    }
-  }
-  else{
-    return ($C_to_T_infile,$G_to_A_infile);
-  }
-}
-
-
-sub biTransformFastQFiles {
-  my $file = shift;
-  my ($dir,$filename);
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"zcat $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  if ($prefix){
-    # warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    # warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  if ($pbat){ # PBAT-Seq
-    if ($gzip){
-      $G_to_A_infile =~ s/$/_G_to_A.fastq.gz/;
-    }
-    else{
-      $G_to_A_infile =~ s/$/_G_to_A.fastq/;
-    }
-
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-
-    if ($gzip){
-      open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-  }
-  else{ # directional or non-directional
-    if ($gzip){
-      $C_to_T_infile =~ s/$/_C_to_T.fastq.gz/;
-    }
-    else{
-      $C_to_T_infile =~ s/$/_C_to_T.fastq/;
-    }
-
-    warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-
-    if ($gzip){
-      open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n"; # uncompressed option
-    }
-
-    unless ($directional){
-      if ($gzip){
-	$G_to_A_infile =~ s/$/_G_to_A.fastq.gz/;
-      }
-      else{
-	$G_to_A_infile =~ s/$/_G_to_A.fastq/;
-      }
-
-      warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-
-      if ($gzip){
-	open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-      }
-      else{
-	open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-      }
-    }
-  }
-
-  my $count = 0;
-  while (1){
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    my $identifier2 = <IN>;
-    my $quality_score = <IN>;
-    last unless ($identifier and $sequence and $identifier2 and $quality_score);
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    ++$count;
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence = uc$sequence; # make input file case insensitive
-
-    # detecting if the input file contains tab stops, as this is likely to result in no alignments
-    if (index($identifier,"\t") != -1){
-      $seqID_contains_tabs++;
-    }
-
-    ## small check if the sequence file appears to be a FastQ file
-    if ($count == 1){
-      if ($identifier !~ /^\@/ or $identifier2 !~ /^\+/){
-	die "Input file doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-    }
-
-    if ($pbat){
-      my $sequence_G_to_A = $sequence;
-      $sequence_G_to_A =~ tr/G/A/;
-      print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-    }
-    else{ # directional or non-directional
-      my $sequence_C_to_T = $sequence;
-      $sequence_C_to_T =~ tr/C/T/;
-      print CTOT join ('',$identifier,$sequence_C_to_T,$identifier2,$quality_score);
-
-      unless ($directional){
-	my $sequence_G_to_A = $sequence;
-	$sequence_G_to_A =~ tr/G/A/;
-	print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-      }
-    }
-  }
-
-  if ($directional){
-    close CTOT or die "Failed to close filehandle $!\n";
-    warn "\nCreated C -> T converted version of the FastQ file $filename ($count sequences in total)\n\n";
-  }
-  elsif($pbat){
-    warn "\nCreated G -> A converted version of the FastQ file $filename ($count sequences in total)\n\n";
-    close GTOA or die "Failed to close filehandle $!\n";
-    return ($G_to_A_infile);
-  }
-  else{
-    close CTOT or die "Failed to close filehandle $!\n";
-    close GTOA or die "Failed to close filehandle $!\n";
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastQ file $filename ($count sequences in total)\n\n";
-  }
-
-  return ($C_to_T_infile,$G_to_A_infile);
-}
-
-sub biTransformFastQFiles_paired_end {
-  my ($file,$read_number) = @_;
-  my ($dir,$filename);
-
-  if ($file =~ /\//){
-    ($dir,$filename) = $file =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file;
-  }
-
-  ### gzipped version of the infile
-  if ($file =~ /\.gz$/){
-    open (IN,"zcat $file |") or die "Couldn't read from file $file: $!\n";
-  }
-  else{
-    open (IN,$file) or die "Couldn't read from file $file: $!\n";
-  }
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file\n";
-    sleep (1);
-  }
-
-  my $C_to_T_infile = my $G_to_A_infile = $filename;
-
-  if ($gzip){
-    $C_to_T_infile =~ s/$/_C_to_T.fastq.gz/;
-    $G_to_A_infile =~ s/$/_G_to_A.fastq.gz/;
-  }
-  else{
-    $C_to_T_infile =~ s/$/_C_to_T.fastq/;
-    $G_to_A_infile =~ s/$/_G_to_A.fastq/;
-  }
-
-  if ($prefix){
-    #  warn "Prefixing $prefix:\nold: $C_to_T_infile\nold: $G_to_A_infile\n\n";
-    $C_to_T_infile = "$prefix.$C_to_T_infile";
-    $G_to_A_infile = "$prefix.$G_to_A_infile";
-    #  warn "Prefixing $prefix:\nnew: $C_to_T_infile\nnew: $G_to_A_infile\n\n";
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-      if ($gzip){
-	open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-      }
-      else{
-	open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-      }
-    }
-    elsif ($read_number == 2){
-      warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-      if ($gzip){
-	open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-      }
-      else{
-	open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-      }
-    }
-    else{
-      die "Read number needs to be 1 or 2, but was $read_number!\n\n";
-    }
-  }
-  else{
-    warn "Writing a C -> T converted version of the input file $filename to $temp_dir$C_to_T_infile\n";
-    warn "Writing a G -> A converted version of the input file $filename to $temp_dir$G_to_A_infile\n";
-    if ($gzip){
-      open (CTOT,"| gzip -c - > ${temp_dir}${C_to_T_infile}") or die "Can't write to file: $!\n";
-      open (GTOA,"| gzip -c - > ${temp_dir}${G_to_A_infile}") or die "Can't write to file: $!\n";
-    }
-    else{
-      open (CTOT,'>',"$temp_dir$C_to_T_infile") or die "Couldn't write to file $!\n";
-      open (GTOA,'>',"$temp_dir$G_to_A_infile") or die "Couldn't write to file $!\n";
-    }
-  }
-
-  my $count = 0;
-  while (1){
-    my $identifier = <IN>;
-    my $sequence = <IN>;
-    my $identifier2 = <IN>;
-    my $quality_score = <IN>;
-    last unless ($identifier and $sequence and $identifier2 and $quality_score);
-    ++$count;
-
-    $identifier = fix_IDs($identifier); # this is to avoid problems with truncated read ID when they contain white spaces
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence= uc$sequence; # make input file case insensitive
-
-    ## small check if the sequence file appears to be a FastQ file
-    if ($count == 1){
-      if ($identifier !~ /^\@/ or $identifier2 !~ /^\+/){
-	die "Input file doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-    }
-    my $sequence_C_to_T = my $sequence_G_to_A = $sequence;
-
-    if ($read_number == 1){
-      if ($bowtie2){
-	$identifier =~ s/$/\/1\/1/;
-      }
-      else{
-	$identifier =~ s/$/\/1/;
-      }
-    }
-    elsif ($read_number == 2){
-      if ($bowtie2){
-	$identifier =~ s/$/\/2\/2/;
-      }
-      else{
-	$identifier =~ s/$/\/2/;
-      }
-    }
-    else{
-      die "Read number needs to be 1 or 2\n";
-    }
-
-    $sequence_C_to_T =~ tr/C/T/;
-    $sequence_G_to_A =~ tr/G/A/;
-
-    if ($directional){
-      if ($read_number == 1){
-	print CTOT join ('',$identifier,$sequence_C_to_T,$identifier2,$quality_score);
-      }
-      else{
-	print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-      }
-    }
-    else{
-      print CTOT join ('',$identifier,$sequence_C_to_T,$identifier2,$quality_score);
-      print GTOA join ('',$identifier,$sequence_G_to_A,$identifier2,$quality_score);
-    }
-  }
-
-  if ($directional){
-    if ($read_number == 1){
-      warn "\nCreated C -> T converted version of the FastQ file $filename ($count sequences in total)\n\n";
-    }
-    else{
-      warn "\nCreated G -> A converted version of the FastQ file $filename ($count sequences in total)\n\n";
-    }
-  }
-  else{
-    warn "\nCreated C -> T as well as G -> A converted versions of the FastQ file $filename ($count sequences in total)\n\n";
-  }
-  if ($directional){
-    if ($read_number == 1){
-      close CTOT or die "Failed to close filehandle $!\n";
-      return ($C_to_T_infile);
-    }
-    else{
-      close GTOA or die "Failed to close filehandle $!\n";
-      return ($G_to_A_infile);
-    }
-  }
-  else{
-    close CTOT or die "Failed to close filehandle $!\n";
-    close GTOA or die "Failed to close filehandle $!\n";
-    return ($C_to_T_infile,$G_to_A_infile);
-  }
-}
-
-
-### SPECIAL BOWTIE 1 PAIRED-END FORMAT FOR GZIPPED OUTPUT FILES
-
-sub biTransformFastQFiles_paired_end_bowtie1_gzip {
-  my ($file_1,$file_2) = @_;
-  my ($dir,$filename);
-
-  if ($file_1 =~ /\//){
-    ($dir,$filename) = $file_1 =~ m/(.*\/)(.*)$/;
-  }
-  else{
-    $filename = $file_1;
-  }
-
-  ### gzipped version of infile 1
-  if ($file_1 =~ /\.gz$/){
-    open (IN_1,"zcat $file_1 |") or die "Couldn't read from file $file_1: $!\n";
-  }
-  else{
-    open (IN_1,$file_1) or die "Couldn't read from file $file_1: $!\n";
-  }
-  ### gzipped version of infile 2
-  if ($file_2 =~ /\.gz$/){
-    open (IN_2,"zcat $file_2 |") or die "Couldn't read from file $file_2: $!\n";
-  }
-  else{
-    open (IN_2,$file_2) or die "Couldn't read from file $file_2: $!\n";
-  }
-
-
-  if ($skip){
-    warn "Skipping the first $skip reads from $file_1 and $file_2\n";
-    sleep (1);
-  }
-  if ($upto){
-    warn "Processing reads up to sequence no. $upto from $file_1 and $file_2\n";
-    sleep (1);
-  }
-
-  my $CT_plus_GA_infile = my $GA_plus_CT_infile = $filename;
-
-  if ($prefix){
-    # warn "Prefixing $prefix:\nold: $CT_plus_GA_infile\nold: $GA_plus_CT_infile\n\n";
-    $CT_plus_GA_infile = "$prefix.$CT_plus_GA_infile";
-    $GA_plus_CT_infile = "$prefix.$GA_plus_CT_infile";
-    # warn "Prefixing $prefix:\nnew: $CT_plus_GA_infile\nnew: $GA_plus_CT_infile\n\n";
-  }
-
-  $CT_plus_GA_infile =~ s/$/.CT_plus_GA.fastq.gz/;
-  $GA_plus_CT_infile =~ s/$/.GA_plus_CT.fastq.gz/;
-  # warn "Prefixing $prefix:\nnew: $CT_plus_GA_infile\nnew: $GA_plus_CT_infile\n\n";
-
-  warn "Writing a C -> T converted version of $file_1 and a G -> A converted version of $file_2 to $temp_dir$CT_plus_GA_infile\n";
-  open (CTPLUSGA,"| gzip -c - > ${temp_dir}${CT_plus_GA_infile}") or die "Can't write to file: $!\n";
-  # open (CTPLUSGA,'>',"$temp_dir$CT_plus_GA_infile") or die "Couldn't write to file $!\n";
-
-  unless ($directional){
-    print "Writing a G -> A converted version of $file_1 and a C -> T converted version of $file_2 to $temp_dir$GA_plus_CT_infile\n";
-    open (GAPLUSCT,"| gzip -c - > ${temp_dir}${GA_plus_CT_infile}") or die "Can't write to file: $!\n";
-  }
-
-  ### for Bowtie 1 we need to write a single gzipped file with 1 line per pair of sequences in the the following format:
-  ### <seq-ID>     <sequence #1 mate>     <quality #1 mate>     <sequence #2 mate>     <quality #2 mate>
-
-  my $count = 0;
-  while (1){
-    my $identifier_1 = <IN_1>;
-    my $sequence_1 = <IN_1>;
-    my $identifier2_1 = <IN_1>;
-    my $quality_score_1 = <IN_1>;
-
-    my $identifier_2 = <IN_2>;
-    my $sequence_2 = <IN_2>;
-    my $identifier2_2 = <IN_2>;
-    my $quality_score_2 = <IN_2>;
-
-    last unless ($identifier_1 and $sequence_1 and $identifier2_1 and $quality_score_1 and $identifier_2 and $sequence_2 and $identifier2_2 and $quality_score_2);
-
-    ++$count;
-
-    ## small check if the sequence file appears to be a FastQ file
-    if ($count == 1){
-      if ($identifier_1 !~ /^\@/ or $identifier2_1 !~ /^\+/){
-	die "Input file 1 doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-      if ($identifier_2 !~ /^\@/ or $identifier2_2 !~ /^\+/){
-	die "Input file 2 doesn't seem to be in FastQ format at sequence $count: $!\n";
-      }
-    }
-
-    $identifier_1 = fix_IDs($identifier_1); # this is to avoid problems with truncated read ID when they contain white spaces
-    chomp $identifier_1;
-    chomp $sequence_1;
-    chomp $sequence_2;
-    chomp $quality_score_1;
-    chomp $quality_score_2;
-
-    $identifier_1 =~ s/^\@//;
-    $identifier_1 =~ s/$/\/1/; #adding an extra /1 to the end which is being removed by Bowtie otherwise (which leads to no sequences alignments whatsoever)
-
-    if ($skip){
-      next unless ($count > $skip);
-    }
-    if ($upto){
-      last if ($count > $upto);
-    }
-
-    $sequence_1 = uc$sequence_1; # make input file 1 case insensitive
-    $sequence_2 = uc$sequence_2; # make input file 2 case insensitive
-
-    # print "$identifier_1\t$sequence_1\t$quality_score_1\t$sequence_2\t$quality_score_2\n";
-    my $sequence_1_C_to_T = $sequence_1;
-    my $sequence_2_G_to_A = $sequence_2;
-    $sequence_1_C_to_T =~ tr/C/T/;
-    $sequence_2_G_to_A =~ tr/G/A/;
-
-    print CTPLUSGA "$identifier_1\t$sequence_1_C_to_T\t$quality_score_1\t$sequence_2_G_to_A\t$quality_score_2\n";
-
-    unless ($directional){
-      my $sequence_1_G_to_A = $sequence_1;
-      my $sequence_2_C_to_T = $sequence_2;
-      $sequence_1_G_to_A =~ tr/G/A/;
-      $sequence_2_C_to_T =~ tr/C/T/;
-      print GAPLUSCT "$identifier_1\t$sequence_1_G_to_A\t$quality_score_1\t$sequence_2_C_to_T\t$quality_score_2\n";
-    }
-  }
-
-  close CTPLUSGA or die "Couldn't close filehandle\n";
-  warn "\nCreated C -> T converted version of FastQ file '$file_1' and G -> A converted version of FastQ file '$file_2' ($count sequences in total)\n";
-
-  if ($directional){
-    warn "\n";
-    return ($CT_plus_GA_infile);
-  }
-  else{
-    close GAPLUSCT or die "Couldn't close filehandle\n";
-    warn "Created G -> A converted version of FastQ file '$file_1' and C -> T converted version of FastQ file '$file_2' ($count sequences in total)\n\n";
-    return ($CT_plus_GA_infile,$GA_plus_CT_infile);
-  }
-}
-
-
-sub fix_IDs{
-  my $id = shift;
-  $id =~ s/[ \t]+/_/g; # replace spaces or tabs with underscores
-  return $id;
-}
-
-sub ensure_sensical_alignment_orientation_single_end{
-  my $index = shift; # index number if the sequence produced an alignment
-  my $strand = shift;
-  ###  setting $orientation to 1 if it is in the correct orientation, and leave it 0 if it is the nonsensical wrong one
-  my $orientation = 0;
-  ##############################################################################################################
-  ## FORWARD converted read against FORWARD converted genome (read: C->T.....C->T..      genome:C->T.......C->T)
-  ## here we only want reads in the forward (+) orientation
-  if ($fhs[$index]->{name} eq 'CTreadCTgenome') {
-    ### if the alignment is (+) we count it, and return 1 for a correct orientation
-    if ($strand eq '+') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (-) the alignment is nonsensical
-    elsif ($strand eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  }
-  ###############################################################################################################
-  ## FORWARD converted read against reverse converted genome (read: C->T.....C->T..      genome: G->A.......G->A)
-  ## here we only want reads in the forward (-) orientation
-  elsif ($fhs[$index]->{name} eq 'CTreadGAgenome') {
-    ### if the alignment is (-) we count it and return 1 for a correct orientation
-    if ($strand eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (+) the alignment is nonsensical
-    elsif ($strand eq '+') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  }
-  ###############################################################################################################
-  ## Reverse converted read against FORWARD converted genome (read: G->A.....G->A..      genome: C->T.......C->T)
-  ## here we only want reads in the forward (-) orientation
-  elsif ($fhs[$index]->{name} eq 'GAreadCTgenome') {
-    ### if the alignment is (-) we count it and return 1 for a correct orientation
-    if ($strand eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (+) the alignment is nonsensical
-    elsif ($strand eq '+') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  }
-  ###############################################################################################################
-  ## Reverse converted read against reverse converted genome (read: G->A.....G->A..      genome: G->A.......G->A)
-  ## here we only want reads in the forward (+) orientation
-  elsif ($fhs[$index]->{name} eq 'GAreadGAgenome') {
-    ### if the alignment is (+) we count it and return 1 for a correct orientation
-    if ($strand eq '+') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the orientation equals (-) the alignment is nonsensical
-    elsif ($strand eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-  } else{
-    die "One of the above conditions must be true\n";
-  }
-}
-
-sub ensure_sensical_alignment_orientation_paired_ends{
-  my ($index,$id_1,$strand_1,$id_2,$strand_2) = @_; # index number if the sequence produced an alignment
-  ###  setting $orientation to 1 if it is in the correct orientation, and leave it 0 if it is the nonsensical wrong one
-  my $orientation = 0;
-  ##############################################################################################################
-  ## [Index 0, sequence originated from (converted) forward strand]
-  ## CT converted read 1
-  ## GA converted read 2
-  ## CT converted genome
-  ## here we only want read 1 in (+) orientation and read 2 in (-) orientation
-  if ($fhs[$index]->{name} eq 'CTread1GAread2CTgenome') {
-    ### if the paired-end alignment is read1 (+) and read2 (-) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  ###############################################################################################################
-  ## [Index 1, sequence originated from (converted) reverse strand]
-  ## GA converted read 1
-  ## CT converted read 2
-  ## GA converted genome
-  ## here we only want read 1 in (+) orientation and read 2 in (-) orientation
-  elsif ($fhs[$index]->{name} eq 'GAread1CTread2GAgenome') {
-    ### if the paired-end alignment is read1 (+) and read2 (-) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  ###############################################################################################################
-  ## [Index 2, sequence originated from complementary to (converted) forward strand]
-  ## GA converted read 1
-  ## CT converted read 2
-  ## CT converted genome
-  ## here we only want read 1 in (-) orientation and read 2 in (+) orientation
-  elsif ($fhs[$index]->{name} eq 'GAread1CTread2CTgenome') {
-    ### if the paired-end alignment is read1 (-) and read2 (+) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  ###############################################################################################################
-  ## [Index 3, sequence originated from complementary to (converted) reverse strand]
-  ## CT converted read 1
-  ## GA converted read 2
-  ## GA converted genome
-  ## here we only want read 1 in (+) orientation and read 2 in (-) orientation
-  elsif ($fhs[$index]->{name} eq 'CTread1GAread2GAgenome') {
-    ### if the paired-end alignment is read1 (-) and read2 (+) we count it, and return 1 for a correct orientation
-    if ($id_1 =~ /2$/ and $strand_1 eq '+' and $id_2 =~ /1$/ and $strand_2 eq '-') {
-      $fhs[$index]->{seen}++;
-      $orientation = 1;
-      return $orientation;
-    }
-    ### if the read 2 is in (+) orientation and read 1 in (-) the alignment is nonsensical
-    elsif ($id_1 =~ /1$/ and $strand_1 eq '+' and $id_2 =~ /2$/ and $strand_2 eq '-') {
-      $fhs[$index]->{wrong_strand}++;
-      return $orientation;
-    }
-    else{
-      die "id1: $id_1\tid2: $id_2\tThis should be impossible\n";
-    }
-  }
-  else{
-    die "One of the above conditions must be true\n";
-  }
-}
-
-#####################################################################################################################################################
-
-### Bowtie 1 (default) | PAIRED-END | FASTA
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastA {
-
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-
-  if ($directional){
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_1 and $C_to_T_infile_2 and $G_to_A_infile_2 (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional){
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next;
-      }
-    }
-
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    warn "Now starting a Bowtie paired-end alignment for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile_1} and $temp_dir$fh->{inputfile_2}, with the options: $bt_options)\n";
-    open ($fh->{fh},"$path_to_bowtie $bt_options $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-
-    my $line_1 = $fh->{fh}->getline();
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	die "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains either read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains either read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | PAIRED-END | FASTA
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 {
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-  if ($directional){
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_1 and $C_to_T_infile_2 and $G_to_A_infile_2 (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional){
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next;
-      }
-    }
-
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-
-    warn "Now starting a Bowtie 2 paired-end alignment for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile_1} and $temp_dir$fh->{inputfile_2}, with the options: $bt2_options))\n";
-    open ($fh->{fh},"$path_to_bowtie $bt2_options $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else{
-	last; # no alignment output
-      }
-    }
-
-    my $line_1 = $_;
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 /1 tag if present (remember that Bowtie2 clips off /1 or /2 line endings itself, so we added /1/1 or /2/2 to start with
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 /2 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	warn "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains either read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains either read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-### Bowtie 1 (default) | PAIRED-END | FASTQ
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastQ {
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-
-  if ($directional){
-    warn "Input file is $C_to_T_infile_1 (FastQ)\n";
-  }
-  elsif($pbat){
-    warn "Input file is $G_to_A_infile_1 (FastQ; PBAT-Seq)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_1 (FastQ)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the
-  ## data structure above
-  if ($directional or $pbat){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional or $pbat){
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next; # skipping unwanted filehandles
-      }
-    }
-
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    if ($gzip){
-      warn "Now starting a Bowtie paired-end alignment for $fh->{name} (reading in sequences from ${temp_dir}$fh->{inputfile_1}, with the options: $bt_options)\n";
-      open ($fh->{fh},"zcat ${temp_dir}$fh->{inputfile_1} | $path_to_bowtie $bt_options $fh->{bisulfiteIndex} --12 - |") or die "Can't open pipe to bowtie: $!";
-    }
-    else{
-      warn "Now starting a Bowtie paired-end alignment for $fh->{name} (reading in sequences from ${temp_dir}$fh->{inputfile_1} and ${temp_dir}$fh->{inputfile_2}, with the options: $bt_options))\n";
-      sleep(5);
-      open ($fh->{fh},"$path_to_bowtie $bt_options $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-    }
-
-    my $line_1 = $fh->{fh}->getline();
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	die "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | PAIRED-END | FASTQ
-
-sub paired_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 {
-  my ($C_to_T_infile_1,$G_to_A_infile_1,$C_to_T_infile_2,$G_to_A_infile_2) = @_;
-  if ($directional){
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_2 (FastQ)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile_1 and $G_to_A_infile_1 and $C_to_T_infile_2 and $G_to_A_infile_2 (FastQ)\n";
-  }
-
-  ## Now starting up 4 instances of Bowtie 2 feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in the
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    if ($directional){
-      unless ($fh->{inputfile_1}){
-	$fh->{last_seq_id} = undef;
-	$fh->{last_line_1} = undef;
-	$fh->{last_line_2} = undef;
-	next;
-      }
-    }
-
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTread1GAread2CTgenome' or $fh->{name} eq 'GAread1CTread2GAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-
-    warn "Now starting a Bowtie 2 paired-end alignment for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile_1} and $temp_dir$fh->{inputfile_2}, with the options: $bt2_options))\n";
-    open ($fh->{fh},"$path_to_bowtie $bt2_options $fh->{bisulfiteIndex} -1 $temp_dir$fh->{inputfile_1} -2 $temp_dir$fh->{inputfile_2} |") or die "Can't open pipe to bowtie: $!";
-
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else{
-	last; # no alignment output
-      }
-    }
-
-    my $line_1 = $_;
-    my $line_2 = $fh->{fh}->getline();
-
-    # if Bowtie produces an alignment we store the first line of the output
-    if ($line_1 and $line_2) {
-      chomp $line_1;
-      chomp $line_2;
-      ### Bowtie always reports the alignment with the smaller chromosomal position first. This can be either sequence 1 or sequence 2.
-      ### We will thus identify which sequence was read 1 and store this ID as last_seq_id
-
-      my $id_1 = (split(/\t/,$line_1))[0]; # this is the first element of the first bowtie output line (= the sequence identifier)
-      my $id_2 = (split(/\t/,$line_2))[0]; # this is the first element of the second bowtie output line
-
-      if ($id_1 =~ s/\/1$//){ # removing the read 1 tag if present (remember that Bowtie2 clips off /1 or /2 line endings itself, so we added /1/1 or /2/2 to start with
-	$fh->{last_seq_id} = $id_1;
-      }
-      elsif ($id_2 =~ s/\/1$//){ # removing the read 1 tag if present
-	$fh->{last_seq_id} = $id_2;
-      }
-      else{
-	die "Either the first or the second id need to be read 1! ID1 was: $id_1; ID2 was: $id_2\n";
-      }
-
-      $fh->{last_line_1} = $line_1; # this contains read 1 or read 2
-      $fh->{last_line_2} = $line_2; # this contains read 1 or read 2
-      warn "Found first alignment:\n$fh->{last_line_1}\n$fh->{last_line_2}\n";
-    }
-
-    # otherwise we just initialise last_seq_id and last_lines as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_lines\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line_1} = undef;
-      $fh->{last_line_2} = undef;
-    }
-  }
-}
-
-#####################################################################################################################################################
-
-### Bowtie 1 (default) | SINGLE-END | FASTA
-sub single_end_align_fragments_to_bisulfite_genome_fastA {
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    warn "Now starting the Bowtie aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options: $bt_options)\n";
-    if ($gzip){
-      open ($fh->{fh},"zcat $temp_dir$fh->{inputfile} | $path_to_bowtie $bt_options $fh->{bisulfiteIndex} - |") or die "Can't open pipe to bowtie: $!";
-    }
-    else{
-      open ($fh->{fh},"$path_to_bowtie $bt_options $fh->{bisulfiteIndex} $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie: $!"; # command for uncompressed data
-    }
-
-    # if Bowtie produces an alignment we store the first line of the output
-    $_ = $fh->{fh}->getline();
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the bowtie output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | SINGLE-END | FASTA
-sub single_end_align_fragments_to_bisulfite_genome_fastA_bowtie2 {
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastA)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastA)\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-
-    warn "Now starting the Bowtie 2 aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options: $bt2_options)\n";
-    open ($fh->{fh},"$path_to_bowtie $bt2_options $fh->{bisulfiteIndex} -U $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie: $!";
-
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else{
-	last; # no alignment output
-      }
-    }
-
-    # Bowtie 2 outputs a result line even for sequences without any alignments. We thus store the first line of the output
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the Bowtie output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefinded. This should only happen at the end of a file for Bowtie 2 output
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-
-### Bowtie 1 (default) | SINGLE-END | FASTQ
-sub single_end_align_fragments_to_bisulfite_genome_fastQ {
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastQ)\n";
-  }
-  elsif($pbat){
-    warn "Input file is $G_to_A_infile (FastQ)\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastQ)\n";
-  }
-
-
-  ## Now starting up to 4 instances of Bowtie feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## the data structure above
-  if ($directional or $pbat){
-    warn "Now running 2 instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-
-  foreach my $fh (@fhs) {
-    my $bt_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt_options .= ' --nofw';
-    }
-
-    warn "Now starting the Bowtie aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options: $bt_options)\n";
-    sleep (5);
-
-    if ($gzip){
-      open ($fh->{fh},"zcat $temp_dir$fh->{inputfile} | $path_to_bowtie $bowtie_options $fh->{bisulfiteIndex} - |") or die "Can't open pipe to bowtie: $!";
-    }
-    else{
-      open ($fh->{fh},"$path_to_bowtie $bowtie_options $fh->{bisulfiteIndex} $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie: $!"; # command for uncompressed data
-    }
-
-    # if Bowtie produces an alignment we store the first line of the output
-    $_ = $fh->{fh}->getline();
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the Bowtie output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefined
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-### Bowtie 2 | SINGLE-END | FASTQ
-sub single_end_align_fragments_to_bisulfite_genome_fastQ_bowtie2 {
-
-  my ($C_to_T_infile,$G_to_A_infile) = @_;
-  if ($directional){
-    warn "Input file is $C_to_T_infile (FastQ)\n\n";
-  }
-  else{
-    warn "Input files are $C_to_T_infile and $G_to_A_infile (FastQ)\n\n";
-  }
-
-  ## Now starting up to 4 instances of Bowtie 2 feeding in the converted sequence files and reading in the first line of the bowtie output, and storing it in
-  ## the data structure above
-  if ($directional){
-    warn "Now running 2 instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-  else{
-    warn "Now running 4 individual instances of Bowtie 2 against the bisulfite genome of $genome_folder with the specified options: $bowtie_options\n\n";
-  }
-   foreach my $fh (@fhs) {
-    my $bt2_options = $bowtie_options;
-    if ($fh->{name} eq 'CTreadCTgenome' or $fh->{name} eq 'GAreadGAgenome'){
-      $bt2_options .= ' --norc'; ### ensuring the alignments are only reported in a sensible manner
-    }
-    else {
-      $bt2_options .= ' --nofw';
-    }
-    warn "Now starting the Bowtie 2 aligner for $fh->{name} (reading in sequences from $temp_dir$fh->{inputfile} with options $bt2_options)\n";
-    warn "Using Bowtie 2 index: $fh->{bisulfiteIndex}\n\n";
-
-    open ($fh->{fh},"$path_to_bowtie $bt2_options $fh->{bisulfiteIndex} -U $temp_dir$fh->{inputfile} |") or die "Can't open pipe to bowtie: $!";
-    ### Bowtie 2 outputs out SAM format, so we need to skip everything until the first sequence
-    while (1){
-      $_ = $fh->{fh}->getline();
-      # warn "$_\n";
-      # sleep(1);
-      if ($_) {
-	last unless ($_ =~ /^\@/); # SAM headers start with @
-      }
-      else {
-	last;
-      }
-    }
-
-    # Bowtie 2 outputs a result line even for sequences without any alignments. We thus store the first line of the output
-    if ($_) {
-      chomp;
-      my $id = (split(/\t/))[0]; # this is the first element of the Bowtie 2 output (= the sequence identifier)
-      $fh->{last_seq_id} = $id;
-      $fh->{last_line} = $_;
-      warn "Found first alignment:\t$fh->{last_line}\n";
-      # warn "storing $id and\n$_\n";
-    }
-    # otherwise we just initialise last_seq_id and last_line as undefined. This should only happen at the end of a file for Bowtie 2 output
-    else {
-      warn "Found no alignment, assigning undef to last_seq_id and last_line\n";
-      $fh->{last_seq_id} = undef;
-      $fh->{last_line} = undef;
-    }
-  }
-}
-
-###########################################################################################################################################
-
-sub reset_counters_and_fhs{
-  my $filename = shift;
-  %counting=(
-	     total_meCHH_count => 0,
-	     total_meCHG_count => 0,
-	     total_meCpG_count => 0,
-	     total_meC_unknown_count => 0,
-	     total_unmethylated_CHH_count => 0,
-	     total_unmethylated_CHG_count => 0,
-	     total_unmethylated_CpG_count => 0,
-	     total_unmethylated_C_unknown_count => 0,
-	     sequences_count => 0,
-	     no_single_alignment_found => 0,
-	     unsuitable_sequence_count => 0,
-	     genomic_sequence_could_not_be_extracted_count => 0,
-	     unique_best_alignment_count => 0,
-	     low_complexity_alignments_overruled_count => 0,
-	     CT_CT_count => 0, #(CT read/CT genome, original top strand)
-	     CT_GA_count => 0, #(CT read/GA genome, original bottom strand)
-	     GA_CT_count => 0, #(GA read/CT genome, complementary to original top strand)
-	     GA_GA_count => 0, #(GA read/GA genome, complementary to original bottom strand)
-	     CT_GA_CT_count => 0, #(CT read1/GA read2/CT genome, original top strand)
-	     GA_CT_GA_count => 0, #(GA read1/CT read2/GA genome, complementary to original bottom strand)
-	     GA_CT_CT_count => 0, #(GA read1/CT read2/CT genome, complementary to original top strand)
-	     CT_GA_GA_count => 0, #(CT read1/GA read2/GA genome, original bottom strand)
-	     alignments_rejected_count => 0, # only relevant if --directional was specified
-	    );
-
-  if ($directional){
-    if ($filename =~ ','){ # paired-end files
-      @fhs=(
-	    { name => 'CTreadCTgenome',
-	      strand_identity => 'con ori forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'CTreadGAgenome',
-	      strand_identity => 'con ori reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadCTgenome',
-	      strand_identity => 'compl ori con forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadGAgenome',
-	    strand_identity => 'compl ori con reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-    else{ # single-end files
-      @fhs=(
-	    { name => 'CTreadCTgenome',
-	      strand_identity => 'con ori forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'CTreadGAgenome',
-	      strand_identity => 'con ori reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-  }
-  elsif($pbat){
-    if ($filename =~ ','){ # paired-end files
-      @fhs=(
-	    { name => 'CTreadCTgenome',
-	      strand_identity => 'con ori forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'CTreadGAgenome',
-	      strand_identity => 'con ori reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadCTgenome',
-	      strand_identity => 'compl ori con forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadGAgenome',
-	    strand_identity => 'compl ori con reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-    else{ # single-end files
-      @fhs=(
-	    { name => 'GAreadCTgenome',
-	      strand_identity => 'compl ori con forward',
-	      bisulfiteIndex => $CT_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	    { name => 'GAreadGAgenome',
-	      strand_identity => 'compl ori con reverse',
-	      bisulfiteIndex => $GA_index_basename,
-	      seen => 0,
-	      wrong_strand => 0,
-	    },
-	   );
-    }
-  }
-  else{
-    @fhs=(
-	  { name => 'CTreadCTgenome',
-	    strand_identity => 'con ori forward',
-	    bisulfiteIndex => $CT_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	  { name => 'CTreadGAgenome',
-	    strand_identity => 'con ori reverse',
-	    bisulfiteIndex => $GA_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	  { name => 'GAreadCTgenome',
-	    strand_identity => 'compl ori con forward',
-	    bisulfiteIndex => $CT_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	  { name => 'GAreadGAgenome',
-	    strand_identity => 'compl ori con reverse',
-	    bisulfiteIndex => $GA_index_basename,
-	    seen => 0,
-	    wrong_strand => 0,
-	  },
-	 );
-  }
-}
-
-
-sub process_command_line{
-  my @bowtie_options;
-  my $help;
-  my $mates1;
-  my $mates2;
-  my $path_to_bowtie;
-  my $fastq;
-  my $fasta;
-  my $skip;
-  my $qupto;
-  my $phred64;
-  my $phred33;
-  my $solexa;
-  my $mismatches;
-  my $seed_length;
-  my $best;
-  my $sequence_format;
-  my $version;
-  my $quiet;
-  my $chunk;
-  my $non_directional;
-  my $ceiling;
-  my $maxins;
-  my $minins;
-  my $unmapped;
-  my $multi_map;
-  my $output_dir;
-  my $bowtie2;
-  my $vanilla;
-  my $sam_no_hd;
-  my $seed_extension_fails;
-  my $reseed_repetitive_seeds;
-  my $most_valid_alignments;
-  my $score_min;
-  my $parallel;
-  my $temp_dir;
-  my $rdg;
-  my $rfg;
-  my $non_bs_mm;
-  my $samtools_path;
-  my $bam;
-  my $gzip;
-  my $pbat;
-  my $prefix;
-  my $old_flag;
-
-  my $command_line = GetOptions ('help|man' => \$help,
-				 '1=s' => \$mates1,
-				 '2=s' => \$mates2,
-				 'path_to_bowtie=s' => \$path_to_bowtie,
-				 'f|fasta' => \$fasta,
-				 'q|fastq' => \$fastq,
-				 's|skip=i' => \$skip,
-				 'u|upto=i' => \$qupto,
-				 'phred33-quals' => \$phred33,
-				 'phred64-quals|solexa1' => \$phred64,
-				 'solexa-quals' => \$solexa,
-				 'n|seedmms=i' => \$mismatches,
-				 'l|seedlen=i' => \$seed_length,
-				 'no_best' => \$best,
-				 'version' => \$version,
-				 'quiet' => \$quiet,
-				 'chunkmbs=i' => \$chunk,
-				 'non_directional' => \$non_directional,
-				 'I|minins=i' => \$minins,
-				 'X|maxins=i' => \$maxins,
-				 'e|maqerr=i' => \$ceiling,
-				 'un|unmapped' => \$unmapped,
-				 'ambiguous' => \$multi_map,
-				 'o|output_dir=s' => \$output_dir,
-				 'bowtie2' => \$bowtie2,
-				 'vanilla' => \$vanilla,
-				 'sam-no-hd' => \$sam_no_hd,
-				 'D=i' => \$seed_extension_fails,
-				 'R=i' => \$reseed_repetitive_seeds,
-				 'score_min=s' => \$score_min,
-				 'most_valid_alignments=i' => \$most_valid_alignments,
-				 'p=i' => \$parallel,
-				 'temp_dir=s' => \$temp_dir,
-				 'rdg=s' => \$rdg,
-				 'rfg=s' => \$rfg,
-				 'non_bs_mm' => \$non_bs_mm,
-				 'samtools_path=s' => \$samtools_path,
-				 'bam' => \$bam,
-				 'gzip' => \$gzip,
-				 'pbat' => \$pbat,
-				 'prefix=s' => \$prefix,
-				 'old_flag' => \$old_flag,
-				);
-
-
-  ### EXIT ON ERROR if there were errors with any of the supplied options
-  unless ($command_line){
-    die "Please respecify command line options\n";
-  }
-  ### HELPFILE
-  if ($help){
-    print_helpfile();
-    exit;
-  }
-  if ($version){
-    print << "VERSION";
-
-
-          Bismark - Bisulfite Mapper and Methylation Caller.
-
-                       Bismark Version: $bismark_version 
-        Copyright 2010-13 Felix Krueger, Babraham Bioinformatics
-              www.bioinformatics.babraham.ac.uk/projects/
-
-
-VERSION
-    exit;
-  }
-
-
-  ##########################
-  ### PROCESSING OPTIONS ###
-  ##########################
-
-  unless ($bowtie2){
-    $bowtie2 = 0;
-  }
-  unless ($sam_no_hd){
-    $sam_no_hd =0;
-  }
-
-  ### PATH TO BOWTIE
-  ### if a special path to Bowtie 1/2 was specified we will use that one, otherwise it is assumed that Bowtie 1/2 is in the PATH
-  if ($path_to_bowtie){
-    unless ($path_to_bowtie =~ /\/$/){
-      $path_to_bowtie =~ s/$/\//;
-    }
-    if (-d $path_to_bowtie){
-      if ($bowtie2){
-	$path_to_bowtie = "${path_to_bowtie}bowtie2";
-      }
-      else{
-	$path_to_bowtie = "${path_to_bowtie}bowtie";
-      }
-    }
-    else{
-      die "The path to bowtie provided ($path_to_bowtie) is invalid (not a directory)!\n";
-    }
-  }
-  else{
-    if ($bowtie2){
-      $path_to_bowtie = 'bowtie2';
-      warn "Path to Bowtie 2 specified as: $path_to_bowtie\n";  }
-    else{
-      $path_to_bowtie = 'bowtie';
-      warn "Path to Bowtie specified as: $path_to_bowtie\n";
-    }
-  }
-
-  ### OUTPUT REQUESTED AS BAM FILE
-  if ($bam){
-    if ($vanilla){
-      die "Specifying BAM output is not compatible with \"--vanilla\" format. Please respecify\n\n";
-    }
-
-    ### PATH TO SAMTOOLS
-    if (defined $samtools_path){
-      # if Samtools was specified as full command
-      if ($samtools_path =~ /samtools$/){
-	if (-e $samtools_path){
-	  # Samtools executable found
-	}
-	else{
-	  die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-	}
-      }
-      else{
-	unless ($samtools_path =~ /\/$/){
-	  $samtools_path =~ s/$/\//;
-	}
-	$samtools_path .= 'samtools';
-   	if (-e $samtools_path){
-	  # Samtools executable found
-	}
-	else{
-	  die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-	}
-      }
-
-      warn "Alignments will be written out in BAM format. Samtools path provided as: '$samtools_path'\n";
-      $bam = 1;
-    }
-    # Check whether Samtools is in the PATH if no path was supplied by the user
-    else{
-      if (!system "which samtools >/dev/null 2>&1"){ # STDOUT is binned, STDERR is redirected to STDOUT. Returns 0 if samtools is in the PATH
-	$samtools_path = `which samtools`;
-	chomp $samtools_path;
-	warn "Alignments will be written out in BAM format. Samtools found here: '$samtools_path'\n";
-	$bam = 1;
-      }
-    }
-
-    unless (defined $samtools_path){
-      $bam = 2;
-      warn "Did not find Samtools on the system. Alignments will be compressed with GZIP instead (.sam.gz)\n";
-    }
-    sleep (1);
-  }
-
-
-  ####################################
-  ### PROCESSING ARGUMENTS
-
-  ### GENOME FOLDER
-  my $genome_folder = shift @ARGV; # mandatory
-  unless ($genome_folder){
-    warn "Genome folder was not specified!\n";
-    print_helpfile();
-    exit;
-  }
-
-  ### checking that the genome folder, all subfolders and the required bowtie index files exist
-  unless ($genome_folder =~/\/$/){
-    $genome_folder =~ s/$/\//;
-  }
-
-  if (chdir $genome_folder){
-    my $absolute_genome_folder = getcwd; ## making the genome folder path absolute
-    unless ($absolute_genome_folder =~/\/$/){
-      $absolute_genome_folder =~ s/$/\//;
-    }
-    warn "Reference genome folder provided is $genome_folder\t(absolute path is '$absolute_genome_folder)'\n";
-    $genome_folder = $absolute_genome_folder;
-  }
-  else{
-    die "Failed to move to $genome_folder: $!\nUSAGE: bismark [options] <genome_folder> {-1 <mates1> -2 <mates2> | <singles>} [<hits>]    (--help for more details)\n";
-  }
-
-  my $CT_dir = "${genome_folder}Bisulfite_Genome/CT_conversion/";
-  my $GA_dir = "${genome_folder}Bisulfite_Genome/GA_conversion/";
-
-  if ($bowtie2){ ### Bowtie 2 (new)
-    ### checking the integrity of $CT_dir
-    chdir $CT_dir or die "Failed to move to directory $CT_dir: $!\n";
-    my @CT_bowtie_index = ('BS_CT.1.bt2','BS_CT.2.bt2','BS_CT.3.bt2','BS_CT.4.bt2','BS_CT.rev.1.bt2','BS_CT.rev.2.bt2');
-    foreach my $file(@CT_bowtie_index){
-      unless (-f $file){
-	die "The Bowtie 2 index of the C->T converted genome seems to be faulty ($file doesn't exist). Please run the bismark_genome_preparation before running Bismark\n";
-      }
-    }
-    ### checking the integrity of $GA_dir
-    chdir $GA_dir or die "Failed to move to directory $GA_dir: $!\n";
-    my @GA_bowtie_index = ('BS_GA.1.bt2','BS_GA.2.bt2','BS_GA.3.bt2','BS_GA.4.bt2','BS_GA.rev.1.bt2','BS_GA.rev.2.bt2');
-    foreach my $file(@GA_bowtie_index){
-      unless (-f $file){
-	die "The Bowtie 2 index of the G->A converted genome seems to be faulty ($file doesn't exist). Please run bismark_genome_preparation before running Bismark\n";
-      }
-    }
-  }
-
-  else{ ### Bowtie 1 (default)
-    ### checking the integrity of $CT_dir
-    chdir $CT_dir or die "Failed to move to directory $CT_dir: $!\n";
-    my @CT_bowtie_index = ('BS_CT.1.ebwt','BS_CT.2.ebwt','BS_CT.3.ebwt','BS_CT.4.ebwt','BS_CT.rev.1.ebwt','BS_CT.rev.2.ebwt');
-    foreach my $file(@CT_bowtie_index){
-      unless (-f $file){
-	die "The Bowtie index of the C->T converted genome seems to be faulty ($file doesn't exist). Please run bismark_genome_preparation before running Bismark.\n";
-      }
-    }
-    ### checking the integrity of $GA_dir
-    chdir $GA_dir or die "Failed to move to directory $GA_dir: $!\n";
-    my @GA_bowtie_index = ('BS_GA.1.ebwt','BS_GA.2.ebwt','BS_GA.3.ebwt','BS_GA.4.ebwt','BS_GA.rev.1.ebwt','BS_GA.rev.2.ebwt');
-    foreach my $file(@GA_bowtie_index){
-      unless (-f $file){
-	die "The Bowtie index of the G->A converted genome seems to be faulty ($file doesn't exist). Please run bismark_genome_preparation before running Bismark.\n";
-      }
-    }
-  }
-
-  my $CT_index_basename = "${CT_dir}BS_CT";
-  my $GA_index_basename = "${GA_dir}BS_GA";
-
-  ### INPUT OPTIONS
-
-  ### SEQUENCE FILE FORMAT
-  ### exits if both fastA and FastQ were specified
-  if ($fasta and $fastq){
-    die "Only one sequence filetype can be specified (fastA or fastQ)\n";
-  }
-
-  ### unless fastA is specified explicitely, fastQ sequence format is expected by default
-  if ($fasta){
-    print "FastA format specified\n";
-    $sequence_format = 'FASTA';
-    push @bowtie_options, '-f';
-  }
-  elsif ($fastq){
-    print "FastQ format specified\n";
-    $sequence_format = 'FASTQ';
-    push @bowtie_options, '-q';
-  }
-  else{
-    $fastq = 1;
-    print "FastQ format assumed (by default)\n";
-    $sequence_format = 'FASTQ';
-    push @bowtie_options, '-q';
-  }
-
-  ### SKIP
-  if ($skip){
-    warn "Skipping the first $skip reads from the input file\n";
-    # push @bowtie_options,"-s $skip";
-  }
-
-  ### UPTO
-  if ($qupto){
-    warn "Processing sequences up to read no. $qupto from the input file\n";
-    if ($bowtie2){
-      #      push @bowtie_options,"--upto $qupto"; ## slightly changed for Bowtie 2
-    }
-    else{
-      #     push @bowtie_options,"--qupto $qupto";
-    }
-  }
-
-  ### QUALITY VALUES
-  if (($phred33 and $phred64) or ($phred33 and $solexa) or ($phred64 and $solexa)){
-    die "You can only specify one type of quality value at a time! (--phred33-quals or --phred64-quals or --solexa-quals)";
-  }
-  if ($phred33){ ## if nothing else is specified $phred33 will be used as default by both Bowtie 1 and 2.
-    # Phred quality values work only when -q is specified
-    unless ($fastq){
-      die "Phred quality values works only when -q (FASTQ) is specified\n";
-    }
-    if ($bowtie2){
-      push @bowtie_options,"--phred33";
-    }
-    else{
-      push @bowtie_options,"--phred33-quals";
-    }
-  }
-  if ($phred64){
-    # Phred quality values work only when -q is specified
-    unless ($fastq){
-      die "Phred quality values work only when -q (FASTQ) is specified\n";
-    }
-    if ($bowtie2){
-      push @bowtie_options,"--phred64";
-    }
-    else{
-      push @bowtie_options,"--phred64-quals";
-    }
-  }
-  else{
-    $phred64 = 0;
-  }
-
-  if ($solexa){
-    if ($bowtie2){
-      die "The option '--solexa-quals' is not compatible with Bowtie 2. Please respecify!\n";
-    }
-    # Solexa to Phred value conversion works only when -q is specified
-    unless ($fastq){
-      die "Conversion from Solexa to Phred quality values works only when -q (FASTQ) is specified\n";
-    }
-    push @bowtie_options,"--solexa-quals";
-  }
-  else{
-    $solexa = 0;
-  }
-
-  ### ALIGNMENT OPTIONS
-
-  ### MISMATCHES
-  if (defined $mismatches){
-    if ($bowtie2){
-      if ($mismatches == 0 or $mismatches == 1){
-	push @bowtie_options,"-N $mismatches";
-      }
-      else{
-	die "Please set the number of multiseed mismatches for Bowtie 2 with '-N <int>' (where <int> can be 0 or 1)\n";
-      }
-    }
-    else{
-      if ($mismatches >= 0 and $mismatches <= 3){
-	push @bowtie_options,"-n $mismatches";
-      }
-      else{
-	die "Please set the number of seed mismatches for Bowtie 1 with '-n <int>' (where <int> can be 0,1,2 or 3)\n";
-      }
-    }
-  }
-  else{
-    unless ($bowtie2){
-      push @bowtie_options,"-n 1"; # setting -n to 1 by default (for use with Bowtie only) because it is much quicker than the default mode of -n 2
-    }
-  }
-
-  ### SEED LENGTH
-  if (defined $seed_length){
-    if ($bowtie2){
-      push @bowtie_options,"-L $seed_length";
-    }
-    else{
-      push @bowtie_options,"-l $seed_length";
-    }
-  }
-
-  ### MISMATCH CEILING
-  if (defined $ceiling){
-    die "The option '-e' is not compatible with Bowtie 2. Please respecify options\n" if ($bowtie2);
-    push @bowtie_options,"-e $ceiling";
-  }
-
-
-  ### BOWTIE 2 EFFORT OPTIONS
-
-  ### CONSECUTIVE SEED EXTENSION FAILS
-  if (defined $seed_extension_fails){
-    die "The option '-D <int>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    push @bowtie_options,"-D $seed_extension_fails";
-  }
-
-  ### RE-SEEDING REPETITIVE SEEDS
-  if (defined $reseed_repetitive_seeds){
-    die "The option '-R <int>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    push @bowtie_options,"-R $reseed_repetitive_seeds";
-  }
-
-
-  ### BOWTIE 2 SCORING OPTIONS
-  if ($score_min){
-    die "The option '--score_min <func>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    unless ($score_min =~ /^L,.+,.+$/){
-      die "The option '--score_min <func>' needs to be in the format <L,value,value> . Please consult \"setting up functions\" in the Bowtie 2 manual for further information\n\n";
-    }
-    push @bowtie_options,"--score-min $score_min";
-  }
-  else{
-    if ($bowtie2){
-      push @bowtie_options,"--score-min L,0,-0.2"; # default setting, more stringent than normal Bowtie2
-    }
-  }
-
-  ### BOWTIE 2 READ GAP OPTIONS
-  my ($insertion_open,$insertion_extend,$deletion_open,$deletion_extend);
-
-  if ($rdg){
-    die "The option '--rdg <int1>,<int2>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    if ($rdg =~ /^(\d+),(\d+)$/){
-      $deletion_open = $1;
-      $deletion_extend = $2;
-    }
-    else{
-      die "The option '--rdg <int1>,<int2>' needs to be in the format <integer,integer> . Please consult \"setting up functions\" in the Bowtie 2 manual for further information\n\n";
-    }
-    push @bowtie_options,"--rdg $rdg";
-  }
-  else{
-    $deletion_open = 5;
-    $deletion_extend = 3;
-  }
-
-  ### BOWTIE 2 REFERENCE GAP OPTIONS
-  if ($rfg){
-    die "The option '--rfg <int1>,<int2>' is only available when using Bowtie 2\n\n" unless ($bowtie2);
-    if ($rfg =~ /^(\d+),(\d+)$/){
-      $insertion_open = $1;
-      $insertion_extend = $2;
-    }
-    else{
-      die "The option '--rfg <int1>,<int2>' needs to be in the format <integer,integer> . Please consult \"setting up functions\" in the Bowtie 2 manual for further information\n\n";
-    }
-    push @bowtie_options,"--rfg $rfg";
-  }
-  else{
-    $insertion_open = 5;
-    $insertion_extend = 3;
-  }
-
-
-  ### BOWTIE 2 PARALLELIZATION OPTIONS
-  if (defined $parallel){
-    die "The parallelization switch '-p' only works for Bowtie 2. Please respecify!" unless ($bowtie2);
-  }
-  if ($bowtie2){
-    if ($parallel){
-      die "Please select a value for -p of 2 or more!\n" unless ($parallel > 1);
-      push @bowtie_options,"-p $parallel";
-      push @bowtie_options,'--reorder'; ## re-orders the bowtie 2 output so that it does match the input files. This is abolutely required for parallelization to work.
-      print "Each Bowtie 2 instance is going to be run with $parallel threads. Please monitor performance closely and tune down if needed!\n";
-      sleep (2);
-    }
-  }
-
-  ### REPORTING OPTIONS
-
-  if ($bowtie2){
-    push @bowtie_options,'--ignore-quals'; ## All mismatches will receive penalty for mismatches as if they were of high quality, which is 6 by default
-
-    ### Option -M is deprecated since Bowtie 2 version 2.0.0 beta7. I'll leave this option commented out for a while
-    if(defined $most_valid_alignments){
-
-      warn "\nThe option -M is now deprecated (as of Bowtie 2 version 2.0.0 beta7). What used to be called -M mode is still the default mode. Use the -D and -R options to adjust the effort expended to find valid alignments.\n\n";
-      #      push @bowtie_options,"-M $most_valid_alignments";sleep (5);
-    }
-    #  else{
-    #    push @bowtie_options,'-M 10';    # the default behavior for Bowtie 2 is to report (and sort) up to 500 alignments for a given sequence
-    #  }
-  }
-  else{ # Because of the way Bismark works we will always use the reporting option -k 2 (report up to 2 valid alignments) for Bowtie 1
-    push @bowtie_options,'-k 2';
-  }
-
-  ### --BEST
-  if ($bowtie2){
-    if ($best){    # Bowtie 2 does away with the concept of --best, so one can also not select --no-best when Bowtie 2 is to be used
-      die "The option '--no-best' is not compatible with Bowtie 2. Please respecify options\n";
-    }
-  }
-  else{
-    # --best is the default option for Bowtie 1, specifying --no-best can turn it off (e.g. to speed up alignment process)
-    unless ($best){
-      push @bowtie_options,'--best';
-    }
-  }
-
-  ### VANILLA BISMARK (BOWTIE 1) OUTPUT
-  if ($vanilla){
-    if ($bowtie2){
-      die "The options --bowtie2 and the --vanilla are not compatible. Please respecify!\n\n";
-    }
-  }
-  else{
-    $vanilla = 0;
-  }
-
-  ### PAIRED-END MAPPING
-  if ($mates1){
-    my @mates1 = (split (/,/,$mates1));
-    die "Paired-end mapping requires the format: -1 <mates1> -2 <mates2>, please respecify!\n" unless ($mates2);
-    my @mates2 = (split(/,/,$mates2));
-    unless (scalar @mates1 == scalar @mates2){
-      die "Paired-end mapping requires the same amounnt of mate1 and mate2 files, please respecify! (format: -1 <mates1> -2 <mates2>)\n";
-    }
-    while (1){
-      my $mate1 = shift @mates1;
-      my $mate2 = shift @mates2;
-      last unless ($mate1 and $mate2);
-      push @filenames,"$mate1,$mate2";
-    }
-    if ($bowtie2){
-      push @bowtie_options,'--no-mixed';     ## By default Bowtie 2 is not looking for single-end alignments if it can't find concordant or discordant alignments
-      push @bowtie_options,'--no-discordant';## By default Bowtie 2 is not looking for discordant alignments if it can't find concordant ones
-    }
-
-    if ($old_flag){
-      warn "\nUsing FLAG values for paired-end SAM output used up to Bismark v0.8.2. In addition, paired-end sequences will have /1 and /2 appended to their read IDs\n\n" unless($vanilla);
-      sleep(3);
-    }
-  }
-  elsif ($mates2){
-    die "Paired-end mapping requires the format: -1 <mates1> -2 <mates2>, please respecify!\n";
-  }
-
-  ### SINGLE-END MAPPING
-  # Single-end mapping will be performed if no mate pairs for paired-end mapping have been specified
-  my $singles;
-  unless ($mates1 and $mates2){
-    $singles = join (',',@ARGV);
-    unless ($singles){
-      die "\nNo filename supplied! Please specify one or more files for single-end Bismark mapping!\n";
-    }
-    $singles =~ s/\s/,/g;
-    @filenames = (split(/,/,$singles));
-    warn "\nFiles to be analysed:\n";
-    warn "@filenames\n\n";
-    sleep (3);
-  }
-
-  ### MININUM INSERT SIZE (PAIRED-END ONLY)
-  if (defined $minins){
-    die "-I/--minins can only be used for paired-end mapping!\n\n" if ($singles);
-    push @bowtie_options,"--minins $minins";
-  }
-
-  ### MAXIMUM INSERT SIZE (PAIRED-END ONLY)
-  if (defined $maxins){
-    die "-X/--maxins can only be used for paired-end mapping!\n\n" if ($singles);
-    push @bowtie_options,"--maxins $maxins";
-  }
-  else{
-    unless ($singles){
-      push @bowtie_options,'--maxins 500';
-    }
-  }
-
-  ### QUIET prints nothing  besides alignments (suppresses warnings)
-  if ($quiet){
-    push @bowtie_options,'--quiet';
-  }
-
-  ### CHUNKMBS needed to be increased to avoid memory exhaustion warnings for Bowtie 1, particularly for --best (and paired-end) alignments
-  unless ($bowtie2){ # Bowtie 2 does not have a chunkmbs option
-    if (defined $chunk){
-      push @bowtie_options,"--chunkmbs $chunk";
-    }
-    else{
-      push @bowtie_options,'--chunkmbs 512'; ## setting the default to 512MB (up from 64 default)
-    }
-  }
-
-
-  ### SUMMARY OF ALL BOWTIE OPTIONS
-  my $bowtie_options = join (' ',@bowtie_options);
-
-
-  ### STRAND-SPECIFIC LIBRARIES
-  my $directional;
-  if ($non_directional){
-    die "A library can only be specified to be either non-directional or a PBAT-Seq library. Please respecify!\n\n" if ($pbat);
-    warn "Library was specified to be not strand-specific (non-directional), therefore alignments to all four possible bisulfite strands (OT, CTOT, OB and CTOB) will be reported\n";
-    sleep (3);
-    $directional = 0;
-  }
-  elsif($pbat){
-    die "The option --pbat is currently not compatible with --gzip. Please run alignments with uncompressed temporary files, i.e. lose the option --gzip\n" if ($gzip);
-    die "The option --pbat is currently not working for Bowtie 2. Please run alignments in default (i.e. Bowtie 1) mode!\n" if ($bowtie2);
-    die "The option --pbat is currently only working with FastQ files. Please respecify (i.e. lose the option -f)!\n" if ($fasta);
-
-    warn "Library was specified as PBAT-Seq (Post-Bisulfite Adapter Tagging), only performing alignments to the complementary strands (CTOT and CTOB)\n";
-    sleep (3);
-    $directional = 0;
-  }
-  else{
-    warn "Library is assumed to be strand-specific (directional), alignments to strands complementary to the original top or bottom strands will be ignored (i.e. not performed!)\n";
-    sleep (3);
-    $directional = 1; # default behaviour
-  }
-
-  ### UNMAPPED SEQUENCE OUTPUT
-  $unmapped = 0 unless ($unmapped);
-
-  ### AMBIGUOUS ALIGNMENT SEQUENCE OUTPUT
-  $multi_map = 0 unless ($multi_map);
-
-
-  ### OUTPUT DIRECTORY
-
-  chdir $parent_dir or die "Failed to move back to current working directory\n";
-  if ($output_dir){
-    unless ($output_dir =~ /\/$/){
-      $output_dir =~ s/$/\//;
-    }
-
-    if (chdir $output_dir){
-      $output_dir = getcwd; #  making the path absolute
-      unless ($output_dir =~ /\/$/){
-	$output_dir =~ s/$/\//;
-      }
-    }
-    else{
-      mkdir $output_dir or die "Unable to create directory $output_dir $!\n";
-      warn "Created output directory $output_dir!\n\n";
-      chdir $output_dir or die "Failed to move to $output_dir\n";
-      $output_dir = getcwd; #  making the path absolute
-      unless ($output_dir =~ /\/$/){
-	$output_dir =~ s/$/\//;
-      }
-    }
-    warn "Output will be written into the directory: $output_dir\n";
-  }
-  else{
-    $output_dir = '';
-  }
-
-  ### TEMPORARY DIRECTORY for C->T and G->A transcribed files
-
-  chdir $parent_dir or die "Failed to move back to current working directory\n";
-  if ($temp_dir){
-    warn "\nUsing temp directory: $temp_dir\n";
-    unless ($temp_dir =~ /\/$/){
-      $temp_dir =~ s/$/\//;
-    }
-
-    if (chdir $temp_dir){
-      $temp_dir = getcwd; #  making the path absolute
-      unless ($temp_dir =~ /\/$/){
-	$temp_dir =~ s/$/\//;
-      }
-    }
-    else{
-      mkdir $temp_dir or die "Unable to create directory $temp_dir $!\n";
-      warn "Created temporary directory $temp_dir!\n\n";
-      chdir $temp_dir or die "Failed to move to $temp_dir\n";
-      $temp_dir = getcwd; #  making the path absolute
-      unless ($temp_dir =~ /\/$/){
-	$temp_dir =~ s/$/\//;
-      }
-    }
-    warn "Temporary files will be written into the directory: $temp_dir\n";
-  }
-  else{
-    $temp_dir = '';
-  }
-
-  ### OPTIONAL NON-BS MISMATCH OUTPUT AS EXTRA COLUMN IN SAM FILE
-  if ($non_bs_mm){
-    if ($vanilla){
-      die "Option '--non_bs_mm' may only be specified for output in SAM format. Please respecify!\n";
-    }
-  }
-
-  ### PREFIX FOR OUTPUT FILES
-  if ($prefix){
-    # removing trailing dots
-
-    $prefix =~ s/\.+$//;
-
-    warn "Using the following prefix for output files: $prefix\n\n";
-    sleep(1);
-  }
-
-
-  return ($genome_folder,$CT_index_basename,$GA_index_basename,$path_to_bowtie,$sequence_format,$bowtie_options,$directional,$unmapped,$multi_map,$phred64,$solexa,$output_dir,$bowtie2,$vanilla,$sam_no_hd,$skip,$qupto,$temp_dir,$non_bs_mm,$insertion_open,$insertion_extend,$deletion_open,$deletion_extend,$gzip,$bam,$samtools_path,$pbat,$prefix,$old_flag);
-}
-
-
-
-sub generate_SAM_header{
-  print OUT "\@HD\tVN:1.0\tSO:unsorted\n";          # @HD = header, VN = version, SO = sort order
-  foreach my $chr (keys %chromosomes){
-    my $length = length ($chromosomes{$chr});
-    print OUT "\@SQ\tSN:$chr\tLN:$length\n";        # @SQ = sequence, SN = seq name, LN = length
-  }
-  print OUT "\@PG\tID:Bismark\tVN:$bismark_version\tCL:\"bismark $command_line\"\n";        # @PG = program, ID = unique identifier, PN = program name name, VN = program version
-}
-
-### I would like to thank the following individuals for their valuable contributions to the Bismark SAM output format:
-### O. Tam (Sep 2010), C. Whelan (2011), E. Vidal (2011), T. McBryan (2011), P. Hickey (2011)
-
-sub single_end_SAM_output{
-  my ($id,$actual_seq,$methylation_call_params,$qual) = @_;
-  my $strand            = $methylation_call_params->{$id}->{alignment_strand};
-  my $chr               = $methylation_call_params->{$id}->{chromosome};	
-  my $start             = $methylation_call_params->{$id}->{position};	
-  my $stop              = $methylation_call_params->{$id}->{end_position};	
-  my $ref_seq           = $methylation_call_params->{$id}->{unmodified_genomic_sequence};
-  my $methcall          = $methylation_call_params->{$id}->{methylation_call};
-  my $read_conversion   = $methylation_call_params->{$id}->{read_conversion};
-  my $genome_conversion = $methylation_call_params->{$id}->{genome_conversion};
-  my $number_of_mismatches;
-  if ($bowtie2){
-    $number_of_mismatches= $methylation_call_params->{$id}->{alignment_score};	
-  }
-  else{
-    $number_of_mismatches= $methylation_call_params->{$id}->{number_of_mismatches};
-  }
-
-  ### This is a description of the bitwise FLAG field which needs to be set for the SAM file taken from: "The SAM Format Specification (v1.4-r985), September 7, 2011"
-  ## FLAG: bitwise FLAG. Each bit is explained in the following table:
-  ## Bit    Description                                                Comment                                Value
-  ## 0x1    template has multiple segments in sequencing               0: single-end 1: paired end            value: 2**0 (  1)
-  ## 0x2    each segment properly aligned according to the aligner     true only for paired-end alignments    value: 2**1 (  2)
-  ## 0x4    segment unmapped                                           ---                                           ---
-  ## 0x8    next segment in the template unmapped                      ---                                           ---
-  ## 0x10   SEQ being reverse complemented                                                                    value: 2**4 ( 16)
-  ## 0x20   SEQ of the next segment in the template being reversed                                            value: 2**5 ( 32)
-  ## 0x40   the first segment in the template                          read 1                                 value: 2**6 ( 64)
-  ## 0x80   the last segment in the template                           read 2                                 value: 2**7 (128)
-  ## 0x100  secondary alignment                                        ---                                           ---
-  ## 0x200  not passing quality controls                               ---                                           ---
-  ## 0x400  PCR or optical duplicate                                   ---                                           ---
-
-  #####
-
-  my $flag;                                                           # FLAG variable used for SAM format.
-  if ($strand eq "+"){
-    if ($read_conversion eq 'CT' and $genome_conversion eq 'CT'){
-      $flag = 0;                                                      # 0 for "+" strand (OT)
-    }
-    elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA'){
-      $flag = 16;                                                     # 16 for "-" strand (CTOB, yields information for the original bottom strand)
-    }
-    else{
-      die "Unexpected strand and read/genome conversion: strand: $strand, read conversion: $read_conversion, genome_conversion: $genome_conversion\n\n";
-    }
-  }
-  elsif ($strand eq "-"){
-    if ($read_conversion eq 'CT' and $genome_conversion eq 'GA'){
-      $flag = 16;                                                     # 16 for "-" strand (OB)
-    }
-    elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT'){
-      $flag = 0;                                                      # 0 for "+" strand (CTOT, yields information for the original top strand)
-    }
-    else{
-      die "Unexpected strand and read/genome conversion: strand: $strand, read conversion: $read_conversion, genome_conversion: $genome_conversion\n\n";
-    }
-  }
-  else{
-    die "Unexpected strand information: $strand\n\n";
-  }
-
-  #####
-
-  my $mapq = 255;                                                     # Assume mapping quality is unavailable
-
-  #####
-
-  my $cigar;
-  if ($bowtie2){
-    $cigar = $methylation_call_params->{$id}->{CIGAR};                # Actual CIGAR string reported by Bowtie 2
-  }
-  else{
-    $cigar = length($actual_seq) . "M";                               # Bowtie 1 output does not contain indels (only matches and mismatches)
-  }
-
-  #####	
-
-  my $rnext = "*";                                                    # Paired-end variable
-
-  #####
-
-  my $pnext = 0;                                                      # Paired-end variable
-
-  #####
-
-  my $tlen = 0;                                                       # Paired-end variable
-
-  #####
-
-  if ($read_conversion eq 'CT'){
-    $ref_seq = substr($ref_seq, 0, length($ref_seq) - 2);    # Removes additional nucleotides from the 3' end. This only works for the original top or bottom strands
-  }
-  else{
-    $ref_seq = substr($ref_seq, 2, length($ref_seq) - 2);    # Removes additional nucleotides from the 5' end. This works for the complementary strands in non-directional libraries
-  }
-
-  if ($strand eq '-'){
-    $actual_seq = revcomp($actual_seq);                               # Sequence represented on the forward genomic strand
-    $ref_seq = revcomp($ref_seq);                                     # Required for comparison with actual sequence
-    $qual = reverse $qual;                                            # if the sequence was reverse-complemented the quality string needs to be reversed as well
-  }
-
-  #####
-
-  my $hemming_dist = hemming_dist($actual_seq,$ref_seq);              # Edit distance to the reference, i.e. minimal number of one-nucleotide edits needed to transform the read string
-                                                                      # into the reference string. hemming_dist()
-  if ($bowtie2){
-    $hemming_dist += $methylation_call_params->{$id}->{indels};       # Adding the number of inserted/deleted bases which we parsed while getting the genomic sequence
-  }
-
-  my $NM_tag = "NM:i:$hemming_dist";                                  # Optional tag NM: edit distance based on nucleotide differences
-
-  #####
-
-  my $XX_tag = make_mismatch_string($actual_seq, $ref_seq);           # Optional tag XX: string providing mismatched reference bases in the alignment (NO indel information!)
-
-  #####
-
-  my $XM_tag;                                                         # Optional tag XM: Methylation Call String
-  if ($strand eq '+'){
-    $XM_tag = "XM:Z:$methcall";
-  }
-  elsif ($strand eq '-'){
-    $XM_tag = 'XM:Z:'.reverse $methcall;                              # if the sequence was reverse-complemented the methylation call string needs to be reversed as well
-  }
-
-  #####
-
-  my $XR_tag = "XR:Z:$read_conversion";                               # Optional tag XR: Read Conversion
-
-  #####
-
-  my $XG_tag = "XG:Z:$genome_conversion";                             # Optional tag XG: Genome Conversion
-
-  #####
-
-  # Optionally calculating number of mismatches for Bowtie 2 alignments
-
-  if ($non_bs_mm) {
-    if ($bowtie2) {
-
-      $number_of_mismatches =~ s/-//; # removing the minus sign	
-	
-	### if Bowtie 2 was used we need to analyse the CIGAR string whether the read contained any indels to determine the number of mismatches
-	if ($cigar =~ /(D|I)/) {
-	  # warn "$cigar\n";
-	  
-	  # parsing CIGAR string
-	  my @len = split (/\D+/,$cigar); # storing the length per operation
-	  my @ops = split (/\d+/,$cigar); # storing the operation
-	  shift @ops;		# remove the empty first element
-	  die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-	
-	  foreach (0..$#len) {
-	    if ($ops[$_] eq 'M') {
-	      # warn "skipping\n";
-	      next;		# irrelevant
-	    }
-	    elsif ($ops[$_] eq 'I') {	# insertion in the read sequence
-	      $number_of_mismatches -= $insertion_open;
-	      $number_of_mismatches -= $len[$_] * $insertion_extend;
-	      # warn "Insertion: Subtracting $ops[$_], length $len[$_], open: $insertion_open, extend: $insertion_extend\n";
-	    }
-	    elsif ($ops[$_] eq 'D') {	# deletion in the read sequence
-	      $number_of_mismatches -= $deletion_open;
-	      $number_of_mismatches -= $len[$_] * $deletion_extend;
-	      # warn "Deletion: Subtracting $ops[$_], length $len[$_], open: $deletion_open, extend: $deletion_extend\n";
-	    }
-	    elsif ($cigar =~ tr/[NSHPX=]//) {	# if these (for standard mapping) illegal characters exist we die
-	      die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-	    }
-	    else {
-	      die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar\n";
-	    }
-	  }
-	  # warn "Alignment score $number_of_mismatches\n";
-	  # print "Mismatches $number_of_mismatches\n\n";
-	}
-      ### Now we have InDel corrected alignment scores
-
-      ### if the actual sequence contained Ns we need to adjust the number of mismatches. Ns receive a penalty of -1, but normal mismatches receive -6. This might still break if the
-      ### sequence contained more than 5 Ns, but this should occur close to never
-
-      my $seq_N_count = $number_of_mismatches % 6; # modulo 6 will return the integer rest after the division
-      # warn "N count: $seq_N_count\n";
-      $number_of_mismatches = int ($number_of_mismatches / 6) + $seq_N_count;
-      # warn "MM    $number_of_mismatches\n";
-    }
-  }
-
-  ####
-
-  my $XA_tag = "XA:Z:$number_of_mismatches";
-
-  #####
-
-  # SAM format: QNAME, FLAG, RNAME, 1-based POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL, optional fields
-  ### optionally print number of non-bisulfite mismatches
-  if ($non_bs_mm){
-    print OUT join("\t",($id,$flag,$chr,$start,$mapq,$cigar,$rnext,$pnext,$tlen,$actual_seq,$qual,$NM_tag,$XX_tag,$XM_tag,$XR_tag,$XG_tag,$XA_tag)),"\n";
-  }
-  else{ # default
-    # SAM format: QNAME, FLAG, RNAME, 1-based POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL, optional fields
-    print OUT join("\t",($id,$flag,$chr,$start,$mapq,$cigar,$rnext,$pnext,$tlen,$actual_seq,$qual,$NM_tag,$XX_tag,$XM_tag,$XR_tag,$XG_tag)),"\n";
-  }
-}
-
-sub paired_end_SAM_output{
-  my ($id,$actual_seq_1,$actual_seq_2,$methylation_call_params,$qual_1,$qual_2) = @_;
-  my $strand_1                = $methylation_call_params->{$id}->{alignment_read_1}; # Bowtie 1 only reports the read 1 alignment strand
-  my $strand_2                = $methylation_call_params->{$id}->{alignment_read_2};
-  my $chr                     = $methylation_call_params->{$id}->{chromosome};	
-  my $ref_seq_1               = $methylation_call_params->{$id}->{unmodified_genomic_sequence_1};
-  my $ref_seq_2               = $methylation_call_params->{$id}->{unmodified_genomic_sequence_2};
-  my $methcall_1              = $methylation_call_params->{$id}->{methylation_call_1};
-  my $methcall_2              = $methylation_call_params->{$id}->{methylation_call_2};
-  my $read_conversion_1       = $methylation_call_params->{$id}->{read_conversion_1};
-  my $read_conversion_2       = $methylation_call_params->{$id}->{read_conversion_2};
-  my $genome_conversion       = $methylation_call_params->{$id}->{genome_conversion};
-
-  my $id_1;
-  my $id_2;
-
-  if ($old_flag){
-    $id_1 = $id.'/1';
-    $id_2 = $id.'/2';
-  }
-  else{
-    $id_1 = $id; # appending /1 or /2 confuses some downstream programs such as Picard
-    $id_2 = $id;
-  }
-
-  # Allows all degenerate nucleotide sequences in reference genome
-  die "Reference sequence ($ref_seq_1) contains invalid nucleotides!\n" if $ref_seq_1 =~ /[^ACTGNRYMKSWBDHV]/i;
-  die "Reference sequence ($ref_seq_2) contains invalid nucleotides!\n" if $ref_seq_2 =~ /[^ACTGNRYMKSWBDHV]/i;
-
-  my $index; # used to store the srand origin of the alignment in a less convoluted way
-
-  if ($read_conversion_1 eq 'CT' and $genome_conversion eq 'CT'){
-    $index = 0; ## this is OT   (original top strand)
-  }	
-  elsif ($read_conversion_1 eq 'GA' and $genome_conversion eq 'GA'){
-    $index = 1; ## this is CTOB (complementary to OB)
-  }
-  elsif ($read_conversion_1 eq 'GA' and $genome_conversion eq 'CT'){
-    $index = 2; ## this is CTOT (complementary to OT)
-  }
-  elsif ($read_conversion_1 eq 'CT' and $genome_conversion eq 'GA'){
-    $index = 3; ## this is OB   (original bottom)
-  }
-  else {
-    die "Unexpected combination of read 1 and genome conversion: $read_conversion_1 / $genome_conversion\n";
-  }
-
-  my $number_of_mismatches_1;
-  my $number_of_mismatches_2;
-
-  if ($bowtie2){ # Bowtie 2 reports always as read 1 then read 2, so this is fine
-    $number_of_mismatches_1  = $methylation_call_params->{$id}->{alignment_score_1}; # only needed for custom allele-specific output, not the default!
-    $number_of_mismatches_2  = $methylation_call_params->{$id}->{alignment_score_2};
-  }
-  else{ # Bowtie 1 reports always the leftmost read first. That means we have to reverse the strings if the first read aligned in reverse orientation
-    if ($index == 2 or $index == 3){ # CTOT or OB
-      $number_of_mismatches_1  = $methylation_call_params->{$id}->{number_of_mismatches_2}; # only needed for custom allele-specific output, not the default!
-      $number_of_mismatches_2  = $methylation_call_params->{$id}->{number_of_mismatches_1};
-    }
-    else{ # if the first read aligned in forward direction it is like for Bowtie 2
-      $number_of_mismatches_1  = $methylation_call_params->{$id}->{number_of_mismatches_1}; # only needed for custom allele-specific output, not the default!
-      $number_of_mismatches_2  = $methylation_call_params->{$id}->{number_of_mismatches_2};
-    }
-  }
-
-
-	
-  ### we need to remove 2 bp of the genomic sequence as we were extracting read + 2bp long fragments to make a methylation call at the
-  ### first or last position.
-
-  if ($index == 0 or $index == 3){ # OT or OB
-    $ref_seq_1 = substr($ref_seq_1,0,length($ref_seq_1)-2);
-    $ref_seq_2 = substr($ref_seq_2,2,length($ref_seq_2)-2);
-  }
-  else{ # CTOT or CTOB
-    $ref_seq_1 = substr($ref_seq_1,2,length($ref_seq_1)-2);
-    $ref_seq_2 = substr($ref_seq_2,0,length($ref_seq_2)-2);
-  }
-
-  #####
-
-  my $start_read_1;
-  my $start_read_2;
-  # adjusting end positions
-
-  if ($bowtie2){
-    $start_read_1 = $methylation_call_params->{$id}->{position_1};
-    $start_read_2 = $methylation_call_params->{$id}->{position_2};
-  }
-  else{ # Bowtie 1 output. $strand_1 stores the alignment of Read 1
-    if ($strand_1 eq '+'){ # Read 1 aligns to the + strand
-      $start_read_1 = $methylation_call_params->{$id}->{start_seq_1};
-      $start_read_2 = $methylation_call_params->{$id}->{alignment_end} - length ($actual_seq_2) + 1;
-    }
-    else{ # read 1 is on the - strand
-      $start_read_1 = $methylation_call_params->{$id}->{alignment_end} - length ($actual_seq_1) + 1;
-      $start_read_2 = $methylation_call_params->{$id}->{start_seq_1};
-    }
-  }
-
-  #####
-
-  my $end_read_1;
-  my $end_read_2;
-  # adjusting end positions
-
-  if ($bowtie2){
-    $end_read_1 = $methylation_call_params->{$id}->{end_position_1};
-    $end_read_2 = $methylation_call_params->{$id}->{end_position_2};
-  }
-  else{ # Bowtie 1 output. $strand_1 stores the alignment of Read 1
-    if ($strand_1 eq '+'){ # Read 1 aligns to the + strand
-      $end_read_1 = $methylation_call_params->{$id}->{start_seq_1} + length ($actual_seq_1)-1;
-      $end_read_2 = $methylation_call_params->{$id}->{alignment_end};
-      }
-    else{
-      $end_read_1 = $methylation_call_params->{$id}->{alignment_end};
-      $end_read_2 = $methylation_call_params->{$id}->{start_seq_1} + length ($actual_seq_2)-1;
-    }
-  }
-
-  #####
-
-  ### This is a description of the bitwise FLAG field which needs to be set for the SAM file taken from: "The SAM Format Specification (v1.4-r985), September 7, 2011"
-  ## FLAG: bitwise FLAG. Each bit is explained in the following table:
-  ## Bit    Description                                                Comment                                Value
-  ## 0x1    template having multiple segments in sequencing            0: single-end 1: paired end            value: 2^^0 (  1)
-  ## 0x2    each segment properly aligned according to the aligner     true only for paired-end alignments    value: 2^^1 (  2)
-  ## 0x4    segment unmapped                                           ---                                           ---
-  ## 0x8    next segment in the template unmapped                      ---                                           ---
-  ## 0x10   SEQ being reverse complemented                             - strand alignment                     value: 2^^4 ( 16)
-  ## 0x20   SEQ of the next segment in the template being reversed     + strand alignment                     value: 2^^5 ( 32)
-  ## 0x40   the first segment in the template                          read 1                                 value: 2^^6 ( 64)
-  ## 0x80   the last segment in the template                           read 2                                 value: 2^^7 (128)
-  ## 0x100  secondary alignment                                        ---                                           ---
-  ## 0x200  not passing quality controls                               ---                                           ---
-  ## 0x400  PCR or optical duplicate                                   ---                                           ---
-
-  ### As the FLAG value do not consider that there might be 4 different bisulfite strands of DNA, we are trying to make FLAG tags which take the strand identity into account
-
-  # strands OT and CTOT will be treated as aligning to the top strand (both sequences are scored as aligning to the top strand)
-  # strands OB and CTOB will be treated as aligning to the bottom strand (both sequences are scored as reverse complemented sequences)
-
-  my $flag_1;                                                            # FLAG variable used for SAM format
-  my $flag_2;
-
-  ### The new default FLAG values have been suggested by Peter Hickey, Australia (PH)
-
-  if ($index == 0){       # OT
-    unless ($old_flag){
-      $flag_1 = 99;                                                      # PH: Read 1 is on the + strand and Read 2 is reversed  (1+2+32+64)
-      $flag_2 = 147;                                                     # PH: Read 2 is on - strand but informative for the OT  (1+2+16+128)
-    }
-    else{
-      $flag_1 = 67;                                                      # Read 1 is on the + strand  (1+2+64) (Read 2 is technically reverse-complemented, but we do not score it)
-      $flag_2 = 131;                                                     # Read 2 is on - strand but informative for the OT        (1+2+128)
-    }
-  }
-  elsif ($index == 1){    # CTOB
-    unless($old_flag){
-      $flag_1 = 83;                                                      # PH: Read 1 is on the - strand, mapped in proper pair and Read 1 is reversed  (1+2+16+64)
-      $flag_2 = 163;                                                     # PH: read 2 is on the - strand, mapped in proper pair and Read 1 is reversed  (1+2+32+128)
-    }
-    else{
-      $flag_1 = 115;                                                     # Read 1 is on the + strand, we score for OB  (1+2+16+32+64)
-      $flag_2 = 179;                                                     # Read 2 is on the - strand  (1+2+16+32+128)
-    }
-  }
-  elsif ($index == 2){    # CTOT
-    unless ($old_flag){
-      $flag_1 = 99;                                                      # PH: Read 1 is on the + strand and Read 2 is reversed  (1+2+32+64) 
-      $flag_2 = 147;                                                     # PH: Read 2 is on - strand but informative for the OT  (1+2+16+128) 
-    }
-    else{
-      $flag_1 = 67;                                                      # Read 1 is on the - strand (CTOT) strand, but we score it for OT (1+2+64)
-      $flag_2 = 131;                                                     # Read 2 is on the + strand, score it for OT (1+2+128)
-    }
-  }
-  elsif ($index == 3){    # OB
-    unless ($old_flag){
-      $flag_1 = 83;                                                      # PH: Read 1 is on the - strand, mapped in proper pair and Read 1 is reversed  (1+2+16+64)
-      $flag_2 = 163;                                                     # PH: read 2 is on the - strand, mapped in proper pair and Read 1 is reversed  (1+2+32+128)
-    }
-    else{
-      $flag_1 = 115;                                                     # Read 1 is on the - strand, we score for OB  (1+2+16+32+64)
-      $flag_2 = 179;                                                     # Read 2 is on the + strand  (1+2+16+32+128)
-    }
-  }
-
-  #####
-
-  my $mapq = 255;                                                      # Mapping quality is unavailable
-
-  #####
-
-  my $cigar_1;
-  my $cigar_2;
-
-  if ($bowtie2){
-    $cigar_1 = $methylation_call_params->{$id}->{CIGAR_1};             # Actual CIGAR string reported by Bowtie 2
-    $cigar_2 = $methylation_call_params->{$id}->{CIGAR_2};
-  }
-  else{
-    $cigar_1 = length($actual_seq_1) . "M";                            # Assume no indels for Bowtie 1  mapping (only matches and mismatches)
-    $cigar_2 = length($actual_seq_2) . "M";
-  }
-
-  #####
-
-  my $rnext = '=';                                                     # Chromosome of mate; applies to both reads
-
-  #####
-
-  my $pnext_1 = $start_read_2;                                         # Leftmost position of mate
-  my $pnext_2 = $start_read_1;
-
-  #####
-
-  my $tlen_1;                                                          # signed observed Template LENgth (or inferred fragment size)
-  my $tlen_2;
-
-  if ($bowtie2){
-
-    if ($start_read_1 <= $start_read_2){
-
-      # Read 1 alignment is leftmost
-
-      if ($end_read_2 >= $end_read_1){
-	
-	# ------------------------->     read 1   reads overlapping
-	#  <-------------------------    read 2
-	#
-	# or
-	#
-	# ------------------------->     read 1
-	#   <-----------------------     read 2   read 2 contained within read 1
-	#
-	# or
-	#
-	# ------------------------->     read 1   reads 1 and 2 exactly overlapping
-	# <-------------------------     read 2
-	#
-
-	# dovetailing of reads is not enabled for Bowtie 2 alignments
-
-	$tlen_1 = $end_read_2 - $start_read_1 + 1;                         # Leftmost read has a + sign,
-	$tlen_2 = $start_read_1 - $end_read_2 - 1;                         # Rightmost read has a - sign
-      }
-      elsif ($end_read_2 < $end_read_1){
-
-	# ------------------------->     read 1
-	#       <-----------             read 2   read 2 contained within read 1
-	#
-	# or
-	#
-	# ------------------------->     read 1
-	# <------------------------      read 2   read 2 contained within read 1
-
-	# start and end of read 2  are fully contained within read 1, using the length of read 1 for the TLEN variable
-	$tlen_1 = $end_read_1 - $start_read_1 + 1;          # Set to length of read 1   Leftmost read has a + sign,
-	$tlen_2 = ($end_read_1 - $start_read_1 + 1) * -1;   # Set to length of read 1   Rightmost read has a - sign. well this is debatable. Changed this
-                                                            ### as a request by frozenlyse on SeqAnswers on 24 July 2013
-      }
-
-    }
-
-    elsif ($start_read_2 < $start_read_1){
-
-      if ($end_read_1 >= $end_read_2){
-
-      # Read 2 alignment is leftmost
-
-	# ------------------------->     read 2   reads overlapping
-	#  <-------------------------    read 1
-	#
-	# or
-	#
-	# ------------------------->     read 2
-	#   <-----------------------     read 1   read 1 contained within read 2
-	#
-	#
-
-	$tlen_2 = $end_read_1 - $start_read_2 + 1;                         # Leftmost read has a + sign,
-	$tlen_1 = $start_read_2 - $end_read_1 - 1;                         # Rightmost read has a - sign
-      }
-      elsif ($end_read_1 < $end_read_2){
-
-	# ------------------------->     read 2
-	#       <-----------             read 1   read 1 contained within read 2
-	#
-	# or
-	#
-	# ------------------------->     read 2
-	#  <------------------------      read 1   read 1 contained within read 2
-	
-	# start and end of read 1  are fully contained within read 2, using the length of read 2 for the TLEN variable
-	$tlen_1 = ($end_read_2 - $start_read_2 + 1) * -1;          # Set to length of read 2   Shorter read receives a - sign,
-	$tlen_2 = $end_read_2 - $start_read_2 + 1;                 # Set to length of read 2   Longer read receives a +. Well this is debatable. Changed this
-	                                                           ### as a request by frozenlyse on SeqAnswers on 24 July 2013
-     }
-    }
-  }
-
-  else{ # Bowtie 1
-
-    if ($end_read_2 >= $end_read_1){
-      # Read 1 alignment is leftmost
-      # ------------------------->  read 1
-      #  <------------------------- read 2
-      # this is the most extreme case for Bowtie 1 alignments, reads do not contain each other, also no dovetailing
-
-      $tlen_1 = $end_read_2 - $start_read_1 + 1;                         # Leftmost read has a + sign,
-      $tlen_2 = $start_read_1 - $end_read_2 - 1;                         # Rightmost read has a - sign
-    }
-    else{
-      # Read 2 alignment is leftmost
-      # ------------------------->  read 2
-      #  <------------------------- read 1
-      # this is the most extreme case for Bowtie 1 alignments, reads do not contain each other, also no dovetailing
-
-      $tlen_2 = $end_read_1 - $start_read_2 + 1;                         # Leftmost read has a + sign,
-      $tlen_1 = $start_read_2 - $end_read_1 - 1;                         # Rightmost read has a - sign
-    }
-  }
-
-  #####
-
-  # adjusting the strand of the sequence before we use them to generate mismatch strings
-  if ($strand_1 eq '-'){
-    $actual_seq_1 = revcomp($actual_seq_1);                            # Sequence represented on the forward genomic strand
-    $ref_seq_1 = revcomp($ref_seq_1);                                  # Required for comparison with actual sequence
-    $qual_1 = reverse $qual_1;                                         # we need to reverse the quality string as well
-  }
-  if ($strand_2 eq '-'){
-    $actual_seq_2 = revcomp($actual_seq_2);                            # Mate sequence represented on the forward genomic strand
-    $ref_seq_2 = revcomp($ref_seq_2);                                  # Required for comparison with actual sequence
-    $qual_2 = reverse $qual_2;                                         # If the sequence gets reverse complemented we reverse the quality string as well
-  }
-
-  #  print "$actual_seq_1\n$ref_seq_1\n\n";
-  #  print "$actual_seq_2\n$ref_seq_2\n\n";
-
-  #####
-
-  my $hemming_dist_1 = hemming_dist($actual_seq_1,$ref_seq_1);         # Minimal number of one-nucleotide edits needed to transform the read string into the reference sequence
-  my $hemming_dist_2 = hemming_dist($actual_seq_2,$ref_seq_2);
-  if ($bowtie2){
-    $hemming_dist_1 += $methylation_call_params->{$id}->{indels_1};    # Adding the number of inserted/deleted bases which we parsed while getting the genomic sequence
-    $hemming_dist_2 += $methylation_call_params->{$id}->{indels_2};    # Adding the number of inserted/deleted bases which we parsed while getting the genomic sequence
-  }
-  my $NM_tag_1 = "NM:i:$hemming_dist_1";                               # Optional tag NM: edit distance based on nucleotide differences
-  my $NM_tag_2 = "NM:i:$hemming_dist_2";                               # Optional tag NM: edit distance based on nucleotide differences
-
-  #####
-
-  my $XX_tag_1 = make_mismatch_string($actual_seq_1,$ref_seq_1);       # Optional tag XX: String providing mismatched reference bases in the alignment (NO indel information!)
-  my $XX_tag_2 = make_mismatch_string($actual_seq_2,$ref_seq_2);
-
-  #####
-
-  my $XM_tag_1;                                                        # Optional tag XM: Methylation call string
-  my $XM_tag_2;
-
-  if ($strand_1 eq '-'){
-    $XM_tag_1 = 'XM:Z:'.reverse $methcall_1;                           # Needs to be reversed if the sequence was reverse complemented
-  }
-  else{
-    $XM_tag_1 = "XM:Z:$methcall_1";
-  }
-
-  if ($strand_2 eq '-'){
-    $XM_tag_2 = 'XM:Z:'.reverse $methcall_2;                           # Needs to be reversed if the sequence was reverse complemented
-  }
-  else{
-    $XM_tag_2 = "XM:Z:$methcall_2";
-  }
-
-  #####
-
-  my $XR_tag_1 = "XR:Z:$read_conversion_1";                            # Optional tag XR: Read 1 conversion state
-  my $XR_tag_2 = "XR:Z:$read_conversion_2";                            # Optional tag XR: Read 2 conversion state
-
-  #####
-
-  my $XG_tag = "XG:Z:$genome_conversion";                              # Optional tag XG: Genome Conversion state; valid for both reads
-
-  #####
-
-  # Optionally calculating number of mismatches for Bowtie 2 alignments
-
-  if ($non_bs_mm) {
-    if ($bowtie2) {
-
-      $number_of_mismatches_1 =~ s/-//; # removing the minus sign	
-      $number_of_mismatches_2 =~ s/-//;
-
-      ### if Bowtie 2 was used we need to analyse the CIGAR strings whether the reads contained any indels to determine the number of mismatches
-
-      ### CIGAR 1
-      if ($cigar_1 =~ /(D|I)/) {
-	# warn "$cigar_1\n";
-
-	# parsing CIGAR string
-	my @len = split (/\D+/,$cigar_1); # storing the length per operation
-	my @ops = split (/\d+/,$cigar_1); # storing the operation
-	shift @ops;		# remove the empty first element
-	die "CIGAR string '$cigar_1' contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-	
-	foreach (0..$#len) {
-	  if ($ops[$_] eq 'M') {
-	    # warn "skipping\n";
-	    next;		# irrelevant
-	  }
-	  elsif ($ops[$_] eq 'I') {	# insertion in the read sequence
-	    $number_of_mismatches_1 -= $insertion_open;
-	    $number_of_mismatches_1 -= $len[$_] * $insertion_extend;
-	    # warn "Insertion: Subtracting $ops[$_], length $len[$_], open: $insertion_open, extend: $insertion_extend\n";
-	  }
-	  elsif ($ops[$_] eq 'D') {	# deletion in the read sequence
-	    $number_of_mismatches_1 -= $deletion_open;
-	    $number_of_mismatches_1 -= $len[$_] * $deletion_extend;
-	    # warn "Deletion: Subtracting $ops[$_], length $len[$_], open: $deletion_open, extend: $deletion_extend\n";
-	  }
-	  elsif ($cigar_1 =~ tr/[NSHPX=]//) {	# if these (for standard mapping) illegal characters exist we die
-	    die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-	  }
-	  else {
-	    die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_1\n";
-	  }
-	}
-
-	# warn "Alignment score $number_of_mismatches_1\n";
-	# print "Mismatches $number_of_mismatches_1\n\n";
-      }
-
-      ### CIGAR 2
-      if ($cigar_2 =~ /(D|I)/) {
-	# warn "$cigar_2\n";
-
-	# parsing CIGAR string
-	my @len = split (/\D+/,$cigar_2); # storing the length per operation
-	my @ops = split (/\d+/,$cigar_2); # storing the operation
-	shift @ops;		# remove the empty first element
-	die "CIGAR string '$cigar_2' contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-	
-	foreach (0..$#len) {
-	  if ($ops[$_] eq 'M') {
-	    # warn "skipping\n";
-	    next; #irrelevant
-	  }
-	  elsif ($ops[$_] eq 'I') {	# insertion in the read sequence
-	    $number_of_mismatches_2 -= $insertion_open;
-	    $number_of_mismatches_2 -= $len[$_] * $insertion_extend;
-	    # warn "Insertion: Subtracting $ops[$_], length $len[$_], open: $insertion_open, extend: $insertion_extend\n";
-	  }
-	  elsif ($ops[$_] eq 'D') {	# deletion in the read sequence
-	    $number_of_mismatches_2 -= $deletion_open;
-	    $number_of_mismatches_2 -= $len[$_] * $deletion_extend;
-	    # warn "Deletion: Subtracting $ops[$_], length $len[$_], open: $deletion_open, extend: $deletion_extend\n";
-	  }
-	  elsif ($cigar_2 =~ tr/[NSHPX=]//) {	# if these (for standard mapping) illegal characters exist we die
-	    die "The CIGAR string contained illegal CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-	  }
-	  else {
-	    die "The CIGAR string contained undefined CIGAR operations in addition to 'M', 'I' and 'D': $cigar_2\n";
-	  }
-	}
-      }
-
-      ### Now we have InDel corrected Alignment scores
-
-      ### if the actual sequence contained Ns we need to adjust the number of mismatches. Ns receive a penalty of -1, but normal mismatches receive -6. This might still break if the
-      ### sequence contained more than 5 Ns, but this should occur close to never
-
-      my $seq_1_N_count = $number_of_mismatches_1 % 6; # modulo 6 will return the integer rest after the division
-      my $seq_2_N_count = $number_of_mismatches_2 % 6;
-      #   warn "N count 1: $seq_1_N_count\n";
-      #   warn "N count 2: $seq_2_N_count\n";
-
-      $number_of_mismatches_1 = int ($number_of_mismatches_1 / 6) + $seq_1_N_count;
-      $number_of_mismatches_2 = int ($number_of_mismatches_2 / 6) + $seq_2_N_count;
-
-      # warn "MM1    $number_of_mismatches_1 \n";
-      # warn "MM2    $number_of_mismatches_2 \n";
-    }
-  }
-
-  ####
-
-  my $XA_tag = "XA:Z:$number_of_mismatches_1";
-  my $XB_tag = "XB:Z:$number_of_mismatches_2";
-
-
-  # SAM format: QNAME, FLAG, RNAME, 1-based POS, MAPQ, CIGAR, RNEXT, PNEXT, TLEN, SEQ, QUAL, optional fields
-  ### optionally print number of non-bisulfite mismatches
-  if ($non_bs_mm){
-    print OUT join("\t", ($id_1, $flag_1, $chr, $start_read_1, $mapq, $cigar_1, $rnext, $pnext_1, $tlen_1, $actual_seq_1, $qual_1, $NM_tag_1, $XX_tag_1, $XM_tag_1,$XR_tag_1,$XG_tag,$XA_tag)), "\n";
-    print OUT join("\t", ($id_2, $flag_2, $chr, $start_read_2, $mapq, $cigar_2, $rnext, $pnext_2, $tlen_2, $actual_seq_2, $qual_2, $NM_tag_2, $XX_tag_2, $XM_tag_2,$XR_tag_2,$XG_tag,$XB_tag)), "\n";
-  }
-  else{ # default
-    print OUT join("\t", ($id_1, $flag_1, $chr, $start_read_1, $mapq, $cigar_1, $rnext, $pnext_1, $tlen_1, $actual_seq_1, $qual_1, $NM_tag_1, $XX_tag_1, $XM_tag_1,$XR_tag_1,$XG_tag)), "\n";
-    print OUT join("\t", ($id_2, $flag_2, $chr, $start_read_2, $mapq, $cigar_2, $rnext, $pnext_2, $tlen_2, $actual_seq_2, $qual_2, $NM_tag_2, $XX_tag_2, $XM_tag_2,$XR_tag_2,$XG_tag)), "\n";
-  }
-}
-
-sub revcomp{
-  my $seq = shift or die "Missing seq to reverse complement\n";
-  $seq = reverse $seq;
-  $seq =~ tr/ACTGactg/TGACTGAC/;
-  return $seq;
-}
-
-sub hemming_dist{
-  my $matches = 0;
-  my @actual_seq = split //,(shift @_);
-  my @ref_seq = split //,(shift @_);
-  foreach (0..$#actual_seq){
-    ++$matches if ($actual_seq[$_] eq $ref_seq[$_]);
-  }
-  return my $hd = scalar @actual_seq - $matches;
-}
-
-sub make_mismatch_string{
-  my $actual_seq = shift or die "Missing actual sequence";
-  my $ref_seq = shift or die "Missing reference sequence";
-  my $XX_tag = "XX:Z:";
-  my $tmp = ($actual_seq ^ $ref_seq);                    # Bitwise comparison
-  my $prev_mm_pos = 0;
-  while($tmp =~ /[^\0]/g){                               # Where bitwise comparison showed a difference
-    my $nuc_match = pos($tmp) - $prev_mm_pos - 1;        # Generate number of nucleotide that matches since last mismatch
-    my $nuc_mm = substr($ref_seq, pos($tmp) - 1, 1) if pos($tmp) <= length($ref_seq);  # Obtain reference nucleotide that was different from the actual read
-    $XX_tag .= "$nuc_match" if $nuc_match > 0;           # Ignore if mismatches are adjacent to each other
-    $XX_tag .= "$nuc_mm" if defined $nuc_mm;             # Ignore if there is no mismatch (prevents uninitialized string concatenation)
-    $prev_mm_pos = pos($tmp);                            # Position of last mismatch
-  }
-  my $end_matches = length($ref_seq) - $prev_mm_pos;     # Provides number of matches from last mismatch till end of sequence
-  $XX_tag .= "$end_matches" if $end_matches > 0;         # Ignore if mismatch is at the end of sequence
-  return $XX_tag;
-}
-
-
-
-sub print_helpfile{
-  print << "HOW_TO";
-
-
-     This program is free software: you can redistribute it and/or modify
-     it under the terms of the GNU General Public License as published by
-     the Free Software Foundation, either version 3 of the License, or
-     (at your option) any later version.
-
-     This program is distributed in the hope that it will be useful,
-     but WITHOUT ANY WARRANTY; without even the implied warranty of
-     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-     GNU General Public License for more details.
-     You should have received a copy of the GNU General Public License
-     along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-
-
-DESCRIPTION
-
-
-The following is a brief description of command line options and arguments to control the Bismark
-bisulfite mapper and methylation caller. Bismark takes in FastA or FastQ files and aligns the
-reads to a specified bisulfite genome. Sequence reads are transformed into a bisulfite converted forward strand
-version (C->T conversion) or into a bisulfite treated reverse strand (G->A conversion of the forward strand).
-Each of these reads are then aligned to bisulfite treated forward strand index of a reference genome
-(C->T converted) and a bisulfite treated reverse strand index of the genome (G->A conversion of the
-forward strand, by doing this alignments will produce the same positions). These 4 instances of Bowtie (1 or 2)
-are run in parallel. The sequence file(s) are then read in again sequence by sequence to pull out the original
-sequence from the genome and determine if there were any protected C's present or not.
-
-As of version 0.7.0 Bismark will only run 2 alignment threads for OT and OB in parallel, the 4 strand mode can be
-re-enabled by using --non_directional.
-
-The final output of Bismark is in SAM format by default. For Bowtie 1 one can alos choose to report the old
-'vanilla' output format, which is a single tab delimited file with all sequences that have a unique best
-alignment to any of the 4 possible strands of a bisulfite PCR product. Both formats are described in more detail below.
-
-
-USAGE: bismark [options] <genome_folder> {-1 <mates1> -2 <mates2> | <singles>}
-
-
-ARGUMENTS:
-
-<genome_folder>          The path to the folder containing the unmodified reference genome
-                         as well as the subfolders created by the Bismark_Genome_Preparation
-                         script (/Bisulfite_Genome/CT_conversion/ and /Bisulfite_Genome/GA_conversion/).
-                         Bismark expects one or more fastA files in this folder (file extension: .fa
-                         or .fasta). The path can be relative or absolute.
-
--1 <mates1>              Comma-separated list of files containing the #1 mates (filename usually includes
-                         "_1"), e.g. flyA_1.fq,flyB_1.fq). Sequences specified with this option must
-                         correspond file-for-file and read-for-read with those specified in <mates2>.
-                         Reads may be a mix of different lengths. Bismark will produce one mapping result
-                         and one report file per paired-end input file pair.
-
--2 <mates2>              Comma-separated list of files containing the #2 mates (filename usually includes
-                         "_2"), e.g. flyA_1.fq,flyB_1.fq). Sequences specified with this option must
-                         correspond file-for-file and read-for-read with those specified in <mates1>.
-                         Reads may be a mix of different lengths.
-
-<singles>                A comma- or space-separated list of files containing the reads to be aligned (e.g.
-                         lane1.fq,lane2.fq lane3.fq). Reads may be a mix of different lengths. Bismark will
-                         produce one mapping result and one report file per input file.
-
-
-OPTIONS:
-
-
-Input:
-
--q/--fastq               The query input files (specified as <mate1>,<mate2> or <singles> are FASTQ
-                         files (usually having extension .fg or .fastq). This is the default. See also
-                         --solexa-quals.
-
--f/--fasta               The query input files (specified as <mate1>,<mate2> or <singles> are FASTA
-                         files (usually havin extension .fa, .mfa, .fna or similar). All quality values
-                         are assumed to be 40 on the Phred scale. FASTA files are expected to contain both
-                         the read name and the sequence on a single line (and not spread over several lines).
-
--s/--skip <int>          Skip (i.e. do not align) the first <int> reads or read pairs from the input.
-
--u/--upto <int>          Only aligns the first <int> reads or read pairs from the input. Default: no limit.
-
---phred33-quals          FASTQ qualities are ASCII chars equal to the Phred quality plus 33. Default: on.
-
---phred64-quals          FASTQ qualities are ASCII chars equal to the Phred quality plus 64. Default: off.
-
---solexa-quals           Convert FASTQ qualities from solexa-scaled (which can be negative) to phred-scaled
-                         (which can't). The formula for conversion is: 
-                         phred-qual = 10 * log(1 + 10 ** (solexa-qual/10.0)) / log(10). Used with -q. This
-                         is usually the right option for use with (unconverted) reads emitted by the GA
-                         Pipeline versions prior to 1.3. Works only for Bowtie 1. Default: off.
-
---solexa1.3-quals        Same as --phred64-quals. This is usually the right option for use with (unconverted)
-                         reads emitted by GA Pipeline version 1.3 or later. Default: off.
-
---path_to_bowtie         The full path </../../> to the Bowtie (1 or 2) installation on your system. If not
-                         specified it is assumed that Bowtie (1 or 2) is in the PATH.
-
-
-Alignment:
-
--n/--seedmms <int>       The maximum number of mismatches permitted in the "seed", i.e. the first L base pairs
-                         of the read (where L is set with -l/--seedlen). This may be 0, 1, 2 or 3 and the 
-                         default is 1. This option is only available for Bowtie 1 (for Bowtie 2 see -N).
-
--l/--seedlen             The "seed length"; i.e., the number of bases of the high quality end of the read to
-                         which the -n ceiling applies. The default is 28. Bowtie (and thus Bismark) is faster for
-                         larger values of -l. This option is only available for Bowtie 1 (for Bowtie 2 see -L).
-
--e/--maqerr <int>        Maximum permitted total of quality values at all mismatched read positions throughout
-                         the entire alignment, not just in the "seed". The default is 70. Like Maq, bowtie rounds
-                         quality values to the nearest 10 and saturates at 30. This value is not relevant for
-                         Bowtie 2.
-
---chunkmbs <int>         The number of megabytes of memory a given thread is given to store path descriptors in
-                         --best mode. Best-first search must keep track of many paths at once to ensure it is
-                         always extending the path with the lowest cumulative cost. Bowtie tries to minimize the
-                         memory impact of the descriptors, but they can still grow very large in some cases. If
-                         you receive an error message saying that chunk memory has been exhausted in --best mode,
-                         try adjusting this parameter up to dedicate more memory to the descriptors. This value
-                         is not relevant for Bowtie 2. Default: 512.
-
--I/--minins <int>        The minimum insert size for valid paired-end alignments. E.g. if -I 60 is specified and
-                         a paired-end alignment consists of two 20-bp alignments in the appropriate orientation
-                         with a 20-bp gap between them, that alignment is considered valid (as long as -X is also
-                         satisfied). A 19-bp gap would not be valid in that case. Default: 0.
-
--X/--maxins <int>        The maximum insert size for valid paired-end alignments. E.g. if -X 100 is specified and
-                         a paired-end alignment consists of two 20-bp alignments in the proper orientation with a
-                         60-bp gap between them, that alignment is considered valid (as long as -I is also satisfied).
-                         A 61-bp gap would not be valid in that case. Default: 500.
-
-
-Bowtie 1 Reporting:
-
--k <2>                   Due to the way Bismark works Bowtie will report up to 2 valid alignments. This option
-                         will be used by default.
-
---best                   Make Bowtie guarantee that reported singleton alignments are "best" in terms of stratum
-                         (i.e. number of mismatches, or mismatches in the seed in the case if -n mode) and in
-                         terms of the quality; e.g. a 1-mismatch alignment where the mismatch position has Phred
-                         quality 40 is preferred over a 2-mismatch alignment where the mismatched positions both
-                         have Phred quality 10. When --best is not specified, Bowtie may report alignments that
-                         are sub-optimal in terms of stratum and/or quality (though an effort is made to report
-                         the best alignment). --best mode also removes all strand bias. Note that --best does not
-                         affect which alignments are considered "valid" by Bowtie, only which valid alignments
-                         are reported by Bowtie. Bowtie is about 1-2.5 times slower when --best is specified.
-                         Default: on.
-
---no_best                Disables the --best option which is on by default. This can speed up the alignment process,
-                         e.g. for testing purposes, but for credible results it is not recommended to disable --best.
-
-
-Output:
-
---non_directional        The sequencing library was constructed in a non strand-specific manner, alignments to all four
-                         bisulfite strands will be reported. Default: OFF.
-
-                         (The current Illumina protocol for BS-Seq is directional, in which case the strands complementary
-                         to the original strands are merely theoretical and should not exist in reality. Specifying directional
-                         alignments (which is the default) will only run 2 alignment threads to the original top (OT)
-                         or bottom (OB) strands in parallel and report these alignments. This is the recommended option
-                         for sprand-specific libraries).
-
---pbat                   This options may be used for PBAT-Seq libraries (Post-Bisulfite Adapter Tagging; Kobayashi et al.,
-                         PLoS Genetics, 2012). This is essentially the exact opposite of alignments in 'directional' mode,
-                         as it will only launch two alignment threads to the CTOT and CTOB strands instead of the normal OT
-                         and OB ones. Use this option only if you are certain that your libraries were constructed following
-                         a PBAT protocol (if you don't know what PBAT-Seq is you should not specify this option). The option
-                         --pbat works only for single-end and paired-end FastQ files for use with Bowtie1 (uncompressed
-                         temporary files only).
-
---sam-no-hd              Suppress SAM header lines (starting with @). This might be useful when very large input files are
-                         split up into several smaller files to run concurrently and the output files are to be merged.
-
---quiet                  Print nothing besides alignments.
-
---vanilla                Performs bisulfite mapping with Bowtie 1 and prints the 'old' output (as in Bismark 0.5.X) instead
-                         of SAM format output.
-
--un/--unmapped           Write all reads that could not be aligned to a file in the output directory. Written reads will
-                         appear as they did in the input, without any translation of quality values that may have
-                         taken place within Bowtie or Bismark. Paired-end reads will be written to two parallel files with _1
-                         and _2 inserted in their filenames, i.e. _unmapped_reads_1.txt and unmapped_reads_2.txt. Reads
-                         with more than one valid alignment with the same number of lowest mismatches (ambiguous mapping)
-                         are also written to _unmapped_reads.txt unless the option --ambiguous is specified as well.
-
---ambiguous              Write all reads which produce more than one valid alignment with the same number of lowest
-                         mismatches or other reads that fail to align uniquely to a file in the output directory.
-                         Written reads will appear as they did in the input, without any of the translation of quality
-                         values that may have taken place within Bowtie or Bismark. Paired-end reads will be written to two
-                         parallel files with _1 and _2 inserted in theit filenames, i.e. _ambiguous_reads_1.txt and
-                         _ambiguous_reads_2.txt. These reads are not written to the file specified with --un.
-
--o/--output_dir <dir>    Write all output files into this directory. By default the output files will be written into
-                         the same folder as the input file(s). If the specified folder does not exist, Bismark will attempt
-                         to create it first. The path to the output folder can be either relative or absolute.
-
---temp_dir <dir>         Write temporary files to this directory instead of into the same directory as the input files. If
-                         the specified folder does not exist, Bismark will attempt to create it first. The path to the
-                         temporary folder can be either relative or absolute.
-
---non_bs_mm              Optionally outputs an extra column specifying the number of non-bisulfite mismatches a read during the
-                         alignment step. This option is only available for SAM format. In Bowtie 2 context, this value is
-                         just the number of actual non-bisulfite mismatches and ignores potential insertions or deletions.
-                         The format for single-end reads and read 1 of paired-end reads is 'XA:Z:number of mismatches'
-                         and 'XB:Z:number of mismatches' for read 2 of paired-end reads.
-
---gzip                   Temporary bisulfite conversion files will be written out in a GZIP compressed form to save disk
-                         space. This option is available for most alignment modes but is not available for paired-end FastA
-                         files. This option might be somewhat slower than writing out uncompressed files, but this awaits
-                         further testing.
-
---bam                    The output will be written out in BAM format instead of the default SAM format. Bismark will
-                         attempt to use the path to Samtools that was specified with '--samtools_path', or, if it hasn't
-                         been specified, attempt to find Samtools in the PATH. If no installation of Samtools can be found,
-                         the SAM output will be compressed with GZIP instead (yielding a .sam.gz output file).
-
---samtools_path          The path to your Samtools installation, e.g. /home/user/samtools/. Does not need to be specified
-                         explicitly if Samtools is in the PATH already.
-
---prefix <prefix>        Prefixes <prefix> to the output filenames. Trailing dots will be replaced by a single one. For
-                         example, '--prefix test' with 'file.fq' would result in the output file 'test.file.fq_bismark.sam' etc.
-
---old_flag               Only in paired-end SAM mode, uses the FLAG values used by Bismark v0.8.2 and before. In addition,
-                         this options appends /1 and /2 to the read IDs for reads 1 and 2 relative to the input file. Since
-                         both the appended read IDs and custom FLAG values may cause problems with some downstream tools 
-                         such as Picard, new defaults were implemented as of version 0.8.3.
-
-
-                                             default                         old_flag
-                                       ===================              ===================
-                                       Read 1       Read 2              Read 1       Read 2
-
-                              OT:         99          147                  67          131
-
-                              OB:         83          163                 115          179
-
-                              CTOT:       99          147                  67          131
-
-                              CTOB:       83          163                 115          179
-
-
-
-Other:
-
--h/--help                Displays this help file.
-
--v/--version             Displays version information.
-
-
-BOWTIE 2 SPECIFIC OPTIONS
-
---bowtie2                Uses Bowtie 2 instead of Bowtie 1. Bismark limits Bowtie 2 to only perform end-to-end
-                         alignments, i.e. searches for alignments involving all read characters (also called 
-                         untrimmed or unclipped alignments). Bismark assumes that raw sequence data is adapter
-                         and/or quality trimmed where appropriate. Default: off.
-
-Bowtie 2 alignment options:
-
--N <int>                 Sets the number of mismatches to allowed in a seed alignment during multiseed alignment.
-                         Can be set to 0 or 1. Setting this higher makes alignment slower (often much slower)
-                         but increases sensitivity. Default: 0. This option is only available for Bowtie 2 (for
-                         Bowtie 1 see -n).
-
--L <int>                 Sets the length of the seed substrings to align during multiseed alignment. Smaller values
-                         make alignment slower but more senstive. Default: the --sensitive preset of Bowtie 2 is
-                         used by default, which sets -L to 20. This option is only available for Bowtie 2 (for
-                         Bowtie 1 see -l).
-
---ignore-quals           When calculating a mismatch penalty, always consider the quality value at the mismatched
-                         position to be the highest possible, regardless of the actual value. I.e. input is treated
-                         as though all quality values are high. This is also the default behavior when the input
-                         doesn't specify quality values (e.g. in -f mode). This option is invariable and on by default.
-
-
-Bowtie 2 paired-end options:
-
---no-mixed               This option disables Bowtie 2's behavior to try to find alignments for the individual mates if
-                         it cannot find a concordant or discordant alignment for a pair. This option is invariable and
-                         and on by default.
-
---no-discordant          Normally, Bowtie 2 looks for discordant alignments if it cannot find any concordant alignments.
-                         A discordant alignment is an alignment where both mates align uniquely, but that does not
-                         satisfy the paired-end constraints (--fr/--rf/--ff, -I, -X). This option disables that behavior
-                         and it is on by default.
-
-
-Bowtie 2 effort options:
-
--D <int>                 Up to <int> consecutive seed extension attempts can "fail" before Bowtie 2 moves on, using
-                         the alignments found so far. A seed extension "fails" if it does not yield a new best or a
-                         new second-best alignment. Default: 15.
-
--R <int>                 <int> is the maximum number of times Bowtie 2 will "re-seed" reads with repetitive seeds.
-                         When "re-seeding," Bowtie 2 simply chooses a new set of reads (same length, same number of
-                         mismatches allowed) at different offsets and searches for more alignments. A read is considered
-                         to have repetitive seeds if the total number of seed hits divided by the number of seeds
-                         that aligned at least once is greater than 300. Default: 2.
-
-Bowtie 2 parallelization options:
-
-
--p NTHREADS              Launch NTHREADS parallel search threads (default: 1). Threads will run on separate processors/cores
-                         and synchronize when parsing reads and outputting alignments. Searching for alignments is highly
-                         parallel, and speedup is close to linear. Increasing -p increases Bowtie 2's memory footprint.
-                         E.g. when aligning to a human genome index, increasing -p from 1 to 8 increases the memory footprint
-                         by a few hundred megabytes. This option is only available if bowtie is linked with the pthreads
-                         library (i.e. if BOWTIE_PTHREADS=0 is not specified at build time). In addition, this option will
-                         automatically use the option '--reorder', which guarantees that output SAM records are printed in
-                         an order corresponding to the order of the reads in the original input file, even when -p is set
-                         greater than 1 (Bismark requires the Bowtie 2 output to be this way). Specifying --reorder and
-                         setting -p greater than 1 causes Bowtie 2 to run somewhat slower and use somewhat more memory then
-                         if --reorder were not specified. Has no effect if -p is set to 1, since output order will naturally
-                         correspond to input order in that case.
-
-Bowtie 2 Scoring options:
-
---score_min <func>       Sets a function governing the minimum alignment score needed for an alignment to be considered
-                         "valid" (i.e. good enough to report). This is a function of read length. For instance, specifying
-                         L,0,-0.2 sets the minimum-score function f to f(x) = 0 + -0.2 * x, where x is the read length.
-                         See also: setting function options at http://bowtie-bio.sourceforge.net/bowtie2. The default is
-                         L,0,-0.2.
-
---rdg <int1>,<int2>      Sets the read gap open (<int1>) and extend (<int2>) penalties. A read gap of length N gets a penalty
-                         of <int1> + N * <int2>. Default: 5, 3.
-
---rfg <int1>,<int2>      Sets the reference gap open (<int1>) and extend (<int2>) penalties. A reference gap of length N gets
-                         a penalty of <int1> + N * <int2>. Default: 5, 3.
-
-
-Bowtie 2 Reporting options:
-
--most_valid_alignments <int> This used to be the Bowtie 2 parameter -M. As of Bowtie 2 version 2.0.0 beta7 the option -M is
-                         deprecated. It will be removed in subsequent versions. What used to be called -M mode is still the
-                         default mode, but adjusting the -M setting is deprecated.  Use the -D and -R options to adjust the
-                         effort expended to find valid alignments.
-
-                         For reference, this used to be the old (now deprecated) description of -M:
-                         Bowtie 2 searches for at most <int>+1 distinct, valid alignments for each read. The search terminates when it
-                         can't find more distinct valid alignments, or when it finds <int>+1 distinct alignments, whichever
-                         happens first. Only the best alignment is reported. Information from the other alignments is used to
-                         estimate mapping quality and to set SAM optional fields, such as AS:i and XS:i. Increasing -M makes 
-                         Bowtie 2 slower, but increases the likelihood that it will pick the correct alignment for a read that
-                         aligns many places. For reads that have more than <int>+1 distinct, valid alignments, Bowtie 2 does not
-                         guarantee that the alignment reported is the best possible in terms of alignment score. -M is
-                         always used and its default value is set to 10.
-
-
-'VANILLA' Bismark  OUTPUT:
-
-Single-end output format (tab-separated):
-
- (1) <seq-ID>
- (2) <read alignment strand>
- (3) <chromosome>
- (4) <start position>
- (5) <end position>
- (6) <observed bisulfite sequence>
- (7) <equivalent genomic sequence>
- (8) <methylation call>
- (9) <read conversion
-(10) <genome conversion>
-(11) <read quality score (Phred33)>
-
-
-Paired-end output format (tab-separated):
- (1) <seq-ID>
- (2) <read 1 alignment strand>
- (3) <chromosome>
- (4) <start position>
- (5) <end position>
- (6) <observed bisulfite sequence 1>
- (7) <equivalent genomic sequence 1>
- (8) <methylation call 1>
- (9) <observed bisulfite sequence 2>
-(10) <equivalent genomic sequence 2>
-(11) <methylation call 2>
-(12) <read 1 conversion
-(13) <genome conversion>
-(14) <read 1 quality score (Phred33)>
-(15) <read 2 quality score (Phred33)>
-
-
-Bismark SAM OUTPUT (default):
-
- (1) QNAME  (seq-ID)
- (2) FLAG   (this flag tries to take the strand a bisulfite read originated from into account (this is different from ordinary DNA alignment flags!))
- (3) RNAME  (chromosome)
- (4) POS    (start position)
- (5) MAPQ   (always 255)
- (6) CIGAR
- (7) RNEXT
- (8) PNEXT
- (9) TLEN
-(10) SEQ
-(11) QUAL   (Phred33 scale)
-(12) NM-tag (edit distance to the reference)
-(13) XX-tag (base-by-base mismatches to the reference. This does not include indels)
-(14) XM-tag (methylation call string)
-(15) XR-tag (read conversion state for the alignment)
-(16) XG-tag (genome conversion state for the alignment)
-(17) XA/XB-tag (non-bisulfite mismatches) (optional!)
-
-Each read of paired-end alignments is written out in a separate line in the above format.
-
-
-Last edited on 07 October 2013.
-
-HOW_TO
-}
--- a/old/bismark_genome_preparation	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,459 +0,0 @@
-#!/usr/bin/perl --
-use strict;
-use warnings;
-use Cwd;
-use File::Path qw(rmtree);
-$|++;
-
-
-## This program is Copyright (C) 2010-13, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-use Getopt::Long;
-use Cwd;
-
-my $verbose;
-my $help;
-my $version;
-my $man;
-my $path_to_bowtie;
-my $multi_fasta;
-my $single_fasta;
-my $bowtie2;
-
-my $bismark_version = 'v0.10.0';
-
-GetOptions ('verbose' => \$verbose,
-	    'help' => \$help,
-	    'man' => \$man,
-	    'version' => \$version,
-	    'path_to_bowtie:s' => \$path_to_bowtie,
-	    'single_fasta' => \$single_fasta,
-	    'bowtie2' => \$bowtie2,
-	   );
-
-if ($help or $man){
-  print_helpfile();
-  exit;
-}
-
-if ($version){
-  print << "VERSION";
-
-          Bismark - Bisulfite Mapper and Methylation Caller.
-
-          Bismark Genome Preparation Version: $bismark_version
-        Copyright 2010-13 Felix Krueger, Babraham Bioinformatics
-              www.bioinformatics.babraham.ac.uk/projects/
-
-VERSION
-    exit;
-}
-
-my $genome_folder = shift @ARGV; # mandatory
-
-# Ensuring a genome folder has been specified
-if ($genome_folder){
-  unless ($genome_folder =~ /\/$/){
-    $genome_folder =~ s/$/\//;
-  }
-  $verbose and print "Path to genome folder specified as: $genome_folder\n";
-  chdir $genome_folder or die "Could't move to directory $genome_folder. Make sure the directory exists! $!";
-
-  # making the genome folder path abolsolute so it won't break if the path was specified relative
-  $genome_folder = getcwd;
-  unless ($genome_folder =~ /\/$/){
-    $genome_folder =~ s/$/\//;
-  }
-}
-else{
-  die "Please specify a genome folder to be used for bisulfite conversion\n\n";
-}
-
-
-my $CT_dir;
-my $GA_dir;
-
-
-if ($single_fasta){
-  print "Writing individual genomes out into single-entry fasta files (one per chromosome)\n\n";
-  $multi_fasta = 0;
-}
-else{
-  print "Writing bisulfite genomes out into a single MFA (multi FastA) file\n\n";
-  $single_fasta = 0;
-  $multi_fasta = 1;
-}
-
-my @filenames = create_bisulfite_genome_folders();
-
-process_sequence_files ();
-
-launch_bowtie_indexer();
-
-sub launch_bowtie_indexer{
-  if ($bowtie2){
-    print "Bismark Genome Preparation - Step III: Launching the Bowtie 2 indexer\n";
-  }
-  else{
-    print "Bismark Genome Preparation - Step III: Launching the Bowtie (1) indexer\n";
-  }
-  print "Please be aware that this process can - depending on genome size - take up to several hours!\n";
-  sleep(5);
-
-  ### if the path to bowtie was specfified explicitely
-  if ($path_to_bowtie){
-    if ($bowtie2){
-      $path_to_bowtie =~ s/$/bowtie2-build/;
-    }
-    else{
-      $path_to_bowtie =~ s/$/bowtie-build/;
-    }
-  }
-  ### otherwise we assume that bowtie-build is in the path
-  else{
-    if ($bowtie2){
-      $path_to_bowtie = 'bowtie2-build';
-    }
-    else{
-      $path_to_bowtie = 'bowtie-build';
-    }
-  }
-
-  $verbose and print "\n";
-
-  ### Forking the program to run 2 instances of Bowtie-build or Bowtie2-build (= the Bowtie (1/2) indexer)
-  my $pid = fork();
-
-  # parent process
-  if ($pid){
-    sleep(1);
-    chdir $CT_dir or die "Unable to change directory: $!\n";
-    $verbose and warn "Preparing indexing of CT converted genome in $CT_dir\n";
-    my @fasta_files = <*.fa>;
-    my $file_list = join (',',@fasta_files);
-    $verbose and print "Parent process: Starting to index C->T converted genome with the following command:\n\n";
-    $verbose and print "$path_to_bowtie -f $file_list BS_CT\n\n";
-
-    sleep (11);
-    exec ("$path_to_bowtie","-f","$file_list","BS_CT");
-  }
-
-  # child process
-  elsif ($pid == 0){
-    sleep(2);
-    chdir $GA_dir or die "Unable to change directory: $!\n";
-    $verbose and warn "Preparing indexing of GA converted genome in $GA_dir\n";
-    my @fasta_files = <*.fa>;
-    my $file_list = join (',',@fasta_files);
-    $verbose and print "Child process: Starting to index G->A converted genome with the following command:\n\n";
-    $verbose and print "$path_to_bowtie -f $file_list BS_GA\n\n";
-    $verbose and print "(starting in 10 seconds)\n";
-    sleep(10);
-    exec ("$path_to_bowtie","-f","$file_list","BS_GA");
-  }
-
-  # if the platform doesn't support the fork command we will run the indexing processes one after the other
-  else{
-    print "Forking process was not successful, therefore performing the indexing sequentially instead\n";
-    sleep(10);
-
-    ### moving to CT genome folder
-    $verbose and warn "Preparing to index CT converted genome in $CT_dir\n";
-    chdir $CT_dir or die "Unable to change directory: $!\n";
-    my @fasta_files = <*.fa>;
-    my $file_list = join (',',@fasta_files);
-    $verbose and print "$file_list\n\n";
-    sleep(2);
-    system ("$path_to_bowtie","-f","$file_list","BS_CT");
-    @fasta_files=();
-    $file_list= '';
-
-    ### moving to GA genome folder
-    $verbose and warn "Preparing to index GA converted genome in $GA_dir\n";
-    chdir $GA_dir or die "Unable to change directory: $!\n";
-    @fasta_files = <*.fa>;
-    $file_list = join (',',@fasta_files);
-    $verbose and print "$file_list\n\n";
-    sleep(2);
-    exec ("$path_to_bowtie","-f","$file_list","BS_GA");
-  }
-}
-
-
-sub process_sequence_files {
-
-  my ($total_CT_conversions,$total_GA_conversions) = (0,0);
-  $verbose and print "Bismark Genome Preparation - Step II: Bisulfite converting reference genome\n\n";
-  sleep (3);
-
-  $verbose and print "conversions performed:\n";
-  $verbose and print join("\t",'chromosome','C->T','G->A'),"\n";
-
-
-  ### If someone wants to index a genome which consists of thousands of contig and scaffold files we need to write the genome conversions into an MFA file
-  ### Otherwise the list of comma separated chromosomes we provide for bowtie-build will get too long for the kernel to handle
-  ### This is now the default option
-
-  if ($multi_fasta){
-    ### Here we just use one multi FastA file name, append .CT_conversion or .GA_conversion and print all sequence conversions into these files
-    my $bisulfite_CT_conversion_filename = "$CT_dir/genome_mfa.CT_conversion.fa";
-    open (CT_CONVERT,'>',$bisulfite_CT_conversion_filename) or die "Can't write to file $bisulfite_CT_conversion_filename: $!\n";
-
-    my $bisulfite_GA_conversion_filename = "$GA_dir/genome_mfa.GA_conversion.fa";
-    open (GA_CONVERT,'>',$bisulfite_GA_conversion_filename) or die "Can't write to file $bisulfite_GA_conversion_filename: $!\n";
-  }
-
-  foreach my $filename(@filenames){
-    my ($chromosome_CT_conversions,$chromosome_GA_conversions) = (0,0);
-    open (IN,$filename) or die "Failed to read from sequence file $filename $!\n";
-    # warn "Reading chromosome information from $filename\n\n";
-
-    ### first line needs to be a fastA header
-    my $first_line = <IN>;
-    chomp $first_line;
-
-    ### Extracting chromosome name from the FastA header
-    my $chromosome_name = extract_chromosome_name($first_line);
-
-    ### alternatively, chromosomes can be written out into single-entry FastA files. This will only work for genomes with up to a few hundred chromosomes.
-    unless ($multi_fasta){
-      my $bisulfite_CT_conversion_filename = "$CT_dir/$chromosome_name";
-      $bisulfite_CT_conversion_filename =~ s/$/.CT_conversion.fa/;
-      open (CT_CONVERT,'>',$bisulfite_CT_conversion_filename) or die "Can't write to file $bisulfite_CT_conversion_filename: $!\n";
-
-      my $bisulfite_GA_conversion_filename = "$GA_dir/$chromosome_name";
-      $bisulfite_GA_conversion_filename =~ s/$/.GA_conversion.fa/;
-      open (GA_CONVERT,'>',$bisulfite_GA_conversion_filename) or die "Can't write to file $bisulfite_GA_conversion_filename: $!\n";
-    }
-
-    print CT_CONVERT ">",$chromosome_name,"_CT_converted\n"; # first entry
-    print GA_CONVERT ">",$chromosome_name,"_GA_converted\n"; # first entry
-
-
-    while (<IN>){
-
-      ### in case the line is a new fastA header
-      if ($_ =~ /^>/){
-	### printing out the stats for the previous chromosome
-	$verbose and print join ("\t",$chromosome_name,$chromosome_CT_conversions,$chromosome_GA_conversions),"\n";
-	### resetting the chromosome transliteration counters
-	($chromosome_CT_conversions,$chromosome_GA_conversions) = (0,0);
-	
-	### Extracting chromosome name from the additional FastA header
-	$chromosome_name = extract_chromosome_name($_);
-
-	### alternatively, chromosomes can be written out into single-entry FastA files. This will only work for genomes with up to a few hundred chromosomes.
-	unless ($multi_fasta){
-	  my $bisulfite_CT_conversion_filename = "$CT_dir/$chromosome_name";
-	  $bisulfite_CT_conversion_filename =~ s/$/.CT_conversion.fa/;
-	  open (CT_CONVERT,'>',$bisulfite_CT_conversion_filename) or die "Can't write to file $bisulfite_CT_conversion_filename: $!\n";
-	
-	  my $bisulfite_GA_conversion_filename = "$GA_dir/$chromosome_name";
-	  $bisulfite_GA_conversion_filename =~ s/$/.GA_conversion.fa/;
-	  open (GA_CONVERT,'>',$bisulfite_GA_conversion_filename) or die "Can't write to file $bisulfite_GA_conversion_filename: $!\n";
-	}
-
-	print CT_CONVERT ">",$chromosome_name,"_CT_converted\n";
-	print GA_CONVERT ">",$chromosome_name,"_GA_converted\n";
-      }
-
-      else{
-	my $sequence = uc$_;
-
-	### (I) First replacing all ambiguous sequence characters (such as M,S,R....) by N (G,A,T,C,N and the line endings \r and \n are added to a character group)
-	
-	$sequence =~ s/[^ATCGN\n\r]/N/g;
-	
-	### (II) Writing the chromosome out into a C->T converted version (equals forward strand conversion)
-	
-	my $CT_sequence = $sequence;
-	my $CT_transliterations_performed = ($CT_sequence =~ tr/C/T/); # converts all Cs into Ts
-	$total_CT_conversions += $CT_transliterations_performed;
-	$chromosome_CT_conversions += $CT_transliterations_performed;
-	
-	print CT_CONVERT $CT_sequence;
-	
-	### (III) Writing the chromosome out in a G->A converted version of the forward strand (this is equivalent to reverse-
-	### complementing the forward strand and then C->T converting it)
-	
-	my $GA_sequence = $sequence;
-	my $GA_transliterations_performed = ($GA_sequence =~ tr/G/A/); # converts all Gs to As on the forward strand
-	$total_GA_conversions += $GA_transliterations_performed;
-	$chromosome_GA_conversions += $GA_transliterations_performed;
-	
-	print GA_CONVERT $GA_sequence;
-	
-      }
-    }
-    $verbose and print join ("\t",$chromosome_name,$chromosome_CT_conversions,$chromosome_GA_conversions),"\n";
-  }
-  close (CT_CONVERT) or die "Failed to close filehandle: $!\n";
-  close (GA_CONVERT) or die "Failed to close filehandle: $!\n";
-
-
-  print "\nTotal number of conversions performed:\n";
-  print "C->T:\t$total_CT_conversions\n";
-  print "G->A:\t$total_GA_conversions\n";
-
-  warn "\nStep II - Genome bisulfite conversions - completed\n\n\n";
-}
-
-sub extract_chromosome_name {
-
-  my $header = shift;
-
-  ## Bowtie extracts the first string after the initial > in the FASTA file, so we are doing this as well
-
-  if ($header =~ s/^>//){
-    my ($chromosome_name) = split (/\s+/,$header);
-    return $chromosome_name;
-  }
-  else{
-    die "The specified chromosome file doesn't seem to be in FASTA format as required! $!\n";
-  }
-}
-
-sub create_bisulfite_genome_folders{
-
-  $verbose and print "Bismark Genome Preparation - Step I: Preparing folders\n\n";
-
-  if ($path_to_bowtie){
-    unless ($path_to_bowtie =~ /\/$/){
-      $path_to_bowtie =~ s/$/\//;
-    }
-    if (chdir $path_to_bowtie){
-      if ($bowtie2){
-	$verbose and print "Path to Bowtie 2 specified: $path_to_bowtie\n";
-      }
-      else{
-	$verbose and print "Path to Bowtie (1) specified: $path_to_bowtie\n";
-      }
-    }
-    else{
-      die "There was an error with the path to bowtie: $!\n";
-    }
-  }
-
-  chdir $genome_folder or die "Could't move to directory $genome_folder. Make sure the directory exists! $!";
-
-
-  # Exiting unless there are fastA files in the folder
-  my @filenames = <*.fa>;
-
-  ### if there aren't any genomic files with the extension .fa we will look for files with the extension .fasta
-  unless (@filenames){
-    @filenames =  <*.fasta>;
-  }
-
-  unless (@filenames){
-    die "The specified genome folder $genome_folder does not contain any sequence files in FastA format (with .fa or .fasta file extensions\n";
-  }
-
-  warn "Bisulfite Genome Indexer version $bismark_version (last modified 19 Sept 2013)\n\n";
-  sleep (3);
-
-  # creating a directory inside the genome folder to store the bisfulfite genomes unless it already exists
-  my $bisulfite_dir = "${genome_folder}Bisulfite_Genome/";
-  unless (-d $bisulfite_dir){
-    mkdir $bisulfite_dir or die "Unable to create directory $bisulfite_dir $!\n";
-    $verbose and print "Created Bisulfite Genome folder $bisulfite_dir\n";
-  }
-  else{
-    print "\nA directory called $bisulfite_dir already exists. Bisulfite converted sequences and/or already existing Bowtie (1 or 2) indices will be overwritten!\n\n";
-    sleep(5);
-  }
-
-  chdir $bisulfite_dir or die "Unable to move to $bisulfite_dir\n";
-  $CT_dir = "${bisulfite_dir}CT_conversion/";
-  $GA_dir = "${bisulfite_dir}GA_conversion/";
-
-  # creating 2 subdirectories to store a C->T (forward strand conversion) and a G->A (reverse strand conversion)
-  # converted version of the genome
-  unless (-d $CT_dir){
-    mkdir $CT_dir or die "Unable to create directory $CT_dir $!\n";
-    $verbose and print "Created Bisulfite Genome folder $CT_dir\n";
-  }
-  unless (-d $GA_dir){
-    mkdir $GA_dir or die "Unable to create directory $GA_dir $!\n";
-    $verbose and print "Created Bisulfite Genome folder $GA_dir\n";
-  }
-
-  # moving back to the original genome folder
-  chdir $genome_folder or die "Could't move to directory $genome_folder $!";
-  # $verbose and print "Moved back to genome folder folder $genome_folder\n";
-  warn "\nStep I - Prepare genome folders - completed\n\n\n";
-  return @filenames;
-}
-
-sub print_helpfile{
-  print << 'HOW_TO';
-
-
-DESCRIPTION
-
-This script is supposed to convert a specified reference genome into two different bisulfite
-converted versions and index them for alignments with Bowtie 1 (default), or Bowtie 2. The first
-bisulfite genome will have all Cs converted to Ts (C->T), and the other one will have all Gs
-converted to As (G->A). Both bisulfite genomes will be stored in subfolders within the reference
-genome folder. Once the bisulfite conversion has been completed the program will fork and launch
-two simultaneous instances of the Bowtie 1 or 2 indexer (bowtie-build or bowtie2-build). Be aware
-that the indexing process can take up to several hours; this will mainly depend on genome size
-and system resources.
-
-
-
-The following is a brief description of command line options and arguments to control the
-Bismark Genome Preparation:
-
-
-USAGE: bismark_genome_preparation [options] <arguments>
-
-
-OPTIONS:
-
---help/--man             Displays this help filea and exits.
-
---version                Displays version information and exits.
-
---verbose                Print verbose output for more details or debugging.
-
---path_to_bowtie </../>  The full path to the Bowtie 1 or Bowtie 2 installation on your system
-                         (depending on which aligner/indexer you intend to use). Unless this path
-                         is specified it is assumed that Bowtie is in the PATH.
-
---bowtie2                This will create bisulfite indexes for Bowtie 2. (Default: Bowtie 1).
-
---single_fasta           Instruct the Bismark Indexer to write the converted genomes into
-                         single-entry FastA files instead of making one multi-FastA file (MFA)
-                         per chromosome. This might be useful if individual bisulfite converted
-                         chromosomes are needed (e.g. for debugging), however it can cause a
-                         problem with indexing if the number of chromosomes is vast (this is likely
-                         to be in the range of several thousand files; the operating system can
-                         only handle lists up to a certain length, and some newly assembled
-                         genomes may contain 20000-50000 contigs of scaffold files which do exceed
-                         this list length limit).
-
-
-ARGUMENTS:
-
-<path_to_genome_folder>  The path to the folder containing the genome to be bisulfite converted.
-                         The Bismark Genome Preparation expects one or more fastA files in the folder
-                         (with the file extension: .fa or .fasta). Specifying this path is mandatory.
-
-
-This script was last modified on 19 Sept 2013.
-HOW_TO
-}
--- a/old/bismark_methylation_extractor	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,4760 +0,0 @@
-#!/usr/bin/perl
-use warnings;
-use strict;
-$|++;
-use Getopt::Long;
-use Cwd;
-use Carp;
-use FindBin qw($Bin);
-use lib "$Bin/../lib";
-
-
-## This program is Copyright (C) 2010-13, Felix Krueger (felix.krueger@babraham.ac.uk)
-
-## This program is free software: you can redistribute it and/or modify
-## it under the terms of the GNU General Public License as published by
-## the Free Software Foundation, either version 3 of the License, or
-## (at your option) any later version.
-
-## This program is distributed in the hope that it will be useful,
-## but WITHOUT ANY WARRANTY; without even the implied warranty of
-## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-## GNU General Public License for more details.
-
-## You should have received a copy of the GNU General Public License
-## along with this program. If not, see <http://www.gnu.org/licenses/>.
-
-my @filenames; # input files
-my %counting;
-my $parent_dir = getcwd();
-
-my %fhs;
-
-my $version = 'v0.10.1';
-my ($ignore,$genomic_fasta,$single,$paired,$full,$report,$no_overlap,$merge_non_CpG,$vanilla,$output_dir,$no_header,$bedGraph,$remove,$coverage_threshold,$counts,$cytosine_report,$genome_folder,$zero,$CpG_only,$CX_context,$split_by_chromosome,$sort_size,$samtools_path,$gzip,$ignore_r2,$mbias_only,$gazillion,$ample_mem) = process_commandline();
-
-
-### only needed for bedGraph output
-my @sorting_files; # if files are to be written to bedGraph format, these are the methylation extractor output files
-my @methylcalls = qw (0 0 0); # [0] = methylated, [1] = unmethylated, [2] = total
-my @bedfiles;
-
-### only needed for genome-wide cytosine methylation report
-my %chromosomes;
-
-my %mbias_1;
-my %mbias_2;
-
-##############################################################################################
-### Summarising Run Parameters
-##############################################################################################
-
-### METHYLATION EXTRACTOR
-
-warn "Summarising Bismark methylation extractor parameters:\n";
-warn '='x63,"\n";
-
-if ($single){
-  if ($vanilla){
-    warn "Bismark single-end vanilla format specified\n";
-  }
-  else{
-    warn "Bismark single-end SAM format specified (default)\n"; # default
-  }
-}
-elsif ($paired){
-  if ($vanilla){
-    warn "Bismark paired-end vanilla format specified\n";
-  }
-  else{
-    warn "Bismark paired-end SAM format specified (default)\n"; # default
-  }
-}
-
-if ($single){
-  if ($ignore){
-    warn "First $ignore bp will be disregarded when processing the methylation call string\n";
-  }
-}
-else{ ## paired-end
-  if ($ignore){
-    warn "First $ignore bp will be disregarded when processing the methylation call string of Read 1\n";
-  }
-  if ($ignore_r2){
-    warn "First $ignore_r2 bp will be disregarded when processing the methylation call string of Read 2\n";
-  }
-}
-
-
-if ($full){
-  warn "Strand-specific outputs will be skipped. Separate output files for cytosines in CpG, CHG and CHH context will be generated\n";
-}
-if ($merge_non_CpG){
-  warn "Merge CHG and CHH context to non-CpG context specified\n";
-}
-### output directory
-if ($output_dir eq ''){
-  warn "Output will be written to the current directory ('$parent_dir')\n";
-}
-else{
-  warn "Output path specified as: $output_dir\n";
-}
-
-
-sleep (1);
-
-### BEDGRAPH
-
-if ($bedGraph){
-  warn "\n\nSummarising bedGraph parameters:\n";
-  warn '='x63,"\n";
-
-  if ($counts){
-    warn "Generating additional output in bedGraph and coverage format\nbedGraph format:\t<Chromosome> <Start Position> <End Position> <Methylation Percentage>\ncoverage format:\t<Chromosome> <Start Position> <End Position> <Methylation Percentage> <count methylated> <count non-methylated>\n\n";
-  }
-  else{
-    warn "Generating additional sorted output in bedGraph format (output format: <Chromosome> <Start Position> <End Position> <Methylation Percentage>)\n";
-  }
-
-  warn "Using a cutoff of $coverage_threshold read(s) to report cytosine positions\n";
-
-  if ($CX_context){
-    warn "Reporting and sorting methylation information for all cytosine context (sorting may take a long time, you have been warned ...)\n";
-  }
-  else{ # default
-    $CpG_only = 1;
-    warn "Reporting and sorting cytosine methylation information in CpG context only (default)\n";
-  }
-
-  if ($remove){
-    warn "White spaces in read ID names will be removed prior to sorting\n";
-  }
-
-  if ($ample_mem){
-    warn "Sorting chromosomal postions for the bedGraph step using arrays instead of using UNIX sort\n";
-  }
-  elsif (defined $sort_size){
-    warn "The bedGraph UNIX sort command will use the following memory setting:\t'$sort_size'. Temporary directory used for sorting is the output directory\n";
-  }
-  else{
-    warn "Setting a default memory usage for the bedGraph UNIX sort command to 2GB\n";
-  }
-
-
-
-  sleep (1);
-
-  if ($cytosine_report){
-    warn "\n\nSummarising genome-wide cytosine methylation report parameters:\n";
-    warn '='x63,"\n";
-    warn "Generating comprehensive genome-wide cytosine report\n(output format: <Chromosome> <Position> <Strand> <count methylated> <count non-methylated>  <C-context>  <trinucleotide context> )\n";
-
-
-    if ($CX_context){
-      warn "Reporting methylation for all cytosine contexts. Be aware that this will generate enormous files\n";
-    }
-    else{ # default
-      $CpG_only = 1;
-      warn "Reporting cytosine methylation in CpG context only (default)\n";
-    }
-
-    if ($split_by_chromosome){
-      warn "Splitting the cytosine report output up into individual files for each chromosome\n";
-    }
-
-    ### Zero-based coordinates
-    if ($zero){
-      warn "Using zero-based genomic coordinates (user-defined)\n";
-    }
-    else{ # default, 1-based coords
-      warn "Using 1-based genomic coordinates (default)\n";
-    }
-
-    ### GENOME folder
-    if ($genome_folder){
-      unless ($genome_folder =~/\/$/){
-	$genome_folder =~ s/$/\//;
-      }
-      warn "Genome folder was specified as $genome_folder\n";
-    }
-    else{
-      $genome_folder  = '/data/public/Genomes/Mouse/NCBIM37/';
-      warn "Using the default genome folder /data/public/Genomes/Mouse/NCBIM37/\n";
-    }
-    sleep (1);
-  }
-}
-
-warn "\n";
-sleep (5);
-
-######################################################
-### PROCESSING FILES
-######################################################
-
-foreach my $filename (@filenames){
-  # resetting counters and filehandles
-  %fhs = ();
-  %counting =(
-	      total_meCHG_count => 0,
-	      total_meCHH_count => 0,
-	      total_meCpG_count => 0,
-	      total_unmethylated_CHG_count => 0,
-	      total_unmethylated_CHH_count => 0,
-	      total_unmethylated_CpG_count => 0,
-	      sequences_count => 0,
-	     );
-
-  @sorting_files = ();
-  @bedfiles = ();
-
-  %mbias_1 = ();
-  %mbias_2 = ();
-
-  ### performing a quick check to see if a paired-end SAM file has been sorted by positions which does interfere with the logic used by the extractor
-  unless ($vanilla){
-    if ($paired){
-      test_positional_sorting($filename);
-    }
-  }
-
-  process_Bismark_results_file($filename);
-
-  ### Closing all filehandles so that the Bismark methylation extractor output doesn't get truncated due to buffering issues
-  foreach my $fh (keys %fhs) {
-    if ($fh =~ /^[1230]$/) {
-      foreach my $context (keys %{$fhs{$fh}}) {
-	close $fhs{$fh}->{$context} or die $!;
-      }
-    }
-    else{
-      close $fhs{$fh} or die $!;
-    }
-  }
-
-  ### printing out all M-Bias data
-  produce_mbias_plots ($filename);
-
-  delete_unused_files();
-
-  if ($bedGraph){
-
-    my $out = (split (/\//,$filename))[-1]; # extracting the filename if a full path was specified
-    $out =~ s/gz$//;
-    $out =~ s/sam$//;
-    $out =~ s/bam$//;
-    $out =~ s/txt$//;
-    $out =~ s/$/bedGraph/;
-
-    my $bedGraph_output = $out;
-    my @args;
-
-    if ($remove){
-      push @args, '--remove';
-    }
-    if ($CX_context){
-      push @args, '--CX_context';
-    }
-    if ($no_header){
-      push @args, '--no_header';
-    }
-    if ($gazillion){
-      push @args, '--gazillion';
-    }
-    if ($ample_mem){
-      push @args, '--ample_memory';
-    }
-
-
-    #   if ($counts){
-    #      push @args, "--counts";
-    #   }
-
-    push @args, "--buffer_size $sort_size";
-    push @args, "--cutoff $coverage_threshold";
-    push @args, "--output $bedGraph_output";
-    push @args, "--dir '$output_dir'";
-
-    ### adding all files to be sorted to @args
-    foreach my $f (@sorting_files){
-      push @args, $f;
-    }
-
-    #  print join "\t",@args,"\n";
-
-    system ("$Bin/bismark2bedGraph @args");
-
-    warn "Finished BedGraph conversion ...\n\n";
-    sleep(3);
-
-    # open (OUT,'>',$output_dir.$bedGraph_output) or die "Problems with the bedGraph output filename detected: file path: '$output_dir'\tfile name: '$bedGraph_output' $!";
-    # warn "Writing bedGraph to file: $bedGraph_output\n";
-    # process_bedGraph_output();
-    # close OUT or die $!;
-
-    ### genome-wide cytosine methylation report requires bedGraph processing anyway
-    if ($cytosine_report){
-
-      @args = (); # resetting @args
-      my $cytosine_out = $out;
-      $cytosine_out =~ s/bedGraph$//;
-
-      if ($CX_context){
-	$cytosine_out =~ s/$/CX_report.txt/;
-      }
-      else{
-	$cytosine_out =~ s/$/CpG_report.txt/;
-      }
-
-      push @args, "--output $cytosine_out";
-      push @args, "--dir '$output_dir'";
-      push @args, "--genome '$genome_folder'";
-      push @args, "--parent_dir '$parent_dir'";
-
-      if ($zero){
-	push @args, "--zero";
-      }
-      if ($CX_context){
-	push @args, '--CX_context';
-      }
-      if ($split_by_chromosome){
-	push @args, '--split_by_chromosome';
-      }
-
-      my $coverage_output = $bedGraph_output;
-      $coverage_output =~ s/bedGraph$/bismark.cov/;
-
-      push @args, $output_dir . $coverage_output; # this will be the infile
-
-      system ("$Bin/coverage2cytosine @args");
-      # generate_genome_wide_cytosine_report($bedGraph_output,$cytosine_out);
-      warn "\n\nFinished generating genome-wide cytosine report\n\n";
-    }
-  }
-}
-
-sub delete_unused_files{
-
-  warn "Deleting unused files ...\n\n"; sleep(1);
-
-  my $index = 0;
-
-  while ($index <= $#sorting_files){
-    if ($sorting_files[$index] =~ /gz$/){
-      open (USED,"zcat $sorting_files[$index] |") or die "Failed to read from methylation extractor output file $sorting_files[$index]: $!\n";
-    }
-    else{
-      open (USED,$sorting_files[$index]) or die "Failed to read from methylation extractor output file $sorting_files[$index]: $!\n";
-    }
-
-    my $used = 0;
-
-    while (<USED>){
-      next if (/^Bismark/);
-      if ($_){
-	$used = 1;
-	last;
-      }
-    }
-
-    if ($used){
-      warn "$sorting_files[$index] contains data ->\tkept\n";
-      ++$index;
-    }
-    else{
-
-      my $delete = unlink $sorting_files[$index];
-
-      if ($delete){
-	warn "$sorting_files[$index] was empty ->\tdeleted\n";
-      }
-      else{
-	warn "$sorting_files[$index] was empty, however deletion was unsuccessful: $!\n"
-      }
-
-      ### we also need to remove the element from @sorting_files
-      splice @sorting_files, $index, 1;
-    }
-  }
-  warn "\n\n"; ## can't close the piped filehandles at this point because it will die (unfortunately)
-}
-
-sub produce_mbias_plots{
-
-  my $filename = shift;
-
-  my $mbias = (split (/\//,$filename))[-1]; # extracting the filename if a full path was specified
-  $mbias =~ s/gz$//;
-  $mbias =~ s/sam$//;
-  $mbias =~ s/bam$//;
-  $mbias =~ s/txt$//;
-   my $mbias_graph_1 = my $mbias_graph_2 = $mbias;
-  $mbias_graph_1 = $output_dir . $mbias_graph_1 . 'M-bias_R1.png';
-  $mbias_graph_2 = $output_dir . $mbias_graph_2 . 'M-bias_R2.png';
-
-  $mbias =~ s/$/M-bias.txt/;
-
-  open (MBIAS,'>',"$output_dir$mbias") or die "Failed to open file for the M-bias data\n\n";
-
-  # determining maximum read length
-  my $max_length_1 = 0;
-  my $max_length_2 = 0;
-
-  foreach my $context (keys %mbias_1){
-    foreach my $pos (sort {$a<=>$b} keys %{$mbias_1{$context}}){
-      $max_length_1 = $pos unless ($max_length_1 >= $pos);
-    }
-  }
-  if ($paired){
-    foreach my $context (keys %mbias_2){
-      foreach my $pos (sort {$a<=>$b} keys %{$mbias_2{$context}}){
-	$max_length_2 = $pos unless ($max_length_2 >= $pos);
-      }
-    }
-  }
-
-  if ($single){
-    warn "Determining maximum read length for M-Bias plot\n";
-    warn "Maximum read length of Read 1: $max_length_1\n\n";
-  }
-  else{
-    warn "Determining maximum read lengths for M-Bias plots\n";
-    warn "Maximum read length of Read 1: $max_length_1\n";
-    warn "Maximum read length of Read 2: $max_length_2\n\n";
-  }
-  # sleep(3);
-
-  my @mbias_read1;
-  my @mbias_read2;
-
-  #Check whether the module GD::Graph:lines is installed
-  my $gd_graph_installed = 0;
-  eval{
-    require GD::Graph::lines;
-    GD::Graph::lines->import();
-  };
-
-  unless($@) { # syntax or routine error variable, set if something goes wron in the last eval{ require ...}
-    $gd_graph_installed = 1;
-
-    #Check whether the module GD::Graph::colour is installed
-    eval{
-      require GD::Graph::colour;
-      GD::Graph::colour->import(qw(:colours :lists :files :convert));
-    };
-
-    if ($@) {
-      warn "Perl module GD::Graph::colour not found, skipping drawing M-bias plots (only writing out M-bias plot table)\n";
-      sleep(2);
-      $gd_graph_installed = 0;
-    }
-
-
-  }
-  else{
-    warn "Perl module GD::Graph::lines is not installed, skipping drawing M-bias plots (only writing out M-bias plot table)\n";
-    sleep(2);
-  }
-
-
-  my $graph_title;
-  my $graph1;
-  my $graph2;
-
-  if ( $gd_graph_installed){
-    $graph1 = GD::Graph::lines->new(800,600);
-    if ($paired){
-      $graph2 = GD::Graph::lines->new(800,600);
-    }
-  }
-
-  foreach my $context (qw(CpG CHG CHH)){
-    @{$mbias_read1[0]} = ();
-
-    if ($paired){
-      print MBIAS "$context context (R1)\n================\n";
-      $graph_title = 'M-bias (Read 1)';
-    }
-    else{
-      print MBIAS "$context context\n===========\n";
-      $graph_title = 'M-bias';
-    }
-    print MBIAS "position\tcount methylated\tcount unmethylated\t% methylation\tcoverage\n";
-
-    foreach my $pos (1..$max_length_1){
-
-      unless (defined $mbias_1{$context}->{$pos}->{meth}){
-	$mbias_1{$context}->{$pos}->{meth} = 0;
-      }
-      unless (defined $mbias_1{$context}->{$pos}->{un}){
-	$mbias_1{$context}->{$pos}->{un} = 0;
-      }
-
-      my $percent = '';
-      if (($mbias_1{$context}->{$pos}->{meth} + $mbias_1{$context}->{$pos}->{un}) > 0){
-	$percent = sprintf("%.2f",$mbias_1{$context}->{$pos}->{meth} * 100/ ( $mbias_1{$context}->{$pos}->{meth} + $mbias_1{$context}->{$pos}->{un}) );
-      }
-      my $coverage = $mbias_1{$context}->{$pos}->{un} + $mbias_1{$context}->{$pos}->{meth};
-
-      print MBIAS "$pos\t$mbias_1{$context}->{$pos}->{meth}\t$mbias_1{$context}->{$pos}->{un}\t$percent\t$coverage\n";
-      push @{$mbias_read1[0]},$pos;
-
-      if ($context eq 'CpG'){
-	push @{$mbias_read1[1]},$percent;
-	push @{$mbias_read1[4]},$coverage;
-      }
-      elsif ($context eq 'CHG'){
-	push @{$mbias_read1[2]},$percent;
-	push @{$mbias_read1[5]},$coverage;
-      }
-      elsif ($context eq 'CHH'){
-    	push @{$mbias_read1[3]},$percent;
-	push @{$mbias_read1[6]},$coverage;
-      }
-    }
-    print MBIAS "\n";
-  }
-
-  if ( $gd_graph_installed){
-
-    add_colour(nice_blue => [31,120,180]);
-    add_colour(nice_orange => [255,127,0]);
-    add_colour(nice_green => [51,160,44]);
-    add_colour(pale_blue => [153,206,227]);
-    add_colour(pale_orange => [253,204,138]);
-    add_colour(pale_green => [191,230,207]);
-
-    $graph1->set(
-		 x_label              => 'position (bp)',
-		 y1_label              => '% methylation',
-		 y2_label              => '# methylation calls',
-		 title                => $graph_title,
-		 line_width           => 2,
-		 x_max_value          => $max_length_1,
-		 x_min_value          => 0,
-		 y_tick_number        => 10,
-		 y_label_skip         => 2,
-		 y1_max_value          => 100,
-		 y1_min_value          => 0,
-		 y_label_skip         => 2,
-		 y2_min_value          => 0,
-		 x_label_skip         => 5,
-		 x_label_position     => 0.5,
-		 x_tick_offset        => -1,
-		 bgclr                => 'white',
-		 transparent          => 0,
-		 two_axes             => 1,
-		 use_axis             => [1,1,1,2,2,2],
-		 legend_placement     => 'RC',
-		 legend_spacing       => 6,
-		 legend_marker_width  => 24,
-		 legend_marker_height => 18,
-		 dclrs              => [ qw(nice_blue nice_orange nice_green pale_blue pale_orange pale_green)],
-		) or die $graph1->error;
-
-    $graph1->set_legend('CpG methylation','CHG methylation','CHH methylation','CpG total calls','CHG total calls','CHH total calls');
-
-    my $gd1 = $graph1->plot(\@mbias_read1) or die $graph1->error;
-
-    open (MBIAS_G1,'>',$mbias_graph_1) or die "Failed to write to file for M-bias plot 1: $!\n\n";
-    binmode MBIAS_G1;
-    print MBIAS_G1 $gd1->png;
-  }
-
-  if ($paired){
-
-    foreach my $context (qw(CpG CHG CHH)){
-      @{$mbias_read2[0]} = ();
-
-      print MBIAS "$context context (R2)\n================\n";
-      print MBIAS "position\tcount methylated\tcount unmethylated\t% methylation\tcoverage\n";
-      foreach my $pos (1..$max_length_2){
-	
-	unless (defined $mbias_2{$context}->{$pos}->{meth}){
-	  $mbias_2{$context}->{$pos}->{meth} = 0;
-	}
-	unless (defined $mbias_2{$context}->{$pos}->{un}){
-	  $mbias_2{$context}->{$pos}->{un} = 0;
-	}
-
-	my $percent = '';
-	if (($mbias_2{$context}->{$pos}->{meth} + $mbias_2{$context}->{$pos}->{un}) > 0){
-	  $percent = sprintf("%.2f",$mbias_2{$context}->{$pos}->{meth} * 100/ ($mbias_2{$context}->{$pos}->{meth} + $mbias_2{$context}->{$pos}->{un}) );
-	}
-	my $coverage = $mbias_2{$context}->{$pos}->{un} + $mbias_2{$context}->{$pos}->{meth};
-
-	print MBIAS "$pos\t$mbias_2{$context}->{$pos}->{meth}\t$mbias_2{$context}->{$pos}->{un}\t$percent\t$coverage\n";
-	
-	push @{$mbias_read2[0]},$pos;
-	
-	if ($context eq 'CpG'){
-	  push @{$mbias_read2[1]},$percent;
-	  push @{$mbias_read2[4]},$coverage;
-	}
-	elsif ($context eq 'CHG'){
-	  push @{$mbias_read2[2]},$percent;
-	  push @{$mbias_read2[5]},$coverage;
-	}
-	elsif ($context eq 'CHH'){
-	  push @{$mbias_read2[3]},$percent;
-	  push @{$mbias_read2[6]},$coverage;
-	}
-      }	
-      print MBIAS "\n";
-    }
-
-    if ( $gd_graph_installed){
-
-      add_colour(nice_blue => [31,120,180]);
-      add_colour(nice_orange => [255,127,0]);
-      add_colour(nice_green => [51,160,44]);
-      add_colour(pale_blue => [153,206,227]);
-      add_colour(pale_orange => [253,204,138]);
-      add_colour(pale_green => [191,230,207]);
-
-      $graph2->set(
-		   x_label              => 'position (bp)',
-		   line_width           => 2,
-		   x_max_value          => $max_length_1,
-		   x_min_value          => 0,
-		   y_tick_number        => 10,
-		   y_label_skip         => 2,
-		   y1_max_value          => 100,
-		   y1_min_value          => 0,
-		   y_label_skip         => 2,
-		   y2_min_value          => 0,
-		   x_label_skip         => 5,
-		   x_label_position     => 0.5,
-		   x_tick_offset        => -1,
-		   bgclr                => 'white',
-		   transparent          => 0,
-		   two_axes             => 1,
-		   use_axis             => [1,1,1,2,2,2],
-		   legend_placement     => 'RC',
-		   legend_spacing       => 6,
-		   legend_marker_width  => 24,
-		   legend_marker_height => 18,
-		   dclrs                => [ qw(nice_blue nice_orange nice_green pale_blue pale_orange pale_green)],
-		   x_label              => 'position (bp)',
-		   y1_label             => '% methylation',
-		   y2_label             => '# calls',
-		   title                => 'M-bias (Read 2)',
-		  ) or die $graph2->error;
-
-      $graph2->set_legend('CpG methylation','CHG methylation','CHH methylation','CpG total calls','CHG total calls','CHH total calls');
-      my $gd2 = $graph2->plot(\@mbias_read2) or die $graph2->error;
-
-      open (MBIAS_G2,'>',$mbias_graph_2) or die "Failed to write to file for M-bias plot 2: $!\n\n";
-      binmode MBIAS_G2;
-      print MBIAS_G2 $gd2->png;
-
-    }
-  }
-}
-
-sub process_commandline{
-  my $help;
-  my $single_end;
-  my $paired_end;
-  my $ignore;
-  my $ignore_r2;
-  my $genomic_fasta;
-  my $full;
-  my $report;
-  my $extractor_version;
-  my $no_overlap;
-  my $merge_non_CpG;
-  my $vanilla;
-  my $output_dir;
-  my $no_header;
-  my $bedGraph;
-  my $coverage_threshold = 1; # Minimum number of reads covering before calling methylation status
-  my $remove;
-  my $counts;
-  my $cytosine_report;
-  my $genome_folder;
-  my $zero;
-  my $CpG_only;
-  my $CX_context;
-  my $split_by_chromosome;
-  my $sort_size;
-  my $samtools_path;
-  my $gzip;
-  my $mbias_only;
-  my $gazillion;
-  my $ample_mem;
-
-  my $command_line = GetOptions ('help|man'             => \$help,
-				 'p|paired-end'         => \$paired_end,
-				 's|single-end'         => \$single_end,
-				 'fasta'                => \$genomic_fasta,
-				 'ignore=i'             => \$ignore,
-				 'ignore_r2=i'          => \$ignore_r2,
-				 'comprehensive'        => \$full,
-				 'report'               => \$report,
-				 'version'              => \$extractor_version,
-				 'no_overlap'           => \$no_overlap,
-				 'merge_non_CpG'        => \$merge_non_CpG,
-				 'vanilla'              => \$vanilla,
-				 'o|output=s'           => \$output_dir,
-				 'no_header'            => \$no_header,
-				 'bedGraph'             => \$bedGraph,
-				 "cutoff=i"             => \$coverage_threshold,
-				 "remove_spaces"        => \$remove,
-				 "counts"               => \$counts,
-				 "cytosine_report"      => \$cytosine_report,
-				 'g|genome_folder=s'    => \$genome_folder,
-				 "zero_based"           => \$zero,	
-				 "CX|CX_context"        => \$CX_context,
-				 "split_by_chromosome"  => \$split_by_chromosome,
-				 "buffer_size=s"        => \$sort_size,
-				 'samtools_path=s'      => \$samtools_path,
-				 "gzip"                 => \$gzip,
-				 "mbias_only"           => \$mbias_only,			
-				 "gazillion|scaffolds"  => \$gazillion,
-				 "ample_memory"         => \$ample_mem,
-	);
-
-  ### EXIT ON ERROR if there were errors with any of the supplied options
-  unless ($command_line){
-    die "Please respecify command line options\n";
-  }
-
-  ### HELPFILE
-  if ($help){
-    print_helpfile();
-    exit;
-  }
-
-  if ($extractor_version){
-    print << "VERSION";
-
-
-                           Bismark Methylation Extractor
-
-                      Bismark Extractor Version: $version
-              Copyright 2010-13 Felix Krueger, Babraham Bioinformatics
-                www.bioinformatics.babraham.ac.uk/projects/bismark/
-
-
-VERSION
-    exit;
-  }
-
-
-  ### no files provided
-  unless (@ARGV){
-    die "You need to provide one or more Bismark files to create an individual C methylation output. Please respecify!\n";
-  }
-  @filenames = @ARGV;
-
-  warn "\n *** Bismark methylation extractor version $version ***\n\n";
-
-  ### M-BIAS ONLY
-  if ($mbias_only){
-    if ($bedGraph){
-      die "Option '--mbias_only' skips all sorts of methylation extraction, including the bedGraph generation. Please respecify!\n";
-    }
-    if ($cytosine_report){
-      die "Option '--mbias_only' skips all sorts of methylation extraction, including the genome-wide cytosine methylation report generation. Please respecify!\n";
-    }
-    if ($merge_non_CpG){
-      warn "Option '--mbias_only' skips all sorts of methylation extraction, thus '--merge' won't have any effect\n";
-    }
-    if ($full){
-      warn "Option '--mbias_only' skips all sorts of methylation extraction, thus '--comprehensive' won't have any effect\n";
-    }
-    sleep(3);
-  }
-
-  ### PRINT A REPORT
-  unless ($report){
-    $report = 0;
-  }
-
-  ### OUTPUT DIR PATH
-  if ($output_dir){
-    unless ($output_dir =~ /\/$/){
-      $output_dir =~ s/$/\//;
-    }
-  }
-  else{
-    $output_dir = '';
-  }
-
-  ### NO HEADER
-  unless ($no_header){
-    $no_header = 0;
-  }
-
-  ### OLD (VANILLA) OUTPUT FORMAT
-  unless ($vanilla){
-    $vanilla = 0;
-  }
-
-  if ($single_end){
-    $paired_end = 0;   ### SINGLE END ALIGNMENTS
-  }
-  elsif ($paired_end){
-    $single_end = 0;   ### PAIRED-END ALIGNMENTS
-  }
-  else{
-
-    ### we will try to determine whether the input file was a single-end or paired-end sequencing run from the SAM header
-
-    if ($vanilla){
-      die "Please specify whether the supplied file(s) are in Bismark single-end or paired-end format with '-s' or '-p'\n\n";
-    }
-    else{ # SAM/BAM format
-
-      my $file = $filenames[0];
-      warn "Trying to determine the type of mapping from the SAM header line of file $file\n"; sleep(1);
-	
-      ### if the user did not specify whether the alignment file was single-end or paired-end we are trying to get this information from the @PG header line in the SAM/BAM file
-      if ($file =~ /\.gz$/){
-	open (DETERMINE,"zcat $file |") or die "Unable to read from gzipped file $file: $!\n";
-      }
-      elsif ($file =~ /\.bam$/ ||  `file -b $file` =~ /^gzip/){
-	open (DETERMINE,"samtools view -h $file |") or die "Unable to read from BAM file $file: $!\n";
-      }
-      else{
-	open (DETERMINE,$file) or die "Unable to read from $file: $!\n";
-      }
-
-      while (<DETERMINE>){
-	last unless (/^\@/);
-	if ($_ =~ /^\@PG/){
-	  # warn "found the \@PG line:\n";
-	  # warn "$_";
-	
-	  if ($_ =~ /-1/ and $_ =~ /-2/){
-	    warn "Treating file(s) as paired-end data (as extracted from \@PG line)\n\n"; sleep(1);
-	    $paired_end = 1;
-	    $single_end = 0;
-	  }
-	  else{
-	    warn "Treating file(s) as single-end data (as extracted from \@PG line)\n\n"; sleep(1);
-	    $paired_end = 0;
-	    $single_end = 1;
-	  }
-	}
-      }
-
-      close DETERMINE or warn $!;
-	
-    }
-  }
-
-  ### IGNORING <INT> bases at the start of the read when processing the methylation call string
-  unless ($ignore){
-    $ignore = 0;
-  }
-
-  if (defined $ignore_r2){
-    die "You can only specify --ignore_r2 for paired-end result files\n" unless ($paired_end);
-  }
-  else{
-    $ignore_r2 = 0;
-  }
-
-
-  ### NO OVERLAP
-  if ($no_overlap){
-    die "The option '--no_overlap' can only be specified for paired-end input!\n" unless ($paired_end);
-  }
-  else{
-    $no_overlap = 0;
-  }
-
-  ### COMPREHENSIVE OUTPUT
-  unless ($full){
-    $full = 0;
-  }
-
-  ### MERGE NON-CpG context
-  unless ($merge_non_CpG){
-    $merge_non_CpG = 0;
-  }
-
-  ### remove white spaces in read ID (needed for sorting using the sort command
-  unless ($remove){
-    $remove = 0;
-  }
-
-  ### COVERAGE THRESHOLD FOR bedGraph OUTPUT
-  if (defined $coverage_threshold){
-    unless ($coverage_threshold > 0){
-      die "Please select a coverage greater than 0 (positive integers only)\n";
-    }
-  }
-  else{
-    $coverage_threshold = 1;
-  }
-
-  ### SORT buffer size
-  if (defined $sort_size){
-    unless ($sort_size =~ /^\d+\%$/ or $sort_size =~ /^\d+(K|M|G|T)$/){
-      die "Please select a buffer size as percentage (e.g. --buffer_size 20%) or a number to be multiplied with K, M, G, T etc. (e.g. --buffer_size 20G). For more information on sort type 'info sort' on a command line\n";
-    }
-  }
-  else{
-    $sort_size = '2G';
-  }
-
-  if ($zero){
-    die "Option '--zero' is only available if  '--cytosine_report' is specified as well. Please respecify\n" unless ($cytosine_report);
-  }
-
-  if ($CX_context){
-    die "Option '--CX_context' is only available if  '--cytosine_report' or '--bedGraph' is specified as well. Please respecify\n" unless ($cytosine_report or $bedGraph);
-  }
-  else{
-    $CX_context = 0;
-  }
-
-  unless ($counts){
-    $counts = 1; # counts will always be set
-  }
-
-  if ($cytosine_report){
-
-    ### GENOME folder
-    if ($genome_folder){
-      unless ($genome_folder =~/\/$/){
-	$genome_folder =~ s/$/\//;
-      }
-    }
-    else{
-      die "Please specify a genome folder to proceed (full path only)\n";
-    }
-
-    unless ($bedGraph){
-      warn "Setting the option '--bedGraph' since this is required for the genome-wide cytosine report\n";
-      $bedGraph = 1;
-    }
-    unless ($counts){
-      # warn "Setting the option '--counts' since this is required for the genome-wide cytosine report\n";
-      $counts = 1;
-    }
-    warn "\n";
-  }
-
-  ### PATH TO SAMTOOLS
-  if (defined $samtools_path){
-    # if Samtools was specified as full command
-    if ($samtools_path =~ /samtools$/){
-      if (-e $samtools_path){
-	# Samtools executable found
-      }
-      else{
-	die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-      }
-    }
-    else{
-      unless ($samtools_path =~ /\/$/){
-	$samtools_path =~ s/$/\//;
-      }
-      $samtools_path .= 'samtools';
-      if (-e $samtools_path){
-	# Samtools executable found
-      }
-      else{
-	die "Could not find an installation of Samtools at the location $samtools_path. Please respecify\n";
-      }
-    }
-  }
-  # Check whether Samtools is in the PATH if no path was supplied by the user
-  else{
-    if (!system "which samtools >/dev/null 2>&1"){ # STDOUT is binned, STDERR is redirected to STDOUT. Returns 0 if Samtools is in the PATH
-      $samtools_path = `which samtools`;
-      chomp $samtools_path;
-    }
-  }
-
-  unless (defined $samtools_path){
-    $samtools_path = '';
-  }
-
-
-  if ($gazillion){
-    if ($ample_mem){
-      die "You can't currently select '--ample_mem' together with '--gazillion'. Make your pick!\n\n";
-    }
-  }
-
-  return ($ignore,$genomic_fasta,$single_end,$paired_end,$full,$report,$no_overlap,$merge_non_CpG,$vanilla,$output_dir,$no_header,$bedGraph,$remove,$coverage_threshold,$counts,$cytosine_report,$genome_folder,$zero,$CpG_only,$CX_context,$split_by_chromosome,$sort_size,$samtools_path,$gzip,$ignore_r2,$mbias_only,$gazillion,$ample_mem);
-}
-
-
-sub test_positional_sorting{
-
-  my $filename = shift;
-
-  print "\nNow testing Bismark result file $filename for positional sorting (which would be bad...)\t";
-  sleep(1);
-
-  if ($filename =~ /\.gz$/) {
-    open (TEST,"zcat $filename |") or die "Can't open gzipped file $filename: $!\n";
-  }
-  elsif ($filename =~ /bam$/ || `file -b $filename` =~ /^gzip/) {
-    if ($samtools_path){
-      open (TEST,"$samtools_path view -h $filename |") or die "Can't open BAM file $filename: $!\n";
-    }
-    else{
-      die "Sorry couldn't find an installation of Samtools. Either specifiy an alternative path using the option '--samtools_path /your/path/', or use a SAM file instead\n\n";
-    }
-  }
-  else {
-    open (TEST,$filename) or die "Can't open file $filename: $!\n";
-  }
-
-  my $count = 0;
-
-  while (<TEST>) {
-    if (/^\@/) {	     # testing header lines if they contain the @SO flag (for being sorted)
-      if (/^\@SO/) {
-	die "SAM/BAM header line '$_' indicates that the Bismark aligment file has been sorted by chromosomal positions which is is incompatible with correct methylation extraction. Please use an unsorted file instead\n\n";
-      }
-      next;
-    }
-    $count++;
-
-    last if ($count > 100000); # else we test the first 100000 sequences if they start with the same read ID
-
-    my ($id_1) = (split (/\t/));
-
-    ### reading the next line which should be read 2
-    $_ = <TEST>;
-    my ($id_2) = (split (/\t/));
-    last unless ($id_2);
-    ++$count;
-
-    if ($id_1 eq $id_2){
-      ### ids are the same
-      next;
-    }
-    else{ ### in previous versions of Bismark we appended /1 and /2 to the read IDs for easier eyeballing which read is which. These tags need to be removed first
-      my $id_1_trunc = $id_1;
-      $id_1_trunc =~ s/\/1$//;
-      my $id_2_trunc = $id_2;
-      $id_2_trunc =~ s/\/2$//;
-
-      unless ($id_1_trunc eq $id_2_trunc){
-	die "The IDs of Read 1 ($id_1) and Read 2 ($id_2) are not the same. This might be a result of sorting the paired-end SAM/BAM files by chromosomal position which is not compatible with correct methylation extraction. Please use an unsorted file instead\n\n";
-      }
-    }
-  }
-  #  close TEST or die $!; somehow fails on our cluster...
-  ### If it hasen't died so far then it seems the file is in the correct Bismark format (read 1 and read 2 of a pair directly following each other)
-  warn "...passed!\n";
-  sleep(1);
-
-}
-
-
-sub process_Bismark_results_file{
-  my $filename = shift;
-
-  warn "\nNow reading in Bismark result file $filename\n\n";
-
-  if ($filename =~ /\.gz$/) {
-    open (IN,"zcat $filename |") or die "Can't open gzipped file $filename: $!\n";
-  }
-  elsif ($filename =~ /bam$/ || `file -b $filename` =~ /^gzip/) {
-    if ($samtools_path){
-      open (IN,"$samtools_path view -h $filename |") or die "Can't open BAM file $filename: $!\n";
-    }
-    else{
-      die "Sorry couldn't find an installation of Samtools. Either specifiy an alternative path using the option '--samtools_path /your/path/', or use a SAM file instead\n\n";
-    }
-  }
-  else {
-    open (IN,$filename) or die "Can't open file $filename: $!\n";
-  }
-
-  ### Vanilla and SAM output need to read different numbers of header lines
-  if ($vanilla) {
-    my $bismark_version = <IN>; ## discarding the Bismark version info
-    chomp $bismark_version;
-    $bismark_version =~ s/\r//; # replaces \r line feed
-    $bismark_version =~  s/Bismark version: //;
-    if ($bismark_version =~ /^\@/) {
-      warn "Detected \@ as the first character of the version information. Is it possible that the file is in SAM format?\n\n";
-      sleep (2);
-    }
-
-    unless ($version eq $bismark_version){
-      die "The methylation extractor and Bismark itself need to be of the same version!\n\nVersions used:\nmethylation extractor: '$version'\nBismark: '$bismark_version'\n";
-    }
-  } else {
-    # If the read is in SAM format (default) it can either start with @ header lines or start with alignments directly.
-    # We are reading from it further down
-  }
-
-  my $output_filename = (split (/\//,$filename))[-1];
-
-  ### OPENING OUTPUT-FILEHANDLES
-  if ($report) {
-    my $report_filename = $output_filename;
-    $report_filename =~ s/\.sam$//;
-    $report_filename =~ s/\.txt$//;
-    $report_filename =~ s/$/_splitting_report.txt/;
-    $report_filename = $output_dir . $report_filename;
-    open (REPORT,'>',$report_filename) or die "Failed to write to file $report_filename $!\n";
-  }
-
-  if ($report) {
-    print REPORT "$output_filename\n\n";
-    print REPORT "Parameters used to extract methylation information:\n";
-    if ($paired) {
-      if ($vanilla) {
-	print REPORT "Bismark result file: paired-end (vanilla Bismark format)\n";
-      } else {
-	print REPORT "Bismark result file: paired-end (SAM format)\n"; # default
-      }
-    }
-
-    if ($single) {
-      if ($vanilla) {
-	print REPORT "Bismark result file: single-end (vanilla Bismark format)\n";
-      } else {
-	print REPORT "Bismark result file: single-end (SAM format)\n"; # default
-      }
-    }
-    if ($single){
-      if ($ignore) {
-	print REPORT "Ignoring first $ignore bp\n";
-      }
-    }
-    else{ # paired-end
-      if ($ignore) {
-	print REPORT "Ignoring first $ignore bp of Read 1\n";
-      }
-      if ($ignore_r2){
-	print REPORT "Ignoring first $ignore_r2 bp of Read 2\n";
-      }
-    }
-
-    if ($full) {
-      print REPORT "Output specified: comprehensive\n";
-    } else {
-      print REPORT "Output specified: strand-specific (default)\n";
-    }
-
-    if ($no_overlap) {
-      print REPORT "No overlapping methylation calls specified\n";
-    }
-    if ($genomic_fasta) {
-      print REPORT "Genomic equivalent sequences will be printed out in FastA format\n";
-    }
-    if ($merge_non_CpG) {
-      print REPORT "Methylation in CHG and CHH context will be merged into \"non-CpG context\" output\n";
-    }
-
-    print REPORT "\n";
-  }
-
-#####   open (OUT,"| gzip -c - > $output_dir$outfile") or die "Failed to write to $outfile: $!\n";
-
-  ### CpG-context and non-CpG context. THIS SECTION IS OPTIONAL
-  ### if --comprehensive AND --merge_non_CpG was specified we are only writing out one CpG-context and one Any-Other-context result file
-  if ($full and $merge_non_CpG) {
-    my $cpg_output = my $other_c_output = $output_filename;
-    ### C in CpG context
-    $cpg_output =~ s/^/CpG_context_/;
-    $cpg_output =~ s/sam$/txt/;
-    $cpg_output =~ s/bam$/txt/;
-    $cpg_output =~ s/$/.txt/ unless ($cpg_output =~ /\.txt$/);
-    $cpg_output = $output_dir . $cpg_output;
-
-    if ($gzip){
-      $cpg_output .= '.gz';
-      open ($fhs{CpG_context},"| gzip -c - > $cpg_output") or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{CpG_context},'>',$cpg_output) or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context to $cpg_output\n" unless($mbias_only);
-    push @sorting_files,$cpg_output;
-
-    unless ($no_header) {
-      print {$fhs{CpG_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### C in any other context than CpG
-    $other_c_output =~ s/^/Non_CpG_context_/;
-    $other_c_output =~ s/sam$/txt/;
-    $other_c_output =~ s/bam$/txt/;
-    $other_c_output =~ s/$/.txt/ unless ($other_c_output =~ /\.txt$/);
-    $other_c_output = $output_dir . $other_c_output;
-
-    if ($gzip){
-      $other_c_output .= '.gz';
-      open ($fhs{other_context},"| gzip -c - > $other_c_output") or die "Failed to write to $other_c_output $! \n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{other_context},'>',$other_c_output) or die "Failed to write to $other_c_output $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in any other context to $other_c_output\n" unless($mbias_only);
-    push @sorting_files,$other_c_output;
-
-
-    unless ($no_header) {
-      print {$fhs{other_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-  }
-
-  ### if only --merge_non_CpG was specified we will write out 8 different output files, depending on where the (first) unique best alignment has been found
-  elsif ($merge_non_CpG) {
-
-    my $cpg_ot = my $cpg_ctot = my $cpg_ctob = my $cpg_ob = $output_filename;
-
-    ### For cytosines in CpG context
-    $cpg_ot =~ s/^/CpG_OT_/;
-    $cpg_ot =~ s/sam$/txt/;
-    $cpg_ot =~ s/bam$/txt/;
-    $cpg_ot =~ s/$/.txt/ unless ($cpg_ot =~ /\.txt$/);
-    $cpg_ot = $output_dir . $cpg_ot;
-
-    if ($gzip){
-      $cpg_ot .= '.gz';
-      open ($fhs{0}->{CpG},"| gzip -c - > $cpg_ot") or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{0}->{CpG},'>',$cpg_ot) or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the original top strand to $cpg_ot\n" unless($mbias_only);
-    push @sorting_files,$cpg_ot;
-
-    unless($no_header){
-      print {$fhs{0}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ctot =~ s/^/CpG_CTOT_/;
-    $cpg_ctot =~ s/sam$/txt/;
-    $cpg_ctot =~ s/bam$/txt/;
-    $cpg_ctot =~ s/$/.txt/ unless ($cpg_ctot =~ /\.txt$/);
-    $cpg_ctot = $output_dir . $cpg_ctot;
-
-    if ($gzip){
-      $cpg_ctot .= '.gz';
-      open ($fhs{1}->{CpG},"| gzip -c - > $cpg_ctot") or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{1}->{CpG},'>',$cpg_ctot) or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the complementary to original top strand to $cpg_ctot\n" unless($mbias_only);
-    push @sorting_files,$cpg_ctot;
-
-    unless($no_header){
-      print {$fhs{1}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ctob =~ s/^/CpG_CTOB_/;
-    $cpg_ctob =~ s/sam$/txt/;
-    $cpg_ctob =~ s/bam$/txt/;
-    $cpg_ctob =~ s/$/.txt/ unless ($cpg_ctob =~ /\.txt$/);
-    $cpg_ctob = $output_dir . $cpg_ctob;
-
-    if ($gzip){
-      $cpg_ctob .= '.gz';
-      open ($fhs{2}->{CpG},"| gzip -c - > $cpg_ctob") or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{2}->{CpG},'>',$cpg_ctob) or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the complementary to original bottom strand to $cpg_ctob\n" unless($mbias_only);
-    push @sorting_files,$cpg_ctob;
-
-    unless($no_header){
-      print {$fhs{2}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ob =~ s/^/CpG_OB_/;
-    $cpg_ob =~ s/sam$/txt/;
-    $cpg_ob =~ s/bam$/txt/;
-    $cpg_ob =~ s/$/.txt/ unless ($cpg_ob =~ /\.txt$/);
-    $cpg_ob = $output_dir . $cpg_ob;
-
-    if ($gzip){
-      $cpg_ob .= '.gz';
-      open ($fhs{3}->{CpG},"| gzip -c - > $cpg_ob") or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{3}->{CpG},'>',$cpg_ob) or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the original bottom strand to $cpg_ob\n\n" unless($mbias_only);
-    push @sorting_files,$cpg_ob;
-
-    unless($no_header){
-      print {$fhs{3}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### For cytosines in Non-CpG (CC, CT or CA) context
-    my $other_c_ot = my $other_c_ctot = my $other_c_ctob = my $other_c_ob = $output_filename;
-
-    $other_c_ot =~ s/^/Non_CpG_OT_/;
-    $other_c_ot =~ s/sam$/txt/;
-    $other_c_ot =~ s/bam$/txt/;
-    $other_c_ot =~ s/$/.txt/ unless ($other_c_ot =~ /\.txt$/);
-    $other_c_ot = $output_dir . $other_c_ot;
-
-    if ($gzip){
-      $other_c_ot .= '.gz';
-      open ($fhs{0}->{other_c},"| gzip -c - > $other_c_ot") or die "Failed to write to $other_c_ot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{0}->{other_c},'>',$other_c_ot) or die "Failed to write to $other_c_ot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in any other context from the original top strand to $other_c_ot\n" unless($mbias_only);
-    push @sorting_files,$other_c_ot;
-
-    unless($no_header){
-      print {$fhs{0}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $other_c_ctot =~ s/^/Non_CpG_CTOT_/;
-    $other_c_ctot =~ s/sam$/txt/;
-    $other_c_ctot =~ s/bam$/txt/;
-    $other_c_ctot =~ s/$/.txt/ unless ($other_c_ctot =~ /\.txt$/);
-    $other_c_ctot = $output_dir . $other_c_ctot;
-
-    if ($gzip){
-      $other_c_ctot .= '.gz';
-      open ($fhs{1}->{other_c},"| gzip -c - > $other_c_ctot") or die "Failed to write to $other_c_ctot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{1}->{other_c},'>',$other_c_ctot) or die "Failed to write to $other_c_ctot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in any other context from the complementary to original top strand to $other_c_ctot\n" unless($mbias_only);
-    push @sorting_files,$other_c_ctot;
-
-    unless($no_header){
-      print {$fhs{1}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $other_c_ctob =~ s/^/Non_CpG_CTOB_/;
-    $other_c_ctob =~ s/sam$/txt/;
-    $other_c_ctob =~ s/bam$/txt/;
-    $other_c_ctob =~ s/$/.txt/ unless ($other_c_ctob =~ /\.txt$/);
-    $other_c_ctob = $output_dir . $other_c_ctob;
-
-    if ($gzip){
-      $other_c_ctob .= '.gz';
-      open ($fhs{2}->{other_c},"| gzip -c - > $other_c_ctob") or die "Failed to write to $other_c_ctob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{2}->{other_c},'>',$other_c_ctob) or die "Failed to write to $other_c_ctob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in any other context from the complementary to original bottom strand to $other_c_ctob\n" unless($mbias_only);
-    push @sorting_files,$other_c_ctob;
-
-    unless($no_header){
-      print {$fhs{2}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $other_c_ob =~ s/^/Non_CpG_OB_/;
-    $other_c_ob =~ s/sam$/txt/;
-    $other_c_ob =~ s/sam$/txt/;
-    $other_c_ob =~ s/$/.txt/ unless ($other_c_ob =~ /\.txt$/);
-    $other_c_ob = $output_dir . $other_c_ob;
-
-    if ($gzip){
-      $other_c_ob .= '.gz';
-      open ($fhs{3}->{other_c},"| gzip -c - > $other_c_ob") or die "Failed to write to $other_c_ob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{3}->{other_c},'>',$other_c_ob) or die "Failed to write to $other_c_ob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in any other context from the original bottom strand to $other_c_ob\n\n" unless($mbias_only);
-    push @sorting_files,$other_c_ob;
-
-    unless($no_header){
-      print {$fhs{3}->{other_c}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-  }
-  ### THIS SECTION IS THE DEFAULT (CpG, CHG and CHH context)
-
-  ### if --comprehensive was specified we are only writing one file per context
-  elsif ($full) {
-    my $cpg_output = my $chg_output =  my $chh_output = $output_filename;
-    ### C in CpG context
-    $cpg_output =~ s/^/CpG_context_/;
-    $cpg_output =~ s/sam$/txt/;
-    $cpg_output =~ s/bam$/txt/;
-    $cpg_output =~ s/$/.txt/ unless ($cpg_output =~ /\.txt$/);
-    $cpg_output = $output_dir . $cpg_output;
-
-    if ($gzip){
-      $cpg_output .= '.gz';
-      open ($fhs{CpG_context},"| gzip -c - > $cpg_output") or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{CpG_context},'>',$cpg_output) or die "Failed to write to $cpg_output $! \n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context to $cpg_output\n" unless($mbias_only);
-    push @sorting_files,$cpg_output;
-
-    unless($no_header){
-      print {$fhs{CpG_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### C in CHG context
-    $chg_output =~ s/^/CHG_context_/;
-    $chg_output =~ s/sam$/txt/;
-    $chg_output =~ s/bam$/txt/;
-    $chg_output =~ s/$/.txt/ unless ($chg_output =~ /\.txt$/);
-    $chg_output = $output_dir . $chg_output;
-
-    if ($gzip){
-      $chg_output .= '.gz';
-      open ($fhs{CHG_context},"| gzip -c - > $chg_output") or die "Failed to write to $chg_output $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{CHG_context},'>',$chg_output) or die "Failed to write to $chg_output $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHG context to $chg_output\n" unless($mbias_only);
-    push @sorting_files,$chg_output;
-
-    unless($no_header){
-      print {$fhs{CHG_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### C in CHH context
-    $chh_output =~ s/^/CHH_context_/;
-    $chh_output =~ s/sam$/txt/;
-    $chh_output =~ s/bam$/txt/;
-    $chh_output =~ s/$/.txt/ unless ($chh_output =~ /\.txt$/);
-    $chh_output = $output_dir . $chh_output;
-
-    if ($gzip){
-      $chh_output .= '.gz';
-      open ($fhs{CHH_context},"| gzip -c - > $chh_output") or die "Failed to write to $chh_output $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{CHH_context},'>',$chh_output) or die "Failed to write to $chh_output $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHH context to $chh_output\n" unless($mbias_only);
-    push @sorting_files, $chh_output;
-
-    unless($no_header){
-      print {$fhs{CHH_context}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-  }
-  ### else we will write out 12 different output files, depending on where the (first) unique best alignment was found
-  else {
-    my $cpg_ot = my $cpg_ctot = my $cpg_ctob = my $cpg_ob = $output_filename;
-
-    ### For cytosines in CpG context
-    $cpg_ot =~ s/^/CpG_OT_/;
-    $cpg_ot =~ s/sam$/txt/;
-    $cpg_ot =~ s/bam$/txt/;
-    $cpg_ot =~ s/$/.txt/ unless ($cpg_ot =~ /\.txt$/);
-    $cpg_ot = $output_dir . $cpg_ot;
-
-    if ($gzip){
-      $cpg_ot .= '.gz';
-      open ($fhs{0}->{CpG},"| gzip -c - > $cpg_ot") or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{0}->{CpG},'>',$cpg_ot) or die "Failed to write to $cpg_ot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the original top strand to $cpg_ot\n" unless($mbias_only);
-    push @sorting_files,$cpg_ot;
-
-    unless($no_header){
-      print {$fhs{0}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ctot =~ s/^/CpG_CTOT_/;
-    $cpg_ctot =~ s/sam$/txt/;
-    $cpg_ctot =~ s/bam$/txt/;
-    $cpg_ctot =~ s/$/.txt/ unless ($cpg_ctot =~ /\.txt$/);
-    $cpg_ctot = $output_dir . $cpg_ctot;
-
-    if ($gzip){
-      $cpg_ctot .= '.gz';
-      open ($fhs{1}->{CpG},"| gzip -c - > $cpg_ctot") or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{1}->{CpG},'>',$cpg_ctot) or die "Failed to write to $cpg_ctot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the complementary to original top strand to $cpg_ctot\n" unless($mbias_only);
-    push @sorting_files,$cpg_ctot;
-
-    unless($no_header){
-      print {$fhs{1}->{CpG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ctob =~ s/^/CpG_CTOB_/;
-    $cpg_ctob =~ s/sam$/txt/;
-    $cpg_ctob =~ s/bam$/txt/;
-    $cpg_ctob =~ s/$/.txt/ unless ($cpg_ctob =~ /\.txt$/);
-    $cpg_ctob = $output_dir . $cpg_ctob;
-
-    if ($gzip){
-      $cpg_ctob .= '.gz';
-      open ($fhs{2}->{CpG},"| gzip -c - > $cpg_ctob") or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{2}->{CpG},'>',$cpg_ctob) or die "Failed to write to $cpg_ctob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the complementary to original bottom strand to $cpg_ctob\n" unless($mbias_only);
-    push @sorting_files,$cpg_ctob;
-
-    unless($no_header){
-      print {$fhs{2}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $cpg_ob =~ s/^/CpG_OB_/;
-    $cpg_ob =~ s/sam$/txt/;
-    $cpg_ob =~ s/bam$/txt/;
-    $cpg_ob =~ s/$/.txt/ unless ($cpg_ob =~ /\.txt$/);
-    $cpg_ob = $output_dir . $cpg_ob;
-
-    if ($gzip){
-      $cpg_ob .= '.gz';
-      open ($fhs{3}->{CpG},"| gzip -c - > $cpg_ob") or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{3}->{CpG},'>',$cpg_ob) or die "Failed to write to $cpg_ob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CpG context from the original bottom strand to $cpg_ob\n\n" unless($mbias_only);
-    push @sorting_files,$cpg_ob;
-
-    unless($no_header){
-      print {$fhs{3}->{CpG}}  "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### For cytosines in CHG context
-    my $chg_ot = my $chg_ctot = my $chg_ctob = my $chg_ob = $output_filename;
-
-    $chg_ot =~ s/^/CHG_OT_/;
-    $chg_ot =~ s/sam$/txt/;
-    $chg_ot =~ s/bam$/txt/;
-    $chg_ot =~ s/$/.txt/ unless ($chg_ot =~ /\.txt$/);
-    $chg_ot = $output_dir . $chg_ot;
-
-    if ($gzip){
-      $chg_ot .= '.gz';
-      open ($fhs{0}->{CHG},"| gzip -c - > $chg_ot") or die "Failed to write to $chg_ot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{0}->{CHG},'>',$chg_ot) or die "Failed to write to $chg_ot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHG context from the original top strand to $chg_ot\n" unless($mbias_only);
-    push @sorting_files,$chg_ot;
-
-    unless($no_header){
-      print {$fhs{0}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chg_ctot =~ s/^/CHG_CTOT_/;
-    $chg_ctot =~ s/sam$/txt/;
-    $chg_ctot =~ s/bam$/txt/;
-    $chg_ctot =~ s/$/.txt/ unless ($chg_ctot =~ /\.txt$/);
-    $chg_ctot = $output_dir . $chg_ctot;
-
-    if ($gzip){
-      $chg_ctot .= '.gz';
-      open ($fhs{1}->{CHG},"| gzip -c - > $chg_ctot") or die "Failed to write to $chg_ctot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{1}->{CHG},'>',$chg_ctot) or die "Failed to write to $chg_ctot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHG context from the complementary to original top strand to $chg_ctot\n" unless($mbias_only);
-    push @sorting_files,$chg_ctot;
-
-    unless($no_header){
-      print {$fhs{1}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chg_ctob =~ s/^/CHG_CTOB_/;
-    $chg_ctob =~ s/sam$/txt/;
-    $chg_ctob =~ s/bam$/txt/;
-    $chg_ctob =~ s/$/.txt/ unless ($chg_ctob =~ /\.txt$/);
-    $chg_ctob = $output_dir . $chg_ctob;
-
-    if ($gzip){
-      $chg_ctob .= '.gz';
-      open ($fhs{2}->{CHG},"| gzip -c - > $chg_ctob") or die "Failed to write to $chg_ctob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{2}->{CHG},'>',$chg_ctob) or die "Failed to write to $chg_ctob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHG context from the complementary to original bottom strand to $chg_ctob\n" unless($mbias_only);
-    push @sorting_files,$chg_ctob;
-
-    unless($no_header){
-      print {$fhs{2}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chg_ob =~ s/^/CHG_OB_/;
-    $chg_ob =~ s/sam$/txt/;
-    $chg_ob =~ s/bam$/txt/;
-    $chg_ob =~ s/$/.txt/ unless ($chg_ob =~ /\.txt$/);
-    $chg_ob = $output_dir . $chg_ob;
-
-    if ($gzip){
-      $chg_ob .= '.gz';
-      open ($fhs{3}->{CHG},"| gzip -c - > $chg_ob") or die "Failed to write to $chg_ob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{3}->{CHG},'>',$chg_ob) or die "Failed to write to $chg_ob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHG context from the original bottom strand to $chg_ob\n\n" unless($mbias_only);
-    push @sorting_files,$chg_ob;
-
-    unless($no_header){
-      print {$fhs{3}->{CHG}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    ### For cytosines in CHH context
-    my $chh_ot = my $chh_ctot = my $chh_ctob = my $chh_ob = $output_filename;
-
-    $chh_ot =~ s/^/CHH_OT_/;
-    $chh_ot =~ s/sam$/txt/;
-    $chh_ot =~ s/bam$/txt/;
-    $chh_ot =~ s/$/.txt/ unless ($chh_ot =~ /\.txt$/);
-    $chh_ot = $output_dir . $chh_ot;
-
-    if ($gzip){
-      $chh_ot .= '.gz';
-      open ($fhs{0}->{CHH},"| gzip -c - > $chh_ot") or die "Failed to write to $chh_ot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{0}->{CHH},'>',$chh_ot) or die "Failed to write to $chh_ot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHH context from the original top strand to $chh_ot\n" unless($mbias_only);
-    push @sorting_files,$chh_ot;
-
-    unless($no_header){
-      print {$fhs{0}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chh_ctot =~ s/^/CHH_CTOT_/;
-    $chh_ctot =~ s/sam$/txt/;
-    $chh_ctot =~ s/bam$/txt/;
-    $chh_ctot =~ s/$/.txt/ unless ($chh_ctot =~ /\.txt$/);
-    $chh_ctot = $output_dir . $chh_ctot;
-
-    if ($gzip){
-      $chh_ctot .= '.gz';
-      open ($fhs{1}->{CHH},"| gzip -c - > $chh_ctot") or die "Failed to write to $chh_ctot $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{1}->{CHH},'>',$chh_ctot) or die "Failed to write to $chh_ctot $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHH context from the complementary to original top strand to $chh_ctot\n" unless($mbias_only);
-    push @sorting_files,$chh_ctot;
-
-    unless($no_header){
-      print {$fhs{1}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chh_ctob =~ s/^/CHH_CTOB_/;
-    $chh_ctob =~ s/sam$/txt/;
-    $chh_ctob =~ s/bam$/txt/;
-    $chh_ctob =~ s/$/.txt/ unless ($chh_ctob =~ /\.txt$/);
-    $chh_ctob = $output_dir . $chh_ctob;
-
-    if ($gzip){
-      $chh_ctob .= '.gz';
-      open ($fhs{2}->{CHH},"| gzip -c - > $chh_ctob") or die "Failed to write to $chh_ctob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{2}->{CHH},'>',$chh_ctob) or die "Failed to write to $chh_ctob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHH context from the complementary to original bottom strand to $chh_ctob\n" unless($mbias_only);
-    push @sorting_files,$chh_ctob;
-
-    unless($no_header){
-      print {$fhs{2}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-
-    $chh_ob =~ s/^/CHH_OB_/;
-    $chh_ob =~ s/sam$/txt/;
-    $chh_ob =~ s/bam$/txt/;
-    $chh_ob =~ s/$/.txt/ unless ($chh_ob =~ /\.txt$/);
-    $chh_ob = $output_dir . $chh_ob;
-
-    if ($gzip){
-      $chh_ob .= '.gz';
-      open ($fhs{3}->{CHH},"| gzip -c - > $chh_ob") or die "Failed to write to $chh_ob $!\n" unless($mbias_only);
-    }
-    else{
-      open ($fhs{3}->{CHH},'>',$chh_ob) or die "Failed to write to $chh_ob $!\n" unless($mbias_only);
-    }
-
-    warn "Writing result file containing methylation information for C in CHH context from the original bottom strand to $chh_ob\n\n" unless($mbias_only);
-    push @sorting_files,$chh_ob;
-
-    unless($no_header){
-      print {$fhs{3}->{CHH}} "Bismark methylation extractor version $version\n" unless($mbias_only);
-    }
-  }
-
-  my $methylation_call_strings_processed = 0;
-  my $line_count = 0;
-
-  ### proceeding differently now for single-end or paired-end Bismark files
-
-  ### PROCESSING SINGLE-END RESULT FILES
-  if ($single) {
-
-    ### also proceeding differently now for SAM format or vanilla Bismark format files
-    if ($vanilla) {		# old vanilla Bismark output format
-      while (<IN>) {
-	++$line_count;
-	warn "Processed lines: $line_count\n" if ($line_count%500000==0);
-	
-	### $seq here is the chromosomal sequence (to use for the repeat analysis for example)
-	my ($id,$strand,$chrom,$start,$seq,$meth_call,$read_conversion,$genome_conversion) = (split("\t"))[0,1,2,3,6,7,8,9];
-	
-	### we need to remove 2 bp of the genomic sequence as we were extracting read + 2bp long fragments to make a methylation call at the first or
-	### last position
-	chomp $genome_conversion;
-
-	my $index;
-	if ($meth_call) {
-
-	  if ($read_conversion eq 'CT' and $genome_conversion eq 'CT') { ## original top strand
-	    $index = 0;
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT') { ## complementary to original top strand
-	    $index = 1;
-	  } elsif ($read_conversion eq 'CT' and $genome_conversion eq 'GA') { ## original bottom strand
-	    $index = 3;
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA') { ## complementary to original bottom strand
-	    $index = 2;
-	  } else {
-	    die "Unexpected combination of read and genome conversion: '$read_conversion' / '$genome_conversion'\n";
-	  }
-	
-	  ### Clipping off the first <int> number of bases from the methylation call string as specified with --ignore <int>
-	  if ($ignore) {
-	    $meth_call = substr($meth_call,$ignore,length($meth_call)-$ignore);	
-	
-	    ### If we are clipping off some bases at the start we need to adjust the start position of the alignments accordingly!
-	    if ($strand eq '+') {
-	      $start += $ignore;
-	    } elsif ($strand eq '-') {
-	      $start += length($meth_call)-1; ## $meth_call is already shortened!
-	    } else {
-	      die "Alignment did not have proper strand information: $strand\n";
-	    }
-	  }
-	  ### printing out the methylation state of every C in the read
-	  print_individual_C_methylation_states_single_end($meth_call,$chrom,$start,$id,$strand,$index);
-	
-	  ++$methylation_call_strings_processed; # 1 per single-end result
-	}
-      }
-    } else {		  # processing single-end SAM format (default)
-      while (<IN>) {
-	### SAM format can either start with header lines (starting with @) or start with alignments directly
-	if (/^\@/) {	     # skipping header lines (starting with @)
-	  warn "skipping SAM header line:\t$_";
-	  next;
-	}
-
-	++$line_count;
-	warn "Processed lines: $line_count\n" if ($line_count%500000==0);
-	
-	# example read in SAM format
-	# 1_R1/1	67	5	103172224	255	40M	=	103172417	233	AATATTTTTTTTATTTTAAAATGTGTATTGATTTAAATTT	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	NM:i:4	XX:Z:4T1T24TT7	XM:Z:....h.h........................hh.......	XR:Z:CT	XG:Z:CT
-	###
-
-	# < 0.7.6 my ($id,$chrom,$start,$meth_call,$read_conversion,$genome_conversion) = (split("\t"))[0,2,3,13,14,15];
-	# < 0.7.6 $meth_call =~ s/^XM:Z://;
-	# < 0.7.6 $read_conversion =~ s/^XR:Z://;
-	# < 0.7.6 $genome_conversion =~ s/^XG:Z://;	
-
-	my ($id,$chrom,$start,$cigar) = (split("\t"))[0,2,3,5];
-
-	### detecting the following SAM flags in case the SAM entry was shuffled by CRAM or Goby compression/decompression
-	my $meth_call;	  ### Thanks to Zachary Zeno for this solution
-	my $read_conversion;
-	my $genome_conversion;
-	
-	while ( /(XM|XR|XG):Z:([^\t]+)/g ) {
-	  my $tag = $1;
-	  my $value = $2;
-
-	  if ($tag eq "XM") {
-	    $meth_call = $value;
-	    $meth_call =~ s/\r//;
-	  } elsif ($tag eq "XR") {
-	    $read_conversion = $value;
-	    $read_conversion =~ s/\r//;
-	  } elsif ($tag eq "XG") {
-	    $genome_conversion = $value;
-	    $genome_conversion =~ s/\r//;
-	  }
-	}
-
-	my $strand;
-	chomp $genome_conversion;
-	# print "$meth_call\n$read_conversion\n$genome_conversion\n";
-	
-	my $index;
-	if ($meth_call) {
-	  if ($read_conversion eq 'CT' and $genome_conversion eq 'CT') { ## original top strand
-	    $index = 0;
-	    $strand = '+';
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'CT') { ## complementary to original top strand
-	    $index = 1;
-	    $strand = '-';
-	  } elsif ($read_conversion eq 'GA' and $genome_conversion eq 'GA') { ## complementary to original bottom strand
-	    $index = 2;
-	    $strand = '+';
-	  } elsif ($read_conversion eq 'CT' and $genome_conversion eq 'GA') { ## original bottom strand
-	    $index = 3;
-	    $strand = '-';
-	  } else {
-	    die "Unexpected combination of read and genome conversion: '$read_conversion' / '$genome_conversion'\n";
-	  }
-	
-	  ### If the read is in SAM format we need to reverse the methylation call if the read has been reverse-complemented for the output
-	  if ($strand eq '-') {
-	    $meth_call = reverse $meth_call;
-	  }
-	
-	  ### Clipping off the first <int> number of bases from the methylation call string as specified with --ignore <int>
-	  if ($ignore) {
-	    # print "\n\n$meth_call\n";
-	    $meth_call = substr($meth_call,$ignore,length($meth_call)-$ignore);	
-	    # print "$meth_call\n";
-
-	    ### If we are ignoring a part of the sequence we also need to adjust the cigar string accordingly
-
-	    my @len = split (/\D+/,$cigar); # storing the length per operation
-	    my @ops = split (/\d+/,$cigar); # storing the operation
-	    shift @ops;		# remove the empty first element
-	    die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-		
-	    my @comp_cigar; # building an array with all CIGAR operations
-	    foreach my $index (0..$#len) {
-	      foreach (1..$len[$index]) {
-		# print  "$ops[$index]";
-		push @comp_cigar, $ops[$index];
-	      }
-	    }
-	    # print "original CIGAR: $cigar\n";
-	    # print "original CIGAR: @comp_cigar\n";
-
-	    ### If we are clipping off some bases at the start we need to adjust the start position of the alignments accordingly!
-	    if ($strand eq '+') {
-	
-	      my $D_count = 0; # counting all deletions that affect the ignored genomic position, i.e. Deletions and insertions
-	      my $I_count = 0;
-
-	      for (1..$ignore) {
-		my $op = shift @comp_cigar; # adjusting composite CIGAR string by removing $ignore operations from the start
-		# print "$_ deleted $op\n";
-
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $D_count++;
-		  $op = shift @comp_cigar;
-		  # print "$_ deleted $op\n";
-		}
-		if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		  $I_count++;
-		}
-	      }
-	      $start += $ignore + $D_count - $I_count;
-	      # print "start $start\t ignore: $ignore\t D count: $D_count I_count: $I_count\n";
-	    } elsif ($strand eq '-') {
-
-	      for (1..$ignore) {
-		my $op = pop @comp_cigar; # adjusting composite CIGAR string by removing $ignore operations, here the last value of the array
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $op = pop @comp_cigar;
-		}
-	      }
-
-	      ### For reverse strand alignments we need to determine the number of matching bases (M) or deletions (D) in the read from the CIGAR
-	      ### string to be able to work out the starting position of the read which is on the 3' end of the sequence
-	      my $MD_count = 0;	# counting all operations that affect the genomic position, i.e. M and D. Insertions do not affect the start position
-	      foreach (@comp_cigar) {
-		++$MD_count if ($_ eq 'M' or $_ eq 'D');
-	      }
-	      $start += $MD_count - 1;
-	    }
-	
-	    ### reconstituting shortened CIGAR string
-	    my $new_cigar;
-	    my $count = 0;
-	    my $last_op;
-	    # print "ignore adjusted: @comp_cigar\n";
-	    foreach my $op (@comp_cigar) {
-	      unless (defined $last_op){
-		$last_op = $op;
-		++$count;
-		next;
-	      }
-	      if ($last_op eq $op) {
-		++$count;
-	      } else {
-		$new_cigar .= "$count$last_op";
-		$last_op = $op;
-		$count = 1;
-	      }
-	    }
-	    $new_cigar .= "$count$last_op"; # appending the last operation and count
-	    $cigar = $new_cigar;
-	    # print "ignore adjusted scalar: $cigar\n";
-	  }
-	}
-	### printing out the methylation state of every C in the read
-	print_individual_C_methylation_states_single_end($meth_call,$chrom,$start,$id,$strand,$index,$cigar);
-	
-	++$methylation_call_strings_processed; # 1 per single-end result
-      }
-    }
-  }
-
-  ### PROCESSING PAIRED-END RESULT FILES
-  elsif ($paired) {
-
-    ### proceeding differently now for SAM format or vanilla Bismark format files
-    if ($vanilla) {	# old vanilla Bismark paired-end output format
-      while (<IN>) {
-	++$line_count;
-	warn "processed line: $line_count\n" if ($line_count%500000==0);
-
-	### $seq here is the chromosomal sequence (to use for the repeat analysis for example)
-	my ($id,$strand,$chrom,$start_read_1,$end_read_2,$seq_1,$meth_call_1,$seq_2,$meth_call_2,$first_read_conversion,$genome_conversion) = (split("\t"))[0,1,2,3,4,6,7,9,10,11,12,13];
-
-	my $index;
-	chomp $genome_conversion;
-	
-	if ($first_read_conversion eq 'CT' and $genome_conversion eq 'CT') {
-	  $index = 0;		## this is OT
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'GA') {
-	  $index = 2;		## this is CTOB!!!
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'CT') {
-	  $index = 1;		## this is CTOT!!!
-	} elsif ($first_read_conversion eq 'CT' and $genome_conversion eq 'GA') {
-	  $index = 3;		## this is OB
-	} else {
-	  die "Unexpected combination of read and genome conversion: $first_read_conversion / $genome_conversion\n";
-	}
-	
-	if ($meth_call_1 and $meth_call_2) {
-	  ### Clipping off the first <int> number of bases from the methylation call strings as specified with '--ignore <int>'
-
-	  if ($ignore) {
-	    $meth_call_1 = substr($meth_call_1,$ignore,length($meth_call_1)-$ignore);
-	
-	    ### we also need to adjust the start and end positions of the alignments accordingly if '--ignore' was specified
-	    $start_read_1 += $ignore;
-	  }
-	  if ($ignore_r2) {
-	    $meth_call_2 = substr($meth_call_2,$ignore_r2,length($meth_call_2)-$ignore_r2);
-	
-	    ### we also need to adjust the start and end positions of the alignments accordingly if '--ignore_r2' was specified
-	    $end_read_2   -= $ignore_r2;
-	  }
-
-	  my $end_read_1;
-	  my $start_read_2;
-
-	  if ($strand eq '+') {
-
-	    $end_read_1 = $start_read_1+length($meth_call_1)-1;
-	    $start_read_2 = $end_read_2-length($meth_call_2)+1;
-	
-	    ## we first pass the first read which is in + orientation on the forward strand
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$start_read_1,$id,'+',$index,0,0,undef,1); # the last two values are CIGAR string and read identity
-	
-	    # we next pass the second read which is in - orientation on the reverse strand
-	    ### if --no_overlap was specified we also pass the end of read 1. If read 2 starts to overlap with read 1 we can stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$end_read_2,$id,'-',$index,$no_overlap,$end_read_1,undef,2);
-	  }
-	  else {
-	
-	    $end_read_1 = $start_read_1+length($meth_call_2)-1;	# read 1 is the second reported read!
-	    $start_read_2 = $end_read_2-length($meth_call_1)+1;	# read 2 is the first reported read!
-
-	    ## we first pass the first read which is in - orientation on the reverse strand
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$end_read_2,$id,'-',$index,0,0,undef,1);
-
-	    # we next pass the second read which is in + orientation on the forward strand
-	    ### if --no_overlap was specified we also pass the end of read 2. If read 2 starts to overlap with read 1 we will stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$start_read_1,$id,'+',$index,$no_overlap,$start_read_2,undef,2);
-	  }
-	
-	  $methylation_call_strings_processed += 2; # paired-end = 2 methylation calls
-	}	
-      }
-    }
-    else {	      # Bismark paired-end SAM output format (default)
-      while (<IN>) {
-	### SAM format can either start with header lines (starting with @) or start with alignments directly
-	if (/^\@/) {	     # skipping header lines (starting with @)
-	  warn "skipping SAM header line:\t$_";
-	  next;
-	}
-	
-	++$line_count;
-	warn "Processed lines: $line_count\n" if ($line_count%500000==0);
-	
-	# example paired-end reads in SAM format (2 consecutive lines)
-	# 1_R1/1	67	5	103172224	255	40M	=	103172417	233	AATATTTTTTTTATTTTAAAATGTGTATTGATTTAAATTT	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	NM:i:4	XX:Z:4T1T24TT7	XM:Z:....h.h........................hh.......	XR:Z:CT	XG:Z:CT
-	# 1_R1/2	131	5	103172417	255	40M	=	103172224	-233	TATTTTTTTTTAGAGTATTTTTTAATGGTTATTAGATTTT	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII	NM:i:6	XX:Z:T5T1T9T9T7T3	XM:Z:h.....h.h.........h.........h.......h...	XR:Z:GA	XG:Z:CT
-	
-	#  < version 0.7.6 my ($id_1,$chrom,$start_read_1,$meth_call_1,$first_read_conversion,$genome_conversion) = (split("\t"))[0,2,3,13,14,15];
-
-	my ($id_1,$chrom,$start_read_1,$cigar_1) = (split("\t"))[0,2,3,5]; ### detecting the following SAM flags in case the SAM entry was shuffled by CRAM or Goby compression/decompression
-	my $meth_call_1;
-	my $first_read_conversion;
-	my $genome_conversion;
-	
-	while ( /(XM|XR|XG):Z:([^\t]+)/g ) {
-	  my $tag = $1;
-	  my $value = $2;
-
-	  if ($tag eq "XM") {
-	    $meth_call_1 = $value;
-	    $meth_call_1 =~ s/\r//;
-	  } elsif ($tag eq "XR") {
-	    $first_read_conversion = $value;
-	    $first_read_conversion =~ s/\r//;
-	  } elsif ($tag eq "XG") {
-	    $genome_conversion = $value;
-	    $genome_conversion =~ s/\r//;
-	  }
-	}
-
-	$_ = <IN>;		# reading in the paired read
-
-	# < version 0.7.6 my ($id_2,$start_read_2,$meth_call_2,$second_read_conversion) = (split("\t"))[0,3,13,14];
-	# < version 0.7.6 $meth_call_1 =~ s/^XM:Z://;
-	# < version 0.7.6 $meth_call_2 =~ s/^XM:Z://;
-	# < version 0.7.6 $first_read_conversion =~ s/^XR:Z://;
-	# < version 0.7.6 $second_read_conversion =~ s/^XR:Z://;
-
-	my ($id_2,$start_read_2,$cigar_2) = (split("\t"))[0,3,5]; ### detecting the following SAM flags in case the SAM entry was shuffled by CRAM or Goby compression/decompression
-
-	my $meth_call_2;
-	my $second_read_conversion;
-	
-	while ( /(XM|XR):Z:([^\t]+)/g ) {
-	  my $tag = $1;
-	  my $value = $2;
-
-	  if ($tag eq "XM") {
-	    $meth_call_2 = $value;
-	    $meth_call_2 =~ s/\r//;
-	  } elsif ($tag eq "XR") {
-	    $second_read_conversion = $value;
-	    $second_read_conversion = s/\r//;
-	  }
-	}
-	
-	# < version 0.7.6 $genome_conversion =~ s/^XG:Z://;	
-	chomp $genome_conversion; # in case it captured a new line character	
-
-	# print join ("\t",$meth_call_1,$meth_call_2,$first_read_conversion,$second_read_conversion,$genome_conversion),"\n";
-
-	my $index;
-	my $strand;
-
-	if ($first_read_conversion eq 'CT' and $genome_conversion eq 'CT') {
-	  $index = 0;		## this is OT
-	  $strand = '+';
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'CT') {
-	  $index = 1;		## this is CTOT
-	  $strand = '-';
-	} elsif ($first_read_conversion eq 'GA' and $genome_conversion eq 'GA') {
-	  $index = 2;		## this is CTOB
-	  $strand = '+';
-	} elsif ($first_read_conversion eq 'CT' and $genome_conversion eq 'GA') {
-	  $index = 3;		## this is OB
-	  $strand = '-';
-	} else {
-	  die "Unexpected combination of read and genome conversion: $first_read_conversion / $genome_conversion\n";
-	}
-
-	### reversing the methylation call of the read that was reverse-complemented
-	if ($strand eq '+') {
-	  $meth_call_2 = reverse $meth_call_2;
-	} else {
-	  $meth_call_1 = reverse $meth_call_1;
-	}
-
-	if ($meth_call_1 and $meth_call_2) {
-
-	  my $end_read_1;
-	
-	  ### READ 1
-	  my @len_1 = split (/\D+/,$cigar_1); # storing the length per operation
-	  my @ops_1 = split (/\d+/,$cigar_1); # storing the operation
-	  shift @ops_1;		# remove the empty first element
-
-	  die "CIGAR string contained a non-matching number of lengths and operations: $cigar_1\n".join(" ",@len_1)."\n".join(" ",@ops_1)."\n" unless (scalar @len_1 == scalar @ops_1);
-	
-	  my @comp_cigar_1; # building an array with all CIGAR operations
-	  foreach my $index (0..$#len_1) {
-	    foreach (1..$len_1[$index]) {
-	      # print  "$ops_1[$index]";
-	      push @comp_cigar_1, $ops_1[$index];
-	    }
-	  }
-	  # print "original CIGAR read 1: $cigar_1\n";
-	  # print "original CIGAR read 1: @comp_cigar_1\n";
-
-	  ### READ 2
-	  my @len_2 = split (/\D+/,$cigar_2); # storing the length per operation
-	  my @ops_2 = split (/\d+/,$cigar_2); # storing the operation
-	  shift @ops_2;		# remove the empty first element
-	  die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len_2 == scalar @ops_2);
-	  my @comp_cigar_2; # building an array with all CIGAR operations for read 2
-	  foreach my $index (0..$#len_2) {
-	    foreach (1..$len_2[$index]) {
-	      # print  "$ops_2[$index]";
-	      push @comp_cigar_2, $ops_2[$index];
-	    }
-	  }
-	  # print "original CIGAR read 2: $cigar_2\n";
-	  # print "original CIGAR read 2: @comp_cigar_2\n";
-	
-
-
-	  if ($ignore) {
-	    ### Clipping off the first <int> number of bases from the methylation call strings as specified with '--ignore <int>' for read 1	
-	    ### the methylation calls have already been reversed where necessary
-	    $meth_call_1 = substr($meth_call_1,$ignore,length($meth_call_1)-$ignore);
-
-	    if ($strand eq '+') {
-		
-	      ### if the (read 1) strand information is '+', read 1 needs to be trimmed from the start
-	      my $D_count_1 = 0; # counting all deletions that affect the ignored genomic position for read 1, i.e. Deletions and insertions
-	      my $I_count_1 = 0;
-	      
-	      for (1..$ignore) {
-		my $op = shift @comp_cigar_1; # adjusting composite CIGAR string of read 1 by removing $ignore operations from the start
-		# print "$_ deleted $op\n";
-		
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $D_count_1++;
-		  $op = shift @comp_cigar_1;
-		  # print "$_ deleted $op\n";
-		}
-		if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		  $I_count_1++;
-		}
-	      }
-		
-	      $start_read_1 += $ignore + $D_count_1 - $I_count_1;
-	      # print "start read 1 $start_read_1\t ignore: $ignore\t D count 1: $D_count_1\tI_count 1: $I_count_1\n";
-
-	      # the start position of reads mapping to the reverse strand is being adjusted further below
-	    }
-	    elsif ($strand eq '-') {
-	
-	      ### if the (read 1) strand information is '-', read 1 needs to be trimmed from the back
-	      for (1..$ignore) {
-		my $op = pop @comp_cigar_1; # adjusting composite CIGAR string by removing $ignore operations, here the last value of the array
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $op = pop @comp_cigar_1;
-		}
-	      }
-	      # the start position of reads mapping to the reverse strand is being adjusted further below
-
-	    }
-	  }
-
-	  if ($ignore_r2) {
-	    ### Clipping off the first <int> number of bases from the methylation call string as specified with '--ignore_r2 <int>' for read 2	
-	    ### the methylation calls have already been reversed where necessary
-	    $meth_call_2 = substr($meth_call_2,$ignore_r2,length($meth_call_2)-$ignore_r2);
-	
-	    ### If we are ignoring a part of the sequence we also need to adjust the cigar string accordingly
-	
-	    if ($strand eq '+') {
-		
-	      ### if the (read 1) strand information is '+', read 2 needs to be trimmed from the back
-
-	      for (1..$ignore_r2) {
-		my $op = pop @comp_cigar_2; # adjusting composite CIGAR string by removing $ignore operations, here the last value of the array
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $op = pop @comp_cigar_2;
-		}
-	      }
-	      # the start position of reads mapping to the reverse strand is being adjusted further below
-	    }
-	    elsif ($strand eq '-') {
-	
-	      ### if the (read 1) strand information is '-', read 2 needs to be trimmed from the start
-	      my $D_count_2 = 0; # counting all deletions that affect the ignored genomic position for read 2, i.e. Deletions and insertions
-		      my $I_count_2 = 0;
-
-	      for (1..$ignore_r2) {
-		my $op = shift @comp_cigar_2; # adjusting composite CIGAR string of read 2 by removing $ignore operations from the start
-		# print "$_ deleted $op\n";
-		
-		while ($op eq 'D') { # repeating this for deletions (D)
-		  $D_count_2++;
-		  $op = shift @comp_cigar_2;
-		  # print "$_ deleted $op\n";
-		}
-		if ($op eq 'I') { # adjusting the genomic position for insertions (I)
-		  $I_count_2++;
-		}
-	      }
-		
-	      $start_read_2 += $ignore_r2 + $D_count_2 - $I_count_2;
-	      # print "start read 2 $start_read_2\t ignore R2: $ignore_r2\t D count 2: $D_count_2\tI_count 2: $I_count_2\n";
-	    }
-	  }
-	
-	  if ($ignore){
-	    ### reconstituting shortened CIGAR string 1
-	    my $new_cigar_1;
-	    my $count_1 = 0;
-	    my $last_op_1;
-	    # print "ignore adjusted CIGAR 1: @comp_cigar_1\n";
-	    foreach my $op (@comp_cigar_1) {
-	      unless (defined $last_op_1){
-		$last_op_1 = $op;
-		++$count_1;
-		next;
-	      }
-	      if ($last_op_1 eq $op) {
-		++$count_1;
-	      } else {
-		$new_cigar_1 .= "$count_1$last_op_1";
-		$last_op_1 = $op;
-		$count_1 = 1;
-	      }
-	    }
-	    $new_cigar_1 .= "$count_1$last_op_1"; # appending the last operation and count
-	    $cigar_1 = $new_cigar_1;
-	    # print "ignore adjusted CIGAR 1 scalar: $cigar_1\n";
-	  }
-
-	  if ($ignore_r2){
-
-	    ### reconstituting shortened CIGAR string 2
-	    my $new_cigar_2;
-	    my $count_2 = 0;
-	    my $last_op_2;
-	    # print "ignore adjusted CIGAR 2: @comp_cigar_2\n";
-	    foreach my $op (@comp_cigar_2) {
-	      unless (defined $last_op_2){
-		$last_op_2 = $op;
-		++$count_2;
-		next;
-	      }
-	      if ($last_op_2 eq $op) {
-		++$count_2;
-	      }
-	      else {
-		$new_cigar_2 .= "$count_2$last_op_2";
-		$last_op_2 = $op;
-		$count_2 = 1;
-	      }
-	    }
-	    $new_cigar_2 .= "$count_2$last_op_2"; # appending the last operation and count
-	    $cigar_2 = $new_cigar_2;
-	    # print "ignore_r2 adjusted CIGAR 2 scalar: $cigar_2\n";
-	  }
-	
-	  ### Adjusting CIGAR string and starting position of reads in reverse orientation which we will pass to the extraction subroutine later on
-	
-	  if ($strand eq '+') {
-	    ### adjusting the start position for all reads mapping to the reverse strand, in this case read 2
-	    @comp_cigar_2  = reverse@comp_cigar_2; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-	    # print "reverse: @comp_cigar_2\n";
-	
-	    my $MD_count_1 = 0;
-	    foreach (@comp_cigar_1) {
-	      ++$MD_count_1 if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	    }
-
-	    my $MD_count_2 = 0;
-	    foreach (@comp_cigar_2) {
-	      ++$MD_count_2 if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	    }
-
-	    $end_read_1 = $start_read_1 + $MD_count_1 - 1;
-	    $start_read_2 += $MD_count_2 - 1; ## Passing on the start position on the reverse strand
-	  }
-	  else {
-	    ### adjusting the start position for all reads mapping to the reverse strand, in this case read 1
-	
-	    @comp_cigar_1  = reverse@comp_cigar_1; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-	    # print "reverse: @comp_cigar_1\n";
-
-	    my $MD_count_1 = 0;
-	    foreach (@comp_cigar_1) {
-	      ++$MD_count_1 if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	    }
-
-	    $end_read_1 = $start_read_1;	
-	    $start_read_1 +=  $MD_count_1 - 1; ### Passing on the start position on the reverse strand
-	  }
-
-	  if ($strand eq '+') {
-	    ## we first pass the first read which is in + orientation on the forward strand; the last value is the read identity
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$start_read_1,$id_1,'+',$index,0,0,$cigar_1,1);
-	
-	    # we next pass the second read which is in - orientation on the reverse strand
-	    ### if --no_overlap was specified we also pass the end of read 1. If read 2 starts to overlap with read 1 we can stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$start_read_2,$id_2,'-',$index,$no_overlap,$end_read_1,$cigar_2,2);
-	  } else {
-	    ## we first pass the first read which is in - orientation on the reverse strand
-	    print_individual_C_methylation_states_paired_end_files($meth_call_1,$chrom,$start_read_1,$id_1,'-',$index,0,0,$cigar_1,1);
-	
-	    # we next pass the second read which is in + orientation on the forward strand
-	    ### if --no_overlap was specified we also pass the end of read 1. If read 2 starts to overlap with read 1 we will stop extracting methylation calls from read 2
-	    print_individual_C_methylation_states_paired_end_files($meth_call_2,$chrom,$start_read_2,$id_2,'+',$index,$no_overlap,$end_read_1,$cigar_2,2);
-	  }
-	
-	  $methylation_call_strings_processed += 2; # paired-end = 2 methylation calls
-	}	
-      }
-    }
-  } else {
-    die "Single-end or paired-end reads not specified properly\n";
-  }
-
-  warn "\n\nProcessed $line_count lines from $filename in total\n";
-  warn "Total number of methylation call strings processed: $methylation_call_strings_processed\n\n";
-  if ($report) {
-    print REPORT "\n\nProcessed $line_count lines from $filename in total\n";
-    print REPORT "Total number of methylation call strings processed: $methylation_call_strings_processed\n\n";
-  }
-  print_splitting_report ();
-}
-
-
-
-sub print_splitting_report{
-
-  ### Calculating methylation percentages if applicable
-
-  my $percent_meCpG;
-  if (($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}) > 0){
-    $percent_meCpG = sprintf("%.1f",100*$counting{total_meCpG_count}/($counting{total_meCpG_count}+$counting{total_unmethylated_CpG_count}));
-  }
-
-  my $percent_meCHG;
-  if (($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-    $percent_meCHG = sprintf("%.1f",100*$counting{total_meCHG_count}/($counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}));
-  }
-
-  my $percent_meCHH;
-  if (($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}) > 0){
-    $percent_meCHH = sprintf("%.1f",100*$counting{total_meCHH_count}/($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}));
-  }
-
-  my $percent_non_CpG_methylation;
-  if ($merge_non_CpG){
-    if ( ($counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}+$counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count}) > 0){
-      $percent_non_CpG_methylation = sprintf("%.1f",100* ( $counting{total_meCHH_count}+$counting{total_meCHG_count} ) / ( $counting{total_meCHH_count}+$counting{total_unmethylated_CHH_count}+$counting{total_meCHG_count}+$counting{total_unmethylated_CHG_count} ) );
-    }
-  }
-
-  if ($report){
-    ### detailed information about Cs analysed
-    print REPORT "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-    my $total_number_of_C = $counting{total_meCHG_count}+$counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-    print REPORT "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-    print REPORT "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-    print REPORT "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-    print REPORT "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n\n";
-
-    print REPORT "Total C to T conversions in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-    print REPORT "Total C to T conversions in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-    print REPORT "Total C to T conversions in CHH context:\t$counting{total_unmethylated_CHH_count}\n\n";
-
-    ### calculating methylated CpG percentage if applicable
-    if ($percent_meCpG){
-      print REPORT "C methylated in CpG context:\t${percent_meCpG}%\n";
-    }
-    else{
-      print REPORT "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-    }
-
-    ### 2-Context Output
-    if ($merge_non_CpG){
-      if ($percent_non_CpG_methylation){
-	print REPORT "C methylated in non-CpG context:\t${percent_non_CpG_methylation}%\n\n\n";
-      }
-      else{
-	print REPORT "Can't determine percentage of methylated Cs in non-CpG context if value was 0\n\n\n";
-      }
-    }
-
-    ### 3 Context Output
-    else{
-      ### calculating methylated CHG percentage if applicable
-      if ($percent_meCHG){
-	print REPORT "C methylated in CHG context:\t${percent_meCHG}%\n";
-      }
-      else{
-	print REPORT "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-      }
-
-      ### calculating methylated CHH percentage if applicable
-      if ($percent_meCHH){
-	print REPORT "C methylated in CHH context:\t${percent_meCHH}%\n\n\n";
-      }
-      else{
-	print REPORT "Can't determine percentage of methylated Cs in CHH context if value was 0\n\n\n";
-      }
-    }
-  }
-
-  ### detailed information about Cs analysed for on-screen report
-  print "Final Cytosine Methylation Report\n",'='x33,"\n";
-
-  my $total_number_of_C = $counting{total_meCHG_count}+$counting{total_meCHH_count}+$counting{total_meCpG_count}+$counting{total_unmethylated_CHG_count}+$counting{total_unmethylated_CHH_count}+$counting{total_unmethylated_CpG_count};
-  print "Total number of C's analysed:\t$total_number_of_C\n\n";
-
-  print "Total methylated C's in CpG context:\t$counting{total_meCpG_count}\n";
-  print "Total methylated C's in CHG context:\t$counting{total_meCHG_count}\n";
-  print "Total methylated C's in CHH context:\t$counting{total_meCHH_count}\n\n";
-
-  print "Total C to T conversions in CpG context:\t$counting{total_unmethylated_CpG_count}\n";
-  print "Total C to T conversions in CHG context:\t$counting{total_unmethylated_CHG_count}\n";
-  print "Total C to T conversions in CHH context:\t$counting{total_unmethylated_CHH_count}\n\n";
-
-  ### printing methylated CpG percentage if applicable
-  if ($percent_meCpG){
-    print "C methylated in CpG context:\t${percent_meCpG}%\n";
-  }
-  else{
-    print "Can't determine percentage of methylated Cs in CpG context if value was 0\n";
-  }
-
-  ### 2-Context Output
-  if ($merge_non_CpG){
-    if ($percent_non_CpG_methylation){
-      print "C methylated in non-CpG context:\t${percent_non_CpG_methylation}%\n\n\n";
-    }
-    else{
-      print "Can't determine percentage of methylated Cs in non-CpG context if value was 0\n\n\n";
-    }
-  }
-
-  ### 3-Context Output
-  else{
-    ### printing methylated CHG percentage if applicable
-    if ($percent_meCHG){
-      print "C methylated in CHG context:\t${percent_meCHG}%\n";
-    }
-    else{
-      print "Can't determine percentage of methylated Cs in CHG context if value was 0\n";
-    }
-
-    ### printing methylated CHH percentage if applicable
-    if ($percent_meCHH){
-      print "C methylated in CHH context:\t${percent_meCHH}%\n\n\n";
-    }
-    else{
-      print "Can't determine percentage of methylated Cs in CHH context if value was 0\n\n\n";
-    }
-  }
-}
-
-
-
-sub print_individual_C_methylation_states_paired_end_files{
-
-  my ($meth_call,$chrom,$start,$id,$strand,$filehandle_index,$no_overlap,$end_read_1,$cigar,$read_identity) = @_;
-
-  ### we will use the read identity for the M-bias plot to discriminate read 1 and read 2
-  die "Read identity was neither 1 nor 2: $read_identity\n\n" unless ($read_identity == 1 or $read_identity == 2);
-
-  my @methylation_calls = split(//,$meth_call);
-
-  #################################################################
-  ### . for bases not involving cytosines                       ###
-  ### X for methylated C in CHG context (was protected)         ###
-  ### x for not methylated C in CHG context (was converted)     ###
-  ### H for methylated C in CHH context (was protected)         ###
-  ### h for not methylated C in CHH context (was converted)     ###
-  ### Z for methylated C in CpG context (was protected)         ###
-  ### z for not methylated C in CpG context (was converted)     ###
-  ### U for methylated C in Unknown context (was protected)     ###
-  ### u for not methylated C in Unknown context (was converted) ###
-  #################################################################
-
-  my $methyl_CHG_count = 0;
-  my $methyl_CHH_count = 0;
-  my $methyl_CpG_count = 0;
-  my $unmethylated_CHG_count = 0;
-  my $unmethylated_CHH_count = 0;
-  my $unmethylated_CpG_count = 0;
-
-  my $pos_offset = 0; # this is only relevant for SAM reads with insertions or deletions
-  my $cigar_offset = 0; # again, this is only relevant for SAM reads containing indels
-  my @comp_cigar;
-
-  ### Checking whether the CIGAR string is a linear genomic match or whether if requires indel processing
-  if ($cigar =~ /^\d+M$/){
-    # this check speeds up the extraction process by up to 60%!!!
-  }
-  else{ # parsing CIGAR string
-    my @len;
-    my @ops;
-    @len = split (/\D+/,$cigar); # storing the length per operation
-    @ops = split (/\d+/,$cigar); # storing the operation
-    shift @ops; # remove the empty first element
-
-    die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-    foreach my $index (0..$#len){
-      foreach (1..$len[$index]){
-	# print  "$ops[$index]";
-	push @comp_cigar, $ops[$index];
-      }
-    }
-    # warn "\nDetected CIGAR string: $cigar\n";
-    # warn "Length of methylation call: ",length $meth_call,"\n";
-    # warn "number of operations: ",scalar @ops,"\n";
-    # warn "number of length digits: ",scalar @len,"\n\n";
-    # print @comp_cigar,"\n";
-    # print "$meth_call\n\n";
-    # sleep (1);
-  }
-
-  if ($strand eq '-') {
-
-    ### the  CIGAR string needs to be reversed, the methylation call has already been reversed above
-    if (@comp_cigar){
-      @comp_cigar  = reverse@comp_cigar; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-    }
-    #  print "reverse CIGAR string: @comp_cigar\n";
-
-    ### the start position of paired-end files has already been corrected, see above
-  }
-
-  ### THIS IS AN OPTIONAL 2-CONTEXT (CpG and non-CpG) SECTION IF --merge_non_CpG was specified
-
-  if ($merge_non_CpG) {
-    if ($no_overlap) { # this has to be read 2...
-
-      ### single-file CpG and non-CpG context output
-      if ($full) {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-	
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-	
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start+$index+$pos_offset >= $end_read_1) {
-	      return;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.'){}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	}
-	elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-	
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-	
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start-$index+$pos_offset <= $end_read_1) {
-	      return;
-	    }
-	
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	} else {
-	  die "The read orientation was neither + nor -: '$strand'\n";
-	}
-      }
-
-      ### strand-specific methylation output
-      else {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start+$index+$pos_offset >= $end_read_1) {
-	      return;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }	
-	  }
-	} elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    ### Returning as soon as the methylation calls start overlapping
-	    if ($start-$index+$pos_offset <= $end_read_1) {
-	      return;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }
-	  }
-	} else {
-	  die "The strand orientation was neither + nor -: '$strand'/n";
-	}
-      }
-    }
-
-    ### this is the default paired-end procedure allowing overlaps and using every single C position
-    ### Still within the 2-CONTEXT ONLY optional section
-    else {
-      ### single-file CpG and non-CpG context output
-      if ($full) {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	} elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	       if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	    }
-	  }
-	} else {
-	  die "The strand orientation as neither + nor -: '$strand'\n";
-	}
-      }
-
-      ### strand-specific methylation output
-      ### still within the 2-CONTEXT optional section
-      else {
-	if ($strand eq '+') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	       if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }
-	  }
-	} elsif ($strand eq '-') {
-	  for my $index (0..$#methylation_calls) {
-
-	    if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	      # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	      my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	      $cigar_offset += $cigar_mod;
-	      $pos_offset += $pos_mod;
-	    }
-
-	    if ($methylation_calls[$index] eq 'X') {
-	      $counting{total_meCHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'x') {
-	      $counting{total_unmethylated_CHG_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'Z') {
-	      $counting{total_meCpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'z') {
-	      $counting{total_unmethylated_CpG_count}++;
-	      print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CpG}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CpG}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'H') {
-	      $counting{total_meCHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{meth}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{meth}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq 'h') {
-	      $counting{total_unmethylated_CHH_count}++;
-	      print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	      if ($read_identity == 1){
-		$mbias_1{CHH}->{$index+1}->{un}++;
-	      }
-	      else{
-		$mbias_2{CHH}->{$index+1}->{un}++;
-	      }
-	    }
-	    elsif ($methylation_calls[$index] eq '.') {}
-	    elsif (lc$methylation_calls[$index] eq 'u'){}
-	    else{
-	      die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	    }
-	  }
-	} else {
-	  die "The strand orientation as neither + nor -: '$strand'\n";
-	}
-      }
-    }
-  }
-
-  ############################################
-  ### THIS IS THE DEFAULT 3-CONTEXT OUTPUT ###
-  ############################################
-
-  elsif ($no_overlap) {
-    ### single-file CpG, CHG and CHH context output
-    if ($full) {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-	
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start+$index+$pos_offset >= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  } 
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start-$index+$pos_offset <= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-
-    ### strand-specific methylation output
-    else {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start+$index+$pos_offset >= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }	
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  ### Returning as soon as the methylation calls start overlapping
-	  if ($start-$index+$pos_offset <= $end_read_1) {
-	    return;
-	  }
-	
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-  }
-
-  ### this is the default paired-end procedure allowing overlaps and using every single C position
-  else {
-    ### single-file CpG, CHG and CHH context output
-    if ($full) {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-
-    ### strand-specific methylation output
-    else {
-      if ($strand eq '+') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } elsif ($strand eq '-') {
-	for my $index (0..$#methylation_calls) {
-
-	  if ($cigar and @comp_cigar){ # only needed for SAM reads with InDels
-	    # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	    my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	    $cigar_offset += $cigar_mod;
-	    $pos_offset += $pos_mod;
-	  }
-
-	  if ($methylation_calls[$index] eq 'X') {
-	    $counting{total_meCHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'x') {
-	    $counting{total_unmethylated_CHG_count}++;
-	    print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'Z') {
-	    $counting{total_meCpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'z') {
-	    $counting{total_unmethylated_CpG_count}++;
-	    print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CpG}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CpG}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'H') {
-	    $counting{total_meCHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{meth}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{meth}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq 'h') {
-	    $counting{total_unmethylated_CHH_count}++;
-	    print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	    if ($read_identity == 1){
-	      $mbias_1{CHH}->{$index+1}->{un}++;
-	    }
-	    else{
-	      $mbias_2{CHH}->{$index+1}->{un}++;
-	    }
-	  }
-	  elsif ($methylation_calls[$index] eq '.') {}
-	  elsif (lc$methylation_calls[$index] eq 'u'){}
-	  else{
-	    die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	  }
-	}
-      } else {
-	die "The strand orientation as neither + nor -: '$strand'\n";
-      }
-    }
-  }
-}
-
-sub check_cigar_string {
-  my ($index,$cigar_offset,$pos_offset,$strand,$comp_cigar) = @_;
-  # print "$index\t$cigar_offset\t$pos_offset\t$strand\t";
-  my ($new_cigar_offset,$new_pos_offset) = (0,0);
-
-  if ($strand eq '+') {
-    #  print "### $strand strand @$comp_cigar[$index + $cigar_offset]\t";
-
-    if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-      #  warn "position needs no adjustment\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){ # insertion in the read sequence
-      $new_pos_offset -= 1; # we need to subtract the length of inserted bases from the genomic position
-      # warn "adjusted genomic position by -1 bp (insertion)\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-      $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-      $new_pos_offset += 1; # we need to add the length of deleted bases to get the genomic position
-      # warn "adjusted genomic position by +1 bp (deletion). Now looping through the CIGAR string until we hit another M or I\n";
-
-      while ( ($index + $cigar_offset + $new_cigar_offset)  < (scalar @$comp_cigar) ){	
-	if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-	  #  warn "position needs no adjustment\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){
-	  $new_pos_offset -= 1; # we need to subtract the length of inserted bases from the genomic position
-	  # warn "adjusted genomic position by another -1 bp (insertion)\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-	  $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-	  $new_pos_offset += 1; # we need to add the length of deleted bases to get the genomic position
-	  # warn "adjusted genomic position by another +1 bp (deletion)\n";
-	}
-	else{
-	  die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-	}
-      }
-    }
-    else{
-      die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-    }
-  }
-
-  elsif ($strand eq '-') {
-    # print "### $strand strand @$comp_cigar[$index + $cigar_offset]\t";
-
-    if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-     # warn "position needs no adjustment\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){ # insertion in the read sequence
-      $new_pos_offset += 1; # we need to add the length of inserted bases to the genomic position
-      # warn "adjusted genomic position by +1 bp (insertion)\n";
-    }
-
-    elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-      $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-      $new_pos_offset -= 1; # we need to subtract the length of deleted bases to get the genomic position
-      # warn "adjusted genomic position by -1 bp (deletion). Now looping through the CIGAR string until we hit another M or I\n";
-
-      while ( ($index + $cigar_offset + $new_cigar_offset)  < (scalar @$comp_cigar) ){	
-	if (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'M'){ # sequence position matches the genomic position
-	  # warn "Found new 'M' operation; position needs no adjustment\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'I'){
-	  $new_pos_offset += 1; # we need to subtract the length of inserted bases from the genomic position
-	  # warn "Found new 'I' operation; adjusted genomic position by another +1 bp (insertion)\n";
-	  last;
-	}
-	elsif (@$comp_cigar[$index + $cigar_offset + $new_cigar_offset] eq 'D'){ # deletion in the read sequence
-	  $new_cigar_offset += 1; # the composite cigar string does no longer match the methylation call index
-	  $new_pos_offset -= 1; # we need to subtract the length of deleted bases to get the genomic position
-	  # warn "adjusted genomic position by another -1 bp (deletion)\n";
-	}
-	else{
-	  die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-	}
-      }
-    }
-    else{
-      die "The CIGAR string contained undefined operations in addition to 'M', 'I' and 'D': '@$comp_cigar[$index + $cigar_offset + $new_cigar_offset]'\n";
-    }
-  }
-  # print "new cigar offset: $new_cigar_offset\tnew pos offset: $new_pos_offset\n";
-  return ($new_cigar_offset,$new_pos_offset);
-}
-
-sub print_individual_C_methylation_states_single_end{
-
-  my ($meth_call,$chrom,$start,$id,$strand,$filehandle_index,$cigar) = @_;
-  my @methylation_calls = split(//,$meth_call);
-
-  #################################################################
-  ### . for bases not involving cytosines                       ###
-  ### X for methylated C in CHG context (was protected)         ###
-  ### x for not methylated C in CHG context (was converted)     ###
-  ### H for methylated C in CHH context (was protected)         ###
-  ### h for not methylated C in CHH context (was converted)     ###
-  ### Z for methylated C in CpG context (was protected)         ###
-  ### z for not methylated C in CpG context (was converted)     ###
-  #################################################################
-
-  my $methyl_CHG_count = 0;
-  my $methyl_CHH_count = 0;
-  my $methyl_CpG_count = 0;
-  my $unmethylated_CHG_count = 0;
-  my $unmethylated_CHH_count = 0;
-  my $unmethylated_CpG_count = 0;
-
-  my $pos_offset = 0; # this is only relevant for SAM reads with insertions or deletions
-  my $cigar_offset = 0; # again, this is only relevant for SAM reads containing indels
-
-  my @comp_cigar;
-
-  if ($cigar){ # parsing CIGAR string
-
-    ### Checking whether the CIGAR string is a linear genomic match or whether if requires indel processing
-    if ($cigar =~ /^\d+M$/){
-      #  warn "See!? I told you so! $cigar\n";
-      # sleep(1);
-    }
-    else{
-
-      my @len;
-      my @ops;
-
-      @len = split (/\D+/,$cigar); # storing the length per operation
-      @ops = split (/\d+/,$cigar); # storing the operation
-      shift @ops; # remove the empty first element
-      # die "CIGAR string contained a non-matching number of lengths and operations: id: $id\nmeth call: $meth_call\nCIGAR: $cigar\n".join(" ",@len)."\n".join(" ",@ops)."\n" unless (scalar @len == scalar @ops);
-      die "CIGAR string contained a non-matching number of lengths and operations\n" unless (scalar @len == scalar @ops);
-
-      foreach my $index (0..$#len){
-	foreach (1..$len[$index]){
-	  # print  "$ops[$index]";
-	  push @comp_cigar, $ops[$index];
-	}
-      }
-    }
-    # warn "\nDetected CIGAR string: $cigar\n";
-    # warn "Length of methylation call: ",length $meth_call,"\n";
-    # warn "number of operations: ",scalar @ops,"\n";
-    # warn "number of length digits: ",scalar @len,"\n\n";
-    # print @comp_cigar,"\n";
-    # print "$meth_call\n\n";
-    # sleep (1);
-  }
-
-  ### adjusting the start position for all reads mapping to the reverse strand
-  if ($strand eq '-') {
-
-    if (@comp_cigar){ # only needed for SAM reads with InDels
-      @comp_cigar  = reverse@comp_cigar; # the CIGAR string needs to be reversed for all reads aligning to the reverse strand, too
-      # print @comp_cigar,"\n";
-    }
-
-    unless ($ignore){  ### if --ignore was specified the start position has already been corrected
-
-      if ($cigar){ ### SAM format
-	if ($cigar =~ /^(\d+)M$/){ # linear match
-	  $start += $1 - 1;
-	}
-	else{ # InDel read
-	  my $MD_count = 0;
-	  foreach (@comp_cigar){
-	    ++$MD_count if ($_ eq 'M' or $_ eq 'D'); # Matching bases or deletions affect the genomic position of the 3' ends of reads, insertions don't
-	  }
-	  $start += $MD_count - 1;
-	}
-      }
-      else{ ### vanilla format
-	$start += length($meth_call)-1;
-      }
-    }
-  }
-
-  ### THIS IS THE CpG and Non-CpG SECTION (OPTIONAL)
-
-  ### single-file CpG and other-context output
-  if ($full and $merge_non_CpG) {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	
-	if ($cigar and @comp_cigar){ # only needed for SAM alignments with InDels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition+index: ",$start+$index,"\t";
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-	
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM entries with InDels
-	  # print "index: $index\tmethylation_call: $methylation_calls[$index]\tposition-index: ",$start-$index,"\t";
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{other_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{other_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.'){}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The strand information was neither + nor -: $strand\n";
-    }
-  }
-
-  ### strand-specific methylation output
-  elsif ($merge_non_CpG) {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-    	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{other_c}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The strand information was neither + nor -: $strand\n";
-    }
-  }
-
-  ### THIS IS THE 3-CONTEXT (CpG, CHG and CHH) DEFAULT SECTION
-
-  elsif ($full) {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-	
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n" unless($mbias_only);
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-	
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{CHG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{CpG_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{CHH_context}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The read had a strand orientation which was neither + nor -: $strand\n";
-    }
-  }
-
-  ### strand-specific methylation output
-  else {
-    if ($strand eq '+') {
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start+$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    elsif ($strand eq '-') {
-
-      for my $index (0..$#methylation_calls) {
-	### methylated Cs (any context) will receive a forward (+) orientation
-	### not methylated Cs (any context) will receive a reverse (-) orientation
-
-	if ($cigar and @comp_cigar){ # only needed for SAM reads with Indels
-	  my ($cigar_mod,$pos_mod) = check_cigar_string($index,$cigar_offset,$pos_offset,$strand,\@comp_cigar);	
-	  $cigar_offset += $cigar_mod;
-	  $pos_offset += $pos_mod;
-	}
-
-	if ($methylation_calls[$index] eq 'X') {
-	  $counting{total_meCHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'x') {
-	  $counting{total_unmethylated_CHG_count}++;
-	  print {$fhs{$filehandle_index}->{CHG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'Z') {
-	  $counting{total_meCpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'z') {
-	  $counting{total_unmethylated_CpG_count}++;
-	  print {$fhs{$filehandle_index}->{CpG}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CpG}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq 'H') {
-	  $counting{total_meCHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'+',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{meth}++;
-	}
-	elsif ($methylation_calls[$index] eq 'h') {
-	  $counting{total_unmethylated_CHH_count}++;
-	  print {$fhs{$filehandle_index}->{CHH}} join ("\t",$id,'-',$chrom,$start-$index+$pos_offset,$methylation_calls[$index]),"\n" unless($mbias_only);
-	  $mbias_1{CHH}->{$index+1}->{un}++;
-	}
-	elsif ($methylation_calls[$index] eq '.') {}
-	elsif (lc$methylation_calls[$index] eq 'u'){}
-	else{
-	  die "The methylation call string contained the following unrecognised character: $methylation_calls[$index]\n";
-	}
-      }
-    }
-    else {
-      die "The strand information was neither + nor -: $strand\n";
-    }
-  }
-}
-
-
-
-sub print_helpfile{
-
- print << 'HOW_TO';
-
-
-DESCRIPTION
-
-The following is a brief description of all options to control the Bismark
-methylation extractor. The script reads in a bisulfite read alignment results file 
-produced by the Bismark bisulfite mapper and extracts the methylation information
-for individual cytosines. This information is found in the methylation call field
-which can contain the following characters:
-
-       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-       ~~~   X   for methylated C in CHG context                      ~~~
-       ~~~   x   for not methylated C CHG                             ~~~
-       ~~~   H   for methylated C in CHH context                      ~~~
-       ~~~   h   for not methylated C in CHH context                  ~~~
-       ~~~   Z   for methylated C in CpG context                      ~~~
-       ~~~   z   for not methylated C in CpG context                  ~~~
-       ~~~   U   for methylated C in Unknown context (CN or CHN       ~~~
-       ~~~   u   for not methylated C in Unknown context (CN or CHN)  ~~~
-       ~~~   .   for any bases not involving cytosines                ~~~
-       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-The methylation extractor outputs result files for cytosines in CpG, CHG and CHH
-context (this distinction is actually already made in Bismark itself). As the methylation
-information for every C analysed can produce files which easily have tens or even hundreds of
-millions of lines, file sizes can become very large and more difficult to handle. The C
-methylation info additionally splits cytosine methylation calls up into one of the four possible
-strands a given bisulfite read aligned against:
-
-             OT      original top strand
-             CTOT    complementary to original top strand
-
-             OB      original bottom strand
-             CTOB    complementary to original bottom strand
-
-Thus, by default twelve individual output files are being generated per input file (unless
---comprehensive is specified, see below). The output files can be imported into a genome
-viewer, such as SeqMonk, and re-combined into a single data group if desired (in fact
-unless the bisulfite reads were generated preserving directionality it doesn't make any
-sense to look at the data in a strand-specific manner). Strand-specific output files can
-optionally be skipped, in which case only three output files for CpG, CHG or CHH context
-will be generated. For both the strand-specific and comprehensive outputs there is also
-the option to merge both non-CpG contexts (CHG and CHH) into one single non-CpG context.
-
-
-The output files are in the following format (tab delimited):
-
-<sequence_id>     <strand>      <chromosome>     <position>     <methylation call>
-
-
-USAGE: methylation_extractor [options] <filenames>
-
-
-ARGUMENTS:
-==========
-
-<filenames>              A space-separated list of Bismark result files in SAM format from
-                         which methylation information is extracted for every cytosine in
-                         the reads. For alignment files in the older custom Bismark output
-                         see option '--vanilla'.
-
-OPTIONS:
-
--s/--single-end          Input file(s) are Bismark result file(s) generated from single-end
-                         read data. Specifying either --single-end or --paired-end is
-                         mandatory.
-
--p/--paired-end          Input file(s) are Bismark result file(s) generated from paired-end
-                         read data. Specifying either --paired-end or --single-end is
-                         mandatory.
-
---vanilla                The Bismark result input file(s) are in the old custom Bismark format
-                         (up to version 0.5.x) and not in SAM format which is the default as
-                         of Bismark version 0.6.x or higher. Default: OFF.
-
---no_overlap             For paired-end reads it is theoretically possible that read_1 and
-                         read_2 overlap. This option avoids scoring overlapping methylation
-                         calls twice (only methylation calls of read 1 are used for in the process
-                         since read 1 has historically higher quality basecalls than read 2).
-                         Whilst this option removes a bias towards more methylation calls
-                         in the center of sequenced fragments it may de facto remove a sizable
-                         proportion of the data. This option is highly recommended for paired-end
-                         data.
-
---ignore <int>           Ignore the first <int> bp from the 5' end of Read 1 when processing the
-                         methylation call string. This can remove e.g. a restriction enzyme site
-                         at the start of each read or any other source of bias (e.g. PBAT-Seq data).
-
---ignore_r2 <int>        Ignore the first <int> bp from the 5' end of Read 2 of paired-end sequencing
-                         results only. Since the first couple of bases in Read 2 of BS-Seq experiments
-                         show a severe bias towards non-methylation as a result of end-repairing
-                         sonicated fragments with unmethylated cytosines (see M-bias plot), it is
-                         recommended that the first couple of bp of Read 2 are removed before
-                         starting downstream analysis. Please see the section on M-bias plots in the
-                         Bismark User Guide for more details.
-
---comprehensive          Specifying this option will merge all four possible strand-specific
-                         methylation info into context-dependent output files. The default
-
-                         contexts are:
-                          - CpG context
-                          - CHG context
-                          - CHH context
-
---merge_non_CpG          This will produce two output files (in --comprehensive mode) or eight
-                         strand-specific output files (default) for Cs in
-                          - CpG context
-                          - non-CpG context
-
---report                 Prints out a short methylation summary as well as the paramaters used to run
-                         this script.
-
---no_header              Suppresses the Bismark version header line in all output files for more convenient
-                         batch processing.
-
--o/--output DIR          Allows specification of a different output directory (absolute or relative
-                         path). If not specified explicitely, the output will be written to the current directory.
-
---samtools_path          The path to your Samtools installation, e.g. /home/user/samtools/. Does not need to be specified
-                         explicitly if Samtools is in the PATH already.
-
---gzip                   The methylation extractor files (CpG_OT_..., CpG_OB_... etc) will be written out in
-                         a GZIP compressed form to save disk space. This option does not work on bedGraph and
-                         genome-wide cytosine reports as they are 'tiny' anyway.
-
---version                Displays version information.
-
--h/--help                Displays this help file and exits.
-
---mbias_only             The methylation extractor will read the entire file but only output the M-bias table and plots as 
-                         well as a report (optional) and then quit. Default: OFF.
-
-
-
-bedGraph specific options:
-==========================
-
---bedGraph               After finishing the methylation extraction, the methylation output is written into a
-                         sorted bedGraph file that reports the position of a given cytosine and its methylation 
-                         state (in %, see details below). The methylation extractor output is temporarily split up into
-                         temporary files, one per chromosome (written into the current directory or folder
-                         specified with -o/--output); these temp files are then used for sorting and deleted
-                         afterwards. By default, only cytosines in CpG context will be sorted. The option
-                         '--CX_context' may be used to report all cytosines irrespective of sequence context
-                         (this will take MUCH longer!). The default folder for temporary files during the sorting
-                         process is the output directory. The bedGraph conversion step is performed by the external
-                         module 'bismark2bedGraph'; this script needs to reside in the same folder as the 
-                         bismark_methylation_extractor itself.
-
-
---cutoff [threshold]     The minimum number of times a methylation state has to be seen for that nucleotide
-                         before its methylation percentage is reported. Default: 1.
-
---remove_spaces          Replaces whitespaces in the sequence ID field with underscores to allow sorting.
-
-
---CX/--CX_context        The sorted bedGraph output file contains information on every single cytosine that was covered
-                         in the experiment irrespective of its sequence context. This applies to both forward and
-                         reverse strands. Please be aware that this option may generate large temporary and output files
-                         and may take a long time to sort (up to many hours). Default: OFF.
-                         (i.e. Default = CpG context only).
-
---buffer_size <string>   This allows you to specify the main memory sort buffer when sorting the methylation information.
-                         Either specify a percentage of physical memory by appending % (e.g. --buffer_size 50%) or
-			 a multiple of 1024 bytes, e.g. 'K' multiplies by 1024, 'M' by 1048576 and so on for 'T' etc. 
-                         (e.g. --buffer_size 20G). For more information on sort type 'info sort' on a command line.
-                         Defaults to 2G.
-
---scaffolds/--gazillion  Users working with unfinished genomes sporting tens or even hundreds of thousands of
-                         scaffolds/contigs/chromosomes frequently encountered errors with pre-sorting reads to
-                         individual chromosome files. These errors were caused by the operating system's limit
-                         of the number of filehandle that can be written to at any one time (typically 1024; to
-                         find out this limit on Linux, type: ulimit -a).
-                         To bypass the limitation of open filehandles, the option --scaffolds does not pre-sort
-                         methylation calls into individual chromosome files. Instead, all input files are
-                         temporarily merged into a single file (unless there is only a single file), and this
-                         file will then be sorted by both chromosome AND position using the Unix sort command.
-                         Please be aware that this option might take a looooong time to complete, depending on
-                         the size of the input files, and the memory you allocate to this process (see --buffer_size).
-                         Nevertheless, it seems to be working.
-
---ample_memory           Using this option will not sort chromosomal positions using the UNIX 'sort' command, but will
-                         instead use two arrays to sort methylated and unmethylated calls. This may result in a faster
-                         sorting process of very large files, but this comes at the cost of a larger memory footprint
-                         (two arrays of the length of the largest human chromosome 1 (~250M bp) consume around 16GB
-                         of RAM). Due to overheads in creating and looping through these arrays it seems that it will
-                         actually be *slower* for small files (few million alignments), and we are currently testing at
-                         which point it is advisable to use this option. Note that --ample_memory is not compatible
-                         with options '--scaffolds/--gazillion' (as it requires pre-sorted files to begin with).
-
-
-
-Genome-wide cytosine methylation report specific options:
-=========================================================
-
---cytosine_report        After the conversion to bedGraph has completed, the option '--cytosine_report' produces a
-                         genome-wide methylation report for all cytosines in the genome. By default, the output uses 1-based
-                         chromosome coordinates (zero-based cords are optional) and reports CpG context only (all
-                         cytosine context is optional). The output considers all Cs on both forward and reverse strands and
-                         reports their position, strand, trinucleotide content and methylation state (counts are 0 if not
-                         covered). The cytsoine report conversion step is performed by the external module 
-                         'bedGraph2cytosine'; this script needs to reside in the same folder as the bismark_methylation_extractor
-                         itself.
-
---CX/--CX_context        The output file contains information on every single cytosine in the genome irrespective of
-                         its context. This applies to both forward and reverse strands. Please be aware that this will
-                         generate output files with > 1.1 billion lines for a mammalian genome such as human or mouse.
-                         Default: OFF (i.e. Default = CpG context only).
-
---zero_based             Uses zero-based coordinates like used in e.g. bed files instead of 1-based coordinates. Default: OFF.
-
---genome_folder <path>   Enter the genome folder you wish to use to extract sequences from (full path only). Accepted
-                         formats are FastA files ending with '.fa' or '.fasta'. Specifying a genome folder path is mandatory.
-
---split_by_chromosome    Writes the output into individual files for each chromosome instead of a single output file. Files
-                         will be named to include the input filename and the chromosome number.
-
-
-
-OUTPUT:
-
-The bismark_methylation_extractor output is in the form:
-========================================================
-<seq-ID>  <methylation state*>  <chromosome>  <start position (= end position)>  <methylation call>
-
-* Methylated cytosines receive a '+' orientation,
-* Unmethylated cytosines receive a '-' orientation.
-
-
-
-The bedGraph output (optional) looks like this (tab-delimited; 0-based start coords, 1-based end coords):
-=========================================================================================================
-
-track type=bedGraph (header line)
-
-<chromosome>  <start position>  <end position>  <methylation percentage>
-
-
-
-The coverage output looks like this (tab-delimited, 1-based genomic coords):
-============================================================================
-
-<chromosome>  <start position>  <end position>  <methylation percentage>  <count methylated>  <count non-methylated>
-
-
-
-The genome-wide cytosine methylation output file is tab-delimited in the following format:
-==========================================================================================
-<chromosome>  <position>  <strand>  <count methylated>  <count non-methylated>  <C-context>  <trinucleotide context>
-
-
-
-This script was last modified on 25 November 2013.
-
-HOW_TO
-}
--- a/test-data/bwa-mem-fastq1.fq	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,396 +0,0 @@
-@M01368:8:000000000-A3GHV:1:1101:6911:8255/1
-ATCTGGTTCCTACTTCAGGGCCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATT
-+
-BCCCCFFFFFFFGGGGGGGGGGGHHHHGHGHHHHHHHHHGGGGGGHHHHGHHHHHHHHHHGHHHHHHGGHGGHHHGHHHHFHHGHHHHHHHHHGHEHEFFGHHEGGCEFGGFHHHBGHHGHHHHGHFHHHGHGHGHGGCDFDDACGGGGGGGAAFFFFFFFFFBAFFFFFB;FFFFFFADDFFFFFFFFFFEFFFFFFFFFFBFFFFFFFFFFFFFFEFFFFFFFFBFEFFFFEFE;DFFFDFBFF/9BFB
-@M01368:8:000000000-A3GHV:1:1101:14518:9998/1
-GTTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCATCGTGAT
-+
-AAAAAFFFFFFFGGGGGGGGGGHGGHHHHGHHHHHHHGCGHHHHHHHHHHHHHHHGGGGGHHHHHHHHHGHHGFHFE5BGEEHFGGGHHHHHHHHFBHHGGGGFHGHHFGHHHHGHHHHHHGEGGGGFHFHGEGHHGGCDGDGHGGGDGGHGGCGGGHGHHH/ACDG?.1FGCDCCGCA.CC@CDCHFHGFFGGGEBFGAB//CEFBFGG.:;D;;A0AFFFFFB..:@ABFF//;BFFFFFBF/9D:A//
-@M01368:8:000000000-A3GHV:1:1101:18422:19051/1
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
-+
-CCCCCFDDDDDFGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHHHHFHHHHGGGGHHHHHHHHHGHHHHHHHHHHHHGGHGGHHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHGCGGGHHHHHHHHHHHHHHHHHHHHHHGFDHGFHCFGGGGFGGFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF;FFFFFFFFFFFFFFFFFFFFFFFFFFFFEFBFFFFFFFFFF:FFF.
-@M01368:8:000000000-A3GHV:1:1101:25545:21098/1
-ATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATAAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGGCTTATTTAAGGGGAACGGGTGGGG
-+
-33AA?DFD5BDFGGGFEBDGEGHEGHGEGHCEGGHHCHGHHFFHHGFGAGE53FF2FAFFGDE5FFFE5GFBFGAEE1GHHHGHHHEHE3FGHF@GEGEGGHHGG3FAGFFDE?EEE3GFEGFGFGGCG?GHHHFHGGGC@DHFFHD/A<C@EGFDCGGGHFHHHEGFGHBFHG0:CEHFCHGGED.;0CEF.F99B0CFFEEFGGG0FBFBBF0F/FFBDE?/9//9B.FFBFFFFFFBF..A..;@B--
-@M01368:8:000000000-A3GHV:1:1101:5446:12248/1
-AATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTAT
-+
-CCCCDFFFFCCFGGGGGGGGFGHHHHHGGGGHHHHHHHHHHHHHHHHGBGHGGHGGHHHHHHHHHHGHGHGGGGGHHHHHHHHGHHHHHHHHHGGGGGHHHHFFGHHHGGGGGGHHHGFGGHHGGGGHHHHHHGGGGGGHGHHGGGGGGGHGGGGGGHHHHHHHHHHHHHFHGGGHHHHGGGGGG:FE;EGEGGGGG/;?FGGGGGGGFFFFGGFFFFFFFFFBFFFFFFFFFFBFFFFFFEFFFFFEFFF
-@M01368:8:000000000-A3GHV:1:1101:5861:6452/1
-ATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTT
-+
-ABCCCFFFFFFFGGGGGGGGGGHHHHHHHHHHHGHHHHGHHHHHHHHHHHGGGGHHHHHHHHFHHHHHHGGHGHGGHGGHHHHHHHGGHFHHHGGGGGHHHHHHHHHHHHHHHHHHGGGGGHHHHHEGGHHGGGGGGHHHGGGGHGGGGGHHHHHHGGGDCGHHHHGGGGGGGHEFGGGGHGHHHGHGGGFGGGGGGGEGGGGGGG?E0CEFGGGGGFEE9EEFFFFFBFFFFFFFBFFBD.AFFFFFFF0
-@M01368:8:000000000-A3GHV:1:1102:10403:6021/1
-CGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTG
-+
->A@AAAAD2ADDFFGGGGGFGGHA?EAEFBEAGHFABFGG5FDF5DB1EEGAFDFB53FF5FH@G5FFEHGHEFHFFHBE333GF43GCGGGGE@0?BFGGB0B?FHGFDGGHHHBFFDEGGHGFFFDFE@<1>@FFFGHHHHFHEFGDABFFGG/@DCE<CG1<GF0/DD000=<DHGBDFDCECE/:AC?-;-;9B/ABBB-AD9BFB99AB?BDFBAD-.9..@;=;;..9..9/9;BEF;A:9/BFF
-@M01368:8:000000000-A3GHV:1:1102:10677:23253/1
-CCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTCTGTCTCTTATACACA
-+
-ABBBBFFFFFFFGGGGGGGCGGGHHHHHGHHHHHHHHHGHHHHHHHHHHHGHHHHHGGGGGHGHHHHHHHHHHHHHBGFHHHHGHGHGGHGGGCGGGHHHGGGGGGGHHHGHGGGGGGGGGGGGGGGGGGGGFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFEDBDFFFFFFFEFFFE0F0FBFFFF0FFFFFFFFFFFFFFFFF:
-@M01368:8:000000000-A3GHV:1:1102:13809:1733/1
-ATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGAGGGCTATTTAGGTTTTATGCTGTCTCTTATACACATCTCCG
-+
-BCCBCFFFFFBFGGGGGGGGGGHHHHHHHHHHHGHHGGGGGH3EHHHGHGHHHHHHHHHGGCEGGGHHHGGGFHGGGGGGHHGEAEFHHGGGGHHHHHHGGGGGGHHHHGGGGGGGHGGCFFGHHFGHHHGHHHHHHCHGFHHHHGGHGGG00EHGHHHGFHHGEHGHFFFHHGGFHHHGGGGGGGGGB;;CFFGGFGFFBFFDFED;E.:A?DFFFFFFFF:FFFFF0BFFBBBFFFFFBFF0BFBF9F.
-@M01368:8:000000000-A3GHV:1:1102:17584:10050/1
-ATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTATGCCGTCTTCT
-+
-CCCCCFFFFFFFGGGGGGGGGGGHHHHHGGHHHGGGGGGHHHGFGDHHGGGGHHHHHHGGGGGGHHHHGGGGGGGHGGGEGGHHHHHHHGHGHHGHHHHGHHHHGGGGFDGHFHGEHHHHHHGFFHHHHHHHHHHHHHHHHHGGHHHHHHHHHHFHHHHHHGGGGGHHHHGGGHHGHHHGGGGGGGGGGGFGFFGGGGGGGCFGGGFGGGGGGGFFFFFFFFFFFFFFFFFFF;.BF9ADF/9;A;DFFF0
-@M01368:8:000000000-A3GHV:1:1102:18842:24844/1
-CACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCT
-+
-BBBCBFF@CCBBGGGGGGGGGGHHGHGGHHHGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHHFHHHHGGGGGHHHHHHHHHHHHHHHHHHHHGGGHGGHHHHHHGHBFGHHHHHHHHBGHHHHHHGHGGGHFGCGGFHHFHFFHHBHHHHFFHFHHHHGGDHGGBC?;@DFBFFFFFFFFFBFFFFFFFFFFFFFF.B?FB.@;;DFFFFFFFFFFFEE-A./BBBFBFBFFF//BFB/BFF/
-@M01368:8:000000000-A3GHV:1:1102:21788:11027/1
-GCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTCTG
-+
-ABCCBCCBBFFFGGGGGGGGGGGHGHHHHHHGGHGGHHHHHHHHGHHHHHHHHHHHHHHHHHHGHHHHHFGGGGHHHHHHHHHHHHHHHHHHHHHHGHGHGGFCGGCGGGHHHGGGGGGGGGGGGGGGGGGGGGGGGGFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF9EFFFFFFFFFFFBFF0FFBBBBFBFBFFFF0
-@M01368:8:000000000-A3GHV:1:1102:5728:8777/1
-ATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATG
-+
-BBBBBFFFFFAFGG5GGGGGGGHHHGHHHHHHHHHHGGGGGHHHHHHGHHHHHHFGHHHGGGGGFHGHGGGHHHGGGCEGHHGG?F1BGGGGGHHHHHGGGGEGGHHHHGGGGGCGHGGGGCGHHHHHHHHHHHHHHHHGGHHHHGGCEEDFDEGGHHHHHHHCEHHFHHHHGHGFHHHFFGGGFFFGGFGBGFFFFFFFFGFDGGD9EFA.DAFA/;FEFF9FB?/BBF/FFFFBBFFFFF/FFEFFFBB
-@M01368:8:000000000-A3GHV:1:1102:5983:21093/1
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
-+
-AAABCFCABBCFGGGGGGGGGGHHHHHHGFHHHHHHHHGGHHHGHGHHHGGGGFHHHHHHHHGHHHHHHHHHHHHHGGHGGHHHHHHFHGGHHHHFHGHHEHHHHHHHGHHHHHD@FGGHHHHHFFFHHGGHGH?DHHHHHGHGHEGG/@?ADGFGGFFFFAFFFFFFFFFFFFFFFFFFFFFFFAAFFFFFFDFFFFFFFF;D9BFFFFFFFFFFFFFFFFFEFFFBBFFF0BFFFBBFF0EFFFFFFFA
-@M01368:8:000000000-A3GHV:1:1102:7765:18353/1
-CTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTC
-+
-CCDCCCCCCBCFGGGGGGGGGGGGGGGHHHHHHDHHHHHHHHHHHGGGGGHHGHGHHHGHHHHHHFHHHHGHHHHHHGHGHHHGHHHHHGGGGHHHHHHHHHHHHHHHHHHHHHHGGHGGHHHHHHHGFFHHHHHGHHHHHHHHHHHGHHHHHGCFGGHGHFHHGHGHGHHHHGGFHHHHGGGHGBFGCC=BFFFFFFFF-@DFFFFFFFFFFFFFFFFFFFFFFAFFAEF.::FBFBFFE-A9:BFFFF0
-@M01368:8:000000000-A3GHV:1:1103:10405:17879/1
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
-+
-CBCCCFCCCCCFGGGGGGGGGGHHHHHHHHHHHHGHHHGHHHHHHHHHHHGGGGGGHHHHHHHHHHHHHHHHHHHHGGHGGHHHGHHGHHGHHHHHHHHHCGGFHHHHGHHHHHGCFGGHHGHHHHHHGFHHHGHHHHHHHGHGHGFF/CC?ADAFGFFFFFFFFFFFFFFDFFFFFFFFAFFFFFFFFFFFEDFFFFFFFFFFAFFFFFFFFFFFFFFFFFFFFFFBBFBFBFFFFFFFFFFFFFFFFF?
-@M01368:8:000000000-A3GHV:1:1103:13493:8205/1
-GTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATT
-+
-CCCCCFFFFFFFGGGGGGGGGGGGGGGHFHHHHHHHHHHHHHHHHGHHHHHHHHGHHHIHHHHHHHGGGGFHHHHHHHHHHHHHHHHHHHGHGGHGGHHHHHHHHHGHHHHHHHHHHHHHHHHHGHHHH/FGGGGHHHHHHHGGEHHHHHGHHHHHHGHGHEFEFGGFFFFFFFFFFFFFFFFFFFFFAFDFFFFFAFFFF;;@FFEFFFFFFFFFFE=?AFFFFFFFFFFFFFFFFFFBFBBBFFFFEFF
-@M01368:8:000000000-A3GHV:1:1103:14060:21273/1
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTACTGTCTCTTATACAC
-+
-AAABAFCCCCCFGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHHHHGHHHHGGGGGFHHHHHHHHHHHHHHHGHHHHGGHGGHHHHHHHHHHHHHHHHHH?GGHHHHHHGHHHHHFEGGGHHHHHHHHHHHHHHHGFHHHFHGHGHGFGCGG@@BCFGFFFFFFF?FFFFFFFFAFFFAD?@FFEEFFFFFFFFFFFFFFFFFFD9BFF/B/FFF/:/9FB9/BFA//;BFB:FFFBB/BFFFFFBFFFFB/
-@M01368:8:000000000-A3GHV:1:1103:14528:12993/1
-GCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGAT
-+
-BBBBBFFFBDFFGFBCG2EGFFGHHCF5AFHHHFHFHHHGG?CEHBHHDGFHHGHHGHBGHABFFBGHGDGGGFHGHHGGHHHGGG@E1GEHHHGHHFHH3FEDHHHHGFGHGFHHGHFBGA?FGHHHHHGHHFFGHFDFGGHHH2??<ECFHHGHHHHHHHHHGHH<1DFGHGC<.FCB/<=@DCFFFFFEDA=-AAB9B/9B9B-@?.-;A-AFF.=-=BFEFEDEFFFBFEA-A.B//9F9F//;BBB
-@M01368:8:000000000-A3GHV:1:1103:17657:20856/1
-AAAGCGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTAT
-+
-ABB?AABBBBFFGGGGGGGGGGHHHHHHHHGHHHHHHHHHHHHHHHHHGHHHHHHGHHHHGGGGGHHHHHHHGHHFHHHHHHHHHHGGGGGHHHHHHHH3BGGHHHHHHHEHHHHHHHGHHHHGEEGGGHHHHHHHHGHHFHGHGHGHGHHCHGGECCDFGB@AFFFFFFFFFFFFFFFFFDAFFFFFFFFFFFFFCAF;AFFFFEFFBBEFFF9FBBFFFFFFFFFFEFFFFFFFFFFFFF/FFFFBFF9
-@M01368:8:000000000-A3GHV:1:1103:23099:3794/1
-AAGACAGATACTGCGACATAGGGTGTTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCTCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGGATGCCGTCT
-+
-BBBBBFFFFFFFGGEEGGFGGGGCFGEHCGGGGGGFHFFEDEHFGGDEHHHHHHGGFECGHHHHGFEFGCGHGGFGGGHBGFH3/BF3GGGHHEEEHHG22???BCFFFFFFHHFHFF@FGHH11GHHHHFGFHHHHGGHHHHEFFGFGHFG1DGFGGGGEDCCCAEGGFFHHFHHHHHHCFBBFGBFFF/0;B0B00;B0BBFGBB9BFGEFGGGFFDEEAB;BDDBFBFFFFF@;.9BF..;-./-A=F
-@M01368:8:000000000-A3GHV:1:1103:25465:20010/1
-GACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATCGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTATGCCGTCTTCTGCTTGAAAAAAAAAAAACAACAGAC
-+
-ABBBBFFFFBAAGGGFEFGGGGHHFEFFHFGGGGGHHHGHFGGGGGHHHGGGGGGGGHGEEEGGHHHGFHEHFHDGHGHEHGF?FGG?GGGGHHGHF4F?2?DDCDHGHHHHHFG2@FGHHHGH?CFGGHFHFHHHHGDDGGHGGGGGHGFH.<AFAGHHHFHGHHFCGFHHHHHGHHHHBGHHGGDGAGF.CEGCFDGGGGGEFFF=B.FFFEFFFFFFADF?/9//BFF.B/;:>---;--..;.../9
-@M01368:8:000000000-A3GHV:1:1103:25519:6301/1
-AAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGCATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATTTCGT
-+
-3A3AAFFFFBFFGGG2CF?4FGHGHHCHGGHHBHGFFAGGHHFFHHCGHFEGCECEGHFFFHGHHGFGHFGDAFDGFFEEFEGGBECC/<A@DFBBEGC--:;GHHHGBECG@:9-9.-9C/ABB?B@?.EDAFFFFBAFBFBFBFFFFF//;BBFFFF/;/9BBF/BBFBFFFFFFFFFEFF??BF/.AF./;B/9FFFFFFBFBFFFBFFFBFFFFF/BF/A---9.9A-B?DFFF/B/B?---.//;.
-@M01368:8:000000000-A3GHV:1:1103:6074:6549/1
-TAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTG
-+
-CCCBCFFFFFCCGGGGGGGGGG5GFHHHHHGHHHGGGGGHHHGHHHHHHHHHHHHGHHHHHHHHHGGHHHHGHHHHHHGGGGHHHHHHHHHHHHHHGHHHHHHHGGHGGHHHHHHHFGHHGHGHHHHHHHHHHHHHGHHHHHGGGGCHHHHEHGHHHEGHHHFGGHHHHGHGHGHF@CCBDFAFFFFFF-CDFFFFFFFFFFFFFAFFFFFEFF;BFF?FEDFFFFFFFF-A./FFFFFFFFFFFF/BFF/
-@M01368:8:000000000-A3GHV:1:1104:11572:8264/1
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
-+
-BABCBFBACCCFGGGGGGGGGGGHHGHHGHHHHGFGCHGHHGFFHEHHHHGGGGFGHHHHHHHHHHHHGHHHHHHHGGGGGHHHFFHHGHHHHHHHHHHHEHHHHHHHGHHGHGGEGEGHHHFHHHHGHHHHHHGGHHHHHGHGEGEHCGG-BGDFGFFFFAFFDFFFFEFFCFFDDFFFFFFFEC>;>=EF?AEFFFF;9;=DAFFFFBBFFFBFFF//;BFB.:FBFFBB/BFFFF/BFFE?EFAFEF9
-@M01368:8:000000000-A3GHV:1:1104:11928:24197/1
-ACGTAGGTGCGATAAATAATGGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGATA
-+
-CDDCCFCFFFBCGGGGGGGGGGHHHGHHHGGGGGHHHHHHHHHHHHHHHHHHGGGGGHHHHGGGHHHGGGGGGHHHGGGGHHGGGGHHHHHHGGGGGGHHHHGGGGGGGHGGGGGGHHHHHHHHHGHHHHGHHGHHHHGGHGEEGGGGFHHFHHHGHGEHHHHHHHHHHHHHHHHHGGGGGGFGGGGGGGGFFGGGFGFGAEFEFGFEAFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF@D9
-@M01368:8:000000000-A3GHV:1:1104:12288:20635/1
-CACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGCCGCAGCATCTGTCTTTGATTCCTGCCT
-+
-ABA?AFBAB2>AFGGGGFFGD5GGHGFFHGHEGGGGHHHHFFHH5FHGHHHFFHEFHHHHHHGGHHHHHGFHGGHGGGGFHGGGFBHHHFGEGHHHHGHGGGGECEHHFHHGHHFFHFGGGHHHEGHDGHHGHGHFHHHECGCBCHHGFHHFHD1GFHEFHEF?GDCFFEFE0A@;@>BD/9BFBBBBFDFFFF99D=?>DDBFF-AFFEBB9BBEFEFAFFF//-@---;;FBBFBFB///;99999BA9
-@M01368:8:000000000-A3GHV:1:1104:13832:4398/1
-CACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTATGCCGTCTTCTGCTTGACAAAAAAAAACACACAACAACCAACACCCAGTAGACTAGTGCGTC
-+
-AAABABCAFFFFGGGGGGGGGGHFHHHHHHHHHGFFHHGGHGGGGGHHHHHHHHHHFHHHHGHHHHHGGHGHGGHGGGGGGGHGFFGGGGDGGHHHHGGGGFGGGGGCFGGEGCDGGGGGGGGGGGGEGF?;BFFFFFFFFFFFFFFFFFF:FFFFFFFFFFFFFFFFFFFFFFF/FFFFFFC.;BFEAFFFFF;@FFBFFFFEF?/FFFFE----:...:...9....9.9...:.9//9////;/9-.-
-@M01368:8:000000000-A3GHV:1:1104:23670:4161/1
-ATTCAATTGTTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCC
-+
-AAAABFFFFFFFGGGGGGGCGBBGGHHHHHHHHHGHHHHHHHHHHFGGHHHHHHGGFHHHHHHHGGGGGFHHHGHHHHHGHHHHGHHGGGHGGGGHHHHHGHHHHHHEGGGFHHHGFFDGEGHGHFHGHHGEGGGHHBGHGGHGHGGGGG/@FCDFDGFHGGGDFFHFGFFGGGGGHHHHGGGGGGGEGCDG?GGBFFFEE00BFFGABBBAFGGGEGEA.9FFF/./;BFBF./AAF/BFFBBF/F/BFB
-@M01368:8:000000000-A3GHV:1:1104:24927:22253/1
-AGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTAT
-+
-AAA?AFFF3DFFFGGBGFF3EAEEEHFHHFHHHGHHHHDGHHGAEFGHHHGFCHHGHHHBGHHHAEGGHGGFHFBFHHHHHHHHHHFHH1EEHEEHH1FFDEEFCGHBGHHFHEHHHHHH1FCGHHHHEEFGEEGFFCHHH11>GHHF/FG2DGGCGAGGHGGGG@@@BEFFF?@@@FFEFFFFFF?@@FB@BB@FFFE=;==---A9EFBBB/;E;A9B/B/FFFEF/B///;/;9/A/;/9BFFFBFBB
-@M01368:8:000000000-A3GHV:1:1104:4705:7727/1
-CTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGG
-+
-BBBBBFFBFFFFGGGGGGGGGGHHHGHHHGHHHHH6GHHHHFFGGGHHHHHHHHHHHHHHHGGFGGGEGGGHHHHHHHHHHGHE3FGGGGHHHHHFHHHHHHHHHHHHGGGGGHHFHFCGFHHGGGGGGGHHGGGGHHGGGGGGHHHHGGGADCHHHHGDGGGGGGGGC@DGFHEHHHHHHGHHHHGFGDEGFGFFGGGGCFGBEGFGGGFG;C.BFFFFFFFBFBFFFF/F?.AFFF/BFFEFFFFFEFF
-@M01368:8:000000000-A3GHV:1:1104:7756:4776/1
-GGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGA
-+
-CCCCCCFFFFFFGGGGGGGEEFHHHHGHGHHHHHHGGHHHGGGGGGHHGHHHHHGHHGHHHGGFHHHHHHHHGHHHFHHGHHGFGGGGHHHHHHHHGHGHFFHFHHHHHHGGHGFGFHHHGHG?FGHHHHHHHHHHHHHHGHGHHGHGGCDGFFHHHHGHHHHHGHHHGFHGHFHGHGHGH/@CABFFFFFFFACAFF?BBFFBFD-@-.D>FFAF.F.:9---;AADFFFFFBEFFF:9FFFFBBFFFF/
-@M01368:8:000000000-A3GHV:1:1105:11310:21761/1
-ATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGATACAGTTCACTTT
-+
-CCCCBFFFFFFFGGGGGGGGGGGHHHHHHHHHHHHGHHHHHGGGGGHHHHHGGHHHGGGGGGHHHGGGGHHGGGGHHHHHHGGGGGGHHHHGGGGGGGHGGGGGGHHHHGHHHGHHHGHGHHGHHHHGGHGGG=FFGEHHHHHGHFGGHHGHHHHHFHHHHHHHGGHHHHHHHGHEHHGHHHHHGGGGF9AGE?DEGFFGGGGGGGGGGGGGGFFFF/9FFBFFFFFFFEFFFBFFFFFFFFFFFFEFFF0
-@M01368:8:000000000-A3GHV:1:1105:11578:14676/1
-ATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTC
-+
-CDDDDFFFBFFCGGGGGGGGGGHHHHHHHHHHHHGGGGGHHHHHHHHHHHHHHHHHHGGGGGHHHHFGGHHHGGGGGGHHHGGGGHHGGGGHHHHHHGGGGGGHHHHGGGGGGGHGGGGGGHHHHHHHHHHHHHHHHHGHHHHGGGGGGHGGHGHHHHHHH;CHHHHHHHHHHHHHHHGHGGGGFGGGFGGGGGGGGGGGGFGGGEGGFFFFFFFFFFFFFFFFFFFFFFFFF/FFFFFFFFFFFFFFFF0
-@M01368:8:000000000-A3GHV:1:1105:13575:19255/1
-TTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGTTCCCGTGAGTGGTTAATAGGGTGATAGGCCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATG
-+
-AA1A1DFFFFFBGG3A111FFAEGDDBGFDHF00F01BBA00BFGEHFBFFA1FABB0FAE?CFHF1BGFHFB0011F121E//>>1F10>B?EFHGCC/?/BFG/EEGFFEE//BCFDE0?E@@B/?11</?//<@?/F<<<A-<FBGH0.00=G0<<C//./0;;GC....<C.=.00;;BB./:.900////.C000;0090;..//000;C/;;/B/9BA9A9-AEEFF?B---;B99//9/;A//9
-@M01368:8:000000000-A3GHV:1:1105:15502:11453/1
-GTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCTGTCTCTTATACACATCTC
-+
-A3AAAFFFFFCFGGGGGGGGGGHHGHHHGHHHHHHHHHFGHHHHHGGGGHGHHHHHGFHHHHGHGGGHHGGHGGHHHHHHHHHHHHHHGGGGGFHGHHHGHHHHHGHHHHGGGGGGHGEGFECHEHGGGGGGHHHGADFHHGGGGHHHHH<ECGGGGHHHHGGGGGGGHGGGGGGHHHGHGHHGEHBFFFGFGEGGGGGEDEGF0C;;BFFFGGGBEFFE/FFFFFFFFFFFFFFEFFFFFFFFBFFFBFF
-@M01368:8:000000000-A3GHV:1:1105:16787:9771/1
-GTTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGAT
-+
-AABCCFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHGHHGGGGHIIHHHHHDHHHHHHHGHHHGGHGGHHHHHHHHHHHHHHGGGGGHHHHHHHHHHHHHHHHHHGGGGGHHHHGGGHHHGGGGGGHHHGGGGHHGGGGGHHHHHGGGGGGHHGHGGGGGGGEEGEGFGHHHGGGGFFGGGGGGGGGGGGGGGEG?G;:EFFFFFFFFF:AEFFFFFFFFBFFFFFFFFFEFF/
-@M01368:8:000000000-A3GHV:1:1105:17564:15723/1
-TATGCTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAA
-+
-EDCCDFFCEEDCGGGGGGGGGGHHHHHGFGHGGHGGHHHHHHHHGHHEHHGGGGGHHHHHHHHHGHHHGHHHHGGGGGHHHHFFGHHHGGGGGGHHHGGGGGHGGGGHHHHHHGGGGGGHHHHGGGGGGGHGGGGGGHHHHHFEHHHHHHHHHHGHHGHGGHGGGCGGGGHHH1FGGGFGGFGGGGGGGGGGEFGGGGGGGGGGGGGGGGGFFFFFFFFFFAEFFFFFFFFFFBBFBBFFFFFE1:BFFB0
-@M01368:8:000000000-A3GHV:1:1105:18108:12091/1
-TAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGATACCTGTCTCTTATACAC
-+
-CCCCCFBFFFFFGGGGGGGGGGHHHHHHHHHHHHHGGGGGGFHHHBFGHHHGGGGGGHHGGGGGHHGFGGHHHHHHGGGGGGHGHFGGGGGGDGEGEFGCHHHHHHHHHHGHHHHGEDHHHGGGCDGGGGFHFHGHHHGHHGHFGHHHFHHGFHHHFHHGGHFHFHHGB0CGHGFHCBGGGGEDEE9ADFEFFFGFBFGFFGGFFFFFGGFGFFFFFFFF/A?FEFFFFFEF-A.B//;BFFEF//BB///
-@M01368:8:000000000-A3GHV:1:1105:18331:16683/1
-TCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTA
-+
-BABA?DFFFFFFGGGGGGGGGGHHHHHHGHGHHGGGHHGHGGGGFFHHGHHHGHHHHHHH3FGHHGGGHGGHHHHFHHHFHGHHHGHHHHHHHHHHHHGHHHHGGCGGGHHGHHHHHHHHHHHHHFHHGHHGHGHEFGGGGABFFFGBEGGAFFFFFFFFFFFFFDDFF?DFFFFFFFFAEFFFFFFFFFFFFB;9FFFFFEFFFFFFFFFFFF?FFFFFFF/BFFFFFFFB.DABFFFFFFB.//:FB//
-@M01368:8:000000000-A3GHV:1:1105:20577:18421/1
-GGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCC
-+
-ABB@3>AAFFFFFEAGGGFGGAA6FHDGGCGFHFFHFHFHHHHHGDDDFFFHGFFHGBEGEGHHHFFFHGEEAEGHHHHHFHHHFHGHFEDGGEGBEAGEFHHFFHHHHHHGGHHHGHHGBGHHFHHFGHHHHG?CG?AFHH1FHHHGHFHHHF?DGHFFHCGAGEFHGCBBBB?BFFF?B-B.9/BFFFFFB=-AD?..@FFFF@@-@@?AFD.FFFBBEEBD9/:FFFFFBB/:FF9BF/BF.BBFF/:
-@M01368:8:000000000-A3GHV:1:1105:21099:2895/1
-TAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTT
-+
-CBCBBFFFFFFFGGGGGGGGGGGGGFHHHHFHGHHHHHHFHHHHFGFHHHHHHGHHHHHHGHHEHGGGGHHHHHHHHHHHHHHHHHHHHHHGGHGGHHHHHHHHFHHHHGHGHHHGGHHHHHGGHFFGHGCGGGHGHHGHHHFGHHFHH/FGGGHFGFEGGCFCCD;B@DFFFFFFFFFFFFFFFFFFFFFFFFF;F.BEFADFFFF.AEFFFFFFE;D.;:B00099:09BFBFFBFF.0:000BFFBF0
-@M01368:8:000000000-A3GHV:1:1105:26469:19245/1
-TTATGATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCAAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATG
-+
-BAAAAFFFBFFFGGGGGGFFGGHHHHHHHHHHHHGGHHGHHHGGHHHHHHHHHHHDEGGHGHHHHHGEDHFHGFHGGHHGGHGGEHHHGHHGHHGHHHGGEGGGHGHGHHHHHHGHHHHGHGGGGGHFHGGGGHHGGGGCDGHHHGD<EHHGGGGGHHGHH?EDCCDHHHHDGFFGGGHGGFCGGHHHHFG.CFGGGGGGGGGGGBFGDEG.AFFG;AFFFFEB?/A9BBBFFFFFFF/9FFFFBDEFFFF
-@M01368:8:000000000-A3GHV:1:1105:7169:17145/1
-AACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGT
-+
-CCCCCFFFFFFFGGGGGGGGGGHHHHHHHHHHHBHHHHHHHGGHGGHHHHHHFHHHHHHHHHHHHHHHHHHHHGHHHHHGGGGCHHHHHHHHGHHHHHHHFHHHHHGHGHGHHGGGGGFGGHHGGGGGGGGGGGGEGGFGGGFFFFFFFFFFFFFFFFFFFFFFFFFFFDFFFFFFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFF-9@DDBFFFFFFFFBBFFF0
-@M01368:8:000000000-A3GHV:1:1106:15481:16176/1
-CTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTT
-+
-ABBBBFFFFFFFGGGGGGGGGGHHGHGHHHGHHHFGHGFGHFEHGGHGGHHHGHHHHFGHGGFGFFHHFHHHHEGHFHHHHHFGGGGGHGGGHGFHGHGGGGGGHHHGGGGHHGGGGHHHGGHGGGGGGHHHHGGGGGCFHGGGCDGHGHHHFHEHHHHHHHHHEEFHHGG:C:?0<EFGBFGGGGGFE.BFGEFFFGFFGGGGGGFDEF/FFGFFFFFFF;BBFA;.:EFFE:AAFEF.BFFFFF;9FF.
-@M01368:8:000000000-A3GHV:1:1106:17389:18671/1
-CCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGGCTTTGATTC
-+
-3>>A@FFFFFFFGGGFEECFGGFFB5GBHH5DFH5GBEEAEFHFHHF3F3GHFHHHEF3GAEHBGFHFFEFFHHHHFFB31FGGEGFHGEHHHHHHHHHHHHHHHHHEEEEGHHHFFF3GF3FGF44BBGEHHHHGG2B/BGGHE</ECDFHHBF1DGBFBFGFH<1GHGDGGFDFE0/<--;-9./BBED;BFBD/BF9BFFFDBFDADD;FFF?->;B=.9.;.BBFFF..;A;/B/;B//;;//BBF/
-@M01368:8:000000000-A3GHV:1:1106:22927:3863/1
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGACTTCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAA
-+
-A>ABAFA?D@AFGGGGFGGGFGFHHHFFH4BCBGHHHHGFFF3G5BF3322EEAFHHHHHHAB5GHFHEHFHHH3BEEHFGF5@13FDF3GDGFHHFGHHHGHHHGFGGHHFCG//?/EGHHHG3F4BFFGHHHEDGFHHB/B/?FBF<@-9?BDEFFF?B--?DFFFB9FA>B;A.BFDB?AB.--@;-.FFAEFFFF9AE;DDFFFFB/9BFFFFFFFB:BF/BB/BFF//FFF-=--.99=--.9///
-@M01368:8:000000000-A3GHV:1:1106:23625:4236/1
-TAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTA
-+
-@?AAAFFBFBFFFGGFGFGGGEFCGGHHHHFGHGHFHGHHHHGGFGGFGHHGHGHHHHGHGFFHHGGGGGHHHHHHHHHBFHHEFHHHHHHGF?FAGHGFHHHGDGFHHGGGHGHFHHHGHHHGHHFHHGFFGFHHHGHHHHFFHHHHH/FGHHHHGHGHG<C???B=@ABBFEF@=-AFFFFFFBFAFFDFFFFA?AFFCFFABEFFFFFFFFF?FFFDFFBFF;FFEFFEFFFFFFFAF///9FF/BB/
-@M01368:8:000000000-A3GHV:1:1106:26031:14826/1
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATATCGTATGCCGTCTTCTGCTTGA
-+
-ABBAAFFF@FFFGGGGGGGGGGHHHHHHGHHHHHGGGGGHHHHHHHHGHGHHHHHHHHHHHGHGHFHFGE?CGDGGHHGGGGGGGHHHHGHGGGGGGFGGGHGHGGGGGGGGGGGGGGGGGGDGAFFGFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFB/9FFBFFFFFFFFFFFFFD@D=BEFFF;FDDB////B=CF-.;BAFFFFFF;;BFE/BFFFFB:
-@M01368:8:000000000-A3GHV:1:1106:27607:15990/1
-GACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTATGCCGACTTCTGCTTGAAAAAAAAAAACTACAACCCACGGACGCA
-+
-BBBBBFFFFFFFGGGGGGGGGGGGHHHGGGGGGHHHGGGGGFCEGGHHHGHHGGGEGGHHHAFGGGGGGAFG//EGHHHHCGEHHHHEEHHFHGHFHHGGEF/FGGC?FDFH2DHHFFGGFGHHHHGGHHFGHHGHGHHGFHDHBGBBGHHFHHGGCCDC<=D<DGHHC;CGFCCFBECDG?FGGA-;EB9FBGFFBBF>DFFFE?FFF/--;;9/:BFFFBA///9----;B.//////;...---9---
-@M01368:8:000000000-A3GHV:1:1106:6455:17124/1
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
-+
-BBBAAFABDBBFGGGGGGGGGGHHHGHHGHHHHHHHHHGHHGHHGHHHGHGGGEGHHHHHHHHHHHHHGHHHGHHHGGHGGHHHHHHHHHHHHHHHHHHGHHHHHHHHGHHHHHGGCFEHHHGFHHHHGHHFFH?GGHHHHGHGHGHHCFGGGGGGGFFFFFFFFFFFFFFFFFFFFADFA?.FEFAFFFEFFFFFFFFFFFFDABFBBFFFFFFFFEFFBFFFFFFFFFFF/FFBFFFFFFADE>BFFF9
-@M01368:8:000000000-A3GHV:1:1107:14451:26748/1
-GTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGA
-+
-BABBBFFDABBBGGGGGGGGGGHGHHHHGAGHGGGGGHHHHHHHHGHHHHHGGGGGGFFHHHHHHHHHFHHHHHGGGGCHFHH3FEHHGCGGGDGHHHGFGGHHGGGGHHHHHHG/DGGGHHHHGGGGGCCHGG?CGG1GHHGHHHHBGHHHFHHGHHHHGGADAD00ECEGHEFHHFFAEFFFFFGGFBFBFFFGFFG.;B/99;BCFGGGGEFFFFFFEDA./:ADEB?FBFFFF;FFEBFBFFB./9.
-@M01368:8:000000000-A3GHV:1:1107:18714:24788/1
-GTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGA
-+
-BBBCCFFFDEDEGGGGGGGGGGHHHHHHGGHHGGHGGHHHHHHHHHHHHHHGGGGGHHHHHHHHHHHHHHHHHHGGGGGHHHHCFGHHHGGGGGGHHHGGGGHHGGGGHHHHHHGGGGGGHHHHGGGGGGGHGGGGGGHHHHHGHHHHHHHHHHHGHHHHGGEGEGCCEGGHHHHHHG:CAFFGGGGGGBFEFGGGGHGAFFGGFGGGGGGGEFFFFFFFFFEF/EDDFFFFFFFFFBFFFFFBBFFBBF/
-@M01368:8:000000000-A3GHV:1:1107:21355:8333/1
-ATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATG
-+
-ABCBBFFFFFAFGGGGGGGGGGHHHHHHHHFHHHHHGGGGGHHHHHHFHHHGHHHHHHHGGGGGHHHHFFGHGHGGGGGGGHGGEGGGHGGGGHHHHHHGGGGGGHHHHGGGGGGGHGGGGGGHGHHHFHHHHHHHHGHFFHHHHGGHGEGHHGHGFHHFHGHCEFHEGHGHHHGHHHGGGGGGCFFFFBFGGFGGGGFBG?FDGGGEGFFFFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFF.AA/9
-@M01368:8:000000000-A3GHV:1:1107:22864:15712/1
-AATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTATG
-+
-BBBBBFBBFFFFGGGGCEGGGGHGHHDGFHHHHHHHHHHHHHCHHGHFGBGDFGE?GHHGHFBHHFHHHHHHHHHGHFGFGHGHHGGC@DCFGHHGGGGGGGHHHHHHGGGGGFGGGGFFGGGGFADGFEFFFFFFFFFFF9;FFFF/BFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFEAECDFFFFFFFFFBFFFFFFFFFFFFFFEFBFBFFF/FFFDF-;-9;E@>-9DFFF/FFBF;-.:;.9A//
-@M01368:8:000000000-A3GHV:1:1107:24817:14233/1
-CTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACAT
-+
-3AABABFFBFFFGCFGGGGGGGHHHFGCFGGGFFGHHCGHHHGHGHGHBFFHHHEDGGFGFGHHFFFHGGEGHFHHGHFHGFFHHHFGHHHFHACECEHHHBGFHGFHHHFHHF4GFHFHFHEHGGE/EG:A-CFGGFGADGGGGFGGGGDAAAADFA.-AFFECFDAAFFFFEFFFFBFF;D;BFFFB/;BFFFFFFFFFFFFFFBFFBF/;//;BFFFF?FFFFFFEDAFFFFFBF//:BFBACF--9/
-@M01368:8:000000000-A3GHV:1:1107:24830:14440/1
-AACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACC
-+
-ABBBA@FFFFBBGGGGGGGGGGHGHHGHHGHHHGGHHHHHGHGHHGDHHHHHHAGGGGFHHGHHHHHHGHHHHHHHHHHHEGAFGFHFHHHHGEGHHHHHHHHHHHHHHHHHGGHHHGEFEGGHHGHHHHHGGHGFHH/?GHHHHGFGHGFHCGGBBDAFFFEFFFFFFFFFFFFFF=CDDADDFFFFEF=BFFFEFFFBFFFFEEBF./:FFFFFFFFFFFFFFFFFFFEFFFFFFFFFFF/BFBEFFC-
-@M01368:8:000000000-A3GHV:1:1107:26478:23602/1
-GCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATCTGTCTCTTATACACCTCTC
-+
-1AAAAF1B13BBBEGGGFGGGGGGHHDB1BGFHHHFGFGGG0F00BGBGFGGF1GBGB1BGCGAEE/FGFHGHFHHHHHBFF1B0FGGF//F//FGFGFFF/1@B1DFHHHGGEFEDHFDFAFF0B//</ECCC>1FDD1GFFHHDF?1BD>GF/GCAC0C@?@-;99BBB->@--;-B//99B--9-BF=A--A-:A----9AA9AFBFBBB?E@BBFFFFFFFBFFFFFBFFFBBFFF//B/////-;9
-@M01368:8:000000000-A3GHV:1:1108:11059:23181/1
-GTTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGAT
-+
-CCCCCFFFFFFFGGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHHHHHHHHHHHGHHGGGGHIIIHHHHHHHGHHHHGHHHGGHGGHHHHHHHHHHHHHHGGGGGHHGHHHHHHHHHHHHHHHGGGGGHHHHHFGHHHGGGGGGHHHGGGGGHGGGGHHHHHHGGGGGGHGGHEFGGGGGHGGG-ECHHHGGGGGGGGGFGFFGGGGFGGGCF?EFGG0;BFFFFB?9AAFFFFFFBF;BBFFBFFFFE?F/
-@M01368:8:000000000-A3GHV:1:1108:12233:13498/1
-TAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCCTGTCTCTTATACAC
-+
-BCCBAFFBCCCCGGGGGGGGGGHHHHGGGGGHHHHHHGHGHBGFHHHHHGGGGGHHGGBFGHHGGGGGGGHHHGGGGHHGGGFHHHHHHGGGGGGHGHHGGGGGGGGGGGGGGHHHHFHHHGHGHHHHHHGHGHHGGFGGGDFFGGHHHGHGH/<GHHFGBGFHFBGHHHGHHGEFHFHFGBF0BFGGGFGGGGGEFFF;A?EEG?CFFFFF0:BEFFFFFBFFFFFF0FFEFF?EFFFF0BFFFFBBB00
-@M01368:8:000000000-A3GHV:1:1108:14328:14751/1
-ATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGATACCTGTCTCTTATACA
-+
-BCCCBFFFFFFFGGGGGGGGGGHHHHHHHGHGHHHHHGGGGGFHHHFFDGHHGGGGGGHHHGGGGHHGGGGHHHHHHGGGGGGHHGHGGGGGGGGGGGCFGHHHHHHHHHHHHHHHHHGHHHHGGGDGGFGGFGGHHHHHH>FHHHFHGHGHHGHHHGHHBA<CGFHHHHHHHHHHGFHHGDDEGCEGGGGEEFBFGGGGFGGGB0CFF:FFFFFBBFFFFBFEFA.BFFFEFFFBF/BF/FFEFFBFFF/
-@M01368:8:000000000-A3GHV:1:1108:16350:22621/1
-TTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATG
-+
-AAAACFFFFFFFGGGFGGGGGGHHHHHHGBGGGFGGGHFGGGGGHHHHHGGHHHHFHGGGGGGHHGFHHHHHGEFHHFFHHGFCEFHHHGFF?GHHEE@ECFHHEGGGGBFFEGGGHFDHHGFG/BFEHHFCDGGGCDEGGGCGFFFHHHFEGHFHHHHGHHDGHHHGGHDED0CE;CFFFFBFF/;CBFFFGG0/FFF0B0:BB?.;BFF0FGFBFFFFFEFE;ADED.;BE.99FAFFFFFFF/;EFF/
-@M01368:8:000000000-A3GHV:1:1108:21791:23272/1
-CTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTA
-+
-3ABBBFFFFF@FGGGGGGGCGGGHHHHHHHHGHHACGDAGFEEHGGHHGHHHHHHHHHHHGGGGGGHHHHGFHFGHGFDDGFFFGGFGHHFF?FEGHHGGGGGGHHHGFFDHHFGG?HEFGHHGGGDDCGFFC?ECCFGDEFGGGGGGFHHHHHHHEFHFCGHHGEGGGGD.:.A;CECAFFFFBFF/;EFFBFFBFB;;BFFFFBBAA./BFFEBB//BFFFFFFFDFFFEEFEFFFBFBFBBFFFFF./
-@M01368:8:000000000-A3GHV:1:1108:23314:26089/1
-ATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTG
-+
-BBBBBFFF?FFAGFBFGGEGGGGHGHHFHHHGHHGFGGFHHHHHHHHFHHFHHGHHHGGGGGHHHHFFEHHHGGGGGGHFHGEEGF3FEFGHHHHHFFDEEEEHHHGEEGGGGGHFGGDADGFFFFFHHFGHHHFGBHGHHGBCEHDEDDGADCFFHHHGG/:GCCCGHFGHFFGG0CGFGF.FB/9;BFBB0FFBFG0A-..;C:E/.A9.FFFFFFFF9BFFFFFFBFBBB./:BFFF/F;AA?F////
-@M01368:8:000000000-A3GHV:1:1108:25084:18127/1
-TTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGAGATAGACCTGTGATCCATCGTGATGTCT
-+
-CCBBCFFFFFFFGGGGGGGGGGHHHHHGHHHHGFGGFHHHHGHHGGFHEHHHCGGGHBHHHHHHFHHGHHHHGGHHGGHGGGHHHEFHHHHEHGHGGGCFHFHHHHHHHHHHHGHEFGDEGGGHFHHCGGHHGGGGGFGHHGGEGDFHEGG/?GFHGHDGGGGGHHHHADFGGGGGEGCGGGEFGHHFEBFFGGG?GGGGEGGFEFAA?.0:A0;BFFFBFF/;9BFFFFEFF9FBFFB/F/.;FFFF/BB
-@M01368:8:000000000-A3GHV:1:1108:7626:10048/1
-ATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTATGCCGTCTTCTGCTTGAA
-+
-CCCCCFFFFFFFGGGGGGGGGGGHHHHEFEFHHGGGGGGHHHGEF?GGGGGGHHHHHHGGGEGEHHHHGGGGGGGGGGGGGGHHHHHHHHHHHHFFCGHGHHHHGG/BFGDGG2FFHFHGHH0FHFGFHHHHFFHHHHHHHGG<FHHHFGHHGGGGFHHHGGGGGGHGGHGGGHHHHHHFGGGGGGGFFFGGFGGBFGGGGGGGGGGGFGFFFCFFDFFFFFFFFF;./;AAAFFFFFFAFABBFFFB/;;
-@M01368:8:000000000-A3GHV:1:1109:11270:12255/1
-AATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAGGTAGCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTT
-+
-CCCCCFFFFFFFGGGGGGGGGGGGHHHHFFFHHHGGGFGGFFHGEGCHHGGGGHHHHHHGGGGGGHHGHGGGGGGGGGCEGFCHHHHHGFHFHHHHGFHHGGFHGGGFD/EFGEFFDGFHHGEFCEHFFGHHHGHHHHHHHHHGCGHHHGGFGHHHHGHEHHCFFADGHHHD?CG.CGHBCBFBFFGGFFFGFFFFF.CFBFBCFFFFGFFFFFGGGFFFFFDFAFFFFFF-@DBFFFFBFD---.;BAA.
-@M01368:8:000000000-A3GHV:1:1109:19224:11655/1
-AAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGCATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCTGTCTCTTATACACATCTCCGAGCC
-+
-BBB@A4FFFBBBGGGGGGGGGGHHHHHHHHFHHHHGFGHGGGFFAGFHHHFHHHGHHHHHHHHHHHFHGGHGHHGCFFGHHHGHHHGHHFHGGH3BFFGHHGHGEFFH/EG@-CFGGCC@-;BD?FGGGGGG??FGDAGDFFFFEFF@BAAFEFFBFFFFF?FD9BBFFFF/FFFFBFFFFFFF?FFBFFFF/FBBFFBFFFE?F;@B//AFFFFFFFFF//;BFFEF.BFFFB/;F/99/FBFFBDCF;B
-@M01368:8:000000000-A3GHV:1:1109:21978:9490/1
-GGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTATGCAGTT
-+
-?A3AA?DFFFFFGGGGGGGFFGHFGCEGGFHHHHHHHHHGHCBGFEGGHHDEGAFGHGHFGDGBCGHHHHHFHHGHHHHHHHGHHHH1E?EGGGHHHHFGFHFHHHHHEDHHGHH@GGHGHHCGG?CFGFGGGGGFGB.BFGGFFGGFFFBDDBFFFFFF9-;DEFFDFBFFBB.EFF;BFBFFFFFFFFFFFFFFFFFFFFFFFFF/B9/FFFFFFFAFFFF--99AFFFFFFFA;;;FF..9//;/;;/
-@M01368:8:000000000-A3GHV:1:1109:22910:4079/1
-TAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGATACAGTCCACTTTAGCTA
-+
-CCCCCFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHGGGGGHHHHGGEHHHGGGGGGHHHGGGGHHGGGGHHHHHHGGGGGGFHHHGGGGGGGHGGGGGGHHHHHHHHHHHHHHHHHGGHHHGGHGGGHHGHGHHHHHHHGFHHHHHHHHHHHHHHHHHHGGHHHHHHHHHHGHHHHHHGGGGGGGGGGGGGGGGGGGGFFGGGGGGGGGGGFFFFFFFFFFFFFFFFFFFCCDFFFFFFF0BFFFFFFF0
-@M01368:8:000000000-A3GHV:1:1109:24217:19077/1
-AAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGCCTTTGATTCCTGCCTCATCCTATTACTGTC
-+
->AAA3BDFFFFDGBFFEEGGGGHHGHFHHCFHGHGHHHGF3BFGFHGFEFHFHGH3EGFC1EEGBFGBHFGGFFHHHGHFHGHHGHGGHCEHEBCFF3ED3@GH4FDEG12FFHFFHG/G3FGA/@EFEFCG33FFGBBGHFHH/?BFBGFGFAGC2C/@-;@-;BFFEFADF?DFFFFFF?;AFFA;AD;..FEFFA--;9;D.9BFFBE?;.;///://///99//BB/9;F./B//BBFB9////99/
-@M01368:8:000000000-A3GHV:1:1109:25237:11722/1
-CCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATATCGTATGCCGT
-+
-AABBBFFFFFBBF5BGGFGABGHGGAEFGFHHHHFHCHFHHBFGGGEHBGGHFFFFGFAEF5FHH?EGGF5AEG3?EBFHD?C/EFHFFEGEE?CFGGGHHFHB3EEFG?EEGHCFGGGGGGGEC<CDFHHHHHE.FD11FFAGBGD.DGHEA<.<<0<EHAHCFHHF./;CC0GFH0::0CFGG0FBFD;9/90BFF0CBBFGB09;B:0;CFF0.-;@AFEEF--;AFFBF/99D-;.//.../9;B-.
-@M01368:8:000000000-A3GHV:1:1109:27103:7153/1
-GTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGCTGTCTC
-+
-33>A?FFFDFBFGCG4EGFG??GACFGGHFHCFHCHBECDEFCEGHHHHHFFGGF3AFFHHFGEGCGHHGEHGFGHHEGG?EFHHH?EGGHHGGGGHHHHHHEGGGGGHFHHGFDDGGACFCC@?/FDDGHHHGHEFFHHH0FDHHFFEDCD.<GGEHGF0CHHHF/CAGC000CCGFHFGFGFFG?:CB990;F09;FB0BBGGGGGG?;A9EBDEFA///;FF/:F?BFBBFFBFFFF///;/9B;///
-@M01368:8:000000000-A3GHV:1:1109:8763:7859/1
-TAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGCTTTATGC
-+
-BABAADFFFFFFGGGGGGGGFBGFGHHFBHHHHGGHHGGEHGDHHHFGHEHHHHGHHGGGGAGHHFBHHGHFHHHHHHHHGGGCEFGFFFFEHHH?FFG1FFHHFEGGGHGFEEHHHHHGGGFGGGHHHHGGGGG/C/FG-<A<GFHHFFCGHHFHGE0<<CGHHHGCHG.CCCCCE00BBFGFFG.BB0FFBFBCF0;CBFFFEEGBBBFFBF/FFF9BF/9BAFFD9AFEDAA.A/BFFFFFFFFFEB/
-@M01368:8:000000000-A3GHV:1:1110:12808:18367/1
-AATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCCTG
-+
-BBBBBFFFFBBFGGGGGGGGFGFGHHGGGGGHHHHHHHHGFHHGEGGGHHGFGHEEGGHHHHGHHGFFHHGGGGGHHHHGHGHGHHHFGGFHHGGGGGHHFFFGGHHHE?@EGGHFHEGGGHHGGGGHGEFHHGD?/>CFHHGDFGGGGGEFGC?EGHHHB0CGHHGCGHHHHBEHGHH.::ACA;FECFGGGGGFFFEFGGGGGGGFFBBBFGBFFFEFFFFBFFFFFFBBFBFFB9..AF?FFFFFFF9
-@M01368:8:000000000-A3GHV:1:1110:14751:26540/1
-TAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACTGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGTTGTGCACGCGATAGCATTGCGCGACGCTGGCGCCGGCGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTG
-+
-AAA?1CFFFFADGEEGFGB1112DGDGHGFGHHCG/ECEBGGHDFGHHFHGHEB1BCGFFE2EGHHGHFFFHHBFFHEFCGGHHFHHHHH111BFFHGHEHBEHGGECEFHGFHFGGDBBGHHBHHHH0GH22FGHGFFFH1BFCG0F@FGG11@GDHFG1D/1FGFHH/FCG.>0><-<@CCFFG.CC-@C?C9FFF0C---;------;9----9-9@-AAFF9B9---9-/;B9BF/9BB//B/;///
-@M01368:8:000000000-A3GHV:1:1110:15519:10008/1
-CTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACC
-+
-BBBBBFFFFFFFGGGGGGCBGGE?GGGHHHHHGHHBEGGHHGGGGGHHHHHHHHHHHGGHHHHGFGGGGHGHGCFGHHHGGGCGGHGHGGGGGHFGGGHHHHHHGCEFGGHHHHGGGGGGGHGG/CEGHHHHGFHHHGFHHGFFHGHGHFGGEGFDDGGBCGHHGFHH/CHHHHGHGHF0CFGGGGGGGFFFFFBFFFFFFGFFGGF?DGEDEEFEFFFF?FFFFFFFFFFFFFFFBFFF.BFFFBFBBA;
-@M01368:8:000000000-A3GHV:1:1110:16559:7507/1
-CATTCAATTGTTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAACTGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATC
-+
-ABBBAFFFFFFFFGGGGGGGFGGGGAGHHGCHHGHHHHHHHHHHHGHHGHHHHHHHHHHHHHHHHFGGGHHHHHHHHBDHHHHHGGHFEEGHGGHHHHHHHGHHHEHFGGGGGGHHHF33FGHHG3GDDGH//EEGHHFFBF?GHHFCC@DGFCGGB?DGHAFGGHHGFH0E??<@DGHGGCFGGF?DGGGFFGGGGGGGG.C/0BBF?FBBEGG0FFF.AA9;B9/E////99;;:.//:FFFFBBF//9
-@M01368:8:000000000-A3GHV:1:1110:16700:6843/1
-AAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCTGTCTCTTATACACATCTCCGAGCC
-+
-BBBBBFFFFFFFGGGGGGGGGGHHHHGHHHHHHHHHHHHGGGGGHHHHHGGHGHGGGGGGHHHGFFGHHGGGGHHHHHHCGG@FGHFHFEGGGGGGHGGGGDGHHHHHHHHHHHHHHGHHGHGHHGGGGGCGHEHGHHHFHHHFF.DGHHHHHHGHHHHHHGFGHGCGHGHHHHHHHHGHHHCD?:A::FCDGEGFGFFBFGBFGGGF00CBFFFF/BFBFFFFAE.FBBFBFFFFB/BFFBFFF/ADCAD
-@M01368:8:000000000-A3GHV:1:1110:18014:7856/1
-ATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCATCGTGATGCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTATGCCGTCTTCTGCTTGCAAAAAAAAAATAG
-+
-AABBBFFFFFFFCGGGCGGGGGGHHHHHGFHHHHHHGHHHGGGGGFHHGHFGGHHHGGFGGGHHGGGGGHHGGGGHGGHHHGGGGGGHHGHGDGGGGGGGGB/A<GFHFHHHGHBBGFEGGGGHFFFEF/EEGGHGGFEHFHHBA.<ADFFHFHB/CCGHFEFHHGHGEFFGGGGGFFFGGFGFFBFFGGBFGG??DGG?@9-ADFFFFB/@BD;./BFE?BFE/>99FE//BBFFF.9/FF?DA=@9./9
-@M01368:8:000000000-A3GHV:1:1110:23303:11846/1
-ACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGTGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTC
-+
-3ABB?FAB?DAAGGGFBGGBB5AFFFGFHHGGGEGHHHFHHF3EGFHHHHEFHHGGHHHGH3EFHHHHHBDGHHE?ECHGHGHHHHHHFHHHGHHHHHHHGGHGGFHHHFHHGFFHHFEGFHHHHHHEHHFDAGHHHH/BDDFGGH1FDBGHHHHHHHCGHHHFH?0CGCF>CC=@--AFBFFB?=BFDFFF//FDB;-9A-AD-.A.A=?-9-:B/AEB/BFF.A;DDFFFBBFFFF/BBFFFFBFF9B;
-@M01368:8:000000000-A3GHV:1:1111:13195:14562/1
-ATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGATACCTGTCTCTTATACACATCTCCGAGCCCACGAGA
-+
-ABAAAFFFFFFFGGGGGGGGGGGHHGG4FDFGFGGCGGGHGHG?EGHEGFFDHFHHHHGGFE@EHHGEEEGFCCEFFGFG/EHHHHHBFBGGHFHFHEHGHEFGGGED/EFDEFFEHHBGHHCFFFDFGGHHGFFFHHHHGFG>0<0DGGFHBGHFBDFGHGFFGGAGHHGCGBHFFHHHFFFBFGGGGF/:FFFCB9F9FF0FEFE?FF0BED-D.//BF9//BBFF/BFFFEFFFFED-DCFF?.:BFA
-@M01368:8:000000000-A3GHV:1:1111:14287:20817/1
-GCCAACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTCATCGCACCTACGTTCACTATTACAGGCGAACATACTTATTAAAGTGTGTTAATTAAT
-+
->>A3>AAAACFFFGFGFGGGGGHGHHHHHHHGGGGGHGHFFCGHHGBGHFHHHHAGHHHHEHHAGFFEHEAE?GHHHHEGFFFDGHGHBFFHFHHHGHGHGHBECG@@@EHGGEGCGGGGFFGGGG?BGGGGGG.-C.FEDCFFFEFFFAF/99BEFA.:9BFB/9FFFEFFFFFFEFFF/FBBFFFFFFFFFFFB//;.@@//;DFFFF//BBFFFBF;A;DF=>B//;9B//B/;/;9//9//;B/:B9
-@M01368:8:000000000-A3GHV:1:1111:23624:14516/1
-GTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGGGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAG
-+
-3>3AAFFFFFAFGGGGGGGGBGHHHHHHGGHGGHEHGHADFHHHHEGGGHBGHFFHHEHHGHFHGG5FBEEGEGHHHGHHHEFDGHHFFGFGGHHGHHHGHBHGHFHFHHGGGGFCFBGFGE?GFBECEGDGHEHGDGCGHGC/DF@GHGFFCGGGGFFFFDD?@C@GFEC?-ADHFFHBGHFBHFG0CC//.;B0/CA.;AA.;@.AB/9BB/A/.AFFFE/BFFF///9B/FBDE9/;99/B/BFFEF/
-@M01368:8:000000000-A3GHV:1:1111:7437:24508/1
-ACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTGTCTCTTATACACATCTCCGAGCCCACGAG
-+
-CBCCDCFFFFFFGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHGGGFFEHGGHHHHHHHHHHHGHHGGGGGHHHHHHFHHHHGHHHHGHGGGGGHHHHHGGHHHGGGGGGHHHGGGGHHGGGGHHHHHHGGGGGGHGHHGGGGGGGHGGGGGCGHHHHGHHGHHHHHHHEDHHGHGGGGGD;BEGGGFFGGGGC:CFGGGGGGGGGFGGGFFFGFFFFF;FFF;BFFFFFFFFFFFB:FFFFD=CAEEEF>-
-@M01368:8:000000000-A3GHV:1:1111:8665:25542/1
-TCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTGTCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCG
-+
-AA3AAFFFFFFFGGGFGFFGGGGHGH4AGGGFHHCGEE2FGHHHHHHHHHHGFHGF53FHEGGFAF5CFHHGGFGHFHHGGHHHCHHHHHHHFHHGH?EEEG1FFFEHHFHFGGHHGG?F4FBGHGHCHEF0//-9--;0CFGG?@BGDGFFFFEFBBBDA?FFBFFFF=B;-9.AA9EFFFF/;9BD.//;9/9/B:/:BFBFFBFFF/B:BFF//;/B/FFFBFF.A-BFFFBA/F//BFFFBF/;/A-
-@M01368:8:000000000-A3GHV:1:1111:9655:13916/1
-GGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGCGGTGTCCACGCAATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGA
-+
-1>>1AAFFFFFBGGFE1EEEEGGHGHHH2FGHHHFGFGHGCFGGGEFHGGEGGHHHHGHEFBFEGHHHGHHBEHHHHGHGFHHHGGGGHHEGGGGHHHGFHGHHHH1FHHG?G/AGF1GBFGEFFHF2FDD0FG<GDHBFDGFFCGH//B//?0GFFGFGGHHHFHFB.=1FDFB?FGH.C/.-:::CH0;CAB@-.;0CGFFFGG--9.A@GB>--99@=---AAABA-BF/B?A@F-9BBFF//BB/9/
-@M01368:8:000000000-A3GHV:1:1112:10272:7828/1
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTATGCCGTCTT
-+
-AAABABBBBBBFGGGGGGGGGGHGHHGHGHHHHHHHHHGHHHGGHDGHHHGGGGHHHHHHHHHHHHHHHFHGHHHHGGHGGHHHFHHHHHCGHFFHHHHHHHHHHHHHGHGEFGAEEEEHHGHHGHGHHHHHHHGHHHHHHGHGHFFBC/BA?BGGGFFFFFFFFFFFFFFFC-@DDFFFFFFFEFAFFFFFFBFBFFFFFFFFFFFFFFFFBFF->@FFFFFFFFFFBFBFAD--.99;A?////:.9A.
-@M01368:8:000000000-A3GHV:1:1112:9832:16531/1
-CTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGGGCTGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCTTGAAGTAGGAACC
-+
-AABABFFFFFFFF4GGGGEBGEFGHGGHGHGHHHGGHFBGFGGGGGHHEFHGEHFHFHEHHHHHGCGGGHFHHCFGHE@1EEEFFGB?EEEEHBGGGCHHGHHBEE@>EAHHFAEBDGGGCEFF?CEGFFHHHHHFHHHFHGHCGCAHHF<..C.D=0CD.GFHHHG.CAGHC:CHB0GGGFFB0:CFA.A-;9.;000CBBFFBFGA.9AA;A;EDDE.ABBFFFF9;BEFFF/BF//9/B//9:B//..
-@M01368:8:000000000-A3GHV:1:1112:9832:6701/1
-CGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGA
-+
-AABBBBFFFFFFGGGFGGGGGGHHHGGHGGHHHHHHHHHHHGHHGGGGGHHHHHHHHHHHHHHHHHHGGCGDHHHHFGGHHHGGGGGFGGHGGGGHHGGGGHHHHHHGGGGGGHHGGGGDGGFGHGGFCDCHHHHGHHHHGHHFAGFGGEHFGEG.C<EGCECEFCFFHBGHE:GHHGFF0FFFB0CFGGGGAGFFF0;;FFGGGFFGFFCDD.DEFBEDD?9FFFFFFFFFFFFFFF/B./FB///;BF/
-@M01368:8:000000000-A3GHV:1:1113:13532:8618/1
-GGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGCTACAGTTCACTTTAGCTACCTCCAAGTGTTATG
-+
-AA?AAFFFFFFFGGGGGFBFGGGGGGH5GHFEDHHGGGGCGFBGH?AEEHFFEEGHGHHHHGGG?0EHGHHGGGGGC?GEE/EE?GHHHGBHFHHHHHHGHHGHHHGGGCG/A@<FGGHHHHHHHFF/GFDGHHHHHHGFFFGHGGHABGHFHHHHHFHEGDGHGDDEEHHBEDDEGFGHGBFFBFFEGGGEFGFGFB000;F0F;FGGEGGEFFF;-.9//B///B9FFFFF/BFFB/:.BB//;FBFFF
-@M01368:8:000000000-A3GHV:1:1113:21679:18011/1
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGAGGGTGTGCACGCGATAGCATTGCGAGACGCTTGAGCCGGAGCACCCTATGTCGCAGTATATGTCTTTGATTCCTGCCTCTTCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAACTGTCTCTTATACACATATCCACGCCCACGAGACTAAGGCGAAGTTCATT
-+
-AA>1>11F1D1DDFFFFGGG1FH3GHGHGHGHFHEC?EC0B1FBGFB1GHHH21AF2HH2FEGEHAE10AAE/>/FFHE?/E/?E1@EFFH?E@/EGGG//B11B//<@@C0F/<0<FFDGGCC?FF221<BDD11@<11@DDCGEF1<111F1<F1FBGHGHCF-CHHFA./</0CGHF<0CC/;C-:-;;09;FFBFBBFFBC0FFFGGFC0009C00090/-:--9--;-;AFFE;/99-9--/;///
-@M01368:8:000000000-A3GHV:1:1113:25528:14016/1
-CCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGG
-+
->AAAAFFFBFFFGGGGGGGGGGHHFHGHHHHGHHHHHHHHHHHGGGGHHHHFHHHHFHGHHHHGAFFEFHEGHHHHHHHHGHEHHGGFGGGHHHHHHFHHHHHGGHHHHGGGGGHFHHFF?HHGGFECEFFGHFFGFHGECDGHGBGFHGDF@@?CGFHCEGGGFD.CCC?EGHBHHHFHHFBCFFGEB/CEGGGGDAA.90C9CEBFGGBBF/9.9FBFFFBBFF//99FFFFEABF//99FFEFFFBFF
-@M01368:8:000000000-A3GHV:1:1113:5741:16959/1
-TAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGA
-+
-ABBBBFFFFFFFGGGFGGGGGGHHHGHHGGHBGHGAGFFCAFGHGFFGHHGFHHHHHGGGGGHGHHHHHHHHE3BFFHHHGG0EDF@GHFFGGGHGGGGGGGGGGGGGHHGGEEFHGFHHDDG@DGGGHHGDGGGGGHGG?CF?HHGHHHGHGHHHFFHGGGHHHHGGCD.;0<C;CGGGGEFF/.;0;FFFBF/0;0CFGFFB..9B/;0CBFFBBFFFFBAC?DED9;B9AD;.FFFB/B/;FBA/B//
-@M01368:8:000000000-A3GHV:1:1114:10130:11959/1
-CGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTCTGATCTGTCTCTTATACACATCTCCGAGCCCACGAGACTAAGGCGAATCTCGTATGCCGTCTTCTGCTTGCAACAAACACACATCCAGA
-+
->A33>FFFFFF@FFFGGGGFGGD4EGGGGGHHGFFGHFGGHHHFEFHECFHHHEHGAGBCCGCCEGGHGHEGFBFHFHHHHGGGHFHGHEGGGFEGEGG??@DBGHGGC-@FFGHFHFHB-??DA-DD@9:BEBG@B?E?A.ABBFBFA??F.FF/BFFB/B9B/9;BF9FF9FFFFFFFFFFFFFF?BB?;9EE;-;DDB9//;B-B@;ABFFEFFFF/-.9A.;//9/BF./B/..9.9:...//////
-@M01368:8:000000000-A3GHV:1:1114:14540:5315/1
-CTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGGGGGCTATTTAGGTTTTT
-+
-AABCCFFFFFFFGGGGGGGGGGHHHHHHHFHHHHGHHGHHGGGHGGHHHHHHHGHHHHHHGGGGGHHFHHHFGHHGGFHHHHHGGGGGHHHGHGGHHHGGGGGGHGHGGGGHHGGGGHHHHHEGDDFGFFFHHGGGGGCDAFCFGFDHHHHGGHGHHHHHHBCGEHHHHGGHG.ACGEHGG0CBFFF:A;BB0;09CGF00CFFFE0AA?//CFFFFFFFFFFFFFFFBEF;A.-=A--:BBFB90;;FE.
-@M01368:8:000000000-A3GHV:1:1114:15066:16302/1
-TAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAACGGTTGTTAATTAATTATTGCTTGTAGGACA
-+
-BBBBAFFBDFBFBGGGGGFGGGBGFFFHGFHHGFFFHGHHHGHHHHFFHHHGHGC?AEFFHEFBFFFGHHHHH1FDGFFHGHGHFEGCGC-<<AHHHGGGGGGGFHH0GHFCCCADGGG?.9/A-???DGGFFF.9F9/EE-;;BBBFFBFFFFFFFFFEFFFFBFFBBFFFFF/BFFBFFFFF-DBFFF;/BFF//BB//9/BEA---9:BFFFFFF/F/.;.:@9.BBFF/;BFF/;/////9/////.
-@M01368:8:000000000-A3GHV:1:1114:16639:15258/1
-CCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGCGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTCCAATATTACAGGCGAACATACTTACTAAATTGTGT
-+
-11>>ABFFFFFFGGCGC1BBF1GHHHBHHHHGFHGH1A100AA/GGEHGFBAA1FFD2FHHHHECG2F1BB/E0FC/A>EE/FGGFGEF1EGBBEHHCGGGHBGEHFHE0B?E--;C?CCGGG@A@GBFBBBB09?@??A-AB--ABE@=-=-9AE9A;FFFFFE=9-//;//;9FF/////;;///9B///;/B////9FFBB;--A@-;/9;9-:-/;;FFFE9BF?@;-9-99/B9F/://///99/;
-@M01368:8:000000000-A3GHV:1:1114:2404:13066/1
-TCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCTGTCTATTATACACATC
-+
-CCCCCFFFFCFFGGGGGGGGGGHHHHHGHHHHHHHHHFFHHHHHGGGGHHHHHHHHFHHHHHHFGGHHGGHGGHHHHHHGHHFHHHHGGGGGGHHHHHHGHHHHHHHHHHGGGGGGGHH?FGHHHGGGGGGHHGGFGGHHGGGGHHHHHFGGGGFGHGHHGGGGGGGHGGGEGGHHGHHHHHHHHHGFBFFDA0FGGGFFGG0:EFGGGGGGGG;AEBF0B0BFFBFFFFFFFFFFFFFFFFFFFFFEFF0
--- a/test-data/bwa-mem-fastq2.fq	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,400 +0,0 @@
-@M01368:8:000000000-A3GHV:1:1101:6911:8255/2
-TCGCCTTACCGCTACTCACCCACGGCGGCCATCAGCCGATACTAAGTTTGGGGTATGGTGGGGGGGATAATGAATTAGGTTGTGGGGGAGGGTTTGTGGTTGAGAGAAACACAAAAAACAATCTTATATATGGGTAGTCGTTTTGTATTGGTTTTTTGTTTTGTTTGTGTTTTGAGTGTCGGTTTAGTTCGGTGTACTAGGGGGGGTGGATGGGGTCGGCTGGTGAGGGGGTCTTAGTGTATTGAGTGTGG
-+
-1>11111@11111A111A100000000////011110//>>/12@1@22B/////1@>21/>>/-----9/;////9////--;-;-;-----;--------9/-/-///9-;-------9//////9/////-//-/9-;-;9--/////99-;--9-:-;----/---/-----////---9-/////--;A-//////---------9/-----;-----/-/-----;--;//////////9;///-
-@M01368:8:000000000-A3GHV:1:1101:14518:9998/2
-CATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACATAATAATAA
-+
-CCCCCFCCCCCFGGGGGGGGGGHHHHHHHHHHHHHHHHGFHHHHGGGGGHGFHHHHHHHHHHHHHHHHHHHGHGGEHGGGGCGGGHHGGCGGGGGHHGHHHGGGGGGGG.BFFFGAGADFGAFDGFGGCFFF;DDFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFF09FFFE00;BE@;DABBFFFFFBBFB00;F:9;FFBFFF9BFFFFFFFFFFFFF90/::BFFFBF0
-@M01368:8:000000000-A3GHV:1:1101:18422:19051/2
-CTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGG
-+
-BCCCCFFCFFFFGGGGGGGGGGHHHGHHHHHHHHHHHHHHHHGGGGHHHHHHHHEHHHHHHHGGHHGGHGGHHHHHHHGHGGHHHGGGGGHGHHHHGGGHFHFHHHHHGGGGGHBFFCGDHHHGGGGGGHGGGGGGHHGCGGGFGHHBGGGGGFFFHEGGGGGCDCCE@EFGHHHHFHEGHGFFHHGB;ECBFGGGEFEFFGF0AFGFGFFG.;;DFFFFFFFFFF090BFFFE?FEFBBFBFFFB990BF
-@M01368:8:000000000-A3GHV:1:1101:25545:21098/2
-GCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTTCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCAACCTATGTCGCAGTATCTGTCTTTGAT
-+
-3AAA34BFFFFFGCGGCGGGCGHHHGHHHHCGHFGHFHGFGGCDGGBD5FGFFFHFHGGGHAEBFGHHHEHGGFHBGGFHHHGGGEEFHHHFHFFHDHGHGHHHHFFHHGGFAEGFFFFFBGHHHFFHHHHHHHFHFHHFHGFHGHGA/<@EFHEHH1GGHFFFHG1>=FGHFHGF.GE//-<BB?9.9BFFFB==AA/FFFFFA-@BA.;;D?F9FAB;---./99BFFFBBAE-.9B/BFB9F/9BFBB
-@M01368:8:000000000-A3GHV:1:1101:5446:12248/2
-ATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTT
-+
-CCDDDCCCCFFFGGGGGGGGGGHHHHHGHHHHHHHHGHHHHHHGHHHHGGGGHHHHHHHHHHHHHHHHHHHHHHGGGGGHHHHHHHGFGHHHHHHHHHHHHHHHHHGHHHHHGGGGGHHHHHHHHHHHHHHHGHHHHHHGHGHGHHGGGGGGGGGGGFFFFFFFFFFFFFFAFFFFFFFFFFFFFBFC?.EAFFFFFFFFAFFFFFFFFFFFFFFFEFFFF0FFFFFFF0BFFFFFFFFF?.BDCFFEDA/
-@M01368:8:000000000-A3GHV:1:1101:5861:6452/2
-TTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
-+
-BCCCCFBBCCCFGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHHHHHHHHHGGGGHHHHHHHHGHHHHHHHHHHHHHGGHGGHHHHHHHGHHHHHHHHHHHHHHHHHHHGGHHHHGGGGGGEHGHHHHHHHHHHHGHHHHHHGHGHGHGGGGCGGGGGFFFFFFFFFFFFFFFFFFFFFFFF?FFEAF:DAEF9DEFFFFFFF-A.BFFFFFEFFFFEFFFFFFFF0FFEB0FFFFBFFFFFFADEFCF0/.
-@M01368:8:000000000-A3GHV:1:1102:10403:6021/2
-GGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGGGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGGGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGAGGTTAATAGGGGGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACGCTGAAGTAGGAACCAGATGTCGGATACAGTTGACTTTAGGTAACCCA
-+
-AA?A34BF>AADEBGGGGFFCGGHHA5DFGAE?AAEDFHG2AEE1FBE00A1BGE0?E1FFGEEEGB4F43?EE/>///F??//@BCBAC<<BAGHB?11F/FGFGGBFBGBD.11><.<<<C0<A</<<=0GFHC@-.;FF09BFFGB00B0;FE.C/:CCF0;0C0;BBBFF@.9AF.:9EFF.;.BFF/FF/;/./BFB/..;;ABF/9FF//.;AAF9BBBA;-A.B/9///9/BF////;///:9.
-@M01368:8:000000000-A3GHV:1:1102:10677:23253/2
-AATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGCTGTCTCTTATACACA
-+
-CDDDDFFFFCCFGGGGGGGGGGHHHHHGGGGHHHHHHHHHHHHHHHHGGHHGGHGGHHHHHHGHGHGHHHGGGGGGGGHHHHHFHHHFHHHHGGGGGGHHGHHGGHHHGGGCGGHFFFGGGHHGGGFHHGHHHGGGCGGHFHHGGGGGGFHGC<@GGHGHHCHE00:CFHHHFGACGFFEG:D.E;FG;EFBBFGGGFEE0CBBBFFGBFFGFGFFFFFFFF0:B0:BFFFFFFF/0.;:0F0B:BFFF00
-@M01368:8:000000000-A3GHV:1:1102:13809:1733/2
-NATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATCTGTCTCTTATACACATCTGAC
-+
-#>AABBFFCFFFGGGFGGGGGGGGHHHHHHHHHHHHHHHHHHGHHHGGEGGFFHHHHHHGHGHGHHHHHEHFHGHHHHEFHHGHGGGGGHHHHGHHHHHHHHHGFGHHHHHGHGHGHHGGGCCGGGGFGGGGGGDGGGGFGDGGGFFFFFFEFFFFFFFBAF:9AF//;BEF-DD/FFFFBFFFFFFFFFEBFF?FB;/;//BFFEFFE/::..9;-:B9:FBFFFFFFBFB/9/FFF/B///99/:B///
-@M01368:8:000000000-A3GHV:1:1102:17584:10050/2
-GTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCTAGTGGAGATCTTGGGGGGTGG
-+
-ABCCCFFFFFCFGGGGGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHFHGGHGGHHHHHHHHHHHHHHGHHHGGHHHHHHHGGHHHHGGGGGHHHHHHHHHHHHHHGGHHHHHHGHGHGGHGGFGGGGGGGGGGFGGFGGGGGGGGGFFFFFFFFFFEFFCFAAFEFEFFFFFFFCFDFFFFFFEFFFFFFFFFFBFFFFFFF/:BFFFFFFFFFFFFFFFFAFC=@-.;A///B././//////.-9----
-@M01368:8:000000000-A3GHV:1:1102:18842:24844/2
-CTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGG
-+
-CCCCBFFBFFFFGGGGGGGGGGHHHGHHHHHHHHHHHHHHHHGGGGHHHHHHHHFHHHHHGHGHHHGGHGGHHHHGHHHHHHGHHGGGGGHFHHHFGHHHHHHHHHHHGGGGGHHHGFECGGHGGGGGGHHHGGGGHHGGGGHHHHHEFDCADGHHHHGGGGFC?AE-@DDFHFFHHHCFHGGFFGFFFGGGEFEGFGED9C?CEGF90FEF/A./BBF9FFFFFFFFBFFF.9AF////;FFBFFB/:BF
-@M01368:8:000000000-A3GHV:1:1102:21788:11027/2
-AATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCCTG
-+
-CDDDDFFFFDDFGGGGGGGGGGHHHHHGGGGHHHHHHHHGHHHHHHHGGHHGEHGGHHHHHHHHHHHHHHGGGGEHHHHHHHHHHFFFFFHHHGGGGGHFHGBFEHHHGGGGGGGHHGGGGHGGGGGHHFHHHGGG@CGHHHGGGGGGGGGGGEGDGFFDHHGEHHBCFHGBGFAGGHFGGCEEF0BE<?FFFGFGG<EFFGFFFFGGGGGF:0BFFB9FFFFFFFFFFFFF0B0ABADEF.A/..D.BA.
-@M01368:8:000000000-A3GHV:1:1102:5728:8777/2
-CACTTGGGAGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCC
-+
-BBBBBFFBBBBFGGGGGGGDGGHHHHHFHHHGGGGGHHGFHFHHFHHHGGHHHHHHHHHHHHHGHHHHHHFGHHHGGGGHHHHHHHHHGHHHGHHHHFHHHGGHGGHFFHHHHGFHHHHHHHHHHFHFHHHFHFHHHHHGGGGGHGHHHHHGHHHHHHH/FHHHHHGHGGGHHGGFBFFFFFFFFFF;DDFFFFFFF;;BA.=DDBFFFFF;-DFF.EDFFFFFFEF-AFFFFFB;FBFFFBFFFFB9B..
-@M01368:8:000000000-A3GHV:1:1102:5983:21093/2
-ATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTG
-+
-ABCCCFFFBFFCGGGGGGGGGGHHHHHHGHHGHHGGGGGHHHHHHGHHHHHGGHHHHGGGGFHHHHGFFHGHGGGFEGGHFFFE?GFFGGGHGHFGHGGGEEFHHHHGGGGGCDGGBGGGGHHHGGHGHHHDGHHHHEFHHHHGF<A.ADGG0EHFFHHHHCEFHHEGHGHHGGHHHFGGGGEF//FFFFGGGFGGGGGGG.ACDE?B?DD9F.BBBBFFFFFEF0090:BF/;:0;0009:A?...0:;0
-@M01368:8:000000000-A3GHV:1:1102:7765:18353/2
-ATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAAAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTT
-+
-BBBBBFFFFFFFGBEGBGGGGGFHFHHHCFFFGFHHHHF5FEDABFAGGBEE22FFGGEEHF5EDCA11FE5FFE?FEG5EG555F@35B3FFA1FEF2@3GGD3?23?3@F4BF3E>///FDFACF?FHFGC//??1B0<<?/@GFGD/@1FG10<?ACC.<<G0DGGG--.<CCCCGC;CGCGFE9;0FBFA000.;0BF.9....0;909B00999A/9./;BBFB/.:B/////9/999//B//;/;
-@M01368:8:000000000-A3GHV:1:1103:10405:17879/2
-CTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGG
-+
-CCCCCFFCFFFFGGGGGGGGGGHHFEHHHHHHHHHHHHGHHHGGGGHHHHHHHHEHHHHHFHGGHHGGHGGHHHHHHHHHHHHHHGGGGGHHHHFHHHFFGHHFGHHHGGGGFHHHHGGGHHGGGGGGGHGHGGGDHGGCGFHHGHHHGGGDGGHHHHGGGGGGGHGG-ADGGHHHBHHHFFFHHHGGGGEGBFGGAEEDBFF0C;CFFGFGFEEFFBBFFEFFFFFFFFFFDEFBFFFF///BFF/BF/A
-@M01368:8:000000000-A3GHV:1:1103:13493:8205/2
-AACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGAT
-+
-BBBBAFFBFFFBEGGGGGGGGGHHHHHFHHGGGGGHHHHHHHHGHHHHHHHHHGGGGGHFHHGGGHHHGGGGGGHHHGGGDHHGGGGHHHHHHGGFEEEFFHGGGGGGCDHFGCCDGHGHHHHFFFEGHHHFCFEHGHHGG.C.EGGGFGFGEHGHH/:CGHHHGGGB::CGHHHHHGFGBBF0BFGFGGGGBFGGGBG.9.;BEG?AF.FFFFFFFFFFFFBBBFFFFF/BFFEFBBFFEFFFBBB;D9.
-@M01368:8:000000000-A3GHV:1:1103:14060:21273/2
-TAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGATACCTGTCTCTTATACAC
-+
-CCCCCFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHGGGGGHHHHEFGGHHGGGGGGGHGGGGDHHGGGGHHHHHHGGGEGFEHHHGGGGGGGAFGGGGBHHHHHHHHHGHHHHHHHGHEHHGGGGAFHFEGGHHFHHHF>FF<F1GGHHHHHHGHHGFFDEHHHHGF0GGHHHGFHGHFAGEGCEBEGF.FFFGGGGGFFGG0CBFBFGGGFFFFFBFFF.E.E?FFFFEFADAF/BFBFFFFFFFFF//
-@M01368:8:000000000-A3GHV:1:1103:14528:12993/2
-CTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCCACGTGATGTCTTAGTTAAGGGGAACGGGTGGGCTCTTTAGGTTTTT
-+
-BBBBBBFFFFFFGGGGGGGGGGHHHGHHHFHGHHHHHGFHHGGHGGGHHHHHHHHHEEHGGGGGGHGHHHHGBGCHFHHHHHHGGGGGHGFHGFGHHHGGEGFGHHEGFFGHFEGG?HEBFHHF?FGGGEDG0CFGGG?E..<<-.CGGHHH0GHEGGDDC0/CA.0G/:;.;.;;;C09;BBFGBA.--./9;0C0/00;0;/./99.:9///:/9//;//;BF.D.AAD.;--@B9../;;:BF/;/..
-@M01368:8:000000000-A3GHV:1:1103:17657:20856/2
-CTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGAACTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTT
-+
-CCCCCFFFFFFFGGGGGGGGGGGHHHHGHFHHHHHHHGFGHGEHGGHHHHHHHHHEHFHHGGGGGHFHHHHFHHHHFFHFHHHGGGGDGHHGHFGHGHGGEEFGHHBFGGGHHGGGGHHHHHFFGGGGGHGHGDGCGGCGFF@DGGGHFHH0C.GHFHFHGHHFGH0CCAECDEG0CEGGGGFFFGG;C.0;;00:BF;FFBFFF09A9A:BFFFBFF0BF0:FFFAA;.AAEFFFFEF?FFFEFF9BBE.
-@M01368:8:000000000-A3GHV:1:1103:23099:3794/2
-CTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAACACCCTATGTCGCAGTATCTGTCTTCTGTCTCTTATACACATCTGACGCTGCCGACGACCGATCTAGTATAGATCTTGGGTGG
-+
-ABBBBFFFFFFFGGGGGGGGGGGGBFHHGG?EEHHGHHHHHHGFHFHHHHGHGHHGGHEEHFFFGHGHFGFHHHHHHHHHHHFHFFHGCGHGHGGG/EF3FGHHHHHHGHHHGFGHHHHHGHGFFEHCFGGGGGGGFFFG?FGGGGFFFGFA>>DFCFDFFFFFFFFF-BBAFFFFFFFFE@D9B;FBFFFFFFFFB9/9FFFEBF9/B/BB/BFAADDFFC-;;9-;@@9-.9/://///://///...-
-@M01368:8:000000000-A3GHV:1:1103:25465:20010/2
-AACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGTGCACCCTATGTCCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCTAGTGTAGGTCTTGGTGGTCGTCCTCGTATTTGAACACATAATCGTG
-+
-AAABBFFFFFDFGGGGGGGGGGHHHHHHGHHHGFHHHHHHHGGGGGHHHHHGHHHHHHHHEHHHHHGHGGHHGGGHHHHGGGGGHHHHHEHFGEHHHEE14BGHHHGHGHFCE/EFGGGGGGHGGGGGG?FFGGGG.ADGGGFFDA.FFEC--;9BBBD?FFFFFFFFBBFFFFFFFFFFFFFFFFFADFDFFC-BBB;BF-.;9:B9B9/9/;9;//;:.99/;-...:.../;//////.9/////.;.
-@M01368:8:000000000-A3GHV:1:1103:25519:6301/2
-CTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATGCTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGGGATGTCTTATTTCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCTAGTGTAGAT
-+
->AABBFFFFFFFFFFGGGCAFGCGHGGGHGGGHHFHHHFHHGGGGGFFFHHHBHHHHG5BG5GFEEEE1FGFFGF1EGHGGG/BFHEF@EA1BE1@EED3?4DHGGGGEGHFFFDDG?DCDEG@<<ACEHFHHGFDD1FGGGGFHGAGFHGDCAEFGDC0;BGFFBGA/.:GBC0;GBB9FGGGBFEG?.--AEBB00CBFFGBBF0000B09/B/9;/BF/BF.;A..AB;--9-;9-.9A/B///////
-@M01368:8:000000000-A3GHV:1:1103:6074:6549/2
-TTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATG
-+
-BBABAFFFFFFFGGGGGGGGGGHHHHHGFGHHHHHGDGHGGGGGHHGHHHGHHHHEHHF1EEFHHHHHHHGBGHFFFGFHHEFGC1EFGHFCEFGHDGC/EEGHFCEFEHFEGGEHHHHFFGDGCDGHHEHGD?C@<AC<CF?AF1GHHHHHHHGEHHF<CGFGHHHE?.CEGCCF0.CBBFGF?9:;0FFFE0;FBFBB009CFD?:/FGFBFBBFBF/B//FC.;.:9.;EFF...9FFFFB/:/A///
-@M01368:8:000000000-A3GHV:1:1104:11572:8264/2
-CATTCAATTGTTATTATCATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATC
-+
-AABBCFFFFFFFGGGGG5EGGGHHHHHHHHHHHHHHHHHHHHFFHHHFGHHHHHHFHHHGHHHHHDGGGHHHHHHHHHHGGHHHGGEGHGGHGGHHHGFHHHHHGHHHGGGFGHHHHHHGHHEHFHHHHHHGGFGEHGFHGCFHHGGGCFGEFHEGGGFHFGGGGHGHHHHGGGGFGHHGGGG@CGGG.C-C:9BFGGGGGGGGGGEFGFFB.ABFFGDGDF?/;AFFFBBFFFF/A./////;FB//;FB
-@M01368:8:000000000-A3GHV:1:1104:11928:24197/2
-CCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTAT
-+
-BCCDACCDDDDDGGGGGGGGGGHHHHHGGGGGHHHHHHGHHHHBGHHHHHGGGGGHFGHGHHHHHHHHHHHHHHHHGHHHHGGHHHHHHGHHHHGGGGHHHHHHHHHFHHEHHHHHHHHHGGHGGHHHHHHHHFHHHHHHHHHHHHHHHHHHGHHHHHGGGGGHHHHHHHHGHHHHHGGHHHHCHGHGHGCCEGFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFA:.AADEFFFBFEF;DAF:
-@M01368:8:000000000-A3GHV:1:1104:12288:20635/2
-CCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCATCGTGATGGCTTATTTAAGG
-+
-BCCCCFFFCFFFGGGGGGGGGGHHHHGHHHHHHHHFHHHFGHF?FGGHGHHGHHHHFHHHHHFEGFHGGHDGHHHHFHHHGHFFHHGAEEGHCEHHHBGHHHBGHFGHHGGGGGFGHHFGCHHCEGE/FGHGHGGGDGGGGGDHFGHHH/E?@DDHBHH>?@DGCAGC-;@DGFFHGCHEEFGGFGFB/;..BBB.CCE?A0FE0EBFF0FEF.;=DFFB//BFBF//;/:9BA.9FB9//;9//;9F;FF
-@M01368:8:000000000-A3GHV:1:1104:13832:4398/2
-GACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCTAGTGTAGATCTCGGGGGGTGCCGGCTCATTAAAAAAAGAAGATGTCGAGATGTCAGTGCGTGAGTGGAAGTG
-+
-BBCCCFFFFFFFGGGGGGGGGGGGGHGGGGGGGHHHGFGGHHFGGGHGHHGHGFGECGHHHHGGGGGGGHEGFGGGHHGHFHHHHFGHFHHHHGHHHHFGGFGG3FFGGHHHHHHH2?FFGHFHHHHHHHHHBGHDGC0FGHHGHHGHHHHHHHHHHFGHHGGGGGHG-:@?FAGA:.:09CB0000;9B0.9-;---:./----.0;B00;:0;;.../90009..-..00000000-...90:.00/00
-@M01368:8:000000000-A3GHV:1:1104:23670:4161/2
-CGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAA
-+
-A3AABBFFFFFFGGGGGGGGGGHHFHHHHHHGHGHHHHHGCHHHHGGGGHHHHHHHHHHHHHHHGHHGHGHGGHGGHGHGGHHGFGHHGHHHEHHGHHHHHGHEHEHHHGGFGGHHHFHHHGHHHHHHHGHHHHG4EGGGFCBBCA?DGGGGGGCCAFFFFFFFFFFFFFFFFFDFFF.9@--=AFFFF;FBFFBEFFF9FBFFB9/FFFFFFB/FFFFFFFBFFFF/BBFBB/FFFE?.;@FFB?FBB//
-@M01368:8:000000000-A3GHV:1:1104:24927:22253/2
-GTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGGGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGGGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACGAG
-+
-AABBBFFFFFFFGAFGG5GGGGHDGHHHHHHHHHHHHFHCFGC2F3BFGFGHBGHHFHEDHFGGGGGHHHG3F?GHHGGC/EFEHFGAEFFHGGAEHGGGG3EEGEEDHFHAAD@DGGGHG/<C/CHHHHHHEDHFHGHHG0>AC1>GED-<<-.;C0:0C:C;GH:::::0B90;FFGEGFBFF0C.;9F0;0090;900;00FA9D.A...-9=BBFFFE/FE9;9E//BBBB.BBB///B/9/B..;.
-@M01368:8:000000000-A3GHV:1:1104:4705:7727/2
-TCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCG
-+
-ABBBAFFFFFFFGGFGGFGGGGGHHHHFHHHHHHGGGGHHHHHHHHHHHHHHHHHHHHHHEDEFGHFHHHHGHGHHHHHHHGHHHHHHHHFHGHHHHHGGGGGHHHGHHHHHHHHHHHGHHHHFHGHGHGGHGGGDCD.;FFGGGGGGGGFFFFFFFFFFFFF.>FFFFFF-BBEFFFFFBFFFFF-DDFFFFFFEFFFFFFFFFFFF?F///9FFFFF/;FFFFF?AADCFFEFAFFEFFFFFB/;B/A9
-@M01368:8:000000000-A3GHV:1:1104:7756:4776/2
-CTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGG
-+
-BBBBBFFBFFFFGGGGGGGGGFFHHGHHGHHGGHGHHGFHHGGGGGHHHHHHHHGFF3GGGHGGGHFDHEGHHFHHHHGFHBCGHGEGFFFFFHHHHHGHHHHHGHHHGGGGGHHGHHGGHHHGGGGGGHHECCFDHHADGGHHHFGFDC////FHHHDGFCGCDEECF?EGGFFHHFEHFGGHHFFF/A900;C.9..C0990.;CFBFGE/9.9B99/;B.99/FB///9AEF/99/9/BBF/B/B//A
-@M01368:8:000000000-A3GHV:1:1105:11310:21761/2
-ACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCTCC
-+
-BCCCCFCCCCCCGGGGGGGGGGHHHHHHHHGGGGGHHHHHHHHGHHHHHHHHHGHHHHHHHHGHHHHHHHHHHGGGGGHHHHHHHHHHGHHHHHHHHHHHGGHGGHHHHGHHHDGHHHHHHHHHHHHHHHHHGHHHHHGGGGGGHHHHHGHHHHHHHHFFHHHHHCCAHFHHGGFFFFFFFFFAA;BDDFFFF00.-=D.ABDA-.::AAF;F@.AAD./0000.9-;.9:00009:F090;FF000900;
-@M01368:8:000000000-A3GHV:1:1105:11578:14676/2
-GCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGT
-+
-CCBCCCBBCCCCGGGGGGGGGGHGGGGGHHHHHHHGHHHHGHHHHHFFFGGHGHHHHHHHHHHHHHHHHFGHHHHHHHGHHGHFHFGHHHGGGGHHHHHHHHHHHHHHFHHHHHHHGGHGGHHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHDGGCGHHHHHHHHHHHHHFF<GGHHHHGFGHGEHGGA=A=DFFFFAFAFF?FFFFFFFFFADFAAD;FFFA:BBBAE.A.EBFFFFEF-..0BFFF9
-@M01368:8:000000000-A3GHV:1:1105:13575:19255/2
-GGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTGGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTAACTATTACAG
-+
-AA>>ABFDCFFFFFDGFGFDGDEG1EGEFFBFHFGHA0E00A0CAAC0FFDFFAGHFEHHFDH/EAFCFFHACGHHAFFEF2DFFG/FGHHHHGHGH0C@/E@GGC0FG10>GGFGHHGHFFBGFGB2>F<EEF0@C@9:AAF00;9@-9.;FBBBBB->@;-A@FF<-;---@-;-----;-BFF/;---9//BBFFFF//B;FF///9BF///;/;B/BBFBFFBB/;-9--///;9/:-;BFFBBB9F
-@M01368:8:000000000-A3GHV:1:1105:15502:11453/2
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACCTGTCTCTTATACACATCTG
-+
-CCCCCFFFCFFFGGGGGGGGGGHHHHHHGHHHHHGGGGGFHFHHHHHHGHHHHHGHHHHHHGHFHGHGGGGGGGGHHHGGGGGGGGHHHGHGGGGGGGGGGGHHGGGFGGGFEGGGGFFFGGFGDGGGBFGFFFFFFFFFFFFFE0BFFFFFFFFFFFFFFFFFFF;BFFDFFFFBF0BFFBFFEEBFFAA009FFFFFBFFEBB0;.BFFBFFFFFFFFFFFF0;BFFFFE//090::B0000:009900
-@M01368:8:000000000-A3GHV:1:1105:16787:9771/2
-TCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCG
-+
-CCCDCFFFFFFFGGGGGGGGGGGHHHHHHHHHHHGGGGHHHHHHHHHHHHHHFHHHHHHHGGFGGHHEHHHHHAGHHGHBHHHGHHHHHHGHGHGHHHGGGGGHHHHHHHHHHHHHHHFFHHHHHGHGHGHHGGGACAFGGGGGG-AFGGFFFFFFFFFFFFFFFFFFFFF-9@AFEDFFFFFB.9-AABBBFFFEFFFFFFFFBFFFFFFEBB0BBBFFBFFBFBEDEAFFEB.ABFBFBFFFF0::/.-
-@M01368:8:000000000-A3GHV:1:1105:17564:15723/2
-ATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTT
-+
-CCCCCCCCCFFFGGGGGGGGGGHHHHGHHGHHHHHHGHHHHHHFHHHHGGGGHHGHFHHHHHHHFHHHHHHHGHGGHGGHGHHHHFHFHHGHHHHHHHHHHHHHEHGHHHHHGGGGGHHHHGEHHGHHHHHHGHFGHFHGGAHGGHGGGCCBDFGFFAFDBDDFFFFFBDA;AAD-ADC?AFEFB-@@AAEFEFFFFF..-:.B0:FFFFFFEF0BFF09FF.0;9BFFFFF0BFFFFFF?.::-909;.9
-@M01368:8:000000000-A3GHV:1:1105:18108:12091/2
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTACTGTCTCTTATACAC
-+
-CBBCCFCCCCCFGGGGGGGGGGHHGHHHHFHHHHHHFHGHHHHFHFHHHHGGGGHHHHHHHHHHHHHHHHHHHHHHGGHGGHGHHHHGHFHGHHGHHHHHHGHHHHHHGHHHHHGGGGGHHHHHHHHGHHHHHGFGHHHHHGHDHGHHGCA;?AAFGFEFDFFF.FFFFEBDFFFFFFFFBFFFFFFFFFEFEFFFEFFFFFFF.:BFFF0BFFFFFFFFFFFF;0FF0;BFFFFFFFFBFFFBFEFFFF0
-@M01368:8:000000000-A3GHV:1:1105:18331:16683/2
-TTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGGGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATATCT
-+
-CCCCCFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHGHHHHHFHGHHGHHHHHGGFGHHIIHHIHHHHHHHFHCFGHEEHFFHGHHFGHGHGHFHHGGGGGGEEGHHEHFHHGGHFHHFGGGGDFGBCGG?DGHGGFCGGHHECEF?CHGGDGFFGGHHC?EEGGHHHH.>AEGGGHEE-AEG0C0GCCEFFFFGEFG/;CEGGGE.:CAE.;@.@EFBFFFF/..:BFF0:BB00FBFFFFBDAFFF0;0B
-@M01368:8:000000000-A3GHV:1:1105:20577:18421/2
-ATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGCCGAAAATACCAAATGCATGGAGAGCTCCCGTGAATGGGTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTT
-+
-?ABBBFFFFFFF4CFFGGGFGGHHHHHHHCEGHHCHFGHCAFEFHHHGGAEGGHHDHHHBGHBGHHH?5BGE1AEEFHHHHHGHFHBGHGEGGGGHBFHHFGHBGCFFG4EGHGG?E/FG3F3F/FGCDECEA/FGG/CEDBB//?BHEHHF0ADC@<AFH1CDDGCGG..<C--:D000CF0::C009B9F/B..909C9....009.;;/900:A;;A////:BFFF/BFBFFFF.9.//;999//;9/
-@M01368:8:000000000-A3GHV:1:1105:21099:2895/2
-TTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATCGACCTGTGATCCATCGTGAGG
-+
-DDCDCFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHHFHFHHHHHHHHDEGGGHHIIHHIHEGDFHFC1EAFHFFHEGHHGHFHHGHFHFFFFGGGGHGHFFGFHEGHHGHHHHHGGGGGHECFGADHFHGGCGGEGHG/EGFHHGGDGHFHFFCECC@E?F1FH?ECGGGGHFCAEAFFHBC0CACF0BFFGGGGGFB:BEFEDGD0::;9FBB0:BF9@=...;9-AB;B0;F00:;.9:/..
-@M01368:8:000000000-A3GHV:1:1105:26469:19245/2
-GGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTTGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCT
-+
-AAABBBBFFFFFGGGGGGGGGGHHHGGGGGHHFFGHHHHFHHHFFHFHHHFHHHHHFGFHHHHHGHHHHGGGGHHHGHHFHHHHHHHGHHHHHHHGGHGGHHHHHHHHHHHGHHHHHHHHHHGHHHHGHGHHGGCGGGHHHH23FFHHHHGHGCGHHHHGGHFHGHBCCFFFFFFF/ECCDFDFEFFFFBDAFF?DADE??BFFFF=A-.AAAA.BFFFFED..BF/BFFEFFFFBFFFFFFFFFFBFB::
-@M01368:8:000000000-A3GHV:1:1105:7169:17145/2
-CATTCAATTGTTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGGTAATAGGGGGATAGACCTGTGATC
-+
-BBBBBBFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHHHHFHHHHHHHGGGGHHHHHHHHBGHHHHGFDGFHGGHGGHHHHHHHHHGHHHHGGGGGHGFHHHEHHHGFGHHHHGGGGGGHEHH3FGHHHGGGGGGHHECEGDFGFCGDHHHHFGGGC?@?CDGHGGGGC-:.ECDGDGGGGGF0.00BFGGGF/BD.00FG..;9.9;E.;BFFFFFF.9-.99///9BB///;
-@M01368:8:000000000-A3GHV:1:1106:15481:16176/2
-AAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTAT
-+
-BBBBAFFFFFFFGGGGGGGFGGHHHHHHHHFHHHFHHHHGHHHHHHHHGHHHGHHEGHHHGDGCHHHHHHHHHGEHEHHHHHHHFHGGEGGHHHHHHHGEGHGHHDHHHHHHHHEHFHGHGHHHGEGCEHHFHHHGHHHHHHHF?GHHHFEFFAFFHHGG?;@DDFFB?@B;BDAFFFEBBD>D>D9@DDCFFFFFFCFDFE.AA;/BB/.;-.;BFBBBFFBFFFFFFF/9FF?/;/BBFFFFF/;FFB/
-@M01368:8:000000000-A3GHV:1:1106:17389:18671/2
-GTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTCTTTAGGGTTTATGACCCTGA
-+
-BBCCCFFFCBCCGGGGGGGGGGHGHGHHGFGFGFHGGHHGHHHHHHHHFHHGGGGAGFBGHHHFBBGH5GDHH5EEEGEHEGFBF1DGFDGFGGGBBCEEGEHFEFDDHFBFHFD/@BGDGDHHGDCCFCD/C<->.ADDGE1GA<DBGFGHBG/..DGFCDGD.:0:.;CFGHEHBF.A-99CFGGFF0C0C0BF0;CA9/B:///;//BF/9B9?-..:;.;9.9A././;B//F.B?A////9;:/:/
-@M01368:8:000000000-A3GHV:1:1106:22927:3863/2
-AAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGATACCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGG
-+
-AAAAAFFFFFFFGGGGGGFGGGHHGGHHHGGGGGGHGHGDFGHFGGGGFHHHHHGGGGGGGGFHGDFGGGGHGG?@EFHGEFEHEGFHHHHHF2FEHHGHGDCEAD?GFDFGGHBGHHFEHHHHHHHHHDFGHGHHGBDFG0FFHFGGFHHH=GGBF-AACEHEHHGGGHHHGHHFHCCFEBB0FFFFFF/;0;;FFFBFE.AA0BF0??-AD/////;:BFFBFFBBBFFFFFB/.9ADDAD-D;-;=A-
-@M01368:8:000000000-A3GHV:1:1106:23625:4236/2
-CACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGGGTGGGCTATTTAGGTTT
-+
-BBBBBFFFFFFFEGGGGGGGGGGHHHHHHHHGHGGHHHHGFGGG?HGGHHHHHHHGGHGFGHGEEGFHHHHHHHHHHHFHHFHHGGCGGGHHHHBFGFFHGGGEFGHHGFFEEFHGGDGEHFHHHGGGCCCGHHG?EGFGGGFED@D?CEDFHEHGHFFHFHHGCGG.:CGGD:AEDCG?C?BFFFGGG/CEFBFEFFF/;:BBB;CFGD.:/:B:BB/BFFFBBFBFFAA9A..9-9@:/./;B/9/:/;
-@M01368:8:000000000-A3GHV:1:1106:26031:14826/2
-CTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGACCTAGTGGTGATATAGGGGTGTCCCGCGTT
-+
-BBBBBFFFFFDFGGGGGGGFGGGGHGGHHHHHHHGFFHHCHGGGGGHHHHHHFHFFGFGHHHHHG0EEEHHGHFFGFFHGGGCFGEFHGGGGGHGFEEGEFHGHFFGFGGGGFGDGGGG?DCCCCCDDFGHHFHCGHGHHGHHFBAFGGHE.<DCDD<CD;GFFEFHH.@?A//B0F0/;09CFFBBCF0;;F;B0;009FBFFB9.9ADDFFFFAACAC;-9;BB/B././9//;//...-;///---;9
-@M01368:8:000000000-A3GHV:1:1106:27607:15990/2
-CCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCTAGTTGAGAACTCGGGGGTTGCCCTGTCATTCACAAACAAACACATAGCACTCAAG
-+
-BCCCCFFFFFFFGGGGGGGGGGHGGHHHGHHHHGHHFHHHHHHGHHHHHHHHGGHHHHGGGGFHHHHHHGHHHHHHHHFGHHHHHCHGHGHHGGGGGGGHGFFGG@CEDGHHFHHCFGBDDGGG?AFGFGGGGAEAFDFFFFFFFECFAFFFFFFFFFFFFFFFFFFFBFFEFFFFFFFFFFDAD;=DADFF-.A.BB0000;.00;:..-;----.000.;000;00009...;A.A..0000000//00
-@M01368:8:000000000-A3GHV:1:1106:6455:17124/2
-GCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGG
-+
-BCCCCFFFFFFFGGGGGGGGGGHGHHHHHDGGHHHHGGGGHHHHHHHHFFHFHHHFGFGHGGHGGHHHHHFHHHGGGHHGGGGGHFFHHFHHGHHHFHHHHHGGCEGHGHHHGGHFGGGGGGGHHFGGC/CGGGADHHHHFGGGG?DCFHHHFGFGGCEHECACDGEHHFCGH0CFHHHHHFHFEBFFED.EED0CE0C0CFGGGGGA.;CBBBFBF/BFFFFFFEA;FFFF/BBFF//BBFBFFD.:9A.
-@M01368:8:000000000-A3GHV:1:1107:14451:26748/2
-AGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTAT
-+
-?ABBBFFFFFFFGGGGGGGGGGGGGHHHHHGGHHHHHHHHHHHGHHHHHHHGGHHHHGHHFHHHGGGGHHHHHHHHHHGHHHHHGHHHFHGGHGGFHHHHHFGFGFHHHHHHHHHHHHFHHHFFHHHHGGGGGGGFFHHGGHHHHHHHFHHHHHGGFDHGHGGGGBFFFFFBAD@>;9.FFFFFFD-99ADFFD-.9FADF--9..;AAFEFFEAA-;.///BB:BBF/BBB//B//99/;BBB/9////F
-@M01368:8:000000000-A3GHV:1:1107:18714:24788/2
-GGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTAGGTCGCAGGAACTGTCCTTGT
-+
-BCCCCCFFFFFFGGGGGGGEGGHHHHGGFFHHHHHHHHHHGGGGGHHHHGHHHHHHHHHHHHHFHHHHHHHHGHHHHHHGHHHHGGCGHHHHHHHHHHHHHHHGHHHHHGDGHGGHHHHHHHHGHHHHHHHHHHHGHHHHHHEHHHGHFGGGGHHHHEHFHHGHFHHF.>GGHHHGHGHGGHCFFCDFDFFFFFFAAF.FFFFFEFAFCFFA..@.AFFFC9--9;.;A///00--;A-.;.000000090
-@M01368:8:000000000-A3GHV:1:1107:21355:8333/2
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCGGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
-+
-AABCCFCCCCCFGGGGGGGGGGHHHGHHHFHHHHHHGHGHHHHHHGHHHHGGGGHHHHHHHHHFFHHFHGHHHHHHGGHGGHHHGHHHHGGHFHHHHHHHFHHGHHGEFFHFHHGGGGGGHHHFHHHHGHHHHE?FGHHHHGFGHGHHGGGDGGGGGFFFCFFFFFFFFFFFFA;DBBDFFFAFFFF;DBAFEDFFFFFEA?-9...9;9;BFFFF//BFBFFFFBFBFFFFFB/BFFF9B/EDEF-BFF.
-@M01368:8:000000000-A3GHV:1:1107:22864:15712/2
-GTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTCTGTCTCTTATACACATCTGACGCTGCCGCCGAGGGCTCTAGTTGTGGTCTG
-+
-AABCCFFFFFFFGGGGGGGGGGGGGHHHHHHHHHHGHHHGGGGFHGHHHHGHFGFFFFGGHGGGGGCHFHFAFEDHHGGFGGGHHEGEGGHHEGGCHGHHHHGGGGGGHGF0EECGGGGFECCFFGFBGHHHHHHGGHHGHFCFEHFBEFGGADDDC=CC0CCFHG:CEHHHGHBGH:GFFGFF0CAAA/BF09BBBBBBB9CFFB0C00;000;:CFFB;:...D?>:@=:9-@...//;////..;/;/
-@M01368:8:000000000-A3GHV:1:1107:24817:14233/2
-CTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAAAGTGTGGGCTATTTAGGTTTTT
-+
-CCCCBFFFFFFFGGGGGGGGGGFHHHHHHHHHHHHHHGHHHGEHGGHHGHHHHHGHHEHHGGGGEHGHHHGEHHGHHDGHHHHGGGGGFGEFGGEGHHGCEEEGHHEFGGDHGGGGAGFHHHHGGF/?//GHFFDGGGGGHAD??DC1DHHBGHHHHGHF<<//ACFHHCDCDE?CGEBEGFFFGF?.?DGGGGEFEFFB00CFFFB.:AFFB;/BB9BBFFBBFFFAD.;///9.A./A:FB;BF//B..
-@M01368:8:000000000-A3GHV:1:1107:24830:14440/2
-CTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTAGTTAGGTTTTT
-+
-CBCCCFFFFFFFGDGGGGGGGGHHHHHHHFGHHHHHHGHHHGGHGGHHHHHHGHHHFHHHGGGGGHHHHHGHHHHHHHHHHHHGGGGGHGHHFGGHHHGGGCGGGHHGGG?GGFGGGHHFHGH?FG/CDHHFAAEGGG/DHFC?-.AFGFH0CHHFH0DHHG/CDEBFHG.CA.:0C:;.FGFEFFG:E.B909BFF/;CFGBB9BBA.:CFGFFFFFFFF/;//AF?.ADEAB.9.A/;.:BFFF/9FF.
-@M01368:8:000000000-A3GHV:1:1107:26478:23602/2
-ATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGCGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGATACAGTTCACTTTAGCCTGTCTCTTATACACATCTG
-+
-AAA?AFFFFFF>FGGGGGGGGGGGFHHEFGHHHGGGGGGHHHCGGEFHFGGGFHHHHHGGGEGGHHFHEEGEG/EEEE/?/EHFHH3GGH4EGHHCB01CGHGHGD//<@CGGBFFDGHHHH0FEHHGEGFHCD11>0=GGHGCCFGHGBGGD0GGHC0C.@?ACEEC/.EDEB?BFFCFB9CFF090BBCBFBF0CCB0B00A.9E.B/9BA=-..B9FBF//;BBBBFFB:./9/9/9;B//9BF/;B/
-@M01368:8:000000000-A3GHV:1:1108:11059:23181/2
-AACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACC
-+
-CCCCCFFFFFCCGGGGGGGGGGHHHHHHHHHHHGHHHHHHHHGHHHHHHHHHHHGGGGHHHHHHHHHHHHHHHHHHHHHHGGHGGHHHHHHHHFHHHHHHHHHHHHHHHHGHGHEHHGFCGGGHHHHHHHHHHHHHHHFGHHHHHGHGHGHHGGGBFGFFFFEAFFFA.BFFFEFDDFFFFFFFFFFEEFF;D;EFFFFFF0BFFFADDFFFFFBFBFFFFFBB0FFFF0::0BF000BFFFBBF0EDFF@
-@M01368:8:000000000-A3GHV:1:1108:12233:13498/2
-GGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACTGTCTCTTATACAC
-+
-ABBBCFFFFFFFGGGGGGGGGGHHHGHHHHHHBGHHHGGGGHHHHHHHHHHHHHHHHHHHHHHGGHGGHHGHHHHHGGHHGHHHHHHGHHHHHHHGGHHHHGGGGGHHHHHHHHHHHHHGHGHHHHHHGHGHGGHGGGGAGGFGGGGGGGGFFFFFFFFFFDFFFFDFFFFFFFFF>.AEDEFFFFF?E-DAB9FFFFFFFEF:FBFB009:0FFFF9BFFBFFFFBB0.9A=-/0BFF0BBFFBFF:90:
-@M01368:8:000000000-A3GHV:1:1108:14328:14751/2
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATCTGTCTCTTATACA
-+
-ABBBBFBBBBBFGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHHHHDHHHHGGGGHHHHHHHHHHHHGHHHHHHHHHGGHGGHGGHHHHHGHHHHHHHHHHHHHHHHFHGHHHHHGGGGGHHHHHGHGHHHHHHG?FHHHFHGHGHGHHGGGGGGGGGFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFAFFE.ADEFFFFFFFADFFFFF///BBFF/FFFFFBFAFFFFBB///;9:BBFFFBF9B9//:/
-@M01368:8:000000000-A3GHV:1:1108:16350:22621/2
-CATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATAT
-+
-CCCCCFFFFFFFGGGGGCGGGGHHHHHHHHGHHHHGHGHHHHGGGGHHHHHHHHHHHIHHHGHHHHHHGGHGGHHHHGHGHGHHHHHHHHHHHGHHHHHHGGHHHHGGGGGHHHHHHHHHHHHHGHGHHHGHHGGGGGHHGGGDADDGFFGGGGFFFFFFFFFDFFFDFFFFFFFFFFFAFAEFEDFFFFFFEE-AAFFFFFBFFFFF0FFFBFF;AFFFFFFFFFFFFFFFFFFFFFAB9BFFFFFBFFF
-@M01368:8:000000000-A3GHV:1:1108:21791:23272/2
-CATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCT
-+
-BBBBBFFFFFFFGGGGGGGGGGHHHHGGHHHHHHHGGGEGGHHFGDHGHHHHHHGGHHH2GGHHHGHHGGGGFGFBFHHHGGGGHGHGHHHHHHHHHHGHGHHGHHGGHGGHHHHGGFHGGGHFHGHHHHHGGHHHGHGFCGFFDGGG/FCFHBGHHHHHHHGHCHHHHGGGHGHGHGCFF;>@DFFBFFFFFFDFFFFFFFF;;.DDAA;FFF;BB;C@..9::BBFBBA;-:.::FBB///;/////:/
-@M01368:8:000000000-A3GHV:1:1108:23314:26089/2
-CATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCC
-+
-BBAAAFFFFFFFGGGGGGGGGGHHGDHHHHHFHHHHGGGGGFHFFGFFHEGHHHHHHHHFGHFHHHHDEHHHHHHGHFHHGGGGHHGFHHHHHHHHHHHHHHHHHHF?EEFCHFGFHHEFFFHGFHHGHFHFHHHFFHAG??GHACGGDGHGGBFHHHHHHHGHFGHGHGEGHGCFFF@CD-BDDFFFFFFFFDDFFBBFFD-B-A.DFFA.AFEFF-;-..:..BFFFFFA-../9FFF//B/BBBBFF/
-@M01368:8:000000000-A3GHV:1:1108:25084:18127/2
-CCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAATTAATGCTTGTAG
-+
-CCCCCFFFFFFFGGGGGGGGGGGGHHHHHHHHFHHHHHHHHHHHHHHGGHHGHHHHHGGGGFHHHHHFHHHHHHHHHGGHHHHHCGGHGHHGGGGGGGHHGGGGGGGGHHHGHHGGGGGGGGGGGGGGGG@CDE?EFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFFE;DFBFFFFFFFFFFFFFFFFFFFAFFFFFFFBFFE0BBBFFFFFFFFFFBFFFF9BB0:0:B;
-@M01368:8:000000000-A3GHV:1:1108:7626:10048/2
-AACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCTAGTGGAGATCTCTGGGGTCGGCGGATTT
-+
-BCCDDFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHHHHHHGGGGGHHHHHHHHFGHHHHHHHHHHHHGHHHHGGFHHHFGGGGHHHGHHHHHHHHHHHFGHHHHHGHGHGHHGCGCGGFHHHGGGGGGGGGGGGGGGGGGGFFFAFFFFFFAA-AFEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBBFFDFFFFFB-<>;>@BE<:000.0.0/0<00<0:>..-<<<---.0
-@M01368:8:000000000-A3GHV:1:1109:11270:12255/2
-CTACCTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCTAGTGGAGATT
-+
-BCCCCFFFFFFFGGGGGGGGGGHHHHHFHHHHGGGGHHHHHHHHHHHHHHHHHHHHGHGGHGGHHGHHHHHGHHHHHHHHHFHHHHHGHHGHHHHHGGGGGHHHHHHHHGHHHHHH?FHHHHHGHGHGHHGGGGGGGGGGGGGGGGGGGGFFFFFFFFFFFFFFFFECADFFFF.DEBFFFFFF;D.B<FFFBFFFFFFFFFFFF0FBFFFFFFFFFFFFFFFBDDDFEFDFF@--@-9.<:000.0<0<0
-@M01368:8:000000000-A3GHV:1:1109:19224:11655/2
-CCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTCTGTCTCTTATACACATCTGAGCTTC
-+
-CCCCCFFFFFFFGGGGFGGGGGHGGHGGGHHHHHHHHHHHHHGGGGGHFHHHHHHFHHHHHFHHHGGGGGHEFHCEEHHHGGGGFGGGFGGGGHEGGGEHFHHHHDGGF?AGFHGGGGGGGGHGGGGGGGHHHHHHGFFFHHHHFCEFHFHGF<EGFHFGGAGBFHHHG/C.;C:0:GGG00CFGEFGBA.9C:BBFFGFGGFFFBFGAGG.D..:A.DFFEFFFBFFF0099:9BB0BFB009000;000
-@M01368:8:000000000-A3GHV:1:1109:21978:9490/2
-GAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGGTCCAGTGTAGAGTTATGGGG
-+
-BAABBFFFFFFFGGGGGGGGGGGGGHHHGHGGHHHGGGGGGGFHGGGGHHGGGGHHHHHHGGGGG?HHHGGGGGG?E1FEEE?EHHHHFHAGHHHHHHHHHFHHHHGGFDEG2FCFFGHHHHFH?FF<FFGDHHHHBGHHEGFDD<GFGFDBGHGGHH0GDFH@<AEE.::CFGGHGGBGFGG0BFAF0000BFDEGGFGGGGGFGE00BC;;B00.;AAD.;--------.-;/:9////////////;9
-@M01368:8:000000000-A3GHV:1:1109:22910:4079/2
-CTCCGGGCCCATAACACTTGGGGTAGCTAAAGTGGACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCT
-+
-CCCDCCCCCDDFGGGGGGGGGGGEGGHHHHHHGHHHHGHHHHHHGGGFGHGFHHHHHHHHHHHHHHHFHGHHHHHGGHHHHHHBGHHGGCGGHEHHHFHHHHFHHFHHHHHHGHGGHGGHHHHHHHHHGHHFFHHHHHGHHHHHHHGHHGHHGG?FGHHGHHHHHHHHHHHGGHHHHHH?CEHGFHGGF--@DFFFFFAA;DDFFFFFF?@FC.A=DD-.AFFFF;->;.ED.FFFFFFF-.:00009BBF
-@M01368:8:000000000-A3GHV:1:1109:24217:19077/2
-TAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGAACCTGAAGTAGGAACCAGATGTCGGATACAGTTCACTTTCTGTC
-+
-BBBBBFFFFFFFGFEGGCFGFGHHHHFHHFHHHHHHGGEEEFGHGFFAGFFEEAEGGHHBEEFAFGAEF1G3GFGGEEF@EAGGHGFF?ECGGHEEEFGGHHHHFHHFHHGFHHHC2D<FFFFAFDFF<FF1FGGBHHFF0>AGHGG00<G<<DGBGDD0<.;CGG;;:;CFFHHHHHHG?D.;.;/ACD.;FFFB0CFBFGGFGGB0;EFAFF9B/:BB/;;AEFF//:AF-A.;//:B///;BFBB:;/
-@M01368:8:000000000-A3GHV:1:1109:25237:11722/2
-CATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCTAGTGTCGATCTCTGTG
-+
-CCCCCFCCCCCFGGGGGGGGGGHHHHHHHHHHHHHHGHGHHHHHGGGGGHHHHHHHHHHHGHHHAGHHHHHGHGHGHGGGGCGF?FHGGGGGGGGHHHGHHGGGFFGGGGGGGGGGGGGGGE?DEGGGFFEF;DDFFFFFFFEFFFEFFFFFFE./B9BFFFBFFFFFFFFFFFF>-BFFA9FFFFFFFFFFFBFAFFAFFFFFBFFFFFFF/9BFFDFFDDFF-9@CDAD;:AFF/;B//....;;///;
-@M01368:8:000000000-A3GHV:1:1109:27103:7153/2
-NTACTTCAGGGTCNTAAAACCTNAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCANGGNAGCTCTCCNNGNNNNTGGTATTNTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACCTGTCTC
-+
-#>>AAAFFFFFFG#AAFFGGGG#BAFFAGHHHGGGGHGHHHHFHHHHHHHGHHHHHHHEGFGGHHBGHGHHBGFFEG2GHHFHFHHHGHHGHFH#/B#??FFGHHH##?####????FHG#??CFGGGEF>CGAGAGGGFGAA@@FFFFFFFFB=@@FF?FF;FFFF@@-@-AFEF?BB/BF?E-BBFFF;:BB/BFFFB/BFFFBFBFBBFFFFFB/FFFBB/;9A@@BFFBFFFF/BBFFFFFFE/:9/
-@M01368:8:000000000-A3GHV:1:1109:8763:7859/2
-GGTTCCTACTTCAGGGTCATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAG
-+
->AAABFFFFFFFGGGGGGGGGGHHHHHHHCHFAFHHDGEGFHHHHHHHHFHHHHFHHHHHHGHGGHGGHHHFHGHHHHHFFHHHHHHBGHFFHGHGHHHHHGGEGGHHHHHGHHHHHHHHHGFGHHHHGHGHGHHCCGGGGGGGGGGAAGF?FFFFBFA@=BDDFF?-;FFF;@CFFEFEFFFFFFFFFBFDFFFFFFFFFFFFFFFFFFFFFF:FFFF/BF/FFFEFF?DECAFEFFFFFE:FFFFFFFB
-@M01368:8:000000000-A3GHV:1:1110:12808:18367/2
-GCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACAGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTCTT
-+
-ABCCCCDDDFFFGGGGGGGGGGHHHHHHHHHGGGGGGHHHHFHHGHHHHHHHHHHHHHGHHHGGHHHH3GFHEFHHHHHGHHGFHHHHHFGHHHHHGHGHGGHGGGGGGGHHHGGCGGGGHHGGGGGGGGGGGGGGGGGGGF-BAEFEBEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEFFFFFFFFFFFFAFEFDFFFFFFFFFF0BFBED=@DFFFFFFFFFEFFFFFBFAFB;0:;F0
-@M01368:8:000000000-A3GHV:1:1110:14751:26540/2
-ATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGGTTGGGCTATTTGGGTTTTTTGACCCTGAAG
-+
-BBBBBFBBBBBFGGGGGGGGGGHHHHGGFHGGHGGCHHHHHHGHHHGHHGEGGGHHHHHHHHHHEFHHHHHHGEE?FGHGEHGGHHHGGGGGGEHHGGGGHHGGGEGHHHGHGGGDFGHHGHGGGGGCGAFFCCDFHHHH1CGGHBHFHFCGFFCDFHGCCE.CC:EGFHHCGHHGCF?FGGGFGGG;B9;FFFFFFEGEBF0;;;0;CFBFFF?D.DE.:..99-...;;//9A.;DE.9-./:FB.;//
-@M01368:8:000000000-A3GHV:1:1110:15519:10008/2
-GGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAG
-+
-BBCBCFFFFFFFGGGGGGGGGGHHHGHHHFHHBGHHHGGGGHHHHHHGHHHHHHHHHHHHHHHGGHGGHHGHHHGGBGHHHHHHHHHHHHHHHHHGGFHHHGGGEGHHHHHHHHHHHHHHHGHHHHHHGHGHGHHGGGGGGDGGGGGGGGGBFFFFFFFFFFFFFFFFFFFECB-=BFFFFFFFFBB?E-A::FFBFFFFFBFFFFFFFFFFFFBFFEFFF;0BFF0:FE?FFFFBFFFFFFFFFFFFFF0
-@M01368:8:000000000-A3GHV:1:1110:16559:7507/2
-GCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTAATTAAT
-+
->AABBCCCCFFFGGGGGGGGGGHHHHHHHHHGGHGGHGHFHHHHFHHHHHHHHHHFHHGHHHHGHHHHHGGEEGHHHHHHHHHHHHHHHHHHHHHHGHGHGHHGGGGGGGHHGGGFGAGFGGGGGGGGGGGDDDFAGGFFFFCFAFEEFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFBFFFFFFFFFFFFFFE..@BFFBD./;:0FFFFF09B/AFCA=-99BFFBFFFFFFFB:BFBFFBFB9:
-@M01368:8:000000000-A3GHV:1:1110:16700:6843/2
-GTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTCTGTCTCTTATACACATTTGTCGCTC
-+
-CBCCDFFFFFFFGGGGGGGGGGHHGHHHGGHFHHHGGGGGHHHHHHHHHHGHHHHHHHHHHHGGHGGHHHHHHHGBGFFHHHHHHGHHHHHHHHGHHHHHGGGGGHHHHHHHHHHHHHHHFHHHHGHCG/GGHHGGGGGGAFGEEADAGGDFFFF00D>CFDDFFFB?AF?B;-@>.FEDFFFFF0BF-BDFFFFE00B0BF0FFFF:BFA0B0:BBFBBFFFFF0B0:000<00<BFBB0<00000<99.
-@M01368:8:000000000-A3GHV:1:1110:18014:7856/2
-CATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCTAGTGTAGAGCTCGGGGGTCGCCGTGTATTTTTACAAAAAA
-+
-CDDDBFCDDDDFGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHHHGGGGGHHHHHHHHHGHHHHHEGHHHHHEHGHGHHGGGCCGGHGHGCGGGGDHHHHFHGGGGGGGGGGGFGGFGAC-EFEGGGFFFGFF;DFFFBFFFFFFFFFFFFFFFFFFFEFFFBFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFB?DFF---;--D;9AFB0B:B0::00;0.;----.--.-9-:/00::090:0;..:
-@M01368:8:000000000-A3GHV:1:1110:23303:11846/2
-GTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTAAGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAA
-+
-BBCBBFFFFFCFGGGGGGGGGGHHHHHHGGHHHHHHHHGH5GHHHGGGGHHHHHFHHHHHHHEHHGFBGEEFE1FG5GFHHHHHFHHHGGGGGHHHHHHHHHHHGGHHHHHGGGGFHHFHH/EHHHGG?@EFHHHGGGGHFGGGGHHFHGGDGGGGFFFHGFDGGGCGACC;DFFB0CH0CCCFGBFBFB/:A?FFFE?AA.CFBECE0BBBF0F/A./9FFFFF./;/FFFFFFA.:////9BB/B/BB/
-@M01368:8:000000000-A3GHV:1:1111:13195:14562/2
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATCTGTCTCTTATACACATCTGACGCTGCCGACGG
-+
-ABBBBFBBBBBFGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHHHHDGHHHGGGGHHHHHHHHHHHHGHHHHHHHHHGGGGGHHGHHHHGFGFHHHHHHHHGHHHHHHHGHHHHHGGGGGHHHHGHHHHHHHHHHGFHHHHHGFGHGHHGGGGFCGFGFFFFAFFFFFFFFFFA;BADFFFAFFFFFFFFFEFFFEFFFFFFF;FDBFFFFFFFFFFFFFFFFF/BFF/BFFFEBFFFEFFFFFFFFF@B@-
-@M01368:8:000000000-A3GHV:1:1111:14287:20817/2
-ATTCAATTGTTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATGAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGTTAGACCTGTGATCC
-+
-CCCCBFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHGHHHGHHHHGHHHGHGHFHHHGGGGHHHHHHHHBGGGFHHFGGHHGGHGHHHHHHHHEGFFHHFGGGGGHHEHHHBHHHHHFFHHGHGGGGGHFGF3FDGHHGCGGFGHHGGGG/2GG@E?GHHHGFEDGGC<FGHH?EGGG@DH.@ECEGGGGGGFGFFB0FGGGGGGEGGGFGEFEF0BE0AFFBFFFF9.-.00;000;;90;99
-@M01368:8:000000000-A3GHV:1:1111:23624:14516/2
-CGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACCCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAA
-+
-BBBBABFFFFFFGGGGGGGGGGHHCGHHHHHHHGHHHHHHHHHHHGDGEHHHHHHGHHHHHHHHHHHHHHHGGEFGHHHHHHHHBGFHHHHHHHHHHHHHHGHGGGGCEFGGCGHHHHFHHHHGHHHHFGHHHHHHGHGHGHHBCA?B-9FGFG?D;BD?9BFFFFFFF;DFFFF-.A;ADF-@=EF??A.BFFFEF>FDFFFFFFFFFFFBFFFFFFFFFFF/FFF/BFFFFFFFBA.?@;FFBDFFFF/
-@M01368:8:000000000-A3GHV:1:1111:7437:24508/2
-ACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTCTGTCTCTTATACACATCTGACGCTGCCGAGA
-+
-BBBBBFFBABBBGGGGGGGGFGHHHHHHHHHHHHHGHHHGFHHHHGGGGDHHHHHHHHGFHHHHHGHHHHHHGHFHGHHGGGDFGDFFGGGFFGFFGHGHHHGGC?AD-:A-AFFGGG-?9EFEFGGFFBFEFCFFFFFFFBBBFFFFFFFFFFFFFFFBBFFFFFFFFFFFFFFFFFFEFFFFFFBFFFFEFEFFFF;CF-FFFFFFFF/BFFFFFFFFFFFFEFBFFFB/FFFFFFF//9A..;F--@9
-@M01368:8:000000000-A3GHV:1:1111:8665:25542/2
-CTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGACAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTA
-+
-CCCCCFFFFFFFGGGGGGGGGGHHHHHHHFHHHHCHHGDGGGGHGGHHHHHHHHGHGHHHGGGGGHFHHHHFHHHFFHHHHHFGCGGEHFHHFGGHFHGGGGGGHHFEEEAFEFFDFHGHHHHGGGGGGGHH0DGGGGCGHCC-<CCBGHHHGEFFFFHH.C/<AEGHHEG.EEA0GE0:FB0CFGF:A?FFBF??FG0B;FGGGGFGE?BBF;BFBFFFF/F/B?DDF.;.;:ADD.BA/BBFFB:BFE/
-@M01368:8:000000000-A3GHV:1:1111:9655:13916/2
-TTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATTGCGTGGACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATG
-+
-ABBB>FFFFFFFGGGGGGGGGGHHHHHGHHHHGHHGGHHGGHGGHHHGHHHHFHHGHHAFGGGHHHHHGHHHHFHFHHHHHECGGGHGHHHEFHFHGGGGGGGGFGFFGFFEFGEGHHHGHHGGDGGGHGFGGGGGGGGE@GCGGHHHGHHHHHGHHHHFHHGEGFFEGCE.ECCECEHCGGFFE/AABFFG0CFE0BFFF9CFGG.F/BBBFFGFGGGFFFFFFBFEDAEFFFFFBFFFFFFF0;FEBF:
-@M01368:8:000000000-A3GHV:1:1112:10272:7828/2
-GTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGTGTGGGCTATTTAGGTTTTATGACCCTGAAGTAGGAACCAGATGTCGGATACCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCAAGTGTAGTGCTCGGGGGGG
-+
-BBCCBFFCCCCCGGGGGGGGGGGGGGHHHHHHGGGGGGHHFHGGGGGFGHGGGGGGHHHHHHHHHHFHHHHFHGFFHHGF?ECEFFFFFFHHHHHH?FHHHHHHHHHGFHHHHHHGGGFGHHHHFHHHHHHHHHHGGGFGFGCGGGGHHHHHHHHHHHGGFFHGHHHHHFFHFCGFHCCGHGHCGGHG?DGGGGGFBBFGFBFBBBGGGB0000;CD?DFFAFF9=--;...://;////////.------
-@M01368:8:000000000-A3GHV:1:1112:9832:16531/2
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
-+
-BBBBBFBBBBBFGGGGGGGGGGHFHHHHHHHHHHHHHHGHHHHGHFHHHGEEGGHHHGHHHHHHHHHHHHEHGHHGGGHGGHGHHHHHGHHHHGHHHHHHHHHHHHHHGHHHHHGEGCGHHHHHGHHHHHHHHHHHHHHGHFFGHGHHGGGDACDFFFFABFFFFFFFFFFD-BC?DA9.DFFBEA==B=?F.;ABBFBFEF-DAF/BFF9/FFFBB/9BFFFFFFF/BFBBFFFFFFF/9FEA?--B/;.
-@M01368:8:000000000-A3GHV:1:1112:9832:6701/2
-GCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATT
-+
-BBBBAFFFFFFFGGGGGGGGGGFGHHHHHGHHHHHHHHHHHHCGHHHHHHHGHHHHHHDGHHGGAECHHGHHHHHHHGHHHGHGFHHHHGGHGGHHFHHHHHHFHHHHHHHHH2GHHHHGHGHHFHHGGFGGGHHGHHHHHFHHHHEFHHHHEFGFFHGEHCFGDFDFFFFFCFFFFFFFFFFFFFAFBFFDFFFFFFFFADCF?9?EFBFB9EF-A.;BFFFFFFFBFFFFFFFFFFFFBFFFFFFFFFF
-@M01368:8:000000000-A3GHV:1:1113:13532:8618/2
-GCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTGGAT
-+
-CDDDBFFFFFFFGGGGGGGGGGHHHHHGGHHHGHHHGHHGGGGEHHGGHHHHHHHHHHHHHHGHHGHHHHHGGHHHHHFHHHHGCDCGHHHHHHHHEHHHGHGHHHGFHGGHGGHHHHHHHHFHHHFHHHGHHHHHHHHHFGGHHHHGGGEGAFHHGHHGGHHHHGHFBGFHGHGHGHGGHGGF@DAFEFBECAB=A.0BFFFEDF=A9.@D.-AAFFFA-:-..:.9/0:;0..-..0000::BFB09::
-@M01368:8:000000000-A3GHV:1:1113:21679:18011/2
-TTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCTGTCTCTTATACACATCTGACGCTGCCGACGACCGAGCTAGTTGAGATC
-+
-BCCCBFFFFFFFGGGGGGGGGGHHHHHFHHHGHHHGFGHGGHGGHHHHHHGHHHHHHHGGGGFHHHHHHEGHHHHHHHHFGGFCGEHFHFGEGHHHFGGGGGHHHGGGEHGGGGGHHHHHHGDCCCGHHHHDGGGGCD/FCC-><FGFGEHEBDF0DGFFFFGGFFHCE.;.A;CF0;BFBFFGF/9C0;0CFGGF0F09FGGGFFFBBFEFFFB0FFEF0;09.:..9--::---;;-;;F00000:.00
-@M01368:8:000000000-A3GHV:1:1113:25528:14016/2
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
-+
-BAABCFCCCCCFGGGGGGGGGGHHHHHHHHHHHHHHHHGHGHHHHHHHHHGGGGHHHHHHHHHFHHHHHHHHHHHHGGGGGHHHHHHHGHHHHHHHHHHGGHHHHGHHGGHHHEGGGGGHHHHHHHHHGHHHHHGHHHHHGGHGHGHHGGGGGGGGGFEACFFFFFFFFFFFFFFFDFFFAFFFFBFAB@EFAAEFFFFF.ACF.BBFFEBFFFEB;FFFFFFFA/BFBFBBBFFFBFFFFFED.>DFFF.
-@M01368:8:000000000-A3GHV:1:1113:5741:16959/2
-GTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACG
-+
-BBBBCFCCCCCFGGGGGGGGGGHHHHHHHGHHHHHHHHGHHHHGHDGHHHGGGGHHHHHHHHHHHHHHHGHHHHHGGGEGGHHHHFHHHHHHHHHHHHHHHHHHHHHHGHHGHHGGGGGHHHHHHHHHHHGHHHFHHHHHHGHGHGHGGGGCGGFGGFFFFFFFFFFFFFBFFFFFFFFFFFFFFAFFFFEAEFFFFFFFFFFF9BFFBFFFFFFFFFFFFFFBFFFFFFFFFFFFFFFFFFADAB-/BF.
-@M01368:8:000000000-A3GHV:1:1114:10130:11959/2
-ATCAGAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGTGATAGACCTGTGATCCATCGTGATGTCTTATTTAAGGGGAACGCTGTCTCTTATACACATCTGACGCTGCCGACGAGCGATCTAGTGGAGAGTTCTGTGGGGCCGGGGATCCTTATAAAAAAAATAGA
-+
-BCCDDFFFFFFFGGGGGGGGGGGHHHHHGGHHHGGGCGGHGHGGGGHHGGGGHHHHHHGGGEGGHHHFGGGGG?E1FE?/EEHHHHHGHHGHHHHGHFHGHGHHGDGGFG2FF2?GHHHHHGCCCFHGHGHHHHGHHFEHHFGHHGHH<1=DGHHHGHHGHGAGAEEDG.CGCGHC0CGBFHGFBBF0ABDDEFF@?--:BB@.;:BF;0.0:0.0:000:BF.-.------.9/;000::0;0:--.000
-@M01368:8:000000000-A3GHV:1:1114:14540:5315/2
-CACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCC
-+
-CCCCCFFCCDCCGGGGGGGGGGHHHHHHHHHGGGGGHHHHHHHHHHHHHHHHHHHGHHHHHHHGHHHHFHFHHHGGGGGHHHHHHHHHHHHHGHHHHHHHHGGGGGGHHHFHHHGHHHHHHHHHHHHHHHHHHGHGHHHGGGFGHHHHHHHHFHHHHHF?1FHHGHGHGHGHHGGFFFFDBFBE;BCC.:BFFFFFFFFFFFFFF;AFFFFF-=-.AEDEFFFFF..9A;9FFFF0FFFFE00FFF0:BA.
-@M01368:8:000000000-A3GHV:1:1114:15066:16302/2
-TTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCACACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCATCGTGTGG
-+
-CCCCCFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHHDGHHHHFHHGHHGHHHHHGGGGEHHHHFHHFF5FHHFEGHHHGDHGGHGHGFGGGEHFGHHGGGGGHGHHHGHHFHHB3FGHHFGGGG?GFFHCCEBGFFECCDFEGFCFGCHHGFDDHHHGHHCFGGGGGFBFDGFG?-:..AFG.-C0C009;:00;00:9/:CEFFF?AE::9;9?0:FEF0;0..--./00::B/090000000;A....
-@M01368:8:000000000-A3GHV:1:1114:16639:15258/2
-TTATTATTATGTCCTACAAGCATTAATTAATTAACACACTTTAGTAAGTATGTTCGCCTGTAATATTGAACGTAGGTGCGATAAATAATAGGATGAGGCAGGAATCAAAGACAGATACTGCGACATAGGGTGCTCCGGCTCCAGCGTCTCGCAATGCTATCGCGTGCGCACCCCCCAGACGAAAATACCAAATGCATGGAGAGCTCCCGTGAGTGGTTAATAGGGGGATAGACCTGTGATCCATCGTGATG
-+
-CDCCCFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHHHGHHHHHHHHGHHHHHHGGGGGHGIHHHIH5DEGHHHF?FGHGGHGGHEGGHFHHGHGEHHGGGGGFFFGHFBG2GHEBGHHGHGGEG/GFGABEDFGHEED?GGHHFFGGGCFEGD/GFHFFGEFGCGG?CC??D-EF@EEEFGCDDBBFGGGEBBFFF09090A.BFGA.9CCA0;EBAB00BBFF.@-./;BB;BFFF0:00099AAFFF0
-@M01368:8:000000000-A3GHV:1:1114:2404:13066/2
-ATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGACCATACTTACTAAAGTGTGTTAATTAATTAATGCTTGTAGGACTGTCTCTTATACACATT
-+
-CCCCCFFFFFFCGGGGGGGGGGHHHHHHHHHFFHHHHGGGGGHFFFHHFHHHHHHHHHHHHHHHGFEGGGHGEDFCDFHGHFG@@DGGHHHHHHGGGGCGGGGGEHGGCGBB?CF99EGFGGFGG?D9CFFFF/BBFFFFFEF9BFFAFFFFEFFFFFFFFFFFFFFFFFFFFF.FFBBFFFFFFFFFFFF-9;;;BFFFFFB9BFBFBFABFFEFFFFFFFFFF::BFFBFFFF.9//;FFFFF/BFFB/
-@M01368:8:000000000-A3GHV:1:1114:9184:6959/2
-AAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAACCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATGGATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGGGTGTGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTCCTGCCTCATCCCTGTCTCTTA
-+
-CCCCBFFFFFFFGGGGGGGGGGHHHHHHHHHHHHHHHHHHHHHHHHHHGHHHHHHEHIHHGGGGHHHHHHHHHHHHHGHHHHHHHHGGGGGHHFHHHHHBGHHHHHHHHHHHHHHHHHGHHHHHGGGGGHHHHGHHHHHHHHHHHHHHHHHGHGHGHHGGGGCFFFFFFFFFFFFFFFFFFFFFFFFFF.CFFFFAF=D=EAEFFF0B:0AF-DAFBFFFFFFFFFBFFFFFFFFFFBFFFEFF9B900B0
--- a/test-data/bwa-mem-mt-genome.fa	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,239 +0,0 @@
->gi|251831106|ref|NC_012920.1| Homo sapiens mitochondrion, complete genome
-GATCACAGGTCTATCACCCTATTAACCACTCACGGGAGCTCTCCATGCATTTGGTATTTTCGTCTGGGGG
-GTATGCACGCGATAGCATTGCGAGACGCTGGAGCCGGAGCACCCTATGTCGCAGTATCTGTCTTTGATTC
-CTGCCTCATCCTATTATTTATCGCACCTACGTTCAATATTACAGGCGAACATACTTACTAAAGTGTGTTA
-ATTAATTAATGCTTGTAGGACATAATAATAACAATTGAATGTCTGCACAGCCACTTTCCACACAGACATC
-ATAACAAAAAATTTCCACCAAACCCCCCCTCCCCCGCTTCTGGCCACAGCACTTAAACACATCTCTGCCA
-AACCCCAAAAACAAAGAACCCTAACACCAGCCTAACCAGATTTCAAATTTTATCTTTTGGCGGTATGCAC
-TTTTAACAGTCACCCCCCAACTAACACATTATTTTCCCCTCCCACTCCCATACTACTAATCTCATCAATA
-CAACCCCCGCCCATCCTACCCAGCACACACACACCGCTGCTAACCCCATACCCCGAACCAACCAAACCCC
-AAAGACACCCCCCACAGTTTATGTAGCTTACCTCCTCAAAGCAATACACTGAAAATGTTTAGACGGGCTC
-ACATCACCCCATAAACAAATAGGTTTGGTCCTAGCCTTTCTATTAGCTCTTAGTAAGATTACACATGCAA
-GCATCCCCGTTCCAGTGAGTTCACCCTCTAAATCACCACGATCAAAAGGAACAAGCATCAAGCACGCAGC
-AATGCAGCTCAAAACGCTTAGCCTAGCCACACCCCCACGGGAAACAGCAGTGATTAACCTTTAGCAATAA
-ACGAAAGTTTAACTAAGCTATACTAACCCCAGGGTTGGTCAATTTCGTGCCAGCCACCGCGGTCACACGA
-TTAACCCAAGTCAATAGAAGCCGGCGTAAAGAGTGTTTTAGATCACCCCCTCCCCAATAAAGCTAAAACT
-CACCTGAGTTGTAAAAAACTCCAGTTGACACAAAATAGACTACGAAAGTGGCTTTAACATATCTGAACAC
-ACAATAGCTAAGACCCAAACTGGGATTAGATACCCCACTATGCTTAGCCCTAAACCTCAACAGTTAAATC
-AACAAAACTGCTCGCCAGAACACTACGAGCCACAGCTTAAAACTCAAAGGACCTGGCGGTGCTTCATATC
-CCTCTAGAGGAGCCTGTTCTGTAATCGATAAACCCCGATCAACCTCACCACCTCTTGCTCAGCCTATATA
-CCGCCATCTTCAGCAAACCCTGATGAAGGCTACAAAGTAAGCGCAAGTACCCACGTAAAGACGTTAGGTC
-AAGGTGTAGCCCATGAGGTGGCAAGAAATGGGCTACATTTTCTACCCCAGAAAACTACGATAGCCCTTAT
-GAAACTTAAGGGTCGAAGGTGGATTTAGCAGTAAACTAAGAGTAGAGTGCTTAGTTGAACAGGGCCCTGA
-AGCGCGTACACACCGCCCGTCACCCTCCTCAAGTATACTTCAAAGGACATTTAACTAAAACCCCTACGCA
-TTTATATAGAGGAGACAAGTCGTAACATGGTAAGTGTACTGGAAAGTGCACTTGGACGAACCAGAGTGTA
-GCTTAACACAAAGCACCCAACTTACACTTAGGAGATTTCAACTTAACTTGACCGCTCTGAGCTAAACCTA
-GCCCCAAACCCACTCCACCTTACTACCAGACAACCTTAGCCAAACCATTTACCCAAATAAAGTATAGGCG
-ATAGAAATTGAAACCTGGCGCAATAGATATAGTACCGCAAGGGAAAGATGAAAAATTATAACCAAGCATA
-ATATAGCAAGGACTAACCCCTATACCTTCTGCATAATGAATTAACTAGAAATAACTTTGCAAGGAGAGCC
-AAAGCTAAGACCCCCGAAACCAGACGAGCTACCTAAGAACAGCTAAAAGAGCACACCCGTCTATGTAGCA
-AAATAGTGGGAAGATTTATAGGTAGAGGCGACAAACCTACCGAGCCTGGTGATAGCTGGTTGTCCAAGAT
-AGAATCTTAGTTCAACTTTAAATTTGCCCACAGAACCCTCTAAATCCCCTTGTAAATTTAACTGTTAGTC
-CAAAGAGGAACAGCTCTTTGGACACTAGGAAAAAACCTTGTAGAGAGAGTAAAAAATTTAACACCCATAG
-TAGGCCTAAAAGCAGCCACCAATTAAGAAAGCGTTCAAGCTCAACACCCACTACCTAAAAAATCCCAAAC
-ATATAACTGAACTCCTCACACCCAATTGGACCAATCTATCACCCTATAGAAGAACTAATGTTAGTATAAG
-TAACATGAAAACATTCTCCTCCGCATAAGCCTGCGTCAGATTAAAACACTGAACTGACAATTAACAGCCC
-AATATCTACAATCAACCAACAAGTCATTATTACCCTCACTGTCAACCCAACACAGGCATGCTCATAAGGA
-AAGGTTAAAAAAAGTAAAAGGAACTCGGCAAATCTTACCCCGCCTGTTTACCAAAAACATCACCTCTAGC
-ATCACCAGTATTAGAGGCACCGCCTGCCCAGTGACACATGTTTAACGGCCGCGGTACCCTAACCGTGCAA
-AGGTAGCATAATCACTTGTTCCTTAAATAGGGACCTGTATGAATGGCTCCACGAGGGTTCAGCTGTCTCT
-TACTTTTAACCAGTGAAATTGACCTGCCCGTGAAGAGGCGGGCATAACACAGCAAGACGAGAAGACCCTA
-TGGAGCTTTAATTTATTAATGCAAACAGTACCTAACAAACCCACAGGTCCTAAACTACCAAACCTGCATT
-AAAAATTTCGGTTGGGGCGACCTCGGAGCAGAACCCAACCTCCGAGCAGTACATGCTAAGACTTCACCAG
-TCAAAGCGAACTACTATACTCAATTGATCCAATAACTTGACCAACGGAACAAGTTACCCTAGGGATAACA
-GCGCAATCCTATTCTAGAGTCCATATCAACAATAGGGTTTACGACCTCGATGTTGGATCAGGACATCCCG
-ATGGTGCAGCCGCTATTAAAGGTTCGTTTGTTCAACGATTAAAGTCCTACGTGATCTGAGTTCAGACCGG
-AGTAATCCAGGTCGGTTTCTATCTACNTTCAAATTCCTCCCTGTACGAAAGGACAAGAGAAATAAGGCCT
-ACTTCACAAAGCGCCTTCCCCCGTAAATGATATCATCTCAACTTAGTATTATACCCACACCCACCCAAGA
-ACAGGGTTTGTTAAGATGGCAGAGCCCGGTAATCGCATAAAACTTAAAACTTTACAGTCAGAGGTTCAAT
-TCCTCTTCTTAACAACATACCCATGGCCAACCTCCTACTCCTCATTGTACCCATTCTAATCGCAATGGCA
-TTCCTAATGCTTACCGAACGAAAAATTCTAGGCTATATACAACTACGCAAAGGCCCCAACGTTGTAGGCC
-CCTACGGGCTACTACAACCCTTCGCTGACGCCATAAAACTCTTCACCAAAGAGCCCCTAAAACCCGCCAC
-ATCTACCATCACCCTCTACATCACCGCCCCGACCTTAGCTCTCACCATCGCTCTTCTACTATGAACCCCC
-CTCCCCATACCCAACCCCCTGGTCAACCTCAACCTAGGCCTCCTATTTATTCTAGCCACCTCTAGCCTAG
-CCGTTTACTCAATCCTCTGATCAGGGTGAGCATCAAACTCAAACTACGCCCTGATCGGCGCACTGCGAGC
-AGTAGCCCAAACAATCTCATATGAAGTCACCCTAGCCATCATTCTACTATCAACATTACTAATAAGTGGC
-TCCTTTAACCTCTCCACCCTTATCACAACACAAGAACACCTCTGATTACTCCTGCCATCATGACCCTTGG
-CCATAATATGATTTATCTCCACACTAGCAGAGACCAACCGAACCCCCTTCGACCTTGCCGAAGGGGAGTC
-CGAACTAGTCTCAGGCTTCAACATCGAATACGCCGCAGGCCCCTTCGCCCTATTCTTCATAGCCGAATAC
-ACAAACATTATTATAATAAACACCCTCACCACTACAATCTTCCTAGGAACAACATATGACGCACTCTCCC
-CTGAACTCTACACAACATATTTTGTCACCAAGACCCTACTTCTAACCTCCCTGTTCTTATGAATTCGAAC
-AGCATACCCCCGATTCCGCTACGACCAACTCATACACCTCCTATGAAAAAACTTCCTACCACTCACCCTA
-GCATTACTTATATGATATGTCTCCATACCCATTACAATCTCCAGCATTCCCCCTCAAACCTAAGAAATAT
-GTCTGATAAAAGAGTTACTTTGATAGAGTAAATAATAGGAGCTTAAACCCCCTTATTTCTAGGACTATGA
-GAATCGAACCCATCCCTGAGAATCCAAAATTCTCCGTGCCACCTATCACACCCCATCCTAAAGTAAGGTC
-AGCTAAATAAGCTATCGGGCCCATACCCCGAAAATGTTGGTTATACCCTTCCCGTACTAATTAATCCCCT
-GGCCCAACCCGTCATCTACTCTACCATCTTTGCAGGCACACTCATCACAGCGCTAAGCTCGCACTGATTT
-TTTACCTGAGTAGGCCTAGAAATAAACATGCTAGCTTTTATTCCAGTTCTAACCAAAAAAATAAACCCTC
-GTTCCACAGAAGCTGCCATCAAGTATTTCCTCACGCAAGCAACCGCATCCATAATCCTTCTAATAGCTAT
-CCTCTTCAACAATATACTCTCCGGACAATGAACCATAACCAATACTACCAATCAATACTCATCATTAATA
-ATCATAATAGCTATAGCAATAAAACTAGGAATAGCCCCCTTTCACTTCTGAGTCCCAGAGGTTACCCAAG
-GCACCCCTCTGACATCCGGCCTGCTTCTTCTCACATGACAAAAACTAGCCCCCATCTCAATCATATACCA
-AATCTCTCCCTCACTAAACGTAAGCCTTCTCCTCACTCTCTCAATCTTATCCATCATAGCAGGCAGTTGA
-GGTGGATTAAACCAAACCCAGCTACGCAAAATCTTAGCATACTCCTCAATTACCCACATAGGATGAATAA
-TAGCAGTTCTACCGTACAACCCTAACATAACCATTCTTAATTTAACTATTTATATTATCCTAACTACTAC
-CGCATTCCTACTACTCAACTTAAACTCCAGCACCACGACCCTACTACTATCTCGCACCTGAAACAAGCTA
-ACATGACTAACACCCTTAATTCCATCCACCCTCCTCTCCCTAGGAGGCCTGCCCCCGCTAACCGGCTTTT
-TGCCCAAATGGGCCATTATCGAAGAATTCACAAAAAACAATAGCCTCATCATCCCCACCATCATAGCCAC
-CATCACCCTCCTTAACCTCTACTTCTACCTACGCCTAATCTACTCCACCTCAATCACACTACTCCCCATA
-TCTAACAACGTAAAAATAAAATGACAGTTTGAACATACAAAACCCACCCCATTCCTCCCCACACTCATCG
-CCCTTACCACGCTACTCCTACCTATCTCCCCTTTTATACTAATAATCTTATAGAAATTTAGGTTAAATAC
-AGACCAAGAGCCTTCAAAGCCCTCAGTAAGTTGCAATACTTAATTTCTGTAACAGCTAAGGACTGCAAAA
-CCCCACTCTGCATCAACTGAACGCAAATCAGCCACTTTAATTAAGCTAAGCCCTTACTAGACCAATGGGA
-CTTAAACCCACAAACACTTAGTTAACAGCTAAGCACCCTAATCAACTGGCTTCAATCTACTTCTCCCGCC
-GCCGGGAAAAAAGGCGGGAGAAGCCCCGGCAGGTTTGAAGCTGCTTCTTCGAATTTGCAATTCAATATGA
-AAATCACCTCGGAGCTGGTAAAAAGAGGCCTAACCCCTGTCTTTAGATTTACAGTCCAATGCTTCACTCA
-GCCATTTTACCTCACCCCCACTGATGTTCGCCGACCGTTGACTATTCTCTACAAACCACAAAGACATTGG
-AACACTATACCTATTATTCGGCGCATGAGCTGGAGTCCTAGGCACAGCTCTAAGCCTCCTTATTCGAGCC
-GAGCTGGGCCAGCCAGGCAACCTTCTAGGTAACGACCACATCTACAACGTTATCGTCACAGCCCATGCAT
-TTGTAATAATCTTCTTCATAGTAATACCCATCATAATCGGAGGCTTTGGCAACTGACTAGTTCCCCTAAT
-AATCGGTGCCCCCGATATGGCGTTTCCCCGCATAAACAACATAAGCTTCTGACTCTTACCTCCCTCTCTC
-CTACTCCTGCTCGCATCTGCTATAGTGGAGGCCGGAGCAGGAACAGGTTGAACAGTCTACCCTCCCTTAG
-CAGGGAACTACTCCCACCCTGGAGCCTCCGTAGACCTAACCATCTTCTCCTTACACCTAGCAGGTGTCTC
-CTCTATCTTAGGGGCCATCAATTTCATCACAACAATTATCAATATAAAACCCCCTGCCATAACCCAATAC
-CAAACGCCCCTCTTCGTCTGATCCGTCCTAATCACAGCAGTCCTACTTCTCCTATCTCTCCCAGTCCTAG
-CTGCTGGCATCACTATACTACTAACAGACCGCAACCTCAACACCACCTTCTTCGACCCCGCCGGAGGAGG
-AGACCCCATTCTATACCAACACCTATTCTGATTTTTCGGTCACCCTGAAGTTTATATTCTTATCCTACCA
-GGCTTCGGAATAATCTCCCATATTGTAACTTACTACTCCGGAAAAAAAGAACCATTTGGATACATAGGTA
-TGGTCTGAGCTATGATATCAATTGGCTTCCTAGGGTTTATCGTGTGAGCACACCATATATTTACAGTAGG
-AATAGACGTAGACACACGAGCATATTTCACCTCCGCTACCATAATCATCGCTATCCCCACCGGCGTCAAA
-GTATTTAGCTGACTCGCCACACTCCACGGAAGCAATATGAAATGATCTGCTGCAGTGCTCTGAGCCCTAG
-GATTCATCTTTCTTTTCACCGTAGGTGGCCTGACTGGCATTGTATTAGCAAACTCATCACTAGACATCGT
-ACTACACGACACGTACTACGTTGTAGCCCACTTCCACTATGTCCTATCAATAGGAGCTGTATTTGCCATC
-ATAGGAGGCTTCATTCACTGATTTCCCCTATTCTCAGGCTACACCCTAGACCAAACCTACGCCAAAATCC
-ATTTCACTATCATATTCATCGGCGTAAATCTAACTTTCTTCCCACAACACTTTCTCGGCCTATCCGGAAT
-GCCCCGACGTTACTCGGACTACCCCGATGCATACACCACATGAAACATCCTATCATCTGTAGGCTCATTC
-ATTTCTCTAACAGCAGTAATATTAATAATTTTCATGATTTGAGAAGCCTTCGCTTCGAAGCGAAAAGTCC
-TAATAGTAGAAGAACCCTCCATAAACCTGGAGTGACTATATGGATGCCCCCCACCCTACCACACATTCGA
-AGAACCCGTATACATAAAATCTAGACAAAAAAGGAAGGAATCGAACCCCCCAAAGCTGGTTTCAAGCCAA
-CCCCATGGCCTCCATGACTTTTTCAAAAAGGTATTAGAAAAACCATTTCATAACTTTGTCAAAGTTAAAT
-TATAGGCTAAATCCTATATATCTTAATGGCACATGCAGCGCAAGTAGGTCTACAAGACGCTACTTCCCCT
-ATCATAGAAGAGCTTATCACCTTTCATGATCACGCCCTCATAATCATTTTCCTTATCTGCTTCCTAGTCC
-TGTATGCCCTTTTCCTAACACTCACAACAAAACTAACTAATACTAACATCTCAGACGCTCAGGAAATAGA
-AACCGTCTGAACTATCCTGCCCGCCATCATCCTAGTCCTCATCGCCCTCCCATCCCTACGCATCCTTTAC
-ATAACAGACGAGGTCAACGATCCCTCCCTTACCATCAAATCAATTGGCCACCAATGGTACTGAACCTACG
-AGTACACCGACTACGGCGGACTAATCTTCAACTCCTACATACTTCCCCCATTATTCCTAGAACCAGGCGA
-CCTGCGACTCCTTGACGTTGACAATCGAGTAGTACTCCCGATTGAAGCCCCCATTCGTATAATAATTACA
-TCACAAGACGTCTTGCACTCATGAGCTGTCCCCACATTAGGCTTAAAAACAGATGCAATTCCCGGACGTC
-TAAACCAAACCACTTTCACCGCTACACGACCGGGGGTATACTACGGTCAATGCTCTGAAATCTGTGGAGC
-AAACCACAGTTTCATGCCCATCGTCCTAGAATTAATTCCCCTAAAAATCTTTGAAATAGGGCCCGTATTT
-ACCCTATAGCACCCCCTCTACCCCCTCTAGAGCCCACTGTAAAGCTAACTTAGCATTAACCTTTTAAGTT
-AAAGATTAAGAGAACCAACACCTCTTTACAGTGAAATGCCCCAACTAAATACTACCGTATGGCCCACCAT
-AATTACCCCCATACTCCTTACACTATTCCTCATCACCCAACTAAAAATATTAAACACAAACTACCACCTA
-CCTCCCTCACCAAAGCCCATAAAAATAAAAAATTATAACAAACCCTGAGAACCAAAATGAACGAAAATCT
-GTTCGCTTCATTCATTGCCCCCACAATCCTAGGCCTACCCGCCGCAGTACTGATCATTCTATTTCCCCCT
-CTATTGATCCCCACCTCCAAATATCTCATCAACAACCGACTAATCACCACCCAACAATGACTAATCAAAC
-TAACCTCAAAACAAATGATAACCATACACAACACTAAAGGACGAACCTGATCTCTTATACTAGTATCCTT
-AATCATTTTTATTGCCACAACTAACCTCCTCGGACTCCTGCCTCACTCATTTACACCAACCACCCAACTA
-TCTATAAACCTAGCCATGGCCATCCCCTTATGAGCGGGCACAGTGATTATAGGCTTTCGCTCTAAGATTA
-AAAATGCCCTAGCCCACTTCTTACCACAAGGCACACCTACACCCCTTATCCCCATACTAGTTATTATCGA
-AACCATCAGCCTACTCATTCAACCAATAGCCCTGGCCGTACGCCTAACCGCTAACATTACTGCAGGCCAC
-CTACTCATGCACCTAATTGGAAGCGCCACCCTAGCAATATCAACCATTAACCTTCCCTCTACACTTATCA
-TCTTCACAATTCTAATTCTACTGACTATCCTAGAAATCGCTGTCGCCTTAATCCAAGCCTACGTTTTCAC
-ACTTCTAGTAAGCCTCTACCTGCACGACAACACATAATGACCCACCAATCACATGCCTATCATATAGTAA
-AACCCAGCCCATGACCCCTAACAGGGGCCCTCTCAGCCCTCCTAATGACCTCCGGCCTAGCCATGTGATT
-TCACTTCCACTCCATAACGCTCCTCATACTAGGCCTACTAACCAACACACTAACCATATACCAATGATGG
-CGCGATGTAACACGAGAAAGCACATACCAAGGCCACCACACACCACCTGTCCAAAAAGGCCTTCGATACG
-GGATAATCCTATTTATTACCTCAGAAGTTTTTTTCTTCGCAGGATTTTTCTGAGCCTTTTACCACTCCAG
-CCTAGCCCCTACCCCCCAATTAGGAGGGCACTGGCCCCCAACAGGCATCACCCCGCTAAATCCCCTAGAA
-GTCCCACTCCTAAACACATCCGTATTACTCGCATCAGGAGTATCAATCACCTGAGCTCACCATAGTCTAA
-TAGAAAACAACCGAAACCAAATAATTCAAGCACTGCTTATTACAATTTTACTGGGTCTCTATTTTACCCT
-CCTACAAGCCTCAGAGTACTTCGAGTCTCCCTTCACCATTTCCGACGGCATCTACGGCTCAACATTTTTT
-GTAGCCACAGGCTTCCACGGACTTCACGTCATTATTGGCTCAACTTTCCTCACTATCTGCTTCATCCGCC
-AACTAATATTTCACTTTACATCCAAACATCACTTTGGCTTCGAAGCCGCCGCCTGATACTGGCATTTTGT
-AGATGTGGTTTGACTATTTCTGTATGTCTCCATCTATTGATGAGGGTCTTACTCTTTTAGTATAAATAGT
-ACCGTTAACTTCCAATTAACTAGTTTTGACAACATTCAAAAAAGAGTAATAAACTTCGCCTTAATTTTAA
-TAATCAACACCCTCCTAGCCTTACTACTAATAATTATTACATTTTGACTACCACAACTCAACGGCTACAT
-AGAAAAATCCACCCCTTACGAGTGCGGCTTCGACCCTATATCCCCCGCCCGCGTCCCTTTCTCCATAAAA
-TTCTTCTTAGTAGCTATTACCTTCTTATTATTTGATCTAGAAATTGCCCTCCTTTTACCCCTACCATGAG
-CCCTACAAACAACTAACCTGCCACTAATAGTTATGTCATCCCTCTTATTAATCATCATCCTAGCCCTAAG
-TCTGGCCTATGAGTGACTACAAAAAGGATTAGACTGAACCGAATTGGTATATAGTTTAAACAAAACGAAT
-GATTTCGACTCATTAAATTATGATAATCATATTTACCAAATGCCCCTCATTTACATAAATATTATACTAG
-CATTTACCATCTCACTTCTAGGAATACTAGTATATCGCTCACACCTCATATCCTCCCTACTATGCCTAGA
-AGGAATAATACTATCGCTGTTCATTATAGCTACTCTCATAACCCTCAACACCCACTCCCTCTTAGCCAAT
-ATTGTGCCTATTGCCATACTAGTCTTTGCCGCCTGCGAAGCAGCGGTGGGCCTAGCCCTACTAGTCTCAA
-TCTCCAACACATATGGCCTAGACTACGTACATAACCTAAACCTACTCCAATGCTAAAACTAATCGTCCCA
-ACAATTATATTACTACCACTGACATGACTTTCCAAAAAACACATAATTTGAATCAACACAACCACCCACA
-GCCTAATTATTAGCATCATCCCTCTACTATTTTTTAACCAAATCAACAACAACCTATTTAGCTGTTCCCC
-AACCTTTTCCTCCGACCCCCTAACAACCCCCCTCCTAATACTAACTACCTGACTCCTACCCCTCACAATC
-ATGGCAAGCCAACGCCACTTATCCAGTGAACCACTATCACGAAAAAAACTCTACCTCTCTATACTAATCT
-CCCTACAAATCTCCTTAATTATAACATTCACAGCCACAGAACTAATCATATTTTATATCTTCTTCGAAAC
-CACACTTATCCCCACCTTGGCTATCATCACCCGATGAGGCAACCAGCCAGAACGCCTGAACGCAGGCACA
-TACTTCCTATTCTACACCCTAGTAGGCTCCCTTCCCCTACTCATCGCACTAATTTACACTCACAACACCC
-TAGGCTCACTAAACATTCTACTACTCACTCTCACTGCCCAAGAACTATCAAACTCCTGAGCCAACAACTT
-AATATGACTAGCTTACACAATAGCTTTTATAGTAAAGATACCTCTTTACGGACTCCACTTATGACTCCCT
-AAAGCCCATGTCGAAGCCCCCATCGCTGGGTCAATAGTACTTGCCGCAGTACTCTTAAAACTAGGCGGCT
-ATGGTATAATACGCCTCACACTCATTCTCAACCCCCTGACAAAACACATAGCCTACCCCTTCCTTGTACT
-ATCCCTATGAGGCATAATTATAACAAGCTCCATCTGCCTACGACAAACAGACCTAAAATCGCTCATTGCA
-TACTCTTCAATCAGCCACATAGCCCTCGTAGTAACAGCCATTCTCATCCAAACCCCCTGAAGCTTCACCG
-GCGCAGTCATTCTCATAATCGCCCACGGGCTTACATCCTCATTACTATTCTGCCTAGCAAACTCAAACTA
-CGAACGCACTCACAGTCGCATCATAATCCTCTCTCAAGGACTTCAAACTCTACTCCCACTAATAGCTTTT
-TGATGACTTCTAGCAAGCCTCGCTAACCTCGCCTTACCCCCCACTATTAACCTACTGGGAGAACTCTCTG
-TGCTAGTAACCACGTTCTCCTGATCAAATATCACTCTCCTACTTACAGGACTCAACATACTAGTCACAGC
-CCTATACTCCCTCTACATATTTACCACAACACAATGGGGCTCACTCACCCACCACATTAACAACATAAAA
-CCCTCATTCACACGAGAAAACACCCTCATGTTCATACACCTATCCCCCATTCTCCTCCTATCCCTCAACC
-CCGACATCATTACCGGGTTTTCCTCTTGTAAATATAGTTTAACCAAAACATCAGATTGTGAATCTGACAA
-CAGAGGCTTACGACCCCTTATTTACCGAGAAAGCTCACAAGAACTGCTAACTCATGCCCCCATGTCTAAC
-AACATGGCTTTCTCAACTTTTAAAGGATAACAGCTATCCATTGGTCTTAGGCCCCAAAAATTTTGGTGCA
-ACTCCAAATAAAAGTAATAACCATGCACACTACTATAACCACCCTAACCCTGACTTCCCTAATTCCCCCC
-ATCCTTACCACCCTCGTTAACCCTAACAAAAAAAACTCATACCCCCATTATGTAAAATCCATTGTCGCAT
-CCACCTTTATTATCAGTCTCTTCCCCACAACAATATTCATGTGCCTAGACCAAGAAGTTATTATCTCGAA
-CTGACACTGAGCCACAACCCAAACAACCCAGCTCTCCCTAAGCTTCAAACTAGACTACTTCTCCATAATA
-TTCATCCCTGTAGCATTGTTCGTTACATGGTCCATCATAGAATTCTCACTGTGATATATAAACTCAGACC
-CAAACATTAATCAGTTCTTCAAATATCTACTCATCTTCCTAATTACCATACTAATCTTAGTTACCGCTAA
-CAACCTATTCCAACTGTTCATCGGCTGAGAGGGCGTAGGAATTATATCCTTCTTGCTCATCAGTTGATGA
-TACGCCCGAGCAGATGCCAACACAGCAGCCATTCAAGCAATCCTATACAACCGTATCGGCGATATCGGTT
-TCATCCTCGCCTTAGCATGATTTATCCTACACTCCAACTCATGAGACCCACAACAAATAGCCCTTCTAAA
-CGCTAATCCAAGCCTCACCCCACTACTAGGCCTCCTCCTAGCAGCAGCAGGCAAATCAGCCCAATTAGGT
-CTCCACCCCTGACTCCCCTCAGCCATAGAAGGCCCCACCCCAGTCTCAGCCCTACTCCACTCAAGCACTA
-TAGTTGTAGCAGGAATCTTCTTACTCATCCGCTTCCACCCCCTAGCAGAAAATAGCCCACTAATCCAAAC
-TCTAACACTATGCTTAGGCGCTATCACCACTCTGTTCGCAGCAGTCTGCGCCCTTACACAAAATGACATC
-AAAAAAATCGTAGCCTTCTCCACTTCAAGTCAACTAGGACTCATAATAGTTACAATCGGCATCAACCAAC
-CACACCTAGCATTCCTGCACATCTGTACCCACGCCTTCTTCAAAGCCATACTATTTATGTGCTCCGGGTC
-CATCATCCACAACCTTAACAATGAACAAGATATTCGAAAAATAGGAGGACTACTCAAAACCATACCTCTC
-ACTTCAACCTCCCTCACCATTGGCAGCCTAGCATTAGCAGGAATACCTTTCCTCACAGGTTTCTACTCCA
-AAGACCACATCATCGAAACCGCAAACATATCATACACAAACGCCTGAGCCCTATCTATTACTCTCATCGC
-TACCTCCCTGACAAGCGCCTATAGCACTCGAATAATTCTTCTCACCCTAACAGGTCAACCTCGCTTCCCC
-ACCCTTACTAACATTAACGAAAATAACCCCACCCTACTAAACCCCATTAAACGCCTGGCAGCCGGAAGCC
-TATTCGCAGGATTTCTCATTACTAACAACATTTCCCCCGCATCCCCCTTCCAAACAACAATCCCCCTCTA
-CCTAAAACTCACAGCCCTCGCTGTCACTTTCCTAGGACTTCTAACAGCCCTAGACCTCAACTACCTAACC
-AACAAACTTAAAATAAAATCCCCACTATGCACATTTTATTTCTCCAACATACTCGGATTCTACCCTAGCA
-TCACACACCGCACAATCCCCTATCTAGGCCTTCTTACGAGCCAAAACCTGCCCCTACTCCTCCTAGACCT
-AACCTGACTAGAAAAGCTATTACCTAAAACAATTTCACAGCACCAAATCTCCACCTCCATCATCACCTCA
-ACCCAAAAAGGCATAATTAAACTTTACTTCCTCTCTTTCTTCTTCCCACTCATCCTAACCCTACTCCTAA
-TCACATAACCTATTCCCCCGAGCAATCTCAATTACAATATATACACCAACAAACAATGTTCAACCAGTAA
-CTACTACTAATCAACGCCCATAATCATACAAAGCCCCCGCACCAATAGGATCCTCCCGAATCAACCCTGA
-CCCCTCTCCTTCATAAATTATTCAGCTTCCTACACTATTAAAGTTTACCACAACCACCACCCCATCATAC
-TCTTTCACCCACAGCACCAATCCTACCTCCATCGCTAACCCCACTAAAACACTCACCAAGACCTCAACCC
-CTGACCCCCATGCCTCAGGATACTCCTCAATAGCCATCGCTGTAGTATATCCAAAGACAACCATCATTCC
-CCCTAAATAAATTAAAAAAACTATTAAACCCATATAACCTCCCCCAAAATTCAGAATAATAACACACCCG
-ACCACACCGCTAACAATCAATACTAAACCCCCATAAATAGGAGAAGGCTTAGAAGAAAACCCCACAAACC
-CCATTACTAAACCCACACTCAACAGAAACAAAGCATACATCATTATTCTCGCACGGACTACAACCACGAC
-CAATGATATGAAAAACCATCGTTGTATTTCAACTACAAGAACACCAATGACCCCAATACGCAAAACTAAC
-CCCCTAATAAAATTAATTAACCACTCATTCATCGACCTCCCCACCCCATCCAACATCTCCGCATGATGAA
-ACTTCGGCTCACTCCTTGGCGCCTGCCTGATCCTCCAAATCACCACAGGACTATTCCTAGCCATGCACTA
-CTCACCAGACGCCTCAACCGCCTTTTCATCAATCGCCCACATCACTCGAGACGTAAATTATGGCTGAATC
-ATCCGCTACCTTCACGCCAATGGCGCCTCAATATTCTTTATCTGCCTCTTCCTACACATCGGGCGAGGCC
-TATATTACGGATCATTTCTCTACTCAGAAACCTGAAACATCGGCATTATCCTCCTGCTTGCAACTATAGC
-AACAGCCTTCATAGGCTATGTCCTCCCGTGAGGCCAAATATCATTCTGAGGGGCCACAGTAATTACAAAC
-TTACTATCCGCCATCCCATACATTGGGACAGACCTAGTTCAATGAATCTGAGGAGGCTACTCAGTAGACA
-GTCCCACCCTCACACGATTCTTTACCTTTCACTTCATCTTGCCCTTCATTATTGCAGCCCTAGCAACACT
-CCACCTCCTATTCTTGCACGAAACGGGATCAAACAACCCCCTAGGAATCACCTCCCATTCCGATAAAATC
-ACCTTCCACCCTTACTACACAATCAAAGACGCCCTCGGCTTACTTCTCTTCCTTCTCTCCTTAATGACAT
-TAACACTATTCTCACCAGACCTCCTAGGCGACCCAGACAATTATACCCTAGCCAACCCCTTAAACACCCC
-TCCCCACATCAAGCCCGAATGATATTTCCTATTCGCCTACACAATTCTCCGATCCGTCCCTAACAAACTA
-GGAGGCGTCCTTGCCCTATTACTATCCATCCTCATCCTAGCAATAATCCCCATCCTCCATATATCCAAAC
-AACAAAGCATAATATTTCGCCCACTAAGCCAATCACTTTATTGACTCCTAGCCGCAGACCTCCTCATTCT
-AACCTGAATCGGAGGACAACCAGTAAGCTACCCTTTTACCATCATTGGACAAGTAGCATCCGTACTATAC
-TTCACAACAATCCTAATCCTAATACCAACTATCTCCCTAATTGAAAACAAAATACTCAAATGGGCCTGTC
-CTTGTAGTATAAACTAATACACCAGTCTTGTAAACCGGAGATGAAAACCTTTTTCCAAGGACAAATCAGA
-GAAAAAGTCTTTAACTCCACCATTAGCACCCAAAGCTAAGATTCTAATTTAAACTATTCTCTGTTCTTTC
-ATGGGGAAGCAGATTTGGGTACCACCCAAGTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACA
-TTACTGCCAGCCACCATGAATATTGTACGGTACCATAAATACTTGACCACCTGTAGTACATAAAAACCCA
-ATCCACATCAAAACCCCCTCCCCATGCTTACAAGCAAGTACAGCAATCAACCCTCAACTATCACACATCA
-ACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAG
-TACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCC
-TCAGATAGGGGTCCCTTGACCACCATCCTCCGTGAAATCAATATCCCGCACAAGAGTGCTACTCTCCTCG
-CTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTC
-ATAAAGCCTAAATAGCCCACACGTTCCCCTTAAATAAGACATCACGATG
-
Binary file test-data/dedup_reads.bam has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/dedup_report.txt	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,7 @@
+
+Total number of alignments analysed in submitted_reads.bam:	554
+Total number duplicated alignments removed:	50 (9.03%)
+Duplicated alignments were found at:	44 different position(s)
+
+Total count of deduplicated leftover sequences: 504 (90.97% of total)
+
Binary file test-data/input1.fq.gz has changed
Binary file test-data/mapped_reads.bam has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/mapping_report.txt	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,42 @@
+Bismark report for: /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmpywNSSM/files/000/dataset_2.dat (version: v0.20.0)
+Option '--directional' specified (default mode): alignments to complementary strands (CTOT, CTOB) were ignored (i.e. not performed)
+Bismark was run with Bowtie 2 against the bisulfite genome of /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmp4_4hiluf/ with the specified options: -q -L 20 -D 15 -R 2 --score-min L,0,-0.2 --ignore-quals --quiet
+
+Final Alignment report
+======================
+Sequences analysed in total:	44115
+Number of alignments with a unique best hit from the different alignments:	554
+Mapping efficiency:	1.3%
+Sequences with no alignments under any condition:	43115
+Sequences did not map uniquely:	446
+Sequences which were discarded because genomic sequence could not be extracted:	0
+
+Number of sequences with unique best (first) alignment came from the bowtie output:
+CT/CT:	230	((converted) top strand)
+CT/GA:	324	((converted) bottom strand)
+GA/CT:	0	(complementary to (converted) top strand)
+GA/GA:	0	(complementary to (converted) bottom strand)
+
+Number of alignments to (merely theoretical) complementary strands being rejected in total:	0
+
+Final Cytosine Methylation Report
+=================================
+Total number of C's analysed:	8563
+
+Total methylated C's in CpG context:	245
+Total methylated C's in CHG context:	51
+Total methylated C's in CHH context:	114
+Total methylated C's in Unknown context:	1
+
+Total unmethylated C's in CpG context:	133
+Total unmethylated C's in CHG context:	1762
+Total unmethylated C's in CHH context:	6258
+Total unmethylated C's in Unknown context:	5
+
+C methylated in CpG context:	64.8%
+C methylated in CHG context:	2.8%
+C methylated in CHH context:	1.8%
+C methylated in Unknown context (CN or CHN):	16.7%
+
+
+Bismark completed in 0d 0h 0m 8s
Binary file test-data/mm10.tiny.fa.gz has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output_html_report.html	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,1083 @@
+<!DOCTYPE html>
+<html lang="en">
+
+	<head>
+
+		<meta http-equiv="content-type" content="text/html; charset=UTF-8">
+		<title>Bismark Processing Report - /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmpDiq_J8/files/000/dataset_2.dat</title>
+
+		<style>
+                  body {
+                          font-family: Arial, sans-serif;
+                          font-size:14px;
+                          padding:0 20px 20px;
+                  }
+                  .container {
+                          margin:0 auto;
+                          max-width:1200px;
+                  }
+                  .header h1,
+                  .header img {
+                          float:left;
+                  }
+                  .header h1 {
+                          margin: 20px 0 10px;
+                  }
+                  .header img {
+                          padding: 0 20px 20px 0;
+                  }
+                  .subtitle {
+                          margin-top:120px;
+                          float:right;
+                          text-align:right;
+                  }
+                  .header_subtitle h3,
+                  .header_subtitle p {
+                          margin:0;
+                  }
+                  h1 {
+                          font-size: 3.2em;
+                  }
+                  h2 {
+                          font-size:2.2em;
+                  }
+                  h3 {
+                          font-size:1.4em;
+                  }
+                  h2, h3, hr {
+                          clear:both;
+                  }
+                  hr {
+                        border-top:1px solid #CCC;
+                        border-bottom:1px solid #F3F3F3;
+                        border-left:0;
+                        border-right:0;
+                        height:0;
+                  }
+				  .bargraph {
+						width:600px;
+				  }
+				  .plotly_table {
+                         float:right;
+                         width:600px;
+                         max-width:100%;
+                                    }
+                  .data {
+                          float:left;
+                          width:500px;
+                          max-width:100%;
+                          margin-right:30px;
+                          border:1px solid #CCC;
+                          border-collapse:separate;
+                          border-spacing: 0;
+                          border-left:0;
+                          -webkit-border-radius:4px;
+                          -moz-border-radius:4px;
+                          border-radius:4px;
+                  }
+                  .data th, .data td {
+                          border-left:1px solid #CCC;
+                          border-top:1px solid #CCC;
+                          padding: 5px 7px;
+                  }
+                  .data tr:first-child th,
+                  .data tr:first-child td {
+                          border-top:0;
+                  }
+                  .data tr:last-child th,
+                  .data tr:last-child td {
+                          border-bottom: 2px solid #666;
+                  }
+                  .plot {
+                          width:650px;
+                          max-width:100%;
+                          float:left;
+                          margin-bottom:30px;
+                  }
+
+                  .fullWidth_plot {
+                          height: 600px;
+                  }
+
+                  .data th {
+                          text-align:left;
+                  }
+                  .data td {
+                          text-align:right;
+                  }
+                footer {
+                    color:#999;
+                }
+                footer a {
+					color:#999;
+                }
+                .error-msg {
+                    color: #a94442;
+					background-color: #f2dede;
+					border: 1px solid #ebccd1;
+					padding: 15px;
+					margin-bottom: 20px;
+					border-radius: 4px;
+                }
+				.error-msg h3 { margin: 0; }
+				.error-msg pre { margin: 0; }
+          </style>
+
+	<!-- Plotly.js -->
+	<script>
+/**
+* plotly.js v1.39.4
+* Copyright 2012-2018, Plotly, Inc.
+* All rights reserved.
+* Licensed under the MIT license
+*/
+!function(t){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=t();else if("function"==typeof define&&define.amd)define([],t);else{("undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this).Plotly=t()}}(function(){return function(){return function t(e,r,n){function i(o,s){if(!r[o]){if(!e[o]){var l="function"==typeof require&&require;if(!s&&l)return l(o,!0);if(a)return a(o,!0);var c=new Error("Cannot find module '"+o+"'");throw c.code="MODULE_NOT_FOUND",c}var u=r[o]={exports:{}};e[o][0].call(u.exports,function(t){var r=e[o][1][t];return i(r||t)},u,u.exports,t,e,r,n)}return r[o].exports}for(var a="function"==typeof require&&require,o=0;o<n.length;o++)i(n[o]);return i}}()({1:[function(t,e,r){"use strict";var n=t("../src/lib"),i={"X,X div":"direction:ltr;font-family:'Open Sans', verdana, arial, sans-serif;margin:0;padding:0;","X input,X button":"font-family:'Open Sans', verdana, arial, sans-serif;","X input:focus,X button:focus":"outline:none;","X a":"text-decoration:none;","X a:hover":"text-decoration:none;","X .crisp":"shape-rendering:crispEdges;","X .user-select-none":"-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none;","X svg":"overflow:hidden;","X svg a":"fill:#447adb;","X svg a:hover":"fill:#3c6dc5;","X .main-svg":"position:absolute;top:0;left:0;pointer-events:none;","X .main-svg .draglayer":"pointer-events:all;","X .cursor-default":"cursor:default;","X .cursor-pointer":"cursor:pointer;","X .cursor-crosshair":"cursor:crosshair;","X .cursor-move":"cursor:move;","X .cursor-col-resize":"cursor:col-resize;","X .cursor-row-resize":"cursor:row-resize;","X .cursor-ns-resize":"cursor:ns-resize;","X .cursor-ew-resize":"cursor:ew-resize;","X .cursor-sw-resize":"cursor:sw-resize;","X .cursor-s-resize":"cursor:s-resize;","X .cursor-se-resize":"cursor:se-resize;","X .cursor-w-resize":"cursor:w-resize;","X .cursor-e-resize":"cursor:e-resize;","X .cursor-nw-resize":"cursor:nw-resize;","X .cursor-n-resize":"cursor:n-resize;","X .cursor-ne-resize":"cursor:ne-resize;","X .cursor-grab":"cursor:-webkit-grab;cursor:grab;","X .modebar":"position:absolute;top:2px;right:2px;z-index:1001;background:rgba(255,255,255,0.7);","X .modebar--hover":"opacity:0;-webkit-transition:opacity 0.3s ease 0s;-moz-transition:opacity 0.3s ease 0s;-ms-transition:opacity 0.3s ease 0s;-o-transition:opacity 0.3s ease 0s;transition:opacity 0.3s ease 0s;","X:hover .modebar--hover":"opacity:1;","X .modebar-group":"float:left;display:inline-block;box-sizing:border-box;margin-left:8px;position:relative;vertical-align:middle;white-space:nowrap;","X .modebar-group:first-child":"margin-left:0px;","X .modebar-btn":"position:relative;font-size:16px;padding:3px 4px;cursor:pointer;line-height:normal;box-sizing:border-box;","X .modebar-btn svg":"position:relative;top:2px;","X .modebar-btn path":"fill:rgba(0,31,95,0.3);","X .modebar-btn.active path,X .modebar-btn:hover path":"fill:rgba(0,22,72,0.5);","X .modebar-btn.modebar-btn--logo":"padding:3px 1px;","X .modebar-btn.modebar-btn--logo path":"fill:#447adb !important;","X [data-title]:before,X [data-title]:after":"position:absolute;-webkit-transform:translate3d(0, 0, 0);-moz-transform:translate3d(0, 0, 0);-ms-transform:translate3d(0, 0, 0);-o-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);display:none;opacity:0;z-index:1001;pointer-events:none;top:110%;right:50%;","X [data-title]:hover:before,X [data-title]:hover:after":"display:block;opacity:1;","X [data-title]:before":"content:'';position:absolute;background:transparent;border:6px solid transparent;z-index:1002;margin-top:-12px;border-bottom-color:#69738a;margin-right:-6px;","X [data-title]:after":"content:attr(data-title);background:#69738a;color:white;padding:8px 10px;font-size:12px;line-height:12px;white-space:nowrap;margin-right:-18px;border-radius:2px;","X .select-outline":"fill:none;stroke-width:1;shape-rendering:crispEdges;","X .select-outline-1":"stroke:white;","X .select-outline-2":"stroke:black;stroke-dasharray:2px 2px;",Y:"font-family:'Open Sans';position:fixed;top:50px;right:20px;z-index:10000;font-size:10pt;max-width:180px;","Y p":"margin:0;","Y .notifier-note":"min-width:180px;max-width:250px;border:1px solid #fff;z-index:3000;margin:0;background-color:#8c97af;background-color:rgba(140,151,175,0.9);color:#fff;padding:10px;overflow-wrap:break-word;word-wrap:break-word;-ms-hyphens:auto;-webkit-hyphens:auto;hyphens:auto;","Y .notifier-close":"color:#fff;opacity:0.8;float:right;padding:0 5px;background:none;border:none;font-size:20px;font-weight:bold;line-height:20px;","Y .notifier-close:hover":"color:#444;text-decoration:none;cursor:pointer;"};for(var a in i){var o=a.replace(/^,/," ,").replace(/X/g,".js-plotly-plot .plotly").replace(/Y/g,".plotly-notifier");n.addStyleRule(o,i[a])}},{"../src/lib":684}],2:[function(t,e,r){"use strict";e.exports={undo:{width:857.1,height:1e3,path:"m857 350q0-87-34-166t-91-137-137-92-166-34q-96 0-183 41t-147 114q-4 6-4 13t5 11l76 77q6 5 14 5 9-1 13-7 41-53 100-82t126-29q58 0 110 23t92 61 61 91 22 111-22 111-61 91-92 61-110 23q-55 0-105-20t-90-57l77-77q17-16 8-38-10-23-33-23h-250q-15 0-25 11t-11 25v250q0 24 22 33 22 10 39-8l72-72q60 57 137 88t159 31q87 0 166-34t137-92 91-137 34-166z",transform:"matrix(1 0 0 -1 0 850)"},home:{width:928.6,height:1e3,path:"m786 296v-267q0-15-11-26t-25-10h-214v214h-143v-214h-214q-15 0-25 10t-11 26v267q0 1 0 2t0 2l321 264 321-264q1-1 1-4z m124 39l-34-41q-5-5-12-6h-2q-7 0-12 3l-386 322-386-322q-7-4-13-4-7 2-12 7l-35 41q-4 5-3 13t6 12l401 334q18 15 42 15t43-15l136-114v109q0 8 5 13t13 5h107q8 0 13-5t5-13v-227l122-102q5-5 6-12t-4-13z",transform:"matrix(1 0 0 -1 0 850)"},"camera-retro":{width:1e3,height:1e3,path:"m518 386q0 8-5 13t-13 5q-37 0-63-27t-26-63q0-8 5-13t13-5 12 5 5 13q0 23 16 38t38 16q8 0 13 5t5 13z m125-73q0-59-42-101t-101-42-101 42-42 101 42 101 101 42 101-42 42-101z m-572-320h858v71h-858v-71z m643 320q0 89-62 152t-152 62-151-62-63-152 63-151 151-63 152 63 62 151z m-571 358h214v72h-214v-72z m-72-107h858v143h-462l-36-71h-360v-72z m929 143v-714q0-30-21-51t-50-21h-858q-29 0-50 21t-21 51v714q0 30 21 51t50 21h858q29 0 50-21t21-51z",transform:"matrix(1 0 0 -1 0 850)"},zoombox:{width:1e3,height:1e3,path:"m1000-25l-250 251c40 63 63 138 63 218 0 224-182 406-407 406-224 0-406-182-406-406s183-406 407-406c80 0 155 22 218 62l250-250 125 125z m-812 250l0 438 437 0 0-438-437 0z m62 375l313 0 0-312-313 0 0 312z",transform:"matrix(1 0 0 -1 0 850)"},pan:{width:1e3,height:1e3,path:"m1000 350l-187 188 0-125-250 0 0 250 125 0-188 187-187-187 125 0 0-250-250 0 0 125-188-188 186-187 0 125 252 0 0-250-125 0 187-188 188 188-125 0 0 250 250 0 0-126 187 188z",transform:"matrix(1 0 0 -1 0 850)"},zoom_plus:{width:1e3,height:1e3,path:"m1 787l0-875 875 0 0 875-875 0z m687-500l-187 0 0-187-125 0 0 187-188 0 0 125 188 0 0 187 125 0 0-187 187 0 0-125z",transform:"matrix(1 0 0 -1 0 850)"},zoom_minus:{width:1e3,height:1e3,path:"m0 788l0-876 875 0 0 876-875 0z m688-500l-500 0 0 125 500 0 0-125z",transform:"matrix(1 0 0 -1 0 850)"},autoscale:{width:1e3,height:1e3,path:"m250 850l-187 0-63 0 0-62 0-188 63 0 0 188 187 0 0 62z m688 0l-188 0 0-62 188 0 0-188 62 0 0 188 0 62-62 0z m-875-938l0 188-63 0 0-188 0-62 63 0 187 0 0 62-187 0z m875 188l0-188-188 0 0-62 188 0 62 0 0 62 0 188-62 0z m-125 188l-1 0-93-94-156 156 156 156 92-93 2 0 0 250-250 0 0-2 93-92-156-156-156 156 94 92 0 2-250 0 0-250 0 0 93 93 157-156-157-156-93 94 0 0 0-250 250 0 0 0-94 93 156 157 156-157-93-93 0 0 250 0 0 250z",transform:"matrix(1 0 0 -1 0 850)"},tooltip_basic:{width:1500,height:1e3,path:"m375 725l0 0-375-375 375-374 0-1 1125 0 0 750-1125 0z",transform:"matrix(1 0 0 -1 0 850)"},tooltip_compare:{width:1125,height:1e3,path:"m187 786l0 2-187-188 188-187 0 0 937 0 0 373-938 0z m0-499l0 1-187-188 188-188 0 0 937 0 0 376-938-1z",transform:"matrix(1 0 0 -1 0 850)"},plotlylogo:{width:1542,height:1e3,path:"m0-10h182v-140h-182v140z m228 146h183v-286h-183v286z m225 714h182v-1000h-182v1000z m225-285h182v-715h-182v715z m225 142h183v-857h-183v857z m231-428h182v-429h-182v429z m225-291h183v-138h-183v138z",transform:"matrix(1 0 0 -1 0 850)"},"z-axis":{width:1e3,height:1e3,path:"m833 5l-17 108v41l-130-65 130-66c0 0 0 38 0 39 0-1 36-14 39-25 4-15-6-22-16-30-15-12-39-16-56-20-90-22-187-23-279-23-261 0-341 34-353 59 3 60 228 110 228 110-140-8-351-35-351-116 0-120 293-142 474-142 155 0 477 22 477 142 0 50-74 79-163 96z m-374 94c-58-5-99-21-99-40 0-24 65-43 144-43 79 0 143 19 143 43 0 19-42 34-98 40v216h87l-132 135-133-135h88v-216z m167 515h-136v1c16 16 31 34 46 52l84 109v54h-230v-71h124v-1c-16-17-28-32-44-51l-89-114v-51h245v72z",transform:"matrix(1 0 0 -1 0 850)"},"3d_rotate":{width:1e3,height:1e3,path:"m922 660c-5 4-9 7-14 11-359 263-580-31-580-31l-102 28 58-400c0 1 1 1 2 2 118 108 351 249 351 249s-62 27-100 42c88 83 222 183 347 122 16-8 30-17 44-27-2 1-4 2-6 4z m36-329c0 0 64 229-88 296-62 27-124 14-175-11 157-78 225-208 249-266 8-19 11-31 11-31 2 5 6 15 11 32-5-13-8-20-8-20z m-775-239c70-31 117-50 198-32-121 80-199 346-199 346l-96-15-58-12c0 0 55-226 155-287z m603 133l-317-139c0 0 4-4 19-14 7-5 24-15 24-15s-177-147-389 4c235-287 536-112 536-112l31-22 100 299-4-1z m-298-153c6-4 14-9 24-15 0 0-17 10-24 15z",transform:"matrix(1 0 0 -1 0 850)"},camera:{width:1e3,height:1e3,path:"m500 450c-83 0-150-67-150-150 0-83 67-150 150-150 83 0 150 67 150 150 0 83-67 150-150 150z m400 150h-120c-16 0-34 13-39 29l-31 93c-6 15-23 28-40 28h-340c-16 0-34-13-39-28l-31-94c-6-15-23-28-40-28h-120c-55 0-100-45-100-100v-450c0-55 45-100 100-100h800c55 0 100 45 100 100v450c0 55-45 100-100 100z m-400-550c-138 0-250 112-250 250 0 138 112 250 250 250 138 0 250-112 250-250 0-138-112-250-250-250z m365 380c-19 0-35 16-35 35 0 19 16 35 35 35 19 0 35-16 35-35 0-19-16-35-35-35z",transform:"matrix(1 0 0 -1 0 850)"},movie:{width:1e3,height:1e3,path:"m938 413l-188-125c0 37-17 71-44 94 64 38 107 107 107 187 0 121-98 219-219 219-121 0-219-98-219-219 0-61 25-117 66-156h-115c30 33 49 76 49 125 0 103-84 187-187 187s-188-84-188-187c0-57 26-107 65-141-38-22-65-62-65-109v-250c0-70 56-126 125-126h500c69 0 125 56 125 126l188-126c34 0 62 28 62 63v375c0 35-28 63-62 63z m-750 0c-69 0-125 56-125 125s56 125 125 125 125-56 125-125-56-125-125-125z m406-1c-87 0-157 70-157 157 0 86 70 156 157 156s156-70 156-156-70-157-156-157z",transform:"matrix(1 0 0 -1 0 850)"},question:{width:857.1,height:1e3,path:"m500 82v107q0 8-5 13t-13 5h-107q-8 0-13-5t-5-13v-107q0-8 5-13t13-5h107q8 0 13 5t5 13z m143 375q0 49-31 91t-77 65-95 23q-136 0-207-119-9-14 4-24l74-55q4-4 10-4 9 0 14 7 30 38 48 51 19 14 48 14 27 0 48-15t21-33q0-21-11-34t-38-25q-35-16-65-48t-29-70v-20q0-8 5-13t13-5h107q8 0 13 5t5 13q0 10 12 27t30 28q18 10 28 16t25 19 25 27 16 34 7 45z m214-107q0-117-57-215t-156-156-215-58-216 58-155 156-58 215 58 215 155 156 216 58 215-58 156-156 57-215z",transform:"matrix(1 0 0 -1 0 850)"},disk:{width:857.1,height:1e3,path:"m214-7h429v214h-429v-214z m500 0h72v500q0 8-6 21t-11 20l-157 156q-5 6-19 12t-22 5v-232q0-22-15-38t-38-16h-322q-22 0-37 16t-16 38v232h-72v-714h72v232q0 22 16 38t37 16h465q22 0 38-16t15-38v-232z m-214 518v178q0 8-5 13t-13 5h-107q-7 0-13-5t-5-13v-178q0-8 5-13t13-5h107q7 0 13 5t5 13z m357-18v-518q0-22-15-38t-38-16h-750q-23 0-38 16t-16 38v750q0 22 16 38t38 16h517q23 0 50-12t42-26l156-157q16-15 27-42t11-49z",transform:"matrix(1 0 0 -1 0 850)"},lasso:{width:1031,height:1e3,path:"m1018 538c-36 207-290 336-568 286-277-48-473-256-436-463 10-57 36-108 76-151-13-66 11-137 68-183 34-28 75-41 114-42l-55-70 0 0c-2-1-3-2-4-3-10-14-8-34 5-45 14-11 34-8 45 4 1 1 2 3 2 5l0 0 113 140c16 11 31 24 45 40 4 3 6 7 8 11 48-3 100 0 151 9 278 48 473 255 436 462z m-624-379c-80 14-149 48-197 96 42 42 109 47 156 9 33-26 47-66 41-105z m-187-74c-19 16-33 37-39 60 50-32 109-55 174-68-42-25-95-24-135 8z m360 75c-34-7-69-9-102-8 8 62-16 128-68 170-73 59-175 54-244-5-9 20-16 40-20 61-28 159 121 317 333 354s407-60 434-217c28-159-121-318-333-355z",transform:"matrix(1 0 0 -1 0 850)"},selectbox:{width:1e3,height:1e3,path:"m0 850l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z m285 0l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z m-857-286l0-143 143 0 0 143-143 0z m857 0l0-143 143 0 0 143-143 0z m-857-285l0-143 143 0 0 143-143 0z m857 0l0-143 143 0 0 143-143 0z m-857-286l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z m285 0l0-143 143 0 0 143-143 0z m286 0l0-143 143 0 0 143-143 0z",transform:"matrix(1 0 0 -1 0 850)"},spikeline:{width:1e3,height:1e3,path:"M512 409c0-57-46-104-103-104-57 0-104 47-104 104 0 57 47 103 104 103 57 0 103-46 103-103z m-327-39l92 0 0 92-92 0z m-185 0l92 0 0 92-92 0z m370-186l92 0 0 93-92 0z m0-184l92 0 0 92-92 0z",transform:"matrix(1.5 0 0 -1.5 0 850)"}}},{}],3:[function(t,e,r){"use strict";e.exports=t("../src/transforms/aggregate")},{"../src/transforms/aggregate":1125}],4:[function(t,e,r){"use strict";e.exports=t("../src/traces/bar")},{"../src/traces/bar":831}],5:[function(t,e,r){"use strict";e.exports=t("../src/traces/box")},{"../src/traces/box":844}],6:[function(t,e,r){"use strict";e.exports=t("../src/components/calendars")},{"../src/components/calendars":556}],7:[function(t,e,r){"use strict";e.exports=t("../src/traces/candlestick")},{"../src/traces/candlestick":854}],8:[function(t,e,r){"use strict";e.exports=t("../src/traces/carpet")},{"../src/traces/carpet":873}],9:[function(t,e,r){"use strict";e.exports=t("../src/traces/choropleth")},{"../src/traces/choropleth":887}],10:[function(t,e,r){"use strict";e.exports=t("../src/traces/cone")},{"../src/traces/cone":895}],11:[function(t,e,r){"use strict";e.exports=t("../src/traces/contour")},{"../src/traces/contour":910}],12:[function(t,e,r){"use strict";e.exports=t("../src/traces/contourcarpet")},{"../src/traces/contourcarpet":921}],13:[function(t,e,r){"use strict";e.exports=t("../src/core")},{"../src/core":664}],14:[function(t,e,r){"use strict";e.exports=t("../src/transforms/filter")},{"../src/transforms/filter":1126}],15:[function(t,e,r){"use strict";e.exports=t("../src/transforms/groupby")},{"../src/transforms/groupby":1127}],16:[function(t,e,r){"use strict";e.exports=t("../src/traces/heatmap")},{"../src/traces/heatmap":933}],17:[function(t,e,r){"use strict";e.exports=t("../src/traces/heatmapgl")},{"../src/traces/heatmapgl":943}],18:[function(t,e,r){"use strict";e.exports=t("../src/traces/histogram")},{"../src/traces/histogram":954}],19:[function(t,e,r){"use strict";e.exports=t("../src/traces/histogram2d")},{"../src/traces/histogram2d":960}],20:[function(t,e,r){"use strict";e.exports=t("../src/traces/histogram2dcontour")},{"../src/traces/histogram2dcontour":964}],21:[function(t,e,r){"use strict";var n=t("./core");n.register([t("./bar"),t("./box"),t("./heatmap"),t("./histogram"),t("./histogram2d"),t("./histogram2dcontour"),t("./pie"),t("./contour"),t("./scatterternary"),t("./violin"),t("./scatter3d"),t("./surface"),t("./mesh3d"),t("./cone"),t("./streamtube"),t("./scattergeo"),t("./choropleth"),t("./scattergl"),t("./splom"),t("./pointcloud"),t("./heatmapgl"),t("./parcoords"),t("./scattermapbox"),t("./sankey"),t("./table"),t("./carpet"),t("./scattercarpet"),t("./contourcarpet"),t("./ohlc"),t("./candlestick"),t("./scatterpolar"),t("./scatterpolargl")]),n.register([t("./aggregate"),t("./filter"),t("./groupby"),t("./sort")]),n.register([t("./calendars")]),e.exports=n},{"./aggregate":3,"./bar":4,"./box":5,"./calendars":6,"./candlestick":7,"./carpet":8,"./choropleth":9,"./cone":10,"./contour":11,"./contourcarpet":12,"./core":13,"./filter":14,"./groupby":15,"./heatmap":16,"./heatmapgl":17,"./histogram":18,"./histogram2d":19,"./histogram2dcontour":20,"./mesh3d":22,"./ohlc":23,"./parcoords":24,"./pie":25,"./pointcloud":26,"./sankey":27,"./scatter3d":28,"./scattercarpet":29,"./scattergeo":30,"./scattergl":31,"./scattermapbox":32,"./scatterpolar":33,"./scatterpolargl":34,"./scatterternary":35,"./sort":36,"./splom":37,"./streamtube":38,"./surface":39,"./table":40,"./violin":41}],22:[function(t,e,r){"use strict";e.exports=t("../src/traces/mesh3d")},{"../src/traces/mesh3d":969}],23:[function(t,e,r){"use strict";e.exports=t("../src/traces/ohlc")},{"../src/traces/ohlc":974}],24:[function(t,e,r){"use strict";e.exports=t("../src/traces/parcoords")},{"../src/traces/parcoords":985}],25:[function(t,e,r){"use strict";e.exports=t("../src/traces/pie")},{"../src/traces/pie":996}],26:[function(t,e,r){"use strict";e.exports=t("../src/traces/pointcloud")},{"../src/traces/pointcloud":1005}],27:[function(t,e,r){"use strict";e.exports=t("../src/traces/sankey")},{"../src/traces/sankey":1011}],28:[function(t,e,r){"use strict";e.exports=t("../src/traces/scatter3d")},{"../src/traces/scatter3d":1045}],29:[function(t,e,r){"use strict";e.exports=t("../src/traces/scattercarpet")},{"../src/traces/scattercarpet":1051}],30:[function(t,e,r){"use strict";e.exports=t("../src/traces/scattergeo")},{"../src/traces/scattergeo":1058}],31:[function(t,e,r){"use strict";e.exports=t("../src/traces/scattergl")},{"../src/traces/scattergl":1066}],32:[function(t,e,r){"use strict";e.exports=t("../src/traces/scattermapbox")},{"../src/traces/scattermapbox":1072}],33:[function(t,e,r){"use strict";e.exports=t("../src/traces/scatterpolar")},{"../src/traces/scatterpolar":1079}],34:[function(t,e,r){"use strict";e.exports=t("../src/traces/scatterpolargl")},{"../src/traces/scatterpolargl":1083}],35:[function(t,e,r){"use strict";e.exports=t("../src/traces/scatterternary")},{"../src/traces/scatterternary":1089}],36:[function(t,e,r){"use strict";e.exports=t("../src/transforms/sort")},{"../src/transforms/sort":1129}],37:[function(t,e,r){"use strict";e.exports=t("../src/traces/splom")},{"../src/traces/splom":1094}],38:[function(t,e,r){"use strict";e.exports=t("../src/traces/streamtube")},{"../src/traces/streamtube":1099}],39:[function(t,e,r){"use strict";e.exports=t("../src/traces/surface")},{"../src/traces/surface":1104}],40:[function(t,e,r){"use strict";e.exports=t("../src/traces/table")},{"../src/traces/table":1112}],41:[function(t,e,r){"use strict";e.exports=t("../src/traces/violin")},{"../src/traces/violin":1119}],42:[function(t,e,r){"use strict";e.exports=function(t,e){t=t||document.body,e=e||{};var r=[.01,1/0];"distanceLimits"in e&&(r[0]=e.distanceLimits[0],r[1]=e.distanceLimits[1]);"zoomMin"in e&&(r[0]=e.zoomMin);"zoomMax"in e&&(r[1]=e.zoomMax);var c=i({center:e.center||[0,0,0],up:e.up||[0,1,0],eye:e.eye||[0,0,10],mode:e.mode||"orbit",distanceLimits:r}),u=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],h=0,f=t.clientWidth,p=t.clientHeight,d={view:c,element:t,delay:e.delay||16,rotateSpeed:e.rotateSpeed||1,zoomSpeed:e.zoomSpeed||1,translateSpeed:e.translateSpeed||1,flipX:!!e.flipX,flipY:!!e.flipY,modes:c.modes,tick:function(){var e=n(),r=this.delay;c.idle(e-r),c.flush(e-(100+2*r));var i=e-2*r;c.recalcMatrix(i);for(var a=!0,o=c.computedMatrix,s=0;s<16;++s)a=a&&u[s]===o[s],u[s]=o[s];var l=t.clientWidth===f&&t.clientHeight===p;return f=t.clientWidth,p=t.clientHeight,a?!l:(h=Math.exp(c.computedRadius[0]),!0)},lookAt:function(t,e,r){c.lookAt(c.lastT(),t,e,r)},rotate:function(t,e,r){c.rotate(c.lastT(),t,e,r)},pan:function(t,e,r){c.pan(c.lastT(),t,e,r)},translate:function(t,e,r){c.translate(c.lastT(),t,e,r)}};Object.defineProperties(d,{matrix:{get:function(){return c.computedMatrix},set:function(t){return c.setMatrix(c.lastT(),t),c.computedMatrix},enumerable:!0},mode:{get:function(){return c.getMode()},set:function(t){return c.setMode(t),c.getMode()},enumerable:!0},center:{get:function(){return c.computedCenter},set:function(t){return c.lookAt(c.lastT(),t),c.computedCenter},enumerable:!0},eye:{get:function(){return c.computedEye},set:function(t){return c.lookAt(c.lastT(),null,t),c.computedEye},enumerable:!0},up:{get:function(){return c.computedUp},set:function(t){return c.lookAt(c.lastT(),null,null,t),c.computedUp},enumerable:!0},distance:{get:function(){return h},set:function(t){return c.setDistance(c.lastT(),t),t},enumerable:!0},distanceLimits:{get:function(){return c.getDistanceLimits(r)},set:function(t){return c.setDistanceLimits(t),t},enumerable:!0}}),t.addEventListener("contextmenu",function(t){return t.preventDefault(),!1});var g=0,m=0,v={shift:!1,control:!1,alt:!1,meta:!1};function y(e,r,i,a){var o=1/t.clientHeight,s=o*(r-g),l=o*(i-m),u=d.flipX?1:-1,f=d.flipY?1:-1,p=Math.PI*d.rotateSpeed,y=n();if(1&e)a.shift?c.rotate(y,0,0,-s*p):c.rotate(y,u*p*s,-f*p*l,0);else if(2&e)c.pan(y,-d.translateSpeed*s*h,d.translateSpeed*l*h,0);else if(4&e){var x=d.zoomSpeed*l/window.innerHeight*(y-c.lastT())*50;c.pan(y,0,0,h*(Math.exp(x)-1))}g=r,m=i,v=a}return a(t,y),t.addEventListener("touchstart",function(e){var r=s(e.changedTouches[0],t);y(0,r[0],r[1],v),y(1,r[0],r[1],v),e.preventDefault()},!!l&&{passive:!1}),t.addEventListener("touchmove",function(e){var r=s(e.changedTouches[0],t);y(1,r[0],r[1],v),e.preventDefault()},!!l&&{passive:!1}),t.addEventListener("touchend",function(e){s(e.changedTouches[0],t),y(0,g,m,v),e.preventDefault()},!!l&&{passive:!1}),o(t,function(t,e,r){var i=d.flipX?1:-1,a=d.flipY?1:-1,o=n();if(Math.abs(t)>Math.abs(e))c.rotate(o,0,0,-t*i*Math.PI*d.rotateSpeed/window.innerWidth);else{var s=d.zoomSpeed*a*e/window.innerHeight*(o-c.lastT())/100;c.pan(o,0,0,h*(Math.exp(s)-1))}},!0),d};var n=t("right-now"),i=t("3d-view"),a=t("mouse-change"),o=t("mouse-wheel"),s=t("mouse-event-offset"),l=t("has-passive-events")},{"3d-view":43,"has-passive-events":379,"mouse-change":402,"mouse-event-offset":403,"mouse-wheel":405,"right-now":465}],43:[function(t,e,r){"use strict";e.exports=function(t){var e=(t=t||{}).eye||[0,0,1],r=t.center||[0,0,0],s=t.up||[0,1,0],l=t.distanceLimits||[0,1/0],c=t.mode||"turntable",u=n(),h=i(),f=a();return u.setDistanceLimits(l[0],l[1]),u.lookAt(0,e,r,s),h.setDistanceLimits(l[0],l[1]),h.lookAt(0,e,r,s),f.setDistanceLimits(l[0],l[1]),f.lookAt(0,e,r,s),new o({turntable:u,orbit:h,matrix:f},c)};var n=t("turntable-camera-controller"),i=t("orbit-camera-controller"),a=t("matrix-camera-controller");function o(t,e){this._controllerNames=Object.keys(t),this._controllerList=this._controllerNames.map(function(e){return t[e]}),this._mode=e,this._active=t[e],this._active||(this._mode="turntable",this._active=t.turntable),this.modes=this._controllerNames,this.computedMatrix=this._active.computedMatrix,this.computedEye=this._active.computedEye,this.computedUp=this._active.computedUp,this.computedCenter=this._active.computedCenter,this.computedRadius=this._active.computedRadius}var s=o.prototype;[["flush",1],["idle",1],["lookAt",4],["rotate",4],["pan",4],["translate",4],["setMatrix",2],["setDistanceLimits",2],["setDistance",2]].forEach(function(t){for(var e=t[0],r=[],n=0;n<t[1];++n)r.push("a"+n);var i="var cc=this._controllerList;for(var i=0;i<cc.length;++i){cc[i]."+t[0]+"("+r.join()+")}";s[e]=Function.apply(null,r.concat(i))}),s.recalcMatrix=function(t){this._active.recalcMatrix(t)},s.getDistance=function(t){return this._active.getDistance(t)},s.getDistanceLimits=function(t){return this._active.getDistanceLimits(t)},s.lastT=function(){return this._active.lastT()},s.setMode=function(t){if(t!==this._mode){var e=this._controllerNames.indexOf(t);if(!(e<0)){var r=this._active,n=this._controllerList[e],i=Math.max(r.lastT(),n.lastT());r.recalcMatrix(i),n.setMatrix(i,r.computedMatrix),this._active=n,this._mode=t,this.computedMatrix=this._active.computedMatrix,this.computedEye=this._active.computedEye,this.computedUp=this._active.computedUp,this.computedCenter=this._active.computedCenter,this.computedRadius=this._active.computedRadius}}},s.getMode=function(){return this._mode}},{"matrix-camera-controller":400,"orbit-camera-controller":423,"turntable-camera-controller":504}],44:[function(t,e,r){"use strict";var n=t("css-font"),i=t("pick-by-alias"),a=t("regl"),o=t("gl-util/context"),s=t("es6-weak-map"),l=t("color-normalize"),c=t("font-atlas"),u=t("typedarray-pool"),h=t("parse-rect"),f=t("is-plain-obj"),p=t("parse-unit"),d=t("to-px"),g=t("detect-kerning"),m=t("object-assign"),v=t("font-measure"),y=t("flatten-vertex-data"),x=new s,b=!1;if(document.body){var _=document.body.appendChild(document.createElement("div"));_.style.font="italic small-caps bold condensed 16px/2 cursive",getComputedStyle(_).fontStretch&&(b=!0),document.body.removeChild(_)}var w=function(t){!function(t){return"function"==typeof t&&t._gl&&t.prop&&t.texture&&t.buffer}(t)?this.gl=o(t):(t={regl:t},this.gl=t.regl._gl),this.shader=x.get(this.gl),this.shader?this.regl=this.shader.regl:this.regl=t.regl||a({gl:this.gl}),this.charBuffer=this.regl.buffer({type:"uint8",usage:"stream"}),this.sizeBuffer=this.regl.buffer({type:"float",usage:"stream"}),this.shader||(this.shader=this.createShader(),x.set(this.gl,this.shader)),this.batch=[],this.fontSize=[],this.font=[],this.fontAtlas=[],this.draw=this.shader.draw.bind(this),this.render=function(){this.regl._refresh(),this.draw(this.batch)},this.canvas=this.gl.canvas,this.update(f(t)?t:{})};w.prototype.createShader=function(){var t=this.regl,e=t({blend:{enable:!0,color:[0,0,0,1],func:{srcRGB:"src alpha",dstRGB:"one minus src alpha",srcAlpha:"one minus dst alpha",dstAlpha:"one"}},stencil:{enable:!1},depth:{enable:!1},count:t.prop("count"),offset:t.prop("offset"),attributes:{charOffset:{offset:4,stride:8,buffer:t.this("sizeBuffer")},width:{offset:0,stride:8,buffer:t.this("sizeBuffer")},char:t.this("charBuffer"),position:t.this("position")},uniforms:{atlasSize:function(t,e){return[e.atlas.width,e.atlas.height]},atlasDim:function(t,e){return[e.atlas.cols,e.atlas.rows]},atlas:function(t,e){return e.atlas.texture},charStep:function(t,e){return e.atlas.step},em:function(t,e){return e.atlas.em},color:t.prop("color"),opacity:t.prop("opacity"),viewport:t.this("viewportArray"),scale:t.this("scale"),align:t.prop("align"),baseline:t.prop("baseline"),translate:t.this("translate"),positionOffset:t.prop("positionOffset")},primitive:"points",viewport:t.this("viewport"),vert:"\n\t\t\tprecision highp float;\n\t\t\tattribute float width, charOffset, char;\n\t\t\tattribute vec2 position;\n\t\t\tuniform float fontSize, charStep, em, align, baseline;\n\t\t\tuniform vec4 viewport;\n\t\t\tuniform vec4 color;\n\t\t\tuniform vec2 atlasSize, atlasDim, scale, translate, positionOffset;\n\t\t\tvarying vec2 charCoord, charId;\n\t\t\tvarying float charWidth;\n\t\t\tvarying vec4 fontColor;\n\t\t\tvoid main () {\n\t\t\t\t"+(w.normalViewport?"":"vec2 positionOffset = vec2(positionOffset.x,- positionOffset.y);")+"\n\n\t\t\t\tvec2 offset = floor(em * (vec2(align + charOffset, baseline)\n\t\t\t\t\t+ positionOffset))\n\t\t\t\t\t/ (viewport.zw * scale.xy);\n\n\t\t\t\tvec2 position = (position + translate) * scale;\n\t\t\t\tposition += offset * scale;\n\n\t\t\t\t"+(w.normalViewport?"position.y = 1. - position.y;":"")+"\n\n\t\t\t\tcharCoord = position * viewport.zw + viewport.xy;\n\n\t\t\t\tgl_Position = vec4(position * 2. - 1., 0, 1);\n\n\t\t\t\tgl_PointSize = charStep;\n\n\t\t\t\tcharId.x = mod(char, atlasDim.x);\n\t\t\t\tcharId.y = floor(char / atlasDim.x);\n\n\t\t\t\tcharWidth = width * em;\n\n\t\t\t\tfontColor = color / 255.;\n\t\t\t}",frag:"\n\t\t\tprecision highp float;\n\t\t\tuniform sampler2D atlas;\n\t\t\tuniform float fontSize, charStep, opacity;\n\t\t\tuniform vec2 atlasSize;\n\t\t\tuniform vec4 viewport;\n\t\t\tvarying vec4 fontColor;\n\t\t\tvarying vec2 charCoord, charId;\n\t\t\tvarying float charWidth;\n\n\t\t\tfloat lightness(vec4 color) {\n\t\t\t\treturn color.r * 0.299 + color.g * 0.587 + color.b * 0.114;\n\t\t\t}\n\n\t\t\tvoid main () {\n\t\t\t\tvec2 uv = gl_FragCoord.xy - charCoord + charStep * .5;\n\t\t\t\tfloat halfCharStep = floor(charStep * .5 + .5);\n\n\t\t\t\t// invert y and shift by 1px (FF expecially needs that)\n\t\t\t\tuv.y = charStep - uv.y;\n\n\t\t\t\t// ignore points outside of character bounding box\n\t\t\t\tfloat halfCharWidth = ceil(charWidth * .5);\n\t\t\t\tif (floor(uv.x) > halfCharStep + halfCharWidth ||\n\t\t\t\t\tfloor(uv.x) < halfCharStep - halfCharWidth) return;\n\n\t\t\t\tuv += charId * charStep;\n\t\t\t\tuv = uv / atlasSize;\n\n\t\t\t\tvec4 color = fontColor;\n\t\t\t\tvec4 mask = texture2D(atlas, uv);\n\n\t\t\t\tfloat maskY = lightness(mask);\n\t\t\t\t// float colorY = lightness(color);\n\t\t\t\tcolor.a *= maskY;\n\t\t\t\tcolor.a *= opacity;\n\n\t\t\t\t// color.a += .1;\n\n\t\t\t\t// antialiasing, see yiq color space y-channel formula\n\t\t\t\t// color.rgb += (1. - color.rgb) * (1. - mask.rgb);\n\n\t\t\t\tgl_FragColor = color;\n\t\t\t}"});return{regl:t,draw:e,atlas:{}}},w.prototype.update=function(t){var e=this;if("string"==typeof t)t={text:t};else if(!t)return;null!=(t=i(t,{position:"position positions coord coords coordinates",font:"font fontFace fontface typeface cssFont css-font family fontFamily",fontSize:"fontSize fontsize size font-size",text:"text texts chars characters value values symbols",align:"align alignment textAlign textbaseline",baseline:"baseline textBaseline textbaseline",direction:"dir direction textDirection",color:"color colour fill fill-color fillColor textColor textcolor",kerning:"kerning kern",range:"range dataBox",viewport:"vp viewport viewBox viewbox viewPort",opacity:"opacity alpha transparency visible visibility opaque",offset:"offset positionOffset padding shift indent indentation"},!0)).opacity&&(Array.isArray(t.opacity)?this.opacity=t.opacity.map(function(t){return parseFloat(t)}):this.opacity=parseFloat(t.opacity)),null!=t.viewport&&(this.viewport=h(t.viewport),w.normalViewport&&(this.viewport.y=this.canvas.height-this.viewport.y-this.viewport.height),this.viewportArray=[this.viewport.x,this.viewport.y,this.viewport.width,this.viewport.height]),null==this.viewport&&(this.viewport={x:0,y:0,width:this.gl.drawingBufferWidth,height:this.gl.drawingBufferHeight},this.viewportArray=[this.viewport.x,this.viewport.y,this.viewport.width,this.viewport.height]),null!=t.kerning&&(this.kerning=t.kerning),null!=t.offset&&("number"==typeof t.offset&&(t.offset=[t.offset,0]),this.positionOffset=y(t.offset)),t.direction&&(this.direction=t.direction),t.range&&(this.range=t.range,this.scale=[1/(t.range[2]-t.range[0]),1/(t.range[3]-t.range[1])],this.translate=[-t.range[0],-t.range[1]]),t.scale&&(this.scale=t.scale),t.translate&&(this.translate=t.translate),this.scale||(this.scale=[1/this.viewport.width,1/this.viewport.height]),this.translate||(this.translate=[0,0]),this.font.length||t.font||(t.font=w.baseFontSize+"px sans-serif");var r,a=!1,o=!1;if(t.font&&(Array.isArray(t.font)?t.font:[t.font]).forEach(function(t,r){if("string"==typeof t)try{t=n.parse(t)}catch(e){t=n.parse(w.baseFontSize+"px "+t)}else t=n.parse(n.stringify(t));var i=n.stringify({size:w.baseFontSize,family:t.family,stretch:b?t.stretch:void 0,variant:t.variant,weight:t.weight,style:t.style}),s=p(t.size),l=Math.round(s[0]*d(s[1]));if(l!==e.fontSize[r]&&(o=!0,e.fontSize[r]=l),!(e.font[r]&&i==e.font[r].baseString||(a=!0,e.font[r]=w.fonts[i],e.font[r]))){var c=t.family.join(", "),u=[t.style];t.style!=t.variant&&u.push(t.variant),t.variant!=t.weight&&u.push(t.weight),b&&t.weight!=t.stretch&&u.push(t.stretch),e.font[r]={baseString:i,family:c,weight:t.weight,stretch:t.stretch,style:t.style,variant:t.variant,width:{},kerning:{},metrics:v(c,{origin:"top",fontSize:w.baseFontSize,fontStyle:u.join(" ")})},w.fonts[i]=e.font[r]}}),(a||o)&&this.font.forEach(function(r,i){var a=n.stringify({size:e.fontSize[i],family:r.family,stretch:b?r.stretch:void 0,variant:r.variant,weight:r.weight,style:r.style});if(e.fontAtlas[i]=e.shader.atlas[a],!e.fontAtlas[i]){var o=r.metrics;e.shader.atlas[a]=e.fontAtlas[i]={fontString:a,step:2*Math.ceil(e.fontSize[i]*o.bottom*.5),em:e.fontSize[i],cols:0,rows:0,height:0,width:0,chars:[],ids:{},texture:e.regl.texture()}}null==t.text&&(t.text=e.text)}),"string"==typeof t.text&&t.position&&t.position.length>2){for(var s=Array(.5*t.position.length),f=0;f<s.length;f++)s[f]=t.text;t.text=s}if(null!=t.text||a){if(this.textOffsets=[0],Array.isArray(t.text)){this.count=t.text[0].length,this.counts=[this.count];for(var x=1;x<t.text.length;x++)e.textOffsets[x]=e.textOffsets[x-1]+t.text[x-1].length,e.count+=t.text[x].length,e.counts.push(t.text[x].length);this.text=t.text.join("")}else this.text=t.text,this.count=this.text.length,this.counts=[this.count];r=[],this.font.forEach(function(t,n){w.atlasContext.font=t.baseString;for(var i=e.fontAtlas[n],a=0;a<e.text.length;a++){var o=e.text.charAt(a);if(null==i.ids[o]&&(i.ids[o]=i.chars.length,i.chars.push(o),r.push(o)),null==t.width[o]&&(t.width[o]=w.atlasContext.measureText(o).width/w.baseFontSize,e.kerning)){var s=[];for(var l in t.width)s.push(l+o,o+l);m(t.kerning,g(t.family,{pairs:s}))}}})}if(t.position)if(t.position.length>2){for(var _=!t.position[0].length,k=u.mallocFloat(2*this.count),M=0,A=0;M<this.counts.length;M++){var T=e.counts[M];if(_)for(var S=0;S<T;S++)k[A++]=t.position[2*M],k[A++]=t.position[2*M+1];else for(var E=0;E<T;E++)k[A++]=t.position[M][0],k[A++]=t.position[M][1]}this.position.call?this.position({type:"float",data:k}):this.position=this.regl.buffer({type:"float",data:k}),u.freeFloat(k)}else this.position.destroy&&this.position.destroy(),this.position={constant:t.position};if(t.text||a){var C=u.mallocUint8(this.count),L=u.mallocFloat(2*this.count);this.textWidth=[];for(var z=0,P=0;z<this.counts.length;z++){for(var I=e.counts[z],O=e.font[z]||e.font[0],D=e.fontAtlas[z]||e.fontAtlas[0],R=0;R<I;R++){var B=e.text.charAt(P),F=e.text.charAt(P-1);if(C[P]=D.ids[B],L[2*P]=O.width[B],R){var N=L[2*P-2],j=L[2*P],V=L[2*P-1]+.5*N+.5*j;if(e.kerning){var U=O.kerning[F+B];U&&(V+=.001*U)}L[2*P+1]=V}else L[2*P+1]=.5*L[2*P];P++}e.textWidth.push(L.length?.5*L[2*P-2]+L[2*P-1]:0)}t.align||(t.align=this.align),this.charBuffer({data:C,type:"uint8",usage:"stream"}),this.sizeBuffer({data:L,type:"float",usage:"stream"}),u.freeUint8(C),u.freeFloat(L),r.length&&this.font.forEach(function(t,r){var n=e.fontAtlas[r],i=n.step,a=Math.floor(w.maxAtlasSize/i),o=Math.min(a,n.chars.length),s=Math.ceil(n.chars.length/o),l=o*i,u=s*i;n.width=l,n.height=u,n.rows=s,n.cols=o,n.em&&n.texture({data:c({canvas:w.atlasCanvas,font:n.fontString,chars:n.chars,shape:[l,u],step:[i,i]})})})}if(t.align&&(this.align=t.align,this.alignOffset=this.textWidth.map(function(t,r){var n=Array.isArray(e.align)?e.align.length>1?e.align[r]:e.align[0]:e.align;if("number"==typeof n)return n;switch(n){case"right":case"end":return-t;case"center":case"centre":case"middle":return.5*-t}return 0})),null==this.baseline&&null==t.baseline&&(t.baseline=0),null!=t.baseline&&(this.baseline=t.baseline,Array.isArray(this.baseline)||(this.baseline=[this.baseline]),this.baselineOffset=this.baseline.map(function(t,r){var n=(e.font[r]||e.font[0]).metrics,i=0;return i+=.5*n.bottom,i+="number"==typeof t?t-n.baseline:-n[t],w.normalViewport||(i*=-1),i})),null!=t.color)if(t.color||(t.color="transparent"),"string"!=typeof t.color&&isNaN(t.color)){var q;if("number"==typeof t.color[0]&&t.color.length>this.counts.length){var H=t.color.length;q=u.mallocUint8(H);for(var G=(t.color.subarray||t.color.slice).bind(t.color),W=0;W<H;W+=4)q.set(l(G(W,W+4),"uint8"),W)}else{var Y=t.color.length;q=u.mallocUint8(4*Y);for(var X=0;X<Y;X++)q.set(l(t.color[X]||0,"uint8"),4*X)}this.color=q}else this.color=l(t.color,"uint8");if(t.position||t.text||t.color||t.baseline||t.align||t.font||t.offset||t.opacity)if(this.color.length>4||this.baselineOffset.length>1||this.align&&this.align.length>1||this.fontAtlas.length>1||this.positionOffset.length>2){var Z=Math.max(.5*this.position.length||0,.25*this.color.length||0,this.baselineOffset.length||0,this.alignOffset.length||0,this.font.length||0,this.opacity.length||0,.5*this.positionOffset.length||0);this.batch=Array(Z);for(var $=0;$<this.batch.length;$++)e.batch[$]={count:e.counts.length>1?e.counts[$]:e.counts[0],offset:e.textOffsets.length>1?e.textOffsets[$]:e.textOffsets[0],color:e.color?e.color.length<=4?e.color:e.color.subarray(4*$,4*$+4):[0,0,0,255],opacity:Array.isArray(e.opacity)?e.opacity[$]:e.opacity,baseline:null!=e.baselineOffset[$]?e.baselineOffset[$]:e.baselineOffset[0],align:e.align?null!=e.alignOffset[$]?e.alignOffset[$]:e.alignOffset[0]:0,atlas:e.fontAtlas[$]||e.fontAtlas[0],positionOffset:e.positionOffset.length>2?e.positionOffset.subarray(2*$,2*$+2):e.positionOffset}}else this.count?this.batch=[{count:this.count,offset:0,color:this.color||[0,0,0,255],opacity:Array.isArray(this.opacity)?this.opacity[0]:this.opacity,baseline:this.baselineOffset[0],align:this.alignOffset?this.alignOffset[0]:0,atlas:this.fontAtlas[0],positionOffset:this.positionOffset}]:this.batch=[]},w.prototype.destroy=function(){},w.prototype.kerning=!0,w.prototype.position={constant:new Float32Array(2)},w.prototype.translate=null,w.prototype.scale=null,w.prototype.font=null,w.prototype.text="",w.prototype.positionOffset=[0,0],w.prototype.opacity=1,w.prototype.color=new Uint8Array([0,0,0,255]),w.prototype.alignOffset=[0,0],w.normalViewport=!1,w.maxAtlasSize=1024,w.atlasCanvas=document.createElement("canvas"),w.atlasContext=w.atlasCanvas.getContext("2d",{alpha:!1}),w.baseFontSize=64,w.fonts={},e.exports=w},{"color-normalize":45,"css-font":126,"detect-kerning":150,"es6-weak-map":208,"flatten-vertex-data":48,"font-atlas":217,"font-measure":218,"gl-util/context":304,"is-plain-obj":390,"object-assign":421,"parse-rect":426,"parse-unit":428,"pick-by-alias":432,regl:463,"to-px":501,"typedarray-pool":507}],45:[function(t,e,r){"use strict";var n=t("color-rgba"),i=t("clamp"),a=t("dtype");e.exports=function(t,e){"float"!==e&&e||(e="array"),"uint"===e&&(e="uint8"),"uint_clamped"===e&&(e="uint8_clamped");var r=a(e),o=new r(4);if(t instanceof r)return Array.isArray(t)?t.slice():(o.set(t),o);var s="uint8"!==e&&"uint8_clamped"!==e;return t instanceof Uint8Array||t instanceof Uint8ClampedArray?(o[0]=t[0],o[1]=t[1],o[2]=t[2],o[3]=null!=t[3]?t[3]:255,s&&(o[0]/=255,o[1]/=255,o[2]/=255,o[3]/=255),o):(t.length&&"string"!=typeof t||((t=n(t))[0]/=255,t[1]/=255,t[2]/=255),s?(o[0]=t[0],o[1]=t[1],o[2]=t[2],o[3]=null!=t[3]?t[3]:1):(o[0]=i(Math.round(255*t[0]),0,255),o[1]=i(Math.round(255*t[1]),0,255),o[2]=i(Math.round(255*t[2]),0,255),o[3]=null==t[3]?255:i(Math.floor(255*t[3]),0,255)),o)}},{clamp:102,"color-rgba":47,dtype:153}],46:[function(t,e,r){(function(r){"use strict";var n=t("color-name"),i=t("is-plain-obj"),a=t("defined");e.exports=function(t){var e,s,l=[],c=1;if("string"==typeof t)if(n[t])l=n[t].slice(),s="rgb";else if("transparent"===t)c=0,s="rgb",l=[0,0,0];else if(/^#[A-Fa-f0-9]+$/.test(t)){var u=t.slice(1),h=u.length,f=h<=4;c=1,f?(l=[parseInt(u[0]+u[0],16),parseInt(u[1]+u[1],16),parseInt(u[2]+u[2],16)],4===h&&(c=parseInt(u[3]+u[3],16)/255)):(l=[parseInt(u[0]+u[1],16),parseInt(u[2]+u[3],16),parseInt(u[4]+u[5],16)],8===h&&(c=parseInt(u[6]+u[7],16)/255)),l[0]||(l[0]=0),l[1]||(l[1]=0),l[2]||(l[2]=0),s="rgb"}else if(e=/^((?:rgb|hs[lvb]|hwb|cmyk?|xy[zy]|gray|lab|lchu?v?|[ly]uv|lms)a?)\s*\(([^\)]*)\)/.exec(t)){var p=e[1],u=p.replace(/a$/,"");s=u;var h="cmyk"===u?4:"gray"===u?1:3;l=e[2].trim().split(/\s*,\s*/).map(function(t,e){if(/%$/.test(t))return e===h?parseFloat(t)/100:"rgb"===u?255*parseFloat(t)/100:parseFloat(t);if("h"===u[e]){if(/deg$/.test(t))return parseFloat(t);if(void 0!==o[t])return o[t]}return parseFloat(t)}),p===u&&l.push(1),c=void 0===l[h]?1:l[h],l=l.slice(0,h)}else t.length>10&&/[0-9](?:\s|\/)/.test(t)&&(l=t.match(/([0-9]+)/g).map(function(t){return parseFloat(t)}),s=t.match(/([a-z])/ig).join("").toLowerCase());else if(isNaN(t))if(i(t)){var d=a(t.r,t.red,t.R,null);null!==d?(s="rgb",l=[d,a(t.g,t.green,t.G),a(t.b,t.blue,t.B)]):(s="hsl",l=[a(t.h,t.hue,t.H),a(t.s,t.saturation,t.S),a(t.l,t.lightness,t.L,t.b,t.brightness)]),c=a(t.a,t.alpha,t.opacity,1),null!=t.opacity&&(c/=100)}else(Array.isArray(t)||r.ArrayBuffer&&ArrayBuffer.isView&&ArrayBuffer.isView(t))&&(l=[t[0],t[1],t[2]],s="rgb",c=4===t.length?t[3]:1);else s="rgb",l=[t>>>16,(65280&t)>>>8,255&t];return{space:s,values:l,alpha:c}};var o={red:0,orange:60,yellow:120,green:180,blue:240,purple:300}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"color-name":106,defined:148,"is-plain-obj":390}],47:[function(t,e,r){"use strict";var n=t("color-parse"),i=t("color-space/hsl"),a=t("clamp");e.exports=function(t){var e,r=n(t);return r.space?((e=Array(3))[0]=a(r.values[0],0,255),e[1]=a(r.values[1],0,255),e[2]=a(r.values[2],0,255),"h"===r.space[0]&&(e=i.rgb(e)),e.push(a(r.alpha,0,1)),e):[]}},{clamp:102,"color-parse":46,"color-space/hsl":110}],48:[function(t,e,r){var n=t("dtype");e.exports=function(t,e,r){if(!t)throw new TypeError("must specify data as first parameter");if(r=0|+(r||0),Array.isArray(t)&&t[0]&&"number"==typeof t[0][0]){var i,a,o,s,l=t[0].length,c=t.length*l;e&&"string"!=typeof e||(e=new(n(e||"float32"))(c+r));var u=e.length-r;if(c!==u)throw new Error("source length "+c+" ("+l+"x"+t.length+") does not match destination length "+u);for(i=0,o=r;i<t.length;i++)for(a=0;a<l;a++)e[o++]=null===t[i][a]?NaN:t[i][a]}else if(e&&"string"!=typeof e)e.set(t,r);else{var h=n(e||"float32");if(Array.isArray(t)||"array"===e)for(e=new h(t.length+r),i=0,o=r,s=e.length;o<s;o++,i++)e[o]=null===t[i]?NaN:t[i];else 0===r?e=new h(t):(e=new h(t.length+r)).set(t,r)}return e}},{dtype:153}],49:[function(t,e,r){var n,i;n=this,i=function(t,e,r,n){"use strict";t.sankey=function(){var t={},i=24,a=8,o=[1,1],s=[],l=[];function c(){function t(t,e){return t.source.y-e.source.y||t.originalIndex-e.originalIndex}function e(t,e){return t.target.y-e.target.y||t.originalIndex-e.originalIndex}s.forEach(function(r){r.sourceLinks.sort(e),r.targetLinks.sort(t)}),s.forEach(function(t){var e=0,r=0;t.sourceLinks.forEach(function(t){t.sy=e,e+=t.dy}),t.targetLinks.forEach(function(t){t.ty=r,r+=t.dy})})}function u(t){return t.y+t.dy/2}function h(t){return t.value}return t.nodeWidth=function(e){return arguments.length?(i=+e,t):i},t.nodePadding=function(e){return arguments.length?(a=+e,t):a},t.nodes=function(e){return arguments.length?(s=e,t):s},t.links=function(e){return arguments.length?(l=e,t):l},t.size=function(e){return arguments.length?(o=e,t):o},t.layout=function(n){return s.forEach(function(t){t.sourceLinks=[],t.targetLinks=[]}),l.forEach(function(t,e){var r=t.source,n=t.target;"number"==typeof r&&(r=t.source=s[t.source]),"number"==typeof n&&(n=t.target=s[t.target]),t.originalIndex=e,r.sourceLinks.push(t),n.targetLinks.push(t)}),s.forEach(function(t){t.value=Math.max(e.sum(t.sourceLinks,h),e.sum(t.targetLinks,h))}),function(){for(var t,e,r=s,n=0;r.length;)t=[],r.forEach(function(e){e.x=n,e.dx=i,e.sourceLinks.forEach(function(e){t.indexOf(e.target)<0&&t.push(e.target)})}),r=t,++n;(function(t){s.forEach(function(e){e.sourceLinks.length||(e.x=t-1)})})(n),e=(o[0]-i)/(n-1),s.forEach(function(t){t.x*=e})}(),function(t){var n,i=r.nest().key(function(t){return t.x}).sortKeys(e.ascending).entries(s).map(function(t){return t.values});n=e.min(i,function(t){return(o[1]-(t.length-1)*a)/e.sum(t,h)}),i.forEach(function(t){t.forEach(function(t,e){t.y=e,t.dy=t.value*n})}),l.forEach(function(t){t.dy=t.value*n}),d();for(var c=1;t>0;--t)p(c*=.99),d(),f(c),d();function f(t){function r(t){return u(t.source)*t.value}i.forEach(function(n){n.forEach(function(n){if(n.targetLinks.length){var i=e.sum(n.targetLinks,r)/e.sum(n.targetLinks,h);n.y+=(i-u(n))*t}})})}function p(t){function r(t){return u(t.target)*t.value}i.slice().reverse().forEach(function(n){n.forEach(function(n){if(n.sourceLinks.length){var i=e.sum(n.sourceLinks,r)/e.sum(n.sourceLinks,h);n.y+=(i-u(n))*t}})})}function d(){i.forEach(function(t){var e,r,n,i=0,s=t.length;for(t.sort(g),n=0;n<s;++n)e=t[n],(r=i-e.y)>0&&(e.y+=r),i=e.y+e.dy+a;if((r=i-a-o[1])>0)for(i=e.y-=r,n=s-2;n>=0;--n)e=t[n],(r=e.y+e.dy+a-i)>0&&(e.y-=r),i=e.y})}function g(t,e){return t.y-e.y}}(n),c(),t},t.relayout=function(){return c(),t},t.link=function(){var t=.5;function e(e){var r=e.source.x+e.source.dx,i=e.target.x,a=n.interpolateNumber(r,i),o=a(t),s=a(1-t),l=e.source.y+e.sy,c=l+e.dy,u=e.target.y+e.ty,h=u+e.dy;return"M"+r+","+l+"C"+o+","+l+" "+s+","+u+" "+i+","+u+"L"+i+","+h+"C"+s+","+h+" "+o+","+c+" "+r+","+c+"Z"}return e.curvature=function(r){return arguments.length?(t=+r,e):t},e},t},Object.defineProperty(t,"__esModule",{value:!0})},"object"==typeof r&&"undefined"!=typeof e?i(r,t("d3-array"),t("d3-collection"),t("d3-interpolate")):i(n.d3=n.d3||{},n.d3,n.d3,n.d3)},{"d3-array":139,"d3-collection":140,"d3-interpolate":144}],50:[function(t,e,r){"use strict";var n="undefined"==typeof WeakMap?t("weak-map"):WeakMap,i=t("gl-buffer"),a=t("gl-vao"),o=new n;e.exports=function(t){var e=o.get(t),r=e&&(e._triangleBuffer.handle||e._triangleBuffer.buffer);if(!r||!t.isBuffer(r)){var n=i(t,new Float32Array([-1,-1,-1,4,4,-1]));(e=a(t,[{buffer:n,type:t.FLOAT,size:2}]))._triangleBuffer=n,o.set(t,e)}e.bind(),t.drawArrays(t.TRIANGLES,0,3),e.unbind()}},{"gl-buffer":230,"gl-vao":308,"weak-map":517}],51:[function(t,e,r){e.exports=function(t){var e=0,r=0,n=0,i=0;return t.map(function(t){var a=(t=t.slice())[0],o=a.toUpperCase();if(a!=o)switch(t[0]=o,a){case"a":t[6]+=n,t[7]+=i;break;case"v":t[1]+=i;break;case"h":t[1]+=n;break;default:for(var s=1;s<t.length;)t[s++]+=n,t[s++]+=i}switch(o){case"Z":n=e,i=r;break;case"H":n=t[1];break;case"V":i=t[1];break;case"M":n=e=t[1],i=r=t[2];break;default:n=t[t.length-2],i=t[t.length-1]}return t})}},{}],52:[function(t,e,r){var n=t("pad-left");e.exports=function(t,e,r){e="number"==typeof e?e:1,r=r||": ";var i=t.split(/\r?\n/),a=String(i.length+e-1).length;return i.map(function(t,i){var o=i+e,s=String(o).length,l=n(o,a-s);return l+r+t}).join("\n")}},{"pad-left":424}],53:[function(t,e,r){"use strict";e.exports=function(t){var e=t.length;if(0===e)return[];if(1===e)return[0];for(var r=t[0].length,n=[t[0]],a=[0],o=1;o<e;++o)if(n.push(t[o]),i(n,r)){if(a.push(o),a.length===r+1)return a}else n.pop();return a};var n=t("robust-orientation");function i(t,e){for(var r=new Array(e+1),i=0;i<t.length;++i)r[i]=t[i];for(i=0;i<=t.length;++i){for(var a=t.length;a<=e;++a){for(var o=new Array(e),s=0;s<e;++s)o[s]=Math.pow(a+1-i,s);r[a]=o}if(n.apply(void 0,r))return!0}return!1}},{"robust-orientation":471}],54:[function(t,e,r){"use strict";e.exports=function(t,e){return n(e).filter(function(r){for(var n=new Array(r.length),a=0;a<r.length;++a)n[a]=e[r[a]];return i(n)*t<1})};var n=t("delaunay-triangulate"),i=t("circumradius")},{circumradius:101,"delaunay-triangulate":149}],55:[function(t,e,r){e.exports=function(t,e){return i(n(t,e))};var n=t("alpha-complex"),i=t("simplicial-complex-boundary")},{"alpha-complex":54,"simplicial-complex-boundary":478}],56:[function(t,e,r){"use strict";e.exports=function(t,e){if(!t||null==t.length)throw Error("Argument should be an array");e=null==e?1:Math.floor(e);for(var r=Array(2*e),n=0;n<e;n++){for(var i=-1/0,a=1/0,o=n,s=t.length;o<s;o+=e)t[o]>i&&(i=t[o]),t[o]<a&&(a=t[o]);r[n]=a,r[e+n]=i}return r}},{}],57:[function(t,e,r){"use strict";var n=t("array-bounds");e.exports=function(t,e,r){if(!t||null==t.length)throw Error("Argument should be an array");null==e&&(e=1);null==r&&(r=n(t,e));for(var i=0;i<e;i++){var a=r[e+i],o=r[i],s=i,l=t.length;if(a===1/0&&o===-1/0)for(s=i;s<l;s+=e)t[s]=t[s]===a?1:t[s]===o?0:.5;else if(a===1/0)for(s=i;s<l;s+=e)t[s]=t[s]===a?1:0;else if(o===-1/0)for(s=i;s<l;s+=e)t[s]=t[s]===o?0:1;else{var c=a-o;for(s=i;s<l;s+=e)t[s]=0===c?.5:(t[s]-o)/c}}return t}},{"array-bounds":56}],58:[function(t,e,r){e.exports=function(t,e){var r="number"==typeof t,n="number"==typeof e;r&&!n?(e=t,t=0):r||n||(t=0,e=0);var i=(e|=0)-(t|=0);if(i<0)throw new Error("array length must be positive");for(var a=new Array(i),o=0,s=t;o<i;o++,s++)a[o]=s;return a}},{}],59:[function(t,e,r){(function(r){"use strict";function n(t,e){if(t===e)return 0;for(var r=t.length,n=e.length,i=0,a=Math.min(r,n);i<a;++i)if(t[i]!==e[i]){r=t[i],n=e[i];break}return r<n?-1:n<r?1:0}function i(t){return r.Buffer&&"function"==typeof r.Buffer.isBuffer?r.Buffer.isBuffer(t):!(null==t||!t._isBuffer)}var a=t("util/"),o=Object.prototype.hasOwnProperty,s=Array.prototype.slice,l="foo"===function(){}.name;function c(t){return Object.prototype.toString.call(t)}function u(t){return!i(t)&&("function"==typeof r.ArrayBuffer&&("function"==typeof ArrayBuffer.isView?ArrayBuffer.isView(t):!!t&&(t instanceof DataView||!!(t.buffer&&t.buffer instanceof ArrayBuffer))))}var h=e.exports=v,f=/\s*function\s+([^\(\s]*)\s*/;function p(t){if(a.isFunction(t)){if(l)return t.name;var e=t.toString().match(f);return e&&e[1]}}function d(t,e){return"string"==typeof t?t.length<e?t:t.slice(0,e):t}function g(t){if(l||!a.isFunction(t))return a.inspect(t);var e=p(t);return"[Function"+(e?": "+e:"")+"]"}function m(t,e,r,n,i){throw new h.AssertionError({message:r,actual:t,expected:e,operator:n,stackStartFunction:i})}function v(t,e){t||m(t,!0,e,"==",h.ok)}function y(t,e,r,o){if(t===e)return!0;if(i(t)&&i(e))return 0===n(t,e);if(a.isDate(t)&&a.isDate(e))return t.getTime()===e.getTime();if(a.isRegExp(t)&&a.isRegExp(e))return t.source===e.source&&t.global===e.global&&t.multiline===e.multiline&&t.lastIndex===e.lastIndex&&t.ignoreCase===e.ignoreCase;if(null!==t&&"object"==typeof t||null!==e&&"object"==typeof e){if(u(t)&&u(e)&&c(t)===c(e)&&!(t instanceof Float32Array||t instanceof Float64Array))return 0===n(new Uint8Array(t.buffer),new Uint8Array(e.buffer));if(i(t)!==i(e))return!1;var l=(o=o||{actual:[],expected:[]}).actual.indexOf(t);return-1!==l&&l===o.expected.indexOf(e)||(o.actual.push(t),o.expected.push(e),function(t,e,r,n){if(null==t||null==e)return!1;if(a.isPrimitive(t)||a.isPrimitive(e))return t===e;if(r&&Object.getPrototypeOf(t)!==Object.getPrototypeOf(e))return!1;var i=x(t),o=x(e);if(i&&!o||!i&&o)return!1;if(i)return t=s.call(t),e=s.call(e),y(t,e,r);var l,c,u=w(t),h=w(e);if(u.length!==h.length)return!1;for(u.sort(),h.sort(),c=u.length-1;c>=0;c--)if(u[c]!==h[c])return!1;for(c=u.length-1;c>=0;c--)if(l=u[c],!y(t[l],e[l],r,n))return!1;return!0}(t,e,r,o))}return r?t===e:t==e}function x(t){return"[object Arguments]"==Object.prototype.toString.call(t)}function b(t,e){if(!t||!e)return!1;if("[object RegExp]"==Object.prototype.toString.call(e))return e.test(t);try{if(t instanceof e)return!0}catch(t){}return!Error.isPrototypeOf(e)&&!0===e.call({},t)}function _(t,e,r,n){var i;if("function"!=typeof e)throw new TypeError('"block" argument must be a function');"string"==typeof r&&(n=r,r=null),i=function(t){var e;try{t()}catch(t){e=t}return e}(e),n=(r&&r.name?" ("+r.name+").":".")+(n?" "+n:"."),t&&!i&&m(i,r,"Missing expected exception"+n);var o="string"==typeof n,s=!t&&i&&!r;if((!t&&a.isError(i)&&o&&b(i,r)||s)&&m(i,r,"Got unwanted exception"+n),t&&i&&r&&!b(i,r)||!t&&i)throw i}h.AssertionError=function(t){var e;this.name="AssertionError",this.actual=t.actual,this.expected=t.expected,this.operator=t.operator,t.message?(this.message=t.message,this.generatedMessage=!1):(this.message=d(g((e=this).actual),128)+" "+e.operator+" "+d(g(e.expected),128),this.generatedMessage=!0);var r=t.stackStartFunction||m;if(Error.captureStackTrace)Error.captureStackTrace(this,r);else{var n=new Error;if(n.stack){var i=n.stack,a=p(r),o=i.indexOf("\n"+a);if(o>=0){var s=i.indexOf("\n",o+1);i=i.substring(s+1)}this.stack=i}}},a.inherits(h.AssertionError,Error),h.fail=m,h.ok=v,h.equal=function(t,e,r){t!=e&&m(t,e,r,"==",h.equal)},h.notEqual=function(t,e,r){t==e&&m(t,e,r,"!=",h.notEqual)},h.deepEqual=function(t,e,r){y(t,e,!1)||m(t,e,r,"deepEqual",h.deepEqual)},h.deepStrictEqual=function(t,e,r){y(t,e,!0)||m(t,e,r,"deepStrictEqual",h.deepStrictEqual)},h.notDeepEqual=function(t,e,r){y(t,e,!1)&&m(t,e,r,"notDeepEqual",h.notDeepEqual)},h.notDeepStrictEqual=function t(e,r,n){y(e,r,!0)&&m(e,r,n,"notDeepStrictEqual",t)},h.strictEqual=function(t,e,r){t!==e&&m(t,e,r,"===",h.strictEqual)},h.notStrictEqual=function(t,e,r){t===e&&m(t,e,r,"!==",h.notStrictEqual)},h.throws=function(t,e,r){_(!0,t,e,r)},h.doesNotThrow=function(t,e,r){_(!1,t,e,r)},h.ifError=function(t){if(t)throw t};var w=Object.keys||function(t){var e=[];for(var r in t)o.call(t,r)&&e.push(r);return e}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"util/":514}],60:[function(t,e,r){e.exports=function(t){return atob(t)}},{}],61:[function(t,e,r){"use strict";e.exports=function(t,e){for(var r=e.length,a=new Array(r+1),o=0;o<r;++o){for(var s=new Array(r+1),l=0;l<=r;++l)s[l]=t[l][o];a[o]=s}a[r]=new Array(r+1);for(var o=0;o<=r;++o)a[r][o]=1;for(var c=new Array(r+1),o=0;o<r;++o)c[o]=e[o];c[r]=1;var u=n(a,c),h=i(u[r+1]);0===h&&(h=1);for(var f=new Array(r+1),o=0;o<=r;++o)f[o]=i(u[o])/h;return f};var n=t("robust-linear-solve");function i(t){for(var e=0,r=0;r<t.length;++r)e+=t[r];return e}},{"robust-linear-solve":470}],62:[function(t,e,r){"use strict";r.byteLength=function(t){return 3*t.length/4-c(t)},r.toByteArray=function(t){var e,r,n,o,s,l=t.length;o=c(t),s=new a(3*l/4-o),r=o>0?l-4:l;var u=0;for(e=0;e<r;e+=4)n=i[t.charCodeAt(e)]<<18|i[t.charCodeAt(e+1)]<<12|i[t.charCodeAt(e+2)]<<6|i[t.charCodeAt(e+3)],s[u++]=n>>16&255,s[u++]=n>>8&255,s[u++]=255&n;2===o?(n=i[t.charCodeAt(e)]<<2|i[t.charCodeAt(e+1)]>>4,s[u++]=255&n):1===o&&(n=i[t.charCodeAt(e)]<<10|i[t.charCodeAt(e+1)]<<4|i[t.charCodeAt(e+2)]>>2,s[u++]=n>>8&255,s[u++]=255&n);return s},r.fromByteArray=function(t){for(var e,r=t.length,i=r%3,a="",o=[],s=0,l=r-i;s<l;s+=16383)o.push(u(t,s,s+16383>l?l:s+16383));1===i?(e=t[r-1],a+=n[e>>2],a+=n[e<<4&63],a+="=="):2===i&&(e=(t[r-2]<<8)+t[r-1],a+=n[e>>10],a+=n[e>>4&63],a+=n[e<<2&63],a+="=");return o.push(a),o.join("")};for(var n=[],i=[],a="undefined"!=typeof Uint8Array?Uint8Array:Array,o="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",s=0,l=o.length;s<l;++s)n[s]=o[s],i[o.charCodeAt(s)]=s;function c(t){var e=t.length;if(e%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===t[e-2]?2:"="===t[e-1]?1:0}function u(t,e,r){for(var i,a,o=[],s=e;s<r;s+=3)i=(t[s]<<16&16711680)+(t[s+1]<<8&65280)+(255&t[s+2]),o.push(n[(a=i)>>18&63]+n[a>>12&63]+n[a>>6&63]+n[63&a]);return o.join("")}i["-".charCodeAt(0)]=62,i["_".charCodeAt(0)]=63},{}],63:[function(t,e,r){"use strict";var n=t("./lib/rationalize");e.exports=function(t,e){return n(t[0].mul(e[1]).add(e[0].mul(t[1])),t[1].mul(e[1]))}},{"./lib/rationalize":73}],64:[function(t,e,r){"use strict";e.exports=function(t,e){return t[0].mul(e[1]).cmp(e[0].mul(t[1]))}},{}],65:[function(t,e,r){"use strict";var n=t("./lib/rationalize");e.exports=function(t,e){return n(t[0].mul(e[1]),t[1].mul(e[0]))}},{"./lib/rationalize":73}],66:[function(t,e,r){"use strict";var n=t("./is-rat"),i=t("./lib/is-bn"),a=t("./lib/num-to-bn"),o=t("./lib/str-to-bn"),s=t("./lib/rationalize"),l=t("./div");e.exports=function t(e,r){if(n(e))return r?l(e,t(r)):[e[0].clone(),e[1].clone()];var c=0;var u,h;if(i(e))u=e.clone();else if("string"==typeof e)u=o(e);else{if(0===e)return[a(0),a(1)];if(e===Math.floor(e))u=a(e);else{for(;e!==Math.floor(e);)e*=Math.pow(2,256),c-=256;u=a(e)}}if(n(r))u.mul(r[1]),h=r[0].clone();else if(i(r))h=r.clone();else if("string"==typeof r)h=o(r);else if(r)if(r===Math.floor(r))h=a(r);else{for(;r!==Math.floor(r);)r*=Math.pow(2,256),c+=256;h=a(r)}else h=a(1);c>0?u=u.ushln(c):c<0&&(h=h.ushln(-c));return s(u,h)}},{"./div":65,"./is-rat":67,"./lib/is-bn":71,"./lib/num-to-bn":72,"./lib/rationalize":73,"./lib/str-to-bn":74}],67:[function(t,e,r){"use strict";var n=t("./lib/is-bn");e.exports=function(t){return Array.isArray(t)&&2===t.length&&n(t[0])&&n(t[1])}},{"./lib/is-bn":71}],68:[function(t,e,r){"use strict";var n=t("bn.js");e.exports=function(t){return t.cmp(new n(0))}},{"bn.js":82}],69:[function(t,e,r){"use strict";var n=t("./bn-sign");e.exports=function(t){var e=t.length,r=t.words,i=0;if(1===e)i=r[0];else if(2===e)i=r[0]+67108864*r[1];else for(var a=0;a<e;a++){var o=r[a];i+=o*Math.pow(67108864,a)}return n(t)*i}},{"./bn-sign":68}],70:[function(t,e,r){"use strict";var n=t("double-bits"),i=t("bit-twiddle").countTrailingZeros;e.exports=function(t){var e=i(n.lo(t));if(e<32)return e;var r=i(n.hi(t));if(r>20)return 52;return r+32}},{"bit-twiddle":80,"double-bits":151}],71:[function(t,e,r){"use strict";t("bn.js");e.exports=function(t){return t&&"object"==typeof t&&Boolean(t.words)}},{"bn.js":82}],72:[function(t,e,r){"use strict";var n=t("bn.js"),i=t("double-bits");e.exports=function(t){var e=i.exponent(t);return e<52?new n(t):new n(t*Math.pow(2,52-e)).ushln(e-52)}},{"bn.js":82,"double-bits":151}],73:[function(t,e,r){"use strict";var n=t("./num-to-bn"),i=t("./bn-sign");e.exports=function(t,e){var r=i(t),a=i(e);if(0===r)return[n(0),n(1)];if(0===a)return[n(0),n(0)];a<0&&(t=t.neg(),e=e.neg());var o=t.gcd(e);if(o.cmpn(1))return[t.div(o),e.div(o)];return[t,e]}},{"./bn-sign":68,"./num-to-bn":72}],74:[function(t,e,r){"use strict";var n=t("bn.js");e.exports=function(t){return new n(t)}},{"bn.js":82}],75:[function(t,e,r){"use strict";var n=t("./lib/rationalize");e.exports=function(t,e){return n(t[0].mul(e[0]),t[1].mul(e[1]))}},{"./lib/rationalize":73}],76:[function(t,e,r){"use strict";var n=t("./lib/bn-sign");e.exports=function(t){return n(t[0])*n(t[1])}},{"./lib/bn-sign":68}],77:[function(t,e,r){"use strict";var n=t("./lib/rationalize");e.exports=function(t,e){return n(t[0].mul(e[1]).sub(t[1].mul(e[0])),t[1].mul(e[1]))}},{"./lib/rationalize":73}],78:[function(t,e,r){"use strict";var n=t("./lib/bn-to-num"),i=t("./lib/ctz");e.exports=function(t){var e=t[0],r=t[1];if(0===e.cmpn(0))return 0;var a=e.abs().divmod(r.abs()),o=a.div,s=n(o),l=a.mod,c=e.negative!==r.negative?-1:1;if(0===l.cmpn(0))return c*s;if(s){var u=i(s)+4,h=n(l.ushln(u).divRound(r));return c*(s+h*Math.pow(2,-u))}var f=r.bitLength()-l.bitLength()+53,h=n(l.ushln(f).divRound(r));return f<1023?c*h*Math.pow(2,-f):(h*=Math.pow(2,-1023),c*h*Math.pow(2,1023-f))}},{"./lib/bn-to-num":69,"./lib/ctz":70}],79:[function(t,e,r){"use strict";function n(t,e,r,n,i,a){var o=["function ",t,"(a,l,h,",n.join(","),"){",a?"":"var i=",r?"l-1":"h+1",";while(l<=h){var m=(l+h)>>>1,x=a",i?".get(m)":"[m]"];return a?e.indexOf("c")<0?o.push(";if(x===y){return m}else if(x<=y){"):o.push(";var p=c(x,y);if(p===0){return m}else if(p<=0){"):o.push(";if(",e,"){i=m;"),r?o.push("l=m+1}else{h=m-1}"):o.push("h=m-1}else{l=m+1}"),o.push("}"),a?o.push("return -1};"):o.push("return i};"),o.join("")}function i(t,e,r,i){return new Function([n("A","x"+t+"y",e,["y"],!1,i),n("B","x"+t+"y",e,["y"],!0,i),n("P","c(x,y)"+t+"0",e,["y","c"],!1,i),n("Q","c(x,y)"+t+"0",e,["y","c"],!0,i),"function dispatchBsearch",r,"(a,y,c,l,h){if(a.shape){if(typeof(c)==='function'){return Q(a,(l===undefined)?0:l|0,(h===undefined)?a.shape[0]-1:h|0,y,c)}else{return B(a,(c===undefined)?0:c|0,(l===undefined)?a.shape[0]-1:l|0,y)}}else{if(typeof(c)==='function'){return P(a,(l===undefined)?0:l|0,(h===undefined)?a.length-1:h|0,y,c)}else{return A(a,(c===undefined)?0:c|0,(l===undefined)?a.length-1:l|0,y)}}}return dispatchBsearch",r].join(""))()}e.exports={ge:i(">=",!1,"GE"),gt:i(">",!1,"GT"),lt:i("<",!0,"LT"),le:i("<=",!0,"LE"),eq:i("-",!0,"EQ",!0)}},{}],80:[function(t,e,r){"use strict";"use restrict";function n(t){var e=32;return(t&=-t)&&e--,65535&t&&(e-=16),16711935&t&&(e-=8),252645135&t&&(e-=4),858993459&t&&(e-=2),1431655765&t&&(e-=1),e}r.INT_BITS=32,r.INT_MAX=2147483647,r.INT_MIN=-1<<31,r.sign=function(t){return(t>0)-(t<0)},r.abs=function(t){var e=t>>31;return(t^e)-e},r.min=function(t,e){return e^(t^e)&-(t<e)},r.max=function(t,e){return t^(t^e)&-(t<e)},r.isPow2=function(t){return!(t&t-1||!t)},r.log2=function(t){var e,r;return e=(t>65535)<<4,e|=r=((t>>>=e)>255)<<3,e|=r=((t>>>=r)>15)<<2,(e|=r=((t>>>=r)>3)<<1)|(t>>>=r)>>1},r.log10=function(t){return t>=1e9?9:t>=1e8?8:t>=1e7?7:t>=1e6?6:t>=1e5?5:t>=1e4?4:t>=1e3?3:t>=100?2:t>=10?1:0},r.popCount=function(t){return 16843009*((t=(858993459&(t-=t>>>1&1431655765))+(t>>>2&858993459))+(t>>>4)&252645135)>>>24},r.countTrailingZeros=n,r.nextPow2=function(t){return t+=0===t,--t,t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)+1},r.prevPow2=function(t){return t|=t>>>1,t|=t>>>2,t|=t>>>4,t|=t>>>8,(t|=t>>>16)-(t>>>1)},r.parity=function(t){return t^=t>>>16,t^=t>>>8,t^=t>>>4,27030>>>(t&=15)&1};var i=new Array(256);!function(t){for(var e=0;e<256;++e){var r=e,n=e,i=7;for(r>>>=1;r;r>>>=1)n<<=1,n|=1&r,--i;t[e]=n<<i&255}}(i),r.reverse=function(t){return i[255&t]<<24|i[t>>>8&255]<<16|i[t>>>16&255]<<8|i[t>>>24&255]},r.interleave2=function(t,e){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t&=65535)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e&=65535)|e<<8))|e<<4))|e<<2))|e<<1))<<1},r.deinterleave2=function(t,e){return(t=65535&((t=16711935&((t=252645135&((t=858993459&((t=t>>>e&1431655765)|t>>>1))|t>>>2))|t>>>4))|t>>>16))<<16>>16},r.interleave3=function(t,e,r){return t=1227133513&((t=3272356035&((t=251719695&((t=4278190335&((t&=1023)|t<<16))|t<<8))|t<<4))|t<<2),(t|=(e=1227133513&((e=3272356035&((e=251719695&((e=4278190335&((e&=1023)|e<<16))|e<<8))|e<<4))|e<<2))<<1)|(r=1227133513&((r=3272356035&((r=251719695&((r=4278190335&((r&=1023)|r<<16))|r<<8))|r<<4))|r<<2))<<2},r.deinterleave3=function(t,e){return(t=1023&((t=4278190335&((t=251719695&((t=3272356035&((t=t>>>e&1227133513)|t>>>2))|t>>>4))|t>>>8))|t>>>16))<<22>>22},r.nextCombination=function(t){var e=t|t-1;return e+1|(~e&-~e)-1>>>n(t)+1}},{}],81:[function(t,e,r){"use strict";var n=t("clamp");e.exports=function(t,e){e||(e={});var r,o,s,l,c,u,h,f,p,d,g,m=null==e.cutoff?.25:e.cutoff,v=null==e.radius?8:e.radius,y=e.channel||0;if(ArrayBuffer.isView(t)||Array.isArray(t)){if(!e.width||!e.height)throw Error("For raw data width and height should be provided by options");r=e.width,o=e.height,l=t,u=e.stride?e.stride:Math.floor(t.length/r/o)}else window.HTMLCanvasElement&&t instanceof window.HTMLCanvasElement?(h=(f=t).getContext("2d"),r=f.width,o=f.height,p=h.getImageData(0,0,r,o),l=p.data,u=4):window.CanvasRenderingContext2D&&t instanceof window.CanvasRenderingContext2D?(f=t.canvas,h=t,r=f.width,o=f.height,p=h.getImageData(0,0,r,o),l=p.data,u=4):window.ImageData&&t instanceof window.ImageData&&(p=t,r=t.width,o=t.height,l=p.data,u=4);if(s=Math.max(r,o),window.Uint8ClampedArray&&l instanceof window.Uint8ClampedArray||window.Uint8Array&&l instanceof window.Uint8Array)for(c=l,l=Array(r*o),d=0,g=c.length;d<g;d++)l[d]=c[d*u+y]/255;else if(1!==u)throw Error("Raw data can have only 1 value per pixel");var x=Array(r*o),b=Array(r*o),_=Array(s),w=Array(s),k=Array(s+1),M=Array(s);for(d=0,g=r*o;d<g;d++){var A=l[d];x[d]=1===A?0:0===A?i:Math.pow(Math.max(0,.5-A),2),b[d]=1===A?i:0===A?0:Math.pow(Math.max(0,A-.5),2)}a(x,r,o,_,w,M,k),a(b,r,o,_,w,M,k);var T=window.Float32Array?new Float32Array(r*o):new Array(r*o);for(d=0,g=r*o;d<g;d++)T[d]=n(1-((x[d]-b[d])/v+m),0,1);return T};var i=1e20;function a(t,e,r,n,i,a,s){for(var l=0;l<e;l++){for(var c=0;c<r;c++)n[c]=t[c*e+l];for(o(n,i,a,s,r),c=0;c<r;c++)t[c*e+l]=i[c]}for(c=0;c<r;c++){for(l=0;l<e;l++)n[l]=t[c*e+l];for(o(n,i,a,s,e),l=0;l<e;l++)t[c*e+l]=Math.sqrt(i[l])}}function o(t,e,r,n,a){r[0]=0,n[0]=-i,n[1]=+i;for(var o=1,s=0;o<a;o++){for(var l=(t[o]+o*o-(t[r[s]]+r[s]*r[s]))/(2*o-2*r[s]);l<=n[s];)s--,l=(t[o]+o*o-(t[r[s]]+r[s]*r[s]))/(2*o-2*r[s]);r[++s]=o,n[s]=l,n[s+1]=+i}for(o=0,s=0;o<a;o++){for(;n[s+1]<o;)s++;e[o]=(o-r[s])*(o-r[s])+t[r[s]]}}},{clamp:102}],82:[function(t,e,r){!function(e,r){"use strict";function n(t,e){if(!t)throw new Error(e||"Assertion failed")}function i(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}function a(t,e,r){if(a.isBN(t))return t;this.negative=0,this.words=null,this.length=0,this.red=null,null!==t&&("le"!==e&&"be"!==e||(r=e,e=10),this._init(t||0,e||10,r||"be"))}var o;"object"==typeof e?e.exports=a:r.BN=a,a.BN=a,a.wordSize=26;try{o=t("buffer").Buffer}catch(t){}function s(t,e,r){for(var n=0,i=Math.min(t.length,r),a=e;a<i;a++){var o=t.charCodeAt(a)-48;n<<=4,n|=o>=49&&o<=54?o-49+10:o>=17&&o<=22?o-17+10:15&o}return n}function l(t,e,r,n){for(var i=0,a=Math.min(t.length,r),o=e;o<a;o++){var s=t.charCodeAt(o)-48;i*=n,i+=s>=49?s-49+10:s>=17?s-17+10:s}return i}a.isBN=function(t){return t instanceof a||null!==t&&"object"==typeof t&&t.constructor.wordSize===a.wordSize&&Array.isArray(t.words)},a.max=function(t,e){return t.cmp(e)>0?t:e},a.min=function(t,e){return t.cmp(e)<0?t:e},a.prototype._init=function(t,e,r){if("number"==typeof t)return this._initNumber(t,e,r);if("object"==typeof t)return this._initArray(t,e,r);"hex"===e&&(e=16),n(e===(0|e)&&e>=2&&e<=36);var i=0;"-"===(t=t.toString().replace(/\s+/g,""))[0]&&i++,16===e?this._parseHex(t,i):this._parseBase(t,e,i),"-"===t[0]&&(this.negative=1),this.strip(),"le"===r&&this._initArray(this.toArray(),e,r)},a.prototype._initNumber=function(t,e,r){t<0&&(this.negative=1,t=-t),t<67108864?(this.words=[67108863&t],this.length=1):t<4503599627370496?(this.words=[67108863&t,t/67108864&67108863],this.length=2):(n(t<9007199254740992),this.words=[67108863&t,t/67108864&67108863,1],this.length=3),"le"===r&&this._initArray(this.toArray(),e,r)},a.prototype._initArray=function(t,e,r){if(n("number"==typeof t.length),t.length<=0)return this.words=[0],this.length=1,this;this.length=Math.ceil(t.length/3),this.words=new Array(this.length);for(var i=0;i<this.length;i++)this.words[i]=0;var a,o,s=0;if("be"===r)for(i=t.length-1,a=0;i>=0;i-=3)o=t[i]|t[i-1]<<8|t[i-2]<<16,this.words[a]|=o<<s&67108863,this.words[a+1]=o>>>26-s&67108863,(s+=24)>=26&&(s-=26,a++);else if("le"===r)for(i=0,a=0;i<t.length;i+=3)o=t[i]|t[i+1]<<8|t[i+2]<<16,this.words[a]|=o<<s&67108863,this.words[a+1]=o>>>26-s&67108863,(s+=24)>=26&&(s-=26,a++);return this.strip()},a.prototype._parseHex=function(t,e){this.length=Math.ceil((t.length-e)/6),this.words=new Array(this.length);for(var r=0;r<this.length;r++)this.words[r]=0;var n,i,a=0;for(r=t.length-6,n=0;r>=e;r-=6)i=s(t,r,r+6),this.words[n]|=i<<a&67108863,this.words[n+1]|=i>>>26-a&4194303,(a+=24)>=26&&(a-=26,n++);r+6!==e&&(i=s(t,e,r+6),this.words[n]|=i<<a&67108863,this.words[n+1]|=i>>>26-a&4194303),this.strip()},a.prototype._parseBase=function(t,e,r){this.words=[0],this.length=1;for(var n=0,i=1;i<=67108863;i*=e)n++;n--,i=i/e|0;for(var a=t.length-r,o=a%n,s=Math.min(a,a-o)+r,c=0,u=r;u<s;u+=n)c=l(t,u,u+n,e),this.imuln(i),this.words[0]+c<67108864?this.words[0]+=c:this._iaddn(c);if(0!==o){var h=1;for(c=l(t,u,t.length,e),u=0;u<o;u++)h*=e;this.imuln(h),this.words[0]+c<67108864?this.words[0]+=c:this._iaddn(c)}},a.prototype.copy=function(t){t.words=new Array(this.length);for(var e=0;e<this.length;e++)t.words[e]=this.words[e];t.length=this.length,t.negative=this.negative,t.red=this.red},a.prototype.clone=function(){var t=new a(null);return this.copy(t),t},a.prototype._expand=function(t){for(;this.length<t;)this.words[this.length++]=0;return this},a.prototype.strip=function(){for(;this.length>1&&0===this.words[this.length-1];)this.length--;return this._normSign()},a.prototype._normSign=function(){return 1===this.length&&0===this.words[0]&&(this.negative=0),this},a.prototype.inspect=function(){return(this.red?"<BN-R: ":"<BN: ")+this.toString(16)+">"};var c=["","0","00","000","0000","00000","000000","0000000","00000000","000000000","0000000000","00000000000","000000000000","0000000000000","00000000000000","000000000000000","0000000000000000","00000000000000000","000000000000000000","0000000000000000000","00000000000000000000","000000000000000000000","0000000000000000000000","00000000000000000000000","000000000000000000000000","0000000000000000000000000"],u=[0,0,25,16,12,11,10,9,8,8,7,7,7,7,6,6,6,6,6,6,6,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5],h=[0,0,33554432,43046721,16777216,48828125,60466176,40353607,16777216,43046721,1e7,19487171,35831808,62748517,7529536,11390625,16777216,24137569,34012224,47045881,64e6,4084101,5153632,6436343,7962624,9765625,11881376,14348907,17210368,20511149,243e5,28629151,33554432,39135393,45435424,52521875,60466176];function f(t,e,r){r.negative=e.negative^t.negative;var n=t.length+e.length|0;r.length=n,n=n-1|0;var i=0|t.words[0],a=0|e.words[0],o=i*a,s=67108863&o,l=o/67108864|0;r.words[0]=s;for(var c=1;c<n;c++){for(var u=l>>>26,h=67108863&l,f=Math.min(c,e.length-1),p=Math.max(0,c-t.length+1);p<=f;p++){var d=c-p|0;u+=(o=(i=0|t.words[d])*(a=0|e.words[p])+h)/67108864|0,h=67108863&o}r.words[c]=0|h,l=0|u}return 0!==l?r.words[c]=0|l:r.length--,r.strip()}a.prototype.toString=function(t,e){var r;if(e=0|e||1,16===(t=t||10)||"hex"===t){r="";for(var i=0,a=0,o=0;o<this.length;o++){var s=this.words[o],l=(16777215&(s<<i|a)).toString(16);r=0!==(a=s>>>24-i&16777215)||o!==this.length-1?c[6-l.length]+l+r:l+r,(i+=2)>=26&&(i-=26,o--)}for(0!==a&&(r=a.toString(16)+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}if(t===(0|t)&&t>=2&&t<=36){var f=u[t],p=h[t];r="";var d=this.clone();for(d.negative=0;!d.isZero();){var g=d.modn(p).toString(t);r=(d=d.idivn(p)).isZero()?g+r:c[f-g.length]+g+r}for(this.isZero()&&(r="0"+r);r.length%e!=0;)r="0"+r;return 0!==this.negative&&(r="-"+r),r}n(!1,"Base should be between 2 and 36")},a.prototype.toNumber=function(){var t=this.words[0];return 2===this.length?t+=67108864*this.words[1]:3===this.length&&1===this.words[2]?t+=4503599627370496+67108864*this.words[1]:this.length>2&&n(!1,"Number can only safely store up to 53 bits"),0!==this.negative?-t:t},a.prototype.toJSON=function(){return this.toString(16)},a.prototype.toBuffer=function(t,e){return n("undefined"!=typeof o),this.toArrayLike(o,t,e)},a.prototype.toArray=function(t,e){return this.toArrayLike(Array,t,e)},a.prototype.toArrayLike=function(t,e,r){var i=this.byteLength(),a=r||Math.max(1,i);n(i<=a,"byte array longer than desired length"),n(a>0,"Requested array length <= 0"),this.strip();var o,s,l="le"===e,c=new t(a),u=this.clone();if(l){for(s=0;!u.isZero();s++)o=u.andln(255),u.iushrn(8),c[s]=o;for(;s<a;s++)c[s]=0}else{for(s=0;s<a-i;s++)c[s]=0;for(s=0;!u.isZero();s++)o=u.andln(255),u.iushrn(8),c[a-s-1]=o}return c},Math.clz32?a.prototype._countBits=function(t){return 32-Math.clz32(t)}:a.prototype._countBits=function(t){var e=t,r=0;return e>=4096&&(r+=13,e>>>=13),e>=64&&(r+=7,e>>>=7),e>=8&&(r+=4,e>>>=4),e>=2&&(r+=2,e>>>=2),r+e},a.prototype._zeroBits=function(t){if(0===t)return 26;var e=t,r=0;return 0==(8191&e)&&(r+=13,e>>>=13),0==(127&e)&&(r+=7,e>>>=7),0==(15&e)&&(r+=4,e>>>=4),0==(3&e)&&(r+=2,e>>>=2),0==(1&e)&&r++,r},a.prototype.bitLength=function(){var t=this.words[this.length-1],e=this._countBits(t);return 26*(this.length-1)+e},a.prototype.zeroBits=function(){if(this.isZero())return 0;for(var t=0,e=0;e<this.length;e++){var r=this._zeroBits(this.words[e]);if(t+=r,26!==r)break}return t},a.prototype.byteLength=function(){return Math.ceil(this.bitLength()/8)},a.prototype.toTwos=function(t){return 0!==this.negative?this.abs().inotn(t).iaddn(1):this.clone()},a.prototype.fromTwos=function(t){return this.testn(t-1)?this.notn(t).iaddn(1).ineg():this.clone()},a.prototype.isNeg=function(){return 0!==this.negative},a.prototype.neg=function(){return this.clone().ineg()},a.prototype.ineg=function(){return this.isZero()||(this.negative^=1),this},a.prototype.iuor=function(t){for(;this.length<t.length;)this.words[this.length++]=0;for(var e=0;e<t.length;e++)this.words[e]=this.words[e]|t.words[e];return this.strip()},a.prototype.ior=function(t){return n(0==(this.negative|t.negative)),this.iuor(t)},a.prototype.or=function(t){return this.length>t.length?this.clone().ior(t):t.clone().ior(this)},a.prototype.uor=function(t){return this.length>t.length?this.clone().iuor(t):t.clone().iuor(this)},a.prototype.iuand=function(t){var e;e=this.length>t.length?t:this;for(var r=0;r<e.length;r++)this.words[r]=this.words[r]&t.words[r];return this.length=e.length,this.strip()},a.prototype.iand=function(t){return n(0==(this.negative|t.negative)),this.iuand(t)},a.prototype.and=function(t){return this.length>t.length?this.clone().iand(t):t.clone().iand(this)},a.prototype.uand=function(t){return this.length>t.length?this.clone().iuand(t):t.clone().iuand(this)},a.prototype.iuxor=function(t){var e,r;this.length>t.length?(e=this,r=t):(e=t,r=this);for(var n=0;n<r.length;n++)this.words[n]=e.words[n]^r.words[n];if(this!==e)for(;n<e.length;n++)this.words[n]=e.words[n];return this.length=e.length,this.strip()},a.prototype.ixor=function(t){return n(0==(this.negative|t.negative)),this.iuxor(t)},a.prototype.xor=function(t){return this.length>t.length?this.clone().ixor(t):t.clone().ixor(this)},a.prototype.uxor=function(t){return this.length>t.length?this.clone().iuxor(t):t.clone().iuxor(this)},a.prototype.inotn=function(t){n("number"==typeof t&&t>=0);var e=0|Math.ceil(t/26),r=t%26;this._expand(e),r>0&&e--;for(var i=0;i<e;i++)this.words[i]=67108863&~this.words[i];return r>0&&(this.words[i]=~this.words[i]&67108863>>26-r),this.strip()},a.prototype.notn=function(t){return this.clone().inotn(t)},a.prototype.setn=function(t,e){n("number"==typeof t&&t>=0);var r=t/26|0,i=t%26;return this._expand(r+1),this.words[r]=e?this.words[r]|1<<i:this.words[r]&~(1<<i),this.strip()},a.prototype.iadd=function(t){var e,r,n;if(0!==this.negative&&0===t.negative)return this.negative=0,e=this.isub(t),this.negative^=1,this._normSign();if(0===this.negative&&0!==t.negative)return t.negative=0,e=this.isub(t),t.negative=1,e._normSign();this.length>t.length?(r=this,n=t):(r=t,n=this);for(var i=0,a=0;a<n.length;a++)e=(0|r.words[a])+(0|n.words[a])+i,this.words[a]=67108863&e,i=e>>>26;for(;0!==i&&a<r.length;a++)e=(0|r.words[a])+i,this.words[a]=67108863&e,i=e>>>26;if(this.length=r.length,0!==i)this.words[this.length]=i,this.length++;else if(r!==this)for(;a<r.length;a++)this.words[a]=r.words[a];return this},a.prototype.add=function(t){var e;return 0!==t.negative&&0===this.negative?(t.negative=0,e=this.sub(t),t.negative^=1,e):0===t.negative&&0!==this.negative?(this.negative=0,e=t.sub(this),this.negative=1,e):this.length>t.length?this.clone().iadd(t):t.clone().iadd(this)},a.prototype.isub=function(t){if(0!==t.negative){t.negative=0;var e=this.iadd(t);return t.negative=1,e._normSign()}if(0!==this.negative)return this.negative=0,this.iadd(t),this.negative=1,this._normSign();var r,n,i=this.cmp(t);if(0===i)return this.negative=0,this.length=1,this.words[0]=0,this;i>0?(r=this,n=t):(r=t,n=this);for(var a=0,o=0;o<n.length;o++)a=(e=(0|r.words[o])-(0|n.words[o])+a)>>26,this.words[o]=67108863&e;for(;0!==a&&o<r.length;o++)a=(e=(0|r.words[o])+a)>>26,this.words[o]=67108863&e;if(0===a&&o<r.length&&r!==this)for(;o<r.length;o++)this.words[o]=r.words[o];return this.length=Math.max(this.length,o),r!==this&&(this.negative=1),this.strip()},a.prototype.sub=function(t){return this.clone().isub(t)};var p=function(t,e,r){var n,i,a,o=t.words,s=e.words,l=r.words,c=0,u=0|o[0],h=8191&u,f=u>>>13,p=0|o[1],d=8191&p,g=p>>>13,m=0|o[2],v=8191&m,y=m>>>13,x=0|o[3],b=8191&x,_=x>>>13,w=0|o[4],k=8191&w,M=w>>>13,A=0|o[5],T=8191&A,S=A>>>13,E=0|o[6],C=8191&E,L=E>>>13,z=0|o[7],P=8191&z,I=z>>>13,O=0|o[8],D=8191&O,R=O>>>13,B=0|o[9],F=8191&B,N=B>>>13,j=0|s[0],V=8191&j,U=j>>>13,q=0|s[1],H=8191&q,G=q>>>13,W=0|s[2],Y=8191&W,X=W>>>13,Z=0|s[3],$=8191&Z,J=Z>>>13,K=0|s[4],Q=8191&K,tt=K>>>13,et=0|s[5],rt=8191&et,nt=et>>>13,it=0|s[6],at=8191&it,ot=it>>>13,st=0|s[7],lt=8191&st,ct=st>>>13,ut=0|s[8],ht=8191&ut,ft=ut>>>13,pt=0|s[9],dt=8191&pt,gt=pt>>>13;r.negative=t.negative^e.negative,r.length=19;var mt=(c+(n=Math.imul(h,V))|0)+((8191&(i=(i=Math.imul(h,U))+Math.imul(f,V)|0))<<13)|0;c=((a=Math.imul(f,U))+(i>>>13)|0)+(mt>>>26)|0,mt&=67108863,n=Math.imul(d,V),i=(i=Math.imul(d,U))+Math.imul(g,V)|0,a=Math.imul(g,U);var vt=(c+(n=n+Math.imul(h,H)|0)|0)+((8191&(i=(i=i+Math.imul(h,G)|0)+Math.imul(f,H)|0))<<13)|0;c=((a=a+Math.imul(f,G)|0)+(i>>>13)|0)+(vt>>>26)|0,vt&=67108863,n=Math.imul(v,V),i=(i=Math.imul(v,U))+Math.imul(y,V)|0,a=Math.imul(y,U),n=n+Math.imul(d,H)|0,i=(i=i+Math.imul(d,G)|0)+Math.imul(g,H)|0,a=a+Math.imul(g,G)|0;var yt=(c+(n=n+Math.imul(h,Y)|0)|0)+((8191&(i=(i=i+Math.imul(h,X)|0)+Math.imul(f,Y)|0))<<13)|0;c=((a=a+Math.imul(f,X)|0)+(i>>>13)|0)+(yt>>>26)|0,yt&=67108863,n=Math.imul(b,V),i=(i=Math.imul(b,U))+Math.imul(_,V)|0,a=Math.imul(_,U),n=n+Math.imul(v,H)|0,i=(i=i+Math.imul(v,G)|0)+Math.imul(y,H)|0,a=a+Math.imul(y,G)|0,n=n+Math.imul(d,Y)|0,i=(i=i+Math.imul(d,X)|0)+Math.imul(g,Y)|0,a=a+Math.imul(g,X)|0;var xt=(c+(n=n+Math.imul(h,$)|0)|0)+((8191&(i=(i=i+Math.imul(h,J)|0)+Math.imul(f,$)|0))<<13)|0;c=((a=a+Math.imul(f,J)|0)+(i>>>13)|0)+(xt>>>26)|0,xt&=67108863,n=Math.imul(k,V),i=(i=Math.imul(k,U))+Math.imul(M,V)|0,a=Math.imul(M,U),n=n+Math.imul(b,H)|0,i=(i=i+Math.imul(b,G)|0)+Math.imul(_,H)|0,a=a+Math.imul(_,G)|0,n=n+Math.imul(v,Y)|0,i=(i=i+Math.imul(v,X)|0)+Math.imul(y,Y)|0,a=a+Math.imul(y,X)|0,n=n+Math.imul(d,$)|0,i=(i=i+Math.imul(d,J)|0)+Math.imul(g,$)|0,a=a+Math.imul(g,J)|0;var bt=(c+(n=n+Math.imul(h,Q)|0)|0)+((8191&(i=(i=i+Math.imul(h,tt)|0)+Math.imul(f,Q)|0))<<13)|0;c=((a=a+Math.imul(f,tt)|0)+(i>>>13)|0)+(bt>>>26)|0,bt&=67108863,n=Math.imul(T,V),i=(i=Math.imul(T,U))+Math.imul(S,V)|0,a=Math.imul(S,U),n=n+Math.imul(k,H)|0,i=(i=i+Math.imul(k,G)|0)+Math.imul(M,H)|0,a=a+Math.imul(M,G)|0,n=n+Math.imul(b,Y)|0,i=(i=i+Math.imul(b,X)|0)+Math.imul(_,Y)|0,a=a+Math.imul(_,X)|0,n=n+Math.imul(v,$)|0,i=(i=i+Math.imul(v,J)|0)+Math.imul(y,$)|0,a=a+Math.imul(y,J)|0,n=n+Math.imul(d,Q)|0,i=(i=i+Math.imul(d,tt)|0)+Math.imul(g,Q)|0,a=a+Math.imul(g,tt)|0;var _t=(c+(n=n+Math.imul(h,rt)|0)|0)+((8191&(i=(i=i+Math.imul(h,nt)|0)+Math.imul(f,rt)|0))<<13)|0;c=((a=a+Math.imul(f,nt)|0)+(i>>>13)|0)+(_t>>>26)|0,_t&=67108863,n=Math.imul(C,V),i=(i=Math.imul(C,U))+Math.imul(L,V)|0,a=Math.imul(L,U),n=n+Math.imul(T,H)|0,i=(i=i+Math.imul(T,G)|0)+Math.imul(S,H)|0,a=a+Math.imul(S,G)|0,n=n+Math.imul(k,Y)|0,i=(i=i+Math.imul(k,X)|0)+Math.imul(M,Y)|0,a=a+Math.imul(M,X)|0,n=n+Math.imul(b,$)|0,i=(i=i+Math.imul(b,J)|0)+Math.imul(_,$)|0,a=a+Math.imul(_,J)|0,n=n+Math.imul(v,Q)|0,i=(i=i+Math.imul(v,tt)|0)+Math.imul(y,Q)|0,a=a+Math.imul(y,tt)|0,n=n+Math.imul(d,rt)|0,i=(i=i+Math.imul(d,nt)|0)+Math.imul(g,rt)|0,a=a+Math.imul(g,nt)|0;var wt=(c+(n=n+Math.imul(h,at)|0)|0)+((8191&(i=(i=i+Math.imul(h,ot)|0)+Math.imul(f,at)|0))<<13)|0;c=((a=a+Math.imul(f,ot)|0)+(i>>>13)|0)+(wt>>>26)|0,wt&=67108863,n=Math.imul(P,V),i=(i=Math.imul(P,U))+Math.imul(I,V)|0,a=Math.imul(I,U),n=n+Math.imul(C,H)|0,i=(i=i+Math.imul(C,G)|0)+Math.imul(L,H)|0,a=a+Math.imul(L,G)|0,n=n+Math.imul(T,Y)|0,i=(i=i+Math.imul(T,X)|0)+Math.imul(S,Y)|0,a=a+Math.imul(S,X)|0,n=n+Math.imul(k,$)|0,i=(i=i+Math.imul(k,J)|0)+Math.imul(M,$)|0,a=a+Math.imul(M,J)|0,n=n+Math.imul(b,Q)|0,i=(i=i+Math.imul(b,tt)|0)+Math.imul(_,Q)|0,a=a+Math.imul(_,tt)|0,n=n+Math.imul(v,rt)|0,i=(i=i+Math.imul(v,nt)|0)+Math.imul(y,rt)|0,a=a+Math.imul(y,nt)|0,n=n+Math.imul(d,at)|0,i=(i=i+Math.imul(d,ot)|0)+Math.imul(g,at)|0,a=a+Math.imul(g,ot)|0;var kt=(c+(n=n+Math.imul(h,lt)|0)|0)+((8191&(i=(i=i+Math.imul(h,ct)|0)+Math.imul(f,lt)|0))<<13)|0;c=((a=a+Math.imul(f,ct)|0)+(i>>>13)|0)+(kt>>>26)|0,kt&=67108863,n=Math.imul(D,V),i=(i=Math.imul(D,U))+Math.imul(R,V)|0,a=Math.imul(R,U),n=n+Math.imul(P,H)|0,i=(i=i+Math.imul(P,G)|0)+Math.imul(I,H)|0,a=a+Math.imul(I,G)|0,n=n+Math.imul(C,Y)|0,i=(i=i+Math.imul(C,X)|0)+Math.imul(L,Y)|0,a=a+Math.imul(L,X)|0,n=n+Math.imul(T,$)|0,i=(i=i+Math.imul(T,J)|0)+Math.imul(S,$)|0,a=a+Math.imul(S,J)|0,n=n+Math.imul(k,Q)|0,i=(i=i+Math.imul(k,tt)|0)+Math.imul(M,Q)|0,a=a+Math.imul(M,tt)|0,n=n+Math.imul(b,rt)|0,i=(i=i+Math.imul(b,nt)|0)+Math.imul(_,rt)|0,a=a+Math.imul(_,nt)|0,n=n+Math.imul(v,at)|0,i=(i=i+Math.imul(v,ot)|0)+Math.imul(y,at)|0,a=a+Math.imul(y,ot)|0,n=n+Math.imul(d,lt)|0,i=(i=i+Math.imul(d,ct)|0)+Math.imul(g,lt)|0,a=a+Math.imul(g,ct)|0;var Mt=(c+(n=n+Math.imul(h,ht)|0)|0)+((8191&(i=(i=i+Math.imul(h,ft)|0)+Math.imul(f,ht)|0))<<13)|0;c=((a=a+Math.imul(f,ft)|0)+(i>>>13)|0)+(Mt>>>26)|0,Mt&=67108863,n=Math.imul(F,V),i=(i=Math.imul(F,U))+Math.imul(N,V)|0,a=Math.imul(N,U),n=n+Math.imul(D,H)|0,i=(i=i+Math.imul(D,G)|0)+Math.imul(R,H)|0,a=a+Math.imul(R,G)|0,n=n+Math.imul(P,Y)|0,i=(i=i+Math.imul(P,X)|0)+Math.imul(I,Y)|0,a=a+Math.imul(I,X)|0,n=n+Math.imul(C,$)|0,i=(i=i+Math.imul(C,J)|0)+Math.imul(L,$)|0,a=a+Math.imul(L,J)|0,n=n+Math.imul(T,Q)|0,i=(i=i+Math.imul(T,tt)|0)+Math.imul(S,Q)|0,a=a+Math.imul(S,tt)|0,n=n+Math.imul(k,rt)|0,i=(i=i+Math.imul(k,nt)|0)+Math.imul(M,rt)|0,a=a+Math.imul(M,nt)|0,n=n+Math.imul(b,at)|0,i=(i=i+Math.imul(b,ot)|0)+Math.imul(_,at)|0,a=a+Math.imul(_,ot)|0,n=n+Math.imul(v,lt)|0,i=(i=i+Math.imul(v,ct)|0)+Math.imul(y,lt)|0,a=a+Math.imul(y,ct)|0,n=n+Math.imul(d,ht)|0,i=(i=i+Math.imul(d,ft)|0)+Math.imul(g,ht)|0,a=a+Math.imul(g,ft)|0;var At=(c+(n=n+Math.imul(h,dt)|0)|0)+((8191&(i=(i=i+Math.imul(h,gt)|0)+Math.imul(f,dt)|0))<<13)|0;c=((a=a+Math.imul(f,gt)|0)+(i>>>13)|0)+(At>>>26)|0,At&=67108863,n=Math.imul(F,H),i=(i=Math.imul(F,G))+Math.imul(N,H)|0,a=Math.imul(N,G),n=n+Math.imul(D,Y)|0,i=(i=i+Math.imul(D,X)|0)+Math.imul(R,Y)|0,a=a+Math.imul(R,X)|0,n=n+Math.imul(P,$)|0,i=(i=i+Math.imul(P,J)|0)+Math.imul(I,$)|0,a=a+Math.imul(I,J)|0,n=n+Math.imul(C,Q)|0,i=(i=i+Math.imul(C,tt)|0)+Math.imul(L,Q)|0,a=a+Math.imul(L,tt)|0,n=n+Math.imul(T,rt)|0,i=(i=i+Math.imul(T,nt)|0)+Math.imul(S,rt)|0,a=a+Math.imul(S,nt)|0,n=n+Math.imul(k,at)|0,i=(i=i+Math.imul(k,ot)|0)+Math.imul(M,at)|0,a=a+Math.imul(M,ot)|0,n=n+Math.imul(b,lt)|0,i=(i=i+Math.imul(b,ct)|0)+Math.imul(_,lt)|0,a=a+Math.imul(_,ct)|0,n=n+Math.imul(v,ht)|0,i=(i=i+Math.imul(v,ft)|0)+Math.imul(y,ht)|0,a=a+Math.imul(y,ft)|0;var Tt=(c+(n=n+Math.imul(d,dt)|0)|0)+((8191&(i=(i=i+Math.imul(d,gt)|0)+Math.imul(g,dt)|0))<<13)|0;c=((a=a+Math.imul(g,gt)|0)+(i>>>13)|0)+(Tt>>>26)|0,Tt&=67108863,n=Math.imul(F,Y),i=(i=Math.imul(F,X))+Math.imul(N,Y)|0,a=Math.imul(N,X),n=n+Math.imul(D,$)|0,i=(i=i+Math.imul(D,J)|0)+Math.imul(R,$)|0,a=a+Math.imul(R,J)|0,n=n+Math.imul(P,Q)|0,i=(i=i+Math.imul(P,tt)|0)+Math.imul(I,Q)|0,a=a+Math.imul(I,tt)|0,n=n+Math.imul(C,rt)|0,i=(i=i+Math.imul(C,nt)|0)+Math.imul(L,rt)|0,a=a+Math.imul(L,nt)|0,n=n+Math.imul(T,at)|0,i=(i=i+Math.imul(T,ot)|0)+Math.imul(S,at)|0,a=a+Math.imul(S,ot)|0,n=n+Math.imul(k,lt)|0,i=(i=i+Math.imul(k,ct)|0)+Math.imul(M,lt)|0,a=a+Math.imul(M,ct)|0,n=n+Math.imul(b,ht)|0,i=(i=i+Math.imul(b,ft)|0)+Math.imul(_,ht)|0,a=a+Math.imul(_,ft)|0;var St=(c+(n=n+Math.imul(v,dt)|0)|0)+((8191&(i=(i=i+Math.imul(v,gt)|0)+Math.imul(y,dt)|0))<<13)|0;c=((a=a+Math.imul(y,gt)|0)+(i>>>13)|0)+(St>>>26)|0,St&=67108863,n=Math.imul(F,$),i=(i=Math.imul(F,J))+Math.imul(N,$)|0,a=Math.imul(N,J),n=n+Math.imul(D,Q)|0,i=(i=i+Math.imul(D,tt)|0)+Math.imul(R,Q)|0,a=a+Math.imul(R,tt)|0,n=n+Math.imul(P,rt)|0,i=(i=i+Math.imul(P,nt)|0)+Math.imul(I,rt)|0,a=a+Math.imul(I,nt)|0,n=n+Math.imul(C,at)|0,i=(i=i+Math.imul(C,ot)|0)+Math.imul(L,at)|0,a=a+Math.imul(L,ot)|0,n=n+Math.imul(T,lt)|0,i=(i=i+Math.imul(T,ct)|0)+Math.imul(S,lt)|0,a=a+Math.imul(S,ct)|0,n=n+Math.imul(k,ht)|0,i=(i=i+Math.imul(k,ft)|0)+Math.imul(M,ht)|0,a=a+Math.imul(M,ft)|0;var Et=(c+(n=n+Math.imul(b,dt)|0)|0)+((8191&(i=(i=i+Math.imul(b,gt)|0)+Math.imul(_,dt)|0))<<13)|0;c=((a=a+Math.imul(_,gt)|0)+(i>>>13)|0)+(Et>>>26)|0,Et&=67108863,n=Math.imul(F,Q),i=(i=Math.imul(F,tt))+Math.imul(N,Q)|0,a=Math.imul(N,tt),n=n+Math.imul(D,rt)|0,i=(i=i+Math.imul(D,nt)|0)+Math.imul(R,rt)|0,a=a+Math.imul(R,nt)|0,n=n+Math.imul(P,at)|0,i=(i=i+Math.imul(P,ot)|0)+Math.imul(I,at)|0,a=a+Math.imul(I,ot)|0,n=n+Math.imul(C,lt)|0,i=(i=i+Math.imul(C,ct)|0)+Math.imul(L,lt)|0,a=a+Math.imul(L,ct)|0,n=n+Math.imul(T,ht)|0,i=(i=i+Math.imul(T,ft)|0)+Math.imul(S,ht)|0,a=a+Math.imul(S,ft)|0;var Ct=(c+(n=n+Math.imul(k,dt)|0)|0)+((8191&(i=(i=i+Math.imul(k,gt)|0)+Math.imul(M,dt)|0))<<13)|0;c=((a=a+Math.imul(M,gt)|0)+(i>>>13)|0)+(Ct>>>26)|0,Ct&=67108863,n=Math.imul(F,rt),i=(i=Math.imul(F,nt))+Math.imul(N,rt)|0,a=Math.imul(N,nt),n=n+Math.imul(D,at)|0,i=(i=i+Math.imul(D,ot)|0)+Math.imul(R,at)|0,a=a+Math.imul(R,ot)|0,n=n+Math.imul(P,lt)|0,i=(i=i+Math.imul(P,ct)|0)+Math.imul(I,lt)|0,a=a+Math.imul(I,ct)|0,n=n+Math.imul(C,ht)|0,i=(i=i+Math.imul(C,ft)|0)+Math.imul(L,ht)|0,a=a+Math.imul(L,ft)|0;var Lt=(c+(n=n+Math.imul(T,dt)|0)|0)+((8191&(i=(i=i+Math.imul(T,gt)|0)+Math.imul(S,dt)|0))<<13)|0;c=((a=a+Math.imul(S,gt)|0)+(i>>>13)|0)+(Lt>>>26)|0,Lt&=67108863,n=Math.imul(F,at),i=(i=Math.imul(F,ot))+Math.imul(N,at)|0,a=Math.imul(N,ot),n=n+Math.imul(D,lt)|0,i=(i=i+Math.imul(D,ct)|0)+Math.imul(R,lt)|0,a=a+Math.imul(R,ct)|0,n=n+Math.imul(P,ht)|0,i=(i=i+Math.imul(P,ft)|0)+Math.imul(I,ht)|0,a=a+Math.imul(I,ft)|0;var zt=(c+(n=n+Math.imul(C,dt)|0)|0)+((8191&(i=(i=i+Math.imul(C,gt)|0)+Math.imul(L,dt)|0))<<13)|0;c=((a=a+Math.imul(L,gt)|0)+(i>>>13)|0)+(zt>>>26)|0,zt&=67108863,n=Math.imul(F,lt),i=(i=Math.imul(F,ct))+Math.imul(N,lt)|0,a=Math.imul(N,ct),n=n+Math.imul(D,ht)|0,i=(i=i+Math.imul(D,ft)|0)+Math.imul(R,ht)|0,a=a+Math.imul(R,ft)|0;var Pt=(c+(n=n+Math.imul(P,dt)|0)|0)+((8191&(i=(i=i+Math.imul(P,gt)|0)+Math.imul(I,dt)|0))<<13)|0;c=((a=a+Math.imul(I,gt)|0)+(i>>>13)|0)+(Pt>>>26)|0,Pt&=67108863,n=Math.imul(F,ht),i=(i=Math.imul(F,ft))+Math.imul(N,ht)|0,a=Math.imul(N,ft);var It=(c+(n=n+Math.imul(D,dt)|0)|0)+((8191&(i=(i=i+Math.imul(D,gt)|0)+Math.imul(R,dt)|0))<<13)|0;c=((a=a+Math.imul(R,gt)|0)+(i>>>13)|0)+(It>>>26)|0,It&=67108863;var Ot=(c+(n=Math.imul(F,dt))|0)+((8191&(i=(i=Math.imul(F,gt))+Math.imul(N,dt)|0))<<13)|0;return c=((a=Math.imul(N,gt))+(i>>>13)|0)+(Ot>>>26)|0,Ot&=67108863,l[0]=mt,l[1]=vt,l[2]=yt,l[3]=xt,l[4]=bt,l[5]=_t,l[6]=wt,l[7]=kt,l[8]=Mt,l[9]=At,l[10]=Tt,l[11]=St,l[12]=Et,l[13]=Ct,l[14]=Lt,l[15]=zt,l[16]=Pt,l[17]=It,l[18]=Ot,0!==c&&(l[19]=c,r.length++),r};function d(t,e,r){return(new g).mulp(t,e,r)}function g(t,e){this.x=t,this.y=e}Math.imul||(p=f),a.prototype.mulTo=function(t,e){var r=this.length+t.length;return 10===this.length&&10===t.length?p(this,t,e):r<63?f(this,t,e):r<1024?function(t,e,r){r.negative=e.negative^t.negative,r.length=t.length+e.length;for(var n=0,i=0,a=0;a<r.length-1;a++){var o=i;i=0;for(var s=67108863&n,l=Math.min(a,e.length-1),c=Math.max(0,a-t.length+1);c<=l;c++){var u=a-c,h=(0|t.words[u])*(0|e.words[c]),f=67108863&h;s=67108863&(f=f+s|0),i+=(o=(o=o+(h/67108864|0)|0)+(f>>>26)|0)>>>26,o&=67108863}r.words[a]=s,n=o,o=i}return 0!==n?r.words[a]=n:r.length--,r.strip()}(this,t,e):d(this,t,e)},g.prototype.makeRBT=function(t){for(var e=new Array(t),r=a.prototype._countBits(t)-1,n=0;n<t;n++)e[n]=this.revBin(n,r,t);return e},g.prototype.revBin=function(t,e,r){if(0===t||t===r-1)return t;for(var n=0,i=0;i<e;i++)n|=(1&t)<<e-i-1,t>>=1;return n},g.prototype.permute=function(t,e,r,n,i,a){for(var o=0;o<a;o++)n[o]=e[t[o]],i[o]=r[t[o]]},g.prototype.transform=function(t,e,r,n,i,a){this.permute(a,t,e,r,n,i);for(var o=1;o<i;o<<=1)for(var s=o<<1,l=Math.cos(2*Math.PI/s),c=Math.sin(2*Math.PI/s),u=0;u<i;u+=s)for(var h=l,f=c,p=0;p<o;p++){var d=r[u+p],g=n[u+p],m=r[u+p+o],v=n[u+p+o],y=h*m-f*v;v=h*v+f*m,m=y,r[u+p]=d+m,n[u+p]=g+v,r[u+p+o]=d-m,n[u+p+o]=g-v,p!==s&&(y=l*h-c*f,f=l*f+c*h,h=y)}},g.prototype.guessLen13b=function(t,e){var r=1|Math.max(e,t),n=1&r,i=0;for(r=r/2|0;r;r>>>=1)i++;return 1<<i+1+n},g.prototype.conjugate=function(t,e,r){if(!(r<=1))for(var n=0;n<r/2;n++){var i=t[n];t[n]=t[r-n-1],t[r-n-1]=i,i=e[n],e[n]=-e[r-n-1],e[r-n-1]=-i}},g.prototype.normalize13b=function(t,e){for(var r=0,n=0;n<e/2;n++){var i=8192*Math.round(t[2*n+1]/e)+Math.round(t[2*n]/e)+r;t[n]=67108863&i,r=i<67108864?0:i/67108864|0}return t},g.prototype.convert13b=function(t,e,r,i){for(var a=0,o=0;o<e;o++)a+=0|t[o],r[2*o]=8191&a,a>>>=13,r[2*o+1]=8191&a,a>>>=13;for(o=2*e;o<i;++o)r[o]=0;n(0===a),n(0==(-8192&a))},g.prototype.stub=function(t){for(var e=new Array(t),r=0;r<t;r++)e[r]=0;return e},g.prototype.mulp=function(t,e,r){var n=2*this.guessLen13b(t.length,e.length),i=this.makeRBT(n),a=this.stub(n),o=new Array(n),s=new Array(n),l=new Array(n),c=new Array(n),u=new Array(n),h=new Array(n),f=r.words;f.length=n,this.convert13b(t.words,t.length,o,n),this.convert13b(e.words,e.length,c,n),this.transform(o,a,s,l,n,i),this.transform(c,a,u,h,n,i);for(var p=0;p<n;p++){var d=s[p]*u[p]-l[p]*h[p];l[p]=s[p]*h[p]+l[p]*u[p],s[p]=d}return this.conjugate(s,l,n),this.transform(s,l,f,a,n,i),this.conjugate(f,a,n),this.normalize13b(f,n),r.negative=t.negative^e.negative,r.length=t.length+e.length,r.strip()},a.prototype.mul=function(t){var e=new a(null);return e.words=new Array(this.length+t.length),this.mulTo(t,e)},a.prototype.mulf=function(t){var e=new a(null);return e.words=new Array(this.length+t.length),d(this,t,e)},a.prototype.imul=function(t){return this.clone().mulTo(t,this)},a.prototype.imuln=function(t){n("number"==typeof t),n(t<67108864);for(var e=0,r=0;r<this.length;r++){var i=(0|this.words[r])*t,a=(67108863&i)+(67108863&e);e>>=26,e+=i/67108864|0,e+=a>>>26,this.words[r]=67108863&a}return 0!==e&&(this.words[r]=e,this.length++),this},a.prototype.muln=function(t){return this.clone().imuln(t)},a.prototype.sqr=function(){return this.mul(this)},a.prototype.isqr=function(){return this.imul(this.clone())},a.prototype.pow=function(t){var e=function(t){for(var e=new Array(t.bitLength()),r=0;r<e.length;r++){var n=r/26|0,i=r%26;e[r]=(t.words[n]&1<<i)>>>i}return e}(t);if(0===e.length)return new a(1);for(var r=this,n=0;n<e.length&&0===e[n];n++,r=r.sqr());if(++n<e.length)for(var i=r.sqr();n<e.length;n++,i=i.sqr())0!==e[n]&&(r=r.mul(i));return r},a.prototype.iushln=function(t){n("number"==typeof t&&t>=0);var e,r=t%26,i=(t-r)/26,a=67108863>>>26-r<<26-r;if(0!==r){var o=0;for(e=0;e<this.length;e++){var s=this.words[e]&a,l=(0|this.words[e])-s<<r;this.words[e]=l|o,o=s>>>26-r}o&&(this.words[e]=o,this.length++)}if(0!==i){for(e=this.length-1;e>=0;e--)this.words[e+i]=this.words[e];for(e=0;e<i;e++)this.words[e]=0;this.length+=i}return this.strip()},a.prototype.ishln=function(t){return n(0===this.negative),this.iushln(t)},a.prototype.iushrn=function(t,e,r){var i;n("number"==typeof t&&t>=0),i=e?(e-e%26)/26:0;var a=t%26,o=Math.min((t-a)/26,this.length),s=67108863^67108863>>>a<<a,l=r;if(i-=o,i=Math.max(0,i),l){for(var c=0;c<o;c++)l.words[c]=this.words[c];l.length=o}if(0===o);else if(this.length>o)for(this.length-=o,c=0;c<this.length;c++)this.words[c]=this.words[c+o];else this.words[0]=0,this.length=1;var u=0;for(c=this.length-1;c>=0&&(0!==u||c>=i);c--){var h=0|this.words[c];this.words[c]=u<<26-a|h>>>a,u=h&s}return l&&0!==u&&(l.words[l.length++]=u),0===this.length&&(this.words[0]=0,this.length=1),this.strip()},a.prototype.ishrn=function(t,e,r){return n(0===this.negative),this.iushrn(t,e,r)},a.prototype.shln=function(t){return this.clone().ishln(t)},a.prototype.ushln=function(t){return this.clone().iushln(t)},a.prototype.shrn=function(t){return this.clone().ishrn(t)},a.prototype.ushrn=function(t){return this.clone().iushrn(t)},a.prototype.testn=function(t){n("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26,i=1<<e;return!(this.length<=r)&&!!(this.words[r]&i)},a.prototype.imaskn=function(t){n("number"==typeof t&&t>=0);var e=t%26,r=(t-e)/26;if(n(0===this.negative,"imaskn works only with positive numbers"),this.length<=r)return this;if(0!==e&&r++,this.length=Math.min(r,this.length),0!==e){var i=67108863^67108863>>>e<<e;this.words[this.length-1]&=i}return this.strip()},a.prototype.maskn=function(t){return this.clone().imaskn(t)},a.prototype.iaddn=function(t){return n("number"==typeof t),n(t<67108864),t<0?this.isubn(-t):0!==this.negative?1===this.length&&(0|this.words[0])<t?(this.words[0]=t-(0|this.words[0]),this.negative=0,this):(this.negative=0,this.isubn(t),this.negative=1,this):this._iaddn(t)},a.prototype._iaddn=function(t){this.words[0]+=t;for(var e=0;e<this.length&&this.words[e]>=67108864;e++)this.words[e]-=67108864,e===this.length-1?this.words[e+1]=1:this.words[e+1]++;return this.length=Math.max(this.length,e+1),this},a.prototype.isubn=function(t){if(n("number"==typeof t),n(t<67108864),t<0)return this.iaddn(-t);if(0!==this.negative)return this.negative=0,this.iaddn(t),this.negative=1,this;if(this.words[0]-=t,1===this.length&&this.words[0]<0)this.words[0]=-this.words[0],this.negative=1;else for(var e=0;e<this.length&&this.words[e]<0;e++)this.words[e]+=67108864,this.words[e+1]-=1;return this.strip()},a.prototype.addn=function(t){return this.clone().iaddn(t)},a.prototype.subn=function(t){return this.clone().isubn(t)},a.prototype.iabs=function(){return this.negative=0,this},a.prototype.abs=function(){return this.clone().iabs()},a.prototype._ishlnsubmul=function(t,e,r){var i,a,o=t.length+r;this._expand(o);var s=0;for(i=0;i<t.length;i++){a=(0|this.words[i+r])+s;var l=(0|t.words[i])*e;s=((a-=67108863&l)>>26)-(l/67108864|0),this.words[i+r]=67108863&a}for(;i<this.length-r;i++)s=(a=(0|this.words[i+r])+s)>>26,this.words[i+r]=67108863&a;if(0===s)return this.strip();for(n(-1===s),s=0,i=0;i<this.length;i++)s=(a=-(0|this.words[i])+s)>>26,this.words[i]=67108863&a;return this.negative=1,this.strip()},a.prototype._wordDiv=function(t,e){var r=(this.length,t.length),n=this.clone(),i=t,o=0|i.words[i.length-1];0!==(r=26-this._countBits(o))&&(i=i.ushln(r),n.iushln(r),o=0|i.words[i.length-1]);var s,l=n.length-i.length;if("mod"!==e){(s=new a(null)).length=l+1,s.words=new Array(s.length);for(var c=0;c<s.length;c++)s.words[c]=0}var u=n.clone()._ishlnsubmul(i,1,l);0===u.negative&&(n=u,s&&(s.words[l]=1));for(var h=l-1;h>=0;h--){var f=67108864*(0|n.words[i.length+h])+(0|n.words[i.length+h-1]);for(f=Math.min(f/o|0,67108863),n._ishlnsubmul(i,f,h);0!==n.negative;)f--,n.negative=0,n._ishlnsubmul(i,1,h),n.isZero()||(n.negative^=1);s&&(s.words[h]=f)}return s&&s.strip(),n.strip(),"div"!==e&&0!==r&&n.iushrn(r),{div:s||null,mod:n}},a.prototype.divmod=function(t,e,r){return n(!t.isZero()),this.isZero()?{div:new a(0),mod:new a(0)}:0!==this.negative&&0===t.negative?(s=this.neg().divmod(t,e),"mod"!==e&&(i=s.div.neg()),"div"!==e&&(o=s.mod.neg(),r&&0!==o.negative&&o.iadd(t)),{div:i,mod:o}):0===this.negative&&0!==t.negative?(s=this.divmod(t.neg(),e),"mod"!==e&&(i=s.div.neg()),{div:i,mod:s.mod}):0!=(this.negative&t.negative)?(s=this.neg().divmod(t.neg(),e),"div"!==e&&(o=s.mod.neg(),r&&0!==o.negative&&o.isub(t)),{div:s.div,mod:o}):t.length>this.length||this.cmp(t)<0?{div:new a(0),mod:this}:1===t.length?"div"===e?{div:this.divn(t.words[0]),mod:null}:"mod"===e?{div:null,mod:new a(this.modn(t.words[0]))}:{div:this.divn(t.words[0]),mod:new a(this.modn(t.words[0]))}:this._wordDiv(t,e);var i,o,s},a.prototype.div=function(t){return this.divmod(t,"div",!1).div},a.prototype.mod=function(t){return this.divmod(t,"mod",!1).mod},a.prototype.umod=function(t){return this.divmod(t,"mod",!0).mod},a.prototype.divRound=function(t){var e=this.divmod(t);if(e.mod.isZero())return e.div;var r=0!==e.div.negative?e.mod.isub(t):e.mod,n=t.ushrn(1),i=t.andln(1),a=r.cmp(n);return a<0||1===i&&0===a?e.div:0!==e.div.negative?e.div.isubn(1):e.div.iaddn(1)},a.prototype.modn=function(t){n(t<=67108863);for(var e=(1<<26)%t,r=0,i=this.length-1;i>=0;i--)r=(e*r+(0|this.words[i]))%t;return r},a.prototype.idivn=function(t){n(t<=67108863);for(var e=0,r=this.length-1;r>=0;r--){var i=(0|this.words[r])+67108864*e;this.words[r]=i/t|0,e=i%t}return this.strip()},a.prototype.divn=function(t){return this.clone().idivn(t)},a.prototype.egcd=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i=new a(1),o=new a(0),s=new a(0),l=new a(1),c=0;e.isEven()&&r.isEven();)e.iushrn(1),r.iushrn(1),++c;for(var u=r.clone(),h=e.clone();!e.isZero();){for(var f=0,p=1;0==(e.words[0]&p)&&f<26;++f,p<<=1);if(f>0)for(e.iushrn(f);f-- >0;)(i.isOdd()||o.isOdd())&&(i.iadd(u),o.isub(h)),i.iushrn(1),o.iushrn(1);for(var d=0,g=1;0==(r.words[0]&g)&&d<26;++d,g<<=1);if(d>0)for(r.iushrn(d);d-- >0;)(s.isOdd()||l.isOdd())&&(s.iadd(u),l.isub(h)),s.iushrn(1),l.iushrn(1);e.cmp(r)>=0?(e.isub(r),i.isub(s),o.isub(l)):(r.isub(e),s.isub(i),l.isub(o))}return{a:s,b:l,gcd:r.iushln(c)}},a.prototype._invmp=function(t){n(0===t.negative),n(!t.isZero());var e=this,r=t.clone();e=0!==e.negative?e.umod(t):e.clone();for(var i,o=new a(1),s=new a(0),l=r.clone();e.cmpn(1)>0&&r.cmpn(1)>0;){for(var c=0,u=1;0==(e.words[0]&u)&&c<26;++c,u<<=1);if(c>0)for(e.iushrn(c);c-- >0;)o.isOdd()&&o.iadd(l),o.iushrn(1);for(var h=0,f=1;0==(r.words[0]&f)&&h<26;++h,f<<=1);if(h>0)for(r.iushrn(h);h-- >0;)s.isOdd()&&s.iadd(l),s.iushrn(1);e.cmp(r)>=0?(e.isub(r),o.isub(s)):(r.isub(e),s.isub(o))}return(i=0===e.cmpn(1)?o:s).cmpn(0)<0&&i.iadd(t),i},a.prototype.gcd=function(t){if(this.isZero())return t.abs();if(t.isZero())return this.abs();var e=this.clone(),r=t.clone();e.negative=0,r.negative=0;for(var n=0;e.isEven()&&r.isEven();n++)e.iushrn(1),r.iushrn(1);for(;;){for(;e.isEven();)e.iushrn(1);for(;r.isEven();)r.iushrn(1);var i=e.cmp(r);if(i<0){var a=e;e=r,r=a}else if(0===i||0===r.cmpn(1))break;e.isub(r)}return r.iushln(n)},a.prototype.invm=function(t){return this.egcd(t).a.umod(t)},a.prototype.isEven=function(){return 0==(1&this.words[0])},a.prototype.isOdd=function(){return 1==(1&this.words[0])},a.prototype.andln=function(t){return this.words[0]&t},a.prototype.bincn=function(t){n("number"==typeof t);var e=t%26,r=(t-e)/26,i=1<<e;if(this.length<=r)return this._expand(r+1),this.words[r]|=i,this;for(var a=i,o=r;0!==a&&o<this.length;o++){var s=0|this.words[o];a=(s+=a)>>>26,s&=67108863,this.words[o]=s}return 0!==a&&(this.words[o]=a,this.length++),this},a.prototype.isZero=function(){return 1===this.length&&0===this.words[0]},a.prototype.cmpn=function(t){var e,r=t<0;if(0!==this.negative&&!r)return-1;if(0===this.negative&&r)return 1;if(this.strip(),this.length>1)e=1;else{r&&(t=-t),n(t<=67108863,"Number is too big");var i=0|this.words[0];e=i===t?0:i<t?-1:1}return 0!==this.negative?0|-e:e},a.prototype.cmp=function(t){if(0!==this.negative&&0===t.negative)return-1;if(0===this.negative&&0!==t.negative)return 1;var e=this.ucmp(t);return 0!==this.negative?0|-e:e},a.prototype.ucmp=function(t){if(this.length>t.length)return 1;if(this.length<t.length)return-1;for(var e=0,r=this.length-1;r>=0;r--){var n=0|this.words[r],i=0|t.words[r];if(n!==i){n<i?e=-1:n>i&&(e=1);break}}return e},a.prototype.gtn=function(t){return 1===this.cmpn(t)},a.prototype.gt=function(t){return 1===this.cmp(t)},a.prototype.gten=function(t){return this.cmpn(t)>=0},a.prototype.gte=function(t){return this.cmp(t)>=0},a.prototype.ltn=function(t){return-1===this.cmpn(t)},a.prototype.lt=function(t){return-1===this.cmp(t)},a.prototype.lten=function(t){return this.cmpn(t)<=0},a.prototype.lte=function(t){return this.cmp(t)<=0},a.prototype.eqn=function(t){return 0===this.cmpn(t)},a.prototype.eq=function(t){return 0===this.cmp(t)},a.red=function(t){return new w(t)},a.prototype.toRed=function(t){return n(!this.red,"Already a number in reduction context"),n(0===this.negative,"red works only with positives"),t.convertTo(this)._forceRed(t)},a.prototype.fromRed=function(){return n(this.red,"fromRed works only with numbers in reduction context"),this.red.convertFrom(this)},a.prototype._forceRed=function(t){return this.red=t,this},a.prototype.forceRed=function(t){return n(!this.red,"Already a number in reduction context"),this._forceRed(t)},a.prototype.redAdd=function(t){return n(this.red,"redAdd works only with red numbers"),this.red.add(this,t)},a.prototype.redIAdd=function(t){return n(this.red,"redIAdd works only with red numbers"),this.red.iadd(this,t)},a.prototype.redSub=function(t){return n(this.red,"redSub works only with red numbers"),this.red.sub(this,t)},a.prototype.redISub=function(t){return n(this.red,"redISub works only with red numbers"),this.red.isub(this,t)},a.prototype.redShl=function(t){return n(this.red,"redShl works only with red numbers"),this.red.shl(this,t)},a.prototype.redMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.mul(this,t)},a.prototype.redIMul=function(t){return n(this.red,"redMul works only with red numbers"),this.red._verify2(this,t),this.red.imul(this,t)},a.prototype.redSqr=function(){return n(this.red,"redSqr works only with red numbers"),this.red._verify1(this),this.red.sqr(this)},a.prototype.redISqr=function(){return n(this.red,"redISqr works only with red numbers"),this.red._verify1(this),this.red.isqr(this)},a.prototype.redSqrt=function(){return n(this.red,"redSqrt works only with red numbers"),this.red._verify1(this),this.red.sqrt(this)},a.prototype.redInvm=function(){return n(this.red,"redInvm works only with red numbers"),this.red._verify1(this),this.red.invm(this)},a.prototype.redNeg=function(){return n(this.red,"redNeg works only with red numbers"),this.red._verify1(this),this.red.neg(this)},a.prototype.redPow=function(t){return n(this.red&&!t.red,"redPow(normalNum)"),this.red._verify1(this),this.red.pow(this,t)};var m={k256:null,p224:null,p192:null,p25519:null};function v(t,e){this.name=t,this.p=new a(e,16),this.n=this.p.bitLength(),this.k=new a(1).iushln(this.n).isub(this.p),this.tmp=this._tmp()}function y(){v.call(this,"k256","ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff fffffffe fffffc2f")}function x(){v.call(this,"p224","ffffffff ffffffff ffffffff ffffffff 00000000 00000000 00000001")}function b(){v.call(this,"p192","ffffffff ffffffff ffffffff fffffffe ffffffff ffffffff")}function _(){v.call(this,"25519","7fffffffffffffff ffffffffffffffff ffffffffffffffff ffffffffffffffed")}function w(t){if("string"==typeof t){var e=a._prime(t);this.m=e.p,this.prime=e}else n(t.gtn(1),"modulus must be greater than 1"),this.m=t,this.prime=null}function k(t){w.call(this,t),this.shift=this.m.bitLength(),this.shift%26!=0&&(this.shift+=26-this.shift%26),this.r=new a(1).iushln(this.shift),this.r2=this.imod(this.r.sqr()),this.rinv=this.r._invmp(this.m),this.minv=this.rinv.mul(this.r).isubn(1).div(this.m),this.minv=this.minv.umod(this.r),this.minv=this.r.sub(this.minv)}v.prototype._tmp=function(){var t=new a(null);return t.words=new Array(Math.ceil(this.n/13)),t},v.prototype.ireduce=function(t){var e,r=t;do{this.split(r,this.tmp),e=(r=(r=this.imulK(r)).iadd(this.tmp)).bitLength()}while(e>this.n);var n=e<this.n?-1:r.ucmp(this.p);return 0===n?(r.words[0]=0,r.length=1):n>0?r.isub(this.p):r.strip(),r},v.prototype.split=function(t,e){t.iushrn(this.n,0,e)},v.prototype.imulK=function(t){return t.imul(this.k)},i(y,v),y.prototype.split=function(t,e){for(var r=Math.min(t.length,9),n=0;n<r;n++)e.words[n]=t.words[n];if(e.length=r,t.length<=9)return t.words[0]=0,void(t.length=1);var i=t.words[9];for(e.words[e.length++]=4194303&i,n=10;n<t.length;n++){var a=0|t.words[n];t.words[n-10]=(4194303&a)<<4|i>>>22,i=a}i>>>=22,t.words[n-10]=i,0===i&&t.length>10?t.length-=10:t.length-=9},y.prototype.imulK=function(t){t.words[t.length]=0,t.words[t.length+1]=0,t.length+=2;for(var e=0,r=0;r<t.length;r++){var n=0|t.words[r];e+=977*n,t.words[r]=67108863&e,e=64*n+(e/67108864|0)}return 0===t.words[t.length-1]&&(t.length--,0===t.words[t.length-1]&&t.length--),t},i(x,v),i(b,v),i(_,v),_.prototype.imulK=function(t){for(var e=0,r=0;r<t.length;r++){var n=19*(0|t.words[r])+e,i=67108863&n;n>>>=26,t.words[r]=i,e=n}return 0!==e&&(t.words[t.length++]=e),t},a._prime=function(t){if(m[t])return m[t];var e;if("k256"===t)e=new y;else if("p224"===t)e=new x;else if("p192"===t)e=new b;else{if("p25519"!==t)throw new Error("Unknown prime "+t);e=new _}return m[t]=e,e},w.prototype._verify1=function(t){n(0===t.negative,"red works only with positives"),n(t.red,"red works only with red numbers")},w.prototype._verify2=function(t,e){n(0==(t.negative|e.negative),"red works only with positives"),n(t.red&&t.red===e.red,"red works only with red numbers")},w.prototype.imod=function(t){return this.prime?this.prime.ireduce(t)._forceRed(this):t.umod(this.m)._forceRed(this)},w.prototype.neg=function(t){return t.isZero()?t.clone():this.m.sub(t)._forceRed(this)},w.prototype.add=function(t,e){this._verify2(t,e);var r=t.add(e);return r.cmp(this.m)>=0&&r.isub(this.m),r._forceRed(this)},w.prototype.iadd=function(t,e){this._verify2(t,e);var r=t.iadd(e);return r.cmp(this.m)>=0&&r.isub(this.m),r},w.prototype.sub=function(t,e){this._verify2(t,e);var r=t.sub(e);return r.cmpn(0)<0&&r.iadd(this.m),r._forceRed(this)},w.prototype.isub=function(t,e){this._verify2(t,e);var r=t.isub(e);return r.cmpn(0)<0&&r.iadd(this.m),r},w.prototype.shl=function(t,e){return this._verify1(t),this.imod(t.ushln(e))},w.prototype.imul=function(t,e){return this._verify2(t,e),this.imod(t.imul(e))},w.prototype.mul=function(t,e){return this._verify2(t,e),this.imod(t.mul(e))},w.prototype.isqr=function(t){return this.imul(t,t.clone())},w.prototype.sqr=function(t){return this.mul(t,t)},w.prototype.sqrt=function(t){if(t.isZero())return t.clone();var e=this.m.andln(3);if(n(e%2==1),3===e){var r=this.m.add(new a(1)).iushrn(2);return this.pow(t,r)}for(var i=this.m.subn(1),o=0;!i.isZero()&&0===i.andln(1);)o++,i.iushrn(1);n(!i.isZero());var s=new a(1).toRed(this),l=s.redNeg(),c=this.m.subn(1).iushrn(1),u=this.m.bitLength();for(u=new a(2*u*u).toRed(this);0!==this.pow(u,c).cmp(l);)u.redIAdd(l);for(var h=this.pow(u,i),f=this.pow(t,i.addn(1).iushrn(1)),p=this.pow(t,i),d=o;0!==p.cmp(s);){for(var g=p,m=0;0!==g.cmp(s);m++)g=g.redSqr();n(m<d);var v=this.pow(h,new a(1).iushln(d-m-1));f=f.redMul(v),h=v.redSqr(),p=p.redMul(h),d=m}return f},w.prototype.invm=function(t){var e=t._invmp(this.m);return 0!==e.negative?(e.negative=0,this.imod(e).redNeg()):this.imod(e)},w.prototype.pow=function(t,e){if(e.isZero())return new a(1).toRed(this);if(0===e.cmpn(1))return t.clone();var r=new Array(16);r[0]=new a(1).toRed(this),r[1]=t;for(var n=2;n<r.length;n++)r[n]=this.mul(r[n-1],t);var i=r[0],o=0,s=0,l=e.bitLength()%26;for(0===l&&(l=26),n=e.length-1;n>=0;n--){for(var c=e.words[n],u=l-1;u>=0;u--){var h=c>>u&1;i!==r[0]&&(i=this.sqr(i)),0!==h||0!==o?(o<<=1,o|=h,(4===++s||0===n&&0===u)&&(i=this.mul(i,r[o]),s=0,o=0)):s=0}l=26}return i},w.prototype.convertTo=function(t){var e=t.umod(this.m);return e===t?e.clone():e},w.prototype.convertFrom=function(t){var e=t.clone();return e.red=null,e},a.mont=function(t){return new k(t)},i(k,w),k.prototype.convertTo=function(t){return this.imod(t.ushln(this.shift))},k.prototype.convertFrom=function(t){var e=this.imod(t.mul(this.rinv));return e.red=null,e},k.prototype.imul=function(t,e){if(t.isZero()||e.isZero())return t.words[0]=0,t.length=1,t;var r=t.imul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),a=i;return i.cmp(this.m)>=0?a=i.isub(this.m):i.cmpn(0)<0&&(a=i.iadd(this.m)),a._forceRed(this)},k.prototype.mul=function(t,e){if(t.isZero()||e.isZero())return new a(0)._forceRed(this);var r=t.mul(e),n=r.maskn(this.shift).mul(this.minv).imaskn(this.shift).mul(this.m),i=r.isub(n).iushrn(this.shift),o=i;return i.cmp(this.m)>=0?o=i.isub(this.m):i.cmpn(0)<0&&(o=i.iadd(this.m)),o._forceRed(this)},k.prototype.invm=function(t){return this.imod(t._invmp(this.m).mul(this.r2))._forceRed(this)}}("undefined"==typeof e||e,this)},{buffer:91}],83:[function(t,e,r){"use strict";e.exports=function(t){var e,r,n,i=t.length,a=0;for(e=0;e<i;++e)a+=t[e].length;var o=new Array(a),s=0;for(e=0;e<i;++e){var l=t[e],c=l.length;for(r=0;r<c;++r){var u=o[s++]=new Array(c-1),h=0;for(n=0;n<c;++n)n!==r&&(u[h++]=l[n]);if(1&r){var f=u[1];u[1]=u[0],u[0]=f}}}return o}},{}],84:[function(t,e,r){"use strict";e.exports=function(t,e,r){switch(arguments.length){case 1:return n=[],c(i=t,i,u,!0),n;case 2:return"function"==typeof e?c(t,t,e,!0):function(t,e){return n=[],c(t,e,u,!1),n}(t,e);case 3:return c(t,e,r,!1);default:throw new Error("box-intersect: Invalid arguments")}var i};var n,i=t("typedarray-pool"),a=t("./lib/sweep"),o=t("./lib/intersect");function s(t,e){for(var r=0;r<t;++r)if(!(e[r]<=e[r+t]))return!0;return!1}function l(t,e,r,n){for(var i=0,a=0,o=0,l=t.length;o<l;++o){var c=t[o];if(!s(e,c)){for(var u=0;u<2*e;++u)r[i++]=c[u];n[a++]=o}}return a}function c(t,e,r,n){var s=t.length,c=e.length;if(!(s<=0||c<=0)){var u=t[0].length>>>1;if(!(u<=0)){var h,f=i.mallocDouble(2*u*s),p=i.mallocInt32(s);if((s=l(t,u,f,p))>0){if(1===u&&n)a.init(s),h=a.sweepComplete(u,r,0,s,f,p,0,s,f,p);else{var d=i.mallocDouble(2*u*c),g=i.mallocInt32(c);(c=l(e,u,d,g))>0&&(a.init(s+c),h=1===u?a.sweepBipartite(u,r,0,s,f,p,0,c,d,g):o(u,r,n,s,f,p,c,d,g),i.free(d),i.free(g))}i.free(f),i.free(p)}return h}}}function u(t,e){n.push([t,e])}},{"./lib/intersect":86,"./lib/sweep":90,"typedarray-pool":507}],85:[function(t,e,r){"use strict";var n="d",i="ax",a="vv",o="fp",s="es",l="rs",c="re",u="rb",h="ri",f="rp",p="bs",d="be",g="bb",m="bi",v="bp",y="rv",x="Q",b=[n,i,a,l,c,u,h,p,d,g,m];function _(t){var e="bruteForce"+(t?"Full":"Partial"),r=[],_=b.slice();t||_.splice(3,0,o);var w=["function "+e+"("+_.join()+"){"];function k(e,o){var _=function(t,e,r){var o="bruteForce"+(t?"Red":"Blue")+(e?"Flip":"")+(r?"Full":""),_=["function ",o,"(",b.join(),"){","var ",s,"=2*",n,";"],w="for(var i="+l+","+f+"="+s+"*"+l+";i<"+c+";++i,"+f+"+="+s+"){var x0="+u+"["+i+"+"+f+"],x1="+u+"["+i+"+"+f+"+"+n+"],xi="+h+"[i];",k="for(var j="+p+","+v+"="+s+"*"+p+";j<"+d+";++j,"+v+"+="+s+"){var y0="+g+"["+i+"+"+v+"],"+(r?"y1="+g+"["+i+"+"+v+"+"+n+"],":"")+"yi="+m+"[j];";return t?_.push(w,x,":",k):_.push(k,x,":",w),r?_.push("if(y1<x0||x1<y0)continue;"):e?_.push("if(y0<=x0||x1<y0)continue;"):_.push("if(y0<x0||x1<y0)continue;"),_.push("for(var k="+i+"+1;k<"+n+";++k){var r0="+u+"[k+"+f+"],r1="+u+"[k+"+n+"+"+f+"],b0="+g+"[k+"+v+"],b1="+g+"[k+"+n+"+"+v+"];if(r1<b0||b1<r0)continue "+x+";}var "+y+"="+a+"("),e?_.push("yi,xi"):_.push("xi,yi"),_.push(");if("+y+"!==void 0)return "+y+";}}}"),{name:o,code:_.join("")}}(e,o,t);r.push(_.code),w.push("return "+_.name+"("+b.join()+");")}w.push("if("+c+"-"+l+">"+d+"-"+p+"){"),t?(k(!0,!1),w.push("}else{"),k(!1,!1)):(w.push("if("+o+"){"),k(!0,!0),w.push("}else{"),k(!0,!1),w.push("}}else{if("+o+"){"),k(!1,!0),w.push("}else{"),k(!1,!1),w.push("}")),w.push("}}return "+e);var M=r.join("")+w.join("");return new Function(M)()}r.partial=_(!1),r.full=_(!0)},{}],86:[function(t,e,r){"use strict";e.exports=function(t,e,r,a,u,S,E,C,L){!function(t,e){var r=8*i.log2(e+1)*(t+1)|0,a=i.nextPow2(b*r);w.length<a&&(n.free(w),w=n.mallocInt32(a));var o=i.nextPow2(_*r);k<o&&(n.free(k),k=n.mallocDouble(o))}(t,a+E);var z,P=0,I=2*t;M(P++,0,0,a,0,E,r?16:0,-1/0,1/0),r||M(P++,0,0,E,0,a,1,-1/0,1/0);for(;P>0;){var O=(P-=1)*b,D=w[O],R=w[O+1],B=w[O+2],F=w[O+3],N=w[O+4],j=w[O+5],V=P*_,U=k[V],q=k[V+1],H=1&j,G=!!(16&j),W=u,Y=S,X=C,Z=L;if(H&&(W=C,Y=L,X=u,Z=S),!(2&j&&(B=m(t,D,R,B,W,Y,q),R>=B)||4&j&&(R=v(t,D,R,B,W,Y,U))>=B)){var $=B-R,J=N-F;if(G){if(t*$*($+J)<p){if(void 0!==(z=l.scanComplete(t,D,e,R,B,W,Y,F,N,X,Z)))return z;continue}}else{if(t*Math.min($,J)<h){if(void 0!==(z=o(t,D,e,H,R,B,W,Y,F,N,X,Z)))return z;continue}if(t*$*J<f){if(void 0!==(z=l.scanBipartite(t,D,e,H,R,B,W,Y,F,N,X,Z)))return z;continue}}var K=d(t,D,R,B,W,Y,U,q);if(R<K)if(t*(K-R)<h){if(void 0!==(z=s(t,D+1,e,R,K,W,Y,F,N,X,Z)))return z}else if(D===t-2){if(void 0!==(z=H?l.sweepBipartite(t,e,F,N,X,Z,R,K,W,Y):l.sweepBipartite(t,e,R,K,W,Y,F,N,X,Z)))return z}else M(P++,D+1,R,K,F,N,H,-1/0,1/0),M(P++,D+1,F,N,R,K,1^H,-1/0,1/0);if(K<B){var Q=c(t,D,F,N,X,Z),tt=X[I*Q+D],et=g(t,D,Q,N,X,Z,tt);if(et<N&&M(P++,D,K,B,et,N,(4|H)+(G?16:0),tt,q),F<Q&&M(P++,D,K,B,F,Q,(2|H)+(G?16:0),U,tt),Q+1===et){if(void 0!==(z=G?T(t,D,e,K,B,W,Y,Q,X,Z[Q]):A(t,D,e,H,K,B,W,Y,Q,X,Z[Q])))return z}else if(Q<et){var rt;if(G){if(rt=y(t,D,K,B,W,Y,tt),K<rt){var nt=g(t,D,K,rt,W,Y,tt);if(D===t-2){if(K<nt&&void 0!==(z=l.sweepComplete(t,e,K,nt,W,Y,Q,et,X,Z)))return z;if(nt<rt&&void 0!==(z=l.sweepBipartite(t,e,nt,rt,W,Y,Q,et,X,Z)))return z}else K<nt&&M(P++,D+1,K,nt,Q,et,16,-1/0,1/0),nt<rt&&(M(P++,D+1,nt,rt,Q,et,0,-1/0,1/0),M(P++,D+1,Q,et,nt,rt,1,-1/0,1/0))}}else rt=H?x(t,D,K,B,W,Y,tt):y(t,D,K,B,W,Y,tt),K<rt&&(D===t-2?z=H?l.sweepBipartite(t,e,Q,et,X,Z,K,rt,W,Y):l.sweepBipartite(t,e,K,rt,W,Y,Q,et,X,Z):(M(P++,D+1,K,rt,Q,et,H,-1/0,1/0),M(P++,D+1,Q,et,K,rt,1^H,-1/0,1/0)))}}}}};var n=t("typedarray-pool"),i=t("bit-twiddle"),a=t("./brute"),o=a.partial,s=a.full,l=t("./sweep"),c=t("./median"),u=t("./partition"),h=128,f=1<<22,p=1<<22,d=u("!(lo>=p0)&&!(p1>=hi)",["p0","p1"]),g=u("lo===p0",["p0"]),m=u("lo<p0",["p0"]),v=u("hi<=p0",["p0"]),y=u("lo<=p0&&p0<=hi",["p0"]),x=u("lo<p0&&p0<=hi",["p0"]),b=6,_=2,w=n.mallocInt32(1024),k=n.mallocDouble(1024);function M(t,e,r,n,i,a,o,s,l){var c=b*t;w[c]=e,w[c+1]=r,w[c+2]=n,w[c+3]=i,w[c+4]=a,w[c+5]=o;var u=_*t;k[u]=s,k[u+1]=l}function A(t,e,r,n,i,a,o,s,l,c,u){var h=2*t,f=l*h,p=c[f+e];t:for(var d=i,g=i*h;d<a;++d,g+=h){var m=o[g+e],v=o[g+e+t];if(!(p<m||v<p)&&(!n||p!==m)){for(var y,x=s[d],b=e+1;b<t;++b){m=o[g+b],v=o[g+b+t];var _=c[f+b],w=c[f+b+t];if(v<_||w<m)continue t}if(void 0!==(y=n?r(u,x):r(x,u)))return y}}}function T(t,e,r,n,i,a,o,s,l,c){var u=2*t,h=s*u,f=l[h+e];t:for(var p=n,d=n*u;p<i;++p,d+=u){var g=o[p];if(g!==c){var m=a[d+e],v=a[d+e+t];if(!(f<m||v<f)){for(var y=e+1;y<t;++y){m=a[d+y],v=a[d+y+t];var x=l[h+y],b=l[h+y+t];if(v<x||b<m)continue t}var _=r(g,c);if(void 0!==_)return _}}}}},{"./brute":85,"./median":87,"./partition":88,"./sweep":90,"bit-twiddle":80,"typedarray-pool":507}],87:[function(t,e,r){"use strict";e.exports=function(t,e,r,o,s,l){if(o<=r+1)return r;var c=r,u=o,h=o+r>>>1,f=2*t,p=h,d=s[f*h+e];for(;c<u;){if(u-c<i){a(t,e,c,u,s,l),d=s[f*h+e];break}var g=u-c,m=Math.random()*g+c|0,v=s[f*m+e],y=Math.random()*g+c|0,x=s[f*y+e],b=Math.random()*g+c|0,_=s[f*b+e];v<=x?_>=x?(p=y,d=x):v>=_?(p=m,d=v):(p=b,d=_):x>=_?(p=y,d=x):_>=v?(p=m,d=v):(p=b,d=_);for(var w=f*(u-1),k=f*p,M=0;M<f;++M,++w,++k){var A=s[w];s[w]=s[k],s[k]=A}var T=l[u-1];l[u-1]=l[p],l[p]=T,p=n(t,e,c,u-1,s,l,d);for(var w=f*(u-1),k=f*p,M=0;M<f;++M,++w,++k){var A=s[w];s[w]=s[k],s[k]=A}var T=l[u-1];if(l[u-1]=l[p],l[p]=T,h<p){for(u=p-1;c<u&&s[f*(u-1)+e]===d;)u-=1;u+=1}else{if(!(p<h))break;for(c=p+1;c<u&&s[f*c+e]===d;)c+=1}}return n(t,e,r,h,s,l,s[f*h+e])};var n=t("./partition")("lo<p0",["p0"]),i=8;function a(t,e,r,n,i,a){for(var o=2*t,s=o*(r+1)+e,l=r+1;l<n;++l,s+=o)for(var c=i[s],u=l,h=o*(l-1);u>r&&i[h+e]>c;--u,h-=o){for(var f=h,p=h+o,d=0;d<o;++d,++f,++p){var g=i[f];i[f]=i[p],i[p]=g}var m=a[u];a[u]=a[u-1],a[u-1]=m}}},{"./partition":88}],88:[function(t,e,r){"use strict";e.exports=function(t,e){var r="abcdef".split("").concat(e),i=[];t.indexOf("lo")>=0&&i.push("lo=e[k+n]");t.indexOf("hi")>=0&&i.push("hi=e[k+o]");return r.push(n.replace("_",i.join()).replace("$",t)),Function.apply(void 0,r)};var n="for(var j=2*a,k=j*c,l=k,m=c,n=b,o=a+b,p=c;d>p;++p,k+=j){var _;if($)if(m===p)m+=1,l+=j;else{for(var s=0;j>s;++s){var t=e[k+s];e[k+s]=e[l],e[l++]=t}var u=f[p];f[p]=f[m],f[m++]=u}}return m"},{}],89:[function(t,e,r){"use strict";e.exports=function(t,e){e<=4*n?i(0,e-1,t):function t(e,r,h){var f=(r-e+1)/6|0,p=e+f,d=r-f,g=e+r>>1,m=g-f,v=g+f,y=p,x=m,b=g,_=v,w=d,k=e+1,M=r-1,A=0;c(y,x,h)&&(A=y,y=x,x=A);c(_,w,h)&&(A=_,_=w,w=A);c(y,b,h)&&(A=y,y=b,b=A);c(x,b,h)&&(A=x,x=b,b=A);c(y,_,h)&&(A=y,y=_,_=A);c(b,_,h)&&(A=b,b=_,_=A);c(x,w,h)&&(A=x,x=w,w=A);c(x,b,h)&&(A=x,x=b,b=A);c(_,w,h)&&(A=_,_=w,w=A);var T=h[2*x];var S=h[2*x+1];var E=h[2*_];var C=h[2*_+1];var L=2*y;var z=2*b;var P=2*w;var I=2*p;var O=2*g;var D=2*d;for(var R=0;R<2;++R){var B=h[L+R],F=h[z+R],N=h[P+R];h[I+R]=B,h[O+R]=F,h[D+R]=N}o(m,e,h);o(v,r,h);for(var j=k;j<=M;++j)if(u(j,T,S,h))j!==k&&a(j,k,h),++k;else if(!u(j,E,C,h))for(;;){if(u(M,E,C,h)){u(M,T,S,h)?(s(j,k,M,h),++k,--M):(a(j,M,h),--M);break}if(--M<j)break}l(e,k-1,T,S,h);l(r,M+1,E,C,h);k-2-e<=n?i(e,k-2,h):t(e,k-2,h);r-(M+2)<=n?i(M+2,r,h):t(M+2,r,h);M-k<=n?i(k,M,h):t(k,M,h)}(0,e-1,t)};var n=32;function i(t,e,r){for(var n=2*(t+1),i=t+1;i<=e;++i){for(var a=r[n++],o=r[n++],s=i,l=n-2;s-- >t;){var c=r[l-2],u=r[l-1];if(c<a)break;if(c===a&&u<o)break;r[l]=c,r[l+1]=u,l-=2}r[l]=a,r[l+1]=o}}function a(t,e,r){e*=2;var n=r[t*=2],i=r[t+1];r[t]=r[e],r[t+1]=r[e+1],r[e]=n,r[e+1]=i}function o(t,e,r){e*=2,r[t*=2]=r[e],r[t+1]=r[e+1]}function s(t,e,r,n){e*=2,r*=2;var i=n[t*=2],a=n[t+1];n[t]=n[e],n[t+1]=n[e+1],n[e]=n[r],n[e+1]=n[r+1],n[r]=i,n[r+1]=a}function l(t,e,r,n,i){e*=2,i[t*=2]=i[e],i[e]=r,i[t+1]=i[e+1],i[e+1]=n}function c(t,e,r){e*=2;var n=r[t*=2],i=r[e];return!(n<i)&&(n!==i||r[t+1]>r[e+1])}function u(t,e,r,n){var i=n[t*=2];return i<e||i===e&&n[t+1]<r}},{}],90:[function(t,e,r){"use strict";e.exports={init:function(t){var e=i.nextPow2(t);s.length<e&&(n.free(s),s=n.mallocInt32(e));l.length<e&&(n.free(l),l=n.mallocInt32(e));c.length<e&&(n.free(c),c=n.mallocInt32(e));u.length<e&&(n.free(u),u=n.mallocInt32(e));h.length<e&&(n.free(h),h=n.mallocInt32(e));f.length<e&&(n.free(f),f=n.mallocInt32(e));var r=8*e;p.length<r&&(n.free(p),p=n.mallocDouble(r))},sweepBipartite:function(t,e,r,n,i,h,f,m,v,y){for(var x=0,b=2*t,_=t-1,w=b-1,k=r;k<n;++k){var M=h[k],A=b*k;p[x++]=i[A+_],p[x++]=-(M+1),p[x++]=i[A+w],p[x++]=M}for(var k=f;k<m;++k){var M=y[k]+o,T=b*k;p[x++]=v[T+_],p[x++]=-M,p[x++]=v[T+w],p[x++]=M}var S=x>>>1;a(p,S);for(var E=0,C=0,k=0;k<S;++k){var L=0|p[2*k+1];if(L>=o)d(c,u,C--,L=L-o|0);else if(L>=0)d(s,l,E--,L);else if(L<=-o){L=-L-o|0;for(var z=0;z<E;++z){var P=e(s[z],L);if(void 0!==P)return P}g(c,u,C++,L)}else{L=-L-1|0;for(var z=0;z<C;++z){var P=e(L,c[z]);if(void 0!==P)return P}g(s,l,E++,L)}}},sweepComplete:function(t,e,r,n,i,o,m,v,y,x){for(var b=0,_=2*t,w=t-1,k=_-1,M=r;M<n;++M){var A=o[M]+1<<1,T=_*M;p[b++]=i[T+w],p[b++]=-A,p[b++]=i[T+k],p[b++]=A}for(var M=m;M<v;++M){var A=x[M]+1<<1,S=_*M;p[b++]=y[S+w],p[b++]=1|-A,p[b++]=y[S+k],p[b++]=1|A}var E=b>>>1;a(p,E);for(var C=0,L=0,z=0,M=0;M<E;++M){var P=0|p[2*M+1],I=1&P;if(M<E-1&&P>>1==p[2*M+3]>>1&&(I=2,M+=1),P<0){for(var O=-(P>>1)-1,D=0;D<z;++D){var R=e(h[D],O);if(void 0!==R)return R}if(0!==I)for(var D=0;D<C;++D){var R=e(s[D],O);if(void 0!==R)return R}if(1!==I)for(var D=0;D<L;++D){var R=e(c[D],O);if(void 0!==R)return R}0===I?g(s,l,C++,O):1===I?g(c,u,L++,O):2===I&&g(h,f,z++,O)}else{var O=(P>>1)-1;0===I?d(s,l,C--,O):1===I?d(c,u,L--,O):2===I&&d(h,f,z--,O)}}},scanBipartite:function(t,e,r,n,i,c,u,h,f,m,v,y){var x=0,b=2*t,_=e,w=e+t,k=1,M=1;n?M=o:k=o;for(var A=i;A<c;++A){var T=A+k,S=b*A;p[x++]=u[S+_],p[x++]=-T,p[x++]=u[S+w],p[x++]=T}for(var A=f;A<m;++A){var T=A+M,E=b*A;p[x++]=v[E+_],p[x++]=-T}var C=x>>>1;a(p,C);for(var L=0,A=0;A<C;++A){var z=0|p[2*A+1];if(z<0){var T=-z,P=!1;if(T>=o?(P=!n,T-=o):(P=!!n,T-=1),P)g(s,l,L++,T);else{var I=y[T],O=b*T,D=v[O+e+1],R=v[O+e+1+t];t:for(var B=0;B<L;++B){var F=s[B],N=b*F;if(!(R<u[N+e+1]||u[N+e+1+t]<D)){for(var j=e+2;j<t;++j)if(v[O+j+t]<u[N+j]||u[N+j+t]<v[O+j])continue t;var V,U=h[F];if(void 0!==(V=n?r(I,U):r(U,I)))return V}}}}else d(s,l,L--,z-k)}},scanComplete:function(t,e,r,n,i,l,c,u,h,f,d){for(var g=0,m=2*t,v=e,y=e+t,x=n;x<i;++x){var b=x+o,_=m*x;p[g++]=l[_+v],p[g++]=-b,p[g++]=l[_+y],p[g++]=b}for(var x=u;x<h;++x){var b=x+1,w=m*x;p[g++]=f[w+v],p[g++]=-b}var k=g>>>1;a(p,k);for(var M=0,x=0;x<k;++x){var A=0|p[2*x+1];if(A<0){var b=-A;if(b>=o)s[M++]=b-o;else{var T=d[b-=1],S=m*b,E=f[S+e+1],C=f[S+e+1+t];t:for(var L=0;L<M;++L){var z=s[L],P=c[z];if(P===T)break;var I=m*z;if(!(C<l[I+e+1]||l[I+e+1+t]<E)){for(var O=e+2;O<t;++O)if(f[S+O+t]<l[I+O]||l[I+O+t]<f[S+O])continue t;var D=r(P,T);if(void 0!==D)return D}}}}else{for(var b=A-o,L=M-1;L>=0;--L)if(s[L]===b){for(var O=L+1;O<M;++O)s[O-1]=s[O];break}--M}}}};var n=t("typedarray-pool"),i=t("bit-twiddle"),a=t("./sort"),o=1<<28,s=n.mallocInt32(1024),l=n.mallocInt32(1024),c=n.mallocInt32(1024),u=n.mallocInt32(1024),h=n.mallocInt32(1024),f=n.mallocInt32(1024),p=n.mallocDouble(8192);function d(t,e,r,n){var i=e[n],a=t[r-1];t[i]=a,e[a]=i}function g(t,e,r,n){t[r]=n,e[n]=r}},{"./sort":89,"bit-twiddle":80,"typedarray-pool":507}],91:[function(t,e,r){},{}],92:[function(t,e,r){"use strict";var n=t("base64-js"),i=t("ieee754");r.Buffer=s,r.SlowBuffer=function(t){+t!=t&&(t=0);return s.alloc(+t)},r.INSPECT_MAX_BYTES=50;var a=2147483647;function o(t){if(t>a)throw new RangeError("Invalid typed array length");var e=new Uint8Array(t);return e.__proto__=s.prototype,e}function s(t,e,r){if("number"==typeof t){if("string"==typeof e)throw new Error("If encoding is specified then the first argument must be a string");return u(t)}return l(t,e,r)}function l(t,e,r){if("number"==typeof t)throw new TypeError('"value" argument must not be a number');return j(t)||t&&j(t.buffer)?function(t,e,r){if(e<0||t.byteLength<e)throw new RangeError('"offset" is outside of buffer bounds');if(t.byteLength<e+(r||0))throw new RangeError('"length" is outside of buffer bounds');var n;n=void 0===e&&void 0===r?new Uint8Array(t):void 0===r?new Uint8Array(t,e):new Uint8Array(t,e,r);return n.__proto__=s.prototype,n}(t,e,r):"string"==typeof t?function(t,e){"string"==typeof e&&""!==e||(e="utf8");if(!s.isEncoding(e))throw new TypeError("Unknown encoding: "+e);var r=0|p(t,e),n=o(r),i=n.write(t,e);i!==r&&(n=n.slice(0,i));return n}(t,e):function(t){if(s.isBuffer(t)){var e=0|f(t.length),r=o(e);return 0===r.length?r:(t.copy(r,0,0,e),r)}if(t){if(ArrayBuffer.isView(t)||"length"in t)return"number"!=typeof t.length||V(t.length)?o(0):h(t);if("Buffer"===t.type&&Array.isArray(t.data))return h(t.data)}throw new TypeError("The first argument must be one of type string, Buffer, ArrayBuffer, Array, or Array-like Object.")}(t)}function c(t){if("number"!=typeof t)throw new TypeError('"size" argument must be of type number');if(t<0)throw new RangeError('"size" argument must not be negative')}function u(t){return c(t),o(t<0?0:0|f(t))}function h(t){for(var e=t.length<0?0:0|f(t.length),r=o(e),n=0;n<e;n+=1)r[n]=255&t[n];return r}function f(t){if(t>=a)throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+a.toString(16)+" bytes");return 0|t}function p(t,e){if(s.isBuffer(t))return t.length;if(ArrayBuffer.isView(t)||j(t))return t.byteLength;"string"!=typeof t&&(t=""+t);var r=t.length;if(0===r)return 0;for(var n=!1;;)switch(e){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return B(t).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return F(t).length;default:if(n)return B(t).length;e=(""+e).toLowerCase(),n=!0}}function d(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function g(t,e,r,n,i){if(0===t.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:r<-2147483648&&(r=-2147483648),V(r=+r)&&(r=i?0:t.length-1),r<0&&(r=t.length+r),r>=t.length){if(i)return-1;r=t.length-1}else if(r<0){if(!i)return-1;r=0}if("string"==typeof e&&(e=s.from(e,n)),s.isBuffer(e))return 0===e.length?-1:m(t,e,r,n,i);if("number"==typeof e)return e&=255,"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(t,e,r):Uint8Array.prototype.lastIndexOf.call(t,e,r):m(t,[e],r,n,i);throw new TypeError("val must be string, number or Buffer")}function m(t,e,r,n,i){var a,o=1,s=t.length,l=e.length;if(void 0!==n&&("ucs2"===(n=String(n).toLowerCase())||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(t.length<2||e.length<2)return-1;o=2,s/=2,l/=2,r/=2}function c(t,e){return 1===o?t[e]:t.readUInt16BE(e*o)}if(i){var u=-1;for(a=r;a<s;a++)if(c(t,a)===c(e,-1===u?0:a-u)){if(-1===u&&(u=a),a-u+1===l)return u*o}else-1!==u&&(a-=a-u),u=-1}else for(r+l>s&&(r=s-l),a=r;a>=0;a--){for(var h=!0,f=0;f<l;f++)if(c(t,a+f)!==c(e,f)){h=!1;break}if(h)return a}return-1}function v(t,e,r,n){r=Number(r)||0;var i=t.length-r;n?(n=Number(n))>i&&(n=i):n=i;var a=e.length;n>a/2&&(n=a/2);for(var o=0;o<n;++o){var s=parseInt(e.substr(2*o,2),16);if(V(s))return o;t[r+o]=s}return o}function y(t,e,r,n){return N(B(e,t.length-r),t,r,n)}function x(t,e,r,n){return N(function(t){for(var e=[],r=0;r<t.length;++r)e.push(255&t.charCodeAt(r));return e}(e),t,r,n)}function b(t,e,r,n){return x(t,e,r,n)}function _(t,e,r,n){return N(F(e),t,r,n)}function w(t,e,r,n){return N(function(t,e){for(var r,n,i,a=[],o=0;o<t.length&&!((e-=2)<0);++o)r=t.charCodeAt(o),n=r>>8,i=r%256,a.push(i),a.push(n);return a}(e,t.length-r),t,r,n)}function k(t,e,r){return 0===e&&r===t.length?n.fromByteArray(t):n.fromByteArray(t.slice(e,r))}function M(t,e,r){r=Math.min(t.length,r);for(var n=[],i=e;i<r;){var a,o,s,l,c=t[i],u=null,h=c>239?4:c>223?3:c>191?2:1;if(i+h<=r)switch(h){case 1:c<128&&(u=c);break;case 2:128==(192&(a=t[i+1]))&&(l=(31&c)<<6|63&a)>127&&(u=l);break;case 3:a=t[i+1],o=t[i+2],128==(192&a)&&128==(192&o)&&(l=(15&c)<<12|(63&a)<<6|63&o)>2047&&(l<55296||l>57343)&&(u=l);break;case 4:a=t[i+1],o=t[i+2],s=t[i+3],128==(192&a)&&128==(192&o)&&128==(192&s)&&(l=(15&c)<<18|(63&a)<<12|(63&o)<<6|63&s)>65535&&l<1114112&&(u=l)}null===u?(u=65533,h=1):u>65535&&(u-=65536,n.push(u>>>10&1023|55296),u=56320|1023&u),n.push(u),i+=h}return function(t){var e=t.length;if(e<=A)return String.fromCharCode.apply(String,t);var r="",n=0;for(;n<e;)r+=String.fromCharCode.apply(String,t.slice(n,n+=A));return r}(n)}r.kMaxLength=a,s.TYPED_ARRAY_SUPPORT=function(){try{var t=new Uint8Array(1);return t.__proto__={__proto__:Uint8Array.prototype,foo:function(){return 42}},42===t.foo()}catch(t){return!1}}(),s.TYPED_ARRAY_SUPPORT||"undefined"==typeof console||"function"!=typeof console.error||console.error("This browser lacks typed array (Uint8Array) support which is required by `buffer` v5.x. Use `buffer` v4.x if you require old browser support."),Object.defineProperty(s.prototype,"parent",{get:function(){if(this instanceof s)return this.buffer}}),Object.defineProperty(s.prototype,"offset",{get:function(){if(this instanceof s)return this.byteOffset}}),"undefined"!=typeof Symbol&&Symbol.species&&s[Symbol.species]===s&&Object.defineProperty(s,Symbol.species,{value:null,configurable:!0,enumerable:!1,writable:!1}),s.poolSize=8192,s.from=function(t,e,r){return l(t,e,r)},s.prototype.__proto__=Uint8Array.prototype,s.__proto__=Uint8Array,s.alloc=function(t,e,r){return function(t,e,r){return c(t),t<=0?o(t):void 0!==e?"string"==typeof r?o(t).fill(e,r):o(t).fill(e):o(t)}(t,e,r)},s.allocUnsafe=function(t){return u(t)},s.allocUnsafeSlow=function(t){return u(t)},s.isBuffer=function(t){return null!=t&&!0===t._isBuffer},s.compare=function(t,e){if(!s.isBuffer(t)||!s.isBuffer(e))throw new TypeError("Arguments must be Buffers");if(t===e)return 0;for(var r=t.length,n=e.length,i=0,a=Math.min(r,n);i<a;++i)if(t[i]!==e[i]){r=t[i],n=e[i];break}return r<n?-1:n<r?1:0},s.isEncoding=function(t){switch(String(t).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(t,e){if(!Array.isArray(t))throw new TypeError('"list" argument must be an Array of Buffers');if(0===t.length)return s.alloc(0);var r;if(void 0===e)for(e=0,r=0;r<t.length;++r)e+=t[r].length;var n=s.allocUnsafe(e),i=0;for(r=0;r<t.length;++r){var a=t[r];if(ArrayBuffer.isView(a)&&(a=s.from(a)),!s.isBuffer(a))throw new TypeError('"list" argument must be an Array of Buffers');a.copy(n,i),i+=a.length}return n},s.byteLength=p,s.prototype._isBuffer=!0,s.prototype.swap16=function(){var t=this.length;if(t%2!=0)throw new RangeError("Buffer size must be a multiple of 16-bits");for(var e=0;e<t;e+=2)d(this,e,e+1);return this},s.prototype.swap32=function(){var t=this.length;if(t%4!=0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var e=0;e<t;e+=4)d(this,e,e+3),d(this,e+1,e+2);return this},s.prototype.swap64=function(){var t=this.length;if(t%8!=0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var e=0;e<t;e+=8)d(this,e,e+7),d(this,e+1,e+6),d(this,e+2,e+5),d(this,e+3,e+4);return this},s.prototype.toString=function(){var t=this.length;return 0===t?"":0===arguments.length?M(this,0,t):function(t,e,r){var n=!1;if((void 0===e||e<0)&&(e=0),e>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),r<=0)return"";if((r>>>=0)<=(e>>>=0))return"";for(t||(t="utf8");;)switch(t){case"hex":return E(this,e,r);case"utf8":case"utf-8":return M(this,e,r);case"ascii":return T(this,e,r);case"latin1":case"binary":return S(this,e,r);case"base64":return k(this,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return C(this,e,r);default:if(n)throw new TypeError("Unknown encoding: "+t);t=(t+"").toLowerCase(),n=!0}}.apply(this,arguments)},s.prototype.toLocaleString=s.prototype.toString,s.prototype.equals=function(t){if(!s.isBuffer(t))throw new TypeError("Argument must be a Buffer");return this===t||0===s.compare(this,t)},s.prototype.inspect=function(){var t="",e=r.INSPECT_MAX_BYTES;return this.length>0&&(t=this.toString("hex",0,e).match(/.{2}/g).join(" "),this.length>e&&(t+=" ... ")),"<Buffer "+t+">"},s.prototype.compare=function(t,e,r,n,i){if(!s.isBuffer(t))throw new TypeError("Argument must be a Buffer");if(void 0===e&&(e=0),void 0===r&&(r=t?t.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),e<0||r>t.length||n<0||i>this.length)throw new RangeError("out of range index");if(n>=i&&e>=r)return 0;if(n>=i)return-1;if(e>=r)return 1;if(this===t)return 0;for(var a=(i>>>=0)-(n>>>=0),o=(r>>>=0)-(e>>>=0),l=Math.min(a,o),c=this.slice(n,i),u=t.slice(e,r),h=0;h<l;++h)if(c[h]!==u[h]){a=c[h],o=u[h];break}return a<o?-1:o<a?1:0},s.prototype.includes=function(t,e,r){return-1!==this.indexOf(t,e,r)},s.prototype.indexOf=function(t,e,r){return g(this,t,e,r,!0)},s.prototype.lastIndexOf=function(t,e,r){return g(this,t,e,r,!1)},s.prototype.write=function(t,e,r,n){if(void 0===e)n="utf8",r=this.length,e=0;else if(void 0===r&&"string"==typeof e)n=e,r=this.length,e=0;else{if(!isFinite(e))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");e>>>=0,isFinite(r)?(r>>>=0,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-e;if((void 0===r||r>i)&&(r=i),t.length>0&&(r<0||e<0)||e>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var a=!1;;)switch(n){case"hex":return v(this,t,e,r);case"utf8":case"utf-8":return y(this,t,e,r);case"ascii":return x(this,t,e,r);case"latin1":case"binary":return b(this,t,e,r);case"base64":return _(this,t,e,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return w(this,t,e,r);default:if(a)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),a=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var A=4096;function T(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;i<r;++i)n+=String.fromCharCode(127&t[i]);return n}function S(t,e,r){var n="";r=Math.min(t.length,r);for(var i=e;i<r;++i)n+=String.fromCharCode(t[i]);return n}function E(t,e,r){var n=t.length;(!e||e<0)&&(e=0),(!r||r<0||r>n)&&(r=n);for(var i="",a=e;a<r;++a)i+=R(t[a]);return i}function C(t,e,r){for(var n=t.slice(e,r),i="",a=0;a<n.length;a+=2)i+=String.fromCharCode(n[a]+256*n[a+1]);return i}function L(t,e,r){if(t%1!=0||t<0)throw new RangeError("offset is not uint");if(t+e>r)throw new RangeError("Trying to access beyond buffer length")}function z(t,e,r,n,i,a){if(!s.isBuffer(t))throw new TypeError('"buffer" argument must be a Buffer instance');if(e>i||e<a)throw new RangeError('"value" argument is out of bounds');if(r+n>t.length)throw new RangeError("Index out of range")}function P(t,e,r,n,i,a){if(r+n>t.length)throw new RangeError("Index out of range");if(r<0)throw new RangeError("Index out of range")}function I(t,e,r,n,a){return e=+e,r>>>=0,a||P(t,0,r,4),i.write(t,e,r,n,23,4),r+4}function O(t,e,r,n,a){return e=+e,r>>>=0,a||P(t,0,r,8),i.write(t,e,r,n,52,8),r+8}s.prototype.slice=function(t,e){var r=this.length;(t=~~t)<0?(t+=r)<0&&(t=0):t>r&&(t=r),(e=void 0===e?r:~~e)<0?(e+=r)<0&&(e=0):e>r&&(e=r),e<t&&(e=t);var n=this.subarray(t,e);return n.__proto__=s.prototype,n},s.prototype.readUIntLE=function(t,e,r){t>>>=0,e>>>=0,r||L(t,e,this.length);for(var n=this[t],i=1,a=0;++a<e&&(i*=256);)n+=this[t+a]*i;return n},s.prototype.readUIntBE=function(t,e,r){t>>>=0,e>>>=0,r||L(t,e,this.length);for(var n=this[t+--e],i=1;e>0&&(i*=256);)n+=this[t+--e]*i;return n},s.prototype.readUInt8=function(t,e){return t>>>=0,e||L(t,1,this.length),this[t]},s.prototype.readUInt16LE=function(t,e){return t>>>=0,e||L(t,2,this.length),this[t]|this[t+1]<<8},s.prototype.readUInt16BE=function(t,e){return t>>>=0,e||L(t,2,this.length),this[t]<<8|this[t+1]},s.prototype.readUInt32LE=function(t,e){return t>>>=0,e||L(t,4,this.length),(this[t]|this[t+1]<<8|this[t+2]<<16)+16777216*this[t+3]},s.prototype.readUInt32BE=function(t,e){return t>>>=0,e||L(t,4,this.length),16777216*this[t]+(this[t+1]<<16|this[t+2]<<8|this[t+3])},s.prototype.readIntLE=function(t,e,r){t>>>=0,e>>>=0,r||L(t,e,this.length);for(var n=this[t],i=1,a=0;++a<e&&(i*=256);)n+=this[t+a]*i;return n>=(i*=128)&&(n-=Math.pow(2,8*e)),n},s.prototype.readIntBE=function(t,e,r){t>>>=0,e>>>=0,r||L(t,e,this.length);for(var n=e,i=1,a=this[t+--n];n>0&&(i*=256);)a+=this[t+--n]*i;return a>=(i*=128)&&(a-=Math.pow(2,8*e)),a},s.prototype.readInt8=function(t,e){return t>>>=0,e||L(t,1,this.length),128&this[t]?-1*(255-this[t]+1):this[t]},s.prototype.readInt16LE=function(t,e){t>>>=0,e||L(t,2,this.length);var r=this[t]|this[t+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(t,e){t>>>=0,e||L(t,2,this.length);var r=this[t+1]|this[t]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(t,e){return t>>>=0,e||L(t,4,this.length),this[t]|this[t+1]<<8|this[t+2]<<16|this[t+3]<<24},s.prototype.readInt32BE=function(t,e){return t>>>=0,e||L(t,4,this.length),this[t]<<24|this[t+1]<<16|this[t+2]<<8|this[t+3]},s.prototype.readFloatLE=function(t,e){return t>>>=0,e||L(t,4,this.length),i.read(this,t,!0,23,4)},s.prototype.readFloatBE=function(t,e){return t>>>=0,e||L(t,4,this.length),i.read(this,t,!1,23,4)},s.prototype.readDoubleLE=function(t,e){return t>>>=0,e||L(t,8,this.length),i.read(this,t,!0,52,8)},s.prototype.readDoubleBE=function(t,e){return t>>>=0,e||L(t,8,this.length),i.read(this,t,!1,52,8)},s.prototype.writeUIntLE=function(t,e,r,n){(t=+t,e>>>=0,r>>>=0,n)||z(this,t,e,r,Math.pow(2,8*r)-1,0);var i=1,a=0;for(this[e]=255&t;++a<r&&(i*=256);)this[e+a]=t/i&255;return e+r},s.prototype.writeUIntBE=function(t,e,r,n){(t=+t,e>>>=0,r>>>=0,n)||z(this,t,e,r,Math.pow(2,8*r)-1,0);var i=r-1,a=1;for(this[e+i]=255&t;--i>=0&&(a*=256);)this[e+i]=t/a&255;return e+r},s.prototype.writeUInt8=function(t,e,r){return t=+t,e>>>=0,r||z(this,t,e,1,255,0),this[e]=255&t,e+1},s.prototype.writeUInt16LE=function(t,e,r){return t=+t,e>>>=0,r||z(this,t,e,2,65535,0),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeUInt16BE=function(t,e,r){return t=+t,e>>>=0,r||z(this,t,e,2,65535,0),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeUInt32LE=function(t,e,r){return t=+t,e>>>=0,r||z(this,t,e,4,4294967295,0),this[e+3]=t>>>24,this[e+2]=t>>>16,this[e+1]=t>>>8,this[e]=255&t,e+4},s.prototype.writeUInt32BE=function(t,e,r){return t=+t,e>>>=0,r||z(this,t,e,4,4294967295,0),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeIntLE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);z(this,t,e,r,i-1,-i)}var a=0,o=1,s=0;for(this[e]=255&t;++a<r&&(o*=256);)t<0&&0===s&&0!==this[e+a-1]&&(s=1),this[e+a]=(t/o>>0)-s&255;return e+r},s.prototype.writeIntBE=function(t,e,r,n){if(t=+t,e>>>=0,!n){var i=Math.pow(2,8*r-1);z(this,t,e,r,i-1,-i)}var a=r-1,o=1,s=0;for(this[e+a]=255&t;--a>=0&&(o*=256);)t<0&&0===s&&0!==this[e+a+1]&&(s=1),this[e+a]=(t/o>>0)-s&255;return e+r},s.prototype.writeInt8=function(t,e,r){return t=+t,e>>>=0,r||z(this,t,e,1,127,-128),t<0&&(t=255+t+1),this[e]=255&t,e+1},s.prototype.writeInt16LE=function(t,e,r){return t=+t,e>>>=0,r||z(this,t,e,2,32767,-32768),this[e]=255&t,this[e+1]=t>>>8,e+2},s.prototype.writeInt16BE=function(t,e,r){return t=+t,e>>>=0,r||z(this,t,e,2,32767,-32768),this[e]=t>>>8,this[e+1]=255&t,e+2},s.prototype.writeInt32LE=function(t,e,r){return t=+t,e>>>=0,r||z(this,t,e,4,2147483647,-2147483648),this[e]=255&t,this[e+1]=t>>>8,this[e+2]=t>>>16,this[e+3]=t>>>24,e+4},s.prototype.writeInt32BE=function(t,e,r){return t=+t,e>>>=0,r||z(this,t,e,4,2147483647,-2147483648),t<0&&(t=4294967295+t+1),this[e]=t>>>24,this[e+1]=t>>>16,this[e+2]=t>>>8,this[e+3]=255&t,e+4},s.prototype.writeFloatLE=function(t,e,r){return I(this,t,e,!0,r)},s.prototype.writeFloatBE=function(t,e,r){return I(this,t,e,!1,r)},s.prototype.writeDoubleLE=function(t,e,r){return O(this,t,e,!0,r)},s.prototype.writeDoubleBE=function(t,e,r){return O(this,t,e,!1,r)},s.prototype.copy=function(t,e,r,n){if(!s.isBuffer(t))throw new TypeError("argument should be a Buffer");if(r||(r=0),n||0===n||(n=this.length),e>=t.length&&(e=t.length),e||(e=0),n>0&&n<r&&(n=r),n===r)return 0;if(0===t.length||0===this.length)return 0;if(e<0)throw new RangeError("targetStart out of bounds");if(r<0||r>=this.length)throw new RangeError("Index out of range");if(n<0)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),t.length-e<n-r&&(n=t.length-e+r);var i=n-r;if(this===t&&"function"==typeof Uint8Array.prototype.copyWithin)this.copyWithin(e,r,n);else if(this===t&&r<e&&e<n)for(var a=i-1;a>=0;--a)t[a+e]=this[a+r];else Uint8Array.prototype.set.call(t,this.subarray(r,n),e);return i},s.prototype.fill=function(t,e,r,n){if("string"==typeof t){if("string"==typeof e?(n=e,e=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!s.isEncoding(n))throw new TypeError("Unknown encoding: "+n);if(1===t.length){var i=t.charCodeAt(0);("utf8"===n&&i<128||"latin1"===n)&&(t=i)}}else"number"==typeof t&&(t&=255);if(e<0||this.length<e||this.length<r)throw new RangeError("Out of range index");if(r<=e)return this;var a;if(e>>>=0,r=void 0===r?this.length:r>>>0,t||(t=0),"number"==typeof t)for(a=e;a<r;++a)this[a]=t;else{var o=s.isBuffer(t)?t:new s(t,n),l=o.length;if(0===l)throw new TypeError('The value "'+t+'" is invalid for argument "value"');for(a=0;a<r-e;++a)this[a+e]=o[a%l]}return this};var D=/[^+/0-9A-Za-z-_]/g;function R(t){return t<16?"0"+t.toString(16):t.toString(16)}function B(t,e){var r;e=e||1/0;for(var n=t.length,i=null,a=[],o=0;o<n;++o){if((r=t.charCodeAt(o))>55295&&r<57344){if(!i){if(r>56319){(e-=3)>-1&&a.push(239,191,189);continue}if(o+1===n){(e-=3)>-1&&a.push(239,191,189);continue}i=r;continue}if(r<56320){(e-=3)>-1&&a.push(239,191,189),i=r;continue}r=65536+(i-55296<<10|r-56320)}else i&&(e-=3)>-1&&a.push(239,191,189);if(i=null,r<128){if((e-=1)<0)break;a.push(r)}else if(r<2048){if((e-=2)<0)break;a.push(r>>6|192,63&r|128)}else if(r<65536){if((e-=3)<0)break;a.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(r<1114112))throw new Error("Invalid code point");if((e-=4)<0)break;a.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return a}function F(t){return n.toByteArray(function(t){if((t=(t=t.split("=")[0]).trim().replace(D,"")).length<2)return"";for(;t.length%4!=0;)t+="=";return t}(t))}function N(t,e,r,n){for(var i=0;i<n&&!(i+r>=e.length||i>=t.length);++i)e[i+r]=t[i];return i}function j(t){return t instanceof ArrayBuffer||null!=t&&null!=t.constructor&&"ArrayBuffer"===t.constructor.name&&"number"==typeof t.byteLength}function V(t){return t!=t}},{"base64-js":62,ieee754:380}],93:[function(t,e,r){"use strict";var n=t("./lib/monotone"),i=t("./lib/triangulation"),a=t("./lib/delaunay"),o=t("./lib/filter");function s(t){return[Math.min(t[0],t[1]),Math.max(t[0],t[1])]}function l(t,e){return t[0]-e[0]||t[1]-e[1]}function c(t,e,r){return e in t?t[e]:r}e.exports=function(t,e,r){Array.isArray(e)?(r=r||{},e=e||[]):(r=e||{},e=[]);var u=!!c(r,"delaunay",!0),h=!!c(r,"interior",!0),f=!!c(r,"exterior",!0),p=!!c(r,"infinity",!1);if(!h&&!f||0===t.length)return[];var d=n(t,e);if(u||h!==f||p){for(var g=i(t.length,function(t){return t.map(s).sort(l)}(e)),m=0;m<d.length;++m){var v=d[m];g.addTriangle(v[0],v[1],v[2])}return u&&a(t,g),f?h?p?o(g,0,p):g.cells():o(g,1,p):o(g,-1)}return d}},{"./lib/delaunay":94,"./lib/filter":95,"./lib/monotone":96,"./lib/triangulation":97}],94:[function(t,e,r){"use strict";var n=t("robust-in-sphere")[4];t("binary-search-bounds");function i(t,e,r,i,a,o){var s=e.opposite(i,a);if(!(s<0)){if(a<i){var l=i;i=a,a=l,l=o,o=s,s=l}e.isConstraint(i,a)||n(t[i],t[a],t[o],t[s])<0&&r.push(i,a)}}e.exports=function(t,e){for(var r=[],a=t.length,o=e.stars,s=0;s<a;++s)for(var l=o[s],c=1;c<l.length;c+=2){var u=l[c];if(!(u<s)&&!e.isConstraint(s,u)){for(var h=l[c-1],f=-1,p=1;p<l.length;p+=2)if(l[p-1]===u){f=l[p];break}f<0||n(t[s],t[u],t[h],t[f])<0&&r.push(s,u)}}for(;r.length>0;){for(var u=r.pop(),s=r.pop(),h=-1,f=-1,l=o[s],d=1;d<l.length;d+=2){var g=l[d-1],m=l[d];g===u?f=m:m===u&&(h=g)}h<0||f<0||(n(t[s],t[u],t[h],t[f])>=0||(e.flip(s,u),i(t,e,r,h,s,f),i(t,e,r,s,f,h),i(t,e,r,f,u,h),i(t,e,r,u,h,f)))}}},{"binary-search-bounds":98,"robust-in-sphere":469}],95:[function(t,e,r){"use strict";var n,i=t("binary-search-bounds");function a(t,e,r,n,i,a,o){this.cells=t,this.neighbor=e,this.flags=n,this.constraint=r,this.active=i,this.next=a,this.boundary=o}function o(t,e){return t[0]-e[0]||t[1]-e[1]||t[2]-e[2]}e.exports=function(t,e,r){var n=function(t,e){for(var r=t.cells(),n=r.length,i=0;i<n;++i){var s=r[i],l=s[0],c=s[1],u=s[2];c<u?c<l&&(s[0]=c,s[1]=u,s[2]=l):u<l&&(s[0]=u,s[1]=l,s[2]=c)}r.sort(o);for(var h=new Array(n),i=0;i<h.length;++i)h[i]=0;var f=[],p=[],d=new Array(3*n),g=new Array(3*n),m=null;e&&(m=[]);for(var v=new a(r,d,g,h,f,p,m),i=0;i<n;++i)for(var s=r[i],y=0;y<3;++y){var l=s[y],c=s[(y+1)%3],x=d[3*i+y]=v.locate(c,l,t.opposite(c,l)),b=g[3*i+y]=t.isConstraint(l,c);x<0&&(b?p.push(i):(f.push(i),h[i]=1),e&&m.push([c,l,-1]))}return v}(t,r);if(0===e)return r?n.cells.concat(n.boundary):n.cells;var i=1,s=n.active,l=n.next,c=n.flags,u=n.cells,h=n.constraint,f=n.neighbor;for(;s.length>0||l.length>0;){for(;s.length>0;){var p=s.pop();if(c[p]!==-i){c[p]=i;u[p];for(var d=0;d<3;++d){var g=f[3*p+d];g>=0&&0===c[g]&&(h[3*p+d]?l.push(g):(s.push(g),c[g]=i))}}}var m=l;l=s,s=m,l.length=0,i=-i}var v=function(t,e,r){for(var n=0,i=0;i<t.length;++i)e[i]===r&&(t[n++]=t[i]);return t.length=n,t}(u,c,e);if(r)return v.concat(n.boundary);return v},a.prototype.locate=(n=[0,0,0],function(t,e,r){var a=t,s=e,l=r;return e<r?e<t&&(a=e,s=r,l=t):r<t&&(a=r,s=t,l=e),a<0?-1:(n[0]=a,n[1]=s,n[2]=l,i.eq(this.cells,n,o))})},{"binary-search-bounds":98}],96:[function(t,e,r){"use strict";var n=t("binary-search-bounds"),i=t("robust-orientation")[3],a=0,o=1,s=2;function l(t,e,r,n,i){this.a=t,this.b=e,this.idx=r,this.lowerIds=n,this.upperIds=i}function c(t,e,r,n){this.a=t,this.b=e,this.type=r,this.idx=n}function u(t,e){var r=t.a[0]-e.a[0]||t.a[1]-e.a[1]||t.type-e.type;return r||(t.type!==a&&(r=i(t.a,t.b,e.b))?r:t.idx-e.idx)}function h(t,e){return i(t.a,t.b,e)}function f(t,e,r,a,o){for(var s=n.lt(e,a,h),l=n.gt(e,a,h),c=s;c<l;++c){for(var u=e[c],f=u.lowerIds,p=f.length;p>1&&i(r[f[p-2]],r[f[p-1]],a)>0;)t.push([f[p-1],f[p-2],o]),p-=1;f.length=p,f.push(o);var d=u.upperIds;for(p=d.length;p>1&&i(r[d[p-2]],r[d[p-1]],a)<0;)t.push([d[p-2],d[p-1],o]),p-=1;d.length=p,d.push(o)}}function p(t,e){var r;return(r=t.a[0]<e.a[0]?i(t.a,t.b,e.a):i(e.b,e.a,t.a))?r:(r=e.b[0]<t.b[0]?i(t.a,t.b,e.b):i(e.b,e.a,t.b))||t.idx-e.idx}function d(t,e,r){var i=n.le(t,r,p),a=t[i],o=a.upperIds,s=o[o.length-1];a.upperIds=[s],t.splice(i+1,0,new l(r.a,r.b,r.idx,[s],o))}function g(t,e,r){var i=r.a;r.a=r.b,r.b=i;var a=n.eq(t,r,p),o=t[a];t[a-1].upperIds=o.upperIds,t.splice(a,1)}e.exports=function(t,e){for(var r=t.length,n=e.length,i=[],h=0;h<r;++h)i.push(new c(t[h],null,a,h));for(var h=0;h<n;++h){var p=e[h],m=t[p[0]],v=t[p[1]];m[0]<v[0]?i.push(new c(m,v,s,h),new c(v,m,o,h)):m[0]>v[0]&&i.push(new c(v,m,s,h),new c(m,v,o,h))}i.sort(u);for(var y=i[0].a[0]-(1+Math.abs(i[0].a[0]))*Math.pow(2,-52),x=[new l([y,1],[y,0],-1,[],[],[],[])],b=[],h=0,_=i.length;h<_;++h){var w=i[h],k=w.type;k===a?f(b,x,t,w.a,w.idx):k===s?d(x,t,w):g(x,t,w)}return b}},{"binary-search-bounds":98,"robust-orientation":471}],97:[function(t,e,r){"use strict";var n=t("binary-search-bounds");function i(t,e){this.stars=t,this.edges=e}e.exports=function(t,e){for(var r=new Array(t),n=0;n<t;++n)r[n]=[];return new i(r,e)};var a=i.prototype;function o(t,e,r){for(var n=1,i=t.length;n<i;n+=2)if(t[n-1]===e&&t[n]===r)return t[n-1]=t[i-2],t[n]=t[i-1],void(t.length=i-2)}a.isConstraint=function(){var t=[0,0];function e(t,e){return t[0]-e[0]||t[1]-e[1]}return function(r,i){return t[0]=Math.min(r,i),t[1]=Math.max(r,i),n.eq(this.edges,t,e)>=0}}(),a.removeTriangle=function(t,e,r){var n=this.stars;o(n[t],e,r),o(n[e],r,t),o(n[r],t,e)},a.addTriangle=function(t,e,r){var n=this.stars;n[t].push(e,r),n[e].push(r,t),n[r].push(t,e)},a.opposite=function(t,e){for(var r=this.stars[e],n=1,i=r.length;n<i;n+=2)if(r[n]===t)return r[n-1];return-1},a.flip=function(t,e){var r=this.opposite(t,e),n=this.opposite(e,t);this.removeTriangle(t,e,r),this.removeTriangle(e,t,n),this.addTriangle(t,n,r),this.addTriangle(e,r,n)},a.edges=function(){for(var t=this.stars,e=[],r=0,n=t.length;r<n;++r)for(var i=t[r],a=0,o=i.length;a<o;a+=2)e.push([i[a],i[a+1]]);return e},a.cells=function(){for(var t=this.stars,e=[],r=0,n=t.length;r<n;++r)for(var i=t[r],a=0,o=i.length;a<o;a+=2){var s=i[a],l=i[a+1];r<Math.min(s,l)&&e.push([r,s,l])}return e}},{"binary-search-bounds":98}],98:[function(t,e,r){"use strict";function n(t,e,r,n,i){var a=["function ",t,"(a,l,h,",n.join(","),"){",i?"":"var i=",r?"l-1":"h+1",";while(l<=h){var m=(l+h)>>>1,x=a[m]"];return i?e.indexOf("c")<0?a.push(";if(x===y){return m}else if(x<=y){"):a.push(";var p=c(x,y);if(p===0){return m}else if(p<=0){"):a.push(";if(",e,"){i=m;"),r?a.push("l=m+1}else{h=m-1}"):a.push("h=m-1}else{l=m+1}"),a.push("}"),i?a.push("return -1};"):a.push("return i};"),a.join("")}function i(t,e,r,i){return new Function([n("A","x"+t+"y",e,["y"],i),n("P","c(x,y)"+t+"0",e,["y","c"],i),"function dispatchBsearch",r,"(a,y,c,l,h){if(typeof(c)==='function'){return P(a,(l===void 0)?0:l|0,(h===void 0)?a.length-1:h|0,y,c)}else{return A(a,(c===void 0)?0:c|0,(l===void 0)?a.length-1:l|0,y)}}return dispatchBsearch",r].join(""))()}e.exports={ge:i(">=",!1,"GE"),gt:i(">",!1,"GT"),lt:i("<",!0,"LT"),le:i("<=",!0,"LE"),eq:i("-",!0,"EQ",!0)}},{}],99:[function(t,e,r){"use strict";e.exports=function(t){for(var e=1,r=1;r<t.length;++r)for(var n=0;n<r;++n)if(t[r]<t[n])e=-e;else if(t[n]===t[r])return 0;return e}},{}],100:[function(t,e,r){"use strict";var n=t("dup"),i=t("robust-linear-solve");function a(t,e){for(var r=0,n=t.length,i=0;i<n;++i)r+=t[i]*e[i];return r}function o(t){var e=t.length;if(0===e)return[];t[0].length;var r=n([t.length+1,t.length+1],1),o=n([t.length+1],1);r[e][e]=0;for(var s=0;s<e;++s){for(var l=0;l<=s;++l)r[l][s]=r[s][l]=2*a(t[s],t[l]);o[s]=a(t[s],t[s])}var c=i(r,o),u=0,h=c[e+1];for(s=0;s<h.length;++s)u+=h[s];var f=new Array(e);for(s=0;s<e;++s){h=c[s];var p=0;for(l=0;l<h.length;++l)p+=h[l];f[s]=p/u}return f}function s(t){if(0===t.length)return[];for(var e=t[0].length,r=n([e]),i=o(t),a=0;a<t.length;++a)for(var s=0;s<e;++s)r[s]+=t[a][s]*i[a];return r}s.barycenetric=o,e.exports=s},{dup:154,"robust-linear-solve":470}],101:[function(t,e,r){e.exports=function(t){for(var e=n(t),r=0,i=0;i<t.length;++i)for(var a=t[i],o=0;o<e.length;++o)r+=Math.pow(a[o]-e[o],2);return Math.sqrt(r/t.length)};var n=t("circumcenter")},{circumcenter:100}],102:[function(t,e,r){e.exports=function(t,e,r){return e<r?t<e?e:t>r?r:t:t<r?r:t>e?e:t}},{}],103:[function(t,e,r){"use strict";e.exports=function(t,e,r){var n;if(r){n=e;for(var i=new Array(e.length),a=0;a<e.length;++a){var o=e[a];i[a]=[o[0],o[1],r[a]]}e=i}var s=function(t,e,r){var n=d(t,[],p(t));return v(e,n,r),!!n}(t,e,!!r);for(;y(t,e,!!r);)s=!0;if(r&&s){n.length=0,r.length=0;for(var a=0;a<e.length;++a){var o=e[a];n.push([o[0],o[1]]),r.push(o[2])}}return s};var n=t("union-find"),i=t("box-intersect"),a=t("robust-segment-intersect"),o=t("big-rat"),s=t("big-rat/cmp"),l=t("big-rat/to-float"),c=t("rat-vec"),u=t("nextafter"),h=t("./lib/rat-seg-intersect");function f(t){var e=l(t);return[u(e,-1/0),u(e,1/0)]}function p(t){for(var e=new Array(t.length),r=0;r<t.length;++r){var n=t[r];e[r]=[u(n[0],-1/0),u(n[1],-1/0),u(n[0],1/0),u(n[1],1/0)]}return e}function d(t,e,r){for(var a=e.length,o=new n(a),s=[],l=0;l<e.length;++l){var c=e[l],h=f(c[0]),p=f(c[1]);s.push([u(h[0],-1/0),u(p[0],-1/0),u(h[1],1/0),u(p[1],1/0)])}i(s,function(t,e){o.link(t,e)});var d=!0,g=new Array(a);for(l=0;l<a;++l){(v=o.find(l))!==l&&(d=!1,t[v]=[Math.min(t[l][0],t[v][0]),Math.min(t[l][1],t[v][1])])}if(d)return null;var m=0;for(l=0;l<a;++l){var v;(v=o.find(l))===l?(g[l]=m,t[m++]=t[l]):g[l]=-1}t.length=m;for(l=0;l<a;++l)g[l]<0&&(g[l]=g[o.find(l)]);return g}function g(t,e){return t[0]-e[0]||t[1]-e[1]}function m(t,e){var r=t[0]-e[0]||t[1]-e[1];return r||(t[2]<e[2]?-1:t[2]>e[2]?1:0)}function v(t,e,r){if(0!==t.length){if(e)for(var n=0;n<t.length;++n){var i=e[(o=t[n])[0]],a=e[o[1]];o[0]=Math.min(i,a),o[1]=Math.max(i,a)}else for(n=0;n<t.length;++n){var o;i=(o=t[n])[0],a=o[1];o[0]=Math.min(i,a),o[1]=Math.max(i,a)}r?t.sort(m):t.sort(g);var s=1;for(n=1;n<t.length;++n){var l=t[n-1],c=t[n];(c[0]!==l[0]||c[1]!==l[1]||r&&c[2]!==l[2])&&(t[s++]=c)}t.length=s}}function y(t,e,r){var n=function(t,e){for(var r=new Array(e.length),n=0;n<e.length;++n){var i=e[n],a=t[i[0]],o=t[i[1]];r[n]=[u(Math.min(a[0],o[0]),-1/0),u(Math.min(a[1],o[1]),-1/0),u(Math.max(a[0],o[0]),1/0),u(Math.max(a[1],o[1]),1/0)]}return r}(t,e),f=function(t,e,r){var n=[];return i(r,function(r,i){var o=e[r],s=e[i];if(o[0]!==s[0]&&o[0]!==s[1]&&o[1]!==s[0]&&o[1]!==s[1]){var l=t[o[0]],c=t[o[1]],u=t[s[0]],h=t[s[1]];a(l,c,u,h)&&n.push([r,i])}}),n}(t,e,n),g=p(t),m=function(t,e,r,n){var o=[];return i(r,n,function(r,n){var i=e[r];if(i[0]!==n&&i[1]!==n){var s=t[n],l=t[i[0]],c=t[i[1]];a(l,c,s,s)&&o.push([r,n])}}),o}(t,e,n,g),y=d(t,function(t,e,r,n,i){var a,u,f=t.map(function(t){return[o(t[0]),o(t[1])]});for(a=0;a<r.length;++a){var p=r[a];u=p[0];var d=p[1],g=e[u],m=e[d],v=h(c(t[g[0]]),c(t[g[1]]),c(t[m[0]]),c(t[m[1]]));if(v){var y=t.length;t.push([l(v[0]),l(v[1])]),f.push(v),n.push([u,y],[d,y])}}for(n.sort(function(t,e){if(t[0]!==e[0])return t[0]-e[0];var r=f[t[1]],n=f[e[1]];return s(r[0],n[0])||s(r[1],n[1])}),a=n.length-1;a>=0;--a){var x=e[u=(S=n[a])[0]],b=x[0],_=x[1],w=t[b],k=t[_];if((w[0]-k[0]||w[1]-k[1])<0){var M=b;b=_,_=M}x[0]=b;var A,T=x[1]=S[1];for(i&&(A=x[2]);a>0&&n[a-1][0]===u;){var S,E=(S=n[--a])[1];i?e.push([T,E,A]):e.push([T,E]),T=E}i?e.push([T,_,A]):e.push([T,_])}return f}(t,e,f,m,r));return v(e,y,r),!!y||(f.length>0||m.length>0)}},{"./lib/rat-seg-intersect":104,"big-rat":66,"big-rat/cmp":64,"big-rat/to-float":78,"box-intersect":84,nextafter:418,"rat-vec":453,"robust-segment-intersect":474,"union-find":508}],104:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){var a=s(e,t),h=s(n,r),f=u(a,h);if(0===o(f))return null;var p=s(t,r),d=u(h,p),g=i(d,f),m=c(a,g);return l(t,m)};var n=t("big-rat/mul"),i=t("big-rat/div"),a=t("big-rat/sub"),o=t("big-rat/sign"),s=t("rat-vec/sub"),l=t("rat-vec/add"),c=t("rat-vec/muls");function u(t,e){return a(n(t[0],e[1]),n(t[1],e[0]))}},{"big-rat/div":65,"big-rat/mul":75,"big-rat/sign":76,"big-rat/sub":77,"rat-vec/add":452,"rat-vec/muls":454,"rat-vec/sub":455}],105:[function(t,e,r){"use strict";var n=t("clamp");function i(t,e){null==e&&(e=!0);var r=t[0],i=t[1],a=t[2],o=t[3];return null==o&&(o=e?1:255),e&&(r*=255,i*=255,a*=255,o*=255),16777216*(r=255&n(r,0,255))+((i=255&n(i,0,255))<<16)+((a=255&n(a,0,255))<<8)+(o=255&n(o,0,255))}e.exports=i,e.exports.to=i,e.exports.from=function(t,e){var r=(t=+t)>>>24,n=(16711680&t)>>>16,i=(65280&t)>>>8,a=255&t;return!1===e?[r,n,i,a]:[r/255,n/255,i/255,a/255]}},{clamp:102}],106:[function(t,e,r){"use strict";e.exports={aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],grey:[128,128,128],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],rebeccapurple:[102,51,153],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]}},{}],107:[function(t,e,r){"use strict";var n=t("color-rgba"),i=t("clamp"),a=t("dtype");e.exports=function(t,e){"float"!==e&&e||(e="array"),"uint"===e&&(e="uint8"),"uint_clamped"===e&&(e="uint8_clamped");var r=a(e),o=new r(4);if(t instanceof r)return Array.isArray(t)?t.slice():(o.set(t),o);var s="uint8"!==e&&"uint8_clamped"!==e;return t instanceof Uint8Array||t instanceof Uint8ClampedArray?(o[0]=t[0],o[1]=t[1],o[2]=t[2],o[3]=null!=t[3]?t[3]:255,s&&(o[0]/=255,o[1]/=255,o[2]/=255,o[3]/=255),o):(t.length&&"string"!=typeof t||((t=n(t))[0]/=255,t[1]/=255,t[2]/=255),s?(o[0]=t[0],o[1]=t[1],o[2]=t[2],o[3]=null!=t[3]?t[3]:1):(o[0]=i(Math.round(255*t[0]),0,255),o[1]=i(Math.round(255*t[1]),0,255),o[2]=i(Math.round(255*t[2]),0,255),o[3]=null==t[3]?255:i(Math.floor(255*t[3]),0,255)),o)}},{clamp:102,"color-rgba":109,dtype:153}],108:[function(t,e,r){(function(r){"use strict";var n=t("color-name"),i=t("is-plain-obj"),a=t("defined");e.exports=function(t){var e,s,l=[],c=1;if("string"==typeof t)if(n[t])l=n[t].slice(),s="rgb";else if("transparent"===t)c=0,s="rgb",l=[0,0,0];else if(/^#[A-Fa-f0-9]+$/.test(t)){var u=t.slice(1),h=u.length,f=h<=4;c=1,f?(l=[parseInt(u[0]+u[0],16),parseInt(u[1]+u[1],16),parseInt(u[2]+u[2],16)],4===h&&(c=parseInt(u[3]+u[3],16)/255)):(l=[parseInt(u[0]+u[1],16),parseInt(u[2]+u[3],16),parseInt(u[4]+u[5],16)],8===h&&(c=parseInt(u[6]+u[7],16)/255)),l[0]||(l[0]=0),l[1]||(l[1]=0),l[2]||(l[2]=0),s="rgb"}else if(e=/^((?:rgb|hs[lvb]|hwb|cmyk?|xy[zy]|gray|lab|lchu?v?|[ly]uv|lms)a?)\s*\(([^\)]*)\)/.exec(t)){var p=e[1],u=p.replace(/a$/,"");s=u;var h="cmyk"===u?4:"gray"===u?1:3;l=e[2].trim().split(/\s*,\s*/).map(function(t,e){if(/%$/.test(t))return e===h?parseFloat(t)/100:"rgb"===u?255*parseFloat(t)/100:parseFloat(t);if("h"===u[e]){if(/deg$/.test(t))return parseFloat(t);if(void 0!==o[t])return o[t]}return parseFloat(t)}),p===u&&l.push(1),c=void 0===l[h]?1:l[h],l=l.slice(0,h)}else t.length>10&&/[0-9](?:\s|\/)/.test(t)&&(l=t.match(/([0-9]+)/g).map(function(t){return parseFloat(t)}),s=t.match(/([a-z])/ig).join("").toLowerCase());else if("number"==typeof t)s="rgb",l=[t>>>16,(65280&t)>>>8,255&t];else if(i(t)){var d=a(t.r,t.red,t.R,null);null!==d?(s="rgb",l=[d,a(t.g,t.green,t.G),a(t.b,t.blue,t.B)]):(s="hsl",l=[a(t.h,t.hue,t.H),a(t.s,t.saturation,t.S),a(t.l,t.lightness,t.L,t.b,t.brightness)]),c=a(t.a,t.alpha,t.opacity,1),null!=t.opacity&&(c/=100)}else(Array.isArray(t)||r.ArrayBuffer&&ArrayBuffer.isView&&ArrayBuffer.isView(t))&&(l=[t[0],t[1],t[2]],s="rgb",c=4===t.length?t[3]:1);return{space:s,values:l,alpha:c}};var o={red:0,orange:60,yellow:120,green:180,blue:240,purple:300}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"color-name":106,defined:148,"is-plain-obj":390}],109:[function(t,e,r){"use strict";var n=t("color-parse"),i=t("color-space/hsl"),a=t("clamp");e.exports=function(t){var e;if("string"!=typeof t)throw Error("Argument should be a string");var r=n(t);return r.space?((e=Array(3))[0]=a(r.values[0],0,255),e[1]=a(r.values[1],0,255),e[2]=a(r.values[2],0,255),"h"===r.space[0]&&(e=i.rgb(e)),e.push(a(r.alpha,0,1)),e):[]}},{clamp:102,"color-parse":108,"color-space/hsl":110}],110:[function(t,e,r){"use strict";var n=t("./rgb");e.exports={name:"hsl",min:[0,0,0],max:[360,100,100],channel:["hue","saturation","lightness"],alias:["HSL"],rgb:function(t){var e,r,n,i,a,o=t[0]/360,s=t[1]/100,l=t[2]/100;if(0===s)return[a=255*l,a,a];e=2*l-(r=l<.5?l*(1+s):l+s-l*s),i=[0,0,0];for(var c=0;c<3;c++)(n=o+1/3*-(c-1))<0?n++:n>1&&n--,a=6*n<1?e+6*(r-e)*n:2*n<1?r:3*n<2?e+(r-e)*(2/3-n)*6:e,i[c]=255*a;return i}},n.hsl=function(t){var e,r,n=t[0]/255,i=t[1]/255,a=t[2]/255,o=Math.min(n,i,a),s=Math.max(n,i,a),l=s-o;return s===o?e=0:n===s?e=(i-a)/l:i===s?e=2+(a-n)/l:a===s&&(e=4+(n-i)/l),(e=Math.min(60*e,360))<0&&(e+=360),r=(o+s)/2,[e,100*(s===o?0:r<=.5?l/(s+o):l/(2-s-o)),100*r]}},{"./rgb":111}],111:[function(t,e,r){"use strict";e.exports={name:"rgb",min:[0,0,0],max:[255,255,255],channel:["red","green","blue"],alias:["RGB"]}},{}],112:[function(t,e,r){e.exports={jet:[{index:0,rgb:[0,0,131]},{index:.125,rgb:[0,60,170]},{index:.375,rgb:[5,255,255]},{index:.625,rgb:[255,255,0]},{index:.875,rgb:[250,0,0]},{index:1,rgb:[128,0,0]}],hsv:[{index:0,rgb:[255,0,0]},{index:.169,rgb:[253,255,2]},{index:.173,rgb:[247,255,2]},{index:.337,rgb:[0,252,4]},{index:.341,rgb:[0,252,10]},{index:.506,rgb:[1,249,255]},{index:.671,rgb:[2,0,253]},{index:.675,rgb:[8,0,253]},{index:.839,rgb:[255,0,251]},{index:.843,rgb:[255,0,245]},{index:1,rgb:[255,0,6]}],hot:[{index:0,rgb:[0,0,0]},{index:.3,rgb:[230,0,0]},{index:.6,rgb:[255,210,0]},{index:1,rgb:[255,255,255]}],cool:[{index:0,rgb:[0,255,255]},{index:1,rgb:[255,0,255]}],spring:[{index:0,rgb:[255,0,255]},{index:1,rgb:[255,255,0]}],summer:[{index:0,rgb:[0,128,102]},{index:1,rgb:[255,255,102]}],autumn:[{index:0,rgb:[255,0,0]},{index:1,rgb:[255,255,0]}],winter:[{index:0,rgb:[0,0,255]},{index:1,rgb:[0,255,128]}],bone:[{index:0,rgb:[0,0,0]},{index:.376,rgb:[84,84,116]},{index:.753,rgb:[169,200,200]},{index:1,rgb:[255,255,255]}],copper:[{index:0,rgb:[0,0,0]},{index:.804,rgb:[255,160,102]},{index:1,rgb:[255,199,127]}],greys:[{index:0,rgb:[0,0,0]},{index:1,rgb:[255,255,255]}],yignbu:[{index:0,rgb:[8,29,88]},{index:.125,rgb:[37,52,148]},{index:.25,rgb:[34,94,168]},{index:.375,rgb:[29,145,192]},{index:.5,rgb:[65,182,196]},{index:.625,rgb:[127,205,187]},{index:.75,rgb:[199,233,180]},{index:.875,rgb:[237,248,217]},{index:1,rgb:[255,255,217]}],greens:[{index:0,rgb:[0,68,27]},{index:.125,rgb:[0,109,44]},{index:.25,rgb:[35,139,69]},{index:.375,rgb:[65,171,93]},{index:.5,rgb:[116,196,118]},{index:.625,rgb:[161,217,155]},{index:.75,rgb:[199,233,192]},{index:.875,rgb:[229,245,224]},{index:1,rgb:[247,252,245]}],yiorrd:[{index:0,rgb:[128,0,38]},{index:.125,rgb:[189,0,38]},{index:.25,rgb:[227,26,28]},{index:.375,rgb:[252,78,42]},{index:.5,rgb:[253,141,60]},{index:.625,rgb:[254,178,76]},{index:.75,rgb:[254,217,118]},{index:.875,rgb:[255,237,160]},{index:1,rgb:[255,255,204]}],bluered:[{index:0,rgb:[0,0,255]},{index:1,rgb:[255,0,0]}],rdbu:[{index:0,rgb:[5,10,172]},{index:.35,rgb:[106,137,247]},{index:.5,rgb:[190,190,190]},{index:.6,rgb:[220,170,132]},{index:.7,rgb:[230,145,90]},{index:1,rgb:[178,10,28]}],picnic:[{index:0,rgb:[0,0,255]},{index:.1,rgb:[51,153,255]},{index:.2,rgb:[102,204,255]},{index:.3,rgb:[153,204,255]},{index:.4,rgb:[204,204,255]},{index:.5,rgb:[255,255,255]},{index:.6,rgb:[255,204,255]},{index:.7,rgb:[255,153,255]},{index:.8,rgb:[255,102,204]},{index:.9,rgb:[255,102,102]},{index:1,rgb:[255,0,0]}],rainbow:[{index:0,rgb:[150,0,90]},{index:.125,rgb:[0,0,200]},{index:.25,rgb:[0,25,255]},{index:.375,rgb:[0,152,255]},{index:.5,rgb:[44,255,150]},{index:.625,rgb:[151,255,0]},{index:.75,rgb:[255,234,0]},{index:.875,rgb:[255,111,0]},{index:1,rgb:[255,0,0]}],portland:[{index:0,rgb:[12,51,131]},{index:.25,rgb:[10,136,186]},{index:.5,rgb:[242,211,56]},{index:.75,rgb:[242,143,56]},{index:1,rgb:[217,30,30]}],blackbody:[{index:0,rgb:[0,0,0]},{index:.2,rgb:[230,0,0]},{index:.4,rgb:[230,210,0]},{index:.7,rgb:[255,255,255]},{index:1,rgb:[160,200,255]}],earth:[{index:0,rgb:[0,0,130]},{index:.1,rgb:[0,180,180]},{index:.2,rgb:[40,210,40]},{index:.4,rgb:[230,230,50]},{index:.6,rgb:[120,70,20]},{index:1,rgb:[255,255,255]}],electric:[{index:0,rgb:[0,0,0]},{index:.15,rgb:[30,0,100]},{index:.4,rgb:[120,0,100]},{index:.6,rgb:[160,90,0]},{index:.8,rgb:[230,200,0]},{index:1,rgb:[255,250,220]}],alpha:[{index:0,rgb:[255,255,255,0]},{index:1,rgb:[255,255,255,1]}],viridis:[{index:0,rgb:[68,1,84]},{index:.13,rgb:[71,44,122]},{index:.25,rgb:[59,81,139]},{index:.38,rgb:[44,113,142]},{index:.5,rgb:[33,144,141]},{index:.63,rgb:[39,173,129]},{index:.75,rgb:[92,200,99]},{index:.88,rgb:[170,220,50]},{index:1,rgb:[253,231,37]}],inferno:[{index:0,rgb:[0,0,4]},{index:.13,rgb:[31,12,72]},{index:.25,rgb:[85,15,109]},{index:.38,rgb:[136,34,106]},{index:.5,rgb:[186,54,85]},{index:.63,rgb:[227,89,51]},{index:.75,rgb:[249,140,10]},{index:.88,rgb:[249,201,50]},{index:1,rgb:[252,255,164]}],magma:[{index:0,rgb:[0,0,4]},{index:.13,rgb:[28,16,68]},{index:.25,rgb:[79,18,123]},{index:.38,rgb:[129,37,129]},{index:.5,rgb:[181,54,122]},{index:.63,rgb:[229,80,100]},{index:.75,rgb:[251,135,97]},{index:.88,rgb:[254,194,135]},{index:1,rgb:[252,253,191]}],plasma:[{index:0,rgb:[13,8,135]},{index:.13,rgb:[75,3,161]},{index:.25,rgb:[125,3,168]},{index:.38,rgb:[168,34,150]},{index:.5,rgb:[203,70,121]},{index:.63,rgb:[229,107,93]},{index:.75,rgb:[248,148,65]},{index:.88,rgb:[253,195,40]},{index:1,rgb:[240,249,33]}],warm:[{index:0,rgb:[125,0,179]},{index:.13,rgb:[172,0,187]},{index:.25,rgb:[219,0,170]},{index:.38,rgb:[255,0,130]},{index:.5,rgb:[255,63,74]},{index:.63,rgb:[255,123,0]},{index:.75,rgb:[234,176,0]},{index:.88,rgb:[190,228,0]},{index:1,rgb:[147,255,0]}],cool:[{index:0,rgb:[125,0,179]},{index:.13,rgb:[116,0,218]},{index:.25,rgb:[98,74,237]},{index:.38,rgb:[68,146,231]},{index:.5,rgb:[0,204,197]},{index:.63,rgb:[0,247,146]},{index:.75,rgb:[0,255,88]},{index:.88,rgb:[40,255,8]},{index:1,rgb:[147,255,0]}],"rainbow-soft":[{index:0,rgb:[125,0,179]},{index:.1,rgb:[199,0,180]},{index:.2,rgb:[255,0,121]},{index:.3,rgb:[255,108,0]},{index:.4,rgb:[222,194,0]},{index:.5,rgb:[150,255,0]},{index:.6,rgb:[0,255,55]},{index:.7,rgb:[0,246,150]},{index:.8,rgb:[50,167,222]},{index:.9,rgb:[103,51,235]},{index:1,rgb:[124,0,186]}],bathymetry:[{index:0,rgb:[40,26,44]},{index:.13,rgb:[59,49,90]},{index:.25,rgb:[64,76,139]},{index:.38,rgb:[63,110,151]},{index:.5,rgb:[72,142,158]},{index:.63,rgb:[85,174,163]},{index:.75,rgb:[120,206,163]},{index:.88,rgb:[187,230,172]},{index:1,rgb:[253,254,204]}],cdom:[{index:0,rgb:[47,15,62]},{index:.13,rgb:[87,23,86]},{index:.25,rgb:[130,28,99]},{index:.38,rgb:[171,41,96]},{index:.5,rgb:[206,67,86]},{index:.63,rgb:[230,106,84]},{index:.75,rgb:[242,149,103]},{index:.88,rgb:[249,193,135]},{index:1,rgb:[254,237,176]}],chlorophyll:[{index:0,rgb:[18,36,20]},{index:.13,rgb:[25,63,41]},{index:.25,rgb:[24,91,59]},{index:.38,rgb:[13,119,72]},{index:.5,rgb:[18,148,80]},{index:.63,rgb:[80,173,89]},{index:.75,rgb:[132,196,122]},{index:.88,rgb:[175,221,162]},{index:1,rgb:[215,249,208]}],density:[{index:0,rgb:[54,14,36]},{index:.13,rgb:[89,23,80]},{index:.25,rgb:[110,45,132]},{index:.38,rgb:[120,77,178]},{index:.5,rgb:[120,113,213]},{index:.63,rgb:[115,151,228]},{index:.75,rgb:[134,185,227]},{index:.88,rgb:[177,214,227]},{index:1,rgb:[230,241,241]}],"freesurface-blue":[{index:0,rgb:[30,4,110]},{index:.13,rgb:[47,14,176]},{index:.25,rgb:[41,45,236]},{index:.38,rgb:[25,99,212]},{index:.5,rgb:[68,131,200]},{index:.63,rgb:[114,156,197]},{index:.75,rgb:[157,181,203]},{index:.88,rgb:[200,208,216]},{index:1,rgb:[241,237,236]}],"freesurface-red":[{index:0,rgb:[60,9,18]},{index:.13,rgb:[100,17,27]},{index:.25,rgb:[142,20,29]},{index:.38,rgb:[177,43,27]},{index:.5,rgb:[192,87,63]},{index:.63,rgb:[205,125,105]},{index:.75,rgb:[216,162,148]},{index:.88,rgb:[227,199,193]},{index:1,rgb:[241,237,236]}],oxygen:[{index:0,rgb:[64,5,5]},{index:.13,rgb:[106,6,15]},{index:.25,rgb:[144,26,7]},{index:.38,rgb:[168,64,3]},{index:.5,rgb:[188,100,4]},{index:.63,rgb:[206,136,11]},{index:.75,rgb:[220,174,25]},{index:.88,rgb:[231,215,44]},{index:1,rgb:[248,254,105]}],par:[{index:0,rgb:[51,20,24]},{index:.13,rgb:[90,32,35]},{index:.25,rgb:[129,44,34]},{index:.38,rgb:[159,68,25]},{index:.5,rgb:[182,99,19]},{index:.63,rgb:[199,134,22]},{index:.75,rgb:[212,171,35]},{index:.88,rgb:[221,210,54]},{index:1,rgb:[225,253,75]}],phase:[{index:0,rgb:[145,105,18]},{index:.13,rgb:[184,71,38]},{index:.25,rgb:[186,58,115]},{index:.38,rgb:[160,71,185]},{index:.5,rgb:[110,97,218]},{index:.63,rgb:[50,123,164]},{index:.75,rgb:[31,131,110]},{index:.88,rgb:[77,129,34]},{index:1,rgb:[145,105,18]}],salinity:[{index:0,rgb:[42,24,108]},{index:.13,rgb:[33,50,162]},{index:.25,rgb:[15,90,145]},{index:.38,rgb:[40,118,137]},{index:.5,rgb:[59,146,135]},{index:.63,rgb:[79,175,126]},{index:.75,rgb:[120,203,104]},{index:.88,rgb:[193,221,100]},{index:1,rgb:[253,239,154]}],temperature:[{index:0,rgb:[4,35,51]},{index:.13,rgb:[23,51,122]},{index:.25,rgb:[85,59,157]},{index:.38,rgb:[129,79,143]},{index:.5,rgb:[175,95,130]},{index:.63,rgb:[222,112,101]},{index:.75,rgb:[249,146,66]},{index:.88,rgb:[249,196,65]},{index:1,rgb:[232,250,91]}],turbidity:[{index:0,rgb:[34,31,27]},{index:.13,rgb:[65,50,41]},{index:.25,rgb:[98,69,52]},{index:.38,rgb:[131,89,57]},{index:.5,rgb:[161,112,59]},{index:.63,rgb:[185,140,66]},{index:.75,rgb:[202,174,88]},{index:.88,rgb:[216,209,126]},{index:1,rgb:[233,246,171]}],"velocity-blue":[{index:0,rgb:[17,32,64]},{index:.13,rgb:[35,52,116]},{index:.25,rgb:[29,81,156]},{index:.38,rgb:[31,113,162]},{index:.5,rgb:[50,144,169]},{index:.63,rgb:[87,173,176]},{index:.75,rgb:[149,196,189]},{index:.88,rgb:[203,221,211]},{index:1,rgb:[254,251,230]}],"velocity-green":[{index:0,rgb:[23,35,19]},{index:.13,rgb:[24,64,38]},{index:.25,rgb:[11,95,45]},{index:.38,rgb:[39,123,35]},{index:.5,rgb:[95,146,12]},{index:.63,rgb:[152,165,18]},{index:.75,rgb:[201,186,69]},{index:.88,rgb:[233,216,137]},{index:1,rgb:[255,253,205]}],cubehelix:[{index:0,rgb:[0,0,0]},{index:.07,rgb:[22,5,59]},{index:.13,rgb:[60,4,105]},{index:.2,rgb:[109,1,135]},{index:.27,rgb:[161,0,147]},{index:.33,rgb:[210,2,142]},{index:.4,rgb:[251,11,123]},{index:.47,rgb:[255,29,97]},{index:.53,rgb:[255,54,69]},{index:.6,rgb:[255,85,46]},{index:.67,rgb:[255,120,34]},{index:.73,rgb:[255,157,37]},{index:.8,rgb:[241,191,57]},{index:.87,rgb:[224,220,93]},{index:.93,rgb:[218,241,142]},{index:1,rgb:[227,253,198]}]}},{}],113:[function(t,e,r){"use strict";var n=t("./colorScale"),i=t("lerp");function a(t){return[t[0]/255,t[1]/255,t[2]/255,t[3]]}function o(t){for(var e,r="#",n=0;n<3;++n)r+=("00"+(e=(e=t[n]).toString(16))).substr(e.length);return r}function s(t){return"rgba("+t.join(",")+")"}e.exports=function(t){var e,r,l,c,u,h,f,p,d,g;t||(t={});p=(t.nshades||72)-1,f=t.format||"hex",(h=t.colormap)||(h="jet");if("string"==typeof h){if(h=h.toLowerCase(),!n[h])throw Error(h+" not a supported colorscale");u=n[h]}else{if(!Array.isArray(h))throw Error("unsupported colormap option",h);u=h.slice()}if(u.length>p)throw new Error(h+" map requires nshades to be at least size "+u.length);d=Array.isArray(t.alpha)?2!==t.alpha.length?[1,1]:t.alpha.slice():"number"==typeof t.alpha?[t.alpha,t.alpha]:[1,1];e=u.map(function(t){return Math.round(t.index*p)}),d[0]=Math.min(Math.max(d[0],0),1),d[1]=Math.min(Math.max(d[1],0),1);var m=u.map(function(t,e){var r=u[e].index,n=u[e].rgb.slice();return 4===n.length&&n[3]>=0&&n[3]<=1?n:(n[3]=d[0]+(d[1]-d[0])*r,n)}),v=[];for(g=0;g<e.length-1;++g){c=e[g+1]-e[g],r=m[g],l=m[g+1];for(var y=0;y<c;y++){var x=y/c;v.push([Math.round(i(r[0],l[0],x)),Math.round(i(r[1],l[1],x)),Math.round(i(r[2],l[2],x)),i(r[3],l[3],x)])}}v.push(u[u.length-1].rgb.concat(d[1])),"hex"===f?v=v.map(o):"rgbaString"===f?v=v.map(s):"float"===f&&(v=v.map(a));return v}},{"./colorScale":112,lerp:392}],114:[function(t,e,r){"use strict";e.exports=function(t,e,r,a){var o=n(e,r,a);if(0===o){var s=i(n(t,e,r)),c=i(n(t,e,a));if(s===c){if(0===s){var u=l(t,e,r),h=l(t,e,a);return u===h?0:u?1:-1}return 0}return 0===c?s>0?-1:l(t,e,a)?-1:1:0===s?c>0?1:l(t,e,r)?1:-1:i(c-s)}var f=n(t,e,r);if(f>0)return o>0&&n(t,e,a)>0?1:-1;if(f<0)return o>0||n(t,e,a)>0?1:-1;var p=n(t,e,a);return p>0?1:l(t,e,r)?1:-1};var n=t("robust-orientation"),i=t("signum"),a=t("two-sum"),o=t("robust-product"),s=t("robust-sum");function l(t,e,r){var n=a(t[0],-e[0]),i=a(t[1],-e[1]),l=a(r[0],-e[0]),c=a(r[1],-e[1]),u=s(o(n,l),o(i,c));return u[u.length-1]>=0}},{"robust-orientation":471,"robust-product":472,"robust-sum":476,signum:477,"two-sum":506}],115:[function(t,e,r){e.exports=function(t,e){var r=t.length,a=t.length-e.length;if(a)return a;switch(r){case 0:return 0;case 1:return t[0]-e[0];case 2:return t[0]+t[1]-e[0]-e[1]||n(t[0],t[1])-n(e[0],e[1]);case 3:var o=t[0]+t[1],s=e[0]+e[1];if(a=o+t[2]-(s+e[2]))return a;var l=n(t[0],t[1]),c=n(e[0],e[1]);return n(l,t[2])-n(c,e[2])||n(l+t[2],o)-n(c+e[2],s);case 4:var u=t[0],h=t[1],f=t[2],p=t[3],d=e[0],g=e[1],m=e[2],v=e[3];return u+h+f+p-(d+g+m+v)||n(u,h,f,p)-n(d,g,m,v,d)||n(u+h,u+f,u+p,h+f,h+p,f+p)-n(d+g,d+m,d+v,g+m,g+v,m+v)||n(u+h+f,u+h+p,u+f+p,h+f+p)-n(d+g+m,d+g+v,d+m+v,g+m+v);default:for(var y=t.slice().sort(i),x=e.slice().sort(i),b=0;b<r;++b)if(a=y[b]-x[b])return a;return 0}};var n=Math.min;function i(t,e){return t-e}},{}],116:[function(t,e,r){"use strict";var n=t("compare-cell"),i=t("cell-orientation");e.exports=function(t,e){return n(t,e)||i(t)-i(e)}},{"cell-orientation":99,"compare-cell":115}],117:[function(t,e,r){"use strict";var n=t("./lib/ch1d"),i=t("./lib/ch2d"),a=t("./lib/chnd");e.exports=function(t){var e=t.length;if(0===e)return[];if(1===e)return[[0]];var r=t[0].length;if(0===r)return[];if(1===r)return n(t);if(2===r)return i(t);return a(t,r)}},{"./lib/ch1d":118,"./lib/ch2d":119,"./lib/chnd":120}],118:[function(t,e,r){"use strict";e.exports=function(t){for(var e=0,r=0,n=1;n<t.length;++n)t[n][0]<t[e][0]&&(e=n),t[n][0]>t[r][0]&&(r=n);return e<r?[[e],[r]]:e>r?[[r],[e]]:[[e]]}},{}],119:[function(t,e,r){"use strict";e.exports=function(t){var e=n(t),r=e.length;if(r<=2)return[];for(var i=new Array(r),a=e[r-1],o=0;o<r;++o){var s=e[o];i[o]=[a,s],a=s}return i};var n=t("monotone-convex-hull-2d")},{"monotone-convex-hull-2d":401}],120:[function(t,e,r){"use strict";e.exports=function(t,e){try{return n(t,!0)}catch(s){var r=i(t);if(r.length<=e)return[];var a=function(t,e){for(var r=t.length,n=new Array(r),i=0;i<e.length;++i)n[i]=t[e[i]];for(var a=e.length,i=0;i<r;++i)e.indexOf(i)<0&&(n[a++]=t[i]);return n}(t,r),o=n(a,!0);return function(t,e){for(var r=t.length,n=e.length,i=0;i<r;++i)for(var a=t[i],o=0;o<a.length;++o){var s=a[o];if(s<n)a[o]=e[s];else{s-=n;for(var l=0;l<n;++l)s>=e[l]&&(s+=1);a[o]=s}}return t}(o,r)}};var n=t("incremental-convex-hull"),i=t("affine-hull")},{"affine-hull":53,"incremental-convex-hull":381}],121:[function(t,e,r){e.exports={AFG:"afghan",ALA:"\\b\\wland",ALB:"albania",DZA:"algeria",ASM:"^(?=.*americ).*samoa",AND:"andorra",AGO:"angola",AIA:"anguill?a",ATA:"antarctica",ATG:"antigua",ARG:"argentin",ARM:"armenia",ABW:"^(?!.*bonaire).*\\baruba",AUS:"australia",AUT:"^(?!.*hungary).*austria|\\baustri.*\\bemp",AZE:"azerbaijan",BHS:"bahamas",BHR:"bahrain",BGD:"bangladesh|^(?=.*east).*paki?stan",BRB:"barbados",BLR:"belarus|byelo",BEL:"^(?!.*luxem).*belgium",BLZ:"belize|^(?=.*british).*honduras",BEN:"benin|dahome",BMU:"bermuda",BTN:"bhutan",BOL:"bolivia",BES:"^(?=.*bonaire).*eustatius|^(?=.*carib).*netherlands|\\bbes.?islands",BIH:"herzegovina|bosnia",BWA:"botswana|bechuana",BVT:"bouvet",BRA:"brazil",IOT:"british.?indian.?ocean",BRN:"brunei",BGR:"bulgaria",BFA:"burkina|\\bfaso|upper.?volta",BDI:"burundi",CPV:"verde",KHM:"cambodia|kampuchea|khmer",CMR:"cameroon",CAN:"canada",CYM:"cayman",CAF:"\\bcentral.african.republic",TCD:"\\bchad",CHL:"\\bchile",CHN:"^(?!.*\\bmac)(?!.*\\bhong)(?!.*\\btai)(?!.*\\brep).*china|^(?=.*peo)(?=.*rep).*china",CXR:"christmas",CCK:"\\bcocos|keeling",COL:"colombia",COM:"comoro",COG:"^(?!.*\\bdem)(?!.*\\bd[\\.]?r)(?!.*kinshasa)(?!.*zaire)(?!.*belg)(?!.*l.opoldville)(?!.*free).*\\bcongo",COK:"\\bcook",CRI:"costa.?rica",CIV:"ivoire|ivory",HRV:"croatia",CUB:"\\bcuba",CUW:"^(?!.*bonaire).*\\bcura(c|\xe7)ao",CYP:"cyprus",CSK:"czechoslovakia",CZE:"^(?=.*rep).*czech|czechia|bohemia",COD:"\\bdem.*congo|congo.*\\bdem|congo.*\\bd[\\.]?r|\\bd[\\.]?r.*congo|belgian.?congo|congo.?free.?state|kinshasa|zaire|l.opoldville|drc|droc|rdc",DNK:"denmark",DJI:"djibouti",DMA:"dominica(?!n)",DOM:"dominican.rep",ECU:"ecuador",EGY:"egypt",SLV:"el.?salvador",GNQ:"guine.*eq|eq.*guine|^(?=.*span).*guinea",ERI:"eritrea",EST:"estonia",ETH:"ethiopia|abyssinia",FLK:"falkland|malvinas",FRO:"faroe|faeroe",FJI:"fiji",FIN:"finland",FRA:"^(?!.*\\bdep)(?!.*martinique).*france|french.?republic|\\bgaul",GUF:"^(?=.*french).*guiana",PYF:"french.?polynesia|tahiti",ATF:"french.?southern",GAB:"gabon",GMB:"gambia",GEO:"^(?!.*south).*georgia",DDR:"german.?democratic.?republic|democratic.?republic.*germany|east.germany",DEU:"^(?!.*east).*germany|^(?=.*\\bfed.*\\brep).*german",GHA:"ghana|gold.?coast",GIB:"gibraltar",GRC:"greece|hellenic|hellas",GRL:"greenland",GRD:"grenada",GLP:"guadeloupe",GUM:"\\bguam",GTM:"guatemala",GGY:"guernsey",GIN:"^(?!.*eq)(?!.*span)(?!.*bissau)(?!.*portu)(?!.*new).*guinea",GNB:"bissau|^(?=.*portu).*guinea",GUY:"guyana|british.?guiana",HTI:"haiti",HMD:"heard.*mcdonald",VAT:"holy.?see|vatican|papal.?st",HND:"^(?!.*brit).*honduras",HKG:"hong.?kong",HUN:"^(?!.*austr).*hungary",ISL:"iceland",IND:"india(?!.*ocea)",IDN:"indonesia",IRN:"\\biran|persia",IRQ:"\\biraq|mesopotamia",IRL:"(^ireland)|(^republic.*ireland)",IMN:"^(?=.*isle).*\\bman",ISR:"israel",ITA:"italy",JAM:"jamaica",JPN:"japan",JEY:"jersey",JOR:"jordan",KAZ:"kazak",KEN:"kenya|british.?east.?africa|east.?africa.?prot",KIR:"kiribati",PRK:"^(?=.*democrat|people|north|d.*p.*.r).*\\bkorea|dprk|korea.*(d.*p.*r)",KWT:"kuwait",KGZ:"kyrgyz|kirghiz",LAO:"\\blaos?\\b",LVA:"latvia",LBN:"lebanon",LSO:"lesotho|basuto",LBR:"liberia",LBY:"libya",LIE:"liechtenstein",LTU:"lithuania",LUX:"^(?!.*belg).*luxem",MAC:"maca(o|u)",MDG:"madagascar|malagasy",MWI:"malawi|nyasa",MYS:"malaysia",MDV:"maldive",MLI:"\\bmali\\b",MLT:"\\bmalta",MHL:"marshall",MTQ:"martinique",MRT:"mauritania",MUS:"mauritius",MYT:"\\bmayotte",MEX:"\\bmexic",FSM:"fed.*micronesia|micronesia.*fed",MCO:"monaco",MNG:"mongolia",MNE:"^(?!.*serbia).*montenegro",MSR:"montserrat",MAR:"morocco|\\bmaroc",MOZ:"mozambique",MMR:"myanmar|burma",NAM:"namibia",NRU:"nauru",NPL:"nepal",NLD:"^(?!.*\\bant)(?!.*\\bcarib).*netherlands",ANT:"^(?=.*\\bant).*(nether|dutch)",NCL:"new.?caledonia",NZL:"new.?zealand",NIC:"nicaragua",NER:"\\bniger(?!ia)",NGA:"nigeria",NIU:"niue",NFK:"norfolk",MNP:"mariana",NOR:"norway",OMN:"\\boman|trucial",PAK:"^(?!.*east).*paki?stan",PLW:"palau",PSE:"palestin|\\bgaza|west.?bank",PAN:"panama",PNG:"papua|new.?guinea",PRY:"paraguay",PER:"peru",PHL:"philippines",PCN:"pitcairn",POL:"poland",PRT:"portugal",PRI:"puerto.?rico",QAT:"qatar",KOR:"^(?!.*d.*p.*r)(?!.*democrat)(?!.*people)(?!.*north).*\\bkorea(?!.*d.*p.*r)",MDA:"moldov|b(a|e)ssarabia",REU:"r(e|\xe9)union",ROU:"r(o|u|ou)mania",RUS:"\\brussia|soviet.?union|u\\.?s\\.?s\\.?r|socialist.?republics",RWA:"rwanda",BLM:"barth(e|\xe9)lemy",SHN:"helena",KNA:"kitts|\\bnevis",LCA:"\\blucia",MAF:"^(?=.*collectivity).*martin|^(?=.*france).*martin(?!ique)|^(?=.*french).*martin(?!ique)",SPM:"miquelon",VCT:"vincent",WSM:"^(?!.*amer).*samoa",SMR:"san.?marino",STP:"\\bs(a|\xe3)o.?tom(e|\xe9)",SAU:"\\bsa\\w*.?arabia",SEN:"senegal",SRB:"^(?!.*monte).*serbia",SYC:"seychell",SLE:"sierra",SGP:"singapore",SXM:"^(?!.*martin)(?!.*saba).*maarten",SVK:"^(?!.*cze).*slovak",SVN:"slovenia",SLB:"solomon",SOM:"somali",ZAF:"south.africa|s\\\\..?africa",SGS:"south.?georgia|sandwich",SSD:"\\bs\\w*.?sudan",ESP:"spain",LKA:"sri.?lanka|ceylon",SDN:"^(?!.*\\bs(?!u)).*sudan",SUR:"surinam|dutch.?guiana",SJM:"svalbard",SWZ:"swaziland",SWE:"sweden",CHE:"switz|swiss",SYR:"syria",TWN:"taiwan|taipei|formosa|^(?!.*peo)(?=.*rep).*china",TJK:"tajik",THA:"thailand|\\bsiam",MKD:"macedonia|fyrom",TLS:"^(?=.*leste).*timor|^(?=.*east).*timor",TGO:"togo",TKL:"tokelau",TON:"tonga",TTO:"trinidad|tobago",TUN:"tunisia",TUR:"turkey",TKM:"turkmen",TCA:"turks",TUV:"tuvalu",UGA:"uganda",UKR:"ukrain",ARE:"emirates|^u\\.?a\\.?e\\.?$|united.?arab.?em",GBR:"united.?kingdom|britain|^u\\.?k\\.?$",TZA:"tanzania",USA:"united.?states\\b(?!.*islands)|\\bu\\.?s\\.?a\\.?\\b|^\\s*u\\.?s\\.?\\b(?!.*islands)",UMI:"minor.?outlying.?is",URY:"uruguay",UZB:"uzbek",VUT:"vanuatu|new.?hebrides",VEN:"venezuela",VNM:"^(?!.*republic).*viet.?nam|^(?=.*socialist).*viet.?nam",VGB:"^(?=.*\\bu\\.?\\s?k).*virgin|^(?=.*brit).*virgin|^(?=.*kingdom).*virgin",VIR:"^(?=.*\\bu\\.?\\s?s).*virgin|^(?=.*states).*virgin",WLF:"futuna|wallis",ESH:"western.sahara",YEM:"^(?!.*arab)(?!.*north)(?!.*sana)(?!.*peo)(?!.*dem)(?!.*south)(?!.*aden)(?!.*\\bp\\.?d\\.?r).*yemen",YMD:"^(?=.*peo).*yemen|^(?!.*rep)(?=.*dem).*yemen|^(?=.*south).*yemen|^(?=.*aden).*yemen|^(?=.*\\bp\\.?d\\.?r).*yemen",YUG:"yugoslavia",ZMB:"zambia|northern.?rhodesia",EAZ:"zanzibar",ZWE:"zimbabwe|^(?!.*northern).*rhodesia"}},{}],122:[function(t,e,r){e.exports=["xx-small","x-small","small","medium","large","x-large","xx-large","larger","smaller"]},{}],123:[function(t,e,r){e.exports=["normal","condensed","semi-condensed","extra-condensed","ultra-condensed","expanded","semi-expanded","extra-expanded","ultra-expanded"]},{}],124:[function(t,e,r){e.exports=["normal","italic","oblique"]},{}],125:[function(t,e,r){e.exports=["normal","bold","bolder","lighter","100","200","300","400","500","600","700","800","900"]},{}],126:[function(t,e,r){"use strict";e.exports={parse:t("./parse"),stringify:t("./stringify")}},{"./parse":128,"./stringify":129}],127:[function(t,e,r){"use strict";var n=t("css-font-size-keywords");e.exports={isSize:function(t){return/^[\d\.]/.test(t)||-1!==t.indexOf("/")||-1!==n.indexOf(t)}}},{"css-font-size-keywords":122}],128:[function(t,e,r){"use strict";var n=t("unquote"),i=t("css-global-keywords"),a=t("css-system-font-keywords"),o=t("css-font-weight-keywords"),s=t("css-font-style-keywords"),l=t("css-font-stretch-keywords"),c=t("string-split-by"),u=t("./lib/util").isSize;e.exports=f;var h=f.cache={};function f(t){if("string"!=typeof t)throw new Error("Font argument must be a string.");if(h[t])return h[t];if(""===t)throw new Error("Cannot parse an empty string.");if(-1!==a.indexOf(t))return h[t]={system:t};for(var e,r={style:"normal",variant:"normal",weight:"normal",stretch:"normal",lineHeight:"normal",size:"1rem",family:["serif"]},f=c(t,/\s+/);e=f.shift();){if(-1!==i.indexOf(e))return["style","variant","weight","stretch"].forEach(function(t){r[t]=e}),h[t]=r;if(-1===s.indexOf(e))if("normal"!==e&&"small-caps"!==e)if(-1===l.indexOf(e)){if(-1===o.indexOf(e)){if(u(e)){var d=c(e,"/");if(r.size=d[0],null!=d[1]?r.lineHeight=p(d[1]):"/"===f[0]&&(f.shift(),r.lineHeight=p(f.shift())),!f.length)throw new Error("Missing required font-family.");return r.family=c(f.join(" "),/\s*,\s*/).map(n),h[t]=r}throw new Error("Unknown or unsupported font token: "+e)}r.weight=e}else r.stretch=e;else r.variant=e;else r.style=e}throw new Error("Missing required font-size.")}function p(t){var e=parseFloat(t);return e.toString()===t?e:t}},{"./lib/util":127,"css-font-stretch-keywords":123,"css-font-style-keywords":124,"css-font-weight-keywords":125,"css-global-keywords":130,"css-system-font-keywords":131,"string-split-by":490,unquote:510}],129:[function(t,e,r){"use strict";var n=t("pick-by-alias"),i=t("./lib/util").isSize,a=g(t("css-global-keywords")),o=g(t("css-system-font-keywords")),s=g(t("css-font-weight-keywords")),l=g(t("css-font-style-keywords")),c=g(t("css-font-stretch-keywords")),u={normal:1,"small-caps":1},h={serif:1,"sans-serif":1,monospace:1,cursive:1,fantasy:1,"system-ui":1},f="1rem",p="serif";function d(t,e){if(t&&!e[t]&&!a[t])throw Error("Unknown keyword `"+t+"`");return t}function g(t){for(var e={},r=0;r<t.length;r++)e[t[r]]=1;return e}e.exports=function(t){if((t=n(t,{style:"style fontstyle fontStyle font-style slope distinction",variant:"variant font-variant fontVariant fontvariant var capitalization",weight:"weight w font-weight fontWeight fontweight",stretch:"stretch font-stretch fontStretch fontstretch width",size:"size s font-size fontSize fontsize height em emSize",lineHeight:"lh line-height lineHeight lineheight leading",family:"font family fontFamily font-family fontfamily type typeface face",system:"system reserved default global"})).system)return t.system&&d(t.system,o),t.system;if(d(t.style,l),d(t.variant,u),d(t.weight,s),d(t.stretch,c),null==t.size&&(t.size=f),"number"==typeof t.size&&(t.size+="px"),!i)throw Error("Bad size value `"+t.size+"`");t.family||(t.family=p),Array.isArray(t.family)&&(t.family.length||(t.family=[p]),t.family=t.family.map(function(t){return h[t]?t:'"'+t+'"'}).join(", "));var e=[];return e.push(t.style),t.variant!==t.style&&e.push(t.variant),t.weight!==t.variant&&t.weight!==t.style&&e.push(t.weight),t.stretch!==t.weight&&t.stretch!==t.variant&&t.stretch!==t.style&&e.push(t.stretch),e.push(t.size+(null==t.lineHeight||"normal"===t.lineHeight||t.lineHeight+""=="1"?"":"/"+t.lineHeight)),e.push(t.family),e.filter(Boolean).join(" ")}},{"./lib/util":127,"css-font-stretch-keywords":123,"css-font-style-keywords":124,"css-font-weight-keywords":125,"css-global-keywords":130,"css-system-font-keywords":131,"pick-by-alias":432}],130:[function(t,e,r){e.exports=["inherit","initial","unset"]},{}],131:[function(t,e,r){e.exports=["caption","icon","menu","message-box","small-caption","status-bar"]},{}],132:[function(t,e,r){"use strict";e.exports=function(t,e,r,n,i,a){var o=i-1,s=i*i,l=o*o,c=(1+2*i)*l,u=i*l,h=s*(3-2*i),f=s*o;if(t.length){a||(a=new Array(t.length));for(var p=t.length-1;p>=0;--p)a[p]=c*t[p]+u*e[p]+h*r[p]+f*n[p];return a}return c*t+u*e+h*r+f*n},e.exports.derivative=function(t,e,r,n,i,a){var o=6*i*i-6*i,s=3*i*i-4*i+1,l=-6*i*i+6*i,c=3*i*i-2*i;if(t.length){a||(a=new Array(t.length));for(var u=t.length-1;u>=0;--u)a[u]=o*t[u]+s*e[u]+l*r[u]+c*n[u];return a}return o*t+s*e+l*r[u]+c*n}},{}],133:[function(t,e,r){"use strict";var n=t("./lib/thunk.js");function i(){this.argTypes=[],this.shimArgs=[],this.arrayArgs=[],this.arrayBlockIndices=[],this.scalarArgs=[],this.offsetArgs=[],this.offsetArgIndex=[],this.indexArgs=[],this.shapeArgs=[],this.funcName="",this.pre=null,this.body=null,this.post=null,this.debug=!1}e.exports=function(t){var e=new i;e.pre=t.pre,e.body=t.body,e.post=t.post;var r=t.args.slice(0);e.argTypes=r;for(var a=0;a<r.length;++a){var o=r[a];if("array"===o||"object"==typeof o&&o.blockIndices){if(e.argTypes[a]="array",e.arrayArgs.push(a),e.arrayBlockIndices.push(o.blockIndices?o.blockIndices:0),e.shimArgs.push("array"+a),a<e.pre.args.length&&e.pre.args[a].count>0)throw new Error("cwise: pre() block may not reference array args");if(a<e.post.args.length&&e.post.args[a].count>0)throw new Error("cwise: post() block may not reference array args")}else if("scalar"===o)e.scalarArgs.push(a),e.shimArgs.push("scalar"+a);else if("index"===o){if(e.indexArgs.push(a),a<e.pre.args.length&&e.pre.args[a].count>0)throw new Error("cwise: pre() block may not reference array index");if(a<e.body.args.length&&e.body.args[a].lvalue)throw new Error("cwise: body() block may not write to array index");if(a<e.post.args.length&&e.post.args[a].count>0)throw new Error("cwise: post() block may not reference array index")}else if("shape"===o){if(e.shapeArgs.push(a),a<e.pre.args.length&&e.pre.args[a].lvalue)throw new Error("cwise: pre() block may not write to array shape");if(a<e.body.args.length&&e.body.args[a].lvalue)throw new Error("cwise: body() block may not write to array shape");if(a<e.post.args.length&&e.post.args[a].lvalue)throw new Error("cwise: post() block may not write to array shape")}else{if("object"!=typeof o||!o.offset)throw new Error("cwise: Unknown argument type "+r[a]);e.argTypes[a]="offset",e.offsetArgs.push({array:o.array,offset:o.offset}),e.offsetArgIndex.push(a)}}if(e.arrayArgs.length<=0)throw new Error("cwise: No array arguments specified");if(e.pre.args.length>r.length)throw new Error("cwise: Too many arguments in pre() block");if(e.body.args.length>r.length)throw new Error("cwise: Too many arguments in body() block");if(e.post.args.length>r.length)throw new Error("cwise: Too many arguments in post() block");return e.debug=!!t.printCode||!!t.debug,e.funcName=t.funcName||"cwise",e.blockSize=t.blockSize||64,n(e)}},{"./lib/thunk.js":135}],134:[function(t,e,r){"use strict";var n=t("uniq");function i(t,e,r){var n,i,a=t.length,o=e.arrayArgs.length,s=e.indexArgs.length>0,l=[],c=[],u=0,h=0;for(n=0;n<a;++n)c.push(["i",n,"=0"].join(""));for(i=0;i<o;++i)for(n=0;n<a;++n)h=u,u=t[n],0===n?c.push(["d",i,"s",n,"=t",i,"p",u].join("")):c.push(["d",i,"s",n,"=(t",i,"p",u,"-s",h,"*t",i,"p",h,")"].join(""));for(c.length>0&&l.push("var "+c.join(",")),n=a-1;n>=0;--n)u=t[n],l.push(["for(i",n,"=0;i",n,"<s",u,";++i",n,"){"].join(""));for(l.push(r),n=0;n<a;++n){for(h=u,u=t[n],i=0;i<o;++i)l.push(["p",i,"+=d",i,"s",n].join(""));s&&(n>0&&l.push(["index[",h,"]-=s",h].join("")),l.push(["++index[",u,"]"].join(""))),l.push("}")}return l.join("\n")}function a(t,e,r){for(var n=t.body,i=[],a=[],o=0;o<t.args.length;++o){var s=t.args[o];if(!(s.count<=0)){var l=new RegExp(s.name,"g"),c="",u=e.arrayArgs.indexOf(o);switch(e.argTypes[o]){case"offset":var h=e.offsetArgIndex.indexOf(o);u=e.offsetArgs[h].array,c="+q"+h;case"array":c="p"+u+c;var f="l"+o,p="a"+u;if(0===e.arrayBlockIndices[u])1===s.count?"generic"===r[u]?s.lvalue?(i.push(["var ",f,"=",p,".get(",c,")"].join("")),n=n.replace(l,f),a.push([p,".set(",c,",",f,")"].join(""))):n=n.replace(l,[p,".get(",c,")"].join("")):n=n.replace(l,[p,"[",c,"]"].join("")):"generic"===r[u]?(i.push(["var ",f,"=",p,".get(",c,")"].join("")),n=n.replace(l,f),s.lvalue&&a.push([p,".set(",c,",",f,")"].join(""))):(i.push(["var ",f,"=",p,"[",c,"]"].join("")),n=n.replace(l,f),s.lvalue&&a.push([p,"[",c,"]=",f].join("")));else{for(var d=[s.name],g=[c],m=0;m<Math.abs(e.arrayBlockIndices[u]);m++)d.push("\\s*\\[([^\\]]+)\\]"),g.push("$"+(m+1)+"*t"+u+"b"+m);if(l=new RegExp(d.join(""),"g"),c=g.join("+"),"generic"===r[u])throw new Error("cwise: Generic arrays not supported in combination with blocks!");n=n.replace(l,[p,"[",c,"]"].join(""))}break;case"scalar":n=n.replace(l,"Y"+e.scalarArgs.indexOf(o));break;case"index":n=n.replace(l,"index");break;case"shape":n=n.replace(l,"shape")}}}return[i.join("\n"),n,a.join("\n")].join("\n").trim()}e.exports=function(t,e){for(var r=e[1].length-Math.abs(t.arrayBlockIndices[0])|0,o=new Array(t.arrayArgs.length),s=new Array(t.arrayArgs.length),l=0;l<t.arrayArgs.length;++l)s[l]=e[2*l],o[l]=e[2*l+1];var c=[],u=[],h=[],f=[],p=[];for(l=0;l<t.arrayArgs.length;++l){t.arrayBlockIndices[l]<0?(h.push(0),f.push(r),c.push(r),u.push(r+t.arrayBlockIndices[l])):(h.push(t.arrayBlockIndices[l]),f.push(t.arrayBlockIndices[l]+r),c.push(0),u.push(t.arrayBlockIndices[l]));for(var d=[],g=0;g<o[l].length;g++)h[l]<=o[l][g]&&o[l][g]<f[l]&&d.push(o[l][g]-h[l]);p.push(d)}var m=["SS"],v=["'use strict'"],y=[];for(g=0;g<r;++g)y.push(["s",g,"=SS[",g,"]"].join(""));for(l=0;l<t.arrayArgs.length;++l){for(m.push("a"+l),m.push("t"+l),m.push("p"+l),g=0;g<r;++g)y.push(["t",l,"p",g,"=t",l,"[",h[l]+g,"]"].join(""));for(g=0;g<Math.abs(t.arrayBlockIndices[l]);++g)y.push(["t",l,"b",g,"=t",l,"[",c[l]+g,"]"].join(""))}for(l=0;l<t.scalarArgs.length;++l)m.push("Y"+l);if(t.shapeArgs.length>0&&y.push("shape=SS.slice(0)"),t.indexArgs.length>0){var x=new Array(r);for(l=0;l<r;++l)x[l]="0";y.push(["index=[",x.join(","),"]"].join(""))}for(l=0;l<t.offsetArgs.length;++l){var b=t.offsetArgs[l],_=[];for(g=0;g<b.offset.length;++g)0!==b.offset[g]&&(1===b.offset[g]?_.push(["t",b.array,"p",g].join("")):_.push([b.offset[g],"*t",b.array,"p",g].join("")));0===_.length?y.push("q"+l+"=0"):y.push(["q",l,"=",_.join("+")].join(""))}var w=n([].concat(t.pre.thisVars).concat(t.body.thisVars).concat(t.post.thisVars));for((y=y.concat(w)).length>0&&v.push("var "+y.join(",")),l=0;l<t.arrayArgs.length;++l)v.push("p"+l+"|=0");t.pre.body.length>3&&v.push(a(t.pre,t,s));var k=a(t.body,t,s),M=function(t){for(var e=0,r=t[0].length;e<r;){for(var n=1;n<t.length;++n)if(t[n][e]!==t[0][e])return e;++e}return e}(p);M<r?v.push(function(t,e,r,n){for(var a=e.length,o=r.arrayArgs.length,s=r.blockSize,l=r.indexArgs.length>0,c=[],u=0;u<o;++u)c.push(["var offset",u,"=p",u].join(""));for(u=t;u<a;++u)c.push(["for(var j"+u+"=SS[",e[u],"]|0;j",u,">0;){"].join("")),c.push(["if(j",u,"<",s,"){"].join("")),c.push(["s",e[u],"=j",u].join("")),c.push(["j",u,"=0"].join("")),c.push(["}else{s",e[u],"=",s].join("")),c.push(["j",u,"-=",s,"}"].join("")),l&&c.push(["index[",e[u],"]=j",u].join(""));for(u=0;u<o;++u){for(var h=["offset"+u],f=t;f<a;++f)h.push(["j",f,"*t",u,"p",e[f]].join(""));c.push(["p",u,"=(",h.join("+"),")"].join(""))}for(c.push(i(e,r,n)),u=t;u<a;++u)c.push("}");return c.join("\n")}(M,p[0],t,k)):v.push(i(p[0],t,k)),t.post.body.length>3&&v.push(a(t.post,t,s)),t.debug&&console.log("-----Generated cwise routine for ",e,":\n"+v.join("\n")+"\n----------");var A=[t.funcName||"unnamed","_cwise_loop_",o[0].join("s"),"m",M,function(t){for(var e=new Array(t.length),r=!0,n=0;n<t.length;++n){var i=t[n],a=i.match(/\d+/);a=a?a[0]:"",0===i.charAt(0)?e[n]="u"+i.charAt(1)+a:e[n]=i.charAt(0)+a,n>0&&(r=r&&e[n]===e[n-1])}return r?e[0]:e.join("")}(s)].join("");return new Function(["function ",A,"(",m.join(","),"){",v.join("\n"),"} return ",A].join(""))()}},{uniq:509}],135:[function(t,e,r){"use strict";var n=t("./compile.js");e.exports=function(t){var e=["'use strict'","var CACHED={}"],r=[],i=t.funcName+"_cwise_thunk";e.push(["return function ",i,"(",t.shimArgs.join(","),"){"].join(""));for(var a=[],o=[],s=[["array",t.arrayArgs[0],".shape.slice(",Math.max(0,t.arrayBlockIndices[0]),t.arrayBlockIndices[0]<0?","+t.arrayBlockIndices[0]+")":")"].join("")],l=[],c=[],u=0;u<t.arrayArgs.length;++u){var h=t.arrayArgs[u];r.push(["t",h,"=array",h,".dtype,","r",h,"=array",h,".order"].join("")),a.push("t"+h),a.push("r"+h),o.push("t"+h),o.push("r"+h+".join()"),s.push("array"+h+".data"),s.push("array"+h+".stride"),s.push("array"+h+".offset|0"),u>0&&(l.push("array"+t.arrayArgs[0]+".shape.length===array"+h+".shape.length+"+(Math.abs(t.arrayBlockIndices[0])-Math.abs(t.arrayBlockIndices[u]))),c.push("array"+t.arrayArgs[0]+".shape[shapeIndex+"+Math.max(0,t.arrayBlockIndices[0])+"]===array"+h+".shape[shapeIndex+"+Math.max(0,t.arrayBlockIndices[u])+"]"))}for(t.arrayArgs.length>1&&(e.push("if (!("+l.join(" && ")+")) throw new Error('cwise: Arrays do not all have the same dimensionality!')"),e.push("for(var shapeIndex=array"+t.arrayArgs[0]+".shape.length-"+Math.abs(t.arrayBlockIndices[0])+"; shapeIndex--\x3e0;) {"),e.push("if (!("+c.join(" && ")+")) throw new Error('cwise: Arrays do not all have the same shape!')"),e.push("}")),u=0;u<t.scalarArgs.length;++u)s.push("scalar"+t.scalarArgs[u]);return r.push(["type=[",o.join(","),"].join()"].join("")),r.push("proc=CACHED[type]"),e.push("var "+r.join(",")),e.push(["if(!proc){","CACHED[type]=proc=compile([",a.join(","),"])}","return proc(",s.join(","),")}"].join("")),t.debug&&console.log("-----Generated thunk:\n"+e.join("\n")+"\n----------"),new Function("compile",e.join("\n"))(n.bind(void 0,t))}},{"./compile.js":134}],136:[function(t,e,r){e.exports=t("cwise-compiler")},{"cwise-compiler":133}],137:[function(t,e,r){"use strict";var n,i=t("es5-ext/object/copy"),a=t("es5-ext/object/normalize-options"),o=t("es5-ext/object/valid-callable"),s=t("es5-ext/object/map"),l=t("es5-ext/object/valid-callable"),c=t("es5-ext/object/valid-value"),u=Function.prototype.bind,h=Object.defineProperty,f=Object.prototype.hasOwnProperty;n=function(t,e,r){var n,a=c(e)&&l(e.value);return delete(n=i(e)).writable,delete n.value,n.get=function(){return!r.overwriteDefinition&&f.call(this,t)?a:(e.value=u.call(a,r.resolveContext?r.resolveContext(this):this),h(this,t,e),this[t])},n},e.exports=function(t){var e=a(arguments[1]);return null!=e.resolveContext&&o(e.resolveContext),s(t,function(t,r){return n(r,t,e)})}},{"es5-ext/object/copy":173,"es5-ext/object/map":182,"es5-ext/object/normalize-options":183,"es5-ext/object/valid-callable":187,"es5-ext/object/valid-value":189}],138:[function(t,e,r){"use strict";var n=t("es5-ext/object/assign"),i=t("es5-ext/object/normalize-options"),a=t("es5-ext/object/is-callable"),o=t("es5-ext/string/#/contains");(e.exports=function(t,e){var r,a,s,l,c;return arguments.length<2||"string"!=typeof t?(l=e,e=t,t=null):l=arguments[2],null==t?(r=s=!0,a=!1):(r=o.call(t,"c"),a=o.call(t,"e"),s=o.call(t,"w")),c={value:e,configurable:r,enumerable:a,writable:s},l?n(i(l),c):c}).gs=function(t,e,r){var s,l,c,u;return"string"!=typeof t?(c=r,r=e,e=t,t=null):c=arguments[3],null==e?e=void 0:a(e)?null==r?r=void 0:a(r)||(c=r,r=void 0):(c=e,e=r=void 0),null==t?(s=!0,l=!1):(s=o.call(t,"c"),l=o.call(t,"e")),u={get:e,set:r,configurable:s,enumerable:l},c?n(i(c),u):u}},{"es5-ext/object/assign":170,"es5-ext/object/is-callable":176,"es5-ext/object/normalize-options":183,"es5-ext/string/#/contains":190}],139:[function(t,e,r){var n;n=this,function(t){"use strict";var e=function(t,e){return t<e?-1:t>e?1:t>=e?0:NaN},r=function(t){var r;return 1===t.length&&(r=t,t=function(t,n){return e(r(t),n)}),{left:function(e,r,n,i){for(null==n&&(n=0),null==i&&(i=e.length);n<i;){var a=n+i>>>1;t(e[a],r)<0?n=a+1:i=a}return n},right:function(e,r,n,i){for(null==n&&(n=0),null==i&&(i=e.length);n<i;){var a=n+i>>>1;t(e[a],r)>0?i=a:n=a+1}return n}}};var n=r(e),i=n.right,a=n.left;function o(t,e){return[t,e]}var s=function(t){return null===t?NaN:+t},l=function(t,e){var r,n,i=t.length,a=0,o=-1,l=0,c=0;if(null==e)for(;++o<i;)isNaN(r=s(t[o]))||(c+=(n=r-l)*(r-(l+=n/++a)));else for(;++o<i;)isNaN(r=s(e(t[o],o,t)))||(c+=(n=r-l)*(r-(l+=n/++a)));if(a>1)return c/(a-1)},c=function(t,e){var r=l(t,e);return r?Math.sqrt(r):r},u=function(t,e){var r,n,i,a=t.length,o=-1;if(null==e){for(;++o<a;)if(null!=(r=t[o])&&r>=r)for(n=i=r;++o<a;)null!=(r=t[o])&&(n>r&&(n=r),i<r&&(i=r))}else for(;++o<a;)if(null!=(r=e(t[o],o,t))&&r>=r)for(n=i=r;++o<a;)null!=(r=e(t[o],o,t))&&(n>r&&(n=r),i<r&&(i=r));return[n,i]},h=Array.prototype,f=h.slice,p=h.map,d=function(t){return function(){return t}},g=function(t){return t},m=function(t,e,r){t=+t,e=+e,r=(i=arguments.length)<2?(e=t,t=0,1):i<3?1:+r;for(var n=-1,i=0|Math.max(0,Math.ceil((e-t)/r)),a=new Array(i);++n<i;)a[n]=t+n*r;return a},v=Math.sqrt(50),y=Math.sqrt(10),x=Math.sqrt(2);function b(t,e,r){var n=(e-t)/Math.max(0,r),i=Math.floor(Math.log(n)/Math.LN10),a=n/Math.pow(10,i);return i>=0?(a>=v?10:a>=y?5:a>=x?2:1)*Math.pow(10,i):-Math.pow(10,-i)/(a>=v?10:a>=y?5:a>=x?2:1)}function _(t,e,r){var n=Math.abs(e-t)/Math.max(0,r),i=Math.pow(10,Math.floor(Math.log(n)/Math.LN10)),a=n/i;return a>=v?i*=10:a>=y?i*=5:a>=x&&(i*=2),e<t?-i:i}var w=function(t){return Math.ceil(Math.log(t.length)/Math.LN2)+1},k=function(t,e,r){if(null==r&&(r=s),n=t.length){if((e=+e)<=0||n<2)return+r(t[0],0,t);if(e>=1)return+r(t[n-1],n-1,t);var n,i=(n-1)*e,a=Math.floor(i),o=+r(t[a],a,t);return o+(+r(t[a+1],a+1,t)-o)*(i-a)}},M=function(t,e){var r,n,i=t.length,a=-1;if(null==e){for(;++a<i;)if(null!=(r=t[a])&&r>=r)for(n=r;++a<i;)null!=(r=t[a])&&n>r&&(n=r)}else for(;++a<i;)if(null!=(r=e(t[a],a,t))&&r>=r)for(n=r;++a<i;)null!=(r=e(t[a],a,t))&&n>r&&(n=r);return n},A=function(t){if(!(i=t.length))return[];for(var e=-1,r=M(t,T),n=new Array(r);++e<r;)for(var i,a=-1,o=n[e]=new Array(i);++a<i;)o[a]=t[a][e];return n};function T(t){return t.length}t.bisect=i,t.bisectRight=i,t.bisectLeft=a,t.ascending=e,t.bisector=r,t.cross=function(t,e,r){var n,i,a,s,l=t.length,c=e.length,u=new Array(l*c);for(null==r&&(r=o),n=a=0;n<l;++n)for(s=t[n],i=0;i<c;++i,++a)u[a]=r(s,e[i]);return u},t.descending=function(t,e){return e<t?-1:e>t?1:e>=t?0:NaN},t.deviation=c,t.extent=u,t.histogram=function(){var t=g,e=u,r=w;function n(n){var a,o,s=n.length,l=new Array(s);for(a=0;a<s;++a)l[a]=t(n[a],a,n);var c=e(l),u=c[0],h=c[1],f=r(l,u,h);Array.isArray(f)||(f=_(u,h,f),f=m(Math.ceil(u/f)*f,Math.floor(h/f)*f,f));for(var p=f.length;f[0]<=u;)f.shift(),--p;for(;f[p-1]>h;)f.pop(),--p;var d,g=new Array(p+1);for(a=0;a<=p;++a)(d=g[a]=[]).x0=a>0?f[a-1]:u,d.x1=a<p?f[a]:h;for(a=0;a<s;++a)u<=(o=l[a])&&o<=h&&g[i(f,o,0,p)].push(n[a]);return g}return n.value=function(e){return arguments.length?(t="function"==typeof e?e:d(e),n):t},n.domain=function(t){return arguments.length?(e="function"==typeof t?t:d([t[0],t[1]]),n):e},n.thresholds=function(t){return arguments.length?(r="function"==typeof t?t:Array.isArray(t)?d(f.call(t)):d(t),n):r},n},t.thresholdFreedmanDiaconis=function(t,r,n){return t=p.call(t,s).sort(e),Math.ceil((n-r)/(2*(k(t,.75)-k(t,.25))*Math.pow(t.length,-1/3)))},t.thresholdScott=function(t,e,r){return Math.ceil((r-e)/(3.5*c(t)*Math.pow(t.length,-1/3)))},t.thresholdSturges=w,t.max=function(t,e){var r,n,i=t.length,a=-1;if(null==e){for(;++a<i;)if(null!=(r=t[a])&&r>=r)for(n=r;++a<i;)null!=(r=t[a])&&r>n&&(n=r)}else for(;++a<i;)if(null!=(r=e(t[a],a,t))&&r>=r)for(n=r;++a<i;)null!=(r=e(t[a],a,t))&&r>n&&(n=r);return n},t.mean=function(t,e){var r,n=t.length,i=n,a=-1,o=0;if(null==e)for(;++a<n;)isNaN(r=s(t[a]))?--i:o+=r;else for(;++a<n;)isNaN(r=s(e(t[a],a,t)))?--i:o+=r;if(i)return o/i},t.median=function(t,r){var n,i=t.length,a=-1,o=[];if(null==r)for(;++a<i;)isNaN(n=s(t[a]))||o.push(n);else for(;++a<i;)isNaN(n=s(r(t[a],a,t)))||o.push(n);return k(o.sort(e),.5)},t.merge=function(t){for(var e,r,n,i=t.length,a=-1,o=0;++a<i;)o+=t[a].length;for(r=new Array(o);--i>=0;)for(e=(n=t[i]).length;--e>=0;)r[--o]=n[e];return r},t.min=M,t.pairs=function(t,e){null==e&&(e=o);for(var r=0,n=t.length-1,i=t[0],a=new Array(n<0?0:n);r<n;)a[r]=e(i,i=t[++r]);return a},t.permute=function(t,e){for(var r=e.length,n=new Array(r);r--;)n[r]=t[e[r]];return n},t.quantile=k,t.range=m,t.scan=function(t,r){if(n=t.length){var n,i,a=0,o=0,s=t[o];for(null==r&&(r=e);++a<n;)(r(i=t[a],s)<0||0!==r(s,s))&&(s=i,o=a);return 0===r(s,s)?o:void 0}},t.shuffle=function(t,e,r){for(var n,i,a=(null==r?t.length:r)-(e=null==e?0:+e);a;)i=Math.random()*a--|0,n=t[a+e],t[a+e]=t[i+e],t[i+e]=n;return t},t.sum=function(t,e){var r,n=t.length,i=-1,a=0;if(null==e)for(;++i<n;)(r=+t[i])&&(a+=r);else for(;++i<n;)(r=+e(t[i],i,t))&&(a+=r);return a},t.ticks=function(t,e,r){var n,i,a,o,s=-1;if(r=+r,(t=+t)==(e=+e)&&r>0)return[t];if((n=e<t)&&(i=t,t=e,e=i),0===(o=b(t,e,r))||!isFinite(o))return[];if(o>0)for(t=Math.ceil(t/o),e=Math.floor(e/o),a=new Array(i=Math.ceil(e-t+1));++s<i;)a[s]=(t+s)*o;else for(t=Math.floor(t*o),e=Math.ceil(e*o),a=new Array(i=Math.ceil(t-e+1));++s<i;)a[s]=(t-s)/o;return n&&a.reverse(),a},t.tickIncrement=b,t.tickStep=_,t.transpose=A,t.variance=l,t.zip=function(){return A(arguments)},Object.defineProperty(t,"__esModule",{value:!0})}("object"==typeof r&&"undefined"!=typeof e?r:n.d3=n.d3||{})},{}],140:[function(t,e,r){var n;n=this,function(t){"use strict";function e(){}function r(t,r){var n=new e;if(t instanceof e)t.each(function(t,e){n.set(e,t)});else if(Array.isArray(t)){var i,a=-1,o=t.length;if(null==r)for(;++a<o;)n.set(a,t[a]);else for(;++a<o;)n.set(r(i=t[a],a,t),i)}else if(t)for(var s in t)n.set(s,t[s]);return n}e.prototype=r.prototype={constructor:e,has:function(t){return"$"+t in this},get:function(t){return this["$"+t]},set:function(t,e){return this["$"+t]=e,this},remove:function(t){var e="$"+t;return e in this&&delete this[e]},clear:function(){for(var t in this)"$"===t[0]&&delete this[t]},keys:function(){var t=[];for(var e in this)"$"===e[0]&&t.push(e.slice(1));return t},values:function(){var t=[];for(var e in this)"$"===e[0]&&t.push(this[e]);return t},entries:function(){var t=[];for(var e in this)"$"===e[0]&&t.push({key:e.slice(1),value:this[e]});return t},size:function(){var t=0;for(var e in this)"$"===e[0]&&++t;return t},empty:function(){for(var t in this)if("$"===t[0])return!1;return!0},each:function(t){for(var e in this)"$"===e[0]&&t(this[e],e.slice(1),this)}};function n(){return{}}function i(t,e,r){t[e]=r}function a(){return r()}function o(t,e,r){t.set(e,r)}function s(){}var l=r.prototype;function c(t,e){var r=new s;if(t instanceof s)t.each(function(t){r.add(t)});else if(t){var n=-1,i=t.length;if(null==e)for(;++n<i;)r.add(t[n]);else for(;++n<i;)r.add(e(t[n],n,t))}return r}s.prototype=c.prototype={constructor:s,has:l.has,add:function(t){return this["$"+(t+="")]=t,this},remove:l.remove,clear:l.clear,values:l.keys,size:l.size,empty:l.empty,each:l.each};t.nest=function(){var t,e,s,l=[],c=[];function u(n,i,a,o){if(i>=l.length)return null!=t&&n.sort(t),null!=e?e(n):n;for(var s,c,h,f=-1,p=n.length,d=l[i++],g=r(),m=a();++f<p;)(h=g.get(s=d(c=n[f])+""))?h.push(c):g.set(s,[c]);return g.each(function(t,e){o(m,e,u(t,i,a,o))}),m}return s={object:function(t){return u(t,0,n,i)},map:function(t){return u(t,0,a,o)},entries:function(t){return function t(r,n){if(++n>l.length)return r;var i,a=c[n-1];return null!=e&&n>=l.length?i=r.entries():(i=[],r.each(function(e,r){i.push({key:r,values:t(e,n)})})),null!=a?i.sort(function(t,e){return a(t.key,e.key)}):i}(u(t,0,a,o),0)},key:function(t){return l.push(t),s},sortKeys:function(t){return c[l.length-1]=t,s},sortValues:function(e){return t=e,s},rollup:function(t){return e=t,s}}},t.set=c,t.map=r,t.keys=function(t){var e=[];for(var r in t)e.push(r);return e},t.values=function(t){var e=[];for(var r in t)e.push(t[r]);return e},t.entries=function(t){var e=[];for(var r in t)e.push({key:r,value:t[r]});return e},Object.defineProperty(t,"__esModule",{value:!0})}("object"==typeof r&&"undefined"!=typeof e?r:n.d3=n.d3||{})},{}],141:[function(t,e,r){var n;n=this,function(t){"use strict";var e=function(t,e,r){t.prototype=e.prototype=r,r.constructor=t};function r(t,e){var r=Object.create(t.prototype);for(var n in e)r[n]=e[n];return r}function n(){}var i="\\s*([+-]?\\d+)\\s*",a="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*",o="\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*",s=/^#([0-9a-f]{3})$/,l=/^#([0-9a-f]{6})$/,c=new RegExp("^rgb\\("+[i,i,i]+"\\)$"),u=new RegExp("^rgb\\("+[o,o,o]+"\\)$"),h=new RegExp("^rgba\\("+[i,i,i,a]+"\\)$"),f=new RegExp("^rgba\\("+[o,o,o,a]+"\\)$"),p=new RegExp("^hsl\\("+[a,o,o]+"\\)$"),d=new RegExp("^hsla\\("+[a,o,o,a]+"\\)$"),g={aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074};function m(t){var e;return t=(t+"").trim().toLowerCase(),(e=s.exec(t))?new _((e=parseInt(e[1],16))>>8&15|e>>4&240,e>>4&15|240&e,(15&e)<<4|15&e,1):(e=l.exec(t))?v(parseInt(e[1],16)):(e=c.exec(t))?new _(e[1],e[2],e[3],1):(e=u.exec(t))?new _(255*e[1]/100,255*e[2]/100,255*e[3]/100,1):(e=h.exec(t))?y(e[1],e[2],e[3],e[4]):(e=f.exec(t))?y(255*e[1]/100,255*e[2]/100,255*e[3]/100,e[4]):(e=p.exec(t))?w(e[1],e[2]/100,e[3]/100,1):(e=d.exec(t))?w(e[1],e[2]/100,e[3]/100,e[4]):g.hasOwnProperty(t)?v(g[t]):"transparent"===t?new _(NaN,NaN,NaN,0):null}function v(t){return new _(t>>16&255,t>>8&255,255&t,1)}function y(t,e,r,n){return n<=0&&(t=e=r=NaN),new _(t,e,r,n)}function x(t){return t instanceof n||(t=m(t)),t?new _((t=t.rgb()).r,t.g,t.b,t.opacity):new _}function b(t,e,r,n){return 1===arguments.length?x(t):new _(t,e,r,null==n?1:n)}function _(t,e,r,n){this.r=+t,this.g=+e,this.b=+r,this.opacity=+n}function w(t,e,r,n){return n<=0?t=e=r=NaN:r<=0||r>=1?t=e=NaN:e<=0&&(t=NaN),new M(t,e,r,n)}function k(t,e,r,i){return 1===arguments.length?function(t){if(t instanceof M)return new M(t.h,t.s,t.l,t.opacity);if(t instanceof n||(t=m(t)),!t)return new M;if(t instanceof M)return t;var e=(t=t.rgb()).r/255,r=t.g/255,i=t.b/255,a=Math.min(e,r,i),o=Math.max(e,r,i),s=NaN,l=o-a,c=(o+a)/2;return l?(s=e===o?(r-i)/l+6*(r<i):r===o?(i-e)/l+2:(e-r)/l+4,l/=c<.5?o+a:2-o-a,s*=60):l=c>0&&c<1?0:s,new M(s,l,c,t.opacity)}(t):new M(t,e,r,null==i?1:i)}function M(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}function A(t,e,r){return 255*(t<60?e+(r-e)*t/60:t<180?r:t<240?e+(r-e)*(240-t)/60:e)}e(n,m,{displayable:function(){return this.rgb().displayable()},toString:function(){return this.rgb()+""}}),e(_,b,r(n,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new _(this.r*t,this.g*t,this.b*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new _(this.r*t,this.g*t,this.b*t,this.opacity)},rgb:function(){return this},displayable:function(){return 0<=this.r&&this.r<=255&&0<=this.g&&this.g<=255&&0<=this.b&&this.b<=255&&0<=this.opacity&&this.opacity<=1},toString:function(){var t=this.opacity;return(1===(t=isNaN(t)?1:Math.max(0,Math.min(1,t)))?"rgb(":"rgba(")+Math.max(0,Math.min(255,Math.round(this.r)||0))+", "+Math.max(0,Math.min(255,Math.round(this.g)||0))+", "+Math.max(0,Math.min(255,Math.round(this.b)||0))+(1===t?")":", "+t+")")}})),e(M,k,r(n,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new M(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new M(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=this.h%360+360*(this.h<0),e=isNaN(t)||isNaN(this.s)?0:this.s,r=this.l,n=r+(r<.5?r:1-r)*e,i=2*r-n;return new _(A(t>=240?t-240:t+120,i,n),A(t,i,n),A(t<120?t+240:t-120,i,n),this.opacity)},displayable:function(){return(0<=this.s&&this.s<=1||isNaN(this.s))&&0<=this.l&&this.l<=1&&0<=this.opacity&&this.opacity<=1}}));var T=Math.PI/180,S=180/Math.PI,E=.95047,C=1,L=1.08883,z=4/29,P=6/29,I=3*P*P,O=P*P*P;function D(t){if(t instanceof B)return new B(t.l,t.a,t.b,t.opacity);if(t instanceof q){var e=t.h*T;return new B(t.l,Math.cos(e)*t.c,Math.sin(e)*t.c,t.opacity)}t instanceof _||(t=x(t));var r=V(t.r),n=V(t.g),i=V(t.b),a=F((.4124564*r+.3575761*n+.1804375*i)/E),o=F((.2126729*r+.7151522*n+.072175*i)/C);return new B(116*o-16,500*(a-o),200*(o-F((.0193339*r+.119192*n+.9503041*i)/L)),t.opacity)}function R(t,e,r,n){return 1===arguments.length?D(t):new B(t,e,r,null==n?1:n)}function B(t,e,r,n){this.l=+t,this.a=+e,this.b=+r,this.opacity=+n}function F(t){return t>O?Math.pow(t,1/3):t/I+z}function N(t){return t>P?t*t*t:I*(t-z)}function j(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function V(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function U(t,e,r,n){return 1===arguments.length?function(t){if(t instanceof q)return new q(t.h,t.c,t.l,t.opacity);t instanceof B||(t=D(t));var e=Math.atan2(t.b,t.a)*S;return new q(e<0?e+360:e,Math.sqrt(t.a*t.a+t.b*t.b),t.l,t.opacity)}(t):new q(t,e,r,null==n?1:n)}function q(t,e,r,n){this.h=+t,this.c=+e,this.l=+r,this.opacity=+n}e(B,R,r(n,{brighter:function(t){return new B(this.l+18*(null==t?1:t),this.a,this.b,this.opacity)},darker:function(t){return new B(this.l-18*(null==t?1:t),this.a,this.b,this.opacity)},rgb:function(){var t=(this.l+16)/116,e=isNaN(this.a)?t:t+this.a/500,r=isNaN(this.b)?t:t-this.b/200;return t=C*N(t),new _(j(3.2404542*(e=E*N(e))-1.5371385*t-.4985314*(r=L*N(r))),j(-.969266*e+1.8760108*t+.041556*r),j(.0556434*e-.2040259*t+1.0572252*r),this.opacity)}})),e(q,U,r(n,{brighter:function(t){return new q(this.h,this.c,this.l+18*(null==t?1:t),this.opacity)},darker:function(t){return new q(this.h,this.c,this.l-18*(null==t?1:t),this.opacity)},rgb:function(){return D(this).rgb()}}));var H=-.14861,G=1.78277,W=-.29227,Y=-.90649,X=1.97294,Z=X*Y,$=X*G,J=G*W-Y*H;function K(t,e,r,n){return 1===arguments.length?function(t){if(t instanceof Q)return new Q(t.h,t.s,t.l,t.opacity);t instanceof _||(t=x(t));var e=t.r/255,r=t.g/255,n=t.b/255,i=(J*n+Z*e-$*r)/(J+Z-$),a=n-i,o=(X*(r-i)-W*a)/Y,s=Math.sqrt(o*o+a*a)/(X*i*(1-i)),l=s?Math.atan2(o,a)*S-120:NaN;return new Q(l<0?l+360:l,s,i,t.opacity)}(t):new Q(t,e,r,null==n?1:n)}function Q(t,e,r,n){this.h=+t,this.s=+e,this.l=+r,this.opacity=+n}e(Q,K,r(n,{brighter:function(t){return t=null==t?1/.7:Math.pow(1/.7,t),new Q(this.h,this.s,this.l*t,this.opacity)},darker:function(t){return t=null==t?.7:Math.pow(.7,t),new Q(this.h,this.s,this.l*t,this.opacity)},rgb:function(){var t=isNaN(this.h)?0:(this.h+120)*T,e=+this.l,r=isNaN(this.s)?0:this.s*e*(1-e),n=Math.cos(t),i=Math.sin(t);return new _(255*(e+r*(H*n+G*i)),255*(e+r*(W*n+Y*i)),255*(e+r*(X*n)),this.opacity)}})),t.color=m,t.rgb=b,t.hsl=k,t.lab=R,t.hcl=U,t.cubehelix=K,Object.defineProperty(t,"__esModule",{value:!0})}("object"==typeof r&&"undefined"!=typeof e?r:n.d3=n.d3||{})},{}],142:[function(t,e,r){var n;n=this,function(t){"use strict";var e={value:function(){}};function r(){for(var t,e=0,r=arguments.length,i={};e<r;++e){if(!(t=arguments[e]+"")||t in i)throw new Error("illegal type: "+t);i[t]=[]}return new n(i)}function n(t){this._=t}function i(t,e){for(var r,n=0,i=t.length;n<i;++n)if((r=t[n]).name===e)return r.value}function a(t,r,n){for(var i=0,a=t.length;i<a;++i)if(t[i].name===r){t[i]=e,t=t.slice(0,i).concat(t.slice(i+1));break}return null!=n&&t.push({name:r,value:n}),t}n.prototype=r.prototype={constructor:n,on:function(t,e){var r,n,o=this._,s=(n=o,(t+"").trim().split(/^|\s+/).map(function(t){var e="",r=t.indexOf(".");if(r>=0&&(e=t.slice(r+1),t=t.slice(0,r)),t&&!n.hasOwnProperty(t))throw new Error("unknown type: "+t);return{type:t,name:e}})),l=-1,c=s.length;if(!(arguments.length<2)){if(null!=e&&"function"!=typeof e)throw new Error("invalid callback: "+e);for(;++l<c;)if(r=(t=s[l]).type)o[r]=a(o[r],t.name,e);else if(null==e)for(r in o)o[r]=a(o[r],t.name,null);return this}for(;++l<c;)if((r=(t=s[l]).type)&&(r=i(o[r],t.name)))return r},copy:function(){var t={},e=this._;for(var r in e)t[r]=e[r].slice();return new n(t)},call:function(t,e){if((r=arguments.length-2)>0)for(var r,n,i=new Array(r),a=0;a<r;++a)i[a]=arguments[a+2];if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(a=0,r=(n=this._[t]).length;a<r;++a)n[a].value.apply(e,i)},apply:function(t,e,r){if(!this._.hasOwnProperty(t))throw new Error("unknown type: "+t);for(var n=this._[t],i=0,a=n.length;i<a;++i)n[i].value.apply(e,r)}},t.dispatch=r,Object.defineProperty(t,"__esModule",{value:!0})}("object"==typeof r&&"undefined"!=typeof e?r:n.d3=n.d3||{})},{}],143:[function(t,e,r){var n,i;n=this,i=function(t,e,r,n,i){"use strict";var a=function(t){return function(){return t}},o=function(){return 1e-6*(Math.random()-.5)};function s(t){return t.x+t.vx}function l(t){return t.y+t.vy}function c(t){return t.index}function u(t,e){var r=t.get(e);if(!r)throw new Error("missing: "+e);return r}function h(t){return t.x}function f(t){return t.y}var p=10,d=Math.PI*(3-Math.sqrt(5));t.forceCenter=function(t,e){var r;function n(){var n,i,a=r.length,o=0,s=0;for(n=0;n<a;++n)o+=(i=r[n]).x,s+=i.y;for(o=o/a-t,s=s/a-e,n=0;n<a;++n)(i=r[n]).x-=o,i.y-=s}return null==t&&(t=0),null==e&&(e=0),n.initialize=function(t){r=t},n.x=function(e){return arguments.length?(t=+e,n):t},n.y=function(t){return arguments.length?(e=+t,n):e},n},t.forceCollide=function(t){var r,n,i=1,c=1;function u(){for(var t,a,u,f,p,d,g,m=r.length,v=0;v<c;++v)for(a=e.quadtree(r,s,l).visitAfter(h),t=0;t<m;++t)u=r[t],d=n[u.index],g=d*d,f=u.x+u.vx,p=u.y+u.vy,a.visit(y);function y(t,e,r,n,a){var s=t.data,l=t.r,c=d+l;if(!s)return e>f+c||n<f-c||r>p+c||a<p-c;if(s.index>u.index){var h=f-s.x-s.vx,m=p-s.y-s.vy,v=h*h+m*m;v<c*c&&(0===h&&(v+=(h=o())*h),0===m&&(v+=(m=o())*m),v=(c-(v=Math.sqrt(v)))/v*i,u.vx+=(h*=v)*(c=(l*=l)/(g+l)),u.vy+=(m*=v)*c,s.vx-=h*(c=1-c),s.vy-=m*c)}}}function h(t){if(t.data)return t.r=n[t.data.index];for(var e=t.r=0;e<4;++e)t[e]&&t[e].r>t.r&&(t.r=t[e].r)}function f(){if(r){var e,i,a=r.length;for(n=new Array(a),e=0;e<a;++e)i=r[e],n[i.index]=+t(i,e,r)}}return"function"!=typeof t&&(t=a(null==t?1:+t)),u.initialize=function(t){r=t,f()},u.iterations=function(t){return arguments.length?(c=+t,u):c},u.strength=function(t){return arguments.length?(i=+t,u):i},u.radius=function(e){return arguments.length?(t="function"==typeof e?e:a(+e),f(),u):t},u},t.forceLink=function(t){var e,n,i,s,l,h=c,f=function(t){return 1/Math.min(s[t.source.index],s[t.target.index])},p=a(30),d=1;function g(r){for(var i=0,a=t.length;i<d;++i)for(var s,c,u,h,f,p,g,m=0;m<a;++m)c=(s=t[m]).source,h=(u=s.target).x+u.vx-c.x-c.vx||o(),f=u.y+u.vy-c.y-c.vy||o(),h*=p=((p=Math.sqrt(h*h+f*f))-n[m])/p*r*e[m],f*=p,u.vx-=h*(g=l[m]),u.vy-=f*g,c.vx+=h*(g=1-g),c.vy+=f*g}function m(){if(i){var a,o,c=i.length,f=t.length,p=r.map(i,h);for(a=0,s=new Array(c);a<f;++a)(o=t[a]).index=a,"object"!=typeof o.source&&(o.source=u(p,o.source)),"object"!=typeof o.target&&(o.target=u(p,o.target)),s[o.source.index]=(s[o.source.index]||0)+1,s[o.target.index]=(s[o.target.index]||0)+1;for(a=0,l=new Array(f);a<f;++a)o=t[a],l[a]=s[o.source.index]/(s[o.source.index]+s[o.target.index]);e=new Array(f),v(),n=new Array(f),y()}}function v(){if(i)for(var r=0,n=t.length;r<n;++r)e[r]=+f(t[r],r,t)}function y(){if(i)for(var e=0,r=t.length;e<r;++e)n[e]=+p(t[e],e,t)}return null==t&&(t=[]),g.initialize=function(t){i=t,m()},g.links=function(e){return arguments.length?(t=e,m(),g):t},g.id=function(t){return arguments.length?(h=t,g):h},g.iterations=function(t){return arguments.length?(d=+t,g):d},g.strength=function(t){return arguments.length?(f="function"==typeof t?t:a(+t),v(),g):f},g.distance=function(t){return arguments.length?(p="function"==typeof t?t:a(+t),y(),g):p},g},t.forceManyBody=function(){var t,r,n,i,s=a(-30),l=1,c=1/0,u=.81;function p(i){var a,o=t.length,s=e.quadtree(t,h,f).visitAfter(g);for(n=i,a=0;a<o;++a)r=t[a],s.visit(m)}function d(){if(t){var e,r,n=t.length;for(i=new Array(n),e=0;e<n;++e)r=t[e],i[r.index]=+s(r,e,t)}}function g(t){var e,r,n,a,o,s=0,l=0;if(t.length){for(n=a=o=0;o<4;++o)(e=t[o])&&(r=Math.abs(e.value))&&(s+=e.value,l+=r,n+=r*e.x,a+=r*e.y);t.x=n/l,t.y=a/l}else{(e=t).x=e.data.x,e.y=e.data.y;do{s+=i[e.data.index]}while(e=e.next)}t.value=s}function m(t,e,a,s){if(!t.value)return!0;var h=t.x-r.x,f=t.y-r.y,p=s-e,d=h*h+f*f;if(p*p/u<d)return d<c&&(0===h&&(d+=(h=o())*h),0===f&&(d+=(f=o())*f),d<l&&(d=Math.sqrt(l*d)),r.vx+=h*t.value*n/d,r.vy+=f*t.value*n/d),!0;if(!(t.length||d>=c)){(t.data!==r||t.next)&&(0===h&&(d+=(h=o())*h),0===f&&(d+=(f=o())*f),d<l&&(d=Math.sqrt(l*d)));do{t.data!==r&&(p=i[t.data.index]*n/d,r.vx+=h*p,r.vy+=f*p)}while(t=t.next)}}return p.initialize=function(e){t=e,d()},p.strength=function(t){return arguments.length?(s="function"==typeof t?t:a(+t),d(),p):s},p.distanceMin=function(t){return arguments.length?(l=t*t,p):Math.sqrt(l)},p.distanceMax=function(t){return arguments.length?(c=t*t,p):Math.sqrt(c)},p.theta=function(t){return arguments.length?(u=t*t,p):Math.sqrt(u)},p},t.forceRadial=function(t,e,r){var n,i,o,s=a(.1);function l(t){for(var a=0,s=n.length;a<s;++a){var l=n[a],c=l.x-e||1e-6,u=l.y-r||1e-6,h=Math.sqrt(c*c+u*u),f=(o[a]-h)*i[a]*t/h;l.vx+=c*f,l.vy+=u*f}}function c(){if(n){var e,r=n.length;for(i=new Array(r),o=new Array(r),e=0;e<r;++e)o[e]=+t(n[e],e,n),i[e]=isNaN(o[e])?0:+s(n[e],e,n)}}return"function"!=typeof t&&(t=a(+t)),null==e&&(e=0),null==r&&(r=0),l.initialize=function(t){n=t,c()},l.strength=function(t){return arguments.length?(s="function"==typeof t?t:a(+t),c(),l):s},l.radius=function(e){return arguments.length?(t="function"==typeof e?e:a(+e),c(),l):t},l.x=function(t){return arguments.length?(e=+t,l):e},l.y=function(t){return arguments.length?(r=+t,l):r},l},t.forceSimulation=function(t){var e,a=1,o=.001,s=1-Math.pow(o,1/300),l=0,c=.6,u=r.map(),h=i.timer(g),f=n.dispatch("tick","end");function g(){m(),f.call("tick",e),a<o&&(h.stop(),f.call("end",e))}function m(){var e,r,n=t.length;for(a+=(l-a)*s,u.each(function(t){t(a)}),e=0;e<n;++e)null==(r=t[e]).fx?r.x+=r.vx*=c:(r.x=r.fx,r.vx=0),null==r.fy?r.y+=r.vy*=c:(r.y=r.fy,r.vy=0)}function v(){for(var e,r=0,n=t.length;r<n;++r){if((e=t[r]).index=r,isNaN(e.x)||isNaN(e.y)){var i=p*Math.sqrt(r),a=r*d;e.x=i*Math.cos(a),e.y=i*Math.sin(a)}(isNaN(e.vx)||isNaN(e.vy))&&(e.vx=e.vy=0)}}function y(e){return e.initialize&&e.initialize(t),e}return null==t&&(t=[]),v(),e={tick:m,restart:function(){return h.restart(g),e},stop:function(){return h.stop(),e},nodes:function(r){return arguments.length?(t=r,v(),u.each(y),e):t},alpha:function(t){return arguments.length?(a=+t,e):a},alphaMin:function(t){return arguments.length?(o=+t,e):o},alphaDecay:function(t){return arguments.length?(s=+t,e):+s},alphaTarget:function(t){return arguments.length?(l=+t,e):l},velocityDecay:function(t){return arguments.length?(c=1-t,e):1-c},force:function(t,r){return arguments.length>1?(null==r?u.remove(t):u.set(t,y(r)),e):u.get(t)},find:function(e,r,n){var i,a,o,s,l,c=0,u=t.length;for(null==n?n=1/0:n*=n,c=0;c<u;++c)(o=(i=e-(s=t[c]).x)*i+(a=r-s.y)*a)<n&&(l=s,n=o);return l},on:function(t,r){return arguments.length>1?(f.on(t,r),e):f.on(t)}}},t.forceX=function(t){var e,r,n,i=a(.1);function o(t){for(var i,a=0,o=e.length;a<o;++a)(i=e[a]).vx+=(n[a]-i.x)*r[a]*t}function s(){if(e){var a,o=e.length;for(r=new Array(o),n=new Array(o),a=0;a<o;++a)r[a]=isNaN(n[a]=+t(e[a],a,e))?0:+i(e[a],a,e)}}return"function"!=typeof t&&(t=a(null==t?0:+t)),o.initialize=function(t){e=t,s()},o.strength=function(t){return arguments.length?(i="function"==typeof t?t:a(+t),s(),o):i},o.x=function(e){return arguments.length?(t="function"==typeof e?e:a(+e),s(),o):t},o},t.forceY=function(t){var e,r,n,i=a(.1);function o(t){for(var i,a=0,o=e.length;a<o;++a)(i=e[a]).vy+=(n[a]-i.y)*r[a]*t}function s(){if(e){var a,o=e.length;for(r=new Array(o),n=new Array(o),a=0;a<o;++a)r[a]=isNaN(n[a]=+t(e[a],a,e))?0:+i(e[a],a,e)}}return"function"!=typeof t&&(t=a(null==t?0:+t)),o.initialize=function(t){e=t,s()},o.strength=function(t){return arguments.length?(i="function"==typeof t?t:a(+t),s(),o):i},o.y=function(e){return arguments.length?(t="function"==typeof e?e:a(+e),s(),o):t},o},Object.defineProperty(t,"__esModule",{value:!0})},"object"==typeof r&&"undefined"!=typeof e?i(r,t("d3-quadtree"),t("d3-collection"),t("d3-dispatch"),t("d3-timer")):i(n.d3=n.d3||{},n.d3,n.d3,n.d3,n.d3)},{"d3-collection":140,"d3-dispatch":142,"d3-quadtree":145,"d3-timer":146}],144:[function(t,e,r){var n,i;n=this,i=function(t,e){"use strict";function r(t,e,r,n,i){var a=t*t,o=a*t;return((1-3*t+3*a-o)*e+(4-6*a+3*o)*r+(1+3*t+3*a-3*o)*n+o*i)/6}var n=function(t){var e=t.length-1;return function(n){var i=n<=0?n=0:n>=1?(n=1,e-1):Math.floor(n*e),a=t[i],o=t[i+1],s=i>0?t[i-1]:2*a-o,l=i<e-1?t[i+2]:2*o-a;return r((n-i/e)*e,s,a,o,l)}},i=function(t){var e=t.length;return function(n){var i=Math.floor(((n%=1)<0?++n:n)*e),a=t[(i+e-1)%e],o=t[i%e],s=t[(i+1)%e],l=t[(i+2)%e];return r((n-i/e)*e,a,o,s,l)}},a=function(t){return function(){return t}};function o(t,e){return function(r){return t+r*e}}function s(t,e){var r=e-t;return r?o(t,r>180||r<-180?r-360*Math.round(r/360):r):a(isNaN(t)?e:t)}function l(t){return 1==(t=+t)?c:function(e,r){return r-e?function(t,e,r){return t=Math.pow(t,r),e=Math.pow(e,r)-t,r=1/r,function(n){return Math.pow(t+n*e,r)}}(e,r,t):a(isNaN(e)?r:e)}}function c(t,e){var r=e-t;return r?o(t,r):a(isNaN(t)?e:t)}var u=function t(r){var n=l(r);function i(t,r){var i=n((t=e.rgb(t)).r,(r=e.rgb(r)).r),a=n(t.g,r.g),o=n(t.b,r.b),s=c(t.opacity,r.opacity);return function(e){return t.r=i(e),t.g=a(e),t.b=o(e),t.opacity=s(e),t+""}}return i.gamma=t,i}(1);function h(t){return function(r){var n,i,a=r.length,o=new Array(a),s=new Array(a),l=new Array(a);for(n=0;n<a;++n)i=e.rgb(r[n]),o[n]=i.r||0,s[n]=i.g||0,l[n]=i.b||0;return o=t(o),s=t(s),l=t(l),i.opacity=1,function(t){return i.r=o(t),i.g=s(t),i.b=l(t),i+""}}}var f=h(n),p=h(i),d=function(t,e){var r,n=e?e.length:0,i=t?Math.min(n,t.length):0,a=new Array(i),o=new Array(n);for(r=0;r<i;++r)a[r]=A(t[r],e[r]);for(;r<n;++r)o[r]=e[r];return function(t){for(r=0;r<i;++r)o[r]=a[r](t);return o}},g=function(t,e){var r=new Date;return e-=t=+t,function(n){return r.setTime(t+e*n),r}},m=function(t,e){return e-=t=+t,function(r){return t+e*r}},v=function(t,e){var r,n={},i={};for(r in null!==t&&"object"==typeof t||(t={}),null!==e&&"object"==typeof e||(e={}),e)r in t?n[r]=A(t[r],e[r]):i[r]=e[r];return function(t){for(r in n)i[r]=n[r](t);return i}},y=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,x=new RegExp(y.source,"g");var b,_,w,k,M=function(t,e){var r,n,i,a=y.lastIndex=x.lastIndex=0,o=-1,s=[],l=[];for(t+="",e+="";(r=y.exec(t))&&(n=x.exec(e));)(i=n.index)>a&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(r=r[0])===(n=n[0])?s[o]?s[o]+=n:s[++o]=n:(s[++o]=null,l.push({i:o,x:m(r,n)})),a=x.lastIndex;return a<e.length&&(i=e.slice(a),s[o]?s[o]+=i:s[++o]=i),s.length<2?l[0]?function(t){return function(e){return t(e)+""}}(l[0].x):function(t){return function(){return t}}(e):(e=l.length,function(t){for(var r,n=0;n<e;++n)s[(r=l[n]).i]=r.x(t);return s.join("")})},A=function(t,r){var n,i=typeof r;return null==r||"boolean"===i?a(r):("number"===i?m:"string"===i?(n=e.color(r))?(r=n,u):M:r instanceof e.color?u:r instanceof Date?g:Array.isArray(r)?d:"function"!=typeof r.valueOf&&"function"!=typeof r.toString||isNaN(r)?v:m)(t,r)},T=180/Math.PI,S={translateX:0,translateY:0,rotate:0,skewX:0,scaleX:1,scaleY:1},E=function(t,e,r,n,i,a){var o,s,l;return(o=Math.sqrt(t*t+e*e))&&(t/=o,e/=o),(l=t*r+e*n)&&(r-=t*l,n-=e*l),(s=Math.sqrt(r*r+n*n))&&(r/=s,n/=s,l/=s),t*n<e*r&&(t=-t,e=-e,l=-l,o=-o),{translateX:i,translateY:a,rotate:Math.atan2(e,t)*T,skewX:Math.atan(l)*T,scaleX:o,scaleY:s}};function C(t,e,r,n){function i(t){return t.length?t.pop()+" ":""}return function(a,o){var s=[],l=[];return a=t(a),o=t(o),function(t,n,i,a,o,s){if(t!==i||n!==a){var l=o.push("translate(",null,e,null,r);s.push({i:l-4,x:m(t,i)},{i:l-2,x:m(n,a)})}else(i||a)&&o.push("translate("+i+e+a+r)}(a.translateX,a.translateY,o.translateX,o.translateY,s,l),function(t,e,r,a){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),a.push({i:r.push(i(r)+"rotate(",null,n)-2,x:m(t,e)})):e&&r.push(i(r)+"rotate("+e+n)}(a.rotate,o.rotate,s,l),function(t,e,r,a){t!==e?a.push({i:r.push(i(r)+"skewX(",null,n)-2,x:m(t,e)}):e&&r.push(i(r)+"skewX("+e+n)}(a.skewX,o.skewX,s,l),function(t,e,r,n,a,o){if(t!==r||e!==n){var s=a.push(i(a)+"scale(",null,",",null,")");o.push({i:s-4,x:m(t,r)},{i:s-2,x:m(e,n)})}else 1===r&&1===n||a.push(i(a)+"scale("+r+","+n+")")}(a.scaleX,a.scaleY,o.scaleX,o.scaleY,s,l),a=o=null,function(t){for(var e,r=-1,n=l.length;++r<n;)s[(e=l[r]).i]=e.x(t);return s.join("")}}}var L=C(function(t){return"none"===t?S:(b||(b=document.createElement("DIV"),_=document.documentElement,w=document.defaultView),b.style.transform=t,t=w.getComputedStyle(_.appendChild(b),null).getPropertyValue("transform"),_.removeChild(b),t=t.slice(7,-1).split(","),E(+t[0],+t[1],+t[2],+t[3],+t[4],+t[5]))},"px, ","px)","deg)"),z=C(function(t){return null==t?S:(k||(k=document.createElementNS("http://www.w3.org/2000/svg","g")),k.setAttribute("transform",t),(t=k.transform.baseVal.consolidate())?(t=t.matrix,E(t.a,t.b,t.c,t.d,t.e,t.f)):S)},", ",")",")"),P=Math.SQRT2;function I(t){return((t=Math.exp(t))+1/t)/2}function O(t){return function(r,n){var i=t((r=e.hsl(r)).h,(n=e.hsl(n)).h),a=c(r.s,n.s),o=c(r.l,n.l),s=c(r.opacity,n.opacity);return function(t){return r.h=i(t),r.s=a(t),r.l=o(t),r.opacity=s(t),r+""}}}var D=O(s),R=O(c);function B(t){return function(r,n){var i=t((r=e.hcl(r)).h,(n=e.hcl(n)).h),a=c(r.c,n.c),o=c(r.l,n.l),s=c(r.opacity,n.opacity);return function(t){return r.h=i(t),r.c=a(t),r.l=o(t),r.opacity=s(t),r+""}}}var F=B(s),N=B(c);function j(t){return function r(n){function i(r,i){var a=t((r=e.cubehelix(r)).h,(i=e.cubehelix(i)).h),o=c(r.s,i.s),s=c(r.l,i.l),l=c(r.opacity,i.opacity);return function(t){return r.h=a(t),r.s=o(t),r.l=s(Math.pow(t,n)),r.opacity=l(t),r+""}}return n=+n,i.gamma=r,i}(1)}var V=j(s),U=j(c);t.interpolate=A,t.interpolateArray=d,t.interpolateBasis=n,t.interpolateBasisClosed=i,t.interpolateDate=g,t.interpolateNumber=m,t.interpolateObject=v,t.interpolateRound=function(t,e){return e-=t=+t,function(r){return Math.round(t+e*r)}},t.interpolateString=M,t.interpolateTransformCss=L,t.interpolateTransformSvg=z,t.interpolateZoom=function(t,e){var r,n,i=t[0],a=t[1],o=t[2],s=e[0],l=e[1],c=e[2],u=s-i,h=l-a,f=u*u+h*h;if(f<1e-12)n=Math.log(c/o)/P,r=function(t){return[i+t*u,a+t*h,o*Math.exp(P*t*n)]};else{var p=Math.sqrt(f),d=(c*c-o*o+4*f)/(2*o*2*p),g=(c*c-o*o-4*f)/(2*c*2*p),m=Math.log(Math.sqrt(d*d+1)-d),v=Math.log(Math.sqrt(g*g+1)-g);n=(v-m)/P,r=function(t){var e,r=t*n,s=I(m),l=o/(2*p)*(s*(e=P*r+m,((e=Math.exp(2*e))-1)/(e+1))-function(t){return((t=Math.exp(t))-1/t)/2}(m));return[i+l*u,a+l*h,o*s/I(P*r+m)]}}return r.duration=1e3*n,r},t.interpolateRgb=u,t.interpolateRgbBasis=f,t.interpolateRgbBasisClosed=p,t.interpolateHsl=D,t.interpolateHslLong=R,t.interpolateLab=function(t,r){var n=c((t=e.lab(t)).l,(r=e.lab(r)).l),i=c(t.a,r.a),a=c(t.b,r.b),o=c(t.opacity,r.opacity);return function(e){return t.l=n(e),t.a=i(e),t.b=a(e),t.opacity=o(e),t+""}},t.interpolateHcl=F,t.interpolateHclLong=N,t.interpolateCubehelix=V,t.interpolateCubehelixLong=U,t.quantize=function(t,e){for(var r=new Array(e),n=0;n<e;++n)r[n]=t(n/(e-1));return r},Object.defineProperty(t,"__esModule",{value:!0})},"object"==typeof r&&"undefined"!=typeof e?i(r,t("d3-color")):i(n.d3=n.d3||{},n.d3)},{"d3-color":141}],145:[function(t,e,r){var n;n=this,function(t){"use strict";function e(t,e,r,n){if(isNaN(e)||isNaN(r))return t;var i,a,o,s,l,c,u,h,f,p=t._root,d={data:n},g=t._x0,m=t._y0,v=t._x1,y=t._y1;if(!p)return t._root=d,t;for(;p.length;)if((c=e>=(a=(g+v)/2))?g=a:v=a,(u=r>=(o=(m+y)/2))?m=o:y=o,i=p,!(p=p[h=u<<1|c]))return i[h]=d,t;if(s=+t._x.call(null,p.data),l=+t._y.call(null,p.data),e===s&&r===l)return d.next=p,i?i[h]=d:t._root=d,t;do{i=i?i[h]=new Array(4):t._root=new Array(4),(c=e>=(a=(g+v)/2))?g=a:v=a,(u=r>=(o=(m+y)/2))?m=o:y=o}while((h=u<<1|c)==(f=(l>=o)<<1|s>=a));return i[f]=p,i[h]=d,t}var r=function(t,e,r,n,i){this.node=t,this.x0=e,this.y0=r,this.x1=n,this.y1=i};function n(t){return t[0]}function i(t){return t[1]}function a(t,e,r){var a=new o(null==e?n:e,null==r?i:r,NaN,NaN,NaN,NaN);return null==t?a:a.addAll(t)}function o(t,e,r,n,i,a){this._x=t,this._y=e,this._x0=r,this._y0=n,this._x1=i,this._y1=a,this._root=void 0}function s(t){for(var e={data:t.data},r=e;t=t.next;)r=r.next={data:t.data};return e}var l=a.prototype=o.prototype;l.copy=function(){var t,e,r=new o(this._x,this._y,this._x0,this._y0,this._x1,this._y1),n=this._root;if(!n)return r;if(!n.length)return r._root=s(n),r;for(t=[{source:n,target:r._root=new Array(4)}];n=t.pop();)for(var i=0;i<4;++i)(e=n.source[i])&&(e.length?t.push({source:e,target:n.target[i]=new Array(4)}):n.target[i]=s(e));return r},l.add=function(t){var r=+this._x.call(null,t),n=+this._y.call(null,t);return e(this.cover(r,n),r,n,t)},l.addAll=function(t){var r,n,i,a,o=t.length,s=new Array(o),l=new Array(o),c=1/0,u=1/0,h=-1/0,f=-1/0;for(n=0;n<o;++n)isNaN(i=+this._x.call(null,r=t[n]))||isNaN(a=+this._y.call(null,r))||(s[n]=i,l[n]=a,i<c&&(c=i),i>h&&(h=i),a<u&&(u=a),a>f&&(f=a));for(h<c&&(c=this._x0,h=this._x1),f<u&&(u=this._y0,f=this._y1),this.cover(c,u).cover(h,f),n=0;n<o;++n)e(this,s[n],l[n],t[n]);return this},l.cover=function(t,e){if(isNaN(t=+t)||isNaN(e=+e))return this;var r=this._x0,n=this._y0,i=this._x1,a=this._y1;if(isNaN(r))i=(r=Math.floor(t))+1,a=(n=Math.floor(e))+1;else{if(!(r>t||t>i||n>e||e>a))return this;var o,s,l=i-r,c=this._root;switch(s=(e<(n+a)/2)<<1|t<(r+i)/2){case 0:do{(o=new Array(4))[s]=c,c=o}while(a=n+(l*=2),t>(i=r+l)||e>a);break;case 1:do{(o=new Array(4))[s]=c,c=o}while(a=n+(l*=2),(r=i-l)>t||e>a);break;case 2:do{(o=new Array(4))[s]=c,c=o}while(n=a-(l*=2),t>(i=r+l)||n>e);break;case 3:do{(o=new Array(4))[s]=c,c=o}while(n=a-(l*=2),(r=i-l)>t||n>e)}this._root&&this._root.length&&(this._root=c)}return this._x0=r,this._y0=n,this._x1=i,this._y1=a,this},l.data=function(){var t=[];return this.visit(function(e){if(!e.length)do{t.push(e.data)}while(e=e.next)}),t},l.extent=function(t){return arguments.length?this.cover(+t[0][0],+t[0][1]).cover(+t[1][0],+t[1][1]):isNaN(this._x0)?void 0:[[this._x0,this._y0],[this._x1,this._y1]]},l.find=function(t,e,n){var i,a,o,s,l,c,u,h=this._x0,f=this._y0,p=this._x1,d=this._y1,g=[],m=this._root;for(m&&g.push(new r(m,h,f,p,d)),null==n?n=1/0:(h=t-n,f=e-n,p=t+n,d=e+n,n*=n);c=g.pop();)if(!(!(m=c.node)||(a=c.x0)>p||(o=c.y0)>d||(s=c.x1)<h||(l=c.y1)<f))if(m.length){var v=(a+s)/2,y=(o+l)/2;g.push(new r(m[3],v,y,s,l),new r(m[2],a,y,v,l),new r(m[1],v,o,s,y),new r(m[0],a,o,v,y)),(u=(e>=y)<<1|t>=v)&&(c=g[g.length-1],g[g.length-1]=g[g.length-1-u],g[g.length-1-u]=c)}else{var x=t-+this._x.call(null,m.data),b=e-+this._y.call(null,m.data),_=x*x+b*b;if(_<n){var w=Math.sqrt(n=_);h=t-w,f=e-w,p=t+w,d=e+w,i=m.data}}return i},l.remove=function(t){if(isNaN(a=+this._x.call(null,t))||isNaN(o=+this._y.call(null,t)))return this;var e,r,n,i,a,o,s,l,c,u,h,f,p=this._root,d=this._x0,g=this._y0,m=this._x1,v=this._y1;if(!p)return this;if(p.length)for(;;){if((c=a>=(s=(d+m)/2))?d=s:m=s,(u=o>=(l=(g+v)/2))?g=l:v=l,e=p,!(p=p[h=u<<1|c]))return this;if(!p.length)break;(e[h+1&3]||e[h+2&3]||e[h+3&3])&&(r=e,f=h)}for(;p.data!==t;)if(n=p,!(p=p.next))return this;return(i=p.next)&&delete p.next,n?(i?n.next=i:delete n.next,this):e?(i?e[h]=i:delete e[h],(p=e[0]||e[1]||e[2]||e[3])&&p===(e[3]||e[2]||e[1]||e[0])&&!p.length&&(r?r[f]=p:this._root=p),this):(this._root=i,this)},l.removeAll=function(t){for(var e=0,r=t.length;e<r;++e)this.remove(t[e]);return this},l.root=function(){return this._root},l.size=function(){var t=0;return this.visit(function(e){if(!e.length)do{++t}while(e=e.next)}),t},l.visit=function(t){var e,n,i,a,o,s,l=[],c=this._root;for(c&&l.push(new r(c,this._x0,this._y0,this._x1,this._y1));e=l.pop();)if(!t(c=e.node,i=e.x0,a=e.y0,o=e.x1,s=e.y1)&&c.length){var u=(i+o)/2,h=(a+s)/2;(n=c[3])&&l.push(new r(n,u,h,o,s)),(n=c[2])&&l.push(new r(n,i,h,u,s)),(n=c[1])&&l.push(new r(n,u,a,o,h)),(n=c[0])&&l.push(new r(n,i,a,u,h))}return this},l.visitAfter=function(t){var e,n=[],i=[];for(this._root&&n.push(new r(this._root,this._x0,this._y0,this._x1,this._y1));e=n.pop();){var a=e.node;if(a.length){var o,s=e.x0,l=e.y0,c=e.x1,u=e.y1,h=(s+c)/2,f=(l+u)/2;(o=a[0])&&n.push(new r(o,s,l,h,f)),(o=a[1])&&n.push(new r(o,h,l,c,f)),(o=a[2])&&n.push(new r(o,s,f,h,u)),(o=a[3])&&n.push(new r(o,h,f,c,u))}i.push(e)}for(;e=i.pop();)t(e.node,e.x0,e.y0,e.x1,e.y1);return this},l.x=function(t){return arguments.length?(this._x=t,this):this._x},l.y=function(t){return arguments.length?(this._y=t,this):this._y},t.quadtree=a,Object.defineProperty(t,"__esModule",{value:!0})}("object"==typeof r&&"undefined"!=typeof e?r:n.d3=n.d3||{})},{}],146:[function(t,e,r){var n;n=this,function(t){"use strict";var e,r,n=0,i=0,a=0,o=1e3,s=0,l=0,c=0,u="object"==typeof performance&&performance.now?performance:Date,h="object"==typeof window&&window.requestAnimationFrame?window.requestAnimationFrame.bind(window):function(t){setTimeout(t,17)};function f(){return l||(h(p),l=u.now()+c)}function p(){l=0}function d(){this._call=this._time=this._next=null}function g(t,e,r){var n=new d;return n.restart(t,e,r),n}function m(){f(),++n;for(var t,r=e;r;)(t=l-r._time)>=0&&r._call.call(null,t),r=r._next;--n}function v(){l=(s=u.now())+c,n=i=0;try{m()}finally{n=0,function(){var t,n,i=e,a=1/0;for(;i;)i._call?(a>i._time&&(a=i._time),t=i,i=i._next):(n=i._next,i._next=null,i=t?t._next=n:e=n);r=t,x(a)}(),l=0}}function y(){var t=u.now(),e=t-s;e>o&&(c-=e,s=t)}function x(t){n||(i&&(i=clearTimeout(i)),t-l>24?(t<1/0&&(i=setTimeout(v,t-u.now()-c)),a&&(a=clearInterval(a))):(a||(s=u.now(),a=setInterval(y,o)),n=1,h(v)))}d.prototype=g.prototype={constructor:d,restart:function(t,n,i){if("function"!=typeof t)throw new TypeError("callback is not a function");i=(null==i?f():+i)+(null==n?0:+n),this._next||r===this||(r?r._next=this:e=this,r=this),this._call=t,this._time=i,x()},stop:function(){this._call&&(this._call=null,this._time=1/0,x())}};t.now=f,t.timer=g,t.timerFlush=m,t.timeout=function(t,e,r){var n=new d;return e=null==e?0:+e,n.restart(function(r){n.stop(),t(r+e)},e,r),n},t.interval=function(t,e,r){var n=new d,i=e;return null==e?(n.restart(t,e,r),n):(e=+e,r=null==r?f():+r,n.restart(function a(o){o+=i,n.restart(a,i+=e,r),t(o)},e,r),n)},Object.defineProperty(t,"__esModule",{value:!0})}("object"==typeof r&&"undefined"!=typeof e?r:n.d3=n.d3||{})},{}],147:[function(t,e,r){!function(){var t={version:"3.5.17"},r=[].slice,n=function(t){return r.call(t)},i=this.document;function a(t){return t&&(t.ownerDocument||t.document||t).documentElement}function o(t){return t&&(t.ownerDocument&&t.ownerDocument.defaultView||t.document&&t||t.defaultView)}if(i)try{n(i.documentElement.childNodes)[0].nodeType}catch(t){n=function(t){for(var e=t.length,r=new Array(e);e--;)r[e]=t[e];return r}}if(Date.now||(Date.now=function(){return+new Date}),i)try{i.createElement("DIV").style.setProperty("opacity",0,"")}catch(t){var s=this.Element.prototype,l=s.setAttribute,c=s.setAttributeNS,u=this.CSSStyleDeclaration.prototype,h=u.setProperty;s.setAttribute=function(t,e){l.call(this,t,e+"")},s.setAttributeNS=function(t,e,r){c.call(this,t,e,r+"")},u.setProperty=function(t,e,r){h.call(this,t,e+"",r)}}function f(t,e){return t<e?-1:t>e?1:t>=e?0:NaN}function p(t){return null===t?NaN:+t}function d(t){return!isNaN(t)}function g(t){return{left:function(e,r,n,i){for(arguments.length<3&&(n=0),arguments.length<4&&(i=e.length);n<i;){var a=n+i>>>1;t(e[a],r)<0?n=a+1:i=a}return n},right:function(e,r,n,i){for(arguments.length<3&&(n=0),arguments.length<4&&(i=e.length);n<i;){var a=n+i>>>1;t(e[a],r)>0?i=a:n=a+1}return n}}}t.ascending=f,t.descending=function(t,e){return e<t?-1:e>t?1:e>=t?0:NaN},t.min=function(t,e){var r,n,i=-1,a=t.length;if(1===arguments.length){for(;++i<a;)if(null!=(n=t[i])&&n>=n){r=n;break}for(;++i<a;)null!=(n=t[i])&&r>n&&(r=n)}else{for(;++i<a;)if(null!=(n=e.call(t,t[i],i))&&n>=n){r=n;break}for(;++i<a;)null!=(n=e.call(t,t[i],i))&&r>n&&(r=n)}return r},t.max=function(t,e){var r,n,i=-1,a=t.length;if(1===arguments.length){for(;++i<a;)if(null!=(n=t[i])&&n>=n){r=n;break}for(;++i<a;)null!=(n=t[i])&&n>r&&(r=n)}else{for(;++i<a;)if(null!=(n=e.call(t,t[i],i))&&n>=n){r=n;break}for(;++i<a;)null!=(n=e.call(t,t[i],i))&&n>r&&(r=n)}return r},t.extent=function(t,e){var r,n,i,a=-1,o=t.length;if(1===arguments.length){for(;++a<o;)if(null!=(n=t[a])&&n>=n){r=i=n;break}for(;++a<o;)null!=(n=t[a])&&(r>n&&(r=n),i<n&&(i=n))}else{for(;++a<o;)if(null!=(n=e.call(t,t[a],a))&&n>=n){r=i=n;break}for(;++a<o;)null!=(n=e.call(t,t[a],a))&&(r>n&&(r=n),i<n&&(i=n))}return[r,i]},t.sum=function(t,e){var r,n=0,i=t.length,a=-1;if(1===arguments.length)for(;++a<i;)d(r=+t[a])&&(n+=r);else for(;++a<i;)d(r=+e.call(t,t[a],a))&&(n+=r);return n},t.mean=function(t,e){var r,n=0,i=t.length,a=-1,o=i;if(1===arguments.length)for(;++a<i;)d(r=p(t[a]))?n+=r:--o;else for(;++a<i;)d(r=p(e.call(t,t[a],a)))?n+=r:--o;if(o)return n/o},t.quantile=function(t,e){var r=(t.length-1)*e+1,n=Math.floor(r),i=+t[n-1],a=r-n;return a?i+a*(t[n]-i):i},t.median=function(e,r){var n,i=[],a=e.length,o=-1;if(1===arguments.length)for(;++o<a;)d(n=p(e[o]))&&i.push(n);else for(;++o<a;)d(n=p(r.call(e,e[o],o)))&&i.push(n);if(i.length)return t.quantile(i.sort(f),.5)},t.variance=function(t,e){var r,n,i=t.length,a=0,o=0,s=-1,l=0;if(1===arguments.length)for(;++s<i;)d(r=p(t[s]))&&(o+=(n=r-a)*(r-(a+=n/++l)));else for(;++s<i;)d(r=p(e.call(t,t[s],s)))&&(o+=(n=r-a)*(r-(a+=n/++l)));if(l>1)return o/(l-1)},t.deviation=function(){var e=t.variance.apply(this,arguments);return e?Math.sqrt(e):e};var m=g(f);function v(t){return t.length}t.bisectLeft=m.left,t.bisect=t.bisectRight=m.right,t.bisector=function(t){return g(1===t.length?function(e,r){return f(t(e),r)}:t)},t.shuffle=function(t,e,r){(a=arguments.length)<3&&(r=t.length,a<2&&(e=0));for(var n,i,a=r-e;a;)i=Math.random()*a--|0,n=t[a+e],t[a+e]=t[i+e],t[i+e]=n;return t},t.permute=function(t,e){for(var r=e.length,n=new Array(r);r--;)n[r]=t[e[r]];return n},t.pairs=function(t){for(var e=0,r=t.length-1,n=t[0],i=new Array(r<0?0:r);e<r;)i[e]=[n,n=t[++e]];return i},t.transpose=function(e){if(!(a=e.length))return[];for(var r=-1,n=t.min(e,v),i=new Array(n);++r<n;)for(var a,o=-1,s=i[r]=new Array(a);++o<a;)s[o]=e[o][r];return i},t.zip=function(){return t.transpose(arguments)},t.keys=function(t){var e=[];for(var r in t)e.push(r);return e},t.values=function(t){var e=[];for(var r in t)e.push(t[r]);return e},t.entries=function(t){var e=[];for(var r in t)e.push({key:r,value:t[r]});return e},t.merge=function(t){for(var e,r,n,i=t.length,a=-1,o=0;++a<i;)o+=t[a].length;for(r=new Array(o);--i>=0;)for(e=(n=t[i]).length;--e>=0;)r[--o]=n[e];return r};var y=Math.abs;function x(t,e){for(var r in e)Object.defineProperty(t.prototype,r,{value:e[r],enumerable:!1})}function b(){this._=Object.create(null)}t.range=function(t,e,r){if(arguments.length<3&&(r=1,arguments.length<2&&(e=t,t=0)),(e-t)/r==1/0)throw new Error("infinite range");var n,i=[],a=function(t){var e=1;for(;t*e%1;)e*=10;return e}(y(r)),o=-1;if(t*=a,e*=a,(r*=a)<0)for(;(n=t+r*++o)>e;)i.push(n/a);else for(;(n=t+r*++o)<e;)i.push(n/a);return i},t.map=function(t,e){var r=new b;if(t instanceof b)t.forEach(function(t,e){r.set(t,e)});else if(Array.isArray(t)){var n,i=-1,a=t.length;if(1===arguments.length)for(;++i<a;)r.set(i,t[i]);else for(;++i<a;)r.set(e.call(t,n=t[i],i),n)}else for(var o in t)r.set(o,t[o]);return r};var _="__proto__",w="\0";function k(t){return(t+="")===_||t[0]===w?w+t:t}function M(t){return(t+="")[0]===w?t.slice(1):t}function A(t){return k(t)in this._}function T(t){return(t=k(t))in this._&&delete this._[t]}function S(){var t=[];for(var e in this._)t.push(M(e));return t}function E(){var t=0;for(var e in this._)++t;return t}function C(){for(var t in this._)return!1;return!0}function L(){this._=Object.create(null)}function z(t){return t}function P(t,e,r){return function(){var n=r.apply(e,arguments);return n===e?t:n}}function I(t,e){if(e in t)return e;e=e.charAt(0).toUpperCase()+e.slice(1);for(var r=0,n=O.length;r<n;++r){var i=O[r]+e;if(i in t)return i}}x(b,{has:A,get:function(t){return this._[k(t)]},set:function(t,e){return this._[k(t)]=e},remove:T,keys:S,values:function(){var t=[];for(var e in this._)t.push(this._[e]);return t},entries:function(){var t=[];for(var e in this._)t.push({key:M(e),value:this._[e]});return t},size:E,empty:C,forEach:function(t){for(var e in this._)t.call(this,M(e),this._[e])}}),t.nest=function(){var e,r,n={},i=[],a=[];function o(t,a,s){if(s>=i.length)return r?r.call(n,a):e?a.sort(e):a;for(var l,c,u,h,f=-1,p=a.length,d=i[s++],g=new b;++f<p;)(h=g.get(l=d(c=a[f])))?h.push(c):g.set(l,[c]);return t?(c=t(),u=function(e,r){c.set(e,o(t,r,s))}):(c={},u=function(e,r){c[e]=o(t,r,s)}),g.forEach(u),c}return n.map=function(t,e){return o(e,t,0)},n.entries=function(e){return function t(e,r){if(r>=i.length)return e;var n=[],o=a[r++];return e.forEach(function(e,i){n.push({key:e,values:t(i,r)})}),o?n.sort(function(t,e){return o(t.key,e.key)}):n}(o(t.map,e,0),0)},n.key=function(t){return i.push(t),n},n.sortKeys=function(t){return a[i.length-1]=t,n},n.sortValues=function(t){return e=t,n},n.rollup=function(t){return r=t,n},n},t.set=function(t){var e=new L;if(t)for(var r=0,n=t.length;r<n;++r)e.add(t[r]);return e},x(L,{has:A,add:function(t){return this._[k(t+="")]=!0,t},remove:T,values:S,size:E,empty:C,forEach:function(t){for(var e in this._)t.call(this,M(e))}}),t.behavior={},t.rebind=function(t,e){for(var r,n=1,i=arguments.length;++n<i;)t[r=arguments[n]]=P(t,e,e[r]);return t};var O=["webkit","ms","moz","Moz","o","O"];function D(){}function R(){}function B(t){var e=[],r=new b;function n(){for(var r,n=e,i=-1,a=n.length;++i<a;)(r=n[i].on)&&r.apply(this,arguments);return t}return n.on=function(n,i){var a,o=r.get(n);return arguments.length<2?o&&o.on:(o&&(o.on=null,e=e.slice(0,a=e.indexOf(o)).concat(e.slice(a+1)),r.remove(n)),i&&e.push(r.set(n,{on:i})),t)},n}function F(){t.event.preventDefault()}function N(){for(var e,r=t.event;e=r.sourceEvent;)r=e;return r}function j(e){for(var r=new R,n=0,i=arguments.length;++n<i;)r[arguments[n]]=B(r);return r.of=function(n,i){return function(a){try{var o=a.sourceEvent=t.event;a.target=e,t.event=a,r[a.type].apply(n,i)}finally{t.event=o}}},r}t.dispatch=function(){for(var t=new R,e=-1,r=arguments.length;++e<r;)t[arguments[e]]=B(t);return t},R.prototype.on=function(t,e){var r=t.indexOf("."),n="";if(r>=0&&(n=t.slice(r+1),t=t.slice(0,r)),t)return arguments.length<2?this[t].on(n):this[t].on(n,e);if(2===arguments.length){if(null==e)for(t in this)this.hasOwnProperty(t)&&this[t].on(n,null);return this}},t.event=null,t.requote=function(t){return t.replace(V,"\\$&")};var V=/[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g,U={}.__proto__?function(t,e){t.__proto__=e}:function(t,e){for(var r in e)t[r]=e[r]};function q(t){return U(t,Y),t}var H=function(t,e){return e.querySelector(t)},G=function(t,e){return e.querySelectorAll(t)},W=function(t,e){var r=t.matches||t[I(t,"matchesSelector")];return(W=function(t,e){return r.call(t,e)})(t,e)};"function"==typeof Sizzle&&(H=function(t,e){return Sizzle(t,e)[0]||null},G=Sizzle,W=Sizzle.matchesSelector),t.selection=function(){return t.select(i.documentElement)};var Y=t.selection.prototype=[];function X(t){return"function"==typeof t?t:function(){return H(t,this)}}function Z(t){return"function"==typeof t?t:function(){return G(t,this)}}Y.select=function(t){var e,r,n,i,a=[];t=X(t);for(var o=-1,s=this.length;++o<s;){a.push(e=[]),e.parentNode=(n=this[o]).parentNode;for(var l=-1,c=n.length;++l<c;)(i=n[l])?(e.push(r=t.call(i,i.__data__,l,o)),r&&"__data__"in i&&(r.__data__=i.__data__)):e.push(null)}return q(a)},Y.selectAll=function(t){var e,r,i=[];t=Z(t);for(var a=-1,o=this.length;++a<o;)for(var s=this[a],l=-1,c=s.length;++l<c;)(r=s[l])&&(i.push(e=n(t.call(r,r.__data__,l,a))),e.parentNode=r);return q(i)};var $="http://www.w3.org/1999/xhtml",J={svg:"http://www.w3.org/2000/svg",xhtml:$,xlink:"http://www.w3.org/1999/xlink",xml:"http://www.w3.org/XML/1998/namespace",xmlns:"http://www.w3.org/2000/xmlns/"};function K(e,r){return e=t.ns.qualify(e),null==r?e.local?function(){this.removeAttributeNS(e.space,e.local)}:function(){this.removeAttribute(e)}:"function"==typeof r?e.local?function(){var t=r.apply(this,arguments);null==t?this.removeAttributeNS(e.space,e.local):this.setAttributeNS(e.space,e.local,t)}:function(){var t=r.apply(this,arguments);null==t?this.removeAttribute(e):this.setAttribute(e,t)}:e.local?function(){this.setAttributeNS(e.space,e.local,r)}:function(){this.setAttribute(e,r)}}function Q(t){return t.trim().replace(/\s+/g," ")}function tt(e){return new RegExp("(?:^|\\s+)"+t.requote(e)+"(?:\\s+|$)","g")}function et(t){return(t+"").trim().split(/^|\s+/)}function rt(t,e){var r=(t=et(t).map(nt)).length;return"function"==typeof e?function(){for(var n=-1,i=e.apply(this,arguments);++n<r;)t[n](this,i)}:function(){for(var n=-1;++n<r;)t[n](this,e)}}function nt(t){var e=tt(t);return function(r,n){if(i=r.classList)return n?i.add(t):i.remove(t);var i=r.getAttribute("class")||"";n?(e.lastIndex=0,e.test(i)||r.setAttribute("class",Q(i+" "+t))):r.setAttribute("class",Q(i.replace(e," ")))}}function it(t,e,r){return null==e?function(){this.style.removeProperty(t)}:"function"==typeof e?function(){var n=e.apply(this,arguments);null==n?this.style.removeProperty(t):this.style.setProperty(t,n,r)}:function(){this.style.setProperty(t,e,r)}}function at(t,e){return null==e?function(){delete this[t]}:"function"==typeof e?function(){var r=e.apply(this,arguments);null==r?delete this[t]:this[t]=r}:function(){this[t]=e}}function ot(e){return"function"==typeof e?e:(e=t.ns.qualify(e)).local?function(){return this.ownerDocument.createElementNS(e.space,e.local)}:function(){var t=this.ownerDocument,r=this.namespaceURI;return r===$&&t.documentElement.namespaceURI===$?t.createElement(e):t.createElementNS(r,e)}}function st(){var t=this.parentNode;t&&t.removeChild(this)}function lt(t){return{__data__:t}}function ct(t){return function(){return W(this,t)}}function ut(t,e){for(var r=0,n=t.length;r<n;r++)for(var i,a=t[r],o=0,s=a.length;o<s;o++)(i=a[o])&&e(i,o,r);return t}function ht(t){return U(t,ft),t}t.ns={prefix:J,qualify:function(t){var e=t.indexOf(":"),r=t;return e>=0&&"xmlns"!==(r=t.slice(0,e))&&(t=t.slice(e+1)),J.hasOwnProperty(r)?{space:J[r],local:t}:t}},Y.attr=function(e,r){if(arguments.length<2){if("string"==typeof e){var n=this.node();return(e=t.ns.qualify(e)).local?n.getAttributeNS(e.space,e.local):n.getAttribute(e)}for(r in e)this.each(K(r,e[r]));return this}return this.each(K(e,r))},Y.classed=function(t,e){if(arguments.length<2){if("string"==typeof t){var r=this.node(),n=(t=et(t)).length,i=-1;if(e=r.classList){for(;++i<n;)if(!e.contains(t[i]))return!1}else for(e=r.getAttribute("class");++i<n;)if(!tt(t[i]).test(e))return!1;return!0}for(e in t)this.each(rt(e,t[e]));return this}return this.each(rt(t,e))},Y.style=function(t,e,r){var n=arguments.length;if(n<3){if("string"!=typeof t){for(r in n<2&&(e=""),t)this.each(it(r,t[r],e));return this}if(n<2){var i=this.node();return o(i).getComputedStyle(i,null).getPropertyValue(t)}r=""}return this.each(it(t,e,r))},Y.property=function(t,e){if(arguments.length<2){if("string"==typeof t)return this.node()[t];for(e in t)this.each(at(e,t[e]));return this}return this.each(at(t,e))},Y.text=function(t){return arguments.length?this.each("function"==typeof t?function(){var e=t.apply(this,arguments);this.textContent=null==e?"":e}:null==t?function(){this.textContent=""}:function(){this.textContent=t}):this.node().textContent},Y.html=function(t){return arguments.length?this.each("function"==typeof t?function(){var e=t.apply(this,arguments);this.innerHTML=null==e?"":e}:null==t?function(){this.innerHTML=""}:function(){this.innerHTML=t}):this.node().innerHTML},Y.append=function(t){return t=ot(t),this.select(function(){return this.appendChild(t.apply(this,arguments))})},Y.insert=function(t,e){return t=ot(t),e=X(e),this.select(function(){return this.insertBefore(t.apply(this,arguments),e.apply(this,arguments)||null)})},Y.remove=function(){return this.each(st)},Y.data=function(t,e){var r,n,i=-1,a=this.length;if(!arguments.length){for(t=new Array(a=(r=this[0]).length);++i<a;)(n=r[i])&&(t[i]=n.__data__);return t}function o(t,r){var n,i,a,o=t.length,u=r.length,h=Math.min(o,u),f=new Array(u),p=new Array(u),d=new Array(o);if(e){var g,m=new b,v=new Array(o);for(n=-1;++n<o;)(i=t[n])&&(m.has(g=e.call(i,i.__data__,n))?d[n]=i:m.set(g,i),v[n]=g);for(n=-1;++n<u;)(i=m.get(g=e.call(r,a=r[n],n)))?!0!==i&&(f[n]=i,i.__data__=a):p[n]=lt(a),m.set(g,!0);for(n=-1;++n<o;)n in v&&!0!==m.get(v[n])&&(d[n]=t[n])}else{for(n=-1;++n<h;)i=t[n],a=r[n],i?(i.__data__=a,f[n]=i):p[n]=lt(a);for(;n<u;++n)p[n]=lt(r[n]);for(;n<o;++n)d[n]=t[n]}p.update=f,p.parentNode=f.parentNode=d.parentNode=t.parentNode,s.push(p),l.push(f),c.push(d)}var s=ht([]),l=q([]),c=q([]);if("function"==typeof t)for(;++i<a;)o(r=this[i],t.call(r,r.parentNode.__data__,i));else for(;++i<a;)o(r=this[i],t);return l.enter=function(){return s},l.exit=function(){return c},l},Y.datum=function(t){return arguments.length?this.property("__data__",t):this.property("__data__")},Y.filter=function(t){var e,r,n,i=[];"function"!=typeof t&&(t=ct(t));for(var a=0,o=this.length;a<o;a++){i.push(e=[]),e.parentNode=(r=this[a]).parentNode;for(var s=0,l=r.length;s<l;s++)(n=r[s])&&t.call(n,n.__data__,s,a)&&e.push(n)}return q(i)},Y.order=function(){for(var t=-1,e=this.length;++t<e;)for(var r,n=this[t],i=n.length-1,a=n[i];--i>=0;)(r=n[i])&&(a&&a!==r.nextSibling&&a.parentNode.insertBefore(r,a),a=r);return this},Y.sort=function(t){t=function(t){arguments.length||(t=f);return function(e,r){return e&&r?t(e.__data__,r.__data__):!e-!r}}.apply(this,arguments);for(var e=-1,r=this.length;++e<r;)this[e].sort(t);return this.order()},Y.each=function(t){return ut(this,function(e,r,n){t.call(e,e.__data__,r,n)})},Y.call=function(t){var e=n(arguments);return t.apply(e[0]=this,e),this},Y.empty=function(){return!this.node()},Y.node=function(){for(var t=0,e=this.length;t<e;t++)for(var r=this[t],n=0,i=r.length;n<i;n++){var a=r[n];if(a)return a}return null},Y.size=function(){var t=0;return ut(this,function(){++t}),t};var ft=[];function pt(e,r,i){var a="__on"+e,o=e.indexOf("."),s=gt;o>0&&(e=e.slice(0,o));var l=dt.get(e);function c(){var t=this[a];t&&(this.removeEventListener(e,t,t.$),delete this[a])}return l&&(e=l,s=mt),o?r?function(){var t=s(r,n(arguments));c.call(this),this.addEventListener(e,this[a]=t,t.$=i),t._=r}:c:r?D:function(){var r,n=new RegExp("^__on([^.]+)"+t.requote(e)+"$");for(var i in this)if(r=i.match(n)){var a=this[i];this.removeEventListener(r[1],a,a.$),delete this[i]}}}t.selection.enter=ht,t.selection.enter.prototype=ft,ft.append=Y.append,ft.empty=Y.empty,ft.node=Y.node,ft.call=Y.call,ft.size=Y.size,ft.select=function(t){for(var e,r,n,i,a,o=[],s=-1,l=this.length;++s<l;){n=(i=this[s]).update,o.push(e=[]),e.parentNode=i.parentNode;for(var c=-1,u=i.length;++c<u;)(a=i[c])?(e.push(n[c]=r=t.call(i.parentNode,a.__data__,c,s)),r.__data__=a.__data__):e.push(null)}return q(o)},ft.insert=function(t,e){var r,n,i;return arguments.length<2&&(r=this,e=function(t,e,a){var o,s=r[a].update,l=s.length;for(a!=i&&(i=a,n=0),e>=n&&(n=e+1);!(o=s[n])&&++n<l;);return o}),Y.insert.call(this,t,e)},t.select=function(t){var e;return"string"==typeof t?(e=[H(t,i)]).parentNode=i.documentElement:(e=[t]).parentNode=a(t),q([e])},t.selectAll=function(t){var e;return"string"==typeof t?(e=n(G(t,i))).parentNode=i.documentElement:(e=n(t)).parentNode=null,q([e])},Y.on=function(t,e,r){var n=arguments.length;if(n<3){if("string"!=typeof t){for(r in n<2&&(e=!1),t)this.each(pt(r,t[r],e));return this}if(n<2)return(n=this.node()["__on"+t])&&n._;r=!1}return this.each(pt(t,e,r))};var dt=t.map({mouseenter:"mouseover",mouseleave:"mouseout"});function gt(e,r){return function(n){var i=t.event;t.event=n,r[0]=this.__data__;try{e.apply(this,r)}finally{t.event=i}}}function mt(t,e){var r=gt(t,e);return function(t){var e=t.relatedTarget;e&&(e===this||8&e.compareDocumentPosition(this))||r.call(this,t)}}i&&dt.forEach(function(t){"on"+t in i&&dt.remove(t)});var vt,yt=0;function xt(e){var r=".dragsuppress-"+ ++yt,n="click"+r,i=t.select(o(e)).on("touchmove"+r,F).on("dragstart"+r,F).on("selectstart"+r,F);if(null==vt&&(vt=!("onselectstart"in e)&&I(e.style,"userSelect")),vt){var s=a(e).style,l=s[vt];s[vt]="none"}return function(t){if(i.on(r,null),vt&&(s[vt]=l),t){var e=function(){i.on(n,null)};i.on(n,function(){F(),e()},!0),setTimeout(e,0)}}}t.mouse=function(t){return _t(t,N())};var bt=this.navigator&&/WebKit/.test(this.navigator.userAgent)?-1:0;function _t(e,r){r.changedTouches&&(r=r.changedTouches[0]);var n=e.ownerSVGElement||e;if(n.createSVGPoint){var i=n.createSVGPoint();if(bt<0){var a=o(e);if(a.scrollX||a.scrollY){var s=(n=t.select("body").append("svg").style({position:"absolute",top:0,left:0,margin:0,padding:0,border:"none"},"important"))[0][0].getScreenCTM();bt=!(s.f||s.e),n.remove()}}return bt?(i.x=r.pageX,i.y=r.pageY):(i.x=r.clientX,i.y=r.clientY),[(i=i.matrixTransform(e.getScreenCTM().inverse())).x,i.y]}var l=e.getBoundingClientRect();return[r.clientX-l.left-e.clientLeft,r.clientY-l.top-e.clientTop]}function wt(){return t.event.changedTouches[0].identifier}t.touch=function(t,e,r){if(arguments.length<3&&(r=e,e=N().changedTouches),e)for(var n,i=0,a=e.length;i<a;++i)if((n=e[i]).identifier===r)return _t(t,n)},t.behavior.drag=function(){var e=j(a,"drag","dragstart","dragend"),r=null,n=s(D,t.mouse,o,"mousemove","mouseup"),i=s(wt,t.touch,z,"touchmove","touchend");function a(){this.on("mousedown.drag",n).on("touchstart.drag",i)}function s(n,i,a,o,s){return function(){var l,c=t.event.target.correspondingElement||t.event.target,u=this.parentNode,h=e.of(this,arguments),f=0,p=n(),d=".drag"+(null==p?"":"-"+p),g=t.select(a(c)).on(o+d,function(){var t,e,r=i(u,p);if(!r)return;t=r[0]-v[0],e=r[1]-v[1],f|=t|e,v=r,h({type:"drag",x:r[0]+l[0],y:r[1]+l[1],dx:t,dy:e})}).on(s+d,function(){if(!i(u,p))return;g.on(o+d,null).on(s+d,null),m(f),h({type:"dragend"})}),m=xt(c),v=i(u,p);l=r?[(l=r.apply(this,arguments)).x-v[0],l.y-v[1]]:[0,0],h({type:"dragstart"})}}return a.origin=function(t){return arguments.length?(r=t,a):r},t.rebind(a,e,"on")},t.touches=function(t,e){return arguments.length<2&&(e=N().touches),e?n(e).map(function(e){var r=_t(t,e);return r.identifier=e.identifier,r}):[]};var kt=1e-6,Mt=kt*kt,At=Math.PI,Tt=2*At,St=Tt-kt,Et=At/2,Ct=At/180,Lt=180/At;function zt(t){return t>0?1:t<0?-1:0}function Pt(t,e,r){return(e[0]-t[0])*(r[1]-t[1])-(e[1]-t[1])*(r[0]-t[0])}function It(t){return t>1?0:t<-1?At:Math.acos(t)}function Ot(t){return t>1?Et:t<-1?-Et:Math.asin(t)}function Dt(t){return((t=Math.exp(t))+1/t)/2}function Rt(t){return(t=Math.sin(t/2))*t}var Bt=Math.SQRT2;t.interpolateZoom=function(t,e){var r,n,i=t[0],a=t[1],o=t[2],s=e[0],l=e[1],c=e[2],u=s-i,h=l-a,f=u*u+h*h;if(f<Mt)n=Math.log(c/o)/Bt,r=function(t){return[i+t*u,a+t*h,o*Math.exp(Bt*t*n)]};else{var p=Math.sqrt(f),d=(c*c-o*o+4*f)/(2*o*2*p),g=(c*c-o*o-4*f)/(2*c*2*p),m=Math.log(Math.sqrt(d*d+1)-d),v=Math.log(Math.sqrt(g*g+1)-g);n=(v-m)/Bt,r=function(t){var e,r=t*n,s=Dt(m),l=o/(2*p)*(s*(e=Bt*r+m,((e=Math.exp(2*e))-1)/(e+1))-function(t){return((t=Math.exp(t))-1/t)/2}(m));return[i+l*u,a+l*h,o*s/Dt(Bt*r+m)]}}return r.duration=1e3*n,r},t.behavior.zoom=function(){var e,r,n,a,s,l,c,u,h,f={x:0,y:0,k:1},p=[960,500],d=jt,g=250,m=0,v="mousedown.zoom",y="mousemove.zoom",x="mouseup.zoom",b="touchstart.zoom",_=j(w,"zoomstart","zoom","zoomend");function w(t){t.on(v,z).on(Nt+".zoom",I).on("dblclick.zoom",O).on(b,P)}function k(t){return[(t[0]-f.x)/f.k,(t[1]-f.y)/f.k]}function M(t){f.k=Math.max(d[0],Math.min(d[1],t))}function A(t,e){e=function(t){return[t[0]*f.k+f.x,t[1]*f.k+f.y]}(e),f.x+=t[0]-e[0],f.y+=t[1]-e[1]}function T(e,n,i,a){e.__chart__={x:f.x,y:f.y,k:f.k},M(Math.pow(2,a)),A(r=n,i),e=t.select(e),g>0&&(e=e.transition().duration(g)),e.call(w.event)}function S(){c&&c.domain(l.range().map(function(t){return(t-f.x)/f.k}).map(l.invert)),h&&h.domain(u.range().map(function(t){return(t-f.y)/f.k}).map(u.invert))}function E(t){m++||t({type:"zoomstart"})}function C(t){S(),t({type:"zoom",scale:f.k,translate:[f.x,f.y]})}function L(t){--m||(t({type:"zoomend"}),r=null)}function z(){var e=this,r=_.of(e,arguments),n=0,i=t.select(o(e)).on(y,function(){n=1,A(t.mouse(e),a),C(r)}).on(x,function(){i.on(y,null).on(x,null),s(n),L(r)}),a=k(t.mouse(e)),s=xt(e);hs.call(e),E(r)}function P(){var e,r=this,n=_.of(r,arguments),i={},a=0,o=".zoom-"+t.event.changedTouches[0].identifier,l="touchmove"+o,c="touchend"+o,u=[],h=t.select(r),p=xt(r);function d(){var n=t.touches(r);return e=f.k,n.forEach(function(t){t.identifier in i&&(i[t.identifier]=k(t))}),n}function g(){var e=t.event.target;t.select(e).on(l,m).on(c,y),u.push(e);for(var n=t.event.changedTouches,o=0,h=n.length;o<h;++o)i[n[o].identifier]=null;var p=d(),g=Date.now();if(1===p.length){if(g-s<500){var v=p[0];T(r,v,i[v.identifier],Math.floor(Math.log(f.k)/Math.LN2)+1),F()}s=g}else if(p.length>1){v=p[0];var x=p[1],b=v[0]-x[0],_=v[1]-x[1];a=b*b+_*_}}function m(){var o,l,c,u,h=t.touches(r);hs.call(r);for(var f=0,p=h.length;f<p;++f,u=null)if(c=h[f],u=i[c.identifier]){if(l)break;o=c,l=u}if(u){var d=(d=c[0]-o[0])*d+(d=c[1]-o[1])*d,g=a&&Math.sqrt(d/a);o=[(o[0]+c[0])/2,(o[1]+c[1])/2],l=[(l[0]+u[0])/2,(l[1]+u[1])/2],M(g*e)}s=null,A(o,l),C(n)}function y(){if(t.event.touches.length){for(var e=t.event.changedTouches,r=0,a=e.length;r<a;++r)delete i[e[r].identifier];for(var s in i)return void d()}t.selectAll(u).on(o,null),h.on(v,z).on(b,P),p(),L(n)}g(),E(n),h.on(v,null).on(b,g)}function I(){var i=_.of(this,arguments);a?clearTimeout(a):(hs.call(this),e=k(r=n||t.mouse(this)),E(i)),a=setTimeout(function(){a=null,L(i)},50),F(),M(Math.pow(2,.002*Ft())*f.k),A(r,e),C(i)}function O(){var e=t.mouse(this),r=Math.log(f.k)/Math.LN2;T(this,e,k(e),t.event.shiftKey?Math.ceil(r)-1:Math.floor(r)+1)}return Nt||(Nt="onwheel"in i?(Ft=function(){return-t.event.deltaY*(t.event.deltaMode?120:1)},"wheel"):"onmousewheel"in i?(Ft=function(){return t.event.wheelDelta},"mousewheel"):(Ft=function(){return-t.event.detail},"MozMousePixelScroll")),w.event=function(e){e.each(function(){var e=_.of(this,arguments),n=f;ds?t.select(this).transition().each("start.zoom",function(){f=this.__chart__||{x:0,y:0,k:1},E(e)}).tween("zoom:zoom",function(){var i=p[0],a=p[1],o=r?r[0]:i/2,s=r?r[1]:a/2,l=t.interpolateZoom([(o-f.x)/f.k,(s-f.y)/f.k,i/f.k],[(o-n.x)/n.k,(s-n.y)/n.k,i/n.k]);return function(t){var r=l(t),n=i/r[2];this.__chart__=f={x:o-r[0]*n,y:s-r[1]*n,k:n},C(e)}}).each("interrupt.zoom",function(){L(e)}).each("end.zoom",function(){L(e)}):(this.__chart__=f,E(e),C(e),L(e))})},w.translate=function(t){return arguments.length?(f={x:+t[0],y:+t[1],k:f.k},S(),w):[f.x,f.y]},w.scale=function(t){return arguments.length?(f={x:f.x,y:f.y,k:null},M(+t),S(),w):f.k},w.scaleExtent=function(t){return arguments.length?(d=null==t?jt:[+t[0],+t[1]],w):d},w.center=function(t){return arguments.length?(n=t&&[+t[0],+t[1]],w):n},w.size=function(t){return arguments.length?(p=t&&[+t[0],+t[1]],w):p},w.duration=function(t){return arguments.length?(g=+t,w):g},w.x=function(t){return arguments.length?(c=t,l=t.copy(),f={x:0,y:0,k:1},w):c},w.y=function(t){return arguments.length?(h=t,u=t.copy(),f={x:0,y:0,k:1},w):h},t.rebind(w,_,"on")};var Ft,Nt,jt=[0,1/0];function Vt(){}function Ut(t,e,r){return this instanceof Ut?(this.h=+t,this.s=+e,void(this.l=+r)):arguments.length<2?t instanceof Ut?new Ut(t.h,t.s,t.l):ue(""+t,he,Ut):new Ut(t,e,r)}t.color=Vt,Vt.prototype.toString=function(){return this.rgb()+""},t.hsl=Ut;var qt=Ut.prototype=new Vt;function Ht(t,e,r){var n,i;function a(t){return Math.round(255*function(t){return t>360?t-=360:t<0&&(t+=360),t<60?n+(i-n)*t/60:t<180?i:t<240?n+(i-n)*(240-t)/60:n}(t))}return t=isNaN(t)?0:(t%=360)<0?t+360:t,e=isNaN(e)?0:e<0?0:e>1?1:e,n=2*(r=r<0?0:r>1?1:r)-(i=r<=.5?r*(1+e):r+e-r*e),new ae(a(t+120),a(t),a(t-120))}function Gt(e,r,n){return this instanceof Gt?(this.h=+e,this.c=+r,void(this.l=+n)):arguments.length<2?e instanceof Gt?new Gt(e.h,e.c,e.l):ee(e instanceof Xt?e.l:(e=fe((e=t.rgb(e)).r,e.g,e.b)).l,e.a,e.b):new Gt(e,r,n)}qt.brighter=function(t){return t=Math.pow(.7,arguments.length?t:1),new Ut(this.h,this.s,this.l/t)},qt.darker=function(t){return t=Math.pow(.7,arguments.length?t:1),new Ut(this.h,this.s,t*this.l)},qt.rgb=function(){return Ht(this.h,this.s,this.l)},t.hcl=Gt;var Wt=Gt.prototype=new Vt;function Yt(t,e,r){return isNaN(t)&&(t=0),isNaN(e)&&(e=0),new Xt(r,Math.cos(t*=Ct)*e,Math.sin(t)*e)}function Xt(t,e,r){return this instanceof Xt?(this.l=+t,this.a=+e,void(this.b=+r)):arguments.length<2?t instanceof Xt?new Xt(t.l,t.a,t.b):t instanceof Gt?Yt(t.h,t.c,t.l):fe((t=ae(t)).r,t.g,t.b):new Xt(t,e,r)}Wt.brighter=function(t){return new Gt(this.h,this.c,Math.min(100,this.l+Zt*(arguments.length?t:1)))},Wt.darker=function(t){return new Gt(this.h,this.c,Math.max(0,this.l-Zt*(arguments.length?t:1)))},Wt.rgb=function(){return Yt(this.h,this.c,this.l).rgb()},t.lab=Xt;var Zt=18,$t=.95047,Jt=1,Kt=1.08883,Qt=Xt.prototype=new Vt;function te(t,e,r){var n=(t+16)/116,i=n+e/500,a=n-r/200;return new ae(ie(3.2404542*(i=re(i)*$t)-1.5371385*(n=re(n)*Jt)-.4985314*(a=re(a)*Kt)),ie(-.969266*i+1.8760108*n+.041556*a),ie(.0556434*i-.2040259*n+1.0572252*a))}function ee(t,e,r){return t>0?new Gt(Math.atan2(r,e)*Lt,Math.sqrt(e*e+r*r),t):new Gt(NaN,NaN,t)}function re(t){return t>.206893034?t*t*t:(t-4/29)/7.787037}function ne(t){return t>.008856?Math.pow(t,1/3):7.787037*t+4/29}function ie(t){return Math.round(255*(t<=.00304?12.92*t:1.055*Math.pow(t,1/2.4)-.055))}function ae(t,e,r){return this instanceof ae?(this.r=~~t,this.g=~~e,void(this.b=~~r)):arguments.length<2?t instanceof ae?new ae(t.r,t.g,t.b):ue(""+t,ae,Ht):new ae(t,e,r)}function oe(t){return new ae(t>>16,t>>8&255,255&t)}function se(t){return oe(t)+""}Qt.brighter=function(t){return new Xt(Math.min(100,this.l+Zt*(arguments.length?t:1)),this.a,this.b)},Qt.darker=function(t){return new Xt(Math.max(0,this.l-Zt*(arguments.length?t:1)),this.a,this.b)},Qt.rgb=function(){return te(this.l,this.a,this.b)},t.rgb=ae;var le=ae.prototype=new Vt;function ce(t){return t<16?"0"+Math.max(0,t).toString(16):Math.min(255,t).toString(16)}function ue(t,e,r){var n,i,a,o=0,s=0,l=0;if(n=/([a-z]+)\((.*)\)/.exec(t=t.toLowerCase()))switch(i=n[2].split(","),n[1]){case"hsl":return r(parseFloat(i[0]),parseFloat(i[1])/100,parseFloat(i[2])/100);case"rgb":return e(de(i[0]),de(i[1]),de(i[2]))}return(a=ge.get(t))?e(a.r,a.g,a.b):(null==t||"#"!==t.charAt(0)||isNaN(a=parseInt(t.slice(1),16))||(4===t.length?(o=(3840&a)>>4,o|=o>>4,s=240&a,s|=s>>4,l=15&a,l|=l<<4):7===t.length&&(o=(16711680&a)>>16,s=(65280&a)>>8,l=255&a)),e(o,s,l))}function he(t,e,r){var n,i,a=Math.min(t/=255,e/=255,r/=255),o=Math.max(t,e,r),s=o-a,l=(o+a)/2;return s?(i=l<.5?s/(o+a):s/(2-o-a),n=t==o?(e-r)/s+(e<r?6:0):e==o?(r-t)/s+2:(t-e)/s+4,n*=60):(n=NaN,i=l>0&&l<1?0:n),new Ut(n,i,l)}function fe(t,e,r){var n=ne((.4124564*(t=pe(t))+.3575761*(e=pe(e))+.1804375*(r=pe(r)))/$t),i=ne((.2126729*t+.7151522*e+.072175*r)/Jt);return Xt(116*i-16,500*(n-i),200*(i-ne((.0193339*t+.119192*e+.9503041*r)/Kt)))}function pe(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function de(t){var e=parseFloat(t);return"%"===t.charAt(t.length-1)?Math.round(2.55*e):e}le.brighter=function(t){t=Math.pow(.7,arguments.length?t:1);var e=this.r,r=this.g,n=this.b,i=30;return e||r||n?(e&&e<i&&(e=i),r&&r<i&&(r=i),n&&n<i&&(n=i),new ae(Math.min(255,e/t),Math.min(255,r/t),Math.min(255,n/t))):new ae(i,i,i)},le.darker=function(t){return new ae((t=Math.pow(.7,arguments.length?t:1))*this.r,t*this.g,t*this.b)},le.hsl=function(){return he(this.r,this.g,this.b)},le.toString=function(){return"#"+ce(this.r)+ce(this.g)+ce(this.b)};var ge=t.map({aliceblue:15792383,antiquewhite:16444375,aqua:65535,aquamarine:8388564,azure:15794175,beige:16119260,bisque:16770244,black:0,blanchedalmond:16772045,blue:255,blueviolet:9055202,brown:10824234,burlywood:14596231,cadetblue:6266528,chartreuse:8388352,chocolate:13789470,coral:16744272,cornflowerblue:6591981,cornsilk:16775388,crimson:14423100,cyan:65535,darkblue:139,darkcyan:35723,darkgoldenrod:12092939,darkgray:11119017,darkgreen:25600,darkgrey:11119017,darkkhaki:12433259,darkmagenta:9109643,darkolivegreen:5597999,darkorange:16747520,darkorchid:10040012,darkred:9109504,darksalmon:15308410,darkseagreen:9419919,darkslateblue:4734347,darkslategray:3100495,darkslategrey:3100495,darkturquoise:52945,darkviolet:9699539,deeppink:16716947,deepskyblue:49151,dimgray:6908265,dimgrey:6908265,dodgerblue:2003199,firebrick:11674146,floralwhite:16775920,forestgreen:2263842,fuchsia:16711935,gainsboro:14474460,ghostwhite:16316671,gold:16766720,goldenrod:14329120,gray:8421504,green:32768,greenyellow:11403055,grey:8421504,honeydew:15794160,hotpink:16738740,indianred:13458524,indigo:4915330,ivory:16777200,khaki:15787660,lavender:15132410,lavenderblush:16773365,lawngreen:8190976,lemonchiffon:16775885,lightblue:11393254,lightcoral:15761536,lightcyan:14745599,lightgoldenrodyellow:16448210,lightgray:13882323,lightgreen:9498256,lightgrey:13882323,lightpink:16758465,lightsalmon:16752762,lightseagreen:2142890,lightskyblue:8900346,lightslategray:7833753,lightslategrey:7833753,lightsteelblue:11584734,lightyellow:16777184,lime:65280,limegreen:3329330,linen:16445670,magenta:16711935,maroon:8388608,mediumaquamarine:6737322,mediumblue:205,mediumorchid:12211667,mediumpurple:9662683,mediumseagreen:3978097,mediumslateblue:8087790,mediumspringgreen:64154,mediumturquoise:4772300,mediumvioletred:13047173,midnightblue:1644912,mintcream:16121850,mistyrose:16770273,moccasin:16770229,navajowhite:16768685,navy:128,oldlace:16643558,olive:8421376,olivedrab:7048739,orange:16753920,orangered:16729344,orchid:14315734,palegoldenrod:15657130,palegreen:10025880,paleturquoise:11529966,palevioletred:14381203,papayawhip:16773077,peachpuff:16767673,peru:13468991,pink:16761035,plum:14524637,powderblue:11591910,purple:8388736,rebeccapurple:6697881,red:16711680,rosybrown:12357519,royalblue:4286945,saddlebrown:9127187,salmon:16416882,sandybrown:16032864,seagreen:3050327,seashell:16774638,sienna:10506797,silver:12632256,skyblue:8900331,slateblue:6970061,slategray:7372944,slategrey:7372944,snow:16775930,springgreen:65407,steelblue:4620980,tan:13808780,teal:32896,thistle:14204888,tomato:16737095,turquoise:4251856,violet:15631086,wheat:16113331,white:16777215,whitesmoke:16119285,yellow:16776960,yellowgreen:10145074});function me(t){return"function"==typeof t?t:function(){return t}}function ve(t){return function(e,r,n){return 2===arguments.length&&"function"==typeof r&&(n=r,r=null),ye(e,r,t,n)}}function ye(e,r,i,a){var o={},s=t.dispatch("beforesend","progress","load","error"),l={},c=new XMLHttpRequest,u=null;function h(){var t,e=c.status;if(!e&&function(t){var e=t.responseType;return e&&"text"!==e?t.response:t.responseText}(c)||e>=200&&e<300||304===e){try{t=i.call(o,c)}catch(t){return void s.error.call(o,t)}s.load.call(o,t)}else s.error.call(o,c)}return!this.XDomainRequest||"withCredentials"in c||!/^(http(s)?:)?\/\//.test(e)||(c=new XDomainRequest),"onload"in c?c.onload=c.onerror=h:c.onreadystatechange=function(){c.readyState>3&&h()},c.onprogress=function(e){var r=t.event;t.event=e;try{s.progress.call(o,c)}finally{t.event=r}},o.header=function(t,e){return t=(t+"").toLowerCase(),arguments.length<2?l[t]:(null==e?delete l[t]:l[t]=e+"",o)},o.mimeType=function(t){return arguments.length?(r=null==t?null:t+"",o):r},o.responseType=function(t){return arguments.length?(u=t,o):u},o.response=function(t){return i=t,o},["get","post"].forEach(function(t){o[t]=function(){return o.send.apply(o,[t].concat(n(arguments)))}}),o.send=function(t,n,i){if(2===arguments.length&&"function"==typeof n&&(i=n,n=null),c.open(t,e,!0),null==r||"accept"in l||(l.accept=r+",*/*"),c.setRequestHeader)for(var a in l)c.setRequestHeader(a,l[a]);return null!=r&&c.overrideMimeType&&c.overrideMimeType(r),null!=u&&(c.responseType=u),null!=i&&o.on("error",i).on("load",function(t){i(null,t)}),s.beforesend.call(o,c),c.send(null==n?null:n),o},o.abort=function(){return c.abort(),o},t.rebind(o,s,"on"),null==a?o:o.get(function(t){return 1===t.length?function(e,r){t(null==e?r:null)}:t}(a))}ge.forEach(function(t,e){ge.set(t,oe(e))}),t.functor=me,t.xhr=ve(z),t.dsv=function(t,e){var r=new RegExp('["'+t+"\n]"),n=t.charCodeAt(0);function i(t,r,n){arguments.length<3&&(n=r,r=null);var i=ye(t,e,null==r?a:o(r),n);return i.row=function(t){return arguments.length?i.response(null==(r=t)?a:o(t)):r},i}function a(t){return i.parse(t.responseText)}function o(t){return function(e){return i.parse(e.responseText,t)}}function s(e){return e.map(l).join(t)}function l(t){return r.test(t)?'"'+t.replace(/\"/g,'""')+'"':t}return i.parse=function(t,e){var r;return i.parseRows(t,function(t,n){if(r)return r(t,n-1);var i=new Function("d","return {"+t.map(function(t,e){return JSON.stringify(t)+": d["+e+"]"}).join(",")+"}");r=e?function(t,r){return e(i(t),r)}:i})},i.parseRows=function(t,e){var r,i,a={},o={},s=[],l=t.length,c=0,u=0;function h(){if(c>=l)return o;if(i)return i=!1,a;var e=c;if(34===t.charCodeAt(e)){for(var r=e;r++<l;)if(34===t.charCodeAt(r)){if(34!==t.charCodeAt(r+1))break;++r}return c=r+2,13===(s=t.charCodeAt(r+1))?(i=!0,10===t.charCodeAt(r+2)&&++c):10===s&&(i=!0),t.slice(e+1,r).replace(/""/g,'"')}for(;c<l;){var s,u=1;if(10===(s=t.charCodeAt(c++)))i=!0;else if(13===s)i=!0,10===t.charCodeAt(c)&&(++c,++u);else if(s!==n)continue;return t.slice(e,c-u)}return t.slice(e)}for(;(r=h())!==o;){for(var f=[];r!==a&&r!==o;)f.push(r),r=h();e&&null==(f=e(f,u++))||s.push(f)}return s},i.format=function(e){if(Array.isArray(e[0]))return i.formatRows(e);var r=new L,n=[];return e.forEach(function(t){for(var e in t)r.has(e)||n.push(r.add(e))}),[n.map(l).join(t)].concat(e.map(function(e){return n.map(function(t){return l(e[t])}).join(t)})).join("\n")},i.formatRows=function(t){return t.map(s).join("\n")},i},t.csv=t.dsv(",","text/csv"),t.tsv=t.dsv("\t","text/tab-separated-values");var xe,be,_e,we,ke=this[I(this,"requestAnimationFrame")]||function(t){setTimeout(t,17)};function Me(t,e,r){var n=arguments.length;n<2&&(e=0),n<3&&(r=Date.now());var i={c:t,t:r+e,n:null};return be?be.n=i:xe=i,be=i,_e||(we=clearTimeout(we),_e=1,ke(Ae)),i}function Ae(){var t=Te(),e=Se()-t;e>24?(isFinite(e)&&(clearTimeout(we),we=setTimeout(Ae,e)),_e=0):(_e=1,ke(Ae))}function Te(){for(var t=Date.now(),e=xe;e;)t>=e.t&&e.c(t-e.t)&&(e.c=null),e=e.n;return t}function Se(){for(var t,e=xe,r=1/0;e;)e.c?(e.t<r&&(r=e.t),e=(t=e).n):e=t?t.n=e.n:xe=e.n;return be=t,r}function Ee(t,e){return e-(t?Math.ceil(Math.log(t)/Math.LN10):1)}t.timer=function(){Me.apply(this,arguments)},t.timer.flush=function(){Te(),Se()},t.round=function(t,e){return e?Math.round(t*(e=Math.pow(10,e)))/e:Math.round(t)};var Ce=["y","z","a","f","p","n","\xb5","m","","k","M","G","T","P","E","Z","Y"].map(function(t,e){var r=Math.pow(10,3*y(8-e));return{scale:e>8?function(t){return t/r}:function(t){return t*r},symbol:t}});t.formatPrefix=function(e,r){var n=0;return(e=+e)&&(e<0&&(e*=-1),r&&(e=t.round(e,Ee(e,r))),n=1+Math.floor(1e-12+Math.log(e)/Math.LN10),n=Math.max(-24,Math.min(24,3*Math.floor((n-1)/3)))),Ce[8+n/3]};var Le=/(?:([^{])?([<>=^]))?([+\- ])?([$#])?(0)?(\d+)?(,)?(\.-?\d+)?([a-z%])?/i,ze=t.map({b:function(t){return t.toString(2)},c:function(t){return String.fromCharCode(t)},o:function(t){return t.toString(8)},x:function(t){return t.toString(16)},X:function(t){return t.toString(16).toUpperCase()},g:function(t,e){return t.toPrecision(e)},e:function(t,e){return t.toExponential(e)},f:function(t,e){return t.toFixed(e)},r:function(e,r){return(e=t.round(e,Ee(e,r))).toFixed(Math.max(0,Math.min(20,Ee(e*(1+1e-15),r))))}});function Pe(t){return t+""}var Ie=t.time={},Oe=Date;function De(){this._=new Date(arguments.length>1?Date.UTC.apply(this,arguments):arguments[0])}De.prototype={getDate:function(){return this._.getUTCDate()},getDay:function(){return this._.getUTCDay()},getFullYear:function(){return this._.getUTCFullYear()},getHours:function(){return this._.getUTCHours()},getMilliseconds:function(){return this._.getUTCMilliseconds()},getMinutes:function(){return this._.getUTCMinutes()},getMonth:function(){return this._.getUTCMonth()},getSeconds:function(){return this._.getUTCSeconds()},getTime:function(){return this._.getTime()},getTimezoneOffset:function(){return 0},valueOf:function(){return this._.valueOf()},setDate:function(){Re.setUTCDate.apply(this._,arguments)},setDay:function(){Re.setUTCDay.apply(this._,arguments)},setFullYear:function(){Re.setUTCFullYear.apply(this._,arguments)},setHours:function(){Re.setUTCHours.apply(this._,arguments)},setMilliseconds:function(){Re.setUTCMilliseconds.apply(this._,arguments)},setMinutes:function(){Re.setUTCMinutes.apply(this._,arguments)},setMonth:function(){Re.setUTCMonth.apply(this._,arguments)},setSeconds:function(){Re.setUTCSeconds.apply(this._,arguments)},setTime:function(){Re.setTime.apply(this._,arguments)}};var Re=Date.prototype;function Be(t,e,r){function n(e){var r=t(e),n=a(r,1);return e-r<n-e?r:n}function i(r){return e(r=t(new Oe(r-1)),1),r}function a(t,r){return e(t=new Oe(+t),r),t}function o(t,n,a){var o=i(t),s=[];if(a>1)for(;o<n;)r(o)%a||s.push(new Date(+o)),e(o,1);else for(;o<n;)s.push(new Date(+o)),e(o,1);return s}t.floor=t,t.round=n,t.ceil=i,t.offset=a,t.range=o;var s=t.utc=Fe(t);return s.floor=s,s.round=Fe(n),s.ceil=Fe(i),s.offset=Fe(a),s.range=function(t,e,r){try{Oe=De;var n=new De;return n._=t,o(n,e,r)}finally{Oe=Date}},t}function Fe(t){return function(e,r){try{Oe=De;var n=new De;return n._=e,t(n,r)._}finally{Oe=Date}}}Ie.year=Be(function(t){return(t=Ie.day(t)).setMonth(0,1),t},function(t,e){t.setFullYear(t.getFullYear()+e)},function(t){return t.getFullYear()}),Ie.years=Ie.year.range,Ie.years.utc=Ie.year.utc.range,Ie.day=Be(function(t){var e=new Oe(2e3,0);return e.setFullYear(t.getFullYear(),t.getMonth(),t.getDate()),e},function(t,e){t.setDate(t.getDate()+e)},function(t){return t.getDate()-1}),Ie.days=Ie.day.range,Ie.days.utc=Ie.day.utc.range,Ie.dayOfYear=function(t){var e=Ie.year(t);return Math.floor((t-e-6e4*(t.getTimezoneOffset()-e.getTimezoneOffset()))/864e5)},["sunday","monday","tuesday","wednesday","thursday","friday","saturday"].forEach(function(t,e){e=7-e;var r=Ie[t]=Be(function(t){return(t=Ie.day(t)).setDate(t.getDate()-(t.getDay()+e)%7),t},function(t,e){t.setDate(t.getDate()+7*Math.floor(e))},function(t){var r=Ie.year(t).getDay();return Math.floor((Ie.dayOfYear(t)+(r+e)%7)/7)-(r!==e)});Ie[t+"s"]=r.range,Ie[t+"s"].utc=r.utc.range,Ie[t+"OfYear"]=function(t){var r=Ie.year(t).getDay();return Math.floor((Ie.dayOfYear(t)+(r+e)%7)/7)}}),Ie.week=Ie.sunday,Ie.weeks=Ie.sunday.range,Ie.weeks.utc=Ie.sunday.utc.range,Ie.weekOfYear=Ie.sundayOfYear;var Ne={"-":"",_:" ",0:"0"},je=/^\s*\d+/,Ve=/^%/;function Ue(t,e,r){var n=t<0?"-":"",i=(n?-t:t)+"",a=i.length;return n+(a<r?new Array(r-a+1).join(e)+i:i)}function qe(e){return new RegExp("^(?:"+e.map(t.requote).join("|")+")","i")}function He(t){for(var e=new b,r=-1,n=t.length;++r<n;)e.set(t[r].toLowerCase(),r);return e}function Ge(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r,r+1));return n?(t.w=+n[0],r+n[0].length):-1}function We(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r));return n?(t.U=+n[0],r+n[0].length):-1}function Ye(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r));return n?(t.W=+n[0],r+n[0].length):-1}function Xe(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r,r+4));return n?(t.y=+n[0],r+n[0].length):-1}function Ze(t,e,r){je.lastIndex=0;var n,i=je.exec(e.slice(r,r+2));return i?(t.y=(n=+i[0])+(n>68?1900:2e3),r+i[0].length):-1}function $e(t,e,r){return/^[+-]\d{4}$/.test(e=e.slice(r,r+5))?(t.Z=-e,r+5):-1}function Je(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r,r+2));return n?(t.m=n[0]-1,r+n[0].length):-1}function Ke(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r,r+2));return n?(t.d=+n[0],r+n[0].length):-1}function Qe(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r,r+3));return n?(t.j=+n[0],r+n[0].length):-1}function tr(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r,r+2));return n?(t.H=+n[0],r+n[0].length):-1}function er(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r,r+2));return n?(t.M=+n[0],r+n[0].length):-1}function rr(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r,r+2));return n?(t.S=+n[0],r+n[0].length):-1}function nr(t,e,r){je.lastIndex=0;var n=je.exec(e.slice(r,r+3));return n?(t.L=+n[0],r+n[0].length):-1}function ir(t){var e=t.getTimezoneOffset(),r=e>0?"-":"+",n=y(e)/60|0,i=y(e)%60;return r+Ue(n,"0",2)+Ue(i,"0",2)}function ar(t,e,r){Ve.lastIndex=0;var n=Ve.exec(e.slice(r,r+1));return n?r+n[0].length:-1}function or(t){for(var e=t.length,r=-1;++r<e;)t[r][0]=this(t[r][0]);return function(e){for(var r=0,n=t[r];!n[1](e);)n=t[++r];return n[0](e)}}t.locale=function(e){return{numberFormat:function(e){var r=e.decimal,n=e.thousands,i=e.grouping,a=e.currency,o=i&&n?function(t,e){for(var r=t.length,a=[],o=0,s=i[0],l=0;r>0&&s>0&&(l+s+1>e&&(s=Math.max(1,e-l)),a.push(t.substring(r-=s,r+s)),!((l+=s+1)>e));)s=i[o=(o+1)%i.length];return a.reverse().join(n)}:z;return function(e){var n=Le.exec(e),i=n[1]||" ",s=n[2]||">",l=n[3]||"-",c=n[4]||"",u=n[5],h=+n[6],f=n[7],p=n[8],d=n[9],g=1,m="",v="",y=!1,x=!0;switch(p&&(p=+p.substring(1)),(u||"0"===i&&"="===s)&&(u=i="0",s="="),d){case"n":f=!0,d="g";break;case"%":g=100,v="%",d="f";break;case"p":g=100,v="%",d="r";break;case"b":case"o":case"x":case"X":"#"===c&&(m="0"+d.toLowerCase());case"c":x=!1;case"d":y=!0,p=0;break;case"s":g=-1,d="r"}"$"===c&&(m=a[0],v=a[1]),"r"!=d||p||(d="g"),null!=p&&("g"==d?p=Math.max(1,Math.min(21,p)):"e"!=d&&"f"!=d||(p=Math.max(0,Math.min(20,p)))),d=ze.get(d)||Pe;var b=u&&f;return function(e){var n=v;if(y&&e%1)return"";var a=e<0||0===e&&1/e<0?(e=-e,"-"):"-"===l?"":l;if(g<0){var c=t.formatPrefix(e,p);e=c.scale(e),n=c.symbol+v}else e*=g;var _,w,k=(e=d(e,p)).lastIndexOf(".");if(k<0){var M=x?e.lastIndexOf("e"):-1;M<0?(_=e,w=""):(_=e.substring(0,M),w=e.substring(M))}else _=e.substring(0,k),w=r+e.substring(k+1);!u&&f&&(_=o(_,1/0));var A=m.length+_.length+w.length+(b?0:a.length),T=A<h?new Array(A=h-A+1).join(i):"";return b&&(_=o(T+_,T.length?h-w.length:1/0)),a+=m,e=_+w,("<"===s?a+e+T:">"===s?T+a+e:"^"===s?T.substring(0,A>>=1)+a+e+T.substring(A):a+(b?e:T+e))+n}}}(e),timeFormat:function(e){var r=e.dateTime,n=e.date,i=e.time,a=e.periods,o=e.days,s=e.shortDays,l=e.months,c=e.shortMonths;function u(t){var e=t.length;function r(r){for(var n,i,a,o=[],s=-1,l=0;++s<e;)37===t.charCodeAt(s)&&(o.push(t.slice(l,s)),null!=(i=Ne[n=t.charAt(++s)])&&(n=t.charAt(++s)),(a=_[n])&&(n=a(r,null==i?"e"===n?" ":"0":i)),o.push(n),l=s+1);return o.push(t.slice(l,s)),o.join("")}return r.parse=function(e){var r={y:1900,m:0,d:1,H:0,M:0,S:0,L:0,Z:null};if(h(r,t,e,0)!=e.length)return null;"p"in r&&(r.H=r.H%12+12*r.p);var n=null!=r.Z&&Oe!==De,i=new(n?De:Oe);return"j"in r?i.setFullYear(r.y,0,r.j):"W"in r||"U"in r?("w"in r||(r.w="W"in r?1:0),i.setFullYear(r.y,0,1),i.setFullYear(r.y,0,"W"in r?(r.w+6)%7+7*r.W-(i.getDay()+5)%7:r.w+7*r.U-(i.getDay()+6)%7)):i.setFullYear(r.y,r.m,r.d),i.setHours(r.H+(r.Z/100|0),r.M+r.Z%100,r.S,r.L),n?i._:i},r.toString=function(){return t},r}function h(t,e,r,n){for(var i,a,o,s=0,l=e.length,c=r.length;s<l;){if(n>=c)return-1;if(37===(i=e.charCodeAt(s++))){if(o=e.charAt(s++),!(a=w[o in Ne?e.charAt(s++):o])||(n=a(t,r,n))<0)return-1}else if(i!=r.charCodeAt(n++))return-1}return n}u.utc=function(t){var e=u(t);function r(t){try{var r=new(Oe=De);return r._=t,e(r)}finally{Oe=Date}}return r.parse=function(t){try{Oe=De;var r=e.parse(t);return r&&r._}finally{Oe=Date}},r.toString=e.toString,r},u.multi=u.utc.multi=or;var f=t.map(),p=qe(o),d=He(o),g=qe(s),m=He(s),v=qe(l),y=He(l),x=qe(c),b=He(c);a.forEach(function(t,e){f.set(t.toLowerCase(),e)});var _={a:function(t){return s[t.getDay()]},A:function(t){return o[t.getDay()]},b:function(t){return c[t.getMonth()]},B:function(t){return l[t.getMonth()]},c:u(r),d:function(t,e){return Ue(t.getDate(),e,2)},e:function(t,e){return Ue(t.getDate(),e,2)},H:function(t,e){return Ue(t.getHours(),e,2)},I:function(t,e){return Ue(t.getHours()%12||12,e,2)},j:function(t,e){return Ue(1+Ie.dayOfYear(t),e,3)},L:function(t,e){return Ue(t.getMilliseconds(),e,3)},m:function(t,e){return Ue(t.getMonth()+1,e,2)},M:function(t,e){return Ue(t.getMinutes(),e,2)},p:function(t){return a[+(t.getHours()>=12)]},S:function(t,e){return Ue(t.getSeconds(),e,2)},U:function(t,e){return Ue(Ie.sundayOfYear(t),e,2)},w:function(t){return t.getDay()},W:function(t,e){return Ue(Ie.mondayOfYear(t),e,2)},x:u(n),X:u(i),y:function(t,e){return Ue(t.getFullYear()%100,e,2)},Y:function(t,e){return Ue(t.getFullYear()%1e4,e,4)},Z:ir,"%":function(){return"%"}},w={a:function(t,e,r){g.lastIndex=0;var n=g.exec(e.slice(r));return n?(t.w=m.get(n[0].toLowerCase()),r+n[0].length):-1},A:function(t,e,r){p.lastIndex=0;var n=p.exec(e.slice(r));return n?(t.w=d.get(n[0].toLowerCase()),r+n[0].length):-1},b:function(t,e,r){x.lastIndex=0;var n=x.exec(e.slice(r));return n?(t.m=b.get(n[0].toLowerCase()),r+n[0].length):-1},B:function(t,e,r){v.lastIndex=0;var n=v.exec(e.slice(r));return n?(t.m=y.get(n[0].toLowerCase()),r+n[0].length):-1},c:function(t,e,r){return h(t,_.c.toString(),e,r)},d:Ke,e:Ke,H:tr,I:tr,j:Qe,L:nr,m:Je,M:er,p:function(t,e,r){var n=f.get(e.slice(r,r+=2).toLowerCase());return null==n?-1:(t.p=n,r)},S:rr,U:We,w:Ge,W:Ye,x:function(t,e,r){return h(t,_.x.toString(),e,r)},X:function(t,e,r){return h(t,_.X.toString(),e,r)},y:Ze,Y:Xe,Z:$e,"%":ar};return u}(e)}};var sr=t.locale({decimal:".",thousands:",",grouping:[3],currency:["$",""],dateTime:"%a %b %e %X %Y",date:"%m/%d/%Y",time:"%H:%M:%S",periods:["AM","PM"],days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]});function lr(){}t.format=sr.numberFormat,t.geo={},lr.prototype={s:0,t:0,add:function(t){ur(t,this.t,cr),ur(cr.s,this.s,this),this.s?this.t+=cr.t:this.s=cr.t},reset:function(){this.s=this.t=0},valueOf:function(){return this.s}};var cr=new lr;function ur(t,e,r){var n=r.s=t+e,i=n-t,a=n-i;r.t=t-a+(e-i)}function hr(t,e){t&&pr.hasOwnProperty(t.type)&&pr[t.type](t,e)}t.geo.stream=function(t,e){t&&fr.hasOwnProperty(t.type)?fr[t.type](t,e):hr(t,e)};var fr={Feature:function(t,e){hr(t.geometry,e)},FeatureCollection:function(t,e){for(var r=t.features,n=-1,i=r.length;++n<i;)hr(r[n].geometry,e)}},pr={Sphere:function(t,e){e.sphere()},Point:function(t,e){t=t.coordinates,e.point(t[0],t[1],t[2])},MultiPoint:function(t,e){for(var r=t.coordinates,n=-1,i=r.length;++n<i;)t=r[n],e.point(t[0],t[1],t[2])},LineString:function(t,e){dr(t.coordinates,e,0)},MultiLineString:function(t,e){for(var r=t.coordinates,n=-1,i=r.length;++n<i;)dr(r[n],e,0)},Polygon:function(t,e){gr(t.coordinates,e)},MultiPolygon:function(t,e){for(var r=t.coordinates,n=-1,i=r.length;++n<i;)gr(r[n],e)},GeometryCollection:function(t,e){for(var r=t.geometries,n=-1,i=r.length;++n<i;)hr(r[n],e)}};function dr(t,e,r){var n,i=-1,a=t.length-r;for(e.lineStart();++i<a;)n=t[i],e.point(n[0],n[1],n[2]);e.lineEnd()}function gr(t,e){var r=-1,n=t.length;for(e.polygonStart();++r<n;)dr(t[r],e,1);e.polygonEnd()}t.geo.area=function(e){return mr=0,t.geo.stream(e,Cr),mr};var mr,vr,yr,xr,br,_r,wr,kr,Mr,Ar,Tr,Sr,Er=new lr,Cr={sphere:function(){mr+=4*At},point:D,lineStart:D,lineEnd:D,polygonStart:function(){Er.reset(),Cr.lineStart=Lr},polygonEnd:function(){var t=2*Er;mr+=t<0?4*At+t:t,Cr.lineStart=Cr.lineEnd=Cr.point=D}};function Lr(){var t,e,r,n,i;function a(t,e){e=e*Ct/2+At/4;var a=(t*=Ct)-r,o=a>=0?1:-1,s=o*a,l=Math.cos(e),c=Math.sin(e),u=i*c,h=n*l+u*Math.cos(s),f=u*o*Math.sin(s);Er.add(Math.atan2(f,h)),r=t,n=l,i=c}Cr.point=function(o,s){Cr.point=a,r=(t=o)*Ct,n=Math.cos(s=(e=s)*Ct/2+At/4),i=Math.sin(s)},Cr.lineEnd=function(){a(t,e)}}function zr(t){var e=t[0],r=t[1],n=Math.cos(r);return[n*Math.cos(e),n*Math.sin(e),Math.sin(r)]}function Pr(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}function Ir(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}function Or(t,e){t[0]+=e[0],t[1]+=e[1],t[2]+=e[2]}function Dr(t,e){return[t[0]*e,t[1]*e,t[2]*e]}function Rr(t){var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]+t[2]*t[2]);t[0]/=e,t[1]/=e,t[2]/=e}function Br(t){return[Math.atan2(t[1],t[0]),Ot(t[2])]}function Fr(t,e){return y(t[0]-e[0])<kt&&y(t[1]-e[1])<kt}t.geo.bounds=function(){var e,r,n,i,a,o,s,l,c,u,h,f={point:p,lineStart:g,lineEnd:m,polygonStart:function(){f.point=v,f.lineStart=x,f.lineEnd=b,c=0,Cr.polygonStart()},polygonEnd:function(){Cr.polygonEnd(),f.point=p,f.lineStart=g,f.lineEnd=m,Er<0?(e=-(n=180),r=-(i=90)):c>kt?i=90:c<-kt&&(r=-90),h[0]=e,h[1]=n}};function p(t,a){u.push(h=[e=t,n=t]),a<r&&(r=a),a>i&&(i=a)}function d(t,o){var s=zr([t*Ct,o*Ct]);if(l){var c=Ir(l,s),u=Ir([c[1],-c[0],0],c);Rr(u),u=Br(u);var h=t-a,f=h>0?1:-1,d=u[0]*Lt*f,g=y(h)>180;if(g^(f*a<d&&d<f*t))(m=u[1]*Lt)>i&&(i=m);else if(g^(f*a<(d=(d+360)%360-180)&&d<f*t)){var m;(m=-u[1]*Lt)<r&&(r=m)}else o<r&&(r=o),o>i&&(i=o);g?t<a?_(e,t)>_(e,n)&&(n=t):_(t,n)>_(e,n)&&(e=t):n>=e?(t<e&&(e=t),t>n&&(n=t)):t>a?_(e,t)>_(e,n)&&(n=t):_(t,n)>_(e,n)&&(e=t)}else p(t,o);l=s,a=t}function g(){f.point=d}function m(){h[0]=e,h[1]=n,f.point=p,l=null}function v(t,e){if(l){var r=t-a;c+=y(r)>180?r+(r>0?360:-360):r}else o=t,s=e;Cr.point(t,e),d(t,e)}function x(){Cr.lineStart()}function b(){v(o,s),Cr.lineEnd(),y(c)>kt&&(e=-(n=180)),h[0]=e,h[1]=n,l=null}function _(t,e){return(e-=t)<0?e+360:e}function w(t,e){return t[0]-e[0]}function k(t,e){return e[0]<=e[1]?e[0]<=t&&t<=e[1]:t<e[0]||e[1]<t}return function(a){if(i=n=-(e=r=1/0),u=[],t.geo.stream(a,f),c=u.length){u.sort(w);for(var o=1,s=[g=u[0]];o<c;++o)k((p=u[o])[0],g)||k(p[1],g)?(_(g[0],p[1])>_(g[0],g[1])&&(g[1]=p[1]),_(p[0],g[1])>_(g[0],g[1])&&(g[0]=p[0])):s.push(g=p);for(var l,c,p,d=-1/0,g=(o=0,s[c=s.length-1]);o<=c;g=p,++o)p=s[o],(l=_(g[1],p[0]))>d&&(d=l,e=p[0],n=g[1])}return u=h=null,e===1/0||r===1/0?[[NaN,NaN],[NaN,NaN]]:[[e,r],[n,i]]}}(),t.geo.centroid=function(e){vr=yr=xr=br=_r=wr=kr=Mr=Ar=Tr=Sr=0,t.geo.stream(e,Nr);var r=Ar,n=Tr,i=Sr,a=r*r+n*n+i*i;return a<Mt&&(r=wr,n=kr,i=Mr,yr<kt&&(r=xr,n=br,i=_r),(a=r*r+n*n+i*i)<Mt)?[NaN,NaN]:[Math.atan2(n,r)*Lt,Ot(i/Math.sqrt(a))*Lt]};var Nr={sphere:D,point:jr,lineStart:Ur,lineEnd:qr,polygonStart:function(){Nr.lineStart=Hr},polygonEnd:function(){Nr.lineStart=Ur}};function jr(t,e){t*=Ct;var r=Math.cos(e*=Ct);Vr(r*Math.cos(t),r*Math.sin(t),Math.sin(e))}function Vr(t,e,r){xr+=(t-xr)/++vr,br+=(e-br)/vr,_r+=(r-_r)/vr}function Ur(){var t,e,r;function n(n,i){n*=Ct;var a=Math.cos(i*=Ct),o=a*Math.cos(n),s=a*Math.sin(n),l=Math.sin(i),c=Math.atan2(Math.sqrt((c=e*l-r*s)*c+(c=r*o-t*l)*c+(c=t*s-e*o)*c),t*o+e*s+r*l);yr+=c,wr+=c*(t+(t=o)),kr+=c*(e+(e=s)),Mr+=c*(r+(r=l)),Vr(t,e,r)}Nr.point=function(i,a){i*=Ct;var o=Math.cos(a*=Ct);t=o*Math.cos(i),e=o*Math.sin(i),r=Math.sin(a),Nr.point=n,Vr(t,e,r)}}function qr(){Nr.point=jr}function Hr(){var t,e,r,n,i;function a(t,e){t*=Ct;var a=Math.cos(e*=Ct),o=a*Math.cos(t),s=a*Math.sin(t),l=Math.sin(e),c=n*l-i*s,u=i*o-r*l,h=r*s-n*o,f=Math.sqrt(c*c+u*u+h*h),p=r*o+n*s+i*l,d=f&&-It(p)/f,g=Math.atan2(f,p);Ar+=d*c,Tr+=d*u,Sr+=d*h,yr+=g,wr+=g*(r+(r=o)),kr+=g*(n+(n=s)),Mr+=g*(i+(i=l)),Vr(r,n,i)}Nr.point=function(o,s){t=o,e=s,Nr.point=a,o*=Ct;var l=Math.cos(s*=Ct);r=l*Math.cos(o),n=l*Math.sin(o),i=Math.sin(s),Vr(r,n,i)},Nr.lineEnd=function(){a(t,e),Nr.lineEnd=qr,Nr.point=jr}}function Gr(t,e){function r(r,n){return r=t(r,n),e(r[0],r[1])}return t.invert&&e.invert&&(r.invert=function(r,n){return(r=e.invert(r,n))&&t.invert(r[0],r[1])}),r}function Wr(){return!0}function Yr(t,e,r,n,i){var a=[],o=[];if(t.forEach(function(t){if(!((e=t.length-1)<=0)){var e,r=t[0],n=t[e];if(Fr(r,n)){i.lineStart();for(var s=0;s<e;++s)i.point((r=t[s])[0],r[1]);i.lineEnd()}else{var l=new Zr(r,t,null,!0),c=new Zr(r,null,l,!1);l.o=c,a.push(l),o.push(c),l=new Zr(n,t,null,!1),c=new Zr(n,null,l,!0),l.o=c,a.push(l),o.push(c)}}}),o.sort(e),Xr(a),Xr(o),a.length){for(var s=0,l=r,c=o.length;s<c;++s)o[s].e=l=!l;for(var u,h,f=a[0];;){for(var p=f,d=!0;p.v;)if((p=p.n)===f)return;u=p.z,i.lineStart();do{if(p.v=p.o.v=!0,p.e){if(d)for(s=0,c=u.length;s<c;++s)i.point((h=u[s])[0],h[1]);else n(p.x,p.n.x,1,i);p=p.n}else{if(d)for(s=(u=p.p.z).length-1;s>=0;--s)i.point((h=u[s])[0],h[1]);else n(p.x,p.p.x,-1,i);p=p.p}u=(p=p.o).z,d=!d}while(!p.v);i.lineEnd()}}}function Xr(t){if(e=t.length){for(var e,r,n=0,i=t[0];++n<e;)i.n=r=t[n],r.p=i,i=r;i.n=r=t[0],r.p=i}}function Zr(t,e,r,n){this.x=t,this.z=e,this.o=r,this.e=n,this.v=!1,this.n=this.p=null}function $r(e,r,n,i){return function(a,o){var s,l=r(o),c=a.invert(i[0],i[1]),u={point:h,lineStart:p,lineEnd:d,polygonStart:function(){u.point=b,u.lineStart=_,u.lineEnd=w,s=[],g=[]},polygonEnd:function(){u.point=h,u.lineStart=p,u.lineEnd=d,s=t.merge(s);var e=function(t,e){var r=t[0],n=t[1],i=[Math.sin(r),-Math.cos(r),0],a=0,o=0;Er.reset();for(var s=0,l=e.length;s<l;++s){var c=e[s],u=c.length;if(u)for(var h=c[0],f=h[0],p=h[1]/2+At/4,d=Math.sin(p),g=Math.cos(p),m=1;;){m===u&&(m=0);var v=(t=c[m])[0],y=t[1]/2+At/4,x=Math.sin(y),b=Math.cos(y),_=v-f,w=_>=0?1:-1,k=w*_,M=k>At,A=d*x;if(Er.add(Math.atan2(A*w*Math.sin(k),g*b+A*Math.cos(k))),a+=M?_+w*Tt:_,M^f>=r^v>=r){var T=Ir(zr(h),zr(t));Rr(T);var S=Ir(i,T);Rr(S);var E=(M^_>=0?-1:1)*Ot(S[2]);(n>E||n===E&&(T[0]||T[1]))&&(o+=M^_>=0?1:-1)}if(!m++)break;f=v,d=x,g=b,h=t}}return(a<-kt||a<kt&&Er<-kt)^1&o}(c,g);s.length?(x||(o.polygonStart(),x=!0),Yr(s,Qr,e,n,o)):e&&(x||(o.polygonStart(),x=!0),o.lineStart(),n(null,null,1,o),o.lineEnd()),x&&(o.polygonEnd(),x=!1),s=g=null},sphere:function(){o.polygonStart(),o.lineStart(),n(null,null,1,o),o.lineEnd(),o.polygonEnd()}};function h(t,r){var n=a(t,r);e(t=n[0],r=n[1])&&o.point(t,r)}function f(t,e){var r=a(t,e);l.point(r[0],r[1])}function p(){u.point=f,l.lineStart()}function d(){u.point=h,l.lineEnd()}var g,m,v=Kr(),y=r(v),x=!1;function b(t,e){m.push([t,e]);var r=a(t,e);y.point(r[0],r[1])}function _(){y.lineStart(),m=[]}function w(){b(m[0][0],m[0][1]),y.lineEnd();var t,e=y.clean(),r=v.buffer(),n=r.length;if(m.pop(),g.push(m),m=null,n)if(1&e){var i,a=-1;if((n=(t=r[0]).length-1)>0){for(x||(o.polygonStart(),x=!0),o.lineStart();++a<n;)o.point((i=t[a])[0],i[1]);o.lineEnd()}}else n>1&&2&e&&r.push(r.pop().concat(r.shift())),s.push(r.filter(Jr))}return u}}function Jr(t){return t.length>1}function Kr(){var t,e=[];return{lineStart:function(){e.push(t=[])},point:function(e,r){t.push([e,r])},lineEnd:D,buffer:function(){var r=e;return e=[],t=null,r},rejoin:function(){e.length>1&&e.push(e.pop().concat(e.shift()))}}}function Qr(t,e){return((t=t.x)[0]<0?t[1]-Et-kt:Et-t[1])-((e=e.x)[0]<0?e[1]-Et-kt:Et-e[1])}var tn=$r(Wr,function(t){var e,r=NaN,n=NaN,i=NaN;return{lineStart:function(){t.lineStart(),e=1},point:function(a,o){var s=a>0?At:-At,l=y(a-r);y(l-At)<kt?(t.point(r,n=(n+o)/2>0?Et:-Et),t.point(i,n),t.lineEnd(),t.lineStart(),t.point(s,n),t.point(a,n),e=0):i!==s&&l>=At&&(y(r-i)<kt&&(r-=i*kt),y(a-s)<kt&&(a-=s*kt),n=function(t,e,r,n){var i,a,o=Math.sin(t-r);return y(o)>kt?Math.atan((Math.sin(e)*(a=Math.cos(n))*Math.sin(r)-Math.sin(n)*(i=Math.cos(e))*Math.sin(t))/(i*a*o)):(e+n)/2}(r,n,a,o),t.point(i,n),t.lineEnd(),t.lineStart(),t.point(s,n),e=0),t.point(r=a,n=o),i=s},lineEnd:function(){t.lineEnd(),r=n=NaN},clean:function(){return 2-e}}},function(t,e,r,n){var i;if(null==t)i=r*Et,n.point(-At,i),n.point(0,i),n.point(At,i),n.point(At,0),n.point(At,-i),n.point(0,-i),n.point(-At,-i),n.point(-At,0),n.point(-At,i);else if(y(t[0]-e[0])>kt){var a=t[0]<e[0]?At:-At;i=r*a/2,n.point(-a,i),n.point(0,i),n.point(a,i)}else n.point(e[0],e[1])},[-At,-At/2]);function en(t,e,r,n){return function(i){var a,o=i.a,s=i.b,l=o.x,c=o.y,u=0,h=1,f=s.x-l,p=s.y-c;if(a=t-l,f||!(a>0)){if(a/=f,f<0){if(a<u)return;a<h&&(h=a)}else if(f>0){if(a>h)return;a>u&&(u=a)}if(a=r-l,f||!(a<0)){if(a/=f,f<0){if(a>h)return;a>u&&(u=a)}else if(f>0){if(a<u)return;a<h&&(h=a)}if(a=e-c,p||!(a>0)){if(a/=p,p<0){if(a<u)return;a<h&&(h=a)}else if(p>0){if(a>h)return;a>u&&(u=a)}if(a=n-c,p||!(a<0)){if(a/=p,p<0){if(a>h)return;a>u&&(u=a)}else if(p>0){if(a<u)return;a<h&&(h=a)}return u>0&&(i.a={x:l+u*f,y:c+u*p}),h<1&&(i.b={x:l+h*f,y:c+h*p}),i}}}}}}var rn=1e9;function nn(e,r,n,i){return function(l){var c,u,h,f,p,d,g,m,v,y,x,b=l,_=Kr(),w=en(e,r,n,i),k={point:T,lineStart:function(){k.point=S,u&&u.push(h=[]);y=!0,v=!1,g=m=NaN},lineEnd:function(){c&&(S(f,p),d&&v&&_.rejoin(),c.push(_.buffer()));k.point=T,v&&l.lineEnd()},polygonStart:function(){l=_,c=[],u=[],x=!0},polygonEnd:function(){l=b,c=t.merge(c);var r=function(t){for(var e=0,r=u.length,n=t[1],i=0;i<r;++i)for(var a,o=1,s=u[i],l=s.length,c=s[0];o<l;++o)a=s[o],c[1]<=n?a[1]>n&&Pt(c,a,t)>0&&++e:a[1]<=n&&Pt(c,a,t)<0&&--e,c=a;return 0!==e}([e,i]),n=x&&r,a=c.length;(n||a)&&(l.polygonStart(),n&&(l.lineStart(),M(null,null,1,l),l.lineEnd()),a&&Yr(c,o,r,M,l),l.polygonEnd()),c=u=h=null}};function M(t,o,l,c){var u=0,h=0;if(null==t||(u=a(t,l))!==(h=a(o,l))||s(t,o)<0^l>0)do{c.point(0===u||3===u?e:n,u>1?i:r)}while((u=(u+l+4)%4)!==h);else c.point(o[0],o[1])}function A(t,a){return e<=t&&t<=n&&r<=a&&a<=i}function T(t,e){A(t,e)&&l.point(t,e)}function S(t,e){var r=A(t=Math.max(-rn,Math.min(rn,t)),e=Math.max(-rn,Math.min(rn,e)));if(u&&h.push([t,e]),y)f=t,p=e,d=r,y=!1,r&&(l.lineStart(),l.point(t,e));else if(r&&v)l.point(t,e);else{var n={a:{x:g,y:m},b:{x:t,y:e}};w(n)?(v||(l.lineStart(),l.point(n.a.x,n.a.y)),l.point(n.b.x,n.b.y),r||l.lineEnd(),x=!1):r&&(l.lineStart(),l.point(t,e),x=!1)}g=t,m=e,v=r}return k};function a(t,i){return y(t[0]-e)<kt?i>0?0:3:y(t[0]-n)<kt?i>0?2:1:y(t[1]-r)<kt?i>0?1:0:i>0?3:2}function o(t,e){return s(t.x,e.x)}function s(t,e){var r=a(t,1),n=a(e,1);return r!==n?r-n:0===r?e[1]-t[1]:1===r?t[0]-e[0]:2===r?t[1]-e[1]:e[0]-t[0]}}function an(t){var e=0,r=At/3,n=Cn(t),i=n(e,r);return i.parallels=function(t){return arguments.length?n(e=t[0]*At/180,r=t[1]*At/180):[e/At*180,r/At*180]},i}function on(t,e){var r=Math.sin(t),n=(r+Math.sin(e))/2,i=1+r*(2*n-r),a=Math.sqrt(i)/n;function o(t,e){var r=Math.sqrt(i-2*n*Math.sin(e))/n;return[r*Math.sin(t*=n),a-r*Math.cos(t)]}return o.invert=function(t,e){var r=a-e;return[Math.atan2(t,r)/n,Ot((i-(t*t+r*r)*n*n)/(2*n))]},o}t.geo.clipExtent=function(){var t,e,r,n,i,a,o={stream:function(t){return i&&(i.valid=!1),(i=a(t)).valid=!0,i},extent:function(s){return arguments.length?(a=nn(t=+s[0][0],e=+s[0][1],r=+s[1][0],n=+s[1][1]),i&&(i.valid=!1,i=null),o):[[t,e],[r,n]]}};return o.extent([[0,0],[960,500]])},(t.geo.conicEqualArea=function(){return an(on)}).raw=on,t.geo.albers=function(){return t.geo.conicEqualArea().rotate([96,0]).center([-.6,38.7]).parallels([29.5,45.5]).scale(1070)},t.geo.albersUsa=function(){var e,r,n,i,a=t.geo.albers(),o=t.geo.conicEqualArea().rotate([154,0]).center([-2,58.5]).parallels([55,65]),s=t.geo.conicEqualArea().rotate([157,0]).center([-3,19.9]).parallels([8,18]),l={point:function(t,r){e=[t,r]}};function c(t){var a=t[0],o=t[1];return e=null,r(a,o),e||(n(a,o),e)||i(a,o),e}return c.invert=function(t){var e=a.scale(),r=a.translate(),n=(t[0]-r[0])/e,i=(t[1]-r[1])/e;return(i>=.12&&i<.234&&n>=-.425&&n<-.214?o:i>=.166&&i<.234&&n>=-.214&&n<-.115?s:a).invert(t)},c.stream=function(t){var e=a.stream(t),r=o.stream(t),n=s.stream(t);return{point:function(t,i){e.point(t,i),r.point(t,i),n.point(t,i)},sphere:function(){e.sphere(),r.sphere(),n.sphere()},lineStart:function(){e.lineStart(),r.lineStart(),n.lineStart()},lineEnd:function(){e.lineEnd(),r.lineEnd(),n.lineEnd()},polygonStart:function(){e.polygonStart(),r.polygonStart(),n.polygonStart()},polygonEnd:function(){e.polygonEnd(),r.polygonEnd(),n.polygonEnd()}}},c.precision=function(t){return arguments.length?(a.precision(t),o.precision(t),s.precision(t),c):a.precision()},c.scale=function(t){return arguments.length?(a.scale(t),o.scale(.35*t),s.scale(t),c.translate(a.translate())):a.scale()},c.translate=function(t){if(!arguments.length)return a.translate();var e=a.scale(),u=+t[0],h=+t[1];return r=a.translate(t).clipExtent([[u-.455*e,h-.238*e],[u+.455*e,h+.238*e]]).stream(l).point,n=o.translate([u-.307*e,h+.201*e]).clipExtent([[u-.425*e+kt,h+.12*e+kt],[u-.214*e-kt,h+.234*e-kt]]).stream(l).point,i=s.translate([u-.205*e,h+.212*e]).clipExtent([[u-.214*e+kt,h+.166*e+kt],[u-.115*e-kt,h+.234*e-kt]]).stream(l).point,c},c.scale(1070)};var sn,ln,cn,un,hn,fn,pn={point:D,lineStart:D,lineEnd:D,polygonStart:function(){ln=0,pn.lineStart=dn},polygonEnd:function(){pn.lineStart=pn.lineEnd=pn.point=D,sn+=y(ln/2)}};function dn(){var t,e,r,n;function i(t,e){ln+=n*t-r*e,r=t,n=e}pn.point=function(a,o){pn.point=i,t=r=a,e=n=o},pn.lineEnd=function(){i(t,e)}}var gn={point:function(t,e){t<cn&&(cn=t);t>hn&&(hn=t);e<un&&(un=e);e>fn&&(fn=e)},lineStart:D,lineEnd:D,polygonStart:D,polygonEnd:D};function mn(){var t=vn(4.5),e=[],r={point:n,lineStart:function(){r.point=i},lineEnd:o,polygonStart:function(){r.lineEnd=s},polygonEnd:function(){r.lineEnd=o,r.point=n},pointRadius:function(e){return t=vn(e),r},result:function(){if(e.length){var t=e.join("");return e=[],t}}};function n(r,n){e.push("M",r,",",n,t)}function i(t,n){e.push("M",t,",",n),r.point=a}function a(t,r){e.push("L",t,",",r)}function o(){r.point=n}function s(){e.push("Z")}return r}function vn(t){return"m0,"+t+"a"+t+","+t+" 0 1,1 0,"+-2*t+"a"+t+","+t+" 0 1,1 0,"+2*t+"z"}var yn,xn={point:bn,lineStart:_n,lineEnd:wn,polygonStart:function(){xn.lineStart=kn},polygonEnd:function(){xn.point=bn,xn.lineStart=_n,xn.lineEnd=wn}};function bn(t,e){xr+=t,br+=e,++_r}function _n(){var t,e;function r(r,n){var i=r-t,a=n-e,o=Math.sqrt(i*i+a*a);wr+=o*(t+r)/2,kr+=o*(e+n)/2,Mr+=o,bn(t=r,e=n)}xn.point=function(n,i){xn.point=r,bn(t=n,e=i)}}function wn(){xn.point=bn}function kn(){var t,e,r,n;function i(t,e){var i=t-r,a=e-n,o=Math.sqrt(i*i+a*a);wr+=o*(r+t)/2,kr+=o*(n+e)/2,Mr+=o,Ar+=(o=n*t-r*e)*(r+t),Tr+=o*(n+e),Sr+=3*o,bn(r=t,n=e)}xn.point=function(a,o){xn.point=i,bn(t=r=a,e=n=o)},xn.lineEnd=function(){i(t,e)}}function Mn(t){var e=4.5,r={point:n,lineStart:function(){r.point=i},lineEnd:o,polygonStart:function(){r.lineEnd=s},polygonEnd:function(){r.lineEnd=o,r.point=n},pointRadius:function(t){return e=t,r},result:D};function n(r,n){t.moveTo(r+e,n),t.arc(r,n,e,0,Tt)}function i(e,n){t.moveTo(e,n),r.point=a}function a(e,r){t.lineTo(e,r)}function o(){r.point=n}function s(){t.closePath()}return r}function An(t){var e=.5,r=Math.cos(30*Ct),n=16;function i(e){return(n?function(e){var r,i,o,s,l,c,u,h,f,p,d,g,m={point:v,lineStart:y,lineEnd:b,polygonStart:function(){e.polygonStart(),m.lineStart=_},polygonEnd:function(){e.polygonEnd(),m.lineStart=y}};function v(r,n){r=t(r,n),e.point(r[0],r[1])}function y(){h=NaN,m.point=x,e.lineStart()}function x(r,i){var o=zr([r,i]),s=t(r,i);a(h,f,u,p,d,g,h=s[0],f=s[1],u=r,p=o[0],d=o[1],g=o[2],n,e),e.point(h,f)}function b(){m.point=v,e.lineEnd()}function _(){y(),m.point=w,m.lineEnd=k}function w(t,e){x(r=t,e),i=h,o=f,s=p,l=d,c=g,m.point=x}function k(){a(h,f,u,p,d,g,i,o,r,s,l,c,n,e),m.lineEnd=b,b()}return m}:function(e){return Sn(e,function(r,n){r=t(r,n),e.point(r[0],r[1])})})(e)}function a(n,i,o,s,l,c,u,h,f,p,d,g,m,v){var x=u-n,b=h-i,_=x*x+b*b;if(_>4*e&&m--){var w=s+p,k=l+d,M=c+g,A=Math.sqrt(w*w+k*k+M*M),T=Math.asin(M/=A),S=y(y(M)-1)<kt||y(o-f)<kt?(o+f)/2:Math.atan2(k,w),E=t(S,T),C=E[0],L=E[1],z=C-n,P=L-i,I=b*z-x*P;(I*I/_>e||y((x*z+b*P)/_-.5)>.3||s*p+l*d+c*g<r)&&(a(n,i,o,s,l,c,C,L,S,w/=A,k/=A,M,m,v),v.point(C,L),a(C,L,S,w,k,M,u,h,f,p,d,g,m,v))}}return i.precision=function(t){return arguments.length?(n=(e=t*t)>0&&16,i):Math.sqrt(e)},i}function Tn(t){this.stream=t}function Sn(t,e){return{point:e,sphere:function(){t.sphere()},lineStart:function(){t.lineStart()},lineEnd:function(){t.lineEnd()},polygonStart:function(){t.polygonStart()},polygonEnd:function(){t.polygonEnd()}}}function En(t){return Cn(function(){return t})()}function Cn(e){var r,n,i,a,o,s,l=An(function(t,e){return[(t=r(t,e))[0]*c+a,o-t[1]*c]}),c=150,u=480,h=250,f=0,p=0,d=0,g=0,m=0,v=tn,x=z,b=null,_=null;function w(t){return[(t=i(t[0]*Ct,t[1]*Ct))[0]*c+a,o-t[1]*c]}function k(t){return(t=i.invert((t[0]-a)/c,(o-t[1])/c))&&[t[0]*Lt,t[1]*Lt]}function M(){i=Gr(n=In(d,g,m),r);var t=r(f,p);return a=u-t[0]*c,o=h+t[1]*c,A()}function A(){return s&&(s.valid=!1,s=null),w}return w.stream=function(t){return s&&(s.valid=!1),(s=Ln(v(n,l(x(t))))).valid=!0,s},w.clipAngle=function(t){return arguments.length?(v=null==t?(b=t,tn):function(t){var e=Math.cos(t),r=e>0,n=y(e)>kt;return $r(i,function(t){var e,s,l,c,u;return{lineStart:function(){c=l=!1,u=1},point:function(h,f){var p,d=[h,f],g=i(h,f),m=r?g?0:o(h,f):g?o(h+(h<0?At:-At),f):0;if(!e&&(c=l=g)&&t.lineStart(),g!==l&&(p=a(e,d),(Fr(e,p)||Fr(d,p))&&(d[0]+=kt,d[1]+=kt,g=i(d[0],d[1]))),g!==l)u=0,g?(t.lineStart(),p=a(d,e),t.point(p[0],p[1])):(p=a(e,d),t.point(p[0],p[1]),t.lineEnd()),e=p;else if(n&&e&&r^g){var v;m&s||!(v=a(d,e,!0))||(u=0,r?(t.lineStart(),t.point(v[0][0],v[0][1]),t.point(v[1][0],v[1][1]),t.lineEnd()):(t.point(v[1][0],v[1][1]),t.lineEnd(),t.lineStart(),t.point(v[0][0],v[0][1])))}!g||e&&Fr(e,d)||t.point(d[0],d[1]),e=d,l=g,s=m},lineEnd:function(){l&&t.lineEnd(),e=null},clean:function(){return u|(c&&l)<<1}}},Bn(t,6*Ct),r?[0,-t]:[-At,t-At]);function i(t,r){return Math.cos(t)*Math.cos(r)>e}function a(t,r,n){var i=[1,0,0],a=Ir(zr(t),zr(r)),o=Pr(a,a),s=a[0],l=o-s*s;if(!l)return!n&&t;var c=e*o/l,u=-e*s/l,h=Ir(i,a),f=Dr(i,c);Or(f,Dr(a,u));var p=h,d=Pr(f,p),g=Pr(p,p),m=d*d-g*(Pr(f,f)-1);if(!(m<0)){var v=Math.sqrt(m),x=Dr(p,(-d-v)/g);if(Or(x,f),x=Br(x),!n)return x;var b,_=t[0],w=r[0],k=t[1],M=r[1];w<_&&(b=_,_=w,w=b);var A=w-_,T=y(A-At)<kt;if(!T&&M<k&&(b=k,k=M,M=b),T||A<kt?T?k+M>0^x[1]<(y(x[0]-_)<kt?k:M):k<=x[1]&&x[1]<=M:A>At^(_<=x[0]&&x[0]<=w)){var S=Dr(p,(-d+v)/g);return Or(S,f),[x,Br(S)]}}}function o(e,n){var i=r?t:At-t,a=0;return e<-i?a|=1:e>i&&(a|=2),n<-i?a|=4:n>i&&(a|=8),a}}((b=+t)*Ct),A()):b},w.clipExtent=function(t){return arguments.length?(_=t,x=t?nn(t[0][0],t[0][1],t[1][0],t[1][1]):z,A()):_},w.scale=function(t){return arguments.length?(c=+t,M()):c},w.translate=function(t){return arguments.length?(u=+t[0],h=+t[1],M()):[u,h]},w.center=function(t){return arguments.length?(f=t[0]%360*Ct,p=t[1]%360*Ct,M()):[f*Lt,p*Lt]},w.rotate=function(t){return arguments.length?(d=t[0]%360*Ct,g=t[1]%360*Ct,m=t.length>2?t[2]%360*Ct:0,M()):[d*Lt,g*Lt,m*Lt]},t.rebind(w,l,"precision"),function(){return r=e.apply(this,arguments),w.invert=r.invert&&k,M()}}function Ln(t){return Sn(t,function(e,r){t.point(e*Ct,r*Ct)})}function zn(t,e){return[t,e]}function Pn(t,e){return[t>At?t-Tt:t<-At?t+Tt:t,e]}function In(t,e,r){return t?e||r?Gr(Dn(t),Rn(e,r)):Dn(t):e||r?Rn(e,r):Pn}function On(t){return function(e,r){return[(e+=t)>At?e-Tt:e<-At?e+Tt:e,r]}}function Dn(t){var e=On(t);return e.invert=On(-t),e}function Rn(t,e){var r=Math.cos(t),n=Math.sin(t),i=Math.cos(e),a=Math.sin(e);function o(t,e){var o=Math.cos(e),s=Math.cos(t)*o,l=Math.sin(t)*o,c=Math.sin(e),u=c*r+s*n;return[Math.atan2(l*i-u*a,s*r-c*n),Ot(u*i+l*a)]}return o.invert=function(t,e){var o=Math.cos(e),s=Math.cos(t)*o,l=Math.sin(t)*o,c=Math.sin(e),u=c*i-l*a;return[Math.atan2(l*i+c*a,s*r+u*n),Ot(u*r-s*n)]},o}function Bn(t,e){var r=Math.cos(t),n=Math.sin(t);return function(i,a,o,s){var l=o*e;null!=i?(i=Fn(r,i),a=Fn(r,a),(o>0?i<a:i>a)&&(i+=o*Tt)):(i=t+o*Tt,a=t-.5*l);for(var c,u=i;o>0?u>a:u<a;u-=l)s.point((c=Br([r,-n*Math.cos(u),-n*Math.sin(u)]))[0],c[1])}}function Fn(t,e){var r=zr(e);r[0]-=t,Rr(r);var n=It(-r[1]);return((-r[2]<0?-n:n)+2*Math.PI-kt)%(2*Math.PI)}function Nn(e,r,n){var i=t.range(e,r-kt,n).concat(r);return function(t){return i.map(function(e){return[t,e]})}}function jn(e,r,n){var i=t.range(e,r-kt,n).concat(r);return function(t){return i.map(function(e){return[e,t]})}}function Vn(t){return t.source}function Un(t){return t.target}t.geo.path=function(){var e,r,n,i,a,o=4.5;function s(e){return e&&("function"==typeof o&&i.pointRadius(+o.apply(this,arguments)),a&&a.valid||(a=n(i)),t.geo.stream(e,a)),i.result()}function l(){return a=null,s}return s.area=function(e){return sn=0,t.geo.stream(e,n(pn)),sn},s.centroid=function(e){return xr=br=_r=wr=kr=Mr=Ar=Tr=Sr=0,t.geo.stream(e,n(xn)),Sr?[Ar/Sr,Tr/Sr]:Mr?[wr/Mr,kr/Mr]:_r?[xr/_r,br/_r]:[NaN,NaN]},s.bounds=function(e){return hn=fn=-(cn=un=1/0),t.geo.stream(e,n(gn)),[[cn,un],[hn,fn]]},s.projection=function(t){return arguments.length?(n=(e=t)?t.stream||(r=t,i=An(function(t,e){return r([t*Lt,e*Lt])}),function(t){return Ln(i(t))}):z,l()):e;var r,i},s.context=function(t){return arguments.length?(i=null==(r=t)?new mn:new Mn(t),"function"!=typeof o&&i.pointRadius(o),l()):r},s.pointRadius=function(t){return arguments.length?(o="function"==typeof t?t:(i.pointRadius(+t),+t),s):o},s.projection(t.geo.albersUsa()).context(null)},t.geo.transform=function(t){return{stream:function(e){var r=new Tn(e);for(var n in t)r[n]=t[n];return r}}},Tn.prototype={point:function(t,e){this.stream.point(t,e)},sphere:function(){this.stream.sphere()},lineStart:function(){this.stream.lineStart()},lineEnd:function(){this.stream.lineEnd()},polygonStart:function(){this.stream.polygonStart()},polygonEnd:function(){this.stream.polygonEnd()}},t.geo.projection=En,t.geo.projectionMutator=Cn,(t.geo.equirectangular=function(){return En(zn)}).raw=zn.invert=zn,t.geo.rotation=function(t){function e(e){return(e=t(e[0]*Ct,e[1]*Ct))[0]*=Lt,e[1]*=Lt,e}return t=In(t[0]%360*Ct,t[1]*Ct,t.length>2?t[2]*Ct:0),e.invert=function(e){return(e=t.invert(e[0]*Ct,e[1]*Ct))[0]*=Lt,e[1]*=Lt,e},e},Pn.invert=zn,t.geo.circle=function(){var t,e,r=[0,0],n=6;function i(){var t="function"==typeof r?r.apply(this,arguments):r,n=In(-t[0]*Ct,-t[1]*Ct,0).invert,i=[];return e(null,null,1,{point:function(t,e){i.push(t=n(t,e)),t[0]*=Lt,t[1]*=Lt}}),{type:"Polygon",coordinates:[i]}}return i.origin=function(t){return arguments.length?(r=t,i):r},i.angle=function(r){return arguments.length?(e=Bn((t=+r)*Ct,n*Ct),i):t},i.precision=function(r){return arguments.length?(e=Bn(t*Ct,(n=+r)*Ct),i):n},i.angle(90)},t.geo.distance=function(t,e){var r,n=(e[0]-t[0])*Ct,i=t[1]*Ct,a=e[1]*Ct,o=Math.sin(n),s=Math.cos(n),l=Math.sin(i),c=Math.cos(i),u=Math.sin(a),h=Math.cos(a);return Math.atan2(Math.sqrt((r=h*o)*r+(r=c*u-l*h*s)*r),l*u+c*h*s)},t.geo.graticule=function(){var e,r,n,i,a,o,s,l,c,u,h,f,p=10,d=p,g=90,m=360,v=2.5;function x(){return{type:"MultiLineString",coordinates:b()}}function b(){return t.range(Math.ceil(i/g)*g,n,g).map(h).concat(t.range(Math.ceil(l/m)*m,s,m).map(f)).concat(t.range(Math.ceil(r/p)*p,e,p).filter(function(t){return y(t%g)>kt}).map(c)).concat(t.range(Math.ceil(o/d)*d,a,d).filter(function(t){return y(t%m)>kt}).map(u))}return x.lines=function(){return b().map(function(t){return{type:"LineString",coordinates:t}})},x.outline=function(){return{type:"Polygon",coordinates:[h(i).concat(f(s).slice(1),h(n).reverse().slice(1),f(l).reverse().slice(1))]}},x.extent=function(t){return arguments.length?x.majorExtent(t).minorExtent(t):x.minorExtent()},x.majorExtent=function(t){return arguments.length?(i=+t[0][0],n=+t[1][0],l=+t[0][1],s=+t[1][1],i>n&&(t=i,i=n,n=t),l>s&&(t=l,l=s,s=t),x.precision(v)):[[i,l],[n,s]]},x.minorExtent=function(t){return arguments.length?(r=+t[0][0],e=+t[1][0],o=+t[0][1],a=+t[1][1],r>e&&(t=r,r=e,e=t),o>a&&(t=o,o=a,a=t),x.precision(v)):[[r,o],[e,a]]},x.step=function(t){return arguments.length?x.majorStep(t).minorStep(t):x.minorStep()},x.majorStep=function(t){return arguments.length?(g=+t[0],m=+t[1],x):[g,m]},x.minorStep=function(t){return arguments.length?(p=+t[0],d=+t[1],x):[p,d]},x.precision=function(t){return arguments.length?(v=+t,c=Nn(o,a,90),u=jn(r,e,v),h=Nn(l,s,90),f=jn(i,n,v),x):v},x.majorExtent([[-180,-90+kt],[180,90-kt]]).minorExtent([[-180,-80-kt],[180,80+kt]])},t.geo.greatArc=function(){var e,r,n=Vn,i=Un;function a(){return{type:"LineString",coordinates:[e||n.apply(this,arguments),r||i.apply(this,arguments)]}}return a.distance=function(){return t.geo.distance(e||n.apply(this,arguments),r||i.apply(this,arguments))},a.source=function(t){return arguments.length?(n=t,e="function"==typeof t?null:t,a):n},a.target=function(t){return arguments.length?(i=t,r="function"==typeof t?null:t,a):i},a.precision=function(){return arguments.length?a:0},a},t.geo.interpolate=function(t,e){return r=t[0]*Ct,n=t[1]*Ct,i=e[0]*Ct,a=e[1]*Ct,o=Math.cos(n),s=Math.sin(n),l=Math.cos(a),c=Math.sin(a),u=o*Math.cos(r),h=o*Math.sin(r),f=l*Math.cos(i),p=l*Math.sin(i),d=2*Math.asin(Math.sqrt(Rt(a-n)+o*l*Rt(i-r))),g=1/Math.sin(d),(m=d?function(t){var e=Math.sin(t*=d)*g,r=Math.sin(d-t)*g,n=r*u+e*f,i=r*h+e*p,a=r*s+e*c;return[Math.atan2(i,n)*Lt,Math.atan2(a,Math.sqrt(n*n+i*i))*Lt]}:function(){return[r*Lt,n*Lt]}).distance=d,m;var r,n,i,a,o,s,l,c,u,h,f,p,d,g,m},t.geo.length=function(e){return yn=0,t.geo.stream(e,qn),yn};var qn={sphere:D,point:D,lineStart:function(){var t,e,r;function n(n,i){var a=Math.sin(i*=Ct),o=Math.cos(i),s=y((n*=Ct)-t),l=Math.cos(s);yn+=Math.atan2(Math.sqrt((s=o*Math.sin(s))*s+(s=r*a-e*o*l)*s),e*a+r*o*l),t=n,e=a,r=o}qn.point=function(i,a){t=i*Ct,e=Math.sin(a*=Ct),r=Math.cos(a),qn.point=n},qn.lineEnd=function(){qn.point=qn.lineEnd=D}},lineEnd:D,polygonStart:D,polygonEnd:D};function Hn(t,e){function r(e,r){var n=Math.cos(e),i=Math.cos(r),a=t(n*i);return[a*i*Math.sin(e),a*Math.sin(r)]}return r.invert=function(t,r){var n=Math.sqrt(t*t+r*r),i=e(n),a=Math.sin(i),o=Math.cos(i);return[Math.atan2(t*a,n*o),Math.asin(n&&r*a/n)]},r}var Gn=Hn(function(t){return Math.sqrt(2/(1+t))},function(t){return 2*Math.asin(t/2)});(t.geo.azimuthalEqualArea=function(){return En(Gn)}).raw=Gn;var Wn=Hn(function(t){var e=Math.acos(t);return e&&e/Math.sin(e)},z);function Yn(t,e){var r=Math.cos(t),n=function(t){return Math.tan(At/4+t/2)},i=t===e?Math.sin(t):Math.log(r/Math.cos(e))/Math.log(n(e)/n(t)),a=r*Math.pow(n(t),i)/i;if(!i)return $n;function o(t,e){a>0?e<-Et+kt&&(e=-Et+kt):e>Et-kt&&(e=Et-kt);var r=a/Math.pow(n(e),i);return[r*Math.sin(i*t),a-r*Math.cos(i*t)]}return o.invert=function(t,e){var r=a-e,n=zt(i)*Math.sqrt(t*t+r*r);return[Math.atan2(t,r)/i,2*Math.atan(Math.pow(a/n,1/i))-Et]},o}function Xn(t,e){var r=Math.cos(t),n=t===e?Math.sin(t):(r-Math.cos(e))/(e-t),i=r/n+t;if(y(n)<kt)return zn;function a(t,e){var r=i-e;return[r*Math.sin(n*t),i-r*Math.cos(n*t)]}return a.invert=function(t,e){var r=i-e;return[Math.atan2(t,r)/n,i-zt(n)*Math.sqrt(t*t+r*r)]},a}(t.geo.azimuthalEquidistant=function(){return En(Wn)}).raw=Wn,(t.geo.conicConformal=function(){return an(Yn)}).raw=Yn,(t.geo.conicEquidistant=function(){return an(Xn)}).raw=Xn;var Zn=Hn(function(t){return 1/t},Math.atan);function $n(t,e){return[t,Math.log(Math.tan(At/4+e/2))]}function Jn(t){var e,r=En(t),n=r.scale,i=r.translate,a=r.clipExtent;return r.scale=function(){var t=n.apply(r,arguments);return t===r?e?r.clipExtent(null):r:t},r.translate=function(){var t=i.apply(r,arguments);return t===r?e?r.clipExtent(null):r:t},r.clipExtent=function(t){var o=a.apply(r,arguments);if(o===r){if(e=null==t){var s=At*n(),l=i();a([[l[0]-s,l[1]-s],[l[0]+s,l[1]+s]])}}else e&&(o=null);return o},r.clipExtent(null)}(t.geo.gnomonic=function(){return En(Zn)}).raw=Zn,$n.invert=function(t,e){return[t,2*Math.atan(Math.exp(e))-Et]},(t.geo.mercator=function(){return Jn($n)}).raw=$n;var Kn=Hn(function(){return 1},Math.asin);(t.geo.orthographic=function(){return En(Kn)}).raw=Kn;var Qn=Hn(function(t){return 1/(1+t)},function(t){return 2*Math.atan(t)});function ti(t,e){return[Math.log(Math.tan(At/4+e/2)),-t]}function ei(t){return t[0]}function ri(t){return t[1]}function ni(t){for(var e=t.length,r=[0,1],n=2,i=2;i<e;i++){for(;n>1&&Pt(t[r[n-2]],t[r[n-1]],t[i])<=0;)--n;r[n++]=i}return r.slice(0,n)}function ii(t,e){return t[0]-e[0]||t[1]-e[1]}(t.geo.stereographic=function(){return En(Qn)}).raw=Qn,ti.invert=function(t,e){return[-e,2*Math.atan(Math.exp(t))-Et]},(t.geo.transverseMercator=function(){var t=Jn(ti),e=t.center,r=t.rotate;return t.center=function(t){return t?e([-t[1],t[0]]):[(t=e())[1],-t[0]]},t.rotate=function(t){return t?r([t[0],t[1],t.length>2?t[2]+90:90]):[(t=r())[0],t[1],t[2]-90]},r([0,0,90])}).raw=ti,t.geom={},t.geom.hull=function(t){var e=ei,r=ri;if(arguments.length)return n(t);function n(t){if(t.length<3)return[];var n,i=me(e),a=me(r),o=t.length,s=[],l=[];for(n=0;n<o;n++)s.push([+i.call(this,t[n],n),+a.call(this,t[n],n),n]);for(s.sort(ii),n=0;n<o;n++)l.push([s[n][0],-s[n][1]]);var c=ni(s),u=ni(l),h=u[0]===c[0],f=u[u.length-1]===c[c.length-1],p=[];for(n=c.length-1;n>=0;--n)p.push(t[s[c[n]][2]]);for(n=+h;n<u.length-f;++n)p.push(t[s[u[n]][2]]);return p}return n.x=function(t){return arguments.length?(e=t,n):e},n.y=function(t){return arguments.length?(r=t,n):r},n},t.geom.polygon=function(t){return U(t,ai),t};var ai=t.geom.polygon.prototype=[];function oi(t,e,r){return(r[0]-e[0])*(t[1]-e[1])<(r[1]-e[1])*(t[0]-e[0])}function si(t,e,r,n){var i=t[0],a=r[0],o=e[0]-i,s=n[0]-a,l=t[1],c=r[1],u=e[1]-l,h=n[1]-c,f=(s*(l-c)-h*(i-a))/(h*o-s*u);return[i+f*o,l+f*u]}function li(t){var e=t[0],r=t[t.length-1];return!(e[0]-r[0]||e[1]-r[1])}ai.area=function(){for(var t,e=-1,r=this.length,n=this[r-1],i=0;++e<r;)t=n,n=this[e],i+=t[1]*n[0]-t[0]*n[1];return.5*i},ai.centroid=function(t){var e,r,n=-1,i=this.length,a=0,o=0,s=this[i-1];for(arguments.length||(t=-1/(6*this.area()));++n<i;)e=s,s=this[n],r=e[0]*s[1]-s[0]*e[1],a+=(e[0]+s[0])*r,o+=(e[1]+s[1])*r;return[a*t,o*t]},ai.clip=function(t){for(var e,r,n,i,a,o,s=li(t),l=-1,c=this.length-li(this),u=this[c-1];++l<c;){for(e=t.slice(),t.length=0,i=this[l],a=e[(n=e.length-s)-1],r=-1;++r<n;)oi(o=e[r],u,i)?(oi(a,u,i)||t.push(si(a,o,u,i)),t.push(o)):oi(a,u,i)&&t.push(si(a,o,u,i)),a=o;s&&t.push(t[0]),u=i}return t};var ci,ui,hi,fi,pi,di=[],gi=[];function mi(){Oi(this),this.edge=this.site=this.circle=null}function vi(t){var e=di.pop()||new mi;return e.site=t,e}function yi(t){Si(t),hi.remove(t),di.push(t),Oi(t)}function xi(t){var e=t.circle,r=e.x,n=e.cy,i={x:r,y:n},a=t.P,o=t.N,s=[t];yi(t);for(var l=a;l.circle&&y(r-l.circle.x)<kt&&y(n-l.circle.cy)<kt;)a=l.P,s.unshift(l),yi(l),l=a;s.unshift(l),Si(l);for(var c=o;c.circle&&y(r-c.circle.x)<kt&&y(n-c.circle.cy)<kt;)o=c.N,s.push(c),yi(c),c=o;s.push(c),Si(c);var u,h=s.length;for(u=1;u<h;++u)c=s[u],l=s[u-1],zi(c.edge,l.site,c.site,i);l=s[0],(c=s[h-1]).edge=Li(l.site,c.site,null,i),Ti(l),Ti(c)}function bi(t){for(var e,r,n,i,a=t.x,o=t.y,s=hi._;s;)if((n=_i(s,o)-a)>kt)s=s.L;else{if(!((i=a-wi(s,o))>kt)){n>-kt?(e=s.P,r=s):i>-kt?(e=s,r=s.N):e=r=s;break}if(!s.R){e=s;break}s=s.R}var l=vi(t);if(hi.insert(e,l),e||r){if(e===r)return Si(e),r=vi(e.site),hi.insert(l,r),l.edge=r.edge=Li(e.site,l.site),Ti(e),void Ti(r);if(r){Si(e),Si(r);var c=e.site,u=c.x,h=c.y,f=t.x-u,p=t.y-h,d=r.site,g=d.x-u,m=d.y-h,v=2*(f*m-p*g),y=f*f+p*p,x=g*g+m*m,b={x:(m*y-p*x)/v+u,y:(f*x-g*y)/v+h};zi(r.edge,c,d,b),l.edge=Li(c,t,null,b),r.edge=Li(t,d,null,b),Ti(e),Ti(r)}else l.edge=Li(e.site,l.site)}}function _i(t,e){var r=t.site,n=r.x,i=r.y,a=i-e;if(!a)return n;var o=t.P;if(!o)return-1/0;var s=(r=o.site).x,l=r.y,c=l-e;if(!c)return s;var u=s-n,h=1/a-1/c,f=u/c;return h?(-f+Math.sqrt(f*f-2*h*(u*u/(-2*c)-l+c/2+i-a/2)))/h+n:(n+s)/2}function wi(t,e){var r=t.N;if(r)return _i(r,e);var n=t.site;return n.y===e?n.x:1/0}function ki(t){this.site=t,this.edges=[]}function Mi(t,e){return e.angle-t.angle}function Ai(){Oi(this),this.x=this.y=this.arc=this.site=this.cy=null}function Ti(t){var e=t.P,r=t.N;if(e&&r){var n=e.site,i=t.site,a=r.site;if(n!==a){var o=i.x,s=i.y,l=n.x-o,c=n.y-s,u=a.x-o,h=2*(l*(m=a.y-s)-c*u);if(!(h>=-Mt)){var f=l*l+c*c,p=u*u+m*m,d=(m*f-c*p)/h,g=(l*p-u*f)/h,m=g+s,v=gi.pop()||new Ai;v.arc=t,v.site=i,v.x=d+o,v.y=m+Math.sqrt(d*d+g*g),v.cy=m,t.circle=v;for(var y=null,x=pi._;x;)if(v.y<x.y||v.y===x.y&&v.x<=x.x){if(!x.L){y=x.P;break}x=x.L}else{if(!x.R){y=x;break}x=x.R}pi.insert(y,v),y||(fi=v)}}}}function Si(t){var e=t.circle;e&&(e.P||(fi=e.N),pi.remove(e),gi.push(e),Oi(e),t.circle=null)}function Ei(t,e){var r=t.b;if(r)return!0;var n,i,a=t.a,o=e[0][0],s=e[1][0],l=e[0][1],c=e[1][1],u=t.l,h=t.r,f=u.x,p=u.y,d=h.x,g=h.y,m=(f+d)/2,v=(p+g)/2;if(g===p){if(m<o||m>=s)return;if(f>d){if(a){if(a.y>=c)return}else a={x:m,y:l};r={x:m,y:c}}else{if(a){if(a.y<l)return}else a={x:m,y:c};r={x:m,y:l}}}else if(i=v-(n=(f-d)/(g-p))*m,n<-1||n>1)if(f>d){if(a){if(a.y>=c)return}else a={x:(l-i)/n,y:l};r={x:(c-i)/n,y:c}}else{if(a){if(a.y<l)return}else a={x:(c-i)/n,y:c};r={x:(l-i)/n,y:l}}else if(p<g){if(a){if(a.x>=s)return}else a={x:o,y:n*o+i};r={x:s,y:n*s+i}}else{if(a){if(a.x<o)return}else a={x:s,y:n*s+i};r={x:o,y:n*o+i}}return t.a=a,t.b=r,!0}function Ci(t,e){this.l=t,this.r=e,this.a=this.b=null}function Li(t,e,r,n){var i=new Ci(t,e);return ci.push(i),r&&zi(i,t,e,r),n&&zi(i,e,t,n),ui[t.i].edges.push(new Pi(i,t,e)),ui[e.i].edges.push(new Pi(i,e,t)),i}function zi(t,e,r,n){t.a||t.b?t.l===r?t.b=n:t.a=n:(t.a=n,t.l=e,t.r=r)}function Pi(t,e,r){var n=t.a,i=t.b;this.edge=t,this.site=e,this.angle=r?Math.atan2(r.y-e.y,r.x-e.x):t.l===e?Math.atan2(i.x-n.x,n.y-i.y):Math.atan2(n.x-i.x,i.y-n.y)}function Ii(){this._=null}function Oi(t){t.U=t.C=t.L=t.R=t.P=t.N=null}function Di(t,e){var r=e,n=e.R,i=r.U;i?i.L===r?i.L=n:i.R=n:t._=n,n.U=i,r.U=n,r.R=n.L,r.R&&(r.R.U=r),n.L=r}function Ri(t,e){var r=e,n=e.L,i=r.U;i?i.L===r?i.L=n:i.R=n:t._=n,n.U=i,r.U=n,r.L=n.R,r.L&&(r.L.U=r),n.R=r}function Bi(t){for(;t.L;)t=t.L;return t}function Fi(t,e){var r,n,i,a=t.sort(Ni).pop();for(ci=[],ui=new Array(t.length),hi=new Ii,pi=new Ii;;)if(i=fi,a&&(!i||a.y<i.y||a.y===i.y&&a.x<i.x))a.x===r&&a.y===n||(ui[a.i]=new ki(a),bi(a),r=a.x,n=a.y),a=t.pop();else{if(!i)break;xi(i.arc)}e&&(function(t){for(var e,r=ci,n=en(t[0][0],t[0][1],t[1][0],t[1][1]),i=r.length;i--;)(!Ei(e=r[i],t)||!n(e)||y(e.a.x-e.b.x)<kt&&y(e.a.y-e.b.y)<kt)&&(e.a=e.b=null,r.splice(i,1))}(e),function(t){for(var e,r,n,i,a,o,s,l,c,u,h=t[0][0],f=t[1][0],p=t[0][1],d=t[1][1],g=ui,m=g.length;m--;)if((a=g[m])&&a.prepare())for(l=(s=a.edges).length,o=0;o<l;)n=(u=s[o].end()).x,i=u.y,e=(c=s[++o%l].start()).x,r=c.y,(y(n-e)>kt||y(i-r)>kt)&&(s.splice(o,0,new Pi((v=a.site,x=u,b=y(n-h)<kt&&d-i>kt?{x:h,y:y(e-h)<kt?r:d}:y(i-d)<kt&&f-n>kt?{x:y(r-d)<kt?e:f,y:d}:y(n-f)<kt&&i-p>kt?{x:f,y:y(e-f)<kt?r:p}:y(i-p)<kt&&n-h>kt?{x:y(r-p)<kt?e:h,y:p}:null,_=void 0,_=new Ci(v,null),_.a=x,_.b=b,ci.push(_),_),a.site,null)),++l);var v,x,b,_}(e));var o={cells:ui,edges:ci};return hi=pi=ci=ui=null,o}function Ni(t,e){return e.y-t.y||e.x-t.x}ki.prototype.prepare=function(){for(var t,e=this.edges,r=e.length;r--;)(t=e[r].edge).b&&t.a||e.splice(r,1);return e.sort(Mi),e.length},Pi.prototype={start:function(){return this.edge.l===this.site?this.edge.a:this.edge.b},end:function(){return this.edge.l===this.site?this.edge.b:this.edge.a}},Ii.prototype={insert:function(t,e){var r,n,i;if(t){if(e.P=t,e.N=t.N,t.N&&(t.N.P=e),t.N=e,t.R){for(t=t.R;t.L;)t=t.L;t.L=e}else t.R=e;r=t}else this._?(t=Bi(this._),e.P=null,e.N=t,t.P=t.L=e,r=t):(e.P=e.N=null,this._=e,r=null);for(e.L=e.R=null,e.U=r,e.C=!0,t=e;r&&r.C;)r===(n=r.U).L?(i=n.R)&&i.C?(r.C=i.C=!1,n.C=!0,t=n):(t===r.R&&(Di(this,r),r=(t=r).U),r.C=!1,n.C=!0,Ri(this,n)):(i=n.L)&&i.C?(r.C=i.C=!1,n.C=!0,t=n):(t===r.L&&(Ri(this,r),r=(t=r).U),r.C=!1,n.C=!0,Di(this,n)),r=t.U;this._.C=!1},remove:function(t){t.N&&(t.N.P=t.P),t.P&&(t.P.N=t.N),t.N=t.P=null;var e,r,n,i=t.U,a=t.L,o=t.R;if(r=a?o?Bi(o):a:o,i?i.L===t?i.L=r:i.R=r:this._=r,a&&o?(n=r.C,r.C=t.C,r.L=a,a.U=r,r!==o?(i=r.U,r.U=t.U,t=r.R,i.L=t,r.R=o,o.U=r):(r.U=i,i=r,t=r.R)):(n=t.C,t=r),t&&(t.U=i),!n)if(t&&t.C)t.C=!1;else{do{if(t===this._)break;if(t===i.L){if((e=i.R).C&&(e.C=!1,i.C=!0,Di(this,i),e=i.R),e.L&&e.L.C||e.R&&e.R.C){e.R&&e.R.C||(e.L.C=!1,e.C=!0,Ri(this,e),e=i.R),e.C=i.C,i.C=e.R.C=!1,Di(this,i),t=this._;break}}else if((e=i.L).C&&(e.C=!1,i.C=!0,Ri(this,i),e=i.L),e.L&&e.L.C||e.R&&e.R.C){e.L&&e.L.C||(e.R.C=!1,e.C=!0,Di(this,e),e=i.L),e.C=i.C,i.C=e.L.C=!1,Ri(this,i),t=this._;break}e.C=!0,t=i,i=i.U}while(!t.C);t&&(t.C=!1)}}},t.geom.voronoi=function(t){var e=ei,r=ri,n=e,i=r,a=ji;if(t)return o(t);function o(t){var e=new Array(t.length),r=a[0][0],n=a[0][1],i=a[1][0],o=a[1][1];return Fi(s(t),a).cells.forEach(function(a,s){var l=a.edges,c=a.site;(e[s]=l.length?l.map(function(t){var e=t.start();return[e.x,e.y]}):c.x>=r&&c.x<=i&&c.y>=n&&c.y<=o?[[r,o],[i,o],[i,n],[r,n]]:[]).point=t[s]}),e}function s(t){return t.map(function(t,e){return{x:Math.round(n(t,e)/kt)*kt,y:Math.round(i(t,e)/kt)*kt,i:e}})}return o.links=function(t){return Fi(s(t)).edges.filter(function(t){return t.l&&t.r}).map(function(e){return{source:t[e.l.i],target:t[e.r.i]}})},o.triangles=function(t){var e=[];return Fi(s(t)).cells.forEach(function(r,n){for(var i,a,o,s,l=r.site,c=r.edges.sort(Mi),u=-1,h=c.length,f=c[h-1].edge,p=f.l===l?f.r:f.l;++u<h;)f,i=p,p=(f=c[u].edge).l===l?f.r:f.l,n<i.i&&n<p.i&&(o=i,s=p,((a=l).x-s.x)*(o.y-a.y)-(a.x-o.x)*(s.y-a.y)<0)&&e.push([t[n],t[i.i],t[p.i]])}),e},o.x=function(t){return arguments.length?(n=me(e=t),o):e},o.y=function(t){return arguments.length?(i=me(r=t),o):r},o.clipExtent=function(t){return arguments.length?(a=null==t?ji:t,o):a===ji?null:a},o.size=function(t){return arguments.length?o.clipExtent(t&&[[0,0],t]):a===ji?null:a&&a[1]},o};var ji=[[-1e6,-1e6],[1e6,1e6]];function Vi(t){return t.x}function Ui(t){return t.y}function qi(e,r){e=t.rgb(e),r=t.rgb(r);var n=e.r,i=e.g,a=e.b,o=r.r-n,s=r.g-i,l=r.b-a;return function(t){return"#"+ce(Math.round(n+o*t))+ce(Math.round(i+s*t))+ce(Math.round(a+l*t))}}function Hi(t,e){var r,n={},i={};for(r in t)r in e?n[r]=Zi(t[r],e[r]):i[r]=t[r];for(r in e)r in t||(i[r]=e[r]);return function(t){for(r in n)i[r]=n[r](t);return i}}function Gi(t,e){return t=+t,e=+e,function(r){return t*(1-r)+e*r}}function Wi(t,e){var r,n,i,a=Yi.lastIndex=Xi.lastIndex=0,o=-1,s=[],l=[];for(t+="",e+="";(r=Yi.exec(t))&&(n=Xi.exec(e));)(i=n.index)>a&&(i=e.slice(a,i),s[o]?s[o]+=i:s[++o]=i),(r=r[0])===(n=n[0])?s[o]?s[o]+=n:s[++o]=n:(s[++o]=null,l.push({i:o,x:Gi(r,n)})),a=Xi.lastIndex;return a<e.length&&(i=e.slice(a),s[o]?s[o]+=i:s[++o]=i),s.length<2?l[0]?(e=l[0].x,function(t){return e(t)+""}):function(){return e}:(e=l.length,function(t){for(var r,n=0;n<e;++n)s[(r=l[n]).i]=r.x(t);return s.join("")})}t.geom.delaunay=function(e){return t.geom.voronoi().triangles(e)},t.geom.quadtree=function(t,e,r,n,i){var a,o=ei,s=ri;if(a=arguments.length)return o=Vi,s=Ui,3===a&&(i=r,n=e,r=e=0),l(t);function l(t){var l,c,u,h,f,p,d,g,m,v=me(o),x=me(s);if(null!=e)p=e,d=r,g=n,m=i;else if(g=m=-(p=d=1/0),c=[],u=[],f=t.length,a)for(h=0;h<f;++h)(l=t[h]).x<p&&(p=l.x),l.y<d&&(d=l.y),l.x>g&&(g=l.x),l.y>m&&(m=l.y),c.push(l.x),u.push(l.y);else for(h=0;h<f;++h){var b=+v(l=t[h],h),_=+x(l,h);b<p&&(p=b),_<d&&(d=_),b>g&&(g=b),_>m&&(m=_),c.push(b),u.push(_)}var w=g-p,k=m-d;function M(t,e,r,n,i,a,o,s){if(!isNaN(r)&&!isNaN(n))if(t.leaf){var l=t.x,c=t.y;if(null!=l)if(y(l-r)+y(c-n)<.01)A(t,e,r,n,i,a,o,s);else{var u=t.point;t.x=t.y=t.point=null,A(t,u,l,c,i,a,o,s),A(t,e,r,n,i,a,o,s)}else t.x=r,t.y=n,t.point=e}else A(t,e,r,n,i,a,o,s)}function A(t,e,r,n,i,a,o,s){var l=.5*(i+o),c=.5*(a+s),u=r>=l,h=n>=c,f=h<<1|u;t.leaf=!1,u?i=l:o=l,h?a=c:s=c,M(t=t.nodes[f]||(t.nodes[f]={leaf:!0,nodes:[],point:null,x:null,y:null,add:function(t){M(T,t,+v(t,++h),+x(t,h),p,d,g,m)}}),e,r,n,i,a,o,s)}w>k?m=d+w:g=p+k;var T={leaf:!0,nodes:[],point:null,x:null,y:null,add:function(t){M(T,t,+v(t,++h),+x(t,h),p,d,g,m)}};if(T.visit=function(t){!function t(e,r,n,i,a,o){if(!e(r,n,i,a,o)){var s=.5*(n+a),l=.5*(i+o),c=r.nodes;c[0]&&t(e,c[0],n,i,s,l),c[1]&&t(e,c[1],s,i,a,l),c[2]&&t(e,c[2],n,l,s,o),c[3]&&t(e,c[3],s,l,a,o)}}(t,T,p,d,g,m)},T.find=function(t){return function(t,e,r,n,i,a,o){var s,l=1/0;return function t(c,u,h,f,p){if(!(u>a||h>o||f<n||p<i)){if(d=c.point){var d,g=e-c.x,m=r-c.y,v=g*g+m*m;if(v<l){var y=Math.sqrt(l=v);n=e-y,i=r-y,a=e+y,o=r+y,s=d}}for(var x=c.nodes,b=.5*(u+f),_=.5*(h+p),w=(r>=_)<<1|e>=b,k=w+4;w<k;++w)if(c=x[3&w])switch(3&w){case 0:t(c,u,h,b,_);break;case 1:t(c,b,h,f,_);break;case 2:t(c,u,_,b,p);break;case 3:t(c,b,_,f,p)}}}(t,n,i,a,o),s}(T,t[0],t[1],p,d,g,m)},h=-1,null==e){for(;++h<f;)M(T,t[h],c[h],u[h],p,d,g,m);--h}else t.forEach(T.add);return c=u=t=l=null,T}return l.x=function(t){return arguments.length?(o=t,l):o},l.y=function(t){return arguments.length?(s=t,l):s},l.extent=function(t){return arguments.length?(null==t?e=r=n=i=null:(e=+t[0][0],r=+t[0][1],n=+t[1][0],i=+t[1][1]),l):null==e?null:[[e,r],[n,i]]},l.size=function(t){return arguments.length?(null==t?e=r=n=i=null:(e=r=0,n=+t[0],i=+t[1]),l):null==e?null:[n-e,i-r]},l},t.interpolateRgb=qi,t.interpolateObject=Hi,t.interpolateNumber=Gi,t.interpolateString=Wi;var Yi=/[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g,Xi=new RegExp(Yi.source,"g");function Zi(e,r){for(var n,i=t.interpolators.length;--i>=0&&!(n=t.interpolators[i](e,r)););return n}function $i(t,e){var r,n=[],i=[],a=t.length,o=e.length,s=Math.min(t.length,e.length);for(r=0;r<s;++r)n.push(Zi(t[r],e[r]));for(;r<a;++r)i[r]=t[r];for(;r<o;++r)i[r]=e[r];return function(t){for(r=0;r<s;++r)i[r]=n[r](t);return i}}t.interpolate=Zi,t.interpolators=[function(t,e){var r=typeof e;return("string"===r?ge.has(e.toLowerCase())||/^(#|rgb\(|hsl\()/i.test(e)?qi:Wi:e instanceof Vt?qi:Array.isArray(e)?$i:"object"===r&&isNaN(e)?Hi:Gi)(t,e)}],t.interpolateArray=$i;var Ji=function(){return z},Ki=t.map({linear:Ji,poly:function(t){return function(e){return Math.pow(e,t)}},quad:function(){return ra},cubic:function(){return na},sin:function(){return aa},exp:function(){return oa},circle:function(){return sa},elastic:function(t,e){var r;arguments.length<2&&(e=.45);arguments.length?r=e/Tt*Math.asin(1/t):(t=1,r=e/4);return function(n){return 1+t*Math.pow(2,-10*n)*Math.sin((n-r)*Tt/e)}},back:function(t){t||(t=1.70158);return function(e){return e*e*((t+1)*e-t)}},bounce:function(){return la}}),Qi=t.map({in:z,out:ta,"in-out":ea,"out-in":function(t){return ea(ta(t))}});function ta(t){return function(e){return 1-t(1-e)}}function ea(t){return function(e){return.5*(e<.5?t(2*e):2-t(2-2*e))}}function ra(t){return t*t}function na(t){return t*t*t}function ia(t){if(t<=0)return 0;if(t>=1)return 1;var e=t*t,r=e*t;return 4*(t<.5?r:3*(t-e)+r-.75)}function aa(t){return 1-Math.cos(t*Et)}function oa(t){return Math.pow(2,10*(t-1))}function sa(t){return 1-Math.sqrt(1-t*t)}function la(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375}function ca(t,e){return e-=t,function(r){return Math.round(t+e*r)}}function ua(t){var e,r,n,i=[t.a,t.b],a=[t.c,t.d],o=fa(i),s=ha(i,a),l=fa(((e=a)[0]+=(n=-s)*(r=i)[0],e[1]+=n*r[1],e))||0;i[0]*a[1]<a[0]*i[1]&&(i[0]*=-1,i[1]*=-1,o*=-1,s*=-1),this.rotate=(o?Math.atan2(i[1],i[0]):Math.atan2(-a[0],a[1]))*Lt,this.translate=[t.e,t.f],this.scale=[o,l],this.skew=l?Math.atan2(s,l)*Lt:0}function ha(t,e){return t[0]*e[0]+t[1]*e[1]}function fa(t){var e=Math.sqrt(ha(t,t));return e&&(t[0]/=e,t[1]/=e),e}t.ease=function(t){var e,n=t.indexOf("-"),i=n>=0?t.slice(0,n):t,a=n>=0?t.slice(n+1):"in";return i=Ki.get(i)||Ji,a=Qi.get(a)||z,e=a(i.apply(null,r.call(arguments,1))),function(t){return t<=0?0:t>=1?1:e(t)}},t.interpolateHcl=function(e,r){e=t.hcl(e),r=t.hcl(r);var n=e.h,i=e.c,a=e.l,o=r.h-n,s=r.c-i,l=r.l-a;isNaN(s)&&(s=0,i=isNaN(i)?r.c:i);isNaN(o)?(o=0,n=isNaN(n)?r.h:n):o>180?o-=360:o<-180&&(o+=360);return function(t){return Yt(n+o*t,i+s*t,a+l*t)+""}},t.interpolateHsl=function(e,r){e=t.hsl(e),r=t.hsl(r);var n=e.h,i=e.s,a=e.l,o=r.h-n,s=r.s-i,l=r.l-a;isNaN(s)&&(s=0,i=isNaN(i)?r.s:i);isNaN(o)?(o=0,n=isNaN(n)?r.h:n):o>180?o-=360:o<-180&&(o+=360);return function(t){return Ht(n+o*t,i+s*t,a+l*t)+""}},t.interpolateLab=function(e,r){e=t.lab(e),r=t.lab(r);var n=e.l,i=e.a,a=e.b,o=r.l-n,s=r.a-i,l=r.b-a;return function(t){return te(n+o*t,i+s*t,a+l*t)+""}},t.interpolateRound=ca,t.transform=function(e){var r=i.createElementNS(t.ns.prefix.svg,"g");return(t.transform=function(t){if(null!=t){r.setAttribute("transform",t);var e=r.transform.baseVal.consolidate()}return new ua(e?e.matrix:pa)})(e)},ua.prototype.toString=function(){return"translate("+this.translate+")rotate("+this.rotate+")skewX("+this.skew+")scale("+this.scale+")"};var pa={a:1,b:0,c:0,d:1,e:0,f:0};function da(t){return t.length?t.pop()+",":""}function ga(e,r){var n=[],i=[];return e=t.transform(e),r=t.transform(r),function(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var i=r.push("translate(",null,",",null,")");n.push({i:i-4,x:Gi(t[0],e[0])},{i:i-2,x:Gi(t[1],e[1])})}else(e[0]||e[1])&&r.push("translate("+e+")")}(e.translate,r.translate,n,i),function(t,e,r,n){t!==e?(t-e>180?e+=360:e-t>180&&(t+=360),n.push({i:r.push(da(r)+"rotate(",null,")")-2,x:Gi(t,e)})):e&&r.push(da(r)+"rotate("+e+")")}(e.rotate,r.rotate,n,i),function(t,e,r,n){t!==e?n.push({i:r.push(da(r)+"skewX(",null,")")-2,x:Gi(t,e)}):e&&r.push(da(r)+"skewX("+e+")")}(e.skew,r.skew,n,i),function(t,e,r,n){if(t[0]!==e[0]||t[1]!==e[1]){var i=r.push(da(r)+"scale(",null,",",null,")");n.push({i:i-4,x:Gi(t[0],e[0])},{i:i-2,x:Gi(t[1],e[1])})}else 1===e[0]&&1===e[1]||r.push(da(r)+"scale("+e+")")}(e.scale,r.scale,n,i),e=r=null,function(t){for(var e,r=-1,a=i.length;++r<a;)n[(e=i[r]).i]=e.x(t);return n.join("")}}function ma(t,e){return e=(e-=t=+t)||1/e,function(r){return(r-t)/e}}function va(t,e){return e=(e-=t=+t)||1/e,function(r){return Math.max(0,Math.min(1,(r-t)/e))}}function ya(t){for(var e=t.source,r=t.target,n=function(t,e){if(t===e)return t;var r=xa(t),n=xa(e),i=r.pop(),a=n.pop(),o=null;for(;i===a;)o=i,i=r.pop(),a=n.pop();return o}(e,r),i=[e];e!==n;)e=e.parent,i.push(e);for(var a=i.length;r!==n;)i.splice(a,0,r),r=r.parent;return i}function xa(t){for(var e=[],r=t.parent;null!=r;)e.push(t),t=r,r=r.parent;return e.push(t),e}function ba(t){t.fixed|=2}function _a(t){t.fixed&=-7}function wa(t){t.fixed|=4,t.px=t.x,t.py=t.y}function ka(t){t.fixed&=-5}t.interpolateTransform=ga,t.layout={},t.layout.bundle=function(){return function(t){for(var e=[],r=-1,n=t.length;++r<n;)e.push(ya(t[r]));return e}},t.layout.chord=function(){var e,r,n,i,a,o,s,l={},c=0;function u(){var l,u,f,p,d,g={},m=[],v=t.range(i),y=[];for(e=[],r=[],l=0,p=-1;++p<i;){for(u=0,d=-1;++d<i;)u+=n[p][d];m.push(u),y.push(t.range(i)),l+=u}for(a&&v.sort(function(t,e){return a(m[t],m[e])}),o&&y.forEach(function(t,e){t.sort(function(t,r){return o(n[e][t],n[e][r])})}),l=(Tt-c*i)/l,u=0,p=-1;++p<i;){for(f=u,d=-1;++d<i;){var x=v[p],b=y[x][d],_=n[x][b],w=u,k=u+=_*l;g[x+"-"+b]={index:x,subindex:b,startAngle:w,endAngle:k,value:_}}r[x]={index:x,startAngle:f,endAngle:u,value:m[x]},u+=c}for(p=-1;++p<i;)for(d=p-1;++d<i;){var M=g[p+"-"+d],A=g[d+"-"+p];(M.value||A.value)&&e.push(M.value<A.value?{source:A,target:M}:{source:M,target:A})}s&&h()}function h(){e.sort(function(t,e){return s((t.source.value+t.target.value)/2,(e.source.value+e.target.value)/2)})}return l.matrix=function(t){return arguments.length?(i=(n=t)&&n.length,e=r=null,l):n},l.padding=function(t){return arguments.length?(c=t,e=r=null,l):c},l.sortGroups=function(t){return arguments.length?(a=t,e=r=null,l):a},l.sortSubgroups=function(t){return arguments.length?(o=t,e=null,l):o},l.sortChords=function(t){return arguments.length?(s=t,e&&h(),l):s},l.chords=function(){return e||u(),e},l.groups=function(){return r||u(),r},l},t.layout.force=function(){var e,r,n,i,a,o,s={},l=t.dispatch("start","tick","end"),c=[1,1],u=.9,h=Ma,f=Aa,p=-30,d=Ta,g=.1,m=.64,v=[],y=[];function x(t){return function(e,r,n,i){if(e.point!==t){var a=e.cx-t.x,o=e.cy-t.y,s=i-r,l=a*a+o*o;if(s*s/m<l){if(l<d){var c=e.charge/l;t.px-=a*c,t.py-=o*c}return!0}if(e.point&&l&&l<d){c=e.pointCharge/l;t.px-=a*c,t.py-=o*c}}return!e.charge}}function b(e){e.px=t.event.x,e.py=t.event.y,s.resume()}return s.tick=function(){if((n*=.99)<.005)return e=null,l.end({type:"end",alpha:n=0}),!0;var r,s,h,f,d,m,b,_,w,k=v.length,M=y.length;for(s=0;s<M;++s)f=(h=y[s]).source,(m=(_=(d=h.target).x-f.x)*_+(w=d.y-f.y)*w)&&(_*=m=n*a[s]*((m=Math.sqrt(m))-i[s])/m,w*=m,d.x-=_*(b=f.weight+d.weight?f.weight/(f.weight+d.weight):.5),d.y-=w*b,f.x+=_*(b=1-b),f.y+=w*b);if((b=n*g)&&(_=c[0]/2,w=c[1]/2,s=-1,b))for(;++s<k;)(h=v[s]).x+=(_-h.x)*b,h.y+=(w-h.y)*b;if(p)for(!function t(e,r,n){var i=0,a=0;e.charge=0;if(!e.leaf)for(var o,s=e.nodes,l=s.length,c=-1;++c<l;)null!=(o=s[c])&&(t(o,r,n),e.charge+=o.charge,i+=o.charge*o.cx,a+=o.charge*o.cy);if(e.point){e.leaf||(e.point.x+=Math.random()-.5,e.point.y+=Math.random()-.5);var u=r*n[e.point.index];e.charge+=e.pointCharge=u,i+=u*e.point.x,a+=u*e.point.y}e.cx=i/e.charge;e.cy=a/e.charge}(r=t.geom.quadtree(v),n,o),s=-1;++s<k;)(h=v[s]).fixed||r.visit(x(h));for(s=-1;++s<k;)(h=v[s]).fixed?(h.x=h.px,h.y=h.py):(h.x-=(h.px-(h.px=h.x))*u,h.y-=(h.py-(h.py=h.y))*u);l.tick({type:"tick",alpha:n})},s.nodes=function(t){return arguments.length?(v=t,s):v},s.links=function(t){return arguments.length?(y=t,s):y},s.size=function(t){return arguments.length?(c=t,s):c},s.linkDistance=function(t){return arguments.length?(h="function"==typeof t?t:+t,s):h},s.distance=s.linkDistance,s.linkStrength=function(t){return arguments.length?(f="function"==typeof t?t:+t,s):f},s.friction=function(t){return arguments.length?(u=+t,s):u},s.charge=function(t){return arguments.length?(p="function"==typeof t?t:+t,s):p},s.chargeDistance=function(t){return arguments.length?(d=t*t,s):Math.sqrt(d)},s.gravity=function(t){return arguments.length?(g=+t,s):g},s.theta=function(t){return arguments.length?(m=t*t,s):Math.sqrt(m)},s.alpha=function(t){return arguments.length?(t=+t,n?t>0?n=t:(e.c=null,e.t=NaN,e=null,l.end({type:"end",alpha:n=0})):t>0&&(l.start({type:"start",alpha:n=t}),e=Me(s.tick)),s):n},s.start=function(){var t,e,r,n=v.length,l=y.length,u=c[0],d=c[1];for(t=0;t<n;++t)(r=v[t]).index=t,r.weight=0;for(t=0;t<l;++t)"number"==typeof(r=y[t]).source&&(r.source=v[r.source]),"number"==typeof r.target&&(r.target=v[r.target]),++r.source.weight,++r.target.weight;for(t=0;t<n;++t)r=v[t],isNaN(r.x)&&(r.x=g("x",u)),isNaN(r.y)&&(r.y=g("y",d)),isNaN(r.px)&&(r.px=r.x),isNaN(r.py)&&(r.py=r.y);if(i=[],"function"==typeof h)for(t=0;t<l;++t)i[t]=+h.call(this,y[t],t);else for(t=0;t<l;++t)i[t]=h;if(a=[],"function"==typeof f)for(t=0;t<l;++t)a[t]=+f.call(this,y[t],t);else for(t=0;t<l;++t)a[t]=f;if(o=[],"function"==typeof p)for(t=0;t<n;++t)o[t]=+p.call(this,v[t],t);else for(t=0;t<n;++t)o[t]=p;function g(r,i){if(!e){for(e=new Array(n),c=0;c<n;++c)e[c]=[];for(c=0;c<l;++c){var a=y[c];e[a.source.index].push(a.target),e[a.target.index].push(a.source)}}for(var o,s=e[t],c=-1,u=s.length;++c<u;)if(!isNaN(o=s[c][r]))return o;return Math.random()*i}return s.resume()},s.resume=function(){return s.alpha(.1)},s.stop=function(){return s.alpha(0)},s.drag=function(){if(r||(r=t.behavior.drag().origin(z).on("dragstart.force",ba).on("drag.force",b).on("dragend.force",_a)),!arguments.length)return r;this.on("mouseover.force",wa).on("mouseout.force",ka).call(r)},t.rebind(s,l,"on")};var Ma=20,Aa=1,Ta=1/0;function Sa(e,r){return t.rebind(e,r,"sort","children","value"),e.nodes=e,e.links=Ia,e}function Ea(t,e){for(var r=[t];null!=(t=r.pop());)if(e(t),(i=t.children)&&(n=i.length))for(var n,i;--n>=0;)r.push(i[n])}function Ca(t,e){for(var r=[t],n=[];null!=(t=r.pop());)if(n.push(t),(a=t.children)&&(i=a.length))for(var i,a,o=-1;++o<i;)r.push(a[o]);for(;null!=(t=n.pop());)e(t)}function La(t){return t.children}function za(t){return t.value}function Pa(t,e){return e.value-t.value}function Ia(e){return t.merge(e.map(function(t){return(t.children||[]).map(function(e){return{source:t,target:e}})}))}t.layout.hierarchy=function(){var t=Pa,e=La,r=za;function n(i){var a,o=[i],s=[];for(i.depth=0;null!=(a=o.pop());)if(s.push(a),(c=e.call(n,a,a.depth))&&(l=c.length)){for(var l,c,u;--l>=0;)o.push(u=c[l]),u.parent=a,u.depth=a.depth+1;r&&(a.value=0),a.children=c}else r&&(a.value=+r.call(n,a,a.depth)||0),delete a.children;return Ca(i,function(e){var n,i;t&&(n=e.children)&&n.sort(t),r&&(i=e.parent)&&(i.value+=e.value)}),s}return n.sort=function(e){return arguments.length?(t=e,n):t},n.children=function(t){return arguments.length?(e=t,n):e},n.value=function(t){return arguments.length?(r=t,n):r},n.revalue=function(t){return r&&(Ea(t,function(t){t.children&&(t.value=0)}),Ca(t,function(t){var e;t.children||(t.value=+r.call(n,t,t.depth)||0),(e=t.parent)&&(e.value+=t.value)})),t},n},t.layout.partition=function(){var e=t.layout.hierarchy(),r=[1,1];function n(t,n){var i=e.call(this,t,n);return function t(e,r,n,i){var a=e.children;if(e.x=r,e.y=e.depth*i,e.dx=n,e.dy=i,a&&(o=a.length)){var o,s,l,c=-1;for(n=e.value?n/e.value:0;++c<o;)t(s=a[c],r,l=s.value*n,i),r+=l}}(i[0],0,r[0],r[1]/function t(e){var r=e.children,n=0;if(r&&(i=r.length))for(var i,a=-1;++a<i;)n=Math.max(n,t(r[a]));return 1+n}(i[0])),i}return n.size=function(t){return arguments.length?(r=t,n):r},Sa(n,e)},t.layout.pie=function(){var e=Number,r=Oa,n=0,i=Tt,a=0;function o(s){var l,c=s.length,u=s.map(function(t,r){return+e.call(o,t,r)}),h=+("function"==typeof n?n.apply(this,arguments):n),f=("function"==typeof i?i.apply(this,arguments):i)-h,p=Math.min(Math.abs(f)/c,+("function"==typeof a?a.apply(this,arguments):a)),d=p*(f<0?-1:1),g=t.sum(u),m=g?(f-c*d)/g:0,v=t.range(c),y=[];return null!=r&&v.sort(r===Oa?function(t,e){return u[e]-u[t]}:function(t,e){return r(s[t],s[e])}),v.forEach(function(t){y[t]={data:s[t],value:l=u[t],startAngle:h,endAngle:h+=l*m+d,padAngle:p}}),y}return o.value=function(t){return arguments.length?(e=t,o):e},o.sort=function(t){return arguments.length?(r=t,o):r},o.startAngle=function(t){return arguments.length?(n=t,o):n},o.endAngle=function(t){return arguments.length?(i=t,o):i},o.padAngle=function(t){return arguments.length?(a=t,o):a},o};var Oa={};function Da(t){return t.x}function Ra(t){return t.y}function Ba(t,e,r){t.y0=e,t.y=r}t.layout.stack=function(){var e=z,r=ja,n=Va,i=Ba,a=Da,o=Ra;function s(l,c){if(!(p=l.length))return l;var u=l.map(function(t,r){return e.call(s,t,r)}),h=u.map(function(t){return t.map(function(t,e){return[a.call(s,t,e),o.call(s,t,e)]})}),f=r.call(s,h,c);u=t.permute(u,f),h=t.permute(h,f);var p,d,g,m,v=n.call(s,h,c),y=u[0].length;for(g=0;g<y;++g)for(i.call(s,u[0][g],m=v[g],h[0][g][1]),d=1;d<p;++d)i.call(s,u[d][g],m+=h[d-1][g][1],h[d][g][1]);return l}return s.values=function(t){return arguments.length?(e=t,s):e},s.order=function(t){return arguments.length?(r="function"==typeof t?t:Fa.get(t)||ja,s):r},s.offset=function(t){return arguments.length?(n="function"==typeof t?t:Na.get(t)||Va,s):n},s.x=function(t){return arguments.length?(a=t,s):a},s.y=function(t){return arguments.length?(o=t,s):o},s.out=function(t){return arguments.length?(i=t,s):i},s};var Fa=t.map({"inside-out":function(e){var r,n,i=e.length,a=e.map(Ua),o=e.map(qa),s=t.range(i).sort(function(t,e){return a[t]-a[e]}),l=0,c=0,u=[],h=[];for(r=0;r<i;++r)n=s[r],l<c?(l+=o[n],u.push(n)):(c+=o[n],h.push(n));return h.reverse().concat(u)},reverse:function(e){return t.range(e.length).reverse()},default:ja}),Na=t.map({silhouette:function(t){var e,r,n,i=t.length,a=t[0].length,o=[],s=0,l=[];for(r=0;r<a;++r){for(e=0,n=0;e<i;e++)n+=t[e][r][1];n>s&&(s=n),o.push(n)}for(r=0;r<a;++r)l[r]=(s-o[r])/2;return l},wiggle:function(t){var e,r,n,i,a,o,s,l,c,u=t.length,h=t[0],f=h.length,p=[];for(p[0]=l=c=0,r=1;r<f;++r){for(e=0,i=0;e<u;++e)i+=t[e][r][1];for(e=0,a=0,s=h[r][0]-h[r-1][0];e<u;++e){for(n=0,o=(t[e][r][1]-t[e][r-1][1])/(2*s);n<e;++n)o+=(t[n][r][1]-t[n][r-1][1])/s;a+=o*t[e][r][1]}p[r]=l-=i?a/i*s:0,l<c&&(c=l)}for(r=0;r<f;++r)p[r]-=c;return p},expand:function(t){var e,r,n,i=t.length,a=t[0].length,o=1/i,s=[];for(r=0;r<a;++r){for(e=0,n=0;e<i;e++)n+=t[e][r][1];if(n)for(e=0;e<i;e++)t[e][r][1]/=n;else for(e=0;e<i;e++)t[e][r][1]=o}for(r=0;r<a;++r)s[r]=0;return s},zero:Va});function ja(e){return t.range(e.length)}function Va(t){for(var e=-1,r=t[0].length,n=[];++e<r;)n[e]=0;return n}function Ua(t){for(var e,r=1,n=0,i=t[0][1],a=t.length;r<a;++r)(e=t[r][1])>i&&(n=r,i=e);return n}function qa(t){return t.reduce(Ha,0)}function Ha(t,e){return t+e[1]}function Ga(t,e){return Wa(t,Math.ceil(Math.log(e.length)/Math.LN2+1))}function Wa(t,e){for(var r=-1,n=+t[0],i=(t[1]-n)/e,a=[];++r<=e;)a[r]=i*r+n;return a}function Ya(e){return[t.min(e),t.max(e)]}function Xa(t,e){return t.value-e.value}function Za(t,e){var r=t._pack_next;t._pack_next=e,e._pack_prev=t,e._pack_next=r,r._pack_prev=e}function $a(t,e){t._pack_next=e,e._pack_prev=t}function Ja(t,e){var r=e.x-t.x,n=e.y-t.y,i=t.r+e.r;return.999*i*i>r*r+n*n}function Ka(t){if((e=t.children)&&(l=e.length)){var e,r,n,i,a,o,s,l,c=1/0,u=-1/0,h=1/0,f=-1/0;if(e.forEach(Qa),(r=e[0]).x=-r.r,r.y=0,x(r),l>1&&((n=e[1]).x=n.r,n.y=0,x(n),l>2))for(eo(r,n,i=e[2]),x(i),Za(r,i),r._pack_prev=i,Za(i,n),n=r._pack_next,a=3;a<l;a++){eo(r,n,i=e[a]);var p=0,d=1,g=1;for(o=n._pack_next;o!==n;o=o._pack_next,d++)if(Ja(o,i)){p=1;break}if(1==p)for(s=r._pack_prev;s!==o._pack_prev&&!Ja(s,i);s=s._pack_prev,g++);p?(d<g||d==g&&n.r<r.r?$a(r,n=o):$a(r=s,n),a--):(Za(r,i),n=i,x(i))}var m=(c+u)/2,v=(h+f)/2,y=0;for(a=0;a<l;a++)(i=e[a]).x-=m,i.y-=v,y=Math.max(y,i.r+Math.sqrt(i.x*i.x+i.y*i.y));t.r=y,e.forEach(to)}function x(t){c=Math.min(t.x-t.r,c),u=Math.max(t.x+t.r,u),h=Math.min(t.y-t.r,h),f=Math.max(t.y+t.r,f)}}function Qa(t){t._pack_next=t._pack_prev=t}function to(t){delete t._pack_next,delete t._pack_prev}function eo(t,e,r){var n=t.r+r.r,i=e.x-t.x,a=e.y-t.y;if(n&&(i||a)){var o=e.r+r.r,s=i*i+a*a,l=.5+((n*=n)-(o*=o))/(2*s),c=Math.sqrt(Math.max(0,2*o*(n+s)-(n-=s)*n-o*o))/(2*s);r.x=t.x+l*i+c*a,r.y=t.y+l*a-c*i}else r.x=t.x+n,r.y=t.y}function ro(t,e){return t.parent==e.parent?1:2}function no(t){var e=t.children;return e.length?e[0]:t.t}function io(t){var e,r=t.children;return(e=r.length)?r[e-1]:t.t}function ao(t,e,r){var n=r/(e.i-t.i);e.c-=n,e.s+=r,t.c+=n,e.z+=r,e.m+=r}function oo(t,e,r){return t.a.parent===e.parent?t.a:r}function so(t){return{x:t.x,y:t.y,dx:t.dx,dy:t.dy}}function lo(t,e){var r=t.x+e[3],n=t.y+e[0],i=t.dx-e[1]-e[3],a=t.dy-e[0]-e[2];return i<0&&(r+=i/2,i=0),a<0&&(n+=a/2,a=0),{x:r,y:n,dx:i,dy:a}}function co(t){var e=t[0],r=t[t.length-1];return e<r?[e,r]:[r,e]}function uo(t){return t.rangeExtent?t.rangeExtent():co(t.range())}function ho(t,e,r,n){var i=r(t[0],t[1]),a=n(e[0],e[1]);return function(t){return a(i(t))}}function fo(t,e){var r,n=0,i=t.length-1,a=t[n],o=t[i];return o<a&&(r=n,n=i,i=r,r=a,a=o,o=r),t[n]=e.floor(a),t[i]=e.ceil(o),t}function po(t){return t?{floor:function(e){return Math.floor(e/t)*t},ceil:function(e){return Math.ceil(e/t)*t}}:go}t.layout.histogram=function(){var e=!0,r=Number,n=Ya,i=Ga;function a(a,o){for(var s,l,c=[],u=a.map(r,this),h=n.call(this,u,o),f=i.call(this,h,u,o),p=(o=-1,u.length),d=f.length-1,g=e?1:1/p;++o<d;)(s=c[o]=[]).dx=f[o+1]-(s.x=f[o]),s.y=0;if(d>0)for(o=-1;++o<p;)(l=u[o])>=h[0]&&l<=h[1]&&((s=c[t.bisect(f,l,1,d)-1]).y+=g,s.push(a[o]));return c}return a.value=function(t){return arguments.length?(r=t,a):r},a.range=function(t){return arguments.length?(n=me(t),a):n},a.bins=function(t){return arguments.length?(i="number"==typeof t?function(e){return Wa(e,t)}:me(t),a):i},a.frequency=function(t){return arguments.length?(e=!!t,a):e},a},t.layout.pack=function(){var e,r=t.layout.hierarchy().sort(Xa),n=0,i=[1,1];function a(t,a){var o=r.call(this,t,a),s=o[0],l=i[0],c=i[1],u=null==e?Math.sqrt:"function"==typeof e?e:function(){return e};if(s.x=s.y=0,Ca(s,function(t){t.r=+u(t.value)}),Ca(s,Ka),n){var h=n*(e?1:Math.max(2*s.r/l,2*s.r/c))/2;Ca(s,function(t){t.r+=h}),Ca(s,Ka),Ca(s,function(t){t.r-=h})}return function t(e,r,n,i){var a=e.children;e.x=r+=i*e.x;e.y=n+=i*e.y;e.r*=i;if(a)for(var o=-1,s=a.length;++o<s;)t(a[o],r,n,i)}(s,l/2,c/2,e?1:1/Math.max(2*s.r/l,2*s.r/c)),o}return a.size=function(t){return arguments.length?(i=t,a):i},a.radius=function(t){return arguments.length?(e=null==t||"function"==typeof t?t:+t,a):e},a.padding=function(t){return arguments.length?(n=+t,a):n},Sa(a,r)},t.layout.tree=function(){var e=t.layout.hierarchy().sort(null).value(null),r=ro,n=[1,1],i=null;function a(t,a){var c=e.call(this,t,a),u=c[0],h=function(t){var e,r={A:null,children:[t]},n=[r];for(;null!=(e=n.pop());)for(var i,a=e.children,o=0,s=a.length;o<s;++o)n.push((a[o]=i={_:a[o],parent:e,children:(i=a[o].children)&&i.slice()||[],A:null,a:null,z:0,m:0,c:0,s:0,t:null,i:o}).a=i);return r.children[0]}(u);if(Ca(h,o),h.parent.m=-h.z,Ea(h,s),i)Ea(u,l);else{var f=u,p=u,d=u;Ea(u,function(t){t.x<f.x&&(f=t),t.x>p.x&&(p=t),t.depth>d.depth&&(d=t)});var g=r(f,p)/2-f.x,m=n[0]/(p.x+r(p,f)/2+g),v=n[1]/(d.depth||1);Ea(u,function(t){t.x=(t.x+g)*m,t.y=t.depth*v})}return c}function o(t){var e=t.children,n=t.parent.children,i=t.i?n[t.i-1]:null;if(e.length){!function(t){var e,r=0,n=0,i=t.children,a=i.length;for(;--a>=0;)(e=i[a]).z+=r,e.m+=r,r+=e.s+(n+=e.c)}(t);var a=(e[0].z+e[e.length-1].z)/2;i?(t.z=i.z+r(t._,i._),t.m=t.z-a):t.z=a}else i&&(t.z=i.z+r(t._,i._));t.parent.A=function(t,e,n){if(e){for(var i,a=t,o=t,s=e,l=a.parent.children[0],c=a.m,u=o.m,h=s.m,f=l.m;s=io(s),a=no(a),s&&a;)l=no(l),(o=io(o)).a=t,(i=s.z+h-a.z-c+r(s._,a._))>0&&(ao(oo(s,t,n),t,i),c+=i,u+=i),h+=s.m,c+=a.m,f+=l.m,u+=o.m;s&&!io(o)&&(o.t=s,o.m+=h-u),a&&!no(l)&&(l.t=a,l.m+=c-f,n=t)}return n}(t,i,t.parent.A||n[0])}function s(t){t._.x=t.z+t.parent.m,t.m+=t.parent.m}function l(t){t.x*=n[0],t.y=t.depth*n[1]}return a.separation=function(t){return arguments.length?(r=t,a):r},a.size=function(t){return arguments.length?(i=null==(n=t)?l:null,a):i?null:n},a.nodeSize=function(t){return arguments.length?(i=null==(n=t)?null:l,a):i?n:null},Sa(a,e)},t.layout.cluster=function(){var e=t.layout.hierarchy().sort(null).value(null),r=ro,n=[1,1],i=!1;function a(a,o){var s,l=e.call(this,a,o),c=l[0],u=0;Ca(c,function(e){var n=e.children;n&&n.length?(e.x=function(t){return t.reduce(function(t,e){return t+e.x},0)/t.length}(n),e.y=function(e){return 1+t.max(e,function(t){return t.y})}(n)):(e.x=s?u+=r(e,s):0,e.y=0,s=e)});var h=function t(e){var r=e.children;return r&&r.length?t(r[0]):e}(c),f=function t(e){var r,n=e.children;return n&&(r=n.length)?t(n[r-1]):e}(c),p=h.x-r(h,f)/2,d=f.x+r(f,h)/2;return Ca(c,i?function(t){t.x=(t.x-c.x)*n[0],t.y=(c.y-t.y)*n[1]}:function(t){t.x=(t.x-p)/(d-p)*n[0],t.y=(1-(c.y?t.y/c.y:1))*n[1]}),l}return a.separation=function(t){return arguments.length?(r=t,a):r},a.size=function(t){return arguments.length?(i=null==(n=t),a):i?null:n},a.nodeSize=function(t){return arguments.length?(i=null!=(n=t),a):i?n:null},Sa(a,e)},t.layout.treemap=function(){var e,r=t.layout.hierarchy(),n=Math.round,i=[1,1],a=null,o=so,s=!1,l="squarify",c=.5*(1+Math.sqrt(5));function u(t,e){for(var r,n,i=-1,a=t.length;++i<a;)n=(r=t[i]).value*(e<0?0:e),r.area=isNaN(n)||n<=0?0:n}function h(t){var e=t.children;if(e&&e.length){var r,n,i,a=o(t),s=[],c=e.slice(),f=1/0,g="slice"===l?a.dx:"dice"===l?a.dy:"slice-dice"===l?1&t.depth?a.dy:a.dx:Math.min(a.dx,a.dy);for(u(c,a.dx*a.dy/t.value),s.area=0;(i=c.length)>0;)s.push(r=c[i-1]),s.area+=r.area,"squarify"!==l||(n=p(s,g))<=f?(c.pop(),f=n):(s.area-=s.pop().area,d(s,g,a,!1),g=Math.min(a.dx,a.dy),s.length=s.area=0,f=1/0);s.length&&(d(s,g,a,!0),s.length=s.area=0),e.forEach(h)}}function f(t){var e=t.children;if(e&&e.length){var r,n=o(t),i=e.slice(),a=[];for(u(i,n.dx*n.dy/t.value),a.area=0;r=i.pop();)a.push(r),a.area+=r.area,null!=r.z&&(d(a,r.z?n.dx:n.dy,n,!i.length),a.length=a.area=0);e.forEach(f)}}function p(t,e){for(var r,n=t.area,i=0,a=1/0,o=-1,s=t.length;++o<s;)(r=t[o].area)&&(r<a&&(a=r),r>i&&(i=r));return e*=e,(n*=n)?Math.max(e*i*c/n,n/(e*a*c)):1/0}function d(t,e,r,i){var a,o=-1,s=t.length,l=r.x,c=r.y,u=e?n(t.area/e):0;if(e==r.dx){for((i||u>r.dy)&&(u=r.dy);++o<s;)(a=t[o]).x=l,a.y=c,a.dy=u,l+=a.dx=Math.min(r.x+r.dx-l,u?n(a.area/u):0);a.z=!0,a.dx+=r.x+r.dx-l,r.y+=u,r.dy-=u}else{for((i||u>r.dx)&&(u=r.dx);++o<s;)(a=t[o]).x=l,a.y=c,a.dx=u,c+=a.dy=Math.min(r.y+r.dy-c,u?n(a.area/u):0);a.z=!1,a.dy+=r.y+r.dy-c,r.x+=u,r.dx-=u}}function g(t){var n=e||r(t),a=n[0];return a.x=a.y=0,a.value?(a.dx=i[0],a.dy=i[1]):a.dx=a.dy=0,e&&r.revalue(a),u([a],a.dx*a.dy/a.value),(e?f:h)(a),s&&(e=n),n}return g.size=function(t){return arguments.length?(i=t,g):i},g.padding=function(t){if(!arguments.length)return a;function e(e){return lo(e,t)}var r;return o=null==(a=t)?so:"function"==(r=typeof t)?function(e){var r=t.call(g,e,e.depth);return null==r?so(e):lo(e,"number"==typeof r?[r,r,r,r]:r)}:"number"===r?(t=[t,t,t,t],e):e,g},g.round=function(t){return arguments.length?(n=t?Math.round:Number,g):n!=Number},g.sticky=function(t){return arguments.length?(s=t,e=null,g):s},g.ratio=function(t){return arguments.length?(c=t,g):c},g.mode=function(t){return arguments.length?(l=t+"",g):l},Sa(g,r)},t.random={normal:function(t,e){var r=arguments.length;return r<2&&(e=1),r<1&&(t=0),function(){var r,n,i;do{i=(r=2*Math.random()-1)*r+(n=2*Math.random()-1)*n}while(!i||i>1);return t+e*r*Math.sqrt(-2*Math.log(i)/i)}},logNormal:function(){var e=t.random.normal.apply(t,arguments);return function(){return Math.exp(e())}},bates:function(e){var r=t.random.irwinHall(e);return function(){return r()/e}},irwinHall:function(t){return function(){for(var e=0,r=0;r<t;r++)e+=Math.random();return e}}},t.scale={};var go={floor:z,ceil:z};function mo(e,r,n,i){var a=[],o=[],s=0,l=Math.min(e.length,r.length)-1;for(e[l]<e[0]&&(e=e.slice().reverse(),r=r.slice().reverse());++s<=l;)a.push(n(e[s-1],e[s])),o.push(i(r[s-1],r[s]));return function(r){var n=t.bisect(e,r,1,l)-1;return o[n](a[n](r))}}function vo(e,r){return t.rebind(e,r,"range","rangeRound","interpolate","clamp")}function yo(t,e){return fo(t,po(xo(t,e)[2])),fo(t,po(xo(t,e)[2])),t}function xo(t,e){null==e&&(e=10);var r=co(t),n=r[1]-r[0],i=Math.pow(10,Math.floor(Math.log(n/e)/Math.LN10)),a=e/n*i;return a<=.15?i*=10:a<=.35?i*=5:a<=.75&&(i*=2),r[0]=Math.ceil(r[0]/i)*i,r[1]=Math.floor(r[1]/i)*i+.5*i,r[2]=i,r}function bo(e,r){return t.range.apply(t,xo(e,r))}function _o(e,r,n){var i=xo(e,r);if(n){var a=Le.exec(n);if(a.shift(),"s"===a[8]){var o=t.formatPrefix(Math.max(y(i[0]),y(i[1])));return a[7]||(a[7]="."+ko(o.scale(i[2]))),a[8]="f",n=t.format(a.join("")),function(t){return n(o.scale(t))+o.symbol}}a[7]||(a[7]="."+function(t,e){var r=ko(e[2]);return t in wo?Math.abs(r-ko(Math.max(y(e[0]),y(e[1]))))+ +("e"!==t):r-2*("%"===t)}(a[8],i)),n=a.join("")}else n=",."+ko(i[2])+"f";return t.format(n)}t.scale.linear=function(){return function t(e,r,n,i){var a,o;function s(){var t=Math.min(e.length,r.length)>2?mo:ho,s=i?va:ma;return a=t(e,r,s,n),o=t(r,e,s,Zi),l}function l(t){return a(t)}l.invert=function(t){return o(t)};l.domain=function(t){return arguments.length?(e=t.map(Number),s()):e};l.range=function(t){return arguments.length?(r=t,s()):r};l.rangeRound=function(t){return l.range(t).interpolate(ca)};l.clamp=function(t){return arguments.length?(i=t,s()):i};l.interpolate=function(t){return arguments.length?(n=t,s()):n};l.ticks=function(t){return bo(e,t)};l.tickFormat=function(t,r){return _o(e,t,r)};l.nice=function(t){return yo(e,t),s()};l.copy=function(){return t(e,r,n,i)};return s()}([0,1],[0,1],Zi,!1)};var wo={s:1,g:1,p:1,r:1,e:1};function ko(t){return-Math.floor(Math.log(t)/Math.LN10+.01)}t.scale.log=function(){return function e(r,n,i,a){function o(t){return(i?Math.log(t<0?0:t):-Math.log(t>0?0:-t))/Math.log(n)}function s(t){return i?Math.pow(n,t):-Math.pow(n,-t)}function l(t){return r(o(t))}l.invert=function(t){return s(r.invert(t))};l.domain=function(t){return arguments.length?(i=t[0]>=0,r.domain((a=t.map(Number)).map(o)),l):a};l.base=function(t){return arguments.length?(n=+t,r.domain(a.map(o)),l):n};l.nice=function(){var t=fo(a.map(o),i?Math:Ao);return r.domain(t),a=t.map(s),l};l.ticks=function(){var t=co(a),e=[],r=t[0],l=t[1],c=Math.floor(o(r)),u=Math.ceil(o(l)),h=n%1?2:n;if(isFinite(u-c)){if(i){for(;c<u;c++)for(var f=1;f<h;f++)e.push(s(c)*f);e.push(s(c))}else for(e.push(s(c));c++<u;)for(var f=h-1;f>0;f--)e.push(s(c)*f);for(c=0;e[c]<r;c++);for(u=e.length;e[u-1]>l;u--);e=e.slice(c,u)}return e};l.tickFormat=function(e,r){if(!arguments.length)return Mo;arguments.length<2?r=Mo:"function"!=typeof r&&(r=t.format(r));var i=Math.max(1,n*e/l.ticks().length);return function(t){var e=t/s(Math.round(o(t)));return e*n<n-.5&&(e*=n),e<=i?r(t):""}};l.copy=function(){return e(r.copy(),n,i,a)};return vo(l,r)}(t.scale.linear().domain([0,1]),10,!0,[1,10])};var Mo=t.format(".0e"),Ao={floor:function(t){return-Math.ceil(-t)},ceil:function(t){return-Math.floor(-t)}};function To(t){return function(e){return e<0?-Math.pow(-e,t):Math.pow(e,t)}}t.scale.pow=function(){return function t(e,r,n){var i=To(r),a=To(1/r);function o(t){return e(i(t))}o.invert=function(t){return a(e.invert(t))};o.domain=function(t){return arguments.length?(e.domain((n=t.map(Number)).map(i)),o):n};o.ticks=function(t){return bo(n,t)};o.tickFormat=function(t,e){return _o(n,t,e)};o.nice=function(t){return o.domain(yo(n,t))};o.exponent=function(t){return arguments.length?(i=To(r=t),a=To(1/r),e.domain(n.map(i)),o):r};o.copy=function(){return t(e.copy(),r,n)};return vo(o,e)}(t.scale.linear(),1,[0,1])},t.scale.sqrt=function(){return t.scale.pow().exponent(.5)},t.scale.ordinal=function(){return function e(r,n){var i,a,o;function s(t){return a[((i.get(t)||("range"===n.t?i.set(t,r.push(t)):NaN))-1)%a.length]}function l(e,n){return t.range(r.length).map(function(t){return e+n*t})}s.domain=function(t){if(!arguments.length)return r;r=[],i=new b;for(var e,a=-1,o=t.length;++a<o;)i.has(e=t[a])||i.set(e,r.push(e));return s[n.t].apply(s,n.a)};s.range=function(t){return arguments.length?(a=t,o=0,n={t:"range",a:arguments},s):a};s.rangePoints=function(t,e){arguments.length<2&&(e=0);var i=t[0],c=t[1],u=r.length<2?(i=(i+c)/2,0):(c-i)/(r.length-1+e);return a=l(i+u*e/2,u),o=0,n={t:"rangePoints",a:arguments},s};s.rangeRoundPoints=function(t,e){arguments.length<2&&(e=0);var i=t[0],c=t[1],u=r.length<2?(i=c=Math.round((i+c)/2),0):(c-i)/(r.length-1+e)|0;return a=l(i+Math.round(u*e/2+(c-i-(r.length-1+e)*u)/2),u),o=0,n={t:"rangeRoundPoints",a:arguments},s};s.rangeBands=function(t,e,i){arguments.length<2&&(e=0),arguments.length<3&&(i=e);var c=t[1]<t[0],u=t[c-0],h=t[1-c],f=(h-u)/(r.length-e+2*i);return a=l(u+f*i,f),c&&a.reverse(),o=f*(1-e),n={t:"rangeBands",a:arguments},s};s.rangeRoundBands=function(t,e,i){arguments.length<2&&(e=0),arguments.length<3&&(i=e);var c=t[1]<t[0],u=t[c-0],h=t[1-c],f=Math.floor((h-u)/(r.length-e+2*i));return a=l(u+Math.round((h-u-(r.length-e)*f)/2),f),c&&a.reverse(),o=Math.round(f*(1-e)),n={t:"rangeRoundBands",a:arguments},s};s.rangeBand=function(){return o};s.rangeExtent=function(){return co(n.a[0])};s.copy=function(){return e(r,n)};return s.domain(r)}([],{t:"range",a:[[]]})},t.scale.category10=function(){return t.scale.ordinal().range(So)},t.scale.category20=function(){return t.scale.ordinal().range(Eo)},t.scale.category20b=function(){return t.scale.ordinal().range(Co)},t.scale.category20c=function(){return t.scale.ordinal().range(Lo)};var So=[2062260,16744206,2924588,14034728,9725885,9197131,14907330,8355711,12369186,1556175].map(se),Eo=[2062260,11454440,16744206,16759672,2924588,10018698,14034728,16750742,9725885,12955861,9197131,12885140,14907330,16234194,8355711,13092807,12369186,14408589,1556175,10410725].map(se),Co=[3750777,5395619,7040719,10264286,6519097,9216594,11915115,13556636,9202993,12426809,15186514,15190932,8666169,11356490,14049643,15177372,8077683,10834324,13528509,14589654].map(se),Lo=[3244733,7057110,10406625,13032431,15095053,16616764,16625259,16634018,3253076,7652470,10607003,13101504,7695281,10394312,12369372,14342891,6513507,9868950,12434877,14277081].map(se);function zo(){return 0}t.scale.quantile=function(){return function e(r,n){var i;function a(){var e=0,a=n.length;for(i=[];++e<a;)i[e-1]=t.quantile(r,e/a);return o}function o(e){if(!isNaN(e=+e))return n[t.bisect(i,e)]}o.domain=function(t){return arguments.length?(r=t.map(p).filter(d).sort(f),a()):r};o.range=function(t){return arguments.length?(n=t,a()):n};o.quantiles=function(){return i};o.invertExtent=function(t){return(t=n.indexOf(t))<0?[NaN,NaN]:[t>0?i[t-1]:r[0],t<i.length?i[t]:r[r.length-1]]};o.copy=function(){return e(r,n)};return a()}([],[])},t.scale.quantize=function(){return function t(e,r,n){var i,a;function o(t){return n[Math.max(0,Math.min(a,Math.floor(i*(t-e))))]}function s(){return i=n.length/(r-e),a=n.length-1,o}o.domain=function(t){return arguments.length?(e=+t[0],r=+t[t.length-1],s()):[e,r]};o.range=function(t){return arguments.length?(n=t,s()):n};o.invertExtent=function(t){return[t=(t=n.indexOf(t))<0?NaN:t/i+e,t+1/i]};o.copy=function(){return t(e,r,n)};return s()}(0,1,[0,1])},t.scale.threshold=function(){return function e(r,n){function i(e){if(e<=e)return n[t.bisect(r,e)]}i.domain=function(t){return arguments.length?(r=t,i):r};i.range=function(t){return arguments.length?(n=t,i):n};i.invertExtent=function(t){return t=n.indexOf(t),[r[t-1],r[t]]};i.copy=function(){return e(r,n)};return i}([.5],[0,1])},t.scale.identity=function(){return function t(e){function r(t){return+t}r.invert=r;r.domain=r.range=function(t){return arguments.length?(e=t.map(r),r):e};r.ticks=function(t){return bo(e,t)};r.tickFormat=function(t,r){return _o(e,t,r)};r.copy=function(){return t(e)};return r}([0,1])},t.svg={},t.svg.arc=function(){var t=Io,e=Oo,r=zo,n=Po,i=Do,a=Ro,o=Bo;function s(){var s=Math.max(0,+t.apply(this,arguments)),c=Math.max(0,+e.apply(this,arguments)),u=i.apply(this,arguments)-Et,h=a.apply(this,arguments)-Et,f=Math.abs(h-u),p=u>h?0:1;if(c<s&&(d=c,c=s,s=d),f>=St)return l(c,p)+(s?l(s,1-p):"")+"Z";var d,g,m,v,y,x,b,_,w,k,M,A,T=0,S=0,E=[];if((v=(+o.apply(this,arguments)||0)/2)&&(m=n===Po?Math.sqrt(s*s+c*c):+n.apply(this,arguments),p||(S*=-1),c&&(S=Ot(m/c*Math.sin(v))),s&&(T=Ot(m/s*Math.sin(v)))),c){y=c*Math.cos(u+S),x=c*Math.sin(u+S),b=c*Math.cos(h-S),_=c*Math.sin(h-S);var C=Math.abs(h-u-2*S)<=At?0:1;if(S&&Fo(y,x,b,_)===p^C){var L=(u+h)/2;y=c*Math.cos(L),x=c*Math.sin(L),b=_=null}}else y=x=0;if(s){w=s*Math.cos(h-T),k=s*Math.sin(h-T),M=s*Math.cos(u+T),A=s*Math.sin(u+T);var z=Math.abs(u-h+2*T)<=At?0:1;if(T&&Fo(w,k,M,A)===1-p^z){var P=(u+h)/2;w=s*Math.cos(P),k=s*Math.sin(P),M=A=null}}else w=k=0;if(f>kt&&(d=Math.min(Math.abs(c-s)/2,+r.apply(this,arguments)))>.001){g=s<c^p?0:1;var I=d,O=d;if(f<At){var D=null==M?[w,k]:null==b?[y,x]:si([y,x],[M,A],[b,_],[w,k]),R=y-D[0],B=x-D[1],F=b-D[0],N=_-D[1],j=1/Math.sin(Math.acos((R*F+B*N)/(Math.sqrt(R*R+B*B)*Math.sqrt(F*F+N*N)))/2),V=Math.sqrt(D[0]*D[0]+D[1]*D[1]);O=Math.min(d,(s-V)/(j-1)),I=Math.min(d,(c-V)/(j+1))}if(null!=b){var U=No(null==M?[w,k]:[M,A],[y,x],c,I,p),q=No([b,_],[w,k],c,I,p);d===I?E.push("M",U[0],"A",I,",",I," 0 0,",g," ",U[1],"A",c,",",c," 0 ",1-p^Fo(U[1][0],U[1][1],q[1][0],q[1][1]),",",p," ",q[1],"A",I,",",I," 0 0,",g," ",q[0]):E.push("M",U[0],"A",I,",",I," 0 1,",g," ",q[0])}else E.push("M",y,",",x);if(null!=M){var H=No([y,x],[M,A],s,-O,p),G=No([w,k],null==b?[y,x]:[b,_],s,-O,p);d===O?E.push("L",G[0],"A",O,",",O," 0 0,",g," ",G[1],"A",s,",",s," 0 ",p^Fo(G[1][0],G[1][1],H[1][0],H[1][1]),",",1-p," ",H[1],"A",O,",",O," 0 0,",g," ",H[0]):E.push("L",G[0],"A",O,",",O," 0 0,",g," ",H[0])}else E.push("L",w,",",k)}else E.push("M",y,",",x),null!=b&&E.push("A",c,",",c," 0 ",C,",",p," ",b,",",_),E.push("L",w,",",k),null!=M&&E.push("A",s,",",s," 0 ",z,",",1-p," ",M,",",A);return E.push("Z"),E.join("")}function l(t,e){return"M0,"+t+"A"+t+","+t+" 0 1,"+e+" 0,"+-t+"A"+t+","+t+" 0 1,"+e+" 0,"+t}return s.innerRadius=function(e){return arguments.length?(t=me(e),s):t},s.outerRadius=function(t){return arguments.length?(e=me(t),s):e},s.cornerRadius=function(t){return arguments.length?(r=me(t),s):r},s.padRadius=function(t){return arguments.length?(n=t==Po?Po:me(t),s):n},s.startAngle=function(t){return arguments.length?(i=me(t),s):i},s.endAngle=function(t){return arguments.length?(a=me(t),s):a},s.padAngle=function(t){return arguments.length?(o=me(t),s):o},s.centroid=function(){var r=(+t.apply(this,arguments)+ +e.apply(this,arguments))/2,n=(+i.apply(this,arguments)+ +a.apply(this,arguments))/2-Et;return[Math.cos(n)*r,Math.sin(n)*r]},s};var Po="auto";function Io(t){return t.innerRadius}function Oo(t){return t.outerRadius}function Do(t){return t.startAngle}function Ro(t){return t.endAngle}function Bo(t){return t&&t.padAngle}function Fo(t,e,r,n){return(t-r)*e-(e-n)*t>0?0:1}function No(t,e,r,n,i){var a=t[0]-e[0],o=t[1]-e[1],s=(i?n:-n)/Math.sqrt(a*a+o*o),l=s*o,c=-s*a,u=t[0]+l,h=t[1]+c,f=e[0]+l,p=e[1]+c,d=(u+f)/2,g=(h+p)/2,m=f-u,v=p-h,y=m*m+v*v,x=r-n,b=u*p-f*h,_=(v<0?-1:1)*Math.sqrt(Math.max(0,x*x*y-b*b)),w=(b*v-m*_)/y,k=(-b*m-v*_)/y,M=(b*v+m*_)/y,A=(-b*m+v*_)/y,T=w-d,S=k-g,E=M-d,C=A-g;return T*T+S*S>E*E+C*C&&(w=M,k=A),[[w-l,k-c],[w*r/x,k*r/x]]}function jo(t){var e=ei,r=ri,n=Wr,i=Uo,a=i.key,o=.7;function s(a){var s,l=[],c=[],u=-1,h=a.length,f=me(e),p=me(r);function d(){l.push("M",i(t(c),o))}for(;++u<h;)n.call(this,s=a[u],u)?c.push([+f.call(this,s,u),+p.call(this,s,u)]):c.length&&(d(),c=[]);return c.length&&d(),l.length?l.join(""):null}return s.x=function(t){return arguments.length?(e=t,s):e},s.y=function(t){return arguments.length?(r=t,s):r},s.defined=function(t){return arguments.length?(n=t,s):n},s.interpolate=function(t){return arguments.length?(a="function"==typeof t?i=t:(i=Vo.get(t)||Uo).key,s):a},s.tension=function(t){return arguments.length?(o=t,s):o},s}t.svg.line=function(){return jo(z)};var Vo=t.map({linear:Uo,"linear-closed":qo,step:function(t){var e=0,r=t.length,n=t[0],i=[n[0],",",n[1]];for(;++e<r;)i.push("H",(n[0]+(n=t[e])[0])/2,"V",n[1]);r>1&&i.push("H",n[0]);return i.join("")},"step-before":Ho,"step-after":Go,basis:Xo,"basis-open":function(t){if(t.length<4)return Uo(t);var e,r=[],n=-1,i=t.length,a=[0],o=[0];for(;++n<3;)e=t[n],a.push(e[0]),o.push(e[1]);r.push(Zo(Ko,a)+","+Zo(Ko,o)),--n;for(;++n<i;)e=t[n],a.shift(),a.push(e[0]),o.shift(),o.push(e[1]),Qo(r,a,o);return r.join("")},"basis-closed":function(t){var e,r,n=-1,i=t.length,a=i+4,o=[],s=[];for(;++n<4;)r=t[n%i],o.push(r[0]),s.push(r[1]);e=[Zo(Ko,o),",",Zo(Ko,s)],--n;for(;++n<a;)r=t[n%i],o.shift(),o.push(r[0]),s.shift(),s.push(r[1]),Qo(e,o,s);return e.join("")},bundle:function(t,e){var r=t.length-1;if(r)for(var n,i,a=t[0][0],o=t[0][1],s=t[r][0]-a,l=t[r][1]-o,c=-1;++c<=r;)n=t[c],i=c/r,n[0]=e*n[0]+(1-e)*(a+i*s),n[1]=e*n[1]+(1-e)*(o+i*l);return Xo(t)},cardinal:function(t,e){return t.length<3?Uo(t):t[0]+Wo(t,Yo(t,e))},"cardinal-open":function(t,e){return t.length<4?Uo(t):t[1]+Wo(t.slice(1,-1),Yo(t,e))},"cardinal-closed":function(t,e){return t.length<3?qo(t):t[0]+Wo((t.push(t[0]),t),Yo([t[t.length-2]].concat(t,[t[1]]),e))},monotone:function(t){return t.length<3?Uo(t):t[0]+Wo(t,function(t){var e,r,n,i,a=[],o=function(t){var e=0,r=t.length-1,n=[],i=t[0],a=t[1],o=n[0]=ts(i,a);for(;++e<r;)n[e]=(o+(o=ts(i=a,a=t[e+1])))/2;return n[e]=o,n}(t),s=-1,l=t.length-1;for(;++s<l;)e=ts(t[s],t[s+1]),y(e)<kt?o[s]=o[s+1]=0:(r=o[s]/e,n=o[s+1]/e,(i=r*r+n*n)>9&&(i=3*e/Math.sqrt(i),o[s]=i*r,o[s+1]=i*n));s=-1;for(;++s<=l;)i=(t[Math.min(l,s+1)][0]-t[Math.max(0,s-1)][0])/(6*(1+o[s]*o[s])),a.push([i||0,o[s]*i||0]);return a}(t))}});function Uo(t){return t.length>1?t.join("L"):t+"Z"}function qo(t){return t.join("L")+"Z"}function Ho(t){for(var e=0,r=t.length,n=t[0],i=[n[0],",",n[1]];++e<r;)i.push("V",(n=t[e])[1],"H",n[0]);return i.join("")}function Go(t){for(var e=0,r=t.length,n=t[0],i=[n[0],",",n[1]];++e<r;)i.push("H",(n=t[e])[0],"V",n[1]);return i.join("")}function Wo(t,e){if(e.length<1||t.length!=e.length&&t.length!=e.length+2)return Uo(t);var r=t.length!=e.length,n="",i=t[0],a=t[1],o=e[0],s=o,l=1;if(r&&(n+="Q"+(a[0]-2*o[0]/3)+","+(a[1]-2*o[1]/3)+","+a[0]+","+a[1],i=t[1],l=2),e.length>1){s=e[1],a=t[l],l++,n+="C"+(i[0]+o[0])+","+(i[1]+o[1])+","+(a[0]-s[0])+","+(a[1]-s[1])+","+a[0]+","+a[1];for(var c=2;c<e.length;c++,l++)a=t[l],s=e[c],n+="S"+(a[0]-s[0])+","+(a[1]-s[1])+","+a[0]+","+a[1]}if(r){var u=t[l];n+="Q"+(a[0]+2*s[0]/3)+","+(a[1]+2*s[1]/3)+","+u[0]+","+u[1]}return n}function Yo(t,e){for(var r,n=[],i=(1-e)/2,a=t[0],o=t[1],s=1,l=t.length;++s<l;)r=a,a=o,o=t[s],n.push([i*(o[0]-r[0]),i*(o[1]-r[1])]);return n}function Xo(t){if(t.length<3)return Uo(t);var e=1,r=t.length,n=t[0],i=n[0],a=n[1],o=[i,i,i,(n=t[1])[0]],s=[a,a,a,n[1]],l=[i,",",a,"L",Zo(Ko,o),",",Zo(Ko,s)];for(t.push(t[r-1]);++e<=r;)n=t[e],o.shift(),o.push(n[0]),s.shift(),s.push(n[1]),Qo(l,o,s);return t.pop(),l.push("L",n),l.join("")}function Zo(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}Vo.forEach(function(t,e){e.key=t,e.closed=/-closed$/.test(t)});var $o=[0,2/3,1/3,0],Jo=[0,1/3,2/3,0],Ko=[0,1/6,2/3,1/6];function Qo(t,e,r){t.push("C",Zo($o,e),",",Zo($o,r),",",Zo(Jo,e),",",Zo(Jo,r),",",Zo(Ko,e),",",Zo(Ko,r))}function ts(t,e){return(e[1]-t[1])/(e[0]-t[0])}function es(t){for(var e,r,n,i=-1,a=t.length;++i<a;)r=(e=t[i])[0],n=e[1]-Et,e[0]=r*Math.cos(n),e[1]=r*Math.sin(n);return t}function rs(t){var e=ei,r=ei,n=0,i=ri,a=Wr,o=Uo,s=o.key,l=o,c="L",u=.7;function h(s){var h,f,p,d=[],g=[],m=[],v=-1,y=s.length,x=me(e),b=me(n),_=e===r?function(){return f}:me(r),w=n===i?function(){return p}:me(i);function k(){d.push("M",o(t(m),u),c,l(t(g.reverse()),u),"Z")}for(;++v<y;)a.call(this,h=s[v],v)?(g.push([f=+x.call(this,h,v),p=+b.call(this,h,v)]),m.push([+_.call(this,h,v),+w.call(this,h,v)])):g.length&&(k(),g=[],m=[]);return g.length&&k(),d.length?d.join(""):null}return h.x=function(t){return arguments.length?(e=r=t,h):r},h.x0=function(t){return arguments.length?(e=t,h):e},h.x1=function(t){return arguments.length?(r=t,h):r},h.y=function(t){return arguments.length?(n=i=t,h):i},h.y0=function(t){return arguments.length?(n=t,h):n},h.y1=function(t){return arguments.length?(i=t,h):i},h.defined=function(t){return arguments.length?(a=t,h):a},h.interpolate=function(t){return arguments.length?(s="function"==typeof t?o=t:(o=Vo.get(t)||Uo).key,l=o.reverse||o,c=o.closed?"M":"L",h):s},h.tension=function(t){return arguments.length?(u=t,h):u},h}function ns(t){return t.radius}function is(t){return[t.x,t.y]}function as(){return 64}function os(){return"circle"}function ss(t){var e=Math.sqrt(t/At);return"M0,"+e+"A"+e+","+e+" 0 1,1 0,"+-e+"A"+e+","+e+" 0 1,1 0,"+e+"Z"}t.svg.line.radial=function(){var t=jo(es);return t.radius=t.x,delete t.x,t.angle=t.y,delete t.y,t},Ho.reverse=Go,Go.reverse=Ho,t.svg.area=function(){return rs(z)},t.svg.area.radial=function(){var t=rs(es);return t.radius=t.x,delete t.x,t.innerRadius=t.x0,delete t.x0,t.outerRadius=t.x1,delete t.x1,t.angle=t.y,delete t.y,t.startAngle=t.y0,delete t.y0,t.endAngle=t.y1,delete t.y1,t},t.svg.chord=function(){var t=Vn,e=Un,r=ns,n=Do,i=Ro;function a(r,n){var i,a,c=o(this,t,r,n),u=o(this,e,r,n);return"M"+c.p0+s(c.r,c.p1,c.a1-c.a0)+(a=u,(i=c).a0==a.a0&&i.a1==a.a1?l(c.r,c.p1,c.r,c.p0):l(c.r,c.p1,u.r,u.p0)+s(u.r,u.p1,u.a1-u.a0)+l(u.r,u.p1,c.r,c.p0))+"Z"}function o(t,e,a,o){var s=e.call(t,a,o),l=r.call(t,s,o),c=n.call(t,s,o)-Et,u=i.call(t,s,o)-Et;return{r:l,a0:c,a1:u,p0:[l*Math.cos(c),l*Math.sin(c)],p1:[l*Math.cos(u),l*Math.sin(u)]}}function s(t,e,r){return"A"+t+","+t+" 0 "+ +(r>At)+",1 "+e}function l(t,e,r,n){return"Q 0,0 "+n}return a.radius=function(t){return arguments.length?(r=me(t),a):r},a.source=function(e){return arguments.length?(t=me(e),a):t},a.target=function(t){return arguments.length?(e=me(t),a):e},a.startAngle=function(t){return arguments.length?(n=me(t),a):n},a.endAngle=function(t){return arguments.length?(i=me(t),a):i},a},t.svg.diagonal=function(){var t=Vn,e=Un,r=is;function n(n,i){var a=t.call(this,n,i),o=e.call(this,n,i),s=(a.y+o.y)/2,l=[a,{x:a.x,y:s},{x:o.x,y:s},o];return"M"+(l=l.map(r))[0]+"C"+l[1]+" "+l[2]+" "+l[3]}return n.source=function(e){return arguments.length?(t=me(e),n):t},n.target=function(t){return arguments.length?(e=me(t),n):e},n.projection=function(t){return arguments.length?(r=t,n):r},n},t.svg.diagonal.radial=function(){var e=t.svg.diagonal(),r=is,n=e.projection;return e.projection=function(t){return arguments.length?n(function(t){return function(){var e=t.apply(this,arguments),r=e[0],n=e[1]-Et;return[r*Math.cos(n),r*Math.sin(n)]}}(r=t)):r},e},t.svg.symbol=function(){var t=os,e=as;function r(r,n){return(ls.get(t.call(this,r,n))||ss)(e.call(this,r,n))}return r.type=function(e){return arguments.length?(t=me(e),r):t},r.size=function(t){return arguments.length?(e=me(t),r):e},r};var ls=t.map({circle:ss,cross:function(t){var e=Math.sqrt(t/5)/2;return"M"+-3*e+","+-e+"H"+-e+"V"+-3*e+"H"+e+"V"+-e+"H"+3*e+"V"+e+"H"+e+"V"+3*e+"H"+-e+"V"+e+"H"+-3*e+"Z"},diamond:function(t){var e=Math.sqrt(t/(2*us)),r=e*us;return"M0,"+-e+"L"+r+",0 0,"+e+" "+-r+",0Z"},square:function(t){var e=Math.sqrt(t)/2;return"M"+-e+","+-e+"L"+e+","+-e+" "+e+","+e+" "+-e+","+e+"Z"},"triangle-down":function(t){var e=Math.sqrt(t/cs),r=e*cs/2;return"M0,"+r+"L"+e+","+-r+" "+-e+","+-r+"Z"},"triangle-up":function(t){var e=Math.sqrt(t/cs),r=e*cs/2;return"M0,"+-r+"L"+e+","+r+" "+-e+","+r+"Z"}});t.svg.symbolTypes=ls.keys();var cs=Math.sqrt(3),us=Math.tan(30*Ct);Y.transition=function(t){for(var e,r,n=ds||++vs,i=bs(t),a=[],o=gs||{time:Date.now(),ease:ia,delay:0,duration:250},s=-1,l=this.length;++s<l;){a.push(e=[]);for(var c=this[s],u=-1,h=c.length;++u<h;)(r=c[u])&&_s(r,u,i,n,o),e.push(r)}return ps(a,i,n)},Y.interrupt=function(t){return this.each(null==t?hs:fs(bs(t)))};var hs=fs(bs());function fs(t){return function(){var e,r,n;(e=this[t])&&(n=e[r=e.active])&&(n.timer.c=null,n.timer.t=NaN,--e.count?delete e[r]:delete this[t],e.active+=.5,n.event&&n.event.interrupt.call(this,this.__data__,n.index))}}function ps(t,e,r){return U(t,ms),t.namespace=e,t.id=r,t}var ds,gs,ms=[],vs=0;function ys(t,e,r,n){var i=t.id,a=t.namespace;return ut(t,"function"==typeof r?function(t,o,s){t[a][i].tween.set(e,n(r.call(t,t.__data__,o,s)))}:(r=n(r),function(t){t[a][i].tween.set(e,r)}))}function xs(t){return null==t&&(t=""),function(){this.textContent=t}}function bs(t){return null==t?"__transition__":"__transition_"+t+"__"}function _s(t,e,r,n,i){var a,o,s,l,c,u=t[r]||(t[r]={active:0,count:0}),h=u[n];function f(r){var i=u.active,f=u[i];for(var d in f&&(f.timer.c=null,f.timer.t=NaN,--u.count,delete u[i],f.event&&f.event.interrupt.call(t,t.__data__,f.index)),u)if(+d<n){var g=u[d];g.timer.c=null,g.timer.t=NaN,--u.count,delete u[d]}o.c=p,Me(function(){return o.c&&p(r||1)&&(o.c=null,o.t=NaN),1},0,a),u.active=n,h.event&&h.event.start.call(t,t.__data__,e),c=[],h.tween.forEach(function(r,n){(n=n.call(t,t.__data__,e))&&c.push(n)}),l=h.ease,s=h.duration}function p(i){for(var a=i/s,o=l(a),f=c.length;f>0;)c[--f].call(t,o);if(a>=1)return h.event&&h.event.end.call(t,t.__data__,e),--u.count?delete u[n]:delete t[r],1}h||(a=i.time,o=Me(function(t){var e=h.delay;if(o.t=e+a,e<=t)return f(t-e);o.c=f},0,a),h=u[n]={tween:new b,time:a,timer:o,delay:i.delay,duration:i.duration,ease:i.ease,index:e},i=null,++u.count)}ms.call=Y.call,ms.empty=Y.empty,ms.node=Y.node,ms.size=Y.size,t.transition=function(e,r){return e&&e.transition?ds?e.transition(r):e:t.selection().transition(e)},t.transition.prototype=ms,ms.select=function(t){var e,r,n,i=this.id,a=this.namespace,o=[];t=X(t);for(var s=-1,l=this.length;++s<l;){o.push(e=[]);for(var c=this[s],u=-1,h=c.length;++u<h;)(n=c[u])&&(r=t.call(n,n.__data__,u,s))?("__data__"in n&&(r.__data__=n.__data__),_s(r,u,a,i,n[a][i]),e.push(r)):e.push(null)}return ps(o,a,i)},ms.selectAll=function(t){var e,r,n,i,a,o=this.id,s=this.namespace,l=[];t=Z(t);for(var c=-1,u=this.length;++c<u;)for(var h=this[c],f=-1,p=h.length;++f<p;)if(n=h[f]){a=n[s][o],r=t.call(n,n.__data__,f,c),l.push(e=[]);for(var d=-1,g=r.length;++d<g;)(i=r[d])&&_s(i,d,s,o,a),e.push(i)}return ps(l,s,o)},ms.filter=function(t){var e,r,n=[];"function"!=typeof t&&(t=ct(t));for(var i=0,a=this.length;i<a;i++){n.push(e=[]);for(var o,s=0,l=(o=this[i]).length;s<l;s++)(r=o[s])&&t.call(r,r.__data__,s,i)&&e.push(r)}return ps(n,this.namespace,this.id)},ms.tween=function(t,e){var r=this.id,n=this.namespace;return arguments.length<2?this.node()[n][r].tween.get(t):ut(this,null==e?function(e){e[n][r].tween.remove(t)}:function(i){i[n][r].tween.set(t,e)})},ms.attr=function(e,r){if(arguments.length<2){for(r in e)this.attr(r,e[r]);return this}var n="transform"==e?ga:Zi,i=t.ns.qualify(e);function a(){this.removeAttribute(i)}function o(){this.removeAttributeNS(i.space,i.local)}return ys(this,"attr."+e,r,i.local?function(t){return null==t?o:(t+="",function(){var e,r=this.getAttributeNS(i.space,i.local);return r!==t&&(e=n(r,t),function(t){this.setAttributeNS(i.space,i.local,e(t))})})}:function(t){return null==t?a:(t+="",function(){var e,r=this.getAttribute(i);return r!==t&&(e=n(r,t),function(t){this.setAttribute(i,e(t))})})})},ms.attrTween=function(e,r){var n=t.ns.qualify(e);return this.tween("attr."+e,n.local?function(t,e){var i=r.call(this,t,e,this.getAttributeNS(n.space,n.local));return i&&function(t){this.setAttributeNS(n.space,n.local,i(t))}}:function(t,e){var i=r.call(this,t,e,this.getAttribute(n));return i&&function(t){this.setAttribute(n,i(t))}})},ms.style=function(t,e,r){var n=arguments.length;if(n<3){if("string"!=typeof t){for(r in n<2&&(e=""),t)this.style(r,t[r],e);return this}r=""}function i(){this.style.removeProperty(t)}return ys(this,"style."+t,e,function(e){return null==e?i:(e+="",function(){var n,i=o(this).getComputedStyle(this,null).getPropertyValue(t);return i!==e&&(n=Zi(i,e),function(e){this.style.setProperty(t,n(e),r)})})})},ms.styleTween=function(t,e,r){return arguments.length<3&&(r=""),this.tween("style."+t,function(n,i){var a=e.call(this,n,i,o(this).getComputedStyle(this,null).getPropertyValue(t));return a&&function(e){this.style.setProperty(t,a(e),r)}})},ms.text=function(t){return ys(this,"text",t,xs)},ms.remove=function(){var t=this.namespace;return this.each("end.transition",function(){var e;this[t].count<2&&(e=this.parentNode)&&e.removeChild(this)})},ms.ease=function(e){var r=this.id,n=this.namespace;return arguments.length<1?this.node()[n][r].ease:("function"!=typeof e&&(e=t.ease.apply(t,arguments)),ut(this,function(t){t[n][r].ease=e}))},ms.delay=function(t){var e=this.id,r=this.namespace;return arguments.length<1?this.node()[r][e].delay:ut(this,"function"==typeof t?function(n,i,a){n[r][e].delay=+t.call(n,n.__data__,i,a)}:(t=+t,function(n){n[r][e].delay=t}))},ms.duration=function(t){var e=this.id,r=this.namespace;return arguments.length<1?this.node()[r][e].duration:ut(this,"function"==typeof t?function(n,i,a){n[r][e].duration=Math.max(1,t.call(n,n.__data__,i,a))}:(t=Math.max(1,t),function(n){n[r][e].duration=t}))},ms.each=function(e,r){var n=this.id,i=this.namespace;if(arguments.length<2){var a=gs,o=ds;try{ds=n,ut(this,function(t,r,a){gs=t[i][n],e.call(t,t.__data__,r,a)})}finally{gs=a,ds=o}}else ut(this,function(a){var o=a[i][n];(o.event||(o.event=t.dispatch("start","end","interrupt"))).on(e,r)});return this},ms.transition=function(){for(var t,e,r,n=this.id,i=++vs,a=this.namespace,o=[],s=0,l=this.length;s<l;s++){o.push(t=[]);for(var c,u=0,h=(c=this[s]).length;u<h;u++)(e=c[u])&&_s(e,u,a,i,{time:(r=e[a][n]).time,ease:r.ease,delay:r.delay+r.duration,duration:r.duration}),t.push(e)}return ps(o,a,i)},t.svg.axis=function(){var e,r=t.scale.linear(),i=ws,a=6,o=6,s=3,l=[10],c=null;function u(n){n.each(function(){var n,u=t.select(this),h=this.__chart__||r,f=this.__chart__=r.copy(),p=null==c?f.ticks?f.ticks.apply(f,l):f.domain():c,d=null==e?f.tickFormat?f.tickFormat.apply(f,l):z:e,g=u.selectAll(".tick").data(p,f),m=g.enter().insert("g",".domain").attr("class","tick").style("opacity",kt),v=t.transition(g.exit()).style("opacity",kt).remove(),y=t.transition(g.order()).style("opacity",1),x=Math.max(a,0)+s,b=uo(f),_=u.selectAll(".domain").data([0]),w=(_.enter().append("path").attr("class","domain"),t.transition(_));m.append("line"),m.append("text");var k,M,A,T,S=m.select("line"),E=y.select("line"),C=g.select("text").text(d),L=m.select("text"),P=y.select("text"),I="top"===i||"left"===i?-1:1;if("bottom"===i||"top"===i?(n=Ms,k="x",A="y",M="x2",T="y2",C.attr("dy",I<0?"0em":".71em").style("text-anchor","middle"),w.attr("d","M"+b[0]+","+I*o+"V0H"+b[1]+"V"+I*o)):(n=As,k="y",A="x",M="y2",T="x2",C.attr("dy",".32em").style("text-anchor",I<0?"end":"start"),w.attr("d","M"+I*o+","+b[0]+"H0V"+b[1]+"H"+I*o)),S.attr(T,I*a),L.attr(A,I*x),E.attr(M,0).attr(T,I*a),P.attr(k,0).attr(A,I*x),f.rangeBand){var O=f,D=O.rangeBand()/2;h=f=function(t){return O(t)+D}}else h.rangeBand?h=f:v.call(n,f,h);m.call(n,h,f),y.call(n,f,f)})}return u.scale=function(t){return arguments.length?(r=t,u):r},u.orient=function(t){return arguments.length?(i=t in ks?t+"":ws,u):i},u.ticks=function(){return arguments.length?(l=n(arguments),u):l},u.tickValues=function(t){return arguments.length?(c=t,u):c},u.tickFormat=function(t){return arguments.length?(e=t,u):e},u.tickSize=function(t){var e=arguments.length;return e?(a=+t,o=+arguments[e-1],u):a},u.innerTickSize=function(t){return arguments.length?(a=+t,u):a},u.outerTickSize=function(t){return arguments.length?(o=+t,u):o},u.tickPadding=function(t){return arguments.length?(s=+t,u):s},u.tickSubdivide=function(){return arguments.length&&u},u};var ws="bottom",ks={top:1,right:1,bottom:1,left:1};function Ms(t,e,r){t.attr("transform",function(t){var n=e(t);return"translate("+(isFinite(n)?n:r(t))+",0)"})}function As(t,e,r){t.attr("transform",function(t){var n=e(t);return"translate(0,"+(isFinite(n)?n:r(t))+")"})}t.svg.brush=function(){var e,r,n=j(f,"brushstart","brush","brushend"),i=null,a=null,s=[0,0],l=[0,0],c=!0,u=!0,h=Ss[0];function f(e){e.each(function(){var e=t.select(this).style("pointer-events","all").style("-webkit-tap-highlight-color","rgba(0,0,0,0)").on("mousedown.brush",m).on("touchstart.brush",m),r=e.selectAll(".background").data([0]);r.enter().append("rect").attr("class","background").style("visibility","hidden").style("cursor","crosshair"),e.selectAll(".extent").data([0]).enter().append("rect").attr("class","extent").style("cursor","move");var n=e.selectAll(".resize").data(h,z);n.exit().remove(),n.enter().append("g").attr("class",function(t){return"resize "+t}).style("cursor",function(t){return Ts[t]}).append("rect").attr("x",function(t){return/[ew]$/.test(t)?-3:null}).attr("y",function(t){return/^[ns]/.test(t)?-3:null}).attr("width",6).attr("height",6).style("visibility","hidden"),n.style("display",f.empty()?"none":null);var o,s=t.transition(e),l=t.transition(r);i&&(o=uo(i),l.attr("x",o[0]).attr("width",o[1]-o[0]),d(s)),a&&(o=uo(a),l.attr("y",o[0]).attr("height",o[1]-o[0]),g(s)),p(s)})}function p(t){t.selectAll(".resize").attr("transform",function(t){return"translate("+s[+/e$/.test(t)]+","+l[+/^s/.test(t)]+")"})}function d(t){t.select(".extent").attr("x",s[0]),t.selectAll(".extent,.n>rect,.s>rect").attr("width",s[1]-s[0])}function g(t){t.select(".extent").attr("y",l[0]),t.selectAll(".extent,.e>rect,.w>rect").attr("height",l[1]-l[0])}function m(){var h,m,v=this,y=t.select(t.event.target),x=n.of(v,arguments),b=t.select(v),_=y.datum(),w=!/^(n|s)$/.test(_)&&i,k=!/^(e|w)$/.test(_)&&a,M=y.classed("extent"),A=xt(v),T=t.mouse(v),S=t.select(o(v)).on("keydown.brush",function(){32==t.event.keyCode&&(M||(h=null,T[0]-=s[1],T[1]-=l[1],M=2),F())}).on("keyup.brush",function(){32==t.event.keyCode&&2==M&&(T[0]+=s[1],T[1]+=l[1],M=0,F())});if(t.event.changedTouches?S.on("touchmove.brush",L).on("touchend.brush",P):S.on("mousemove.brush",L).on("mouseup.brush",P),b.interrupt().selectAll("*").interrupt(),M)T[0]=s[0]-T[0],T[1]=l[0]-T[1];else if(_){var E=+/w$/.test(_),C=+/^n/.test(_);m=[s[1-E]-T[0],l[1-C]-T[1]],T[0]=s[E],T[1]=l[C]}else t.event.altKey&&(h=T.slice());function L(){var e=t.mouse(v),r=!1;m&&(e[0]+=m[0],e[1]+=m[1]),M||(t.event.altKey?(h||(h=[(s[0]+s[1])/2,(l[0]+l[1])/2]),T[0]=s[+(e[0]<h[0])],T[1]=l[+(e[1]<h[1])]):h=null),w&&z(e,i,0)&&(d(b),r=!0),k&&z(e,a,1)&&(g(b),r=!0),r&&(p(b),x({type:"brush",mode:M?"move":"resize"}))}function z(t,n,i){var a,o,f=uo(n),p=f[0],d=f[1],g=T[i],m=i?l:s,v=m[1]-m[0];if(M&&(p-=g,d-=v+g),a=(i?u:c)?Math.max(p,Math.min(d,t[i])):t[i],M?o=(a+=g)+v:(h&&(g=Math.max(p,Math.min(d,2*h[i]-a))),g<a?(o=a,a=g):o=g),m[0]!=a||m[1]!=o)return i?r=null:e=null,m[0]=a,m[1]=o,!0}function P(){L(),b.style("pointer-events","all").selectAll(".resize").style("display",f.empty()?"none":null),t.select("body").style("cursor",null),S.on("mousemove.brush",null).on("mouseup.brush",null).on("touchmove.brush",null).on("touchend.brush",null).on("keydown.brush",null).on("keyup.brush",null),A(),x({type:"brushend"})}b.style("pointer-events","none").selectAll(".resize").style("display",null),t.select("body").style("cursor",y.style("cursor")),x({type:"brushstart"}),L()}return f.event=function(i){i.each(function(){var i=n.of(this,arguments),a={x:s,y:l,i:e,j:r},o=this.__chart__||a;this.__chart__=a,ds?t.select(this).transition().each("start.brush",function(){e=o.i,r=o.j,s=o.x,l=o.y,i({type:"brushstart"})}).tween("brush:brush",function(){var t=$i(s,a.x),n=$i(l,a.y);return e=r=null,function(e){s=a.x=t(e),l=a.y=n(e),i({type:"brush",mode:"resize"})}}).each("end.brush",function(){e=a.i,r=a.j,i({type:"brush",mode:"resize"}),i({type:"brushend"})}):(i({type:"brushstart"}),i({type:"brush",mode:"resize"}),i({type:"brushend"}))})},f.x=function(t){return arguments.length?(h=Ss[!(i=t)<<1|!a],f):i},f.y=function(t){return arguments.length?(h=Ss[!i<<1|!(a=t)],f):a},f.clamp=function(t){return arguments.length?(i&&a?(c=!!t[0],u=!!t[1]):i?c=!!t:a&&(u=!!t),f):i&&a?[c,u]:i?c:a?u:null},f.extent=function(t){var n,o,c,u,h;return arguments.length?(i&&(n=t[0],o=t[1],a&&(n=n[0],o=o[0]),e=[n,o],i.invert&&(n=i(n),o=i(o)),o<n&&(h=n,n=o,o=h),n==s[0]&&o==s[1]||(s=[n,o])),a&&(c=t[0],u=t[1],i&&(c=c[1],u=u[1]),r=[c,u],a.invert&&(c=a(c),u=a(u)),u<c&&(h=c,c=u,u=h),c==l[0]&&u==l[1]||(l=[c,u])),f):(i&&(e?(n=e[0],o=e[1]):(n=s[0],o=s[1],i.invert&&(n=i.invert(n),o=i.invert(o)),o<n&&(h=n,n=o,o=h))),a&&(r?(c=r[0],u=r[1]):(c=l[0],u=l[1],a.invert&&(c=a.invert(c),u=a.invert(u)),u<c&&(h=c,c=u,u=h))),i&&a?[[n,c],[o,u]]:i?[n,o]:a&&[c,u])},f.clear=function(){return f.empty()||(s=[0,0],l=[0,0],e=r=null),f},f.empty=function(){return!!i&&s[0]==s[1]||!!a&&l[0]==l[1]},t.rebind(f,n,"on")};var Ts={n:"ns-resize",e:"ew-resize",s:"ns-resize",w:"ew-resize",nw:"nwse-resize",ne:"nesw-resize",se:"nwse-resize",sw:"nesw-resize"},Ss=[["n","e","s","w","nw","ne","se","sw"],["e","w"],["n","s"],[]],Es=Ie.format=sr.timeFormat,Cs=Es.utc,Ls=Cs("%Y-%m-%dT%H:%M:%S.%LZ");function zs(t){return t.toISOString()}function Ps(e,r,n){function i(t){return e(t)}function a(e,n){var i=(e[1]-e[0])/n,a=t.bisect(Os,i);return a==Os.length?[r.year,xo(e.map(function(t){return t/31536e6}),n)[2]]:a?r[i/Os[a-1]<Os[a]/i?a-1:a]:[Bs,xo(e,n)[2]]}return i.invert=function(t){return Is(e.invert(t))},i.domain=function(t){return arguments.length?(e.domain(t),i):e.domain().map(Is)},i.nice=function(t,e){var r=i.domain(),n=co(r),o=null==t?a(n,10):"number"==typeof t&&a(n,t);function s(r){return!isNaN(r)&&!t.range(r,Is(+r+1),e).length}return o&&(t=o[0],e=o[1]),i.domain(fo(r,e>1?{floor:function(e){for(;s(e=t.floor(e));)e=Is(e-1);return e},ceil:function(e){for(;s(e=t.ceil(e));)e=Is(+e+1);return e}}:t))},i.ticks=function(t,e){var r=co(i.domain()),n=null==t?a(r,10):"number"==typeof t?a(r,t):!t.range&&[{range:t},e];return n&&(t=n[0],e=n[1]),t.range(r[0],Is(+r[1]+1),e<1?1:e)},i.tickFormat=function(){return n},i.copy=function(){return Ps(e.copy(),r,n)},vo(i,e)}function Is(t){return new Date(t)}Es.iso=Date.prototype.toISOString&&+new Date("2000-01-01T00:00:00.000Z")?zs:Ls,zs.parse=function(t){var e=new Date(t);return isNaN(e)?null:e},zs.toString=Ls.toString,Ie.second=Be(function(t){return new Oe(1e3*Math.floor(t/1e3))},function(t,e){t.setTime(t.getTime()+1e3*Math.floor(e))},function(t){return t.getSeconds()}),Ie.seconds=Ie.second.range,Ie.seconds.utc=Ie.second.utc.range,Ie.minute=Be(function(t){return new Oe(6e4*Math.floor(t/6e4))},function(t,e){t.setTime(t.getTime()+6e4*Math.floor(e))},function(t){return t.getMinutes()}),Ie.minutes=Ie.minute.range,Ie.minutes.utc=Ie.minute.utc.range,Ie.hour=Be(function(t){var e=t.getTimezoneOffset()/60;return new Oe(36e5*(Math.floor(t/36e5-e)+e))},function(t,e){t.setTime(t.getTime()+36e5*Math.floor(e))},function(t){return t.getHours()}),Ie.hours=Ie.hour.range,Ie.hours.utc=Ie.hour.utc.range,Ie.month=Be(function(t){return(t=Ie.day(t)).setDate(1),t},function(t,e){t.setMonth(t.getMonth()+e)},function(t){return t.getMonth()}),Ie.months=Ie.month.range,Ie.months.utc=Ie.month.utc.range;var Os=[1e3,5e3,15e3,3e4,6e4,3e5,9e5,18e5,36e5,108e5,216e5,432e5,864e5,1728e5,6048e5,2592e6,7776e6,31536e6],Ds=[[Ie.second,1],[Ie.second,5],[Ie.second,15],[Ie.second,30],[Ie.minute,1],[Ie.minute,5],[Ie.minute,15],[Ie.minute,30],[Ie.hour,1],[Ie.hour,3],[Ie.hour,6],[Ie.hour,12],[Ie.day,1],[Ie.day,2],[Ie.week,1],[Ie.month,1],[Ie.month,3],[Ie.year,1]],Rs=Es.multi([[".%L",function(t){return t.getMilliseconds()}],[":%S",function(t){return t.getSeconds()}],["%I:%M",function(t){return t.getMinutes()}],["%I %p",function(t){return t.getHours()}],["%a %d",function(t){return t.getDay()&&1!=t.getDate()}],["%b %d",function(t){return 1!=t.getDate()}],["%B",function(t){return t.getMonth()}],["%Y",Wr]]),Bs={range:function(e,r,n){return t.range(Math.ceil(e/n)*n,+r,n).map(Is)},floor:z,ceil:z};Ds.year=Ie.year,Ie.scale=function(){return Ps(t.scale.linear(),Ds,Rs)};var Fs=Ds.map(function(t){return[t[0].utc,t[1]]}),Ns=Cs.multi([[".%L",function(t){return t.getUTCMilliseconds()}],[":%S",function(t){return t.getUTCSeconds()}],["%I:%M",function(t){return t.getUTCMinutes()}],["%I %p",function(t){return t.getUTCHours()}],["%a %d",function(t){return t.getUTCDay()&&1!=t.getUTCDate()}],["%b %d",function(t){return 1!=t.getUTCDate()}],["%B",function(t){return t.getUTCMonth()}],["%Y",Wr]]);function js(t){return JSON.parse(t.responseText)}function Vs(t){var e=i.createRange();return e.selectNode(i.body),e.createContextualFragment(t.responseText)}Fs.year=Ie.year.utc,Ie.scale.utc=function(){return Ps(t.scale.linear(),Fs,Ns)},t.text=ve(function(t){return t.responseText}),t.json=function(t,e){return ye(t,"application/json",js,e)},t.html=function(t,e){return ye(t,"text/html",Vs,e)},t.xml=ve(function(t){return t.responseXML}),"object"==typeof e&&e.exports?e.exports=t:this.d3=t}()},{}],148:[function(t,e,r){e.exports=function(){for(var t=0;t<arguments.length;t++)if(void 0!==arguments[t])return arguments[t]}},{}],149:[function(t,e,r){"use strict";var n=t("incremental-convex-hull"),i=t("uniq");function a(t,e){this.point=t,this.index=e}function o(t,e){for(var r=t.point,n=e.point,i=r.length,a=0;a<i;++a){var o=n[a]-r[a];if(o)return o}return 0}e.exports=function(t,e){var r=t.length;if(0===r)return[];var s=t[0].length;if(s<1)return[];if(1===s)return function(t,e,r){if(1===t)return r?[[-1,0]]:[];var n=e.map(function(t,e){return[t[0],e]});n.sort(function(t,e){return t[0]-e[0]});for(var i=new Array(t-1),a=1;a<t;++a){var o=n[a-1],s=n[a];i[a-1]=[o[1],s[1]]}r&&i.push([-1,i[0][1]],[i[t-1][1],-1]);return i}(r,t,e);for(var l=new Array(r),c=1,u=0;u<r;++u){for(var h=t[u],f=new Array(s+1),p=0,d=0;d<s;++d){var g=h[d];f[d]=g,p+=g*g}f[s]=p,l[u]=new a(f,u),c=Math.max(p,c)}i(l,o),r=l.length;for(var m=new Array(r+s+1),v=new Array(r+s+1),y=(s+1)*(s+1)*c,x=new Array(s+1),u=0;u<=s;++u)x[u]=0;x[s]=y,m[0]=x.slice(),v[0]=-1;for(var u=0;u<=s;++u){var f=x.slice();f[u]=1,m[u+1]=f,v[u+1]=-1}for(var u=0;u<r;++u){var b=l[u];m[u+s+1]=b.point,v[u+s+1]=b.index}var _=n(m,!1);_=e?_.filter(function(t){for(var e=0,r=0;r<=s;++r){var n=v[t[r]];if(n<0&&++e>=2)return!1;t[r]=n}return!0}):_.filter(function(t){for(var e=0;e<=s;++e){var r=v[t[e]];if(r<0)return!1;t[e]=r}return!0});if(1&s)for(var u=0;u<_.length;++u){var b=_[u],f=b[0];b[0]=b[1],b[1]=f}return _}},{"incremental-convex-hull":381,uniq:509}],150:[function(t,e,r){"use strict";e.exports=a;var n=(a.canvas=document.createElement("canvas")).getContext("2d"),i=o([32,126]);function a(t,e){Array.isArray(t)&&(t=t.join(", "));var r,a={},s=16,l=.05;e&&(2===e.length&&"number"==typeof e[0]?r=o(e):Array.isArray(e)?r=e:(e.o?r=o(e.o):e.pairs&&(r=e.pairs),e.fontSize&&(s=e.fontSize),null!=e.threshold&&(l=e.threshold))),r||(r=i),n.font=s+"px "+t;for(var c=0;c<r.length;c++){var u=r[c],h=n.measureText(u[0]).width+n.measureText(u[1]).width,f=n.measureText(u).width;if(Math.abs(h-f)>s*l){var p=(f-h)/s;a[u]=1e3*p}}return a}function o(t){for(var e=[],r=t[0];r<=t[1];r++)for(var n=String.fromCharCode(r),i=t[0];i<t[1];i++){var a=n+String.fromCharCode(i);e.push(a)}return e}a.createPairs=o,a.ascii=i},{}],151:[function(t,e,r){(function(t){var r=!1;if("undefined"!=typeof Float64Array){var n=new Float64Array(1),i=new Uint32Array(n.buffer);if(n[0]=1,r=!0,1072693248===i[1]){e.exports=function(t){return n[0]=t,[i[0],i[1]]},e.exports.pack=function(t,e){return i[0]=t,i[1]=e,n[0]},e.exports.lo=function(t){return n[0]=t,i[0]},e.exports.hi=function(t){return n[0]=t,i[1]}}else if(1072693248===i[0]){e.exports=function(t){return n[0]=t,[i[1],i[0]]},e.exports.pack=function(t,e){return i[1]=t,i[0]=e,n[0]},e.exports.lo=function(t){return n[0]=t,i[1]},e.exports.hi=function(t){return n[0]=t,i[0]}}else r=!1}if(!r){var a=new t(8);e.exports=function(t){return a.writeDoubleLE(t,0,!0),[a.readUInt32LE(0,!0),a.readUInt32LE(4,!0)]},e.exports.pack=function(t,e){return a.writeUInt32LE(t,0,!0),a.writeUInt32LE(e,4,!0),a.readDoubleLE(0,!0)},e.exports.lo=function(t){return a.writeDoubleLE(t,0,!0),a.readUInt32LE(0,!0)},e.exports.hi=function(t){return a.writeDoubleLE(t,0,!0),a.readUInt32LE(4,!0)}}e.exports.sign=function(t){return e.exports.hi(t)>>>31},e.exports.exponent=function(t){return(e.exports.hi(t)<<1>>>21)-1023},e.exports.fraction=function(t){var r=e.exports.lo(t),n=e.exports.hi(t),i=1048575&n;return 2146435072&n&&(i+=1<<20),[r,i]},e.exports.denormalized=function(t){return!(2146435072&e.exports.hi(t))}}).call(this,t("buffer").Buffer)},{buffer:92}],152:[function(t,e,r){var n=t("abs-svg-path"),i=t("normalize-svg-path"),a={M:"moveTo",C:"bezierCurveTo"};e.exports=function(t,e){t.beginPath(),i(n(e)).forEach(function(e){var r=e[0],n=e.slice(1);t[a[r]].apply(t,n)}),t.closePath()}},{"abs-svg-path":51,"normalize-svg-path":419}],153:[function(t,e,r){e.exports=function(t){switch(t){case"int8":return Int8Array;case"int16":return Int16Array;case"int32":return Int32Array;case"uint8":return Uint8Array;case"uint16":return Uint16Array;case"uint32":return Uint32Array;case"float32":return Float32Array;case"float64":return Float64Array;case"array":return Array;case"uint8_clamped":return Uint8ClampedArray}}},{}],154:[function(t,e,r){"use strict";e.exports=function(t,e){switch("undefined"==typeof e&&(e=0),typeof t){case"number":if(t>0)return function(t,e){var r,n;for(r=new Array(t),n=0;n<t;++n)r[n]=e;return r}(0|t,e);break;case"object":if("number"==typeof t.length)return function t(e,r,n){var i=0|e[n];if(i<=0)return[];var a,o=new Array(i);if(n===e.length-1)for(a=0;a<i;++a)o[a]=r;else for(a=0;a<i;++a)o[a]=t(e,r,n+1);return o}(t,e,0)}return[]}},{}],155:[function(t,e,r){"use strict";function n(t,e,r){r=r||2;var n,s,l,c,u,p,g,m=e&&e.length,v=m?e[0]*r:t.length,y=i(t,0,v,r,!0),x=[];if(!y)return x;if(m&&(y=function(t,e,r,n){var o,s,l,c,u,p=[];for(o=0,s=e.length;o<s;o++)l=e[o]*n,c=o<s-1?e[o+1]*n:t.length,(u=i(t,l,c,n,!1))===u.next&&(u.steiner=!0),p.push(d(u));for(p.sort(h),o=0;o<p.length;o++)f(p[o],r),r=a(r,r.next);return r}(t,e,y,r)),t.length>80*r){n=l=t[0],s=c=t[1];for(var b=r;b<v;b+=r)(u=t[b])<n&&(n=u),(p=t[b+1])<s&&(s=p),u>l&&(l=u),p>c&&(c=p);g=0!==(g=Math.max(l-n,c-s))?1/g:0}return o(y,x,r,n,s,g),x}function i(t,e,r,n,i){var a,o;if(i===A(t,e,r,n)>0)for(a=e;a<r;a+=n)o=w(a,t[a],t[a+1],o);else for(a=r-n;a>=e;a-=n)o=w(a,t[a],t[a+1],o);return o&&y(o,o.next)&&(k(o),o=o.next),o}function a(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!y(n,n.next)&&0!==v(n.prev,n,n.next))n=n.next;else{if(k(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function o(t,e,r,n,i,h,f){if(t){!f&&h&&function(t,e,r,n){var i=t;do{null===i.z&&(i.z=p(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,a,o,s,l,c=1;do{for(r=t,t=null,a=null,o=0;r;){for(o++,n=r,s=0,e=0;e<c&&(s++,n=n.nextZ);e++);for(l=c;s>0||l>0&&n;)0!==s&&(0===l||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,l--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;r=n}a.nextZ=null,c*=2}while(o>1)}(i)}(t,n,i,h);for(var d,g,m=t;t.prev!==t.next;)if(d=t.prev,g=t.next,h?l(t,n,i,h):s(t))e.push(d.i/r),e.push(t.i/r),e.push(g.i/r),k(t),t=g.next,m=g.next;else if((t=g)===m){f?1===f?o(t=c(t,e,r),e,r,n,i,h,2):2===f&&u(t,e,r,n,i,h):o(a(t),e,r,n,i,h,1);break}}}function s(t){var e=t.prev,r=t,n=t.next;if(v(e,r,n)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(g(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&v(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function l(t,e,r,n){var i=t.prev,a=t,o=t.next;if(v(i,a,o)>=0)return!1;for(var s=i.x<a.x?i.x<o.x?i.x:o.x:a.x<o.x?a.x:o.x,l=i.y<a.y?i.y<o.y?i.y:o.y:a.y<o.y?a.y:o.y,c=i.x>a.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,u=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,h=p(s,l,e,r,n),f=p(c,u,e,r,n),d=t.prevZ,m=t.nextZ;d&&d.z>=h&&m&&m.z<=f;){if(d!==t.prev&&d!==t.next&&g(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&v(d.prev,d,d.next)>=0)return!1;if(d=d.prevZ,m!==t.prev&&m!==t.next&&g(i.x,i.y,a.x,a.y,o.x,o.y,m.x,m.y)&&v(m.prev,m,m.next)>=0)return!1;m=m.nextZ}for(;d&&d.z>=h;){if(d!==t.prev&&d!==t.next&&g(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&v(d.prev,d,d.next)>=0)return!1;d=d.prevZ}for(;m&&m.z<=f;){if(m!==t.prev&&m!==t.next&&g(i.x,i.y,a.x,a.y,o.x,o.y,m.x,m.y)&&v(m.prev,m,m.next)>=0)return!1;m=m.nextZ}return!0}function c(t,e,r){var n=t;do{var i=n.prev,a=n.next.next;!y(i,a)&&x(i,n,n.next,a)&&b(i,a)&&b(a,i)&&(e.push(i.i/r),e.push(n.i/r),e.push(a.i/r),k(n),k(n.next),n=t=a),n=n.next}while(n!==t);return n}function u(t,e,r,n,i,s){var l=t;do{for(var c=l.next.next;c!==l.prev;){if(l.i!==c.i&&m(l,c)){var u=_(l,c);return l=a(l,l.next),u=a(u,u.next),o(l,e,r,n,i,s),void o(u,e,r,n,i,s)}c=c.next}l=l.next}while(l!==t)}function h(t,e){return t.x-e.x}function f(t,e){if(e=function(t,e){var r,n=e,i=t.x,a=t.y,o=-1/0;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){var s=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>o){if(o=s,s===i){if(a===n.y)return n;if(a===n.next.y)return n.next}r=n.x<n.next.x?n:n.next}}n=n.next}while(n!==e);if(!r)return null;if(i===o)return r.prev;var l,c=r,u=r.x,h=r.y,f=1/0;n=r.next;for(;n!==c;)i>=n.x&&n.x>=u&&i!==n.x&&g(a<h?i:o,a,u,h,a<h?o:i,a,n.x,n.y)&&((l=Math.abs(a-n.y)/(i-n.x))<f||l===f&&n.x>r.x)&&b(n,t)&&(r=n,f=l),n=n.next;return r}(t,e)){var r=_(e,t);a(r,r.next)}}function p(t,e,r,n,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function d(t){var e=t,r=t;do{e.x<r.x&&(r=e),e=e.next}while(e!==t);return r}function g(t,e,r,n,i,a,o,s){return(i-o)*(e-s)-(t-o)*(a-s)>=0&&(t-o)*(n-s)-(r-o)*(e-s)>=0&&(r-o)*(a-s)-(i-o)*(n-s)>=0}function m(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&x(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&b(t,e)&&b(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}(t,e)}function v(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function y(t,e){return t.x===e.x&&t.y===e.y}function x(t,e,r,n){return!!(y(t,e)&&y(r,n)||y(t,n)&&y(r,e))||v(t,e,r)>0!=v(t,e,n)>0&&v(r,n,t)>0!=v(r,n,e)>0}function b(t,e){return v(t.prev,t,t.next)<0?v(t,e,t.next)>=0&&v(t,t.prev,e)>=0:v(t,e,t.prev)<0||v(t,t.next,e)<0}function _(t,e){var r=new M(t.i,t.x,t.y),n=new M(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function w(t,e,r,n){var i=new M(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function k(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function M(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function A(t,e,r,n){for(var i=0,a=e,o=r-n;a<r;a+=n)i+=(t[o]-t[a])*(t[a+1]+t[o+1]),o=a;return i}e.exports=n,e.exports.default=n,n.deviation=function(t,e,r,n){var i=e&&e.length,a=i?e[0]*r:t.length,o=Math.abs(A(t,0,a,r));if(i)for(var s=0,l=e.length;s<l;s++){var c=e[s]*r,u=s<l-1?e[s+1]*r:t.length;o-=Math.abs(A(t,c,u,r))}var h=0;for(s=0;s<n.length;s+=3){var f=n[s]*r,p=n[s+1]*r,d=n[s+2]*r;h+=Math.abs((t[f]-t[d])*(t[p+1]-t[f+1])-(t[f]-t[p])*(t[d+1]-t[f+1]))}return 0===o&&0===h?0:Math.abs((h-o)/o)},n.flatten=function(t){for(var e=t[0][0].length,r={vertices:[],holes:[],dimensions:e},n=0,i=0;i<t.length;i++){for(var a=0;a<t[i].length;a++)for(var o=0;o<e;o++)r.vertices.push(t[i][a][o]);i>0&&(n+=t[i-1].length,r.holes.push(n))}return r}},{}],156:[function(t,e,r){"use strict";e.exports=function(t,e){var r=t.length;if("number"!=typeof e){e=0;for(var i=0;i<r;++i){var a=t[i];e=Math.max(e,a[0],a[1])}e=1+(0|e)}e|=0;for(var o=new Array(e),i=0;i<e;++i)o[i]=[];for(var i=0;i<r;++i){var a=t[i];o[a[0]].push(a[1]),o[a[1]].push(a[0])}for(var s=0;s<e;++s)n(o[s],function(t,e){return t-e});return o};var n=t("uniq")},{uniq:509}],157:[function(t,e,r){"use strict";var n=t("../../object/valid-value");e.exports=function(){return n(this).length=0,this}},{"../../object/valid-value":189}],158:[function(t,e,r){"use strict";e.exports=t("./is-implemented")()?Array.from:t("./shim")},{"./is-implemented":159,"./shim":160}],159:[function(t,e,r){"use strict";e.exports=function(){var t,e,r=Array.from;return"function"==typeof r&&(e=r(t=["raz","dwa"]),Boolean(e&&e!==t&&"dwa"===e[1]))}},{}],160:[function(t,e,r){"use strict";var n=t("es6-symbol").iterator,i=t("../../function/is-arguments"),a=t("../../function/is-function"),o=t("../../number/to-pos-integer"),s=t("../../object/valid-callable"),l=t("../../object/valid-value"),c=t("../../object/is-value"),u=t("../../string/is-string"),h=Array.isArray,f=Function.prototype.call,p={configurable:!0,enumerable:!0,writable:!0,value:null},d=Object.defineProperty;e.exports=function(t){var e,r,g,m,v,y,x,b,_,w,k=arguments[1],M=arguments[2];if(t=Object(l(t)),c(k)&&s(k),this&&this!==Array&&a(this))e=this;else{if(!k){if(i(t))return 1!==(v=t.length)?Array.apply(null,t):((m=new Array(1))[0]=t[0],m);if(h(t)){for(m=new Array(v=t.length),r=0;r<v;++r)m[r]=t[r];return m}}m=[]}if(!h(t))if(void 0!==(_=t[n])){for(x=s(_).call(t),e&&(m=new e),b=x.next(),r=0;!b.done;)w=k?f.call(k,M,b.value,r):b.value,e?(p.value=w,d(m,r,p)):m[r]=w,b=x.next(),++r;v=r}else if(u(t)){for(v=t.length,e&&(m=new e),r=0,g=0;r<v;++r)w=t[r],r+1<v&&(y=w.charCodeAt(0))>=55296&&y<=56319&&(w+=t[++r]),w=k?f.call(k,M,w,g):w,e?(p.value=w,d(m,g,p)):m[g]=w,++g;v=g}if(void 0===v)for(v=o(t.length),e&&(m=new e(v)),r=0;r<v;++r)w=k?f.call(k,M,t[r],r):t[r],e?(p.value=w,d(m,r,p)):m[r]=w;return e&&(p.value=null,m.length=v),m}},{"../../function/is-arguments":161,"../../function/is-function":162,"../../number/to-pos-integer":168,"../../object/is-value":178,"../../object/valid-callable":187,"../../object/valid-value":189,"../../string/is-string":193,"es6-symbol":203}],161:[function(t,e,r){"use strict";var n=Object.prototype.toString,i=n.call(function(){return arguments}());e.exports=function(t){return n.call(t)===i}},{}],162:[function(t,e,r){"use strict";var n=Object.prototype.toString,i=n.call(t("./noop"));e.exports=function(t){return"function"==typeof t&&n.call(t)===i}},{"./noop":163}],163:[function(t,e,r){"use strict";e.exports=function(){}},{}],164:[function(t,e,r){"use strict";e.exports=t("./is-implemented")()?Math.sign:t("./shim")},{"./is-implemented":165,"./shim":166}],165:[function(t,e,r){"use strict";e.exports=function(){var t=Math.sign;return"function"==typeof t&&(1===t(10)&&-1===t(-20))}},{}],166:[function(t,e,r){"use strict";e.exports=function(t){return t=Number(t),isNaN(t)||0===t?t:t>0?1:-1}},{}],167:[function(t,e,r){"use strict";var n=t("../math/sign"),i=Math.abs,a=Math.floor;e.exports=function(t){return isNaN(t)?0:0!==(t=Number(t))&&isFinite(t)?n(t)*a(i(t)):t}},{"../math/sign":164}],168:[function(t,e,r){"use strict";var n=t("./to-integer"),i=Math.max;e.exports=function(t){return i(0,n(t))}},{"./to-integer":167}],169:[function(t,e,r){"use strict";var n=t("./valid-callable"),i=t("./valid-value"),a=Function.prototype.bind,o=Function.prototype.call,s=Object.keys,l=Object.prototype.propertyIsEnumerable;e.exports=function(t,e){return function(r,c){var u,h=arguments[2],f=arguments[3];return r=Object(i(r)),n(c),u=s(r),f&&u.sort("function"==typeof f?a.call(f,r):void 0),"function"!=typeof t&&(t=u[t]),o.call(t,u,function(t,n){return l.call(r,t)?o.call(c,h,r[t],t,r,n):e})}}},{"./valid-callable":187,"./valid-value":189}],170:[function(t,e,r){"use strict";e.exports=t("./is-implemented")()?Object.assign:t("./shim")},{"./is-implemented":171,"./shim":172}],171:[function(t,e,r){"use strict";e.exports=function(){var t,e=Object.assign;return"function"==typeof e&&(e(t={foo:"raz"},{bar:"dwa"},{trzy:"trzy"}),t.foo+t.bar+t.trzy==="razdwatrzy")}},{}],172:[function(t,e,r){"use strict";var n=t("../keys"),i=t("../valid-value"),a=Math.max;e.exports=function(t,e){var r,o,s,l=a(arguments.length,2);for(t=Object(i(t)),s=function(n){try{t[n]=e[n]}catch(t){r||(r=t)}},o=1;o<l;++o)e=arguments[o],n(e).forEach(s);if(void 0!==r)throw r;return t}},{"../keys":179,"../valid-value":189}],173:[function(t,e,r){"use strict";var n=t("../array/from"),i=t("./assign"),a=t("./valid-value");e.exports=function(t){var e=Object(a(t)),r=arguments[1],o=Object(arguments[2]);if(e!==t&&!r)return e;var s={};return r?n(r,function(e){(o.ensure||e in t)&&(s[e]=t[e])}):i(s,t),s}},{"../array/from":158,"./assign":170,"./valid-value":189}],174:[function(t,e,r){"use strict";var n,i,a,o,s=Object.create;t("./set-prototype-of/is-implemented")()||(n=t("./set-prototype-of/shim")),e.exports=n?1!==n.level?s:(i={},a={},o={configurable:!1,enumerable:!1,writable:!0,value:void 0},Object.getOwnPropertyNames(Object.prototype).forEach(function(t){a[t]="__proto__"!==t?o:{configurable:!0,enumerable:!1,writable:!0,value:void 0}}),Object.defineProperties(i,a),Object.defineProperty(n,"nullPolyfill",{configurable:!1,enumerable:!1,writable:!1,value:i}),function(t,e){return s(null===t?i:t,e)}):s},{"./set-prototype-of/is-implemented":185,"./set-prototype-of/shim":186}],175:[function(t,e,r){"use strict";e.exports=t("./_iterate")("forEach")},{"./_iterate":169}],176:[function(t,e,r){"use strict";e.exports=function(t){return"function"==typeof t}},{}],177:[function(t,e,r){"use strict";var n=t("./is-value"),i={function:!0,object:!0};e.exports=function(t){return n(t)&&i[typeof t]||!1}},{"./is-value":178}],178:[function(t,e,r){"use strict";var n=t("../function/noop")();e.exports=function(t){return t!==n&&null!==t}},{"../function/noop":163}],179:[function(t,e,r){"use strict";e.exports=t("./is-implemented")()?Object.keys:t("./shim")},{"./is-implemented":180,"./shim":181}],180:[function(t,e,r){"use strict";e.exports=function(){try{return Object.keys("primitive"),!0}catch(t){return!1}}},{}],181:[function(t,e,r){"use strict";var n=t("../is-value"),i=Object.keys;e.exports=function(t){return i(n(t)?Object(t):t)}},{"../is-value":178}],182:[function(t,e,r){"use strict";var n=t("./valid-callable"),i=t("./for-each"),a=Function.prototype.call;e.exports=function(t,e){var r={},o=arguments[2];return n(e),i(t,function(t,n,i,s){r[n]=a.call(e,o,t,n,i,s)}),r}},{"./for-each":175,"./valid-callable":187}],183:[function(t,e,r){"use strict";var n=t("./is-value"),i=Array.prototype.forEach,a=Object.create;e.exports=function(t){var e=a(null);return i.call(arguments,function(t){n(t)&&function(t,e){var r;for(r in t)e[r]=t[r]}(Object(t),e)}),e}},{"./is-value":178}],184:[function(t,e,r){"use strict";e.exports=t("./is-implemented")()?Object.setPrototypeOf:t("./shim")},{"./is-implemented":185,"./shim":186}],185:[function(t,e,r){"use strict";var n=Object.create,i=Object.getPrototypeOf,a={};e.exports=function(){var t=Object.setPrototypeOf,e=arguments[0]||n;return"function"==typeof t&&i(t(e(null),a))===a}},{}],186:[function(t,e,r){"use strict";var n,i,a,o,s=t("../is-object"),l=t("../valid-value"),c=Object.prototype.isPrototypeOf,u=Object.defineProperty,h={configurable:!0,enumerable:!1,writable:!0,value:void 0};n=function(t,e){if(l(t),null===e||s(e))return t;throw new TypeError("Prototype must be null or an object")},e.exports=(i=function(){var t,e=Object.create(null),r={},n=Object.getOwnPropertyDescriptor(Object.prototype,"__proto__");if(n){try{(t=n.set).call(e,r)}catch(t){}if(Object.getPrototypeOf(e)===r)return{set:t,level:2}}return e.__proto__=r,Object.getPrototypeOf(e)===r?{level:2}:((e={}).__proto__=r,Object.getPrototypeOf(e)===r&&{level:1})}())?(2===i.level?i.set?(o=i.set,a=function(t,e){return o.call(n(t,e),e),t}):a=function(t,e){return n(t,e).__proto__=e,t}:a=function t(e,r){var i;return n(e,r),(i=c.call(t.nullPolyfill,e))&&delete t.nullPolyfill.__proto__,null===r&&(r=t.nullPolyfill),e.__proto__=r,i&&u(t.nullPolyfill,"__proto__",h),e},Object.defineProperty(a,"level",{configurable:!1,enumerable:!1,writable:!1,value:i.level})):null,t("../create")},{"../create":174,"../is-object":177,"../valid-value":189}],187:[function(t,e,r){"use strict";e.exports=function(t){if("function"!=typeof t)throw new TypeError(t+" is not a function");return t}},{}],188:[function(t,e,r){"use strict";var n=t("./is-object");e.exports=function(t){if(!n(t))throw new TypeError(t+" is not an Object");return t}},{"./is-object":177}],189:[function(t,e,r){"use strict";var n=t("./is-value");e.exports=function(t){if(!n(t))throw new TypeError("Cannot use null or undefined");return t}},{"./is-value":178}],190:[function(t,e,r){"use strict";e.exports=t("./is-implemented")()?String.prototype.contains:t("./shim")},{"./is-implemented":191,"./shim":192}],191:[function(t,e,r){"use strict";var n="razdwatrzy";e.exports=function(){return"function"==typeof n.contains&&(!0===n.contains("dwa")&&!1===n.contains("foo"))}},{}],192:[function(t,e,r){"use strict";var n=String.prototype.indexOf;e.exports=function(t){return n.call(this,t,arguments[1])>-1}},{}],193:[function(t,e,r){"use strict";var n=Object.prototype.toString,i=n.call("");e.exports=function(t){return"string"==typeof t||t&&"object"==typeof t&&(t instanceof String||n.call(t)===i)||!1}},{}],194:[function(t,e,r){"use strict";var n=Object.create(null),i=Math.random;e.exports=function(){var t;do{t=i().toString(36).slice(2)}while(n[t]);return t}},{}],195:[function(t,e,r){"use strict";var n,i=t("es5-ext/object/set-prototype-of"),a=t("es5-ext/string/#/contains"),o=t("d"),s=t("es6-symbol"),l=t("./"),c=Object.defineProperty;n=e.exports=function(t,e){if(!(this instanceof n))throw new TypeError("Constructor requires 'new'");l.call(this,t),e=e?a.call(e,"key+value")?"key+value":a.call(e,"key")?"key":"value":"value",c(this,"__kind__",o("",e))},i&&i(n,l),delete n.prototype.constructor,n.prototype=Object.create(l.prototype,{_resolve:o(function(t){return"value"===this.__kind__?this.__list__[t]:"key+value"===this.__kind__?[t,this.__list__[t]]:t})}),c(n.prototype,s.toStringTag,o("c","Array Iterator"))},{"./":198,d:138,"es5-ext/object/set-prototype-of":184,"es5-ext/string/#/contains":190,"es6-symbol":203}],196:[function(t,e,r){"use strict";var n=t("es5-ext/function/is-arguments"),i=t("es5-ext/object/valid-callable"),a=t("es5-ext/string/is-string"),o=t("./get"),s=Array.isArray,l=Function.prototype.call,c=Array.prototype.some;e.exports=function(t,e){var r,u,h,f,p,d,g,m,v=arguments[2];if(s(t)||n(t)?r="array":a(t)?r="string":t=o(t),i(e),h=function(){f=!0},"array"!==r)if("string"!==r)for(u=t.next();!u.done;){if(l.call(e,v,u.value,h),f)return;u=t.next()}else for(d=t.length,p=0;p<d&&(g=t[p],p+1<d&&(m=g.charCodeAt(0))>=55296&&m<=56319&&(g+=t[++p]),l.call(e,v,g,h),!f);++p);else c.call(t,function(t){return l.call(e,v,t,h),f})}},{"./get":197,"es5-ext/function/is-arguments":161,"es5-ext/object/valid-callable":187,"es5-ext/string/is-string":193}],197:[function(t,e,r){"use strict";var n=t("es5-ext/function/is-arguments"),i=t("es5-ext/string/is-string"),a=t("./array"),o=t("./string"),s=t("./valid-iterable"),l=t("es6-symbol").iterator;e.exports=function(t){return"function"==typeof s(t)[l]?t[l]():n(t)?new a(t):i(t)?new o(t):new a(t)}},{"./array":195,"./string":200,"./valid-iterable":201,"es5-ext/function/is-arguments":161,"es5-ext/string/is-string":193,"es6-symbol":203}],198:[function(t,e,r){"use strict";var n,i=t("es5-ext/array/#/clear"),a=t("es5-ext/object/assign"),o=t("es5-ext/object/valid-callable"),s=t("es5-ext/object/valid-value"),l=t("d"),c=t("d/auto-bind"),u=t("es6-symbol"),h=Object.defineProperty,f=Object.defineProperties;e.exports=n=function(t,e){if(!(this instanceof n))throw new TypeError("Constructor requires 'new'");f(this,{__list__:l("w",s(t)),__context__:l("w",e),__nextIndex__:l("w",0)}),e&&(o(e.on),e.on("_add",this._onAdd),e.on("_delete",this._onDelete),e.on("_clear",this._onClear))},delete n.prototype.constructor,f(n.prototype,a({_next:l(function(){var t;if(this.__list__)return this.__redo__&&void 0!==(t=this.__redo__.shift())?t:this.__nextIndex__<this.__list__.length?this.__nextIndex__++:void this._unBind()}),next:l(function(){return this._createResult(this._next())}),_createResult:l(function(t){return void 0===t?{done:!0,value:void 0}:{done:!1,value:this._resolve(t)}}),_resolve:l(function(t){return this.__list__[t]}),_unBind:l(function(){this.__list__=null,delete this.__redo__,this.__context__&&(this.__context__.off("_add",this._onAdd),this.__context__.off("_delete",this._onDelete),this.__context__.off("_clear",this._onClear),this.__context__=null)}),toString:l(function(){return"[object "+(this[u.toStringTag]||"Object")+"]"})},c({_onAdd:l(function(t){t>=this.__nextIndex__||(++this.__nextIndex__,this.__redo__?(this.__redo__.forEach(function(e,r){e>=t&&(this.__redo__[r]=++e)},this),this.__redo__.push(t)):h(this,"__redo__",l("c",[t])))}),_onDelete:l(function(t){var e;t>=this.__nextIndex__||(--this.__nextIndex__,this.__redo__&&(-1!==(e=this.__redo__.indexOf(t))&&this.__redo__.splice(e,1),this.__redo__.forEach(function(e,r){e>t&&(this.__redo__[r]=--e)},this)))}),_onClear:l(function(){this.__redo__&&i.call(this.__redo__),this.__nextIndex__=0})}))),h(n.prototype,u.iterator,l(function(){return this}))},{d:138,"d/auto-bind":137,"es5-ext/array/#/clear":157,"es5-ext/object/assign":170,"es5-ext/object/valid-callable":187,"es5-ext/object/valid-value":189,"es6-symbol":203}],199:[function(t,e,r){"use strict";var n=t("es5-ext/function/is-arguments"),i=t("es5-ext/object/is-value"),a=t("es5-ext/string/is-string"),o=t("es6-symbol").iterator,s=Array.isArray;e.exports=function(t){return!!i(t)&&(!!s(t)||(!!a(t)||(!!n(t)||"function"==typeof t[o])))}},{"es5-ext/function/is-arguments":161,"es5-ext/object/is-value":178,"es5-ext/string/is-string":193,"es6-symbol":203}],200:[function(t,e,r){"use strict";var n,i=t("es5-ext/object/set-prototype-of"),a=t("d"),o=t("es6-symbol"),s=t("./"),l=Object.defineProperty;n=e.exports=function(t){if(!(this instanceof n))throw new TypeError("Constructor requires 'new'");t=String(t),s.call(this,t),l(this,"__length__",a("",t.length))},i&&i(n,s),delete n.prototype.constructor,n.prototype=Object.create(s.prototype,{_next:a(function(){if(this.__list__)return this.__nextIndex__<this.__length__?this.__nextIndex__++:void this._unBind()}),_resolve:a(function(t){var e,r=this.__list__[t];return this.__nextIndex__===this.__length__?r:(e=r.charCodeAt(0))>=55296&&e<=56319?r+this.__list__[this.__nextIndex__++]:r})}),l(n.prototype,o.toStringTag,a("c","String Iterator"))},{"./":198,d:138,"es5-ext/object/set-prototype-of":184,"es6-symbol":203}],201:[function(t,e,r){"use strict";var n=t("./is-iterable");e.exports=function(t){if(!n(t))throw new TypeError(t+" is not iterable");return t}},{"./is-iterable":199}],202:[function(t,e,r){(function(n,i){!function(t,n){"object"==typeof r&&"undefined"!=typeof e?e.exports=n():t.ES6Promise=n()}(this,function(){"use strict";function e(t){return"function"==typeof t}var r=Array.isArray?Array.isArray:function(t){return"[object Array]"===Object.prototype.toString.call(t)},a=0,o=void 0,s=void 0,l=function(t,e){g[a]=t,g[a+1]=e,2===(a+=2)&&(s?s(m):_())};var c="undefined"!=typeof window?window:void 0,u=c||{},h=u.MutationObserver||u.WebKitMutationObserver,f="undefined"==typeof self&&"undefined"!=typeof n&&"[object process]"==={}.toString.call(n),p="undefined"!=typeof Uint8ClampedArray&&"undefined"!=typeof importScripts&&"undefined"!=typeof MessageChannel;function d(){var t=setTimeout;return function(){return t(m,1)}}var g=new Array(1e3);function m(){for(var t=0;t<a;t+=2){(0,g[t])(g[t+1]),g[t]=void 0,g[t+1]=void 0}a=0}var v,y,x,b,_=void 0;function w(t,e){var r=arguments,n=this,i=new this.constructor(A);void 0===i[M]&&U(i);var a,o=n._state;return o?(a=r[o-1],l(function(){return j(o,i,a,n._result)})):R(n,i,t,e),i}function k(t){if(t&&"object"==typeof t&&t.constructor===this)return t;var e=new this(A);return P(e,t),e}f?_=function(){return n.nextTick(m)}:h?(y=0,x=new h(m),b=document.createTextNode(""),x.observe(b,{characterData:!0}),_=function(){b.data=y=++y%2}):p?((v=new MessageChannel).port1.onmessage=m,_=function(){return v.port2.postMessage(0)}):_=void 0===c&&"function"==typeof t?function(){try{var e=t("vertx");return o=e.runOnLoop||e.runOnContext,function(){o(m)}}catch(t){return d()}}():d();var M=Math.random().toString(36).substring(16);function A(){}var T=void 0,S=1,E=2,C=new F;function L(t){try{return t.then}catch(t){return C.error=t,C}}function z(t,r,n){r.constructor===t.constructor&&n===w&&r.constructor.resolve===k?function(t,e){e._state===S?O(t,e._result):e._state===E?D(t,e._result):R(e,void 0,function(e){return P(t,e)},function(e){return D(t,e)})}(t,r):n===C?D(t,C.error):void 0===n?O(t,r):e(n)?function(t,e,r){l(function(t){var n=!1,i=function(t,e,r,n){try{t.call(e,r,n)}catch(t){return t}}(r,e,function(r){n||(n=!0,e!==r?P(t,r):O(t,r))},function(e){n||(n=!0,D(t,e))},t._label);!n&&i&&(n=!0,D(t,i))},t)}(t,r,n):O(t,r)}function P(t,e){var r;t===e?D(t,new TypeError("You cannot resolve a promise with itself")):"function"==typeof(r=e)||"object"==typeof r&&null!==r?z(t,e,L(e)):O(t,e)}function I(t){t._onerror&&t._onerror(t._result),B(t)}function O(t,e){t._state===T&&(t._result=e,t._state=S,0!==t._subscribers.length&&l(B,t))}function D(t,e){t._state===T&&(t._state=E,t._result=e,l(I,t))}function R(t,e,r,n){var i=t._subscribers,a=i.length;t._onerror=null,i[a]=e,i[a+S]=r,i[a+E]=n,0===a&&t._state&&l(B,t)}function B(t){var e=t._subscribers,r=t._state;if(0!==e.length){for(var n=void 0,i=void 0,a=t._result,o=0;o<e.length;o+=3)n=e[o],i=e[o+r],n?j(r,n,i,a):i(a);t._subscribers.length=0}}function F(){this.error=null}var N=new F;function j(t,r,n,i){var a=e(n),o=void 0,s=void 0,l=void 0,c=void 0;if(a){if((o=function(t,e){try{return t(e)}catch(t){return N.error=t,N}}(n,i))===N?(c=!0,s=o.error,o=null):l=!0,r===o)return void D(r,new TypeError("A promises callback cannot return that same promise."))}else o=i,l=!0;r._state!==T||(a&&l?P(r,o):c?D(r,s):t===S?O(r,o):t===E&&D(r,o))}var V=0;function U(t){t[M]=V++,t._state=void 0,t._result=void 0,t._subscribers=[]}function q(t,e){this._instanceConstructor=t,this.promise=new t(A),this.promise[M]||U(this.promise),r(e)?(this._input=e,this.length=e.length,this._remaining=e.length,this._result=new Array(this.length),0===this.length?O(this.promise,this._result):(this.length=this.length||0,this._enumerate(),0===this._remaining&&O(this.promise,this._result))):D(this.promise,new Error("Array Methods must be provided an Array"))}function H(t){this[M]=V++,this._result=this._state=void 0,this._subscribers=[],A!==t&&("function"!=typeof t&&function(){throw new TypeError("You must pass a resolver function as the first argument to the promise constructor")}(),this instanceof H?function(t,e){try{e(function(e){P(t,e)},function(e){D(t,e)})}catch(e){D(t,e)}}(this,t):function(){throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.")}())}function G(){var t=void 0;if("undefined"!=typeof i)t=i;else if("undefined"!=typeof self)t=self;else try{t=Function("return this")()}catch(t){throw new Error("polyfill failed because global object is unavailable in this environment")}var e=t.Promise;if(e){var r=null;try{r=Object.prototype.toString.call(e.resolve())}catch(t){}if("[object Promise]"===r&&!e.cast)return}t.Promise=H}return q.prototype._enumerate=function(){for(var t=this.length,e=this._input,r=0;this._state===T&&r<t;r++)this._eachEntry(e[r],r)},q.prototype._eachEntry=function(t,e){var r=this._instanceConstructor,n=r.resolve;if(n===k){var i=L(t);if(i===w&&t._state!==T)this._settledAt(t._state,e,t._result);else if("function"!=typeof i)this._remaining--,this._result[e]=t;else if(r===H){var a=new r(A);z(a,t,i),this._willSettleAt(a,e)}else this._willSettleAt(new r(function(e){return e(t)}),e)}else this._willSettleAt(n(t),e)},q.prototype._settledAt=function(t,e,r){var n=this.promise;n._state===T&&(this._remaining--,t===E?D(n,r):this._result[e]=r),0===this._remaining&&O(n,this._result)},q.prototype._willSettleAt=function(t,e){var r=this;R(t,void 0,function(t){return r._settledAt(S,e,t)},function(t){return r._settledAt(E,e,t)})},H.all=function(t){return new q(this,t).promise},H.race=function(t){var e=this;return r(t)?new e(function(r,n){for(var i=t.length,a=0;a<i;a++)e.resolve(t[a]).then(r,n)}):new e(function(t,e){return e(new TypeError("You must pass an array to race."))})},H.resolve=k,H.reject=function(t){var e=new this(A);return D(e,t),e},H._setScheduler=function(t){s=t},H._setAsap=function(t){l=t},H._asap=l,H.prototype={constructor:H,then:w,catch:function(t){return this.then(null,t)}},G(),H.polyfill=G,H.Promise=H,H})}).call(this,t("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{_process:449}],203:[function(t,e,r){"use strict";e.exports=t("./is-implemented")()?Symbol:t("./polyfill")},{"./is-implemented":204,"./polyfill":206}],204:[function(t,e,r){"use strict";var n={object:!0,symbol:!0};e.exports=function(){var t;if("function"!=typeof Symbol)return!1;t=Symbol("test symbol");try{String(t)}catch(t){return!1}return!!n[typeof Symbol.iterator]&&(!!n[typeof Symbol.toPrimitive]&&!!n[typeof Symbol.toStringTag])}},{}],205:[function(t,e,r){"use strict";e.exports=function(t){return!!t&&("symbol"==typeof t||!!t.constructor&&("Symbol"===t.constructor.name&&"Symbol"===t[t.constructor.toStringTag]))}},{}],206:[function(t,e,r){"use strict";var n,i,a,o,s=t("d"),l=t("./validate-symbol"),c=Object.create,u=Object.defineProperties,h=Object.defineProperty,f=Object.prototype,p=c(null);if("function"==typeof Symbol){n=Symbol;try{String(n()),o=!0}catch(t){}}var d,g=(d=c(null),function(t){for(var e,r,n=0;d[t+(n||"")];)++n;return d[t+=n||""]=!0,h(f,e="@@"+t,s.gs(null,function(t){r||(r=!0,h(this,e,s(t)),r=!1)})),e});a=function(t){if(this instanceof a)throw new TypeError("Symbol is not a constructor");return i(t)},e.exports=i=function t(e){var r;if(this instanceof t)throw new TypeError("Symbol is not a constructor");return o?n(e):(r=c(a.prototype),e=void 0===e?"":String(e),u(r,{__description__:s("",e),__name__:s("",g(e))}))},u(i,{for:s(function(t){return p[t]?p[t]:p[t]=i(String(t))}),keyFor:s(function(t){var e;for(e in l(t),p)if(p[e]===t)return e}),hasInstance:s("",n&&n.hasInstance||i("hasInstance")),isConcatSpreadable:s("",n&&n.isConcatSpreadable||i("isConcatSpreadable")),iterator:s("",n&&n.iterator||i("iterator")),match:s("",n&&n.match||i("match")),replace:s("",n&&n.replace||i("replace")),search:s("",n&&n.search||i("search")),species:s("",n&&n.species||i("species")),split:s("",n&&n.split||i("split")),toPrimitive:s("",n&&n.toPrimitive||i("toPrimitive")),toStringTag:s("",n&&n.toStringTag||i("toStringTag")),unscopables:s("",n&&n.unscopables||i("unscopables"))}),u(a.prototype,{constructor:s(i),toString:s("",function(){return this.__name__})}),u(i.prototype,{toString:s(function(){return"Symbol ("+l(this).__description__+")"}),valueOf:s(function(){return l(this)})}),h(i.prototype,i.toPrimitive,s("",function(){var t=l(this);return"symbol"==typeof t?t:t.toString()})),h(i.prototype,i.toStringTag,s("c","Symbol")),h(a.prototype,i.toStringTag,s("c",i.prototype[i.toStringTag])),h(a.prototype,i.toPrimitive,s("c",i.prototype[i.toPrimitive]))},{"./validate-symbol":207,d:138}],207:[function(t,e,r){"use strict";var n=t("./is-symbol");e.exports=function(t){if(!n(t))throw new TypeError(t+" is not a symbol");return t}},{"./is-symbol":205}],208:[function(t,e,r){"use strict";e.exports=t("./is-implemented")()?WeakMap:t("./polyfill")},{"./is-implemented":209,"./polyfill":211}],209:[function(t,e,r){"use strict";e.exports=function(){var t,e;if("function"!=typeof WeakMap)return!1;try{t=new WeakMap([[e={},"one"],[{},"two"],[{},"three"]])}catch(t){return!1}return"[object WeakMap]"===String(t)&&("function"==typeof t.set&&(t.set({},1)===t&&("function"==typeof t.delete&&("function"==typeof t.has&&"one"===t.get(e)))))}},{}],210:[function(t,e,r){"use strict";e.exports="function"==typeof WeakMap&&"[object WeakMap]"===Object.prototype.toString.call(new WeakMap)},{}],211:[function(t,e,r){"use strict";var n,i=t("es5-ext/object/set-prototype-of"),a=t("es5-ext/object/valid-object"),o=t("es5-ext/object/valid-value"),s=t("es5-ext/string/random-uniq"),l=t("d"),c=t("es6-iterator/get"),u=t("es6-iterator/for-of"),h=t("es6-symbol").toStringTag,f=t("./is-native-implemented"),p=Array.isArray,d=Object.defineProperty,g=Object.prototype.hasOwnProperty,m=Object.getPrototypeOf;e.exports=n=function(){var t,e=arguments[0];if(!(this instanceof n))throw new TypeError("Constructor requires 'new'");return t=f&&i&&WeakMap!==n?i(new WeakMap,m(this)):this,null!=e&&(p(e)||(e=c(e))),d(t,"__weakMapData__",l("c","$weakMap$"+s())),e?(u(e,function(e){o(e),t.set(e[0],e[1])}),t):t},f&&(i&&i(n,WeakMap),n.prototype=Object.create(WeakMap.prototype,{constructor:l(n)})),Object.defineProperties(n.prototype,{delete:l(function(t){return!!g.call(a(t),this.__weakMapData__)&&(delete t[this.__weakMapData__],!0)}),get:l(function(t){if(g.call(a(t),this.__weakMapData__))return t[this.__weakMapData__]}),has:l(function(t){return g.call(a(t),this.__weakMapData__)}),set:l(function(t,e){return d(a(t),this.__weakMapData__,l("c",e)),this}),toString:l(function(){return"[object WeakMap]"})}),d(n.prototype,h,l("c","WeakMap"))},{"./is-native-implemented":210,d:138,"es5-ext/object/set-prototype-of":184,"es5-ext/object/valid-object":188,"es5-ext/object/valid-value":189,"es5-ext/string/random-uniq":194,"es6-iterator/for-of":196,"es6-iterator/get":197,"es6-symbol":203}],212:[function(t,e,r){function n(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function i(t){return"function"==typeof t}function a(t){return"object"==typeof t&&null!==t}function o(t){return void 0===t}e.exports=n,n.EventEmitter=n,n.prototype._events=void 0,n.prototype._maxListeners=void 0,n.defaultMaxListeners=10,n.prototype.setMaxListeners=function(t){if("number"!=typeof t||t<0||isNaN(t))throw TypeError("n must be a positive number");return this._maxListeners=t,this},n.prototype.emit=function(t){var e,r,n,s,l,c;if(this._events||(this._events={}),"error"===t&&(!this._events.error||a(this._events.error)&&!this._events.error.length)){if((e=arguments[1])instanceof Error)throw e;var u=new Error('Uncaught, unspecified "error" event. ('+e+")");throw u.context=e,u}if(o(r=this._events[t]))return!1;if(i(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:s=Array.prototype.slice.call(arguments,1),r.apply(this,s)}else if(a(r))for(s=Array.prototype.slice.call(arguments,1),n=(c=r.slice()).length,l=0;l<n;l++)c[l].apply(this,s);return!0},n.prototype.addListener=function(t,e){var r;if(!i(e))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",t,i(e.listener)?e.listener:e),this._events[t]?a(this._events[t])?this._events[t].push(e):this._events[t]=[this._events[t],e]:this._events[t]=e,a(this._events[t])&&!this._events[t].warned&&(r=o(this._maxListeners)?n.defaultMaxListeners:this._maxListeners)&&r>0&&this._events[t].length>r&&(this._events[t].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[t].length),"function"==typeof console.trace&&console.trace()),this},n.prototype.on=n.prototype.addListener,n.prototype.once=function(t,e){if(!i(e))throw TypeError("listener must be a function");var r=!1;function n(){this.removeListener(t,n),r||(r=!0,e.apply(this,arguments))}return n.listener=e,this.on(t,n),this},n.prototype.removeListener=function(t,e){var r,n,o,s;if(!i(e))throw TypeError("listener must be a function");if(!this._events||!this._events[t])return this;if(o=(r=this._events[t]).length,n=-1,r===e||i(r.listener)&&r.listener===e)delete this._events[t],this._events.removeListener&&this.emit("removeListener",t,e);else if(a(r)){for(s=o;s-- >0;)if(r[s]===e||r[s].listener&&r[s].listener===e){n=s;break}if(n<0)return this;1===r.length?(r.length=0,delete this._events[t]):r.splice(n,1),this._events.removeListener&&this.emit("removeListener",t,e)}return this},n.prototype.removeAllListeners=function(t){var e,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[t]&&delete this._events[t],this;if(0===arguments.length){for(e in this._events)"removeListener"!==e&&this.removeAllListeners(e);return this.removeAllListeners("removeListener"),this._events={},this}if(i(r=this._events[t]))this.removeListener(t,r);else if(r)for(;r.length;)this.removeListener(t,r[r.length-1]);return delete this._events[t],this},n.prototype.listeners=function(t){return this._events&&this._events[t]?i(this._events[t])?[this._events[t]]:this._events[t].slice():[]},n.prototype.listenerCount=function(t){if(this._events){var e=this._events[t];if(i(e))return 1;if(e)return e.length}return 0},n.listenerCount=function(t,e){return t.listenerCount(e)}},{}],213:[function(t,e,r){"use strict";e.exports=function(t,e,r){var n=e||0,i=r||1;return[[t[12]+t[0],t[13]+t[1],t[14]+t[2],t[15]+t[3]],[t[12]-t[0],t[13]-t[1],t[14]-t[2],t[15]-t[3]],[t[12]+t[4],t[13]+t[5],t[14]+t[6],t[15]+t[7]],[t[12]-t[4],t[13]-t[5],t[14]-t[6],t[15]-t[7]],[n*t[12]+t[8],n*t[13]+t[9],n*t[14]+t[10],n*t[15]+t[11]],[i*t[12]-t[8],i*t[13]-t[9],i*t[14]-t[10],i*t[15]-t[11]]]}},{}],214:[function(t,e,r){"use strict";e.exports=function(t){var e=typeof t;if("string"===e){var r=t;if(0===(t=+t)&&function(t){for(var e,r=t.length,n=0;n<r;n++)if(((e=t.charCodeAt(n))<9||e>13)&&32!==e&&133!==e&&160!==e&&5760!==e&&6158!==e&&(e<8192||e>8205)&&8232!==e&&8233!==e&&8239!==e&&8287!==e&&8288!==e&&12288!==e&&65279!==e)return!1;return!0}(r))return!1}else if("number"!==e)return!1;return t-t<1}},{}],215:[function(t,e,r){"use strict";e.exports=function(t,e,r){switch(arguments.length){case 0:return new o([0],[0],0);case 1:if("number"==typeof t){var n=l(t);return new o(n,n,0)}return new o(t,l(t.length),0);case 2:if("number"==typeof e){var n=l(t.length);return new o(t,n,+e)}r=0;case 3:if(t.length!==e.length)throw new Error("state and velocity lengths must match");return new o(t,e,r)}};var n=t("cubic-hermite"),i=t("binary-search-bounds");function a(t,e,r){return Math.min(e,Math.max(t,r))}function o(t,e,r){this.dimension=t.length,this.bounds=[new Array(this.dimension),new Array(this.dimension)];for(var n=0;n<this.dimension;++n)this.bounds[0][n]=-1/0,this.bounds[1][n]=1/0;this._state=t.slice().reverse(),this._velocity=e.slice().reverse(),this._time=[r],this._scratch=[t.slice(),t.slice(),t.slice(),t.slice(),t.slice()]}var s=o.prototype;function l(t){for(var e=new Array(t),r=0;r<t;++r)e[r]=0;return e}s.flush=function(t){var e=i.gt(this._time,t)-1;e<=0||(this._time.splice(0,e),this._state.splice(0,e*this.dimension),this._velocity.splice(0,e*this.dimension))},s.curve=function(t){var e=this._time,r=e.length,o=i.le(e,t),s=this._scratch[0],l=this._state,c=this._velocity,u=this.dimension,h=this.bounds;if(o<0)for(var f=u-1,p=0;p<u;++p,--f)s[p]=l[f];else if(o>=r-1){f=l.length-1;var d=t-e[r-1];for(p=0;p<u;++p,--f)s[p]=l[f]+d*c[f]}else{f=u*(o+1)-1;var g=e[o],m=e[o+1]-g||1,v=this._scratch[1],y=this._scratch[2],x=this._scratch[3],b=this._scratch[4],_=!0;for(p=0;p<u;++p,--f)v[p]=l[f],x[p]=c[f]*m,y[p]=l[f+u],b[p]=c[f+u]*m,_=_&&v[p]===y[p]&&x[p]===b[p]&&0===x[p];if(_)for(p=0;p<u;++p)s[p]=v[p];else n(v,x,y,b,(t-g)/m,s)}var w=h[0],k=h[1];for(p=0;p<u;++p)s[p]=a(w[p],k[p],s[p]);return s},s.dcurve=function(t){var e=this._time,r=e.length,a=i.le(e,t),o=this._scratch[0],s=this._state,l=this._velocity,c=this.dimension;if(a>=r-1)for(var u=s.length-1,h=(e[r-1],0);h<c;++h,--u)o[h]=l[u];else{u=c*(a+1)-1;var f=e[a],p=e[a+1]-f||1,d=this._scratch[1],g=this._scratch[2],m=this._scratch[3],v=this._scratch[4],y=!0;for(h=0;h<c;++h,--u)d[h]=s[u],m[h]=l[u]*p,g[h]=s[u+c],v[h]=l[u+c]*p,y=y&&d[h]===g[h]&&m[h]===v[h]&&0===m[h];if(y)for(h=0;h<c;++h)o[h]=0;else{n.derivative(d,m,g,v,(t-f)/p,o);for(h=0;h<c;++h)o[h]/=p}}return o},s.lastT=function(){var t=this._time;return t[t.length-1]},s.stable=function(){for(var t=this._velocity,e=t.length,r=this.dimension-1;r>=0;--r)if(t[--e])return!1;return!0},s.jump=function(t){var e=this.lastT(),r=this.dimension;if(!(t<e||arguments.length!==r+1)){var n=this._state,i=this._velocity,o=n.length-this.dimension,s=this.bounds,l=s[0],c=s[1];this._time.push(e,t);for(var u=0;u<2;++u)for(var h=0;h<r;++h)n.push(n[o++]),i.push(0);this._time.push(t);for(h=r;h>0;--h)n.push(a(l[h-1],c[h-1],arguments[h])),i.push(0)}},s.push=function(t){var e=this.lastT(),r=this.dimension;if(!(t<e||arguments.length!==r+1)){var n=this._state,i=this._velocity,o=n.length-this.dimension,s=t-e,l=this.bounds,c=l[0],u=l[1],h=s>1e-6?1/s:0;this._time.push(t);for(var f=r;f>0;--f){var p=a(c[f-1],u[f-1],arguments[f]);n.push(p),i.push((p-n[o++])*h)}}},s.set=function(t){var e=this.dimension;if(!(t<this.lastT()||arguments.length!==e+1)){var r=this._state,n=this._velocity,i=this.bounds,o=i[0],s=i[1];this._time.push(t);for(var l=e;l>0;--l)r.push(a(o[l-1],s[l-1],arguments[l])),n.push(0)}},s.move=function(t){var e=this.lastT(),r=this.dimension;if(!(t<=e||arguments.length!==r+1)){var n=this._state,i=this._velocity,o=n.length-this.dimension,s=this.bounds,l=s[0],c=s[1],u=t-e,h=u>1e-6?1/u:0;this._time.push(t);for(var f=r;f>0;--f){var p=arguments[f];n.push(a(l[f-1],c[f-1],n[o++]+p)),i.push(p*h)}}},s.idle=function(t){var e=this.lastT();if(!(t<e)){var r=this.dimension,n=this._state,i=this._velocity,o=n.length-r,s=this.bounds,l=s[0],c=s[1],u=t-e;this._time.push(t);for(var h=r-1;h>=0;--h)n.push(a(l[h],c[h],n[o]+u*i[o])),i.push(0),o+=1}}},{"binary-search-bounds":79,"cubic-hermite":132}],216:[function(t,e,r){var n=t("dtype");e.exports=function(t,e,r){if(!t)throw new TypeError("must specify data as first parameter");if(r=0|+(r||0),Array.isArray(t)&&Array.isArray(t[0])){var i=t[0].length,a=t.length*i;e&&"string"!=typeof e||(e=new(n(e||"float32"))(a+r));var o=e.length-r;if(a!==o)throw new Error("source length "+a+" ("+i+"x"+t.length+") does not match destination length "+o);for(var s=0,l=r;s<t.length;s++)for(var c=0;c<i;c++)e[l++]=t[s][c]}else if(e&&"string"!=typeof e)e.set(t,r);else{var u=n(e||"float32");0===r?e=new u(t):(e=new u(t.length+r)).set(t,r)}return e}},{dtype:153}],217:[function(t,e,r){"use strict";var n=t("css-font/stringify"),i=[32,126];e.exports=function(t){var e=(t=t||{}).shape?t.shape:t.canvas?[t.canvas.width,t.canvas.height]:[512,512],r=t.canvas||document.createElement("canvas"),a=t.font,o="number"==typeof t.step?[t.step,t.step]:t.step||[32,32],s=t.chars||i;a&&"string"!=typeof a&&(a=n(a));if(Array.isArray(s)){if(2===s.length&&"number"==typeof s[0]&&"number"==typeof s[1]){for(var l=[],c=s[0],u=0;c<=s[1];c++)l[u++]=String.fromCharCode(c);s=l}}else s=String(s).split("");e=e.slice(),r.width=e[0],r.height=e[1];var h=r.getContext("2d");h.fillStyle="#000",h.fillRect(0,0,r.width,r.height),h.font=a,h.textAlign="center",h.textBaseline="middle",h.fillStyle="#fff";for(var f=o[0]/2,p=o[1]/2,c=0;c<s.length;c++)h.fillText(s[c],f,p),(f+=o[0])>e[0]-o[0]/2&&(f=o[0]/2,p+=o[1]);return r}},{"css-font/stringify":129}],218:[function(t,e,r){"use strict";function n(t,e){e||(e={}),("string"==typeof t||Array.isArray(t))&&(e.family=t);var r=Array.isArray(e.family)?e.family.join(", "):e.family;if(!r)throw Error("`family` must be defined");var s=e.size||e.fontSize||e.em||48,l=e.weight||e.fontWeight||"",c=(t=[e.style||e.fontStyle||"",l,s].join(" ")+"px "+r,e.origin||"top");if(n.cache[r]&&s<=n.cache[r].em)return i(n.cache[r],c);var u=e.canvas||n.canvas,h=u.getContext("2d"),f={upper:void 0!==e.upper?e.upper:"H",lower:void 0!==e.lower?e.lower:"x",descent:void 0!==e.descent?e.descent:"p",ascent:void 0!==e.ascent?e.ascent:"h",tittle:void 0!==e.tittle?e.tittle:"i",overshoot:void 0!==e.overshoot?e.overshoot:"O"},p=Math.ceil(1.5*s);u.height=p,u.width=.5*p,h.font=t;var d={top:0};h.clearRect(0,0,p,p),h.textBaseline="top",h.fillStyle="black",h.fillText("H",0,0);var g=a(h.getImageData(0,0,p,p));h.clearRect(0,0,p,p),h.textBaseline="bottom",h.fillText("H",0,p);var m=a(h.getImageData(0,0,p,p));d.lineHeight=d.bottom=p-m+g,h.clearRect(0,0,p,p),h.textBaseline="alphabetic",h.fillText("H",0,p);var v=p-a(h.getImageData(0,0,p,p))-1+g;d.baseline=d.alphabetic=v,h.clearRect(0,0,p,p),h.textBaseline="middle",h.fillText("H",0,.5*p);var y=a(h.getImageData(0,0,p,p));d.median=d.middle=p-y-1+g-.5*p,h.clearRect(0,0,p,p),h.textBaseline="hanging",h.fillText("H",0,.5*p);var x=a(h.getImageData(0,0,p,p));d.hanging=p-x-1+g-.5*p,h.clearRect(0,0,p,p),h.textBaseline="ideographic",h.fillText("H",0,p);var b=a(h.getImageData(0,0,p,p));if(d.ideographic=p-b-1+g,f.upper&&(h.clearRect(0,0,p,p),h.textBaseline="top",h.fillText(f.upper,0,0),d.upper=a(h.getImageData(0,0,p,p)),d.capHeight=d.baseline-d.upper),f.lower&&(h.clearRect(0,0,p,p),h.textBaseline="top",h.fillText(f.lower,0,0),d.lower=a(h.getImageData(0,0,p,p)),d.xHeight=d.baseline-d.lower),f.tittle&&(h.clearRect(0,0,p,p),h.textBaseline="top",h.fillText(f.tittle,0,0),d.tittle=a(h.getImageData(0,0,p,p))),f.ascent&&(h.clearRect(0,0,p,p),h.textBaseline="top",h.fillText(f.ascent,0,0),d.ascent=a(h.getImageData(0,0,p,p))),f.descent&&(h.clearRect(0,0,p,p),h.textBaseline="top",h.fillText(f.descent,0,0),d.descent=o(h.getImageData(0,0,p,p))),f.overshoot){h.clearRect(0,0,p,p),h.textBaseline="top",h.fillText(f.overshoot,0,0);var _=o(h.getImageData(0,0,p,p));d.overshoot=_-v}for(var w in d)d[w]/=s;return d.em=s,n.cache[r]=d,i(d,c)}function i(t,e){var r={};for(var n in"string"==typeof e&&(e=t[e]),t)"em"!==n&&(r[n]=t[n]-e);return r}function a(t){for(var e=t.height,r=t.data,n=3;n<r.length;n+=4)if(0!==r[n])return Math.floor(.25*(n-3)/e)}function o(t){for(var e=t.height,r=t.data,n=r.length-1;n>0;n-=4)if(0!==r[n])return Math.floor(.25*(n-3)/e)}e.exports=n,n.canvas=document.createElement("canvas"),n.cache={}},{}],219:[function(t,e,r){"use strict";e.exports=function(t){return new c(t||d,null)};var n=0,i=1;function a(t,e,r,n,i,a){this._color=t,this.key=e,this.value=r,this.left=n,this.right=i,this._count=a}function o(t){return new a(t._color,t.key,t.value,t.left,t.right,t._count)}function s(t,e){return new a(t,e.key,e.value,e.left,e.right,e._count)}function l(t){t._count=1+(t.left?t.left._count:0)+(t.right?t.right._count:0)}function c(t,e){this._compare=t,this.root=e}var u=c.prototype;function h(t,e){this.tree=t,this._stack=e}Object.defineProperty(u,"keys",{get:function(){var t=[];return this.forEach(function(e,r){t.push(e)}),t}}),Object.defineProperty(u,"values",{get:function(){var t=[];return this.forEach(function(e,r){t.push(r)}),t}}),Object.defineProperty(u,"length",{get:function(){return this.root?this.root._count:0}}),u.insert=function(t,e){for(var r=this._compare,o=this.root,u=[],h=[];o;){var f=r(t,o.key);u.push(o),h.push(f),o=f<=0?o.left:o.right}u.push(new a(n,t,e,null,null,1));for(var p=u.length-2;p>=0;--p){o=u[p];h[p]<=0?u[p]=new a(o._color,o.key,o.value,u[p+1],o.right,o._count+1):u[p]=new a(o._color,o.key,o.value,o.left,u[p+1],o._count+1)}for(p=u.length-1;p>1;--p){var d=u[p-1];o=u[p];if(d._color===i||o._color===i)break;var g=u[p-2];if(g.left===d)if(d.left===o){if(!(m=g.right)||m._color!==n){if(g._color=n,g.left=d.right,d._color=i,d.right=g,u[p-2]=d,u[p-1]=o,l(g),l(d),p>=3)(v=u[p-3]).left===g?v.left=d:v.right=d;break}d._color=i,g.right=s(i,m),g._color=n,p-=1}else{if(!(m=g.right)||m._color!==n){if(d.right=o.left,g._color=n,g.left=o.right,o._color=i,o.left=d,o.right=g,u[p-2]=o,u[p-1]=d,l(g),l(d),l(o),p>=3)(v=u[p-3]).left===g?v.left=o:v.right=o;break}d._color=i,g.right=s(i,m),g._color=n,p-=1}else if(d.right===o){if(!(m=g.left)||m._color!==n){if(g._color=n,g.right=d.left,d._color=i,d.left=g,u[p-2]=d,u[p-1]=o,l(g),l(d),p>=3)(v=u[p-3]).right===g?v.right=d:v.left=d;break}d._color=i,g.left=s(i,m),g._color=n,p-=1}else{var m;if(!(m=g.left)||m._color!==n){var v;if(d.left=o.right,g._color=n,g.right=o.left,o._color=i,o.right=d,o.left=g,u[p-2]=o,u[p-1]=d,l(g),l(d),l(o),p>=3)(v=u[p-3]).right===g?v.right=o:v.left=o;break}d._color=i,g.left=s(i,m),g._color=n,p-=1}}return u[0]._color=i,new c(r,u[0])},u.forEach=function(t,e,r){if(this.root)switch(arguments.length){case 1:return function t(e,r){var n;if(r.left&&(n=t(e,r.left)))return n;return(n=e(r.key,r.value))||(r.right?t(e,r.right):void 0)}(t,this.root);case 2:return function t(e,r,n,i){if(r(e,i.key)<=0){var a;if(i.left&&(a=t(e,r,n,i.left)))return a;if(a=n(i.key,i.value))return a}if(i.right)return t(e,r,n,i.right)}(e,this._compare,t,this.root);case 3:if(this._compare(e,r)>=0)return;return function t(e,r,n,i,a){var o,s=n(e,a.key),l=n(r,a.key);if(s<=0){if(a.left&&(o=t(e,r,n,i,a.left)))return o;if(l>0&&(o=i(a.key,a.value)))return o}if(l>0&&a.right)return t(e,r,n,i,a.right)}(e,r,this._compare,t,this.root)}},Object.defineProperty(u,"begin",{get:function(){for(var t=[],e=this.root;e;)t.push(e),e=e.left;return new h(this,t)}}),Object.defineProperty(u,"end",{get:function(){for(var t=[],e=this.root;e;)t.push(e),e=e.right;return new h(this,t)}}),u.at=function(t){if(t<0)return new h(this,[]);for(var e=this.root,r=[];;){if(r.push(e),e.left){if(t<e.left._count){e=e.left;continue}t-=e.left._count}if(!t)return new h(this,r);if(t-=1,!e.right)break;if(t>=e.right._count)break;e=e.right}return new h(this,[])},u.ge=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a<=0&&(i=n.length),r=a<=0?r.left:r.right}return n.length=i,new h(this,n)},u.gt=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a<0&&(i=n.length),r=a<0?r.left:r.right}return n.length=i,new h(this,n)},u.lt=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a>0&&(i=n.length),r=a<=0?r.left:r.right}return n.length=i,new h(this,n)},u.le=function(t){for(var e=this._compare,r=this.root,n=[],i=0;r;){var a=e(t,r.key);n.push(r),a>=0&&(i=n.length),r=a<0?r.left:r.right}return n.length=i,new h(this,n)},u.find=function(t){for(var e=this._compare,r=this.root,n=[];r;){var i=e(t,r.key);if(n.push(r),0===i)return new h(this,n);r=i<=0?r.left:r.right}return new h(this,[])},u.remove=function(t){var e=this.find(t);return e?e.remove():this},u.get=function(t){for(var e=this._compare,r=this.root;r;){var n=e(t,r.key);if(0===n)return r.value;r=n<=0?r.left:r.right}};var f=h.prototype;function p(t,e){t.key=e.key,t.value=e.value,t.left=e.left,t.right=e.right,t._color=e._color,t._count=e._count}function d(t,e){return t<e?-1:t>e?1:0}Object.defineProperty(f,"valid",{get:function(){return this._stack.length>0}}),Object.defineProperty(f,"node",{get:function(){return this._stack.length>0?this._stack[this._stack.length-1]:null},enumerable:!0}),f.clone=function(){return new h(this.tree,this._stack.slice())},f.remove=function(){var t=this._stack;if(0===t.length)return this.tree;var e=new Array(t.length),r=t[t.length-1];e[e.length-1]=new a(r._color,r.key,r.value,r.left,r.right,r._count);for(var u=t.length-2;u>=0;--u){(r=t[u]).left===t[u+1]?e[u]=new a(r._color,r.key,r.value,e[u+1],r.right,r._count):e[u]=new a(r._color,r.key,r.value,r.left,e[u+1],r._count)}if((r=e[e.length-1]).left&&r.right){var h=e.length;for(r=r.left;r.right;)e.push(r),r=r.right;var f=e[h-1];e.push(new a(r._color,f.key,f.value,r.left,r.right,r._count)),e[h-1].key=r.key,e[h-1].value=r.value;for(u=e.length-2;u>=h;--u)r=e[u],e[u]=new a(r._color,r.key,r.value,r.left,e[u+1],r._count);e[h-1].left=e[h]}if((r=e[e.length-1])._color===n){var d=e[e.length-2];d.left===r?d.left=null:d.right===r&&(d.right=null),e.pop();for(u=0;u<e.length;++u)e[u]._count--;return new c(this.tree._compare,e[0])}if(r.left||r.right){r.left?p(r,r.left):r.right&&p(r,r.right),r._color=i;for(u=0;u<e.length-1;++u)e[u]._count--;return new c(this.tree._compare,e[0])}if(1===e.length)return new c(this.tree._compare,null);for(u=0;u<e.length;++u)e[u]._count--;var g=e[e.length-2];return function(t){for(var e,r,a,c,u=t.length-1;u>=0;--u){if(e=t[u],0===u)return void(e._color=i);if((r=t[u-1]).left===e){if((a=r.right).right&&a.right._color===n)return c=(a=r.right=o(a)).right=o(a.right),r.right=a.left,a.left=r,a.right=c,a._color=r._color,e._color=i,r._color=i,c._color=i,l(r),l(a),u>1&&((h=t[u-2]).left===r?h.left=a:h.right=a),void(t[u-1]=a);if(a.left&&a.left._color===n)return c=(a=r.right=o(a)).left=o(a.left),r.right=c.left,a.left=c.right,c.left=r,c.right=a,c._color=r._color,r._color=i,a._color=i,e._color=i,l(r),l(a),l(c),u>1&&((h=t[u-2]).left===r?h.left=c:h.right=c),void(t[u-1]=c);if(a._color===i){if(r._color===n)return r._color=i,void(r.right=s(n,a));r.right=s(n,a);continue}a=o(a),r.right=a.left,a.left=r,a._color=r._color,r._color=n,l(r),l(a),u>1&&((h=t[u-2]).left===r?h.left=a:h.right=a),t[u-1]=a,t[u]=r,u+1<t.length?t[u+1]=e:t.push(e),u+=2}else{if((a=r.left).left&&a.left._color===n)return c=(a=r.left=o(a)).left=o(a.left),r.left=a.right,a.right=r,a.left=c,a._color=r._color,e._color=i,r._color=i,c._color=i,l(r),l(a),u>1&&((h=t[u-2]).right===r?h.right=a:h.left=a),void(t[u-1]=a);if(a.right&&a.right._color===n)return c=(a=r.left=o(a)).right=o(a.right),r.left=c.right,a.right=c.left,c.right=r,c.left=a,c._color=r._color,r._color=i,a._color=i,e._color=i,l(r),l(a),l(c),u>1&&((h=t[u-2]).right===r?h.right=c:h.left=c),void(t[u-1]=c);if(a._color===i){if(r._color===n)return r._color=i,void(r.left=s(n,a));r.left=s(n,a);continue}var h;a=o(a),r.left=a.right,a.right=r,a._color=r._color,r._color=n,l(r),l(a),u>1&&((h=t[u-2]).right===r?h.right=a:h.left=a),t[u-1]=a,t[u]=r,u+1<t.length?t[u+1]=e:t.push(e),u+=2}}}(e),g.left===r?g.left=null:g.right=null,new c(this.tree._compare,e[0])},Object.defineProperty(f,"key",{get:function(){if(this._stack.length>0)return this._stack[this._stack.length-1].key},enumerable:!0}),Object.defineProperty(f,"value",{get:function(){if(this._stack.length>0)return this._stack[this._stack.length-1].value},enumerable:!0}),Object.defineProperty(f,"index",{get:function(){var t=0,e=this._stack;if(0===e.length){var r=this.tree.root;return r?r._count:0}e[e.length-1].left&&(t=e[e.length-1].left._count);for(var n=e.length-2;n>=0;--n)e[n+1]===e[n].right&&(++t,e[n].left&&(t+=e[n].left._count));return t},enumerable:!0}),f.next=function(){var t=this._stack;if(0!==t.length){var e=t[t.length-1];if(e.right)for(e=e.right;e;)t.push(e),e=e.left;else for(t.pop();t.length>0&&t[t.length-1].right===e;)e=t[t.length-1],t.pop()}},Object.defineProperty(f,"hasNext",{get:function(){var t=this._stack;if(0===t.length)return!1;if(t[t.length-1].right)return!0;for(var e=t.length-1;e>0;--e)if(t[e-1].left===t[e])return!0;return!1}}),f.update=function(t){var e=this._stack;if(0===e.length)throw new Error("Can't update empty node!");var r=new Array(e.length),n=e[e.length-1];r[r.length-1]=new a(n._color,n.key,t,n.left,n.right,n._count);for(var i=e.length-2;i>=0;--i)(n=e[i]).left===e[i+1]?r[i]=new a(n._color,n.key,n.value,r[i+1],n.right,n._count):r[i]=new a(n._color,n.key,n.value,n.left,r[i+1],n._count);return new c(this.tree._compare,r[0])},f.prev=function(){var t=this._stack;if(0!==t.length){var e=t[t.length-1];if(e.left)for(e=e.left;e;)t.push(e),e=e.right;else for(t.pop();t.length>0&&t[t.length-1].left===e;)e=t[t.length-1],t.pop()}},Object.defineProperty(f,"hasPrev",{get:function(){var t=this._stack;if(0===t.length)return!1;if(t[t.length-1].left)return!0;for(var e=t.length-1;e>0;--e)if(t[e-1].right===t[e])return!0;return!1}})},{}],220:[function(t,e,r){var n=[.9999999999998099,676.5203681218851,-1259.1392167224028,771.3234287776531,-176.6150291621406,12.507343278686905,-.13857109526572012,9984369578019572e-21,1.5056327351493116e-7],i=607/128,a=[.9999999999999971,57.15623566586292,-59.59796035547549,14.136097974741746,-.4919138160976202,3399464998481189e-20,4652362892704858e-20,-9837447530487956e-20,.0001580887032249125,-.00021026444172410488,.00021743961811521265,-.0001643181065367639,8441822398385275e-20,-26190838401581408e-21,36899182659531625e-22];function o(t){if(t<0)return Number("0/0");for(var e=a[0],r=a.length-1;r>0;--r)e+=a[r]/(t+r);var n=t+i+.5;return.5*Math.log(2*Math.PI)+(t+.5)*Math.log(n)-n+Math.log(e)-Math.log(t)}e.exports=function t(e){if(e<.5)return Math.PI/(Math.sin(Math.PI*e)*t(1-e));if(e>100)return Math.exp(o(e));e-=1;for(var r=n[0],i=1;i<9;i++)r+=n[i]/(e+i);var a=e+7+.5;return Math.sqrt(2*Math.PI)*Math.pow(a,e+.5)*Math.exp(-a)*r},e.exports.log=o},{}],221:[function(t,e,r){e.exports=function(t,e){if("string"!=typeof t)throw new TypeError("must specify type string");if(e=e||{},"undefined"==typeof document&&!e.canvas)return null;var r=e.canvas||document.createElement("canvas");"number"==typeof e.width&&(r.width=e.width);"number"==typeof e.height&&(r.height=e.height);var n,i=e;try{var a=[t];0===t.indexOf("webgl")&&a.push("experimental-"+t);for(var o=0;o<a.length;o++)if(n=r.getContext(a[o],i))return n}catch(t){n=null}return n||null}},{}],222:[function(t,e,r){"use strict";e.exports=function(t,e){var r=new u(t);return r.update(e),r};var n=t("./lib/text.js"),i=t("./lib/lines.js"),a=t("./lib/background.js"),o=t("./lib/cube.js"),s=t("./lib/ticks.js"),l=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]);function c(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function u(t){this.gl=t,this.pixelRatio=1,this.bounds=[[-10,-10,-10],[10,10,10]],this.ticks=[[],[],[]],this.autoTicks=!0,this.tickSpacing=[1,1,1],this.tickEnable=[!0,!0,!0],this.tickFont=["sans-serif","sans-serif","sans-serif"],this.tickSize=[12,12,12],this.tickAngle=[0,0,0],this.tickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.tickPad=[10,10,10],this.lastCubeProps={cubeEdges:[0,0,0],axis:[0,0,0]},this.labels=["x","y","z"],this.labelEnable=[!0,!0,!0],this.labelFont="sans-serif",this.labelSize=[20,20,20],this.labelAngle=[0,0,0],this.labelColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.labelPad=[10,10,10],this.lineEnable=[!0,!0,!0],this.lineMirror=[!1,!1,!1],this.lineWidth=[1,1,1],this.lineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.lineTickEnable=[!0,!0,!0],this.lineTickMirror=[!1,!1,!1],this.lineTickLength=[0,0,0],this.lineTickWidth=[1,1,1],this.lineTickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.gridEnable=[!0,!0,!0],this.gridWidth=[1,1,1],this.gridColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.zeroEnable=[!0,!0,!0],this.zeroLineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.zeroLineWidth=[2,2,2],this.backgroundEnable=[!1,!1,!1],this.backgroundColor=[[.8,.8,.8,.5],[.8,.8,.8,.5],[.8,.8,.8,.5]],this._firstInit=!0,this._text=null,this._lines=null,this._background=a(t)}var h=u.prototype;function f(){this.primalOffset=[0,0,0],this.primalMinor=[0,0,0],this.mirrorOffset=[0,0,0],this.mirrorMinor=[0,0,0]}h.update=function(t){function e(e,r,n){if(n in t){var i,a=t[n],o=this[n];(e?Array.isArray(a)&&Array.isArray(a[0]):Array.isArray(a))?this[n]=i=[r(a[0]),r(a[1]),r(a[2])]:this[n]=i=[r(a),r(a),r(a)];for(var s=0;s<3;++s)if(i[s]!==o[s])return!0}return!1}t=t||{};var r,a=e.bind(this,!1,Number),o=e.bind(this,!1,Boolean),l=e.bind(this,!1,String),c=e.bind(this,!0,function(t){if(Array.isArray(t)){if(3===t.length)return[+t[0],+t[1],+t[2],1];if(4===t.length)return[+t[0],+t[1],+t[2],+t[3]]}return[0,0,0,1]}),u=!1,h=!1;if("bounds"in t)for(var f=t.bounds,p=0;p<2;++p)for(var d=0;d<3;++d)f[p][d]!==this.bounds[p][d]&&(h=!0),this.bounds[p][d]=f[p][d];if("ticks"in t){r=t.ticks,u=!0,this.autoTicks=!1;for(p=0;p<3;++p)this.tickSpacing[p]=0}else a("tickSpacing")&&(this.autoTicks=!0,h=!0);if(this._firstInit&&("ticks"in t||"tickSpacing"in t||(this.autoTicks=!0),h=!0,u=!0,this._firstInit=!1),h&&this.autoTicks&&(r=s.create(this.bounds,this.tickSpacing),u=!0),u){for(p=0;p<3;++p)r[p].sort(function(t,e){return t.x-e.x});s.equal(r,this.ticks)?u=!1:this.ticks=r}o("tickEnable"),l("tickFont")&&(u=!0),a("tickSize"),a("tickAngle"),a("tickPad"),c("tickColor");var g=l("labels");l("labelFont")&&(g=!0),o("labelEnable"),a("labelSize"),a("labelPad"),c("labelColor"),o("lineEnable"),o("lineMirror"),a("lineWidth"),c("lineColor"),o("lineTickEnable"),o("lineTickMirror"),a("lineTickLength"),a("lineTickWidth"),c("lineTickColor"),o("gridEnable"),a("gridWidth"),c("gridColor"),o("zeroEnable"),c("zeroLineColor"),a("zeroLineWidth"),o("backgroundEnable"),c("backgroundColor"),this._text?this._text&&(g||u)&&this._text.update(this.bounds,this.labels,this.labelFont,this.ticks,this.tickFont):this._text=n(this.gl,this.bounds,this.labels,this.labelFont,this.ticks,this.tickFont),this._lines&&u&&(this._lines.dispose(),this._lines=null),this._lines||(this._lines=i(this.gl,this.bounds,this.ticks))};var p=[new f,new f,new f];function d(t,e,r,n,i){for(var a=t.primalOffset,o=t.primalMinor,s=t.mirrorOffset,l=t.mirrorMinor,c=n[e],u=0;u<3;++u)if(e!==u){var h=a,f=s,p=o,d=l;c&1<<u&&(h=s,f=a,p=l,d=o),h[u]=r[0][u],f[u]=r[1][u],i[u]>0?(p[u]=-1,d[u]=0):(p[u]=0,d[u]=1)}}var g=[0,0,0],m={model:l,view:l,projection:l};h.isOpaque=function(){return!0},h.isTransparent=function(){return!1},h.drawTransparent=function(t){};var v=[0,0,0],y=[0,0,0],x=[0,0,0];h.draw=function(t){t=t||m;for(var e=this.gl,r=t.model||l,n=t.view||l,i=t.projection||l,a=this.bounds,s=o(r,n,i,a),u=s.cubeEdges,h=s.axis,f=n[12],b=n[13],_=n[14],w=n[15],k=this.pixelRatio*(i[3]*f+i[7]*b+i[11]*_+i[15]*w)/e.drawingBufferHeight,M=0;M<3;++M)this.lastCubeProps.cubeEdges[M]=u[M],this.lastCubeProps.axis[M]=h[M];var A=p;for(M=0;M<3;++M)d(p[M],M,this.bounds,u,h);e=this.gl;var T=g;for(M=0;M<3;++M)this.backgroundEnable[M]?T[M]=h[M]:T[M]=0;this._background.draw(r,n,i,a,T,this.backgroundColor),this._lines.bind(r,n,i,this);for(M=0;M<3;++M){var S=[0,0,0];h[M]>0?S[M]=a[1][M]:S[M]=a[0][M];for(var E=0;E<2;++E){var C=(M+1+E)%3,L=(M+1+(1^E))%3;this.gridEnable[C]&&this._lines.drawGrid(C,L,this.bounds,S,this.gridColor[C],this.gridWidth[C]*this.pixelRatio)}for(E=0;E<2;++E){C=(M+1+E)%3,L=(M+1+(1^E))%3;this.zeroEnable[L]&&a[0][L]<=0&&a[1][L]>=0&&this._lines.drawZero(C,L,this.bounds,S,this.zeroLineColor[L],this.zeroLineWidth[L]*this.pixelRatio)}}for(M=0;M<3;++M){this.lineEnable[M]&&this._lines.drawAxisLine(M,this.bounds,A[M].primalOffset,this.lineColor[M],this.lineWidth[M]*this.pixelRatio),this.lineMirror[M]&&this._lines.drawAxisLine(M,this.bounds,A[M].mirrorOffset,this.lineColor[M],this.lineWidth[M]*this.pixelRatio);var z=c(v,A[M].primalMinor),P=c(y,A[M].mirrorMinor),I=this.lineTickLength;for(E=0;E<3;++E){var O=k/r[5*E];z[E]*=I[E]*O,P[E]*=I[E]*O}this.lineTickEnable[M]&&this._lines.drawAxisTicks(M,A[M].primalOffset,z,this.lineTickColor[M],this.lineTickWidth[M]*this.pixelRatio),this.lineTickMirror[M]&&this._lines.drawAxisTicks(M,A[M].mirrorOffset,P,this.lineTickColor[M],this.lineTickWidth[M]*this.pixelRatio)}this._lines.unbind(),this._text.bind(r,n,i,this.pixelRatio);for(M=0;M<3;++M){var D=A[M].primalMinor,R=c(x,A[M].primalOffset);for(E=0;E<3;++E)this.lineTickEnable[M]&&(R[E]+=k*D[E]*Math.max(this.lineTickLength[E],0)/r[5*E]);if(this.tickEnable[M]){for(E=0;E<3;++E)R[E]+=k*D[E]*this.tickPad[E]/r[5*E];this._text.drawTicks(M,this.tickSize[M],this.tickAngle[M],R,this.tickColor[M])}if(this.labelEnable[M]){for(E=0;E<3;++E)R[E]+=k*D[E]*this.labelPad[E]/r[5*E];R[M]+=.5*(a[0][M]+a[1][M]),this._text.drawLabel(M,this.labelSize[M],this.labelAngle[M],R,this.labelColor[M])}}this._text.unbind()},h.dispose=function(){this._text.dispose(),this._lines.dispose(),this._background.dispose(),this._lines=null,this._text=null,this._background=null,this.gl=null}},{"./lib/background.js":223,"./lib/cube.js":224,"./lib/lines.js":225,"./lib/text.js":227,"./lib/ticks.js":228}],223:[function(t,e,r){"use strict";e.exports=function(t){for(var e=[],r=[],s=0,l=0;l<3;++l)for(var c=(l+1)%3,u=(l+2)%3,h=[0,0,0],f=[0,0,0],p=-1;p<=1;p+=2){r.push(s,s+2,s+1,s+1,s+2,s+3),h[l]=p,f[l]=p;for(var d=-1;d<=1;d+=2){h[c]=d;for(var g=-1;g<=1;g+=2)h[u]=g,e.push(h[0],h[1],h[2],f[0],f[1],f[2]),s+=1}var m=c;c=u,u=m}var v=n(t,new Float32Array(e)),y=n(t,new Uint16Array(r),t.ELEMENT_ARRAY_BUFFER),x=i(t,[{buffer:v,type:t.FLOAT,size:3,offset:0,stride:24},{buffer:v,type:t.FLOAT,size:3,offset:12,stride:24}],y),b=a(t);return b.attributes.position.location=0,b.attributes.normal.location=1,new o(t,v,x,b)};var n=t("gl-buffer"),i=t("gl-vao"),a=t("./shaders").bg;function o(t,e,r,n){this.gl=t,this.buffer=e,this.vao=r,this.shader=n}var s=o.prototype;s.draw=function(t,e,r,n,i,a){for(var o=!1,s=0;s<3;++s)o=o||i[s];if(o){var l=this.gl;l.enable(l.POLYGON_OFFSET_FILL),l.polygonOffset(1,2),this.shader.bind(),this.shader.uniforms={model:t,view:e,projection:r,bounds:n,enable:i,colors:a},this.vao.bind(),this.vao.draw(this.gl.TRIANGLES,36),this.vao.unbind(),l.disable(l.POLYGON_OFFSET_FILL)}},s.dispose=function(){this.vao.dispose(),this.buffer.dispose(),this.shader.dispose()}},{"./shaders":226,"gl-buffer":230,"gl-vao":308}],224:[function(t,e,r){"use strict";e.exports=function(t,e,r,a){i(s,e,t),i(s,r,s);for(var p=0,y=0;y<2;++y){u[2]=a[y][2];for(var x=0;x<2;++x){u[1]=a[x][1];for(var b=0;b<2;++b)u[0]=a[b][0],f(l[p],u,s),p+=1}}for(var _=-1,y=0;y<8;++y){for(var w=l[y][3],k=0;k<3;++k)c[y][k]=l[y][k]/w;w<0&&(_<0?_=y:c[y][2]<c[_][2]&&(_=y))}if(_<0){_=0;for(var M=0;M<3;++M){for(var A=(M+2)%3,T=(M+1)%3,S=-1,E=-1,C=0;C<2;++C){var L=C<<M,z=L+(C<<A)+(1-C<<T),P=L+(1-C<<A)+(C<<T);o(c[L],c[z],c[P],h)<0||(C?S=1:E=1)}if(S<0||E<0)E>S&&(_|=1<<M);else{for(var C=0;C<2;++C){var L=C<<M,z=L+(C<<A)+(1-C<<T),P=L+(1-C<<A)+(C<<T),I=d([l[L],l[z],l[P],l[L+(1<<A)+(1<<T)]]);C?S=I:E=I}E>S&&(_|=1<<M)}}}for(var O=7^_,D=-1,y=0;y<8;++y)y!==_&&y!==O&&(D<0?D=y:c[D][1]>c[y][1]&&(D=y));for(var R=-1,y=0;y<3;++y){var B=D^1<<y;if(B!==_&&B!==O){R<0&&(R=B);var T=c[B];T[0]<c[R][0]&&(R=B)}}for(var F=-1,y=0;y<3;++y){var B=D^1<<y;if(B!==_&&B!==O&&B!==R){F<0&&(F=B);var T=c[B];T[0]>c[F][0]&&(F=B)}}var N=g;N[0]=N[1]=N[2]=0,N[n.log2(R^D)]=D&R,N[n.log2(D^F)]=D&F;var j=7^F;j===_||j===O?(j=7^R,N[n.log2(F^j)]=j&F):N[n.log2(R^j)]=j&R;for(var V=m,U=_,M=0;M<3;++M)V[M]=U&1<<M?-1:1;return v};var n=t("bit-twiddle"),i=t("gl-mat4/multiply"),a=(t("gl-mat4/invert"),t("split-polygon")),o=t("robust-orientation"),s=new Array(16),l=(new Array(16),new Array(8)),c=new Array(8),u=new Array(3),h=[0,0,0];function f(t,e,r){for(var n=0;n<4;++n){t[n]=r[12+n];for(var i=0;i<3;++i)t[n]+=e[i]*r[4*i+n]}}!function(){for(var t=0;t<8;++t)l[t]=[1,1,1,1],c[t]=[1,1,1]}();var p=[[0,0,1,0,0],[0,0,-1,1,0],[0,-1,0,1,0],[0,1,0,1,0],[-1,0,0,1,0],[1,0,0,1,0]];function d(t){for(var e=0;e<p.length;++e)if((t=a.positive(t,p[e])).length<3)return 0;var r=t[0],n=r[0]/r[3],i=r[1]/r[3],o=0;for(e=1;e+1<t.length;++e){var s=t[e],l=t[e+1],c=s[0]/s[3]-n,u=s[1]/s[3]-i,h=l[0]/l[3]-n,f=l[1]/l[3]-i;o+=Math.abs(c*f-u*h)}return o}var g=[1,1,1],m=[0,0,0],v={cubeEdges:g,axis:m}},{"bit-twiddle":80,"gl-mat4/invert":254,"gl-mat4/multiply":256,"robust-orientation":471,"split-polygon":488}],225:[function(t,e,r){"use strict";e.exports=function(t,e,r){var o=[],s=[0,0,0],l=[0,0,0],c=[0,0,0],u=[0,0,0];o.push(0,0,1,0,1,1,0,0,-1,0,0,-1,0,1,1,0,1,-1);for(var h=0;h<3;++h){for(var f=o.length/3|0,d=0;d<r[h].length;++d){var g=+r[h][d].x;o.push(g,0,1,g,1,1,g,0,-1,g,0,-1,g,1,1,g,1,-1)}var m=o.length/3|0;s[h]=f,l[h]=m-f;for(var f=o.length/3|0,v=0;v<r[h].length;++v){var g=+r[h][v].x;o.push(g,0,1,g,1,1,g,0,-1,g,0,-1,g,1,1,g,1,-1)}var m=o.length/3|0;c[h]=f,u[h]=m-f}var y=n(t,new Float32Array(o)),x=i(t,[{buffer:y,type:t.FLOAT,size:3,stride:0,offset:0}]),b=a(t);return b.attributes.position.location=0,new p(t,y,x,b,l,s,u,c)};var n=t("gl-buffer"),i=t("gl-vao"),a=t("./shaders").line,o=[0,0,0],s=[0,0,0],l=[0,0,0],c=[0,0,0],u=[1,1];function h(t){return t[0]=t[1]=t[2]=0,t}function f(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}function p(t,e,r,n,i,a,o,s){this.gl=t,this.vertBuffer=e,this.vao=r,this.shader=n,this.tickCount=i,this.tickOffset=a,this.gridCount=o,this.gridOffset=s}var d=p.prototype;d.bind=function(t,e,r){this.shader.bind(),this.shader.uniforms.model=t,this.shader.uniforms.view=e,this.shader.uniforms.projection=r,u[0]=this.gl.drawingBufferWidth,u[1]=this.gl.drawingBufferHeight,this.shader.uniforms.screenShape=u,this.vao.bind()},d.unbind=function(){this.vao.unbind()},d.drawAxisLine=function(t,e,r,n,i){var a=h(s);this.shader.uniforms.majorAxis=s,a[t]=e[1][t]-e[0][t],this.shader.uniforms.minorAxis=a;var o,u=f(c,r);u[t]+=e[0][t],this.shader.uniforms.offset=u,this.shader.uniforms.lineWidth=i,this.shader.uniforms.color=n,(o=h(l))[(t+2)%3]=1,this.shader.uniforms.screenAxis=o,this.vao.draw(this.gl.TRIANGLES,6),(o=h(l))[(t+1)%3]=1,this.shader.uniforms.screenAxis=o,this.vao.draw(this.gl.TRIANGLES,6)},d.drawAxisTicks=function(t,e,r,n,i){if(this.tickCount[t]){var a=h(o);a[t]=1,this.shader.uniforms.majorAxis=a,this.shader.uniforms.offset=e,this.shader.uniforms.minorAxis=r,this.shader.uniforms.color=n,this.shader.uniforms.lineWidth=i;var s=h(l);s[t]=1,this.shader.uniforms.screenAxis=s,this.vao.draw(this.gl.TRIANGLES,this.tickCount[t],this.tickOffset[t])}},d.drawGrid=function(t,e,r,n,i,a){if(this.gridCount[t]){var u=h(s);u[e]=r[1][e]-r[0][e],this.shader.uniforms.minorAxis=u;var p=f(c,n);p[e]+=r[0][e],this.shader.uniforms.offset=p;var d=h(o);d[t]=1,this.shader.uniforms.majorAxis=d;var g=h(l);g[t]=1,this.shader.uniforms.screenAxis=g,this.shader.uniforms.lineWidth=a,this.shader.uniforms.color=i,this.vao.draw(this.gl.TRIANGLES,this.gridCount[t],this.gridOffset[t])}},d.drawZero=function(t,e,r,n,i,a){var o=h(s);this.shader.uniforms.majorAxis=o,o[t]=r[1][t]-r[0][t],this.shader.uniforms.minorAxis=o;var u=f(c,n);u[t]+=r[0][t],this.shader.uniforms.offset=u;var p=h(l);p[e]=1,this.shader.uniforms.screenAxis=p,this.shader.uniforms.lineWidth=a,this.shader.uniforms.color=i,this.vao.draw(this.gl.TRIANGLES,6)},d.dispose=function(){this.vao.dispose(),this.vertBuffer.dispose(),this.shader.dispose()}},{"./shaders":226,"gl-buffer":230,"gl-vao":308}],226:[function(t,e,r){"use strict";var n=t("glslify"),i=t("gl-shader"),a=n(["#define GLSLIFY 1\nattribute vec3 position;\n\nuniform mat4 model, view, projection;\nuniform vec3 offset, majorAxis, minorAxis, screenAxis;\nuniform float lineWidth;\nuniform vec2 screenShape;\n\nvec3 project(vec3 p) {\n  vec4 pp = projection * view * model * vec4(p, 1.0);\n  return pp.xyz / max(pp.w, 0.0001);\n}\n\nvoid main() {\n  vec3 major = position.x * majorAxis;\n  vec3 minor = position.y * minorAxis;\n\n  vec3 vPosition = major + minor + offset;\n  vec3 pPosition = project(vPosition);\n  vec3 offset = project(vPosition + screenAxis * position.z);\n\n  vec2 screen = normalize((offset - pPosition).xy * screenShape) / screenShape;\n\n  gl_Position = vec4(pPosition + vec3(0.5 * screen * lineWidth, 0), 1.0);\n}\n"]),o=n(["precision mediump float;\n#define GLSLIFY 1\nuniform vec4 color;\nvoid main() {\n  gl_FragColor = color;\n}"]);r.line=function(t){return i(t,a,o,null,[{name:"position",type:"vec3"}])};var s=n(["#define GLSLIFY 1\nattribute vec3 position;\n\nuniform mat4 model, view, projection;\nuniform vec3 offset, axis;\nuniform float scale, angle, pixelScale;\nuniform vec2 resolution;\n\nvoid main() {  \n  //Compute plane offset\n  vec2 planeCoord = position.xy * pixelScale;\n  mat2 planeXform = scale * mat2(cos(angle), sin(angle),\n                                -sin(angle), cos(angle));\n  vec2 viewOffset = 2.0 * planeXform * planeCoord / resolution;\n\n  //Compute world offset\n  float axisDistance = position.z;\n  vec3 dataPosition = axisDistance * axis + offset;\n  vec4 worldPosition = model * vec4(dataPosition, 1);\n  \n  //Compute clip position\n  vec4 viewPosition = view * worldPosition;\n  vec4 clipPosition = projection * viewPosition;\n  clipPosition /= clipPosition.w;\n\n  //Apply text offset in clip coordinates\n  clipPosition += vec4(viewOffset, 0, 0);\n\n  //Done\n  gl_Position = clipPosition;\n}"]),l=n(["precision mediump float;\n#define GLSLIFY 1\nuniform vec4 color;\nvoid main() {\n  gl_FragColor = color;\n}"]);r.text=function(t){return i(t,s,l,null,[{name:"position",type:"vec3"}])};var c=n(["#define GLSLIFY 1\nattribute vec3 position;\nattribute vec3 normal;\n\nuniform mat4 model, view, projection;\nuniform vec3 enable;\nuniform vec3 bounds[2];\n\nvarying vec3 colorChannel;\n\nvoid main() {\n  if(dot(normal, enable) > 0.0) {\n    vec3 nPosition = mix(bounds[0], bounds[1], 0.5 * (position + 1.0));\n    gl_Position = projection * view * model * vec4(nPosition, 1.0);\n  } else {\n    gl_Position = vec4(0,0,0,0);\n  }\n  colorChannel = abs(normal);\n}"]),u=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec4 colors[3];\n\nvarying vec3 colorChannel;\n\nvoid main() {\n  gl_FragColor = colorChannel.x * colors[0] + \n                 colorChannel.y * colors[1] +\n                 colorChannel.z * colors[2];\n}"]);r.bg=function(t){return i(t,c,u,null,[{name:"position",type:"vec3"},{name:"normal",type:"vec3"}])}},{"gl-shader":287,glslify:377}],227:[function(t,e,r){(function(r){"use strict";e.exports=function(t,e,r,a,s,l){var u=n(t),h=i(t,[{buffer:u,size:3}]),f=o(t);f.attributes.position.location=0;var p=new c(t,f,u,h);return p.update(e,r,a,s,l),p};var n=t("gl-buffer"),i=t("gl-vao"),a=t("vectorize-text"),o=t("./shaders").text,s=window||r.global||{},l=s.__TEXT_CACHE||{};s.__TEXT_CACHE={};function c(t,e,r,n){this.gl=t,this.shader=e,this.buffer=r,this.vao=n,this.tickOffset=this.tickCount=this.labelOffset=this.labelCount=null}var u=c.prototype,h=[0,0];u.bind=function(t,e,r,n){this.vao.bind(),this.shader.bind();var i=this.shader.uniforms;i.model=t,i.view=e,i.projection=r,i.pixelScale=n,h[0]=this.gl.drawingBufferWidth,h[1]=this.gl.drawingBufferHeight,this.shader.uniforms.resolution=h},u.unbind=function(){this.vao.unbind()},u.update=function(t,e,r,n,i){this.gl;var o=[];function s(t,e,r,n){var i=l[r];i||(i=l[r]={});var s=i[e];s||(s=i[e]=function(t,e){try{return a(t,e)}catch(t){return console.warn("error vectorizing text:",t),{cells:[],positions:[]}}}(e,{triangles:!0,font:r,textAlign:"center",textBaseline:"middle"}));for(var c=(n||12)/12,u=s.positions,h=s.cells,f=0,p=h.length;f<p;++f)for(var d=h[f],g=2;g>=0;--g){var m=u[d[g]];o.push(c*m[0],-c*m[1],t)}}for(var c=[0,0,0],u=[0,0,0],h=[0,0,0],f=[0,0,0],p=0;p<3;++p){h[p]=o.length/3|0,s(.5*(t[0][p]+t[1][p]),e[p],r),f[p]=(o.length/3|0)-h[p],c[p]=o.length/3|0;for(var d=0;d<n[p].length;++d)n[p][d].text&&s(n[p][d].x,n[p][d].text,n[p][d].font||i,n[p][d].fontSize||12);u[p]=(o.length/3|0)-c[p]}this.buffer.update(o),this.tickOffset=c,this.tickCount=u,this.labelOffset=h,this.labelCount=f};var f=[0,0,0];u.drawTicks=function(t,e,r,n,i){if(this.tickCount[t]){var a=f;a[0]=a[1]=a[2]=0,a[t]=1,this.shader.uniforms.axis=a,this.shader.uniforms.color=i,this.shader.uniforms.angle=r,this.shader.uniforms.scale=e,this.shader.uniforms.offset=n,this.vao.draw(this.gl.TRIANGLES,this.tickCount[t],this.tickOffset[t])}};var p=[0,0,0];u.drawLabel=function(t,e,r,n,i){this.labelCount[t]&&(this.shader.uniforms.axis=p,this.shader.uniforms.color=i,this.shader.uniforms.angle=r,this.shader.uniforms.scale=e,this.shader.uniforms.offset=n,this.vao.draw(this.gl.TRIANGLES,this.labelCount[t],this.labelOffset[t]))},u.dispose=function(){this.shader.dispose(),this.vao.dispose(),this.buffer.dispose()}}).call(this,t("_process"))},{"./shaders":226,_process:449,"gl-buffer":230,"gl-vao":308,"vectorize-text":515}],228:[function(t,e,r){"use strict";function n(t,e){var r=t+"",n=r.indexOf("."),i=0;n>=0&&(i=r.length-n-1);var a=Math.pow(10,i),o=Math.round(t*e*a),s=o+"";if(s.indexOf("e")>=0)return s;var l=o/a,c=o%a;o<0?(l=0|-Math.ceil(l),c=0|-c):(l=0|Math.floor(l),c|=0);var u=""+l;if(o<0&&(u="-"+u),i){for(var h=""+c;h.length<i;)h="0"+h;return u+"."+h}return u}r.create=function(t,e){for(var r=[],i=0;i<3;++i){for(var a=[],o=(t[0][i],t[1][i],0);o*e[i]<=t[1][i];++o)a.push({x:o*e[i],text:n(e[i],o)});for(var o=-1;o*e[i]>=t[0][i];--o)a.push({x:o*e[i],text:n(e[i],o)});r.push(a)}return r},r.equal=function(t,e){for(var r=0;r<3;++r){if(t[r].length!==e[r].length)return!1;for(var n=0;n<t[r].length;++n){var i=t[r][n],a=e[r][n];if(i.x!==a.x||i.text!==a.text||i.font!==a.font||i.fontColor!==a.fontColor||i.fontSize!==a.fontSize||i.dx!==a.dx||i.dy!==a.dy)return!1}}return!0}},{}],229:[function(t,e,r){"use strict";e.exports=function(t,e,r,l,h){var f=e.model||c,p=e.view||c,v=e.projection||c,y=t.bounds,x=(h=h||a(f,p,v,y)).axis;h.edges;o(u,p,f),o(u,v,u);for(var b=g,_=0;_<3;++_)b[_].lo=1/0,b[_].hi=-1/0,b[_].pixelsPerDataUnit=1/0;var w=n(s(u,u));s(u,u);for(var k=0;k<3;++k){var M=(k+1)%3,A=(k+2)%3,T=m;t:for(var _=0;_<2;++_){var S=[];if(x[k]<0!=!!_){T[k]=y[_][k];for(var E=0;E<2;++E){T[M]=y[E^_][M];for(var C=0;C<2;++C)T[A]=y[C^E^_][A],S.push(T.slice())}for(var E=0;E<w.length;++E){if(0===S.length)continue t;S=i.positive(S,w[E])}for(var E=0;E<S.length;++E)for(var A=S[E],L=d(m,u,A,r,l),C=0;C<3;++C)b[C].lo=Math.min(b[C].lo,A[C]),b[C].hi=Math.max(b[C].hi,A[C]),C!==k&&(b[C].pixelsPerDataUnit=Math.min(b[C].pixelsPerDataUnit,Math.abs(L[C])))}}}return b};var n=t("extract-frustum-planes"),i=t("split-polygon"),a=t("./lib/cube.js"),o=t("gl-mat4/multiply"),s=t("gl-mat4/transpose"),l=t("gl-vec4/transformMat4"),c=new Float32Array([1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1]),u=new Float32Array(16);function h(t,e,r){this.lo=t,this.hi=e,this.pixelsPerDataUnit=r}var f=[0,0,0,1],p=[0,0,0,1];function d(t,e,r,n,i){for(var a=0;a<3;++a){for(var o=f,s=p,c=0;c<3;++c)s[c]=o[c]=r[c];s[3]=o[3]=1,s[a]+=1,l(s,s,e),s[3]<0&&(t[a]=1/0),o[a]-=1,l(o,o,e),o[3]<0&&(t[a]=1/0);var u=(o[0]/o[3]-s[0]/s[3])*n,h=(o[1]/o[3]-s[1]/s[3])*i;t[a]=.25*Math.sqrt(u*u+h*h)}return t}var g=[new h(1/0,-1/0,1/0),new h(1/0,-1/0,1/0),new h(1/0,-1/0,1/0)],m=[0,0,0]},{"./lib/cube.js":224,"extract-frustum-planes":213,"gl-mat4/multiply":256,"gl-mat4/transpose":264,"gl-vec4/transformMat4":366,"split-polygon":488}],230:[function(t,e,r){"use strict";var n=t("typedarray-pool"),i=t("ndarray-ops"),a=t("ndarray"),o=["uint8","uint8_clamped","uint16","uint32","int8","int16","int32","float32"];function s(t,e,r,n,i){this.gl=t,this.type=e,this.handle=r,this.length=n,this.usage=i}var l=s.prototype;function c(t,e,r,n,i,a){var o=i.length*i.BYTES_PER_ELEMENT;if(a<0)return t.bufferData(e,i,n),o;if(o+a>r)throw new Error("gl-buffer: If resizing buffer, must not specify offset");return t.bufferSubData(e,a,i),r}function u(t,e){for(var r=n.malloc(t.length,e),i=t.length,a=0;a<i;++a)r[a]=t[a];return r}l.bind=function(){this.gl.bindBuffer(this.type,this.handle)},l.unbind=function(){this.gl.bindBuffer(this.type,null)},l.dispose=function(){this.gl.deleteBuffer(this.handle)},l.update=function(t,e){if("number"!=typeof e&&(e=-1),this.bind(),"object"==typeof t&&"undefined"!=typeof t.shape){var r=t.dtype;if(o.indexOf(r)<0&&(r="float32"),this.type===this.gl.ELEMENT_ARRAY_BUFFER)r=gl.getExtension("OES_element_index_uint")&&"uint16"!==r?"uint32":"uint16";if(r===t.dtype&&function(t,e){for(var r=1,n=e.length-1;n>=0;--n){if(e[n]!==r)return!1;r*=t[n]}return!0}(t.shape,t.stride))0===t.offset&&t.data.length===t.shape[0]?this.length=c(this.gl,this.type,this.length,this.usage,t.data,e):this.length=c(this.gl,this.type,this.length,this.usage,t.data.subarray(t.offset,t.shape[0]),e);else{var s=n.malloc(t.size,r),l=a(s,t.shape);i.assign(l,t),this.length=c(this.gl,this.type,this.length,this.usage,e<0?s:s.subarray(0,t.size),e),n.free(s)}}else if(Array.isArray(t)){var h;h=this.type===this.gl.ELEMENT_ARRAY_BUFFER?u(t,"uint16"):u(t,"float32"),this.length=c(this.gl,this.type,this.length,this.usage,e<0?h:h.subarray(0,t.length),e),n.free(h)}else if("object"==typeof t&&"number"==typeof t.length)this.length=c(this.gl,this.type,this.length,this.usage,t,e);else{if("number"!=typeof t&&void 0!==t)throw new Error("gl-buffer: Invalid data type");if(e>=0)throw new Error("gl-buffer: Cannot specify offset when resizing buffer");(t|=0)<=0&&(t=1),this.gl.bufferData(this.type,0|t,this.usage),this.length=t}},e.exports=function(t,e,r,n){if(r=r||t.ARRAY_BUFFER,n=n||t.DYNAMIC_DRAW,r!==t.ARRAY_BUFFER&&r!==t.ELEMENT_ARRAY_BUFFER)throw new Error("gl-buffer: Invalid type for webgl buffer, must be either gl.ARRAY_BUFFER or gl.ELEMENT_ARRAY_BUFFER");if(n!==t.DYNAMIC_DRAW&&n!==t.STATIC_DRAW&&n!==t.STREAM_DRAW)throw new Error("gl-buffer: Invalid usage for buffer, must be either gl.DYNAMIC_DRAW, gl.STATIC_DRAW or gl.STREAM_DRAW");var i=t.createBuffer(),a=new s(t,r,i,0,n);return a.update(e),a}},{ndarray:417,"ndarray-ops":411,"typedarray-pool":507}],231:[function(t,e,r){"use strict";var n=t("gl-vec3"),i=(t("gl-vec4"),function(t,e){for(var r=0;r<t.length;r++)if(t[r]>=e)return r-1;return r}),a=n.create(),o=n.create(),s=function(t,e,r){return t<e?e:t>r?r:t},l=function(t,e,r,l){var c=t[0],u=t[1],h=t[2],f=r[0].length,p=r[1].length,d=r[2].length,g=i(r[0],c),m=i(r[1],u),v=i(r[2],h),y=g+1,x=m+1,b=v+1;if(l&&(g=s(g,0,f-1),y=s(y,0,f-1),m=s(m,0,p-1),x=s(x,0,p-1),v=s(v,0,d-1),b=s(b,0,d-1)),g<0||m<0||v<0||y>=f||x>=p||b>=d)return n.create();var _=(c-r[0][g])/(r[0][y]-r[0][g]),w=(u-r[1][m])/(r[1][x]-r[1][m]),k=(h-r[2][v])/(r[2][b]-r[2][v]);(_<0||_>1||isNaN(_))&&(_=0),(w<0||w>1||isNaN(w))&&(w=0),(k<0||k>1||isNaN(k))&&(k=0);var M=v*f*p,A=b*f*p,T=m*f,S=x*f,E=g,C=y,L=e[T+M+E],z=e[T+M+C],P=e[S+M+E],I=e[S+M+C],O=e[T+A+E],D=e[T+A+C],R=e[S+A+E],B=e[S+A+C],F=n.create();return n.lerp(F,L,z,_),n.lerp(a,P,I,_),n.lerp(F,F,a,w),n.lerp(a,O,D,_),n.lerp(o,R,B,_),n.lerp(a,a,o,w),n.lerp(F,F,a,k),F};e.exports=function(t,e){var r;r=t.positions?t.positions:function(t){for(var e=t[0],r=t[1],n=t[2],i=[],a=0;a<n.length;a++)for(var o=0;o<r.length;o++)for(var s=0;s<e.length;s++)i.push([n[a],r[o],e[s]]);return i}(t.meshgrid);var i=t.meshgrid,a=t.vectors,o={positions:[],vertexIntensity:[],vertexIntensityBounds:t.vertexIntensityBounds,vertexNormals:[],vectors:[],cells:[],coneOffset:t.coneOffset,colormap:t.colormap};if(0===t.positions.length)return e&&(e[0]=[0,0,0],e[1]=[0,0,0]),o;for(var s=0,c=1/0,u=-1/0,h=1/0,f=-1/0,p=1/0,d=-1/0,g=null,m=null,v=[],y=1/0,x=0;x<r.length;x++){var b,_=r[x];c=Math.min(_[0],c),u=Math.max(_[0],u),h=Math.min(_[1],h),f=Math.max(_[1],f),p=Math.min(_[2],p),d=Math.max(_[2],d),b=i?l(_,a,i,!0):a[x],n.length(b)>s&&(s=n.length(b)),x&&(y=Math.min(y,2*n.distance(g,_)/(n.length(m)+n.length(b)))),g=_,m=b,v.push(b)}var w=[c,h,p],k=[u,f,d];e&&(e[0]=w,e[1]=k),0===s&&(s=1);var M=1/s;isFinite(y)&&!isNaN(y)||(y=1),o.vectorScale=y;var A=function(t,e,r){var i=n.create();return void 0!==t&&n.set(i,t,e,r),i}(0,1,0),T=t.coneSize||.5;t.absoluteConeSize&&(T=t.absoluteConeSize*M),o.coneScale=T;x=0;for(var S=0;x<r.length;x++)for(var E=(_=r[x])[0],C=_[1],L=_[2],z=v[x],P=n.length(z)*M,I=0;I<8;I++){o.positions.push([E,C,L,S++]),o.positions.push([E,C,L,S++]),o.positions.push([E,C,L,S++]),o.positions.push([E,C,L,S++]),o.positions.push([E,C,L,S++]),o.positions.push([E,C,L,S++]),o.vectors.push(z),o.vectors.push(z),o.vectors.push(z),o.vectors.push(z),o.vectors.push(z),o.vectors.push(z),o.vertexIntensity.push(P,P,P),o.vertexIntensity.push(P,P,P),o.vertexNormals.push(A,A,A),o.vertexNormals.push(A,A,A);var O=o.positions.length;o.cells.push([O-6,O-5,O-4],[O-3,O-2,O-1])}return o},e.exports.createConeMesh=t("./lib/conemesh")},{"./lib/conemesh":233,"gl-vec3":320,"gl-vec4":350}],232:[function(t,e,r){"use strict";var n=t("barycentric"),i=t("polytope-closest-point/lib/closest_point_2d.js");function a(t,e){for(var r=[0,0,0,0],n=0;n<4;++n)for(var i=0;i<4;++i)r[i]+=t[4*n+i]*e[n];return r}function o(t,e,r,n,i){for(var o=a(n,a(r,a(e,[t[0],t[1],t[2],1]))),s=0;s<3;++s)o[s]/=o[3];return[.5*i[0]*(1+o[0]),.5*i[1]*(1-o[1])]}e.exports=function(t,e,r,a,s,l){if(1===t.length)return[0,t[0].slice()];for(var c=new Array(t.length),u=0;u<t.length;++u)c[u]=o(t[u],r,a,s,l);for(var h=0,f=1/0,u=0;u<c.length;++u){for(var p=0,d=0;d<2;++d)p+=Math.pow(c[u][d]-e[d],2);p<f&&(f=p,h=u)}for(var g=function(t,e){if(2===t.length){for(var r=0,a=0,o=0;o<2;++o)r+=Math.pow(e[o]-t[0][o],2),a+=Math.pow(e[o]-t[1][o],2);return r=Math.sqrt(r),a=Math.sqrt(a),r+a<1e-6?[1,0]:[a/(r+a),r/(a+r)]}if(3===t.length){var s=[0,0];return i(t[0],t[1],t[2],e,s),n(t,s)}return[]}(c,e),m=0,u=0;u<3;++u){if(g[u]<-.001||g[u]>1.0001)return null;m+=g[u]}if(Math.abs(m-1)>.001)return null;return[h,function(t,e){for(var r=[0,0,0],n=0;n<t.length;++n)for(var i=t[n],a=e[n],o=0;o<3;++o)r[o]+=a*i[o];return r}(t,g),g]}},{barycentric:61,"polytope-closest-point/lib/closest_point_2d.js":448}],233:[function(t,e,r){"use strict";var n=t("gl-shader"),i=t("gl-buffer"),a=t("gl-vao"),o=t("gl-texture2d"),s=t("normals"),l=t("gl-mat4/multiply"),c=t("gl-mat4/invert"),u=t("ndarray"),h=t("colormap"),f=t("simplicial-complex-contour"),p=t("typedarray-pool"),d=t("./shaders"),g=(t("./closest-point"),d.meshShader),m=d.pickShader,v=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function y(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,g,m,y,x,b,_,w,k,M,A,T,S,E){this.gl=t,this.cells=[],this.positions=[],this.intensity=[],this.texture=e,this.dirty=!0,this.triShader=r,this.lineShader=n,this.pointShader=i,this.pickShader=a,this.pointPickShader=o,this.contourShader=s,this.trianglePositions=l,this.triangleVectors=c,this.triangleColors=h,this.triangleNormals=p,this.triangleUVs=f,this.triangleIds=u,this.triangleVAO=d,this.triangleCount=0,this.lineWidth=1,this.edgePositions=g,this.edgeColors=y,this.edgeUVs=x,this.edgeIds=m,this.edgeVAO=b,this.edgeCount=0,this.pointPositions=_,this.pointColors=k,this.pointUVs=M,this.pointSizes=A,this.pointIds=w,this.pointVAO=T,this.pointCount=0,this.contourLineWidth=1,this.contourPositions=S,this.contourVAO=E,this.contourCount=0,this.contourColor=[0,0,0],this.contourEnable=!0,this.pickId=1,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.lightPosition=[1e5,1e5,0],this.ambientLight=.8,this.diffuseLight=.8,this.specularLight=2,this.roughness=.5,this.fresnel=1.5,this.opacity=1,this.coneScale=2,this.vectorScale=1,this.coneOffset=.25,this._model=v,this._view=v,this._projection=v,this._resolution=[1,1]}var x=y.prototype;function b(t){var e=n(t,m.vertex,m.fragment,null,m.attributes);return e.attributes.position.location=0,e.attributes.id.location=1,e.attributes.vector.location=5,e}x.isOpaque=function(){return this.opacity>=1},x.isTransparent=function(){return this.opacity<1},x.pickSlots=1,x.setPickBase=function(t){this.pickId=t},x.highlight=function(t){if(t&&this.contourEnable){for(var e=f(this.cells,this.intensity,t.intensity),r=e.cells,n=e.vertexIds,i=e.vertexWeights,a=r.length,o=p.mallocFloat32(6*a),s=0,l=0;l<a;++l)for(var c=r[l],u=0;u<2;++u){var h=c[0];2===c.length&&(h=c[u]);for(var d=n[h][0],g=n[h][1],m=i[h],v=1-m,y=this.positions[d],x=this.positions[g],b=0;b<3;++b)o[s++]=m*y[b]+v*x[b]}this.contourCount=s/3|0,this.contourPositions.update(o.subarray(0,s)),p.free(o)}else this.contourCount=0},x.update=function(t){t=t||{};var e=this.gl;this.dirty=!0,"contourEnable"in t&&(this.contourEnable=t.contourEnable),"contourColor"in t&&(this.contourColor=t.contourColor),"lineWidth"in t&&(this.lineWidth=t.lineWidth),"lightPosition"in t&&(this.lightPosition=t.lightPosition),"opacity"in t&&(this.opacity=t.opacity),"ambient"in t&&(this.ambientLight=t.ambient),"diffuse"in t&&(this.diffuseLight=t.diffuse),"specular"in t&&(this.specularLight=t.specular),"roughness"in t&&(this.roughness=t.roughness),"fresnel"in t&&(this.fresnel=t.fresnel),void 0!==t.vectorScale&&(this.vectorScale=t.vectorScale),void 0!==t.coneScale&&(this.coneScale=t.coneScale),void 0!==t.coneOffset&&(this.coneOffset=t.coneOffset),t.texture?(this.texture.dispose(),this.texture=o(e,t.texture)):t.colormap&&(this.texture.shape=[256,256],this.texture.minFilter=e.LINEAR_MIPMAP_LINEAR,this.texture.magFilter=e.LINEAR,this.texture.setPixels(function(t){for(var e=h({colormap:t,nshades:256,format:"rgba"}),r=new Uint8Array(1024),n=0;n<256;++n){for(var i=e[n],a=0;a<3;++a)r[4*n+a]=i[a];r[4*n+3]=255*i[3]}return u(r,[256,256,4],[4,0,1])}(t.colormap)),this.texture.generateMipmap());var r=t.cells,n=t.positions,i=t.vectors;if(n&&r&&i){var a=[],l=[],c=[],f=[],p=[],d=[],g=[],m=[],v=[],y=[],x=[],b=[],_=[],w=[],k=[];this.cells=r,this.positions=n;var M=t.vertexNormals,A=t.cellNormals,T=void 0===t.vertexNormalsEpsilon?1e-6:t.vertexNormalsEpsilon,S=void 0===t.faceNormalsEpsilon?1e-6:t.faceNormalsEpsilon;t.useFacetNormals&&!A&&(A=s.faceNormals(r,n,S)),A||M||(M=s.vertexNormals(r,n,T));var E=t.vertexColors,C=t.cellColors,L=t.meshColor||[1,1,1,1],z=t.vertexUVs,P=t.vertexIntensity,I=t.cellUVs,O=t.cellIntensity,D=1/0,R=-1/0;if(!z&&!I)if(P)if(t.vertexIntensityBounds)D=+t.vertexIntensityBounds[0],R=+t.vertexIntensityBounds[1];else for(var B=0;B<P.length;++B){var F=P[B];D=Math.min(D,F),R=Math.max(R,F)}else if(O)for(B=0;B<O.length;++B){F=O[B];D=Math.min(D,F),R=Math.max(R,F)}else for(B=0;B<n.length;++B){F=n[B][2];D=Math.min(D,F),R=Math.max(R,F)}this.intensity=P||(O?function(t,e,r){for(var n=new Array(e),i=0;i<e;++i)n[i]=0;var a=t.length;for(i=0;i<a;++i)for(var o=t[i],s=0;s<o.length;++s)n[o[s]]=r[i];return n}(r,n.length,O):function(t){for(var e=t.length,r=new Array(e),n=0;n<e;++n)r[n]=t[n][2];return r}(n));var N=t.pointSizes,j=t.pointSize||1;this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]];for(B=0;B<n.length;++B)for(var V=n[B],U=0;U<3;++U)!isNaN(V[U])&&isFinite(V[U])&&(this.bounds[0][U]=Math.min(this.bounds[0][U],V[U]),this.bounds[1][U]=Math.max(this.bounds[1][U],V[U]));var q=0,H=0,G=0;t:for(B=0;B<r.length;++B){var W=r[B];switch(W.length){case 1:for(V=n[X=W[0]],U=0;U<3;++U)if(isNaN(V[U])||!isFinite(V[U]))continue t;x.push(V[0],V[1],V[2],V[3]),3===(Z=E?E[X]:C?C[B]:L).length?b.push(Z[0],Z[1],Z[2],1):b.push(Z[0],Z[1],Z[2],Z[3]),$=z?z[X]:P?[(P[X]-D)/(R-D),0]:I?I[B]:O?[(O[B]-D)/(R-D),0]:[(V[2]-D)/(R-D),0],_.push($[0],$[1]),N?w.push(N[X]):w.push(j),k.push(B),G+=1;break;case 2:for(U=0;U<2;++U){V=n[X=W[U]];for(var Y=0;Y<3;++Y)if(isNaN(V[Y])||!isFinite(V[Y]))continue t}for(U=0;U<2;++U){V=n[X=W[U]];g.push(V[0],V[1],V[2]),3===(Z=E?E[X]:C?C[B]:L).length?m.push(Z[0],Z[1],Z[2],1):m.push(Z[0],Z[1],Z[2],Z[3]),$=z?z[X]:P?[(P[X]-D)/(R-D),0]:I?I[B]:O?[(O[B]-D)/(R-D),0]:[(V[2]-D)/(R-D),0],v.push($[0],$[1]),y.push(B)}H+=1;break;case 3:for(U=0;U<3;++U)for(V=n[X=W[U]],Y=0;Y<3;++Y)if(isNaN(V[Y])||!isFinite(V[Y]))continue t;for(U=0;U<3;++U){var X;V=n[X=W[U]];a.push(V[0],V[1],V[2],V[3]);var Z,$,J,K=i[X];l.push(K[0],K[1],K[2]),3===(Z=E?E[X]:C?C[B]:L).length?c.push(Z[0],Z[1],Z[2],1):c.push(Z[0],Z[1],Z[2],Z[3]),$=z?z[X]:P?[(P[X]-D)/(R-D),0]:I?I[B]:O?[(O[B]-D)/(R-D),0]:[(V[2]-D)/(R-D),0],p.push($[0],$[1]),J=M?M[X]:A[B],f.push(J[0],J[1],J[2]),d.push(B)}q+=1}}this.pointCount=G,this.edgeCount=H,this.triangleCount=q,this.pointPositions.update(x),this.pointColors.update(b),this.pointUVs.update(_),this.pointSizes.update(w),this.pointIds.update(new Uint32Array(k)),this.edgePositions.update(g),this.edgeColors.update(m),this.edgeUVs.update(v),this.edgeIds.update(new Uint32Array(y)),this.trianglePositions.update(a),this.triangleVectors.update(l),this.triangleColors.update(c),this.triangleUVs.update(p),this.triangleNormals.update(f),this.triangleIds.update(new Uint32Array(d))}},x.drawTransparent=x.draw=function(t){t=t||{};for(var e=this.gl,r=t.model||v,n=t.view||v,i=t.projection||v,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);var s={model:r,view:n,projection:i,clipBounds:a,kambient:this.ambientLight,kdiffuse:this.diffuseLight,kspecular:this.specularLight,roughness:this.roughness,fresnel:this.fresnel,eyePosition:[0,0,0],lightPosition:[0,0,0],opacity:this.opacity,vectorScale:this.vectorScale,coneScale:this.coneScale,coneOffset:this.coneOffset,contourColor:this.contourColor,texture:0};this.texture.bind(0);var u=new Array(16);l(u,s.view,s.model),l(u,s.projection,u),c(u,u);for(o=0;o<3;++o)s.eyePosition[o]=u[12+o]/u[15];var h,f=u[15];for(o=0;o<3;++o)f+=this.lightPosition[o]*u[4*o+3];for(o=0;o<3;++o){for(var p=u[12+o],d=0;d<3;++d)p+=u[4*d+o]*this.lightPosition[d];s.lightPosition[o]=p/f}this.triangleCount>0&&((h=this.triShader).bind(),h.uniforms=s,this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind());this.edgeCount>0&&this.lineWidth>0&&((h=this.lineShader).bind(),h.uniforms=s,this.edgeVAO.bind(),e.lineWidth(this.lineWidth),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind());this.pointCount>0&&((h=this.pointShader).bind(),h.uniforms=s,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind());this.contourEnable&&this.contourCount>0&&this.contourLineWidth>0&&((h=this.contourShader).bind(),h.uniforms=s,this.contourVAO.bind(),e.drawArrays(e.LINES,0,this.contourCount),this.contourVAO.unbind())},x.drawPick=function(t){t=t||{};for(var e=this.gl,r=t.model||v,n=t.view||v,i=t.projection||v,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);this._model=[].slice.call(r),this._view=[].slice.call(n),this._projection=[].slice.call(i),this._resolution=[e.drawingBufferWidth,e.drawingBufferHeight];var s,l={model:r,view:n,projection:i,clipBounds:a,vectorScale:this.vectorScale,coneScale:this.coneScale,coneOffset:this.coneOffset,pickId:this.pickId/255};((s=this.pickShader).bind(),s.uniforms=l,this.triangleCount>0&&(this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()),this.edgeCount>0&&(this.edgeVAO.bind(),e.lineWidth(this.lineWidth),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind()),this.pointCount>0)&&((s=this.pointPickShader).bind(),s.uniforms=l,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind())},x.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;var e=t.value[0]+256*t.value[1]+65536*t.value[2],r=this.cells[e],n=this.positions[r[1]].slice(0,3);return{index:Math.floor(r[1]/48),position:n,dataCoordinate:n}},x.dispose=function(){this.texture.dispose(),this.triShader.dispose(),this.pickShader.dispose(),this.triangleVAO.dispose(),this.trianglePositions.dispose(),this.triangleVectors.dispose(),this.triangleColors.dispose(),this.triangleUVs.dispose(),this.triangleNormals.dispose(),this.triangleIds.dispose(),this.edgeVAO.dispose(),this.edgePositions.dispose(),this.edgeColors.dispose(),this.edgeUVs.dispose(),this.edgeIds.dispose(),this.pointVAO.dispose(),this.pointPositions.dispose(),this.pointColors.dispose(),this.pointUVs.dispose(),this.pointSizes.dispose(),this.pointIds.dispose(),this.contourVAO.dispose(),this.contourPositions.dispose()},e.exports=function(t,e){1===arguments.length&&(t=(e=t).gl);var r=e.triShader||function(t){var e=n(t,g.vertex,g.fragment,null,g.attributes);return e.attributes.position.location=0,e.attributes.color.location=2,e.attributes.uv.location=3,e.attributes.vector.location=5,e}(t),s=b(t),l=o(t,u(new Uint8Array([255,255,255,255]),[1,1,4]));l.generateMipmap(),l.minFilter=t.LINEAR_MIPMAP_LINEAR,l.magFilter=t.LINEAR;var c=i(t),h=i(t),f=i(t),p=i(t),d=i(t),m=i(t),v=a(t,[{buffer:c,type:t.FLOAT,size:4},{buffer:m,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:f,type:t.FLOAT,size:4},{buffer:p,type:t.FLOAT,size:2},{buffer:d,type:t.FLOAT,size:3},{buffer:h,type:t.FLOAT,size:3}]),x=i(t),_=i(t),w=i(t),k=i(t),M=a(t,[{buffer:x,type:t.FLOAT,size:3},{buffer:k,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:_,type:t.FLOAT,size:4},{buffer:w,type:t.FLOAT,size:2}]),A=i(t),T=i(t),S=i(t),E=i(t),C=i(t),L=a(t,[{buffer:A,type:t.FLOAT,size:3},{buffer:C,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:T,type:t.FLOAT,size:4},{buffer:S,type:t.FLOAT,size:2},{buffer:E,type:t.FLOAT,size:1}]),z=i(t),P=new y(t,l,r,null,null,s,null,null,c,h,m,f,p,d,v,x,k,_,w,M,A,C,T,S,E,L,z,a(t,[{buffer:z,type:t.FLOAT,size:3}]));return P.update(e),P}},{"./closest-point":232,"./shaders":234,colormap:113,"gl-buffer":230,"gl-mat4/invert":254,"gl-mat4/multiply":256,"gl-shader":287,"gl-texture2d":303,"gl-vao":308,ndarray:417,normals:420,"simplicial-complex-contour":479,"typedarray-pool":507}],234:[function(t,e,r){var n=t("glslify"),i=n(["precision mediump float;\n#define GLSLIFY 1\n\nfloat inverse(float m) {\n  return 1.0 / m;\n}\n\nmat2 inverse(mat2 m) {\n  return mat2(m[1][1],-m[0][1],\n             -m[1][0], m[0][0]) / (m[0][0]*m[1][1] - m[0][1]*m[1][0]);\n}\n\nmat3 inverse(mat3 m) {\n  float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];\n  float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];\n  float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];\n\n  float b01 = a22 * a11 - a12 * a21;\n  float b11 = -a22 * a10 + a12 * a20;\n  float b21 = a21 * a10 - a11 * a20;\n\n  float det = a00 * b01 + a01 * b11 + a02 * b21;\n\n  return mat3(b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11),\n              b11, (a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10),\n              b21, (-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10)) / det;\n}\n\nmat4 inverse(mat4 m) {\n  float\n      a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n      a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n      a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n      a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],\n\n      b00 = a00 * a11 - a01 * a10,\n      b01 = a00 * a12 - a02 * a10,\n      b02 = a00 * a13 - a03 * a10,\n      b03 = a01 * a12 - a02 * a11,\n      b04 = a01 * a13 - a03 * a11,\n      b05 = a02 * a13 - a03 * a12,\n      b06 = a20 * a31 - a21 * a30,\n      b07 = a20 * a32 - a22 * a30,\n      b08 = a20 * a33 - a23 * a30,\n      b09 = a21 * a32 - a22 * a31,\n      b10 = a21 * a33 - a23 * a31,\n      b11 = a22 * a33 - a23 * a32,\n\n      det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n  return mat4(\n      a11 * b11 - a12 * b10 + a13 * b09,\n      a02 * b10 - a01 * b11 - a03 * b09,\n      a31 * b05 - a32 * b04 + a33 * b03,\n      a22 * b04 - a21 * b05 - a23 * b03,\n      a12 * b08 - a10 * b11 - a13 * b07,\n      a00 * b11 - a02 * b08 + a03 * b07,\n      a32 * b02 - a30 * b05 - a33 * b01,\n      a20 * b05 - a22 * b02 + a23 * b01,\n      a10 * b10 - a11 * b08 + a13 * b06,\n      a01 * b08 - a00 * b10 - a03 * b06,\n      a30 * b04 - a31 * b02 + a33 * b00,\n      a21 * b02 - a20 * b04 - a23 * b00,\n      a11 * b07 - a10 * b09 - a12 * b06,\n      a00 * b09 - a01 * b07 + a02 * b06,\n      a31 * b01 - a30 * b03 - a32 * b00,\n      a20 * b03 - a21 * b01 + a22 * b00) / det;\n}\n\nvec3 getOrthogonalVector(vec3 v) {\n  // Return up-vector for only-z vector.\n  // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\n  // From the above if-statement we have ||a|| > 0  U  ||b|| > 0.\n  // Assign z = 0, x = -b, y = a:\n  // a*-b + b*a + c*0 = -ba + ba + 0 = 0\n  if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\n    return normalize(vec3(-v.y, v.x, 0.0));\n  } else {\n    return normalize(vec3(0.0, v.z, -v.y));\n  }\n}\n\n// Calculate the cone vertex and normal at the given index.\n//\n// The returned vertex is for a cone with its top at origin and height of 1.0,\n// pointing in the direction of the vector attribute.\n//\n// Each cone is made up of a top vertex, a center base vertex and base perimeter vertices.\n// These vertices are used to make up the triangles of the cone by the following:\n//   segment + 0 top vertex\n//   segment + 1 perimeter vertex a+1\n//   segment + 2 perimeter vertex a\n//   segment + 3 center base vertex\n//   segment + 4 perimeter vertex a\n//   segment + 5 perimeter vertex a+1\n// Where segment is the number of the radial segment * 6 and a is the angle at that radial segment.\n// To go from index to segment, floor(index / 6)\n// To go from segment to angle, 2*pi * (segment/segmentCount)\n// To go from index to segment index, index - (segment*6)\n//\nvec3 getConePosition(vec3 d, float index, float coneOffset, out vec3 normal) {\n\n  const float segmentCount = 8.0;\n\n  index = mod(index, segmentCount * 6.0);\n\n  float segment = floor(index/6.0);\n  float segmentIndex = index - (segment*6.0);\n\n  normal = -normalize(d);\n\n  if (segmentIndex == 3.0) {\n    return mix(vec3(0.0), -d, coneOffset);\n  }\n\n  // angle = 2pi * ((segment + ((segmentIndex == 1.0 || segmentIndex == 5.0) ? 1.0 : 0.0)) / segmentCount)\n  float nextAngle = float(segmentIndex == 1.0 || segmentIndex == 5.0);\n  float angle = 2.0 * 3.14159 * ((segment + nextAngle) / segmentCount);\n\n  vec3 v1 = mix(d, vec3(0.0), coneOffset);\n  vec3 v2 = v1 - d;\n\n  vec3 u = getOrthogonalVector(d);\n  vec3 v = normalize(cross(u, d));\n\n  vec3 x = u * cos(angle) * length(d)*0.25;\n  vec3 y = v * sin(angle) * length(d)*0.25;\n  vec3 v3 = v2 + x + y;\n  if (segmentIndex <= 2.0) {\n    vec3 tx = u * sin(angle);\n    vec3 ty = v * -cos(angle);\n    vec3 tangent = tx + ty;\n    normal = normalize(cross(v3 - v1, tangent));\n  }\n\n  if (segmentIndex == 0.0) {\n    return mix(d, vec3(0.0), coneOffset);\n  }\n  return v3;\n}\n\nattribute vec3 vector;\nattribute vec4 color, position;\nattribute vec2 uv;\nuniform float vectorScale;\nuniform float coneScale;\n\nuniform float coneOffset;\n\nuniform mat4 model\n           , view\n           , projection;\nuniform vec3 eyePosition\n           , lightPosition;\n\nvarying vec3 f_normal\n           , f_lightDirection\n           , f_eyeDirection\n           , f_data;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n  // Scale the vector magnitude to stay constant with\n  // model & view changes.\n  vec3 normal;\n  vec4 conePosition = model * vec4(position.xyz, 1.0) + vec4(getConePosition(mat3(model) * ((vectorScale * coneScale) * vector), position.w, coneOffset, normal), 0.0);\n  normal = normalize(normal * inverse(mat3(model)));\n\n  // vec4 m_position  = model * vec4(conePosition, 1.0);\n  vec4 t_position  = view * conePosition;\n  gl_Position      = projection * t_position;\n  f_color          = color; //vec4(position.w, color.r, 0, 0);\n  f_normal         = normal;\n  f_data           = conePosition.xyz;\n  f_eyeDirection   = eyePosition   - conePosition.xyz;\n  f_lightDirection = lightPosition - conePosition.xyz;\n  f_uv             = uv;\n}\n"]),a=n(["precision mediump float;\n#define GLSLIFY 1\n\nfloat beckmannDistribution(float x, float roughness) {\n  float NdotH = max(x, 0.0001);\n  float cos2Alpha = NdotH * NdotH;\n  float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\n  float roughness2 = roughness * roughness;\n  float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\n  return exp(tan2Alpha / roughness2) / denom;\n}\n\nfloat cookTorranceSpecular(\n  vec3 lightDirection,\n  vec3 viewDirection,\n  vec3 surfaceNormal,\n  float roughness,\n  float fresnel) {\n\n  float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\n  float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\n\n  //Half angle vector\n  vec3 H = normalize(lightDirection + viewDirection);\n\n  //Geometric term\n  float NdotH = max(dot(surfaceNormal, H), 0.0);\n  float VdotH = max(dot(viewDirection, H), 0.000001);\n  float LdotH = max(dot(lightDirection, H), 0.000001);\n  float G1 = (2.0 * NdotH * VdotN) / VdotH;\n  float G2 = (2.0 * NdotH * LdotN) / LdotH;\n  float G = min(1.0, min(G1, G2));\n  \n  //Distribution term\n  float D = beckmannDistribution(NdotH, roughness);\n\n  //Fresnel term\n  float F = pow(1.0 - VdotN, fresnel);\n\n  //Multiply terms and done\n  return  G * F * D / max(3.14159265 * VdotN, 0.000001);\n}\n\nuniform vec3 clipBounds[2];\nuniform float roughness\n            , fresnel\n            , kambient\n            , kdiffuse\n            , kspecular\n            , opacity;\nuniform sampler2D texture;\n\nvarying vec3 f_normal\n           , f_lightDirection\n           , f_eyeDirection\n           , f_data;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n  //if(any(lessThan(f_data, clipBounds[0])) || \n  //   any(greaterThan(f_data, clipBounds[1]))) {\n  //  discard;\n  //}\n\n  vec3 N = normalize(f_normal);\n  vec3 L = normalize(f_lightDirection);\n  vec3 V = normalize(f_eyeDirection);\n  \n  if(!gl_FrontFacing) {\n    N = -N;\n  }\n\n  float specular = cookTorranceSpecular(L, V, N, roughness, fresnel);\n  float diffuse  = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\n\n  vec4 surfaceColor =  texture2D(texture, f_uv);\n  vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular,  1.0);\n\n  gl_FragColor = litColor * opacity;\n}"]),o=n(["precision mediump float;\n#define GLSLIFY 1\n\nvec3 getOrthogonalVector(vec3 v) {\n  // Return up-vector for only-z vector.\n  // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\n  // From the above if-statement we have ||a|| > 0  U  ||b|| > 0.\n  // Assign z = 0, x = -b, y = a:\n  // a*-b + b*a + c*0 = -ba + ba + 0 = 0\n  if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\n    return normalize(vec3(-v.y, v.x, 0.0));\n  } else {\n    return normalize(vec3(0.0, v.z, -v.y));\n  }\n}\n\n// Calculate the cone vertex and normal at the given index.\n//\n// The returned vertex is for a cone with its top at origin and height of 1.0,\n// pointing in the direction of the vector attribute.\n//\n// Each cone is made up of a top vertex, a center base vertex and base perimeter vertices.\n// These vertices are used to make up the triangles of the cone by the following:\n//   segment + 0 top vertex\n//   segment + 1 perimeter vertex a+1\n//   segment + 2 perimeter vertex a\n//   segment + 3 center base vertex\n//   segment + 4 perimeter vertex a\n//   segment + 5 perimeter vertex a+1\n// Where segment is the number of the radial segment * 6 and a is the angle at that radial segment.\n// To go from index to segment, floor(index / 6)\n// To go from segment to angle, 2*pi * (segment/segmentCount)\n// To go from index to segment index, index - (segment*6)\n//\nvec3 getConePosition(vec3 d, float index, float coneOffset, out vec3 normal) {\n\n  const float segmentCount = 8.0;\n\n  index = mod(index, segmentCount * 6.0);\n\n  float segment = floor(index/6.0);\n  float segmentIndex = index - (segment*6.0);\n\n  normal = -normalize(d);\n\n  if (segmentIndex == 3.0) {\n    return mix(vec3(0.0), -d, coneOffset);\n  }\n\n  // angle = 2pi * ((segment + ((segmentIndex == 1.0 || segmentIndex == 5.0) ? 1.0 : 0.0)) / segmentCount)\n  float nextAngle = float(segmentIndex == 1.0 || segmentIndex == 5.0);\n  float angle = 2.0 * 3.14159 * ((segment + nextAngle) / segmentCount);\n\n  vec3 v1 = mix(d, vec3(0.0), coneOffset);\n  vec3 v2 = v1 - d;\n\n  vec3 u = getOrthogonalVector(d);\n  vec3 v = normalize(cross(u, d));\n\n  vec3 x = u * cos(angle) * length(d)*0.25;\n  vec3 y = v * sin(angle) * length(d)*0.25;\n  vec3 v3 = v2 + x + y;\n  if (segmentIndex <= 2.0) {\n    vec3 tx = u * sin(angle);\n    vec3 ty = v * -cos(angle);\n    vec3 tangent = tx + ty;\n    normal = normalize(cross(v3 - v1, tangent));\n  }\n\n  if (segmentIndex == 0.0) {\n    return mix(d, vec3(0.0), coneOffset);\n  }\n  return v3;\n}\n\nattribute vec3 vector;\nattribute vec4 position;\nattribute vec4 id;\n\nuniform mat4 model, view, projection;\n\nuniform float vectorScale;\nuniform float coneScale;\nuniform float coneOffset;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n  vec3 normal;\n  vec4 conePosition = model * vec4(position.xyz, 1.0) + vec4(getConePosition(mat3(model) * ((vectorScale * coneScale) * vector), position.w, coneOffset, normal), 0.0);\n  gl_Position = projection * view * conePosition;\n  f_id        = id;\n  f_position  = position.xyz;\n}\n"]),s=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec3  clipBounds[2];\nuniform float pickId;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n  if(any(lessThan(f_position, clipBounds[0])) || \n     any(greaterThan(f_position, clipBounds[1]))) {\n    discard;\n  }\n  gl_FragColor = vec4(pickId, f_id.xyz);\n}"]);r.meshShader={vertex:i,fragment:a,attributes:[{name:"position",type:"vec4"},{name:"normal",type:"vec3"},{name:"color",type:"vec4"},{name:"uv",type:"vec2"},{name:"vector",type:"vec3"}]},r.pickShader={vertex:o,fragment:s,attributes:[{name:"position",type:"vec4"},{name:"id",type:"vec4"},{name:"vector",type:"vec3"}]}},{glslify:377}],235:[function(t,e,r){e.exports={0:"NONE",1:"ONE",2:"LINE_LOOP",3:"LINE_STRIP",4:"TRIANGLES",5:"TRIANGLE_STRIP",6:"TRIANGLE_FAN",256:"DEPTH_BUFFER_BIT",512:"NEVER",513:"LESS",514:"EQUAL",515:"LEQUAL",516:"GREATER",517:"NOTEQUAL",518:"GEQUAL",519:"ALWAYS",768:"SRC_COLOR",769:"ONE_MINUS_SRC_COLOR",770:"SRC_ALPHA",771:"ONE_MINUS_SRC_ALPHA",772:"DST_ALPHA",773:"ONE_MINUS_DST_ALPHA",774:"DST_COLOR",775:"ONE_MINUS_DST_COLOR",776:"SRC_ALPHA_SATURATE",1024:"STENCIL_BUFFER_BIT",1028:"FRONT",1029:"BACK",1032:"FRONT_AND_BACK",1280:"INVALID_ENUM",1281:"INVALID_VALUE",1282:"INVALID_OPERATION",1285:"OUT_OF_MEMORY",1286:"INVALID_FRAMEBUFFER_OPERATION",2304:"CW",2305:"CCW",2849:"LINE_WIDTH",2884:"CULL_FACE",2885:"CULL_FACE_MODE",2886:"FRONT_FACE",2928:"DEPTH_RANGE",2929:"DEPTH_TEST",2930:"DEPTH_WRITEMASK",2931:"DEPTH_CLEAR_VALUE",2932:"DEPTH_FUNC",2960:"STENCIL_TEST",2961:"STENCIL_CLEAR_VALUE",2962:"STENCIL_FUNC",2963:"STENCIL_VALUE_MASK",2964:"STENCIL_FAIL",2965:"STENCIL_PASS_DEPTH_FAIL",2966:"STENCIL_PASS_DEPTH_PASS",2967:"STENCIL_REF",2968:"STENCIL_WRITEMASK",2978:"VIEWPORT",3024:"DITHER",3042:"BLEND",3088:"SCISSOR_BOX",3089:"SCISSOR_TEST",3106:"COLOR_CLEAR_VALUE",3107:"COLOR_WRITEMASK",3317:"UNPACK_ALIGNMENT",3333:"PACK_ALIGNMENT",3379:"MAX_TEXTURE_SIZE",3386:"MAX_VIEWPORT_DIMS",3408:"SUBPIXEL_BITS",3410:"RED_BITS",3411:"GREEN_BITS",3412:"BLUE_BITS",3413:"ALPHA_BITS",3414:"DEPTH_BITS",3415:"STENCIL_BITS",3553:"TEXTURE_2D",4352:"DONT_CARE",4353:"FASTEST",4354:"NICEST",5120:"BYTE",5121:"UNSIGNED_BYTE",5122:"SHORT",5123:"UNSIGNED_SHORT",5124:"INT",5125:"UNSIGNED_INT",5126:"FLOAT",5386:"INVERT",5890:"TEXTURE",6401:"STENCIL_INDEX",6402:"DEPTH_COMPONENT",6406:"ALPHA",6407:"RGB",6408:"RGBA",6409:"LUMINANCE",6410:"LUMINANCE_ALPHA",7680:"KEEP",7681:"REPLACE",7682:"INCR",7683:"DECR",7936:"VENDOR",7937:"RENDERER",7938:"VERSION",9728:"NEAREST",9729:"LINEAR",9984:"NEAREST_MIPMAP_NEAREST",9985:"LINEAR_MIPMAP_NEAREST",9986:"NEAREST_MIPMAP_LINEAR",9987:"LINEAR_MIPMAP_LINEAR",10240:"TEXTURE_MAG_FILTER",10241:"TEXTURE_MIN_FILTER",10242:"TEXTURE_WRAP_S",10243:"TEXTURE_WRAP_T",10497:"REPEAT",10752:"POLYGON_OFFSET_UNITS",16384:"COLOR_BUFFER_BIT",32769:"CONSTANT_COLOR",32770:"ONE_MINUS_CONSTANT_COLOR",32771:"CONSTANT_ALPHA",32772:"ONE_MINUS_CONSTANT_ALPHA",32773:"BLEND_COLOR",32774:"FUNC_ADD",32777:"BLEND_EQUATION_RGB",32778:"FUNC_SUBTRACT",32779:"FUNC_REVERSE_SUBTRACT",32819:"UNSIGNED_SHORT_4_4_4_4",32820:"UNSIGNED_SHORT_5_5_5_1",32823:"POLYGON_OFFSET_FILL",32824:"POLYGON_OFFSET_FACTOR",32854:"RGBA4",32855:"RGB5_A1",32873:"TEXTURE_BINDING_2D",32926:"SAMPLE_ALPHA_TO_COVERAGE",32928:"SAMPLE_COVERAGE",32936:"SAMPLE_BUFFERS",32937:"SAMPLES",32938:"SAMPLE_COVERAGE_VALUE",32939:"SAMPLE_COVERAGE_INVERT",32968:"BLEND_DST_RGB",32969:"BLEND_SRC_RGB",32970:"BLEND_DST_ALPHA",32971:"BLEND_SRC_ALPHA",33071:"CLAMP_TO_EDGE",33170:"GENERATE_MIPMAP_HINT",33189:"DEPTH_COMPONENT16",33306:"DEPTH_STENCIL_ATTACHMENT",33635:"UNSIGNED_SHORT_5_6_5",33648:"MIRRORED_REPEAT",33901:"ALIASED_POINT_SIZE_RANGE",33902:"ALIASED_LINE_WIDTH_RANGE",33984:"TEXTURE0",33985:"TEXTURE1",33986:"TEXTURE2",33987:"TEXTURE3",33988:"TEXTURE4",33989:"TEXTURE5",33990:"TEXTURE6",33991:"TEXTURE7",33992:"TEXTURE8",33993:"TEXTURE9",33994:"TEXTURE10",33995:"TEXTURE11",33996:"TEXTURE12",33997:"TEXTURE13",33998:"TEXTURE14",33999:"TEXTURE15",34000:"TEXTURE16",34001:"TEXTURE17",34002:"TEXTURE18",34003:"TEXTURE19",34004:"TEXTURE20",34005:"TEXTURE21",34006:"TEXTURE22",34007:"TEXTURE23",34008:"TEXTURE24",34009:"TEXTURE25",34010:"TEXTURE26",34011:"TEXTURE27",34012:"TEXTURE28",34013:"TEXTURE29",34014:"TEXTURE30",34015:"TEXTURE31",34016:"ACTIVE_TEXTURE",34024:"MAX_RENDERBUFFER_SIZE",34041:"DEPTH_STENCIL",34055:"INCR_WRAP",34056:"DECR_WRAP",34067:"TEXTURE_CUBE_MAP",34068:"TEXTURE_BINDING_CUBE_MAP",34069:"TEXTURE_CUBE_MAP_POSITIVE_X",34070:"TEXTURE_CUBE_MAP_NEGATIVE_X",34071:"TEXTURE_CUBE_MAP_POSITIVE_Y",34072:"TEXTURE_CUBE_MAP_NEGATIVE_Y",34073:"TEXTURE_CUBE_MAP_POSITIVE_Z",34074:"TEXTURE_CUBE_MAP_NEGATIVE_Z",34076:"MAX_CUBE_MAP_TEXTURE_SIZE",34338:"VERTEX_ATTRIB_ARRAY_ENABLED",34339:"VERTEX_ATTRIB_ARRAY_SIZE",34340:"VERTEX_ATTRIB_ARRAY_STRIDE",34341:"VERTEX_ATTRIB_ARRAY_TYPE",34342:"CURRENT_VERTEX_ATTRIB",34373:"VERTEX_ATTRIB_ARRAY_POINTER",34466:"NUM_COMPRESSED_TEXTURE_FORMATS",34467:"COMPRESSED_TEXTURE_FORMATS",34660:"BUFFER_SIZE",34661:"BUFFER_USAGE",34816:"STENCIL_BACK_FUNC",34817:"STENCIL_BACK_FAIL",34818:"STENCIL_BACK_PASS_DEPTH_FAIL",34819:"STENCIL_BACK_PASS_DEPTH_PASS",34877:"BLEND_EQUATION_ALPHA",34921:"MAX_VERTEX_ATTRIBS",34922:"VERTEX_ATTRIB_ARRAY_NORMALIZED",34930:"MAX_TEXTURE_IMAGE_UNITS",34962:"ARRAY_BUFFER",34963:"ELEMENT_ARRAY_BUFFER",34964:"ARRAY_BUFFER_BINDING",34965:"ELEMENT_ARRAY_BUFFER_BINDING",34975:"VERTEX_ATTRIB_ARRAY_BUFFER_BINDING",35040:"STREAM_DRAW",35044:"STATIC_DRAW",35048:"DYNAMIC_DRAW",35632:"FRAGMENT_SHADER",35633:"VERTEX_SHADER",35660:"MAX_VERTEX_TEXTURE_IMAGE_UNITS",35661:"MAX_COMBINED_TEXTURE_IMAGE_UNITS",35663:"SHADER_TYPE",35664:"FLOAT_VEC2",35665:"FLOAT_VEC3",35666:"FLOAT_VEC4",35667:"INT_VEC2",35668:"INT_VEC3",35669:"INT_VEC4",35670:"BOOL",35671:"BOOL_VEC2",35672:"BOOL_VEC3",35673:"BOOL_VEC4",35674:"FLOAT_MAT2",35675:"FLOAT_MAT3",35676:"FLOAT_MAT4",35678:"SAMPLER_2D",35680:"SAMPLER_CUBE",35712:"DELETE_STATUS",35713:"COMPILE_STATUS",35714:"LINK_STATUS",35715:"VALIDATE_STATUS",35716:"INFO_LOG_LENGTH",35717:"ATTACHED_SHADERS",35718:"ACTIVE_UNIFORMS",35719:"ACTIVE_UNIFORM_MAX_LENGTH",35720:"SHADER_SOURCE_LENGTH",35721:"ACTIVE_ATTRIBUTES",35722:"ACTIVE_ATTRIBUTE_MAX_LENGTH",35724:"SHADING_LANGUAGE_VERSION",35725:"CURRENT_PROGRAM",36003:"STENCIL_BACK_REF",36004:"STENCIL_BACK_VALUE_MASK",36005:"STENCIL_BACK_WRITEMASK",36006:"FRAMEBUFFER_BINDING",36007:"RENDERBUFFER_BINDING",36048:"FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE",36049:"FRAMEBUFFER_ATTACHMENT_OBJECT_NAME",36050:"FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL",36051:"FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE",36053:"FRAMEBUFFER_COMPLETE",36054:"FRAMEBUFFER_INCOMPLETE_ATTACHMENT",36055:"FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT",36057:"FRAMEBUFFER_INCOMPLETE_DIMENSIONS",36061:"FRAMEBUFFER_UNSUPPORTED",36064:"COLOR_ATTACHMENT0",36096:"DEPTH_ATTACHMENT",36128:"STENCIL_ATTACHMENT",36160:"FRAMEBUFFER",36161:"RENDERBUFFER",36162:"RENDERBUFFER_WIDTH",36163:"RENDERBUFFER_HEIGHT",36164:"RENDERBUFFER_INTERNAL_FORMAT",36168:"STENCIL_INDEX8",36176:"RENDERBUFFER_RED_SIZE",36177:"RENDERBUFFER_GREEN_SIZE",36178:"RENDERBUFFER_BLUE_SIZE",36179:"RENDERBUFFER_ALPHA_SIZE",36180:"RENDERBUFFER_DEPTH_SIZE",36181:"RENDERBUFFER_STENCIL_SIZE",36194:"RGB565",36336:"LOW_FLOAT",36337:"MEDIUM_FLOAT",36338:"HIGH_FLOAT",36339:"LOW_INT",36340:"MEDIUM_INT",36341:"HIGH_INT",36346:"SHADER_COMPILER",36347:"MAX_VERTEX_UNIFORM_VECTORS",36348:"MAX_VARYING_VECTORS",36349:"MAX_FRAGMENT_UNIFORM_VECTORS",37440:"UNPACK_FLIP_Y_WEBGL",37441:"UNPACK_PREMULTIPLY_ALPHA_WEBGL",37442:"CONTEXT_LOST_WEBGL",37443:"UNPACK_COLORSPACE_CONVERSION_WEBGL",37444:"BROWSER_DEFAULT_WEBGL"}},{}],236:[function(t,e,r){var n=t("./1.0/numbers");e.exports=function(t){return n[t]}},{"./1.0/numbers":235}],237:[function(t,e,r){"use strict";e.exports=function(t){var e=t.gl,r=n(e),o=i(e,[{buffer:r,type:e.FLOAT,size:3,offset:0,stride:40},{buffer:r,type:e.FLOAT,size:4,offset:12,stride:40},{buffer:r,type:e.FLOAT,size:3,offset:28,stride:40}]),l=a(e);l.attributes.position.location=0,l.attributes.color.location=1,l.attributes.offset.location=2;var c=new s(e,r,o,l);return c.update(t),c};var n=t("gl-buffer"),i=t("gl-vao"),a=t("./shaders/index"),o=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function s(t,e,r,n){this.gl=t,this.shader=n,this.buffer=e,this.vao=r,this.pixelRatio=1,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.lineWidth=[1,1,1],this.capSize=[10,10,10],this.lineCount=[0,0,0],this.lineOffset=[0,0,0],this.opacity=1}var l=s.prototype;function c(t,e){for(var r=0;r<3;++r)t[0][r]=Math.min(t[0][r],e[r]),t[1][r]=Math.max(t[1][r],e[r])}l.isOpaque=function(){return this.opacity>=1},l.isTransparent=function(){return this.opacity<1},l.drawTransparent=l.draw=function(t){var e=this.gl,r=this.shader.uniforms;this.shader.bind();var n=r.view=t.view||o,i=r.projection=t.projection||o;r.model=t.model||o,r.clipBounds=this.clipBounds,r.opacity=this.opacity;var a=n[12],s=n[13],l=n[14],c=n[15],u=this.pixelRatio*(i[3]*a+i[7]*s+i[11]*l+i[15]*c)/e.drawingBufferHeight;this.vao.bind();for(var h=0;h<3;++h)e.lineWidth(this.lineWidth[h]),r.capSize=this.capSize[h]*u,this.lineCount[h]&&e.drawArrays(e.LINES,this.lineOffset[h],this.lineCount[h]);this.vao.unbind()};var u=function(){for(var t=new Array(3),e=0;e<3;++e){for(var r=[],n=1;n<=2;++n)for(var i=-1;i<=1;i+=2){var a=[0,0,0];a[(n+e)%3]=i,r.push(a)}t[e]=r}return t}();function h(t,e,r,n){for(var i=u[n],a=0;a<i.length;++a){var o=i[a];t.push(e[0],e[1],e[2],r[0],r[1],r[2],r[3],o[0],o[1],o[2])}return i.length}l.update=function(t){"lineWidth"in(t=t||{})&&(this.lineWidth=t.lineWidth,Array.isArray(this.lineWidth)||(this.lineWidth=[this.lineWidth,this.lineWidth,this.lineWidth])),"capSize"in t&&(this.capSize=t.capSize,Array.isArray(this.capSize)||(this.capSize=[this.capSize,this.capSize,this.capSize])),"opacity"in t&&(this.opacity=t.opacity);var e=t.color||[[0,0,0],[0,0,0],[0,0,0]],r=t.position,n=t.error;if(Array.isArray(e[0])||(e=[e,e,e]),r&&n){var i=[],a=r.length,o=0;this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.lineCount=[0,0,0];for(var s=0;s<3;++s){this.lineOffset[s]=o;t:for(var l=0;l<a;++l){for(var u=r[l],f=0;f<3;++f)if(isNaN(u[f])||!isFinite(u[f]))continue t;var p=n[l],d=e[s];if(Array.isArray(d[0])&&(d=e[l]),3===d.length&&(d=[d[0],d[1],d[2],1]),!isNaN(p[0][s])&&!isNaN(p[1][s])){var g;if(p[0][s]<0)(g=u.slice())[s]+=p[0][s],i.push(u[0],u[1],u[2],d[0],d[1],d[2],d[3],0,0,0,g[0],g[1],g[2],d[0],d[1],d[2],d[3],0,0,0),c(this.bounds,g),o+=2+h(i,g,d,s);if(p[1][s]>0)(g=u.slice())[s]+=p[1][s],i.push(u[0],u[1],u[2],d[0],d[1],d[2],d[3],0,0,0,g[0],g[1],g[2],d[0],d[1],d[2],d[3],0,0,0),c(this.bounds,g),o+=2+h(i,g,d,s)}}this.lineCount[s]=o-this.lineOffset[s]}this.buffer.update(i)}},l.dispose=function(){this.shader.dispose(),this.buffer.dispose(),this.vao.dispose()}},{"./shaders/index":238,"gl-buffer":230,"gl-vao":308}],238:[function(t,e,r){"use strict";var n=t("glslify"),i=t("gl-shader"),a=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position, offset;\nattribute vec4 color;\nuniform mat4 model, view, projection;\nuniform float capSize;\nvarying vec4 fragColor;\nvarying vec3 fragPosition;\n\nvoid main() {\n  vec4 worldPosition  = model * vec4(position, 1.0);\n  worldPosition       = (worldPosition / worldPosition.w) + vec4(capSize * offset, 0.0);\n  gl_Position         = projection * view * worldPosition;\n  fragColor           = color;\n  fragPosition        = position;\n}"]),o=n(["precision mediump float;\n#define GLSLIFY 1\nuniform vec3 clipBounds[2];\nuniform float opacity;\nvarying vec3 fragPosition;\nvarying vec4 fragColor;\n\nvoid main() {\n  if(any(lessThan(fragPosition, clipBounds[0])) || any(greaterThan(fragPosition, clipBounds[1]))) {\n    discard;\n  }\n  gl_FragColor = opacity * fragColor;\n}"]);e.exports=function(t){return i(t,a,o,null,[{name:"position",type:"vec3"},{name:"color",type:"vec4"},{name:"offset",type:"vec3"}])}},{"gl-shader":287,glslify:377}],239:[function(t,e,r){"use strict";var n=t("gl-texture2d");e.exports=function(t,e,r,n){i||(i=t.FRAMEBUFFER_UNSUPPORTED,a=t.FRAMEBUFFER_INCOMPLETE_ATTACHMENT,o=t.FRAMEBUFFER_INCOMPLETE_DIMENSIONS,s=t.FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT);var c=t.getExtension("WEBGL_draw_buffers");!l&&c&&function(t,e){var r=t.getParameter(e.MAX_COLOR_ATTACHMENTS_WEBGL);l=new Array(r+1);for(var n=0;n<=r;++n){for(var i=new Array(r),a=0;a<n;++a)i[a]=t.COLOR_ATTACHMENT0+a;for(var a=n;a<r;++a)i[a]=t.NONE;l[n]=i}}(t,c);Array.isArray(e)&&(n=r,r=0|e[1],e=0|e[0]);if("number"!=typeof e)throw new Error("gl-fbo: Missing shape parameter");var u=t.getParameter(t.MAX_RENDERBUFFER_SIZE);if(e<0||e>u||r<0||r>u)throw new Error("gl-fbo: Parameters are too large for FBO");var h=1;if("color"in(n=n||{})){if((h=Math.max(0|n.color,0))<0)throw new Error("gl-fbo: Must specify a nonnegative number of colors");if(h>1){if(!c)throw new Error("gl-fbo: Multiple draw buffer extension not supported");if(h>t.getParameter(c.MAX_COLOR_ATTACHMENTS_WEBGL))throw new Error("gl-fbo: Context does not support "+h+" draw buffers")}}var f=t.UNSIGNED_BYTE,p=t.getExtension("OES_texture_float");if(n.float&&h>0){if(!p)throw new Error("gl-fbo: Context does not support floating point textures");f=t.FLOAT}else n.preferFloat&&h>0&&p&&(f=t.FLOAT);var g=!0;"depth"in n&&(g=!!n.depth);var m=!1;"stencil"in n&&(m=!!n.stencil);return new d(t,e,r,f,h,g,m,c)};var i,a,o,s,l=null;function c(t){return[t.getParameter(t.FRAMEBUFFER_BINDING),t.getParameter(t.RENDERBUFFER_BINDING),t.getParameter(t.TEXTURE_BINDING_2D)]}function u(t,e){t.bindFramebuffer(t.FRAMEBUFFER,e[0]),t.bindRenderbuffer(t.RENDERBUFFER,e[1]),t.bindTexture(t.TEXTURE_2D,e[2])}function h(t){switch(t){case i:throw new Error("gl-fbo: Framebuffer unsupported");case a:throw new Error("gl-fbo: Framebuffer incomplete attachment");case o:throw new Error("gl-fbo: Framebuffer incomplete dimensions");case s:throw new Error("gl-fbo: Framebuffer incomplete missing attachment");default:throw new Error("gl-fbo: Framebuffer failed for unspecified reason")}}function f(t,e,r,i,a,o){if(!i)return null;var s=n(t,e,r,a,i);return s.magFilter=t.NEAREST,s.minFilter=t.NEAREST,s.mipSamples=1,s.bind(),t.framebufferTexture2D(t.FRAMEBUFFER,o,t.TEXTURE_2D,s.handle,0),s}function p(t,e,r,n,i){var a=t.createRenderbuffer();return t.bindRenderbuffer(t.RENDERBUFFER,a),t.renderbufferStorage(t.RENDERBUFFER,n,e,r),t.framebufferRenderbuffer(t.FRAMEBUFFER,i,t.RENDERBUFFER,a),a}function d(t,e,r,n,i,a,o,s){this.gl=t,this._shape=[0|e,0|r],this._destroyed=!1,this._ext=s,this.color=new Array(i);for(var d=0;d<i;++d)this.color[d]=null;this._color_rb=null,this.depth=null,this._depth_rb=null,this._colorType=n,this._useDepth=a,this._useStencil=o;var g=this,m=[0|e,0|r];Object.defineProperties(m,{0:{get:function(){return g._shape[0]},set:function(t){return g.width=t}},1:{get:function(){return g._shape[1]},set:function(t){return g.height=t}}}),this._shapeVector=m,function(t){var e=c(t.gl),r=t.gl,n=t.handle=r.createFramebuffer(),i=t._shape[0],a=t._shape[1],o=t.color.length,s=t._ext,d=t._useStencil,g=t._useDepth,m=t._colorType;r.bindFramebuffer(r.FRAMEBUFFER,n);for(var v=0;v<o;++v)t.color[v]=f(r,i,a,m,r.RGBA,r.COLOR_ATTACHMENT0+v);0===o?(t._color_rb=p(r,i,a,r.RGBA4,r.COLOR_ATTACHMENT0),s&&s.drawBuffersWEBGL(l[0])):o>1&&s.drawBuffersWEBGL(l[o]);var y=r.getExtension("WEBGL_depth_texture");y?d?t.depth=f(r,i,a,y.UNSIGNED_INT_24_8_WEBGL,r.DEPTH_STENCIL,r.DEPTH_STENCIL_ATTACHMENT):g&&(t.depth=f(r,i,a,r.UNSIGNED_SHORT,r.DEPTH_COMPONENT,r.DEPTH_ATTACHMENT)):g&&d?t._depth_rb=p(r,i,a,r.DEPTH_STENCIL,r.DEPTH_STENCIL_ATTACHMENT):g?t._depth_rb=p(r,i,a,r.DEPTH_COMPONENT16,r.DEPTH_ATTACHMENT):d&&(t._depth_rb=p(r,i,a,r.STENCIL_INDEX,r.STENCIL_ATTACHMENT));var x=r.checkFramebufferStatus(r.FRAMEBUFFER);if(x!==r.FRAMEBUFFER_COMPLETE){for(t._destroyed=!0,r.bindFramebuffer(r.FRAMEBUFFER,null),r.deleteFramebuffer(t.handle),t.handle=null,t.depth&&(t.depth.dispose(),t.depth=null),t._depth_rb&&(r.deleteRenderbuffer(t._depth_rb),t._depth_rb=null),v=0;v<t.color.length;++v)t.color[v].dispose(),t.color[v]=null;t._color_rb&&(r.deleteRenderbuffer(t._color_rb),t._color_rb=null),u(r,e),h(x)}u(r,e)}(this)}var g=d.prototype;function m(t,e,r){if(t._destroyed)throw new Error("gl-fbo: Can't resize destroyed FBO");if(t._shape[0]!==e||t._shape[1]!==r){var n=t.gl,i=n.getParameter(n.MAX_RENDERBUFFER_SIZE);if(e<0||e>i||r<0||r>i)throw new Error("gl-fbo: Can't resize FBO, invalid dimensions");t._shape[0]=e,t._shape[1]=r;for(var a=c(n),o=0;o<t.color.length;++o)t.color[o].shape=t._shape;t._color_rb&&(n.bindRenderbuffer(n.RENDERBUFFER,t._color_rb),n.renderbufferStorage(n.RENDERBUFFER,n.RGBA4,t._shape[0],t._shape[1])),t.depth&&(t.depth.shape=t._shape),t._depth_rb&&(n.bindRenderbuffer(n.RENDERBUFFER,t._depth_rb),t._useDepth&&t._useStencil?n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_STENCIL,t._shape[0],t._shape[1]):t._useDepth?n.renderbufferStorage(n.RENDERBUFFER,n.DEPTH_COMPONENT16,t._shape[0],t._shape[1]):t._useStencil&&n.renderbufferStorage(n.RENDERBUFFER,n.STENCIL_INDEX,t._shape[0],t._shape[1])),n.bindFramebuffer(n.FRAMEBUFFER,t.handle);var s=n.checkFramebufferStatus(n.FRAMEBUFFER);s!==n.FRAMEBUFFER_COMPLETE&&(t.dispose(),u(n,a),h(s)),u(n,a)}}Object.defineProperties(g,{shape:{get:function(){return this._destroyed?[0,0]:this._shapeVector},set:function(t){if(Array.isArray(t)||(t=[0|t,0|t]),2!==t.length)throw new Error("gl-fbo: Shape vector must be length 2");var e=0|t[0],r=0|t[1];return m(this,e,r),[e,r]},enumerable:!1},width:{get:function(){return this._destroyed?0:this._shape[0]},set:function(t){return m(this,t|=0,this._shape[1]),t},enumerable:!1},height:{get:function(){return this._destroyed?0:this._shape[1]},set:function(t){return t|=0,m(this,this._shape[0],t),t},enumerable:!1}}),g.bind=function(){if(!this._destroyed){var t=this.gl;t.bindFramebuffer(t.FRAMEBUFFER,this.handle),t.viewport(0,0,this._shape[0],this._shape[1])}},g.dispose=function(){if(!this._destroyed){this._destroyed=!0;var t=this.gl;t.deleteFramebuffer(this.handle),this.handle=null,this.depth&&(this.depth.dispose(),this.depth=null),this._depth_rb&&(t.deleteRenderbuffer(this._depth_rb),this._depth_rb=null);for(var e=0;e<this.color.length;++e)this.color[e].dispose(),this.color[e]=null;this._color_rb&&(t.deleteRenderbuffer(this._color_rb),this._color_rb=null)}}},{"gl-texture2d":303}],240:[function(t,e,r){var n=t("sprintf-js").sprintf,i=t("gl-constants/lookup"),a=t("glsl-shader-name"),o=t("add-line-numbers");e.exports=function(t,e,r){"use strict";var s=a(e)||"of unknown name (see npm glsl-shader-name)",l="unknown type";void 0!==r&&(l=r===i.FRAGMENT_SHADER?"fragment":"vertex");for(var c=n("Error compiling %s shader %s:\n",l,s),u=n("%s%s",c,t),h=t.split("\n"),f={},p=0;p<h.length;p++){var d=h[p];if(""!==d&&"\0"!==d){var g=parseInt(d.split(":")[2]);if(isNaN(g))throw new Error(n("Could not parse error: %s",d));f[g]=d}}for(var m=o(e).split("\n"),p=0;p<m.length;p++)if(f[p+3]||f[p+2]||f[p+1]){var v=m[p];if(c+=v+"\n",f[p+1]){var y=f[p+1];y=y.substr(y.split(":",3).join(":").length+1).trim(),c+=n("^^^ %s\n\n",y)}}return{long:c.trim(),short:u.trim()}}},{"add-line-numbers":52,"gl-constants/lookup":236,"glsl-shader-name":369,"sprintf-js":489}],241:[function(t,e,r){"use strict";e.exports=function(t,e){var r=t.gl,n=o(r,l.vertex,l.fragment),i=o(r,l.pickVertex,l.pickFragment),a=s(r),u=s(r),h=s(r),f=s(r),p=new c(t,n,i,a,u,h,f);return p.update(e),t.addObject(p),p};var n=t("binary-search-bounds"),i=t("iota-array"),a=t("typedarray-pool"),o=t("gl-shader"),s=t("gl-buffer"),l=t("./lib/shaders");function c(t,e,r,n,i,a,o){this.plot=t,this.shader=e,this.pickShader=r,this.positionBuffer=n,this.weightBuffer=i,this.colorBuffer=a,this.idBuffer=o,this.xData=[],this.yData=[],this.shape=[0,0],this.bounds=[1/0,1/0,-1/0,-1/0],this.pickOffset=0}var u,h=c.prototype,f=[0,0,1,0,0,1,1,0,1,1,0,1];h.draw=(u=[1,0,0,0,1,0,0,0,1],function(){var t=this.plot,e=this.shader,r=this.bounds,n=this.numVertices;if(!(n<=0)){var i=t.gl,a=t.dataBox,o=r[2]-r[0],s=r[3]-r[1],l=a[2]-a[0],c=a[3]-a[1];u[0]=2*o/l,u[4]=2*s/c,u[6]=2*(r[0]-a[0])/l-1,u[7]=2*(r[1]-a[1])/c-1,e.bind();var h=e.uniforms;h.viewTransform=u,h.shape=this.shape;var f=e.attributes;this.positionBuffer.bind(),f.position.pointer(),this.weightBuffer.bind(),f.weight.pointer(i.UNSIGNED_BYTE,!1),this.colorBuffer.bind(),f.color.pointer(i.UNSIGNED_BYTE,!0),i.drawArrays(i.TRIANGLES,0,n)}}),h.drawPick=function(){var t=[1,0,0,0,1,0,0,0,1],e=[0,0,0,0];return function(r){var n=this.plot,i=this.pickShader,a=this.bounds,o=this.numVertices;if(!(o<=0)){var s=n.gl,l=n.dataBox,c=a[2]-a[0],u=a[3]-a[1],h=l[2]-l[0],f=l[3]-l[1];t[0]=2*c/h,t[4]=2*u/f,t[6]=2*(a[0]-l[0])/h-1,t[7]=2*(a[1]-l[1])/f-1;for(var p=0;p<4;++p)e[p]=r>>8*p&255;this.pickOffset=r,i.bind();var d=i.uniforms;d.viewTransform=t,d.pickOffset=e,d.shape=this.shape;var g=i.attributes;return this.positionBuffer.bind(),g.position.pointer(),this.weightBuffer.bind(),g.weight.pointer(s.UNSIGNED_BYTE,!1),this.idBuffer.bind(),g.pickId.pointer(s.UNSIGNED_BYTE,!1),s.drawArrays(s.TRIANGLES,0,o),r+this.shape[0]*this.shape[1]}}}(),h.pick=function(t,e,r){var n=this.pickOffset,i=this.shape[0]*this.shape[1];if(r<n||r>=n+i)return null;var a=r-n,o=this.xData,s=this.yData;return{object:this,pointId:a,dataCoord:[o[a%this.shape[0]],s[a/this.shape[0]|0]]}},h.update=function(t){var e=(t=t||{}).shape||[0,0],r=t.x||i(e[0]),o=t.y||i(e[1]),s=t.z||new Float32Array(e[0]*e[1]);this.xData=r,this.yData=o;var l=t.colorLevels||[0],c=t.colorValues||[0,0,0,1],u=l.length,h=this.bounds,p=h[0]=r[0],d=h[1]=o[0],g=1/((h[2]=r[r.length-1])-p),m=1/((h[3]=o[o.length-1])-d),v=e[0],y=e[1];this.shape=[v,y];var x=(v-1)*(y-1)*(f.length>>>1);this.numVertices=x;for(var b=a.mallocUint8(4*x),_=a.mallocFloat32(2*x),w=a.mallocUint8(2*x),k=a.mallocUint32(x),M=0,A=0;A<y-1;++A)for(var T=m*(o[A]-d),S=m*(o[A+1]-d),E=0;E<v-1;++E)for(var C=g*(r[E]-p),L=g*(r[E+1]-p),z=0;z<f.length;z+=2){var P,I,O,D,R=f[z],B=f[z+1],F=s[(A+B)*v+(E+R)],N=n.le(l,F);if(N<0)P=c[0],I=c[1],O=c[2],D=c[3];else if(N===u-1)P=c[4*u-4],I=c[4*u-3],O=c[4*u-2],D=c[4*u-1];else{var j=(F-l[N])/(l[N+1]-l[N]),V=1-j,U=4*N,q=4*(N+1);P=V*c[U]+j*c[q],I=V*c[U+1]+j*c[q+1],O=V*c[U+2]+j*c[q+2],D=V*c[U+3]+j*c[q+3]}b[4*M]=255*P,b[4*M+1]=255*I,b[4*M+2]=255*O,b[4*M+3]=255*D,_[2*M]=.5*C+.5*L,_[2*M+1]=.5*T+.5*S,w[2*M]=R,w[2*M+1]=B,k[M]=A*v+E,M+=1}this.positionBuffer.update(_),this.weightBuffer.update(w),this.colorBuffer.update(b),this.idBuffer.update(k),a.free(_),a.free(b),a.free(w),a.free(k)},h.dispose=function(){this.shader.dispose(),this.pickShader.dispose(),this.positionBuffer.dispose(),this.weightBuffer.dispose(),this.colorBuffer.dispose(),this.idBuffer.dispose(),this.plot.removeObject(this)}},{"./lib/shaders":242,"binary-search-bounds":243,"gl-buffer":230,"gl-shader":287,"iota-array":384,"typedarray-pool":507}],242:[function(t,e,r){"use strict";var n=t("glslify");e.exports={fragment:n(["precision lowp float;\n#define GLSLIFY 1\nvarying vec4 fragColor;\nvoid main() {\n  gl_FragColor = vec4(fragColor.rgb * fragColor.a, fragColor.a);\n}\n"]),vertex:n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec2 position;\nattribute vec4 color;\nattribute vec2 weight;\n\nuniform vec2 shape;\nuniform mat3 viewTransform;\n\nvarying vec4 fragColor;\n\nvoid main() {\n  vec3 vPosition = viewTransform * vec3( position + (weight-.5)/(shape-1.) , 1.0);\n  fragColor = color;\n  gl_Position = vec4(vPosition.xy, 0, vPosition.z);\n}\n"]),pickFragment:n(["precision mediump float;\n#define GLSLIFY 1\n\nvarying vec4 fragId;\nvarying vec2 vWeight;\n\nuniform vec2 shape;\nuniform vec4 pickOffset;\n\nvoid main() {\n  vec2 d = step(.5, vWeight);\n  vec4 id = fragId + pickOffset;\n  id.x += d.x + d.y*shape.x;\n\n  id.y += floor(id.x / 256.0);\n  id.x -= floor(id.x / 256.0) * 256.0;\n\n  id.z += floor(id.y / 256.0);\n  id.y -= floor(id.y / 256.0) * 256.0;\n\n  id.w += floor(id.z / 256.0);\n  id.z -= floor(id.z / 256.0) * 256.0;\n\n  gl_FragColor = id/255.;\n}\n"]),pickVertex:n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec2 position;\nattribute vec4 pickId;\nattribute vec2 weight;\n\nuniform vec2 shape;\nuniform mat3 viewTransform;\n\nvarying vec4 fragId;\nvarying vec2 vWeight;\n\nvoid main() {\n  vWeight = weight;\n\n  fragId = pickId;\n\n  vec3 vPosition = viewTransform * vec3( position + (weight-.5)/(shape-1.) , 1.0);\n  gl_Position = vec4(vPosition.xy, 0, vPosition.z);\n}\n"])}},{glslify:377}],243:[function(t,e,r){arguments[4][98][0].apply(r,arguments)},{dup:98}],244:[function(t,e,r){var n=t("glslify"),i=t("gl-shader"),a=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position, nextPosition;\nattribute float arcLength, lineWidth;\nattribute vec4 color;\n\nuniform vec2 screenShape;\nuniform float pixelRatio;\nuniform mat4 model, view, projection;\n\nvarying vec4 fragColor;\nvarying vec3 worldPosition;\nvarying float pixelArcLength;\n\nvoid main() {\n  vec4 projected = projection * view * model * vec4(position, 1.0);\n  vec4 tangentClip = projection * view * model * vec4(nextPosition - position, 0.0);\n  vec2 tangent = normalize(screenShape * tangentClip.xy);\n  vec2 offset = 0.5 * pixelRatio * lineWidth * vec2(tangent.y, -tangent.x) / screenShape;\n\n  gl_Position = vec4(projected.xy + projected.w * offset, projected.zw);\n\n  worldPosition = position;\n  pixelArcLength = arcLength;\n  fragColor = color;\n}\n"]),o=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec3      clipBounds[2];\nuniform sampler2D dashTexture;\nuniform float     dashScale;\nuniform float     opacity;\n\nvarying vec3    worldPosition;\nvarying float   pixelArcLength;\nvarying vec4    fragColor;\n\nvoid main() {\n  if(any(lessThan(worldPosition, clipBounds[0])) || any(greaterThan(worldPosition, clipBounds[1]))) {\n    discard;\n  }\n  float dashWeight = texture2D(dashTexture, vec2(dashScale * pixelArcLength, 0)).r;\n  if(dashWeight < 0.5) {\n    discard;\n  }\n  gl_FragColor = fragColor * opacity;\n}\n"]),s=n(["precision mediump float;\n#define GLSLIFY 1\n\n#define FLOAT_MAX  1.70141184e38\n#define FLOAT_MIN  1.17549435e-38\n\nlowp vec4 encode_float_1540259130(highp float v) {\n  highp float av = abs(v);\n\n  //Handle special cases\n  if(av < FLOAT_MIN) {\n    return vec4(0.0, 0.0, 0.0, 0.0);\n  } else if(v > FLOAT_MAX) {\n    return vec4(127.0, 128.0, 0.0, 0.0) / 255.0;\n  } else if(v < -FLOAT_MAX) {\n    return vec4(255.0, 128.0, 0.0, 0.0) / 255.0;\n  }\n\n  highp vec4 c = vec4(0,0,0,0);\n\n  //Compute exponent and mantissa\n  highp float e = floor(log2(av));\n  highp float m = av * pow(2.0, -e) - 1.0;\n  \n  //Unpack mantissa\n  c[1] = floor(128.0 * m);\n  m -= c[1] / 128.0;\n  c[2] = floor(32768.0 * m);\n  m -= c[2] / 32768.0;\n  c[3] = floor(8388608.0 * m);\n  \n  //Unpack exponent\n  highp float ebias = e + 127.0;\n  c[0] = floor(ebias / 2.0);\n  ebias -= c[0] * 2.0;\n  c[1] += floor(ebias) * 128.0; \n\n  //Unpack sign bit\n  c[0] += 128.0 * step(0.0, -v);\n\n  //Scale back to range\n  return c / 255.0;\n}\n\nuniform float pickId;\nuniform vec3 clipBounds[2];\n\nvarying vec3 worldPosition;\nvarying float pixelArcLength;\nvarying vec4 fragColor;\n\nvoid main() {\n  if(any(lessThan(worldPosition, clipBounds[0])) || any(greaterThan(worldPosition, clipBounds[1]))) {\n    discard;\n  }\n  gl_FragColor = vec4(pickId/255.0, encode_float_1540259130(pixelArcLength).xyz);\n}"]),l=[{name:"position",type:"vec3"},{name:"nextPosition",type:"vec3"},{name:"arcLength",type:"float"},{name:"lineWidth",type:"float"},{name:"color",type:"vec4"}];r.createShader=function(t){return i(t,a,o,null,l)},r.createPickShader=function(t){return i(t,a,s,null,l)}},{"gl-shader":287,glslify:377}],245:[function(t,e,r){"use strict";e.exports=function(t){var e=t.gl||t.scene&&t.scene.gl,r=u(e);r.attributes.position.location=0,r.attributes.nextPosition.location=1,r.attributes.arcLength.location=2,r.attributes.lineWidth.location=3,r.attributes.color.location=4;var o=h(e);o.attributes.position.location=0,o.attributes.nextPosition.location=1,o.attributes.arcLength.location=2,o.attributes.lineWidth.location=3,o.attributes.color.location=4;for(var s=n(e),c=i(e,[{buffer:s,size:3,offset:0,stride:48},{buffer:s,size:3,offset:12,stride:48},{buffer:s,size:1,offset:24,stride:48},{buffer:s,size:1,offset:28,stride:48},{buffer:s,size:4,offset:32,stride:48}]),f=l(new Array(1024),[256,1,4]),p=0;p<1024;++p)f.data[p]=255;var d=a(e,f);d.wrap=e.REPEAT;var g=new m(e,r,o,s,c,d);return g.update(t),g};var n=t("gl-buffer"),i=t("gl-vao"),a=t("gl-texture2d"),o=t("glsl-read-float"),s=t("binary-search-bounds"),l=t("ndarray"),c=t("./lib/shaders"),u=c.createShader,h=c.createPickShader,f=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function p(t,e){for(var r=0,n=0;n<3;++n){var i=t[n]-e[n];r+=i*i}return Math.sqrt(r)}function d(t){for(var e=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],r=0;r<3;++r)e[0][r]=Math.max(t[0][r],e[0][r]),e[1][r]=Math.min(t[1][r],e[1][r]);return e}function g(t,e,r,n){this.arcLength=t,this.position=e,this.index=r,this.dataCoordinate=n}function m(t,e,r,n,i,a){this.gl=t,this.shader=e,this.pickShader=r,this.buffer=n,this.vao=i,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.points=[],this.arcLength=[],this.vertexCount=0,this.bounds=[[0,0,0],[0,0,0]],this.pickId=0,this.lineWidth=1,this.texture=a,this.dashScale=1,this.opacity=1,this.dirty=!0,this.pixelRatio=1}var v=m.prototype;v.isTransparent=function(){return this.opacity<1},v.isOpaque=function(){return this.opacity>=1},v.pickSlots=1,v.setPickBase=function(t){this.pickId=t},v.drawTransparent=v.draw=function(t){var e=this.gl,r=this.shader,n=this.vao;r.bind(),r.uniforms={model:t.model||f,view:t.view||f,projection:t.projection||f,clipBounds:d(this.clipBounds),dashTexture:this.texture.bind(),dashScale:this.dashScale/this.arcLength[this.arcLength.length-1],opacity:this.opacity,screenShape:[e.drawingBufferWidth,e.drawingBufferHeight],pixelRatio:this.pixelRatio},n.bind(),n.draw(e.TRIANGLE_STRIP,this.vertexCount),n.unbind()},v.drawPick=function(t){var e=this.gl,r=this.pickShader,n=this.vao;r.bind(),r.uniforms={model:t.model||f,view:t.view||f,projection:t.projection||f,pickId:this.pickId,clipBounds:d(this.clipBounds),screenShape:[e.drawingBufferWidth,e.drawingBufferHeight],pixelRatio:this.pixelRatio},n.bind(),n.draw(e.TRIANGLE_STRIP,this.vertexCount),n.unbind()},v.update=function(t){var e,r;this.dirty=!0;var n=!!t.connectGaps;"dashScale"in t&&(this.dashScale=t.dashScale),"opacity"in t&&(this.opacity=+t.opacity);var i=t.position||t.positions;if(i){var a=t.color||t.colors||[0,0,0,1],o=t.lineWidth||1,c=[],u=[],h=[],f=0,d=0,g=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],m=!1;t:for(e=1;e<i.length;++e){var v,y,x,b=i[e-1],_=i[e];for(u.push(f),h.push(b.slice()),r=0;r<3;++r){if(isNaN(b[r])||isNaN(_[r])||!isFinite(b[r])||!isFinite(_[r])){if(!n&&c.length>0){for(var w=0;w<24;++w)c.push(c[c.length-12]);d+=2,m=!0}continue t}g[0][r]=Math.min(g[0][r],b[r],_[r]),g[1][r]=Math.max(g[1][r],b[r],_[r])}Array.isArray(a[0])?(v=a[e-1],y=a[e]):v=y=a,3===v.length&&(v=[v[0],v[1],v[2],1]),3===y.length&&(y=[y[0],y[1],y[2],1]),x=Array.isArray(o)?o[e-1]:o;var k=f;if(f+=p(b,_),m){for(r=0;r<2;++r)c.push(b[0],b[1],b[2],_[0],_[1],_[2],k,x,v[0],v[1],v[2],v[3]);d+=2,m=!1}c.push(b[0],b[1],b[2],_[0],_[1],_[2],k,x,v[0],v[1],v[2],v[3],b[0],b[1],b[2],_[0],_[1],_[2],k,-x,v[0],v[1],v[2],v[3],_[0],_[1],_[2],b[0],b[1],b[2],f,-x,y[0],y[1],y[2],y[3],_[0],_[1],_[2],b[0],b[1],b[2],f,x,y[0],y[1],y[2],y[3]),d+=4}if(this.buffer.update(c),u.push(f),h.push(i[i.length-1].slice()),this.bounds=g,this.vertexCount=d,this.points=h,this.arcLength=u,"dashes"in t){var M=t.dashes.slice();for(M.unshift(0),e=1;e<M.length;++e)M[e]=M[e-1]+M[e];var A=l(new Array(1024),[256,1,4]);for(e=0;e<256;++e){for(r=0;r<4;++r)A.set(e,0,r,0);1&s.le(M,M[M.length-1]*e/255)?A.set(e,0,0,0):A.set(e,0,0,255)}this.texture.setPixels(A)}}},v.dispose=function(){this.shader.dispose(),this.vao.dispose(),this.buffer.dispose()},v.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;var e=o(t.value[0],t.value[1],t.value[2],0),r=s.le(this.arcLength,e);if(r<0)return null;if(r===this.arcLength.length-1)return new g(this.arcLength[this.arcLength.length-1],this.points[this.points.length-1].slice(),r);for(var n=this.points[r],i=this.points[Math.min(r+1,this.points.length-1)],a=(e-this.arcLength[r])/(this.arcLength[r+1]-this.arcLength[r]),l=1-a,c=[0,0,0],u=0;u<3;++u)c[u]=l*n[u]+a*i[u];var h=Math.min(a<.5?r:r+1,this.points.length-1);return new g(e,c,h,this.points[h])}},{"./lib/shaders":244,"binary-search-bounds":79,"gl-buffer":230,"gl-texture2d":303,"gl-vao":308,"glsl-read-float":368,ndarray:417}],246:[function(t,e,r){e.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r*a-i*n;return o?(o=1/o,t[0]=a*o,t[1]=-n*o,t[2]=-i*o,t[3]=r*o,t):null}},{}],247:[function(t,e,r){e.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],c=e[7],u=e[8],h=u*o-s*c,f=-u*a+s*l,p=c*a-o*l,d=r*h+n*f+i*p;return d?(d=1/d,t[0]=h*d,t[1]=(-u*n+i*c)*d,t[2]=(s*n-i*o)*d,t[3]=f*d,t[4]=(u*r-i*l)*d,t[5]=(-s*r+i*a)*d,t[6]=p*d,t[7]=(-c*r+n*l)*d,t[8]=(o*r-n*a)*d,t):null}},{}],248:[function(t,e,r){e.exports=function(t){var e=new Float32Array(16);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e[9]=t[9],e[10]=t[10],e[11]=t[11],e[12]=t[12],e[13]=t[13],e[14]=t[14],e[15]=t[15],e}},{}],249:[function(t,e,r){e.exports=function(){var t=new Float32Array(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},{}],250:[function(t,e,r){e.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3],a=t[4],o=t[5],s=t[6],l=t[7],c=t[8],u=t[9],h=t[10],f=t[11],p=t[12],d=t[13],g=t[14],m=t[15];return(e*o-r*a)*(h*m-f*g)-(e*s-n*a)*(u*m-f*d)+(e*l-i*a)*(u*g-h*d)+(r*s-n*o)*(c*m-f*p)-(r*l-i*o)*(c*g-h*p)+(n*l-i*s)*(c*d-u*p)}},{}],251:[function(t,e,r){e.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r+r,s=n+n,l=i+i,c=r*o,u=n*o,h=n*s,f=i*o,p=i*s,d=i*l,g=a*o,m=a*s,v=a*l;return t[0]=1-h-d,t[1]=u+v,t[2]=f-m,t[3]=0,t[4]=u-v,t[5]=1-c-d,t[6]=p+g,t[7]=0,t[8]=f+m,t[9]=p-g,t[10]=1-c-h,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},{}],252:[function(t,e,r){e.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=n+n,l=i+i,c=a+a,u=n*s,h=n*l,f=n*c,p=i*l,d=i*c,g=a*c,m=o*s,v=o*l,y=o*c;return t[0]=1-(p+g),t[1]=h+y,t[2]=f-v,t[3]=0,t[4]=h-y,t[5]=1-(u+g),t[6]=d+m,t[7]=0,t[8]=f+v,t[9]=d-m,t[10]=1-(u+p),t[11]=0,t[12]=r[0],t[13]=r[1],t[14]=r[2],t[15]=1,t}},{}],253:[function(t,e,r){e.exports=function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t}},{}],254:[function(t,e,r){e.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],c=e[7],u=e[8],h=e[9],f=e[10],p=e[11],d=e[12],g=e[13],m=e[14],v=e[15],y=r*s-n*o,x=r*l-i*o,b=r*c-a*o,_=n*l-i*s,w=n*c-a*s,k=i*c-a*l,M=u*g-h*d,A=u*m-f*d,T=u*v-p*d,S=h*m-f*g,E=h*v-p*g,C=f*v-p*m,L=y*C-x*E+b*S+_*T-w*A+k*M;if(!L)return null;return L=1/L,t[0]=(s*C-l*E+c*S)*L,t[1]=(i*E-n*C-a*S)*L,t[2]=(g*k-m*w+v*_)*L,t[3]=(f*w-h*k-p*_)*L,t[4]=(l*T-o*C-c*A)*L,t[5]=(r*C-i*T+a*A)*L,t[6]=(m*b-d*k-v*x)*L,t[7]=(u*k-f*b+p*x)*L,t[8]=(o*E-s*T+c*M)*L,t[9]=(n*T-r*E-a*M)*L,t[10]=(d*w-g*b+v*y)*L,t[11]=(h*b-u*w-p*y)*L,t[12]=(s*A-o*S-l*M)*L,t[13]=(r*S-n*A+i*M)*L,t[14]=(g*x-d*_-m*y)*L,t[15]=(u*_-h*x+f*y)*L,t}},{}],255:[function(t,e,r){var n=t("./identity");e.exports=function(t,e,r,i){var a,o,s,l,c,u,h,f,p,d,g=e[0],m=e[1],v=e[2],y=i[0],x=i[1],b=i[2],_=r[0],w=r[1],k=r[2];if(Math.abs(g-_)<1e-6&&Math.abs(m-w)<1e-6&&Math.abs(v-k)<1e-6)return n(t);h=g-_,f=m-w,p=v-k,d=1/Math.sqrt(h*h+f*f+p*p),a=x*(p*=d)-b*(f*=d),o=b*(h*=d)-y*p,s=y*f-x*h,(d=Math.sqrt(a*a+o*o+s*s))?(a*=d=1/d,o*=d,s*=d):(a=0,o=0,s=0);l=f*s-p*o,c=p*a-h*s,u=h*o-f*a,(d=Math.sqrt(l*l+c*c+u*u))?(l*=d=1/d,c*=d,u*=d):(l=0,c=0,u=0);return t[0]=a,t[1]=l,t[2]=h,t[3]=0,t[4]=o,t[5]=c,t[6]=f,t[7]=0,t[8]=s,t[9]=u,t[10]=p,t[11]=0,t[12]=-(a*g+o*m+s*v),t[13]=-(l*g+c*m+u*v),t[14]=-(h*g+f*m+p*v),t[15]=1,t}},{"./identity":253}],256:[function(t,e,r){e.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],c=e[6],u=e[7],h=e[8],f=e[9],p=e[10],d=e[11],g=e[12],m=e[13],v=e[14],y=e[15],x=r[0],b=r[1],_=r[2],w=r[3];return t[0]=x*n+b*s+_*h+w*g,t[1]=x*i+b*l+_*f+w*m,t[2]=x*a+b*c+_*p+w*v,t[3]=x*o+b*u+_*d+w*y,x=r[4],b=r[5],_=r[6],w=r[7],t[4]=x*n+b*s+_*h+w*g,t[5]=x*i+b*l+_*f+w*m,t[6]=x*a+b*c+_*p+w*v,t[7]=x*o+b*u+_*d+w*y,x=r[8],b=r[9],_=r[10],w=r[11],t[8]=x*n+b*s+_*h+w*g,t[9]=x*i+b*l+_*f+w*m,t[10]=x*a+b*c+_*p+w*v,t[11]=x*o+b*u+_*d+w*y,x=r[12],b=r[13],_=r[14],w=r[15],t[12]=x*n+b*s+_*h+w*g,t[13]=x*i+b*l+_*f+w*m,t[14]=x*a+b*c+_*p+w*v,t[15]=x*o+b*u+_*d+w*y,t}},{}],257:[function(t,e,r){e.exports=function(t,e,r,n,i){var a=1/Math.tan(e/2),o=1/(n-i);return t[0]=a/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(i+n)*o,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*i*n*o,t[15]=0,t}},{}],258:[function(t,e,r){e.exports=function(t,e,r,n){var i,a,o,s,l,c,u,h,f,p,d,g,m,v,y,x,b,_,w,k,M,A,T,S,E=n[0],C=n[1],L=n[2],z=Math.sqrt(E*E+C*C+L*L);if(Math.abs(z)<1e-6)return null;E*=z=1/z,C*=z,L*=z,i=Math.sin(r),a=Math.cos(r),o=1-a,s=e[0],l=e[1],c=e[2],u=e[3],h=e[4],f=e[5],p=e[6],d=e[7],g=e[8],m=e[9],v=e[10],y=e[11],x=E*E*o+a,b=C*E*o+L*i,_=L*E*o-C*i,w=E*C*o-L*i,k=C*C*o+a,M=L*C*o+E*i,A=E*L*o+C*i,T=C*L*o-E*i,S=L*L*o+a,t[0]=s*x+h*b+g*_,t[1]=l*x+f*b+m*_,t[2]=c*x+p*b+v*_,t[3]=u*x+d*b+y*_,t[4]=s*w+h*k+g*M,t[5]=l*w+f*k+m*M,t[6]=c*w+p*k+v*M,t[7]=u*w+d*k+y*M,t[8]=s*A+h*T+g*S,t[9]=l*A+f*T+m*S,t[10]=c*A+p*T+v*S,t[11]=u*A+d*T+y*S,e!==t&&(t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]);return t}},{}],259:[function(t,e,r){e.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[4],o=e[5],s=e[6],l=e[7],c=e[8],u=e[9],h=e[10],f=e[11];e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]);return t[4]=a*i+c*n,t[5]=o*i+u*n,t[6]=s*i+h*n,t[7]=l*i+f*n,t[8]=c*i-a*n,t[9]=u*i-o*n,t[10]=h*i-s*n,t[11]=f*i-l*n,t}},{}],260:[function(t,e,r){e.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[0],o=e[1],s=e[2],l=e[3],c=e[8],u=e[9],h=e[10],f=e[11];e!==t&&(t[4]=e[4],t[5]=e[5],t[6]=e[6],t[7]=e[7],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]);return t[0]=a*i-c*n,t[1]=o*i-u*n,t[2]=s*i-h*n,t[3]=l*i-f*n,t[8]=a*n+c*i,t[9]=o*n+u*i,t[10]=s*n+h*i,t[11]=l*n+f*i,t}},{}],261:[function(t,e,r){e.exports=function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[0],o=e[1],s=e[2],l=e[3],c=e[4],u=e[5],h=e[6],f=e[7];e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]);return t[0]=a*i+c*n,t[1]=o*i+u*n,t[2]=s*i+h*n,t[3]=l*i+f*n,t[4]=c*i-a*n,t[5]=u*i-o*n,t[6]=h*i-s*n,t[7]=f*i-l*n,t}},{}],262:[function(t,e,r){e.exports=function(t,e,r){var n=r[0],i=r[1],a=r[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=e[7]*i,t[8]=e[8]*a,t[9]=e[9]*a,t[10]=e[10]*a,t[11]=e[11]*a,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t}},{}],263:[function(t,e,r){e.exports=function(t,e,r){var n,i,a,o,s,l,c,u,h,f,p,d,g=r[0],m=r[1],v=r[2];e===t?(t[12]=e[0]*g+e[4]*m+e[8]*v+e[12],t[13]=e[1]*g+e[5]*m+e[9]*v+e[13],t[14]=e[2]*g+e[6]*m+e[10]*v+e[14],t[15]=e[3]*g+e[7]*m+e[11]*v+e[15]):(n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],c=e[6],u=e[7],h=e[8],f=e[9],p=e[10],d=e[11],t[0]=n,t[1]=i,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t[6]=c,t[7]=u,t[8]=h,t[9]=f,t[10]=p,t[11]=d,t[12]=n*g+s*m+h*v+e[12],t[13]=i*g+l*m+f*v+e[13],t[14]=a*g+c*m+p*v+e[14],t[15]=o*g+u*m+d*v+e[15]);return t}},{}],264:[function(t,e,r){e.exports=function(t,e){if(t===e){var r=e[1],n=e[2],i=e[3],a=e[6],o=e[7],s=e[11];t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=r,t[6]=e[9],t[7]=e[13],t[8]=n,t[9]=a,t[11]=e[14],t[12]=i,t[13]=o,t[14]=s}else t[0]=e[0],t[1]=e[4],t[2]=e[8],t[3]=e[12],t[4]=e[1],t[5]=e[5],t[6]=e[9],t[7]=e[13],t[8]=e[2],t[9]=e[6],t[10]=e[10],t[11]=e[14],t[12]=e[3],t[13]=e[7],t[14]=e[11],t[15]=e[15];return t}},{}],265:[function(t,e,r){"use strict";e.exports=function(t,e){switch(e.length){case 0:break;case 1:t[0]=1/e[0];break;case 4:n(t,e);break;case 9:i(t,e);break;case 16:a(t,e);break;default:throw new Error("currently supports matrices up to 4x4")}return t};var n=t("gl-mat2/invert"),i=t("gl-mat3/invert"),a=t("gl-mat4/invert")},{"gl-mat2/invert":246,"gl-mat3/invert":247,"gl-mat4/invert":254}],266:[function(t,e,r){"use strict";var n=t("barycentric"),i=t("polytope-closest-point/lib/closest_point_2d.js");function a(t,e){for(var r=[0,0,0,0],n=0;n<4;++n)for(var i=0;i<4;++i)r[i]+=t[4*n+i]*e[n];return r}function o(t,e,r,n,i){for(var o=a(n,a(r,a(e,[t[0],t[1],t[2],1]))),s=0;s<3;++s)o[s]/=o[3];return[.5*i[0]*(1+o[0]),.5*i[1]*(1-o[1])]}e.exports=function(t,e,r,a,s,l){if(1===t.length)return[0,t[0].slice()];for(var c=new Array(t.length),u=0;u<t.length;++u)c[u]=o(t[u],r,a,s,l);for(var h=0,f=1/0,u=0;u<c.length;++u){for(var p=0,d=0;d<2;++d)p+=Math.pow(c[u][d]-e[d],2);p<f&&(f=p,h=u)}for(var g=function(t,e){if(2===t.length){for(var r=0,a=0,o=0;o<2;++o)r+=Math.pow(e[o]-t[0][o],2),a+=Math.pow(e[o]-t[1][o],2);return r=Math.sqrt(r),a=Math.sqrt(a),r+a<1e-6?[1,0]:[a/(r+a),r/(a+r)]}if(3===t.length){var s=[0,0];return i(t[0],t[1],t[2],e,s),n(t,s)}return[]}(c,e),m=0,u=0;u<3;++u){if(g[u]<-.001||g[u]>1.0001)return null;m+=g[u]}if(Math.abs(m-1)>.001)return null;return[h,function(t,e){for(var r=[0,0,0],n=0;n<t.length;++n)for(var i=t[n],a=e[n],o=0;o<3;++o)r[o]+=a*i[o];return r}(t,g),g]}},{barycentric:61,"polytope-closest-point/lib/closest_point_2d.js":448}],267:[function(t,e,r){var n=t("glslify"),i=n(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec3 position, normal;\nattribute vec4 color;\nattribute vec2 uv;\n\nuniform mat4 model\n           , view\n           , projection;\nuniform vec3 eyePosition\n           , lightPosition;\n\nvarying vec3 f_normal\n           , f_lightDirection\n           , f_eyeDirection\n           , f_data;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n  vec4 m_position  = model * vec4(position, 1.0);\n  vec4 t_position  = view * m_position;\n  gl_Position      = projection * t_position;\n  f_color          = color;\n  f_normal         = normal;\n  f_data           = position;\n  f_eyeDirection   = eyePosition   - position;\n  f_lightDirection = lightPosition - position;\n  f_uv             = uv;\n}\n"]),a=n(["#extension GL_OES_standard_derivatives : enable\n\nprecision highp float;\n#define GLSLIFY 1\n\nfloat beckmannDistribution(float x, float roughness) {\n  float NdotH = max(x, 0.0001);\n  float cos2Alpha = NdotH * NdotH;\n  float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\n  float roughness2 = roughness * roughness;\n  float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\n  return exp(tan2Alpha / roughness2) / denom;\n}\n\nfloat cookTorranceSpecular(\n  vec3 lightDirection,\n  vec3 viewDirection,\n  vec3 surfaceNormal,\n  float roughness,\n  float fresnel) {\n\n  float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\n  float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\n\n  //Half angle vector\n  vec3 H = normalize(lightDirection + viewDirection);\n\n  //Geometric term\n  float NdotH = max(dot(surfaceNormal, H), 0.0);\n  float VdotH = max(dot(viewDirection, H), 0.000001);\n  float LdotH = max(dot(lightDirection, H), 0.000001);\n  float G1 = (2.0 * NdotH * VdotN) / VdotH;\n  float G2 = (2.0 * NdotH * LdotN) / LdotH;\n  float G = min(1.0, min(G1, G2));\n  \n  //Distribution term\n  float D = beckmannDistribution(NdotH, roughness);\n\n  //Fresnel term\n  float F = pow(1.0 - VdotN, fresnel);\n\n  //Multiply terms and done\n  return  G * F * D / max(3.14159265 * VdotN, 0.000001);\n}\n\nvec3 normals(vec3 pos) {\n  vec3 fdx = dFdx(pos);\n  vec3 fdy = dFdy(pos);\n  return normalize(cross(fdx, fdy));\n}\n\nuniform vec3 clipBounds[2];\nuniform float roughness\n            , fresnel\n            , kambient\n            , kdiffuse\n            , kspecular\n            , opacity;\nuniform sampler2D texture;\n\nvarying vec3 f_normal\n           , f_lightDirection\n           , f_eyeDirection\n           , f_data;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n  if(any(lessThan(f_data, clipBounds[0])) ||\n     any(greaterThan(f_data, clipBounds[1]))) {\n    discard;\n  }\n\n  vec3 N = normalize(f_normal);\n  vec3 L = normalize(f_lightDirection);\n  vec3 V = normalize(f_eyeDirection);\n\n  vec3 normal = normals(f_data);\n\n  if (\n    dot(N, normal) < 0.0\n    ) {\n      N = -N;\n  }\n\n  float specular = cookTorranceSpecular(L, V, N, roughness, fresnel);\n  float diffuse  = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\n\n  vec4 surfaceColor = f_color * texture2D(texture, f_uv);\n  vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular,  1.0);\n\n  gl_FragColor = litColor * opacity;\n}\n"]),o=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position;\nattribute vec4 color;\nattribute vec2 uv;\n\nuniform mat4 model, view, projection;\n\nvarying vec4 f_color;\nvarying vec3 f_data;\nvarying vec2 f_uv;\n\nvoid main() {\n  gl_Position = projection * view * model * vec4(position, 1.0);\n  f_color = color;\n  f_data  = position;\n  f_uv    = uv;\n}"]),s=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec3 clipBounds[2];\nuniform sampler2D texture;\nuniform float opacity;\n\nvarying vec4 f_color;\nvarying vec3 f_data;\nvarying vec2 f_uv;\n\nvoid main() {\n  if(any(lessThan(f_data, clipBounds[0])) || \n     any(greaterThan(f_data, clipBounds[1]))) {\n    discard;\n  }\n\n  gl_FragColor = f_color * texture2D(texture, f_uv) * opacity;\n}"]),l=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position;\nattribute vec4 color;\nattribute vec2 uv;\nattribute float pointSize;\n\nuniform mat4 model, view, projection;\nuniform vec3 clipBounds[2];\n\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n  if(any(lessThan(position, clipBounds[0])) || \n     any(greaterThan(position, clipBounds[1]))) {\n    gl_Position = vec4(0,0,0,0);\n  } else {\n    gl_Position = projection * view * model * vec4(position, 1.0);\n  }\n  gl_PointSize = pointSize;\n  f_color = color;\n  f_uv = uv;\n}"]),c=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform sampler2D texture;\nuniform float opacity;\n\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n  vec2 pointR = gl_PointCoord.xy - vec2(0.5,0.5);\n  if(dot(pointR, pointR) > 0.25) {\n    discard;\n  }\n  gl_FragColor = f_color * texture2D(texture, f_uv) * opacity;\n}"]),u=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position;\nattribute vec4 id;\n\nuniform mat4 model, view, projection;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n  gl_Position = projection * view * model * vec4(position, 1.0);\n  f_id        = id;\n  f_position  = position;\n}"]),h=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec3  clipBounds[2];\nuniform float pickId;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n  if(any(lessThan(f_position, clipBounds[0])) || \n     any(greaterThan(f_position, clipBounds[1]))) {\n    discard;\n  }\n  gl_FragColor = vec4(pickId, f_id.xyz);\n}"]),f=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3  position;\nattribute float pointSize;\nattribute vec4  id;\n\nuniform mat4 model, view, projection;\nuniform vec3 clipBounds[2];\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n  if(any(lessThan(position, clipBounds[0])) || \n     any(greaterThan(position, clipBounds[1]))) {\n    gl_Position = vec4(0,0,0,0);\n  } else {\n    gl_Position  = projection * view * model * vec4(position, 1.0);\n    gl_PointSize = pointSize;\n  }\n  f_id         = id;\n  f_position   = position;\n}"]),p=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position;\n\nuniform mat4 model, view, projection;\n\nvoid main() {\n  gl_Position = projection * view * model * vec4(position, 1.0);\n}"]),d=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec3 contourColor;\n\nvoid main() {\n  gl_FragColor = vec4(contourColor,1);\n}\n"]);r.meshShader={vertex:i,fragment:a,attributes:[{name:"position",type:"vec3"},{name:"normal",type:"vec3"},{name:"color",type:"vec4"},{name:"uv",type:"vec2"}]},r.wireShader={vertex:o,fragment:s,attributes:[{name:"position",type:"vec3"},{name:"color",type:"vec4"},{name:"uv",type:"vec2"}]},r.pointShader={vertex:l,fragment:c,attributes:[{name:"position",type:"vec3"},{name:"color",type:"vec4"},{name:"uv",type:"vec2"},{name:"pointSize",type:"float"}]},r.pickShader={vertex:u,fragment:h,attributes:[{name:"position",type:"vec3"},{name:"id",type:"vec4"}]},r.pointPickShader={vertex:f,fragment:h,attributes:[{name:"position",type:"vec3"},{name:"pointSize",type:"float"},{name:"id",type:"vec4"}]},r.contourShader={vertex:p,fragment:d,attributes:[{name:"position",type:"vec3"}]}},{glslify:377}],268:[function(t,e,r){"use strict";var n=t("gl-shader"),i=t("gl-buffer"),a=t("gl-vao"),o=t("gl-texture2d"),s=t("normals"),l=t("gl-mat4/multiply"),c=t("gl-mat4/invert"),u=t("ndarray"),h=t("colormap"),f=t("simplicial-complex-contour"),p=t("typedarray-pool"),d=t("./lib/shaders"),g=t("./lib/closest-point"),m=d.meshShader,v=d.wireShader,y=d.pointShader,x=d.pickShader,b=d.pointPickShader,_=d.contourShader,w=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function k(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,g,m,v,y,x,b,_,k,M,A,T,S){this.gl=t,this.cells=[],this.positions=[],this.intensity=[],this.texture=e,this.dirty=!0,this.triShader=r,this.lineShader=n,this.pointShader=i,this.pickShader=a,this.pointPickShader=o,this.contourShader=s,this.trianglePositions=l,this.triangleColors=u,this.triangleNormals=f,this.triangleUVs=h,this.triangleIds=c,this.triangleVAO=p,this.triangleCount=0,this.lineWidth=1,this.edgePositions=d,this.edgeColors=m,this.edgeUVs=v,this.edgeIds=g,this.edgeVAO=y,this.edgeCount=0,this.pointPositions=x,this.pointColors=_,this.pointUVs=k,this.pointSizes=M,this.pointIds=b,this.pointVAO=A,this.pointCount=0,this.contourLineWidth=1,this.contourPositions=T,this.contourVAO=S,this.contourCount=0,this.contourColor=[0,0,0],this.contourEnable=!0,this.pickId=1,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.lightPosition=[1e5,1e5,0],this.ambientLight=.8,this.diffuseLight=.8,this.specularLight=2,this.roughness=.5,this.fresnel=1.5,this.opacity=1,this._model=w,this._view=w,this._projection=w,this._resolution=[1,1]}var M=k.prototype;function A(t){var e=n(t,y.vertex,y.fragment);return e.attributes.position.location=0,e.attributes.color.location=2,e.attributes.uv.location=3,e.attributes.pointSize.location=4,e}function T(t){var e=n(t,x.vertex,x.fragment);return e.attributes.position.location=0,e.attributes.id.location=1,e}function S(t){var e=n(t,b.vertex,b.fragment);return e.attributes.position.location=0,e.attributes.id.location=1,e.attributes.pointSize.location=4,e}function E(t){var e=n(t,_.vertex,_.fragment);return e.attributes.position.location=0,e}M.isOpaque=function(){return this.opacity>=1},M.isTransparent=function(){return this.opacity<1},M.pickSlots=1,M.setPickBase=function(t){this.pickId=t},M.highlight=function(t){if(t&&this.contourEnable){for(var e=f(this.cells,this.intensity,t.intensity),r=e.cells,n=e.vertexIds,i=e.vertexWeights,a=r.length,o=p.mallocFloat32(6*a),s=0,l=0;l<a;++l)for(var c=r[l],u=0;u<2;++u){var h=c[0];2===c.length&&(h=c[u]);for(var d=n[h][0],g=n[h][1],m=i[h],v=1-m,y=this.positions[d],x=this.positions[g],b=0;b<3;++b)o[s++]=m*y[b]+v*x[b]}this.contourCount=s/3|0,this.contourPositions.update(o.subarray(0,s)),p.free(o)}else this.contourCount=0},M.update=function(t){t=t||{};var e=this.gl;this.dirty=!0,"contourEnable"in t&&(this.contourEnable=t.contourEnable),"contourColor"in t&&(this.contourColor=t.contourColor),"lineWidth"in t&&(this.lineWidth=t.lineWidth),"lightPosition"in t&&(this.lightPosition=t.lightPosition),"opacity"in t&&(this.opacity=t.opacity),"ambient"in t&&(this.ambientLight=t.ambient),"diffuse"in t&&(this.diffuseLight=t.diffuse),"specular"in t&&(this.specularLight=t.specular),"roughness"in t&&(this.roughness=t.roughness),"fresnel"in t&&(this.fresnel=t.fresnel),t.texture?(this.texture.dispose(),this.texture=o(e,t.texture)):t.colormap&&(this.texture.shape=[256,256],this.texture.minFilter=e.LINEAR_MIPMAP_LINEAR,this.texture.magFilter=e.LINEAR,this.texture.setPixels(function(t){for(var e=h({colormap:t,nshades:256,format:"rgba"}),r=new Uint8Array(1024),n=0;n<256;++n){for(var i=e[n],a=0;a<3;++a)r[4*n+a]=i[a];r[4*n+3]=255*i[3]}return u(r,[256,256,4],[4,0,1])}(t.colormap)),this.texture.generateMipmap());var r=t.cells,n=t.positions;if(n&&r){var i=[],a=[],l=[],c=[],f=[],p=[],d=[],g=[],m=[],v=[],y=[],x=[],b=[],_=[];this.cells=r,this.positions=n;var w=t.vertexNormals,k=t.cellNormals,M=void 0===t.vertexNormalsEpsilon?1e-6:t.vertexNormalsEpsilon,A=void 0===t.faceNormalsEpsilon?1e-6:t.faceNormalsEpsilon;t.useFacetNormals&&!k&&(k=s.faceNormals(r,n,A)),k||w||(w=s.vertexNormals(r,n,M));var T=t.vertexColors,S=t.cellColors,E=t.meshColor||[1,1,1,1],C=t.vertexUVs,L=t.vertexIntensity,z=t.cellUVs,P=t.cellIntensity,I=1/0,O=-1/0;if(!C&&!z)if(L)if(t.vertexIntensityBounds)I=+t.vertexIntensityBounds[0],O=+t.vertexIntensityBounds[1];else for(var D=0;D<L.length;++D){var R=L[D];I=Math.min(I,R),O=Math.max(O,R)}else if(P)for(D=0;D<P.length;++D){R=P[D];I=Math.min(I,R),O=Math.max(O,R)}else for(D=0;D<n.length;++D){R=n[D][2];I=Math.min(I,R),O=Math.max(O,R)}this.intensity=L||(P?function(t,e,r){for(var n=new Array(e),i=0;i<e;++i)n[i]=0;var a=t.length;for(i=0;i<a;++i)for(var o=t[i],s=0;s<o.length;++s)n[o[s]]=r[i];return n}(r,n.length,P):function(t){for(var e=t.length,r=new Array(e),n=0;n<e;++n)r[n]=t[n][2];return r}(n));var B=t.pointSizes,F=t.pointSize||1;this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]];for(D=0;D<n.length;++D)for(var N=n[D],j=0;j<3;++j)!isNaN(N[j])&&isFinite(N[j])&&(this.bounds[0][j]=Math.min(this.bounds[0][j],N[j]),this.bounds[1][j]=Math.max(this.bounds[1][j],N[j]));var V=0,U=0,q=0;t:for(D=0;D<r.length;++D){var H=r[D];switch(H.length){case 1:for(N=n[W=H[0]],j=0;j<3;++j)if(isNaN(N[j])||!isFinite(N[j]))continue t;v.push(N[0],N[1],N[2]),3===(Y=T?T[W]:S?S[D]:E).length?y.push(Y[0],Y[1],Y[2],1):y.push(Y[0],Y[1],Y[2],Y[3]),X=C?C[W]:L?[(L[W]-I)/(O-I),0]:z?z[D]:P?[(P[D]-I)/(O-I),0]:[(N[2]-I)/(O-I),0],x.push(X[0],X[1]),B?b.push(B[W]):b.push(F),_.push(D),q+=1;break;case 2:for(j=0;j<2;++j){N=n[W=H[j]];for(var G=0;G<3;++G)if(isNaN(N[G])||!isFinite(N[G]))continue t}for(j=0;j<2;++j){N=n[W=H[j]];p.push(N[0],N[1],N[2]),3===(Y=T?T[W]:S?S[D]:E).length?d.push(Y[0],Y[1],Y[2],1):d.push(Y[0],Y[1],Y[2],Y[3]),X=C?C[W]:L?[(L[W]-I)/(O-I),0]:z?z[D]:P?[(P[D]-I)/(O-I),0]:[(N[2]-I)/(O-I),0],g.push(X[0],X[1]),m.push(D)}U+=1;break;case 3:for(j=0;j<3;++j)for(N=n[W=H[j]],G=0;G<3;++G)if(isNaN(N[G])||!isFinite(N[G]))continue t;for(j=0;j<3;++j){var W,Y,X,Z;N=n[W=H[j]];i.push(N[0],N[1],N[2]),3===(Y=T?T[W]:S?S[D]:E).length?a.push(Y[0],Y[1],Y[2],1):a.push(Y[0],Y[1],Y[2],Y[3]),X=C?C[W]:L?[(L[W]-I)/(O-I),0]:z?z[D]:P?[(P[D]-I)/(O-I),0]:[(N[2]-I)/(O-I),0],c.push(X[0],X[1]),Z=w?w[W]:k[D],l.push(Z[0],Z[1],Z[2]),f.push(D)}V+=1}}this.pointCount=q,this.edgeCount=U,this.triangleCount=V,this.pointPositions.update(v),this.pointColors.update(y),this.pointUVs.update(x),this.pointSizes.update(b),this.pointIds.update(new Uint32Array(_)),this.edgePositions.update(p),this.edgeColors.update(d),this.edgeUVs.update(g),this.edgeIds.update(new Uint32Array(m)),this.trianglePositions.update(i),this.triangleColors.update(a),this.triangleUVs.update(c),this.triangleNormals.update(l),this.triangleIds.update(new Uint32Array(f))}},M.drawTransparent=M.draw=function(t){t=t||{};for(var e=this.gl,r=t.model||w,n=t.view||w,i=t.projection||w,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);var s={model:r,view:n,projection:i,clipBounds:a,kambient:this.ambientLight,kdiffuse:this.diffuseLight,kspecular:this.specularLight,roughness:this.roughness,fresnel:this.fresnel,eyePosition:[0,0,0],lightPosition:[0,0,0],opacity:this.opacity,contourColor:this.contourColor,texture:0};this.texture.bind(0);var u=new Array(16);l(u,s.view,s.model),l(u,s.projection,u),c(u,u);for(o=0;o<3;++o)s.eyePosition[o]=u[12+o]/u[15];var h,f=u[15];for(o=0;o<3;++o)f+=this.lightPosition[o]*u[4*o+3];for(o=0;o<3;++o){for(var p=u[12+o],d=0;d<3;++d)p+=u[4*d+o]*this.lightPosition[d];s.lightPosition[o]=p/f}this.triangleCount>0&&((h=this.triShader).bind(),h.uniforms=s,this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind());this.edgeCount>0&&this.lineWidth>0&&((h=this.lineShader).bind(),h.uniforms=s,this.edgeVAO.bind(),e.lineWidth(this.lineWidth),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind());this.pointCount>0&&((h=this.pointShader).bind(),h.uniforms=s,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind());this.contourEnable&&this.contourCount>0&&this.contourLineWidth>0&&((h=this.contourShader).bind(),h.uniforms=s,this.contourVAO.bind(),e.drawArrays(e.LINES,0,this.contourCount),this.contourVAO.unbind())},M.drawPick=function(t){t=t||{};for(var e=this.gl,r=t.model||w,n=t.view||w,i=t.projection||w,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);this._model=[].slice.call(r),this._view=[].slice.call(n),this._projection=[].slice.call(i),this._resolution=[e.drawingBufferWidth,e.drawingBufferHeight];var s,l={model:r,view:n,projection:i,clipBounds:a,pickId:this.pickId/255};((s=this.pickShader).bind(),s.uniforms=l,this.triangleCount>0&&(this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()),this.edgeCount>0&&(this.edgeVAO.bind(),e.lineWidth(this.lineWidth),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind()),this.pointCount>0)&&((s=this.pointPickShader).bind(),s.uniforms=l,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind())},M.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;for(var e=t.value[0]+256*t.value[1]+65536*t.value[2],r=this.cells[e],n=this.positions,i=new Array(r.length),a=0;a<r.length;++a)i[a]=n[r[a]];var o=g(i,[t.coord[0],this._resolution[1]-t.coord[1]],this._model,this._view,this._projection,this._resolution);if(!o)return null;var s=o[2],l=0;for(a=0;a<r.length;++a)l+=s[a]*this.intensity[r[a]];return{position:o[1],index:r[o[0]],cell:r,cellId:e,intensity:l,dataCoordinate:this.positions[r[o[0]]]}},M.dispose=function(){this.texture.dispose(),this.triShader.dispose(),this.lineShader.dispose(),this.pointShader.dispose(),this.pickShader.dispose(),this.pointPickShader.dispose(),this.triangleVAO.dispose(),this.trianglePositions.dispose(),this.triangleColors.dispose(),this.triangleUVs.dispose(),this.triangleNormals.dispose(),this.triangleIds.dispose(),this.edgeVAO.dispose(),this.edgePositions.dispose(),this.edgeColors.dispose(),this.edgeUVs.dispose(),this.edgeIds.dispose(),this.pointVAO.dispose(),this.pointPositions.dispose(),this.pointColors.dispose(),this.pointUVs.dispose(),this.pointSizes.dispose(),this.pointIds.dispose(),this.contourVAO.dispose(),this.contourPositions.dispose(),this.contourShader.dispose()},e.exports=function(t,e){if(1===arguments.length&&(t=(e=t).gl),!(t.getExtension("OES_standard_derivatives")||t.getExtension("MOZ_OES_standard_derivatives")||t.getExtension("WEBKIT_OES_standard_derivatives")))throw new Error("derivatives not supported");var r=function(t){var e=n(t,m.vertex,m.fragment);return e.attributes.position.location=0,e.attributes.color.location=2,e.attributes.uv.location=3,e.attributes.normal.location=4,e}(t),s=function(t){var e=n(t,v.vertex,v.fragment);return e.attributes.position.location=0,e.attributes.color.location=2,e.attributes.uv.location=3,e}(t),l=A(t),c=T(t),h=S(t),f=E(t),p=o(t,u(new Uint8Array([255,255,255,255]),[1,1,4]));p.generateMipmap(),p.minFilter=t.LINEAR_MIPMAP_LINEAR,p.magFilter=t.LINEAR;var d=i(t),g=i(t),y=i(t),x=i(t),b=i(t),_=a(t,[{buffer:d,type:t.FLOAT,size:3},{buffer:b,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:g,type:t.FLOAT,size:4},{buffer:y,type:t.FLOAT,size:2},{buffer:x,type:t.FLOAT,size:3}]),w=i(t),M=i(t),C=i(t),L=i(t),z=a(t,[{buffer:w,type:t.FLOAT,size:3},{buffer:L,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:M,type:t.FLOAT,size:4},{buffer:C,type:t.FLOAT,size:2}]),P=i(t),I=i(t),O=i(t),D=i(t),R=i(t),B=a(t,[{buffer:P,type:t.FLOAT,size:3},{buffer:R,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:I,type:t.FLOAT,size:4},{buffer:O,type:t.FLOAT,size:2},{buffer:D,type:t.FLOAT,size:1}]),F=i(t),N=new k(t,p,r,s,l,c,h,f,d,b,g,y,x,_,w,L,M,C,z,P,R,I,O,D,B,F,a(t,[{buffer:F,type:t.FLOAT,size:3}]));return N.update(e),N}},{"./lib/closest-point":266,"./lib/shaders":267,colormap:113,"gl-buffer":230,"gl-mat4/invert":254,"gl-mat4/multiply":256,"gl-shader":287,"gl-texture2d":303,"gl-vao":308,ndarray:417,normals:420,"simplicial-complex-contour":479,"typedarray-pool":507}],269:[function(t,e,r){"use strict";e.exports=function(t){var e=t.gl,r=n(e,[0,0,0,1,1,0,1,1]),s=i(e,a.boxVert,a.lineFrag);return new o(t,r,s)};var n=t("gl-buffer"),i=t("gl-shader"),a=t("./shaders");function o(t,e,r){this.plot=t,this.vbo=e,this.shader=r}var s,l,c=o.prototype;c.bind=function(){var t=this.shader;this.vbo.bind(),this.shader.bind(),t.attributes.coord.pointer(),t.uniforms.screenBox=this.plot.screenBox},c.drawBox=(s=[0,0],l=[0,0],function(t,e,r,n,i){var a=this.plot,o=this.shader,c=a.gl;s[0]=t,s[1]=e,l[0]=r,l[1]=n,o.uniforms.lo=s,o.uniforms.hi=l,o.uniforms.color=i,c.drawArrays(c.TRIANGLE_STRIP,0,4)}),c.dispose=function(){this.vbo.dispose(),this.shader.dispose()}},{"./shaders":272,"gl-buffer":230,"gl-shader":287}],270:[function(t,e,r){"use strict";e.exports=function(t){var e=t.gl,r=n(e),a=i(e,o.gridVert,o.gridFrag),l=i(e,o.tickVert,o.gridFrag);return new s(t,r,a,l)};var n=t("gl-buffer"),i=t("gl-shader"),a=t("binary-search-bounds"),o=t("./shaders");function s(t,e,r,n){this.plot=t,this.vbo=e,this.shader=r,this.tickShader=n,this.ticks=[[],[]]}function l(t,e){return t-e}var c,u,h,f,p,d=s.prototype;d.draw=(c=[0,0],u=[0,0],h=[0,0],function(){for(var t=this.plot,e=this.vbo,r=this.shader,n=this.ticks,i=t.gl,a=t._tickBounds,o=t.dataBox,s=t.viewBox,l=t.gridLineWidth,f=t.gridLineColor,p=t.gridLineEnable,d=t.pixelRatio,g=0;g<2;++g){var m=a[g],v=a[g+2]-m,y=.5*(o[g+2]+o[g]),x=o[g+2]-o[g];u[g]=2*v/x,c[g]=2*(m-y)/x}r.bind(),e.bind(),r.attributes.dataCoord.pointer(),r.uniforms.dataShift=c,r.uniforms.dataScale=u;var b=0;for(g=0;g<2;++g){h[0]=h[1]=0,h[g]=1,r.uniforms.dataAxis=h,r.uniforms.lineWidth=l[g]/(s[g+2]-s[g])*d,r.uniforms.color=f[g];var _=6*n[g].length;p[g]&&_&&i.drawArrays(i.TRIANGLES,b,_),b+=_}}),d.drawTickMarks=function(){var t=[0,0],e=[0,0],r=[1,0],n=[0,1],i=[0,0],o=[0,0];return function(){for(var s=this.plot,c=this.vbo,u=this.tickShader,h=this.ticks,f=s.gl,p=s._tickBounds,d=s.dataBox,g=s.viewBox,m=s.pixelRatio,v=s.screenBox,y=v[2]-v[0],x=v[3]-v[1],b=g[2]-g[0],_=g[3]-g[1],w=0;w<2;++w){var k=p[w],M=p[w+2]-k,A=.5*(d[w+2]+d[w]),T=d[w+2]-d[w];e[w]=2*M/T,t[w]=2*(k-A)/T}e[0]*=b/y,t[0]*=b/y,e[1]*=_/x,t[1]*=_/x,u.bind(),c.bind(),u.attributes.dataCoord.pointer();var S=u.uniforms;S.dataShift=t,S.dataScale=e;var E=s.tickMarkLength,C=s.tickMarkWidth,L=s.tickMarkColor,z=6*h[0].length,P=Math.min(a.ge(h[0],(d[0]-p[0])/(p[2]-p[0]),l),h[0].length),I=Math.min(a.gt(h[0],(d[2]-p[0])/(p[2]-p[0]),l),h[0].length),O=0+6*P,D=6*Math.max(0,I-P),R=Math.min(a.ge(h[1],(d[1]-p[1])/(p[3]-p[1]),l),h[1].length),B=Math.min(a.gt(h[1],(d[3]-p[1])/(p[3]-p[1]),l),h[1].length),F=z+6*R,N=6*Math.max(0,B-R);i[0]=2*(g[0]-E[1])/y-1,i[1]=(g[3]+g[1])/x-1,o[0]=E[1]*m/y,o[1]=C[1]*m/x,N&&(S.color=L[1],S.tickScale=o,S.dataAxis=n,S.screenOffset=i,f.drawArrays(f.TRIANGLES,F,N)),i[0]=(g[2]+g[0])/y-1,i[1]=2*(g[1]-E[0])/x-1,o[0]=C[0]*m/y,o[1]=E[0]*m/x,D&&(S.color=L[0],S.tickScale=o,S.dataAxis=r,S.screenOffset=i,f.drawArrays(f.TRIANGLES,O,D)),i[0]=2*(g[2]+E[3])/y-1,i[1]=(g[3]+g[1])/x-1,o[0]=E[3]*m/y,o[1]=C[3]*m/x,N&&(S.color=L[3],S.tickScale=o,S.dataAxis=n,S.screenOffset=i,f.drawArrays(f.TRIANGLES,F,N)),i[0]=(g[2]+g[0])/y-1,i[1]=2*(g[3]+E[2])/x-1,o[0]=C[2]*m/y,o[1]=E[2]*m/x,D&&(S.color=L[2],S.tickScale=o,S.dataAxis=r,S.screenOffset=i,f.drawArrays(f.TRIANGLES,O,D))}}(),d.update=(f=[1,1,-1,-1,1,-1],p=[1,-1,1,1,-1,-1],function(t){for(var e=t.ticks,r=t.bounds,n=new Float32Array(18*(e[0].length+e[1].length)),i=(this.plot.zeroLineEnable,0),a=[[],[]],o=0;o<2;++o)for(var s=a[o],l=e[o],c=r[o],u=r[o+2],h=0;h<l.length;++h){var d=(l[h].x-c)/(u-c);s.push(d);for(var g=0;g<6;++g)n[i++]=d,n[i++]=f[g],n[i++]=p[g]}this.ticks=a,this.vbo.update(n)}),d.dispose=function(){this.vbo.dispose(),this.shader.dispose(),this.tickShader.dispose()}},{"./shaders":272,"binary-search-bounds":274,"gl-buffer":230,"gl-shader":287}],271:[function(t,e,r){"use strict";e.exports=function(t){var e=t.gl,r=n(e,[-1,-1,-1,1,1,-1,1,1]),s=i(e,a.lineVert,a.lineFrag);return new o(t,r,s)};var n=t("gl-buffer"),i=t("gl-shader"),a=t("./shaders");function o(t,e,r){this.plot=t,this.vbo=e,this.shader=r}var s,l,c=o.prototype;c.bind=function(){var t=this.shader;this.vbo.bind(),this.shader.bind(),t.attributes.coord.pointer(),t.uniforms.screenBox=this.plot.screenBox},c.drawLine=(s=[0,0],l=[0,0],function(t,e,r,n,i,a){var o=this.plot,c=this.shader,u=o.gl;s[0]=t,s[1]=e,l[0]=r,l[1]=n,c.uniforms.start=s,c.uniforms.end=l,c.uniforms.width=i*o.pixelRatio,c.uniforms.color=a,u.drawArrays(u.TRIANGLE_STRIP,0,4)}),c.dispose=function(){this.vbo.dispose(),this.shader.dispose()}},{"./shaders":272,"gl-buffer":230,"gl-shader":287}],272:[function(t,e,r){"use strict";var n=t("glslify"),i=n(["precision lowp float;\n#define GLSLIFY 1\nuniform vec4 color;\nvoid main() {\n  gl_FragColor = vec4(color.xyz * color.w, color.w);\n}\n"]);e.exports={lineVert:n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec2 coord;\n\nuniform vec4 screenBox;\nuniform vec2 start, end;\nuniform float width;\n\nvec2 perp(vec2 v) {\n  return vec2(v.y, -v.x);\n}\n\nvec2 screen(vec2 v) {\n  return 2.0 * (v - screenBox.xy) / (screenBox.zw - screenBox.xy) - 1.0;\n}\n\nvoid main() {\n  vec2 delta = normalize(perp(start - end));\n  vec2 offset = mix(start, end, 0.5 * (coord.y+1.0));\n  gl_Position = vec4(screen(offset + 0.5 * width * delta * coord.x), 0, 1);\n}\n"]),lineFrag:i,textVert:n(["#define GLSLIFY 1\nattribute vec3 textCoordinate;\n\nuniform vec2 dataScale, dataShift, dataAxis, screenOffset, textScale;\nuniform float angle;\n\nvoid main() {\n  float dataOffset  = textCoordinate.z;\n  vec2 glyphOffset  = textCoordinate.xy;\n  mat2 glyphMatrix = mat2(cos(angle), sin(angle), -sin(angle), cos(angle));\n  vec2 screenCoordinate = dataAxis * (dataScale * dataOffset + dataShift) +\n    glyphMatrix * glyphOffset * textScale + screenOffset;\n  gl_Position = vec4(screenCoordinate, 0, 1);\n}\n"]),textFrag:i,gridVert:n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 dataCoord;\n\nuniform vec2 dataAxis, dataShift, dataScale;\nuniform float lineWidth;\n\nvoid main() {\n  vec2 pos = dataAxis * (dataScale * dataCoord.x + dataShift);\n  pos += 10.0 * dataCoord.y * vec2(dataAxis.y, -dataAxis.x) + dataCoord.z * lineWidth;\n  gl_Position = vec4(pos, 0, 1);\n}\n"]),gridFrag:i,boxVert:n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec2 coord;\n\nuniform vec4 screenBox;\nuniform vec2 lo, hi;\n\nvec2 screen(vec2 v) {\n  return 2.0 * (v - screenBox.xy) / (screenBox.zw - screenBox.xy) - 1.0;\n}\n\nvoid main() {\n  gl_Position = vec4(screen(mix(lo, hi, coord)), 0, 1);\n}\n"]),tickVert:n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 dataCoord;\n\nuniform vec2 dataAxis, dataShift, dataScale, screenOffset, tickScale;\n\nvoid main() {\n  vec2 pos = dataAxis * (dataScale * dataCoord.x + dataShift);\n  gl_Position = vec4(pos + tickScale*dataCoord.yz + screenOffset, 0, 1);\n}\n"])}},{glslify:377}],273:[function(t,e,r){"use strict";e.exports=function(t){var e=t.gl,r=n(e),a=i(e,s.textVert,s.textFrag);return new l(t,r,a)};var n=t("gl-buffer"),i=t("gl-shader"),a=t("text-cache"),o=t("binary-search-bounds"),s=t("./shaders");function l(t,e,r){this.plot=t,this.vbo=e,this.shader=r,this.tickOffset=[[],[]],this.tickX=[[],[]],this.labelOffset=[0,0],this.labelCount=[0,0]}var c,u,h,f,p,d,g=l.prototype;g.drawTicks=(c=[0,0],u=[0,0],h=[0,0],function(t){var e=this.plot,r=this.shader,n=this.tickX[t],i=this.tickOffset[t],a=e.gl,s=e.viewBox,l=e.dataBox,f=e.screenBox,p=e.pixelRatio,d=e.tickEnable,g=e.tickPad,m=e.tickColor,v=e.tickAngle,y=e.labelEnable,x=e.labelPad,b=e.labelColor,_=e.labelAngle,w=this.labelOffset[t],k=this.labelCount[t],M=o.lt(n,l[t]),A=o.le(n,l[t+2]);c[0]=c[1]=0,c[t]=1,u[t]=(s[2+t]+s[t])/(f[2+t]-f[t])-1;var T=2/f[2+(1^t)]-f[1^t];u[1^t]=T*s[1^t]-1,d[t]&&(u[1^t]-=T*p*g[t],M<A&&i[A]>i[M]&&(r.uniforms.dataAxis=c,r.uniforms.screenOffset=u,r.uniforms.color=m[t],r.uniforms.angle=v[t],a.drawArrays(a.TRIANGLES,i[M],i[A]-i[M]))),y[t]&&k&&(u[1^t]-=T*p*x[t],r.uniforms.dataAxis=h,r.uniforms.screenOffset=u,r.uniforms.color=b[t],r.uniforms.angle=_[t],a.drawArrays(a.TRIANGLES,w,k)),u[1^t]=T*s[2+(1^t)]-1,d[t+2]&&(u[1^t]+=T*p*g[t+2],M<A&&i[A]>i[M]&&(r.uniforms.dataAxis=c,r.uniforms.screenOffset=u,r.uniforms.color=m[t+2],r.uniforms.angle=v[t+2],a.drawArrays(a.TRIANGLES,i[M],i[A]-i[M]))),y[t+2]&&k&&(u[1^t]+=T*p*x[t+2],r.uniforms.dataAxis=h,r.uniforms.screenOffset=u,r.uniforms.color=b[t+2],r.uniforms.angle=_[t+2],a.drawArrays(a.TRIANGLES,w,k))}),g.drawTitle=function(){var t=[0,0],e=[0,0];return function(){var r=this.plot,n=this.shader,i=r.gl,a=r.screenBox,o=r.titleCenter,s=r.titleAngle,l=r.titleColor,c=r.pixelRatio;if(this.titleCount){for(var u=0;u<2;++u)e[u]=2*(o[u]*c-a[u])/(a[2+u]-a[u])-1;n.bind(),n.uniforms.dataAxis=t,n.uniforms.screenOffset=e,n.uniforms.angle=s,n.uniforms.color=l,i.drawArrays(i.TRIANGLES,this.titleOffset,this.titleCount)}}}(),g.bind=(f=[0,0],p=[0,0],d=[0,0],function(){var t=this.plot,e=this.shader,r=t._tickBounds,n=t.dataBox,i=t.screenBox,a=t.viewBox;e.bind();for(var o=0;o<2;++o){var s=r[o],l=r[o+2]-s,c=.5*(n[o+2]+n[o]),u=n[o+2]-n[o],h=a[o],g=a[o+2]-h,m=i[o],v=i[o+2]-m;p[o]=2*l/u*g/v,f[o]=2*(s-c)/u*g/v}d[1]=2*t.pixelRatio/(i[3]-i[1]),d[0]=d[1]*(i[3]-i[1])/(i[2]-i[0]),e.uniforms.dataScale=p,e.uniforms.dataShift=f,e.uniforms.textScale=d,this.vbo.bind(),e.attributes.textCoordinate.pointer()}),g.update=function(t){var e,r,n,i,o,s=[],l=t.ticks,c=t.bounds;for(o=0;o<2;++o){var u=[Math.floor(s.length/3)],h=[-1/0],f=l[o];for(e=0;e<f.length;++e){var p=f[e],d=p.x,g=p.text,m=p.font||"sans-serif";i=p.fontSize||12;for(var v=1/(c[o+2]-c[o]),y=c[o],x=g.split("\n"),b=0;b<x.length;b++)for(n=a(m,x[b]).data,r=0;r<n.length;r+=2)s.push(n[r]*i,-n[r+1]*i-b*i*1.2,(d-y)*v);u.push(Math.floor(s.length/3)),h.push(d)}this.tickOffset[o]=u,this.tickX[o]=h}for(o=0;o<2;++o){for(this.labelOffset[o]=Math.floor(s.length/3),n=a(t.labelFont[o],t.labels[o],{textAlign:"center"}).data,i=t.labelSize[o],e=0;e<n.length;e+=2)s.push(n[e]*i,-n[e+1]*i,0);this.labelCount[o]=Math.floor(s.length/3)-this.labelOffset[o]}for(this.titleOffset=Math.floor(s.length/3),n=a(t.titleFont,t.title).data,i=t.titleSize,e=0;e<n.length;e+=2)s.push(n[e]*i,-n[e+1]*i,0);this.titleCount=Math.floor(s.length/3)-this.titleOffset,this.vbo.update(s)},g.dispose=function(){this.vbo.dispose(),this.shader.dispose()}},{"./shaders":272,"binary-search-bounds":274,"gl-buffer":230,"gl-shader":287,"text-cache":498}],274:[function(t,e,r){arguments[4][98][0].apply(r,arguments)},{dup:98}],275:[function(t,e,r){"use strict";e.exports=function(t){var e=t.gl,r=n(e,[e.drawingBufferWidth,e.drawingBufferHeight]),c=new l(e,r);return c.grid=i(c),c.text=a(c),c.line=o(c),c.box=s(c),c.update(t),c};var n=t("gl-select-static"),i=t("./lib/grid"),a=t("./lib/text"),o=t("./lib/line"),s=t("./lib/box");function l(t,e){this.gl=t,this.pickBuffer=e,this.screenBox=[0,0,t.drawingBufferWidth,t.drawingBufferHeight],this.viewBox=[0,0,0,0],this.dataBox=[-10,-10,10,10],this.gridLineEnable=[!0,!0],this.gridLineWidth=[1,1],this.gridLineColor=[[0,0,0,1],[0,0,0,1]],this.pixelRatio=1,this.tickMarkLength=[0,0,0,0],this.tickMarkWidth=[0,0,0,0],this.tickMarkColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.tickPad=[15,15,15,15],this.tickAngle=[0,0,0,0],this.tickEnable=[!0,!0,!0,!0],this.tickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.labelPad=[15,15,15,15],this.labelAngle=[0,Math.PI/2,0,3*Math.PI/2],this.labelEnable=[!0,!0,!0,!0],this.labelColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.titleCenter=[0,0],this.titleEnable=!0,this.titleAngle=0,this.titleColor=[0,0,0,1],this.borderColor=[0,0,0,0],this.backgroundColor=[0,0,0,0],this.zeroLineEnable=[!0,!0],this.zeroLineWidth=[4,4],this.zeroLineColor=[[0,0,0,1],[0,0,0,1]],this.borderLineEnable=[!0,!0,!0,!0],this.borderLineWidth=[2,2,2,2],this.borderLineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.grid=null,this.text=null,this.line=null,this.box=null,this.objects=[],this.overlays=[],this._tickBounds=[1/0,1/0,-1/0,-1/0],this.static=!1,this.dirty=!1,this.pickDirty=!1,this.pickDelay=120,this.pickRadius=10,this._pickTimeout=null,this._drawPick=this.drawPick.bind(this),this._depthCounter=0}var c=l.prototype;function u(t){for(var e=t.slice(),r=0;r<e.length;++r)e[r]=e[r].slice();return e}function h(t,e){return t.x-e.x}c.setDirty=function(){this.dirty=this.pickDirty=!0},c.setOverlayDirty=function(){this.dirty=!0},c.nextDepthValue=function(){return this._depthCounter++/65536},c.draw=function(){var t=this.gl,e=this.screenBox,r=this.viewBox,n=this.dataBox,i=this.pixelRatio,a=this.grid,o=this.line,s=this.text,l=this.objects;if(this._depthCounter=0,this.pickDirty&&(this._pickTimeout&&clearTimeout(this._pickTimeout),this.pickDirty=!1,this._pickTimeout=setTimeout(this._drawPick,this.pickDelay)),this.dirty){if(this.dirty=!1,t.bindFramebuffer(t.FRAMEBUFFER,null),t.enable(t.SCISSOR_TEST),t.disable(t.DEPTH_TEST),t.depthFunc(t.LESS),t.depthMask(!1),t.enable(t.BLEND),t.blendEquation(t.FUNC_ADD,t.FUNC_ADD),t.blendFunc(t.ONE,t.ONE_MINUS_SRC_ALPHA),this.borderColor){t.scissor(e[0],e[1],e[2]-e[0],e[3]-e[1]);var c=this.borderColor;t.clearColor(c[0]*c[3],c[1]*c[3],c[2]*c[3],c[3]),t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT)}t.scissor(r[0],r[1],r[2]-r[0],r[3]-r[1]),t.viewport(r[0],r[1],r[2]-r[0],r[3]-r[1]);var u=this.backgroundColor;t.clearColor(u[0]*u[3],u[1]*u[3],u[2]*u[3],u[3]),t.clear(t.COLOR_BUFFER_BIT),a.draw();var h=this.zeroLineEnable,f=this.zeroLineColor,p=this.zeroLineWidth;if(h[0]||h[1]){o.bind();for(var d=0;d<2;++d)if(h[d]&&n[d]<=0&&n[d+2]>=0){var g=e[d]-n[d]*(e[d+2]-e[d])/(n[d+2]-n[d]);0===d?o.drawLine(g,e[1],g,e[3],p[d],f[d]):o.drawLine(e[0],g,e[2],g,p[d],f[d])}}for(d=0;d<l.length;++d)l[d].draw();t.viewport(e[0],e[1],e[2]-e[0],e[3]-e[1]),t.scissor(e[0],e[1],e[2]-e[0],e[3]-e[1]),this.grid.drawTickMarks(),o.bind();var m=this.borderLineEnable,v=this.borderLineWidth,y=this.borderLineColor;for(m[1]&&o.drawLine(r[0],r[1]-.5*v[1]*i,r[0],r[3]+.5*v[3]*i,v[1],y[1]),m[0]&&o.drawLine(r[0]-.5*v[0]*i,r[1],r[2]+.5*v[2]*i,r[1],v[0],y[0]),m[3]&&o.drawLine(r[2],r[1]-.5*v[1]*i,r[2],r[3]+.5*v[3]*i,v[3],y[3]),m[2]&&o.drawLine(r[0]-.5*v[0]*i,r[3],r[2]+.5*v[2]*i,r[3],v[2],y[2]),s.bind(),d=0;d<2;++d)s.drawTicks(d);this.titleEnable&&s.drawTitle();var x=this.overlays;for(d=0;d<x.length;++d)x[d].draw();t.disable(t.SCISSOR_TEST),t.disable(t.BLEND),t.depthMask(!0)}},c.drawPick=function(){if(!this.static){var t=this.pickBuffer;this.gl;this._pickTimeout=null,t.begin();for(var e=1,r=this.objects,n=0;n<r.length;++n)e=r[n].drawPick(e);t.end()}},c.pick=function(t,e){if(!this.static){var r=this.pixelRatio,n=this.pickPixelRatio,i=this.viewBox,a=0|Math.round((t-i[0]/r)*n),o=0|Math.round((e-i[1]/r)*n),s=this.pickBuffer.query(a,o,this.pickRadius);if(!s)return null;for(var l=s.id+(s.value[0]<<8)+(s.value[1]<<16)+(s.value[2]<<24),c=this.objects,u=0;u<c.length;++u){var h=c[u].pick(a,o,l);if(h)return h}return null}},c.setScreenBox=function(t){var e=this.screenBox,r=this.pixelRatio;e[0]=0|Math.round(t[0]*r),e[1]=0|Math.round(t[1]*r),e[2]=0|Math.round(t[2]*r),e[3]=0|Math.round(t[3]*r),this.setDirty()},c.setDataBox=function(t){var e=this.dataBox;(e[0]!==t[0]||e[1]!==t[1]||e[2]!==t[2]||e[3]!==t[3])&&(e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],this.setDirty())},c.setViewBox=function(t){var e=this.pixelRatio,r=this.viewBox;r[0]=0|Math.round(t[0]*e),r[1]=0|Math.round(t[1]*e),r[2]=0|Math.round(t[2]*e),r[3]=0|Math.round(t[3]*e);var n=this.pickPixelRatio;this.pickBuffer.shape=[0|Math.round((t[2]-t[0])*n),0|Math.round((t[3]-t[1])*n)],this.setDirty()},c.update=function(t){t=t||{};var e=this.gl;this.pixelRatio=t.pixelRatio||1;var r=this.pixelRatio;this.pickPixelRatio=Math.max(r,1),this.setScreenBox(t.screenBox||[0,0,e.drawingBufferWidth/r,e.drawingBufferHeight/r]);this.screenBox;this.setViewBox(t.viewBox||[.125*(this.screenBox[2]-this.screenBox[0])/r,.125*(this.screenBox[3]-this.screenBox[1])/r,.875*(this.screenBox[2]-this.screenBox[0])/r,.875*(this.screenBox[3]-this.screenBox[1])/r]);var n=this.viewBox,i=(n[2]-n[0])/(n[3]-n[1]);this.setDataBox(t.dataBox||[-10,-10/i,10,10/i]),this.borderColor=!1!==t.borderColor&&(t.borderColor||[0,0,0,0]).slice(),this.backgroundColor=(t.backgroundColor||[0,0,0,0]).slice(),this.gridLineEnable=(t.gridLineEnable||[!0,!0]).slice(),this.gridLineWidth=(t.gridLineWidth||[1,1]).slice(),this.gridLineColor=u(t.gridLineColor||[[.5,.5,.5,1],[.5,.5,.5,1]]),this.zeroLineEnable=(t.zeroLineEnable||[!0,!0]).slice(),this.zeroLineWidth=(t.zeroLineWidth||[4,4]).slice(),this.zeroLineColor=u(t.zeroLineColor||[[0,0,0,1],[0,0,0,1]]),this.tickMarkLength=(t.tickMarkLength||[0,0,0,0]).slice(),this.tickMarkWidth=(t.tickMarkWidth||[0,0,0,0]).slice(),this.tickMarkColor=u(t.tickMarkColor||[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]]),this.titleCenter=(t.titleCenter||[.5*(n[0]+n[2])/r,(n[3]+120)/r]).slice(),this.titleEnable=!("titleEnable"in t&&!t.titleEnable),this.titleAngle=t.titleAngle||0,this.titleColor=(t.titleColor||[0,0,0,1]).slice(),this.labelPad=(t.labelPad||[15,15,15,15]).slice(),this.labelAngle=(t.labelAngle||[0,Math.PI/2,0,3*Math.PI/2]).slice(),this.labelEnable=(t.labelEnable||[!0,!0,!0,!0]).slice(),this.labelColor=u(t.labelColor||[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]]),this.tickPad=(t.tickPad||[15,15,15,15]).slice(),this.tickAngle=(t.tickAngle||[0,0,0,0]).slice(),this.tickEnable=(t.tickEnable||[!0,!0,!0,!0]).slice(),this.tickColor=u(t.tickColor||[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]]),this.borderLineEnable=(t.borderLineEnable||[!0,!0,!0,!0]).slice(),this.borderLineWidth=(t.borderLineWidth||[2,2,2,2]).slice(),this.borderLineColor=u(t.borderLineColor||[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]]);var a=t.ticks||[[],[]],o=this._tickBounds;o[0]=o[1]=1/0,o[2]=o[3]=-1/0;for(var s=0;s<2;++s){var l=a[s].slice(0);0!==l.length&&(l.sort(h),o[s]=Math.min(o[s],l[0].x),o[s+2]=Math.max(o[s+2],l[l.length-1].x))}this.grid.update({bounds:o,ticks:a}),this.text.update({bounds:o,ticks:a,labels:t.labels||["x","y"],labelSize:t.labelSize||[12,12],labelFont:t.labelFont||["sans-serif","sans-serif"],title:t.title||"",titleSize:t.titleSize||18,titleFont:t.titleFont||"sans-serif"}),this.static=!!t.static,this.setDirty()},c.dispose=function(){this.box.dispose(),this.grid.dispose(),this.text.dispose(),this.line.dispose();for(var t=this.objects.length-1;t>=0;--t)this.objects[t].dispose();this.objects.length=0;for(t=this.overlays.length-1;t>=0;--t)this.overlays[t].dispose();this.overlays.length=0,this.gl=null},c.addObject=function(t){this.objects.indexOf(t)<0&&(this.objects.push(t),this.setDirty())},c.removeObject=function(t){for(var e=this.objects,r=0;r<e.length;++r)if(e[r]===t){e.splice(r,1),this.setDirty();break}},c.addOverlay=function(t){this.overlays.indexOf(t)<0&&(this.overlays.push(t),this.setOverlayDirty())},c.removeOverlay=function(t){for(var e=this.overlays,r=0;r<e.length;++r)if(e[r]===t){e.splice(r,1),this.setOverlayDirty();break}}},{"./lib/box":269,"./lib/grid":270,"./lib/line":271,"./lib/text":273,"gl-select-static":286}],276:[function(t,e,r){var n=t("glslify"),i=t("gl-shader"),a=n(["precision mediump float;\n#define GLSLIFY 1\nattribute vec2 position;\nvarying vec2 uv;\nvoid main() {\n  uv = position;\n  gl_Position = vec4(position, 0, 1);\n}"]),o=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform sampler2D accumBuffer;\nvarying vec2 uv;\n\nvoid main() {\n  vec4 accum = texture2D(accumBuffer, 0.5 * (uv + 1.0));\n  gl_FragColor = min(vec4(1,1,1,1), accum);\n}"]);e.exports=function(t){return i(t,a,o,null,[{name:"position",type:"vec2"}])}},{"gl-shader":287,glslify:377}],277:[function(t,e,r){"use strict";e.exports=function(t){var e=!1,r=((t=t||{}).pixelRatio||parseFloat(window.devicePixelRatio),t.canvas);if(!r)if(r=document.createElement("canvas"),t.container){var v=t.container;v.appendChild(r)}else document.body.appendChild(r);var y=t.gl;y||(y=function(t,e){var r=null;try{(r=t.getContext("webgl",e))||(r=t.getContext("experimental-webgl",e))}catch(t){return null}return r}(r,t.glOptions||{premultipliedAlpha:!0,antialias:!0}));if(!y)throw new Error("webgl not supported");var x=t.bounds||[[-10,-10,-10],[10,10,10]],b=new d,_=l(y,[y.drawingBufferWidth,y.drawingBufferHeight],{preferFloat:!p}),w=f(y),k=t.camera||{eye:[2,0,0],center:[0,0,0],up:[0,1,0],zoomMin:.1,zoomMax:100,mode:"turntable"},M=t.axes||{},A=i(y,M);A.enable=!M.disable;var T=t.spikes||{},S=o(y,T),E=[],C=[],L=[],z=[],P=!0,I=!0,O=new Array(16),D=new Array(16),R={view:null,projection:O,model:D},I=!0,B=[y.drawingBufferWidth,y.drawingBufferHeight],F={gl:y,contextLost:!1,pixelRatio:t.pixelRatio||parseFloat(window.devicePixelRatio),canvas:r,selection:b,camera:n(r,k),axes:A,axesPixels:null,spikes:S,bounds:x,objects:E,shape:B,aspect:t.aspectRatio||[1,1,1],pickRadius:t.pickRadius||10,zNear:t.zNear||.01,zFar:t.zFar||1e3,fovy:t.fovy||Math.PI/4,clearColor:t.clearColor||[0,0,0,0],autoResize:m(t.autoResize),autoBounds:m(t.autoBounds),autoScale:!!t.autoScale,autoCenter:m(t.autoCenter),clipToBounds:m(t.clipToBounds),snapToData:!!t.snapToData,onselect:t.onselect||null,onrender:t.onrender||null,onclick:t.onclick||null,cameraParams:R,oncontextloss:null,mouseListener:null},N=[y.drawingBufferWidth/F.pixelRatio|0,y.drawingBufferHeight/F.pixelRatio|0];function j(){if(!e&&F.autoResize){var t=r.parentNode,n=1,i=1;t&&t!==document.body?(n=t.clientWidth,i=t.clientHeight):(n=window.innerWidth,i=window.innerHeight);var a=0|Math.ceil(n*F.pixelRatio),o=0|Math.ceil(i*F.pixelRatio);if(a!==r.width||o!==r.height){r.width=a,r.height=o;var s=r.style;s.position=s.position||"absolute",s.left="0px",s.top="0px",s.width=n+"px",s.height=i+"px",P=!0}}}F.autoResize&&j();function V(){for(var t=E.length,e=z.length,r=0;r<e;++r)L[r]=0;t:for(var r=0;r<t;++r){var n=E[r],i=n.pickSlots;if(i){for(var a=0;a<e;++a)if(L[a]+i<255){C[r]=a,n.setPickBase(L[a]+1),L[a]+=i;continue t}var o=s(y,B);C[r]=e,z.push(o),L.push(i),n.setPickBase(1),e+=1}else C[r]=-1}for(;e>0&&0===L[e-1];)L.pop(),z.pop().dispose()}window.addEventListener("resize",j),F.update=function(t){e||(t=t||{},P=!0,I=!0)},F.add=function(t){e||(t.axes=A,E.push(t),C.push(-1),P=!0,I=!0,V())},F.remove=function(t){if(!e){var r=E.indexOf(t);r<0||(E.splice(r,1),C.pop(),P=!0,I=!0,V())}},F.dispose=function(){if(!e&&(e=!0,window.removeEventListener("resize",j),r.removeEventListener("webglcontextlost",H),F.mouseListener.enabled=!1,!F.contextLost)){A.dispose(),S.dispose();for(var t=0;t<E.length;++t)E[t].dispose();_.dispose();for(var t=0;t<z.length;++t)z[t].dispose();w.dispose(),y=null,A=null,S=null,E=[]}};var U=!1,q=0;function H(){if(F.contextLost)return!0;y.isContextLost()&&(F.contextLost=!0,F.mouseListener.enabled=!1,F.selection.object=null,F.oncontextloss&&F.oncontextloss())}F.mouseListener=u(r,function(t,r,n){if(!e){var i=z.length,a=E.length,o=b.object;b.distance=1/0,b.mouse[0]=r,b.mouse[1]=n,b.object=null,b.screen=null,b.dataCoordinate=b.dataPosition=null;var s=!1;if(t&&q)U=!0;else{U&&(I=!0),U=!1;for(var l=0;l<i;++l){var c=z[l].query(r,N[1]-n-1,F.pickRadius);if(c){if(c.distance>b.distance)continue;for(var u=0;u<a;++u){var h=E[u];if(C[u]===l){var f=h.pick(c);f&&(b.buttons=t,b.screen=c.coord,b.distance=c.distance,b.object=h,b.index=f.distance,b.dataPosition=f.position,b.dataCoordinate=f.dataCoordinate,b.data=f,s=!0)}}}}}o&&o!==b.object&&(o.highlight&&o.highlight(null),P=!0),b.object&&(b.object.highlight&&b.object.highlight(b.data),P=!0),(s=s||b.object!==o)&&F.onselect&&F.onselect(b),1&t&&!(1&q)&&F.onclick&&F.onclick(b),q=t}}),r.addEventListener("webglcontextlost",H);var G=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],W=[G[0].slice(),G[1].slice()];function Y(){if(!H()){j();var t=F.camera.tick();R.view=F.camera.matrix,P=P||t,I=I||t,A.pixelRatio=F.pixelRatio,S.pixelRatio=F.pixelRatio;var e=E.length,r=G[0],n=G[1];r[0]=r[1]=r[2]=1/0,n[0]=n[1]=n[2]=-1/0;for(var i=0;i<e;++i){var o=E[i];o.pixelRatio=F.pixelRatio,o.axes=F.axes,P=P||!!o.dirty,I=I||!!o.dirty;var s=o.bounds;if(s)for(var l=s[0],u=s[1],f=0;f<3;++f)r[f]=Math.min(r[f],l[f]),n[f]=Math.max(n[f],u[f])}var p=F.bounds;if(F.autoBounds)for(var f=0;f<3;++f){if(n[f]<r[f])r[f]=-1,n[f]=1;else{r[f]===n[f]&&(r[f]-=1,n[f]+=1);var d=.05*(n[f]-r[f]);r[f]=r[f]-d,n[f]=n[f]+d}p[0][f]=r[f],p[1][f]=n[f]}for(var m=!1,f=0;f<3;++f)m=m||W[0][f]!==p[0][f]||W[1][f]!==p[1][f],W[0][f]=p[0][f],W[1][f]=p[1][f];if(I=I||m,P=P||m){if(m){for(var v=[0,0,0],i=0;i<3;++i)v[i]=g((p[1][i]-p[0][i])/10);A.autoTicks?A.update({bounds:p,tickSpacing:v}):A.update({bounds:p})}var x=y.drawingBufferWidth,k=y.drawingBufferHeight;B[0]=x,B[1]=k,N[0]=0|Math.max(x/F.pixelRatio,1),N[1]=0|Math.max(k/F.pixelRatio,1),h(O,F.fovy,x/k,F.zNear,F.zFar);for(var i=0;i<16;++i)D[i]=0;D[15]=1;for(var M=0,i=0;i<3;++i)M=Math.max(M,p[1][i]-p[0][i]);for(var i=0;i<3;++i)F.autoScale?D[5*i]=F.aspect[i]/(p[1][i]-p[0][i]):D[5*i]=1/M,F.autoCenter&&(D[12+i]=.5*-D[5*i]*(p[0][i]+p[1][i]));for(var i=0;i<e;++i){var o=E[i];o.axesBounds=p,F.clipToBounds&&(o.clipBounds=p)}b.object&&(F.snapToData?S.position=b.dataCoordinate:S.position=b.dataPosition,S.bounds=p),I&&(I=!1,function(){if(H())return;y.colorMask(!0,!0,!0,!0),y.depthMask(!0),y.disable(y.BLEND),y.enable(y.DEPTH_TEST);for(var t=E.length,e=z.length,r=0;r<e;++r){var n=z[r];n.shape=N,n.begin();for(var i=0;i<t;++i)if(C[i]===r){var a=E[i];a.drawPick&&(a.pixelRatio=1,a.drawPick(R))}n.end()}}()),F.axesPixels=a(F.axes,R,x,k),F.onrender&&F.onrender(),y.bindFramebuffer(y.FRAMEBUFFER,null),y.viewport(0,0,x,k);var T=F.clearColor;y.clearColor(T[0],T[1],T[2],T[3]),y.clear(y.COLOR_BUFFER_BIT|y.DEPTH_BUFFER_BIT),y.depthMask(!0),y.colorMask(!0,!0,!0,!0),y.enable(y.DEPTH_TEST),y.depthFunc(y.LEQUAL),y.disable(y.BLEND),y.disable(y.CULL_FACE);var L=!1;A.enable&&(L=L||A.isTransparent(),A.draw(R)),S.axes=A,b.object&&S.draw(R),y.disable(y.CULL_FACE);for(var i=0;i<e;++i){var o=E[i];o.axes=A,o.pixelRatio=F.pixelRatio,o.isOpaque&&o.isOpaque()&&o.draw(R),o.isTransparent&&o.isTransparent()&&(L=!0)}if(L){_.shape=B,_.bind(),y.clear(y.DEPTH_BUFFER_BIT),y.colorMask(!1,!1,!1,!1),y.depthMask(!0),y.depthFunc(y.LESS),A.enable&&A.isTransparent()&&A.drawTransparent(R);for(var i=0;i<e;++i){var o=E[i];o.isOpaque&&o.isOpaque()&&o.draw(R)}y.enable(y.BLEND),y.blendEquation(y.FUNC_ADD),y.blendFunc(y.ONE,y.ONE_MINUS_SRC_ALPHA),y.colorMask(!0,!0,!0,!0),y.depthMask(!1),y.clearColor(0,0,0,0),y.clear(y.COLOR_BUFFER_BIT),A.isTransparent()&&A.drawTransparent(R);for(var i=0;i<e;++i){var o=E[i];o.isTransparent&&o.isTransparent()&&o.drawTransparent(R)}y.bindFramebuffer(y.FRAMEBUFFER,null),y.blendFunc(y.ONE,y.ONE_MINUS_SRC_ALPHA),y.disable(y.DEPTH_TEST),w.bind(),_.color[0].bind(0),w.uniforms.accumBuffer=0,c(y),y.disable(y.BLEND)}P=!1;for(var i=0;i<e;++i)E[i].dirty=!1}}}return function t(){e||F.contextLost||(requestAnimationFrame(t),Y())}(),F.redraw=function(){e||(P=!0,Y())},F};var n=t("3d-view-controls"),i=t("gl-axes3d"),a=t("gl-axes3d/properties"),o=t("gl-spikes3d"),s=t("gl-select-static"),l=t("gl-fbo"),c=t("a-big-triangle"),u=t("mouse-change"),h=t("gl-mat4/perspective"),f=t("./lib/shader"),p=t("is-mobile")();function d(){this.mouse=[-1,-1],this.screen=null,this.distance=1/0,this.index=null,this.dataCoordinate=null,this.dataPosition=null,this.object=null,this.data=null}function g(t){var e=Math.round(Math.log(Math.abs(t))/Math.log(10));if(e<0){var r=Math.round(Math.pow(10,-e));return Math.ceil(t*r)/r}if(e>0){r=Math.round(Math.pow(10,e));return Math.ceil(t/r)*r}return Math.ceil(t)}function m(t){return"boolean"!=typeof t||t}},{"./lib/shader":276,"3d-view-controls":42,"a-big-triangle":50,"gl-axes3d":222,"gl-axes3d/properties":229,"gl-fbo":239,"gl-mat4/perspective":257,"gl-select-static":286,"gl-spikes3d":296,"is-mobile":388,"mouse-change":402}],278:[function(t,e,r){var n=t("glslify");r.pointVertex=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec2 position;\n\nuniform mat3 matrix;\nuniform float pointSize;\nuniform float pointCloud;\n\nhighp float rand(vec2 co) {\n  highp float a = 12.9898;\n  highp float b = 78.233;\n  highp float c = 43758.5453;\n  highp float d = dot(co.xy, vec2(a, b));\n  highp float e = mod(d, 3.14);\n  return fract(sin(e) * c);\n}\n\nvoid main() {\n  vec3 hgPosition = matrix * vec3(position, 1);\n  gl_Position  = vec4(hgPosition.xy, 0, hgPosition.z);\n    // if we don't jitter the point size a bit, overall point cloud\n    // saturation 'jumps' on zooming, which is disturbing and confusing\n  gl_PointSize = pointSize * ((19.5 + rand(position)) / 20.0);\n  if(pointCloud != 0.0) { // pointCloud is truthy\n    // get the same square surface as circle would be\n    gl_PointSize *= 0.886;\n  }\n}"]),r.pointFragment=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec4 color, borderColor;\nuniform float centerFraction;\nuniform float pointCloud;\n\nvoid main() {\n  float radius;\n  vec4 baseColor;\n  if(pointCloud != 0.0) { // pointCloud is truthy\n    if(centerFraction == 1.0) {\n      gl_FragColor = color;\n    } else {\n      gl_FragColor = mix(borderColor, color, centerFraction);\n    }\n  } else {\n    radius = length(2.0 * gl_PointCoord.xy - 1.0);\n    if(radius > 1.0) {\n      discard;\n    }\n    baseColor = mix(borderColor, color, step(radius, centerFraction));\n    gl_FragColor = vec4(baseColor.rgb * baseColor.a, baseColor.a);\n  }\n}\n"]),r.pickVertex=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec2 position;\nattribute vec4 pickId;\n\nuniform mat3 matrix;\nuniform float pointSize;\nuniform vec4 pickOffset;\n\nvarying vec4 fragId;\n\nvoid main() {\n  vec3 hgPosition = matrix * vec3(position, 1);\n  gl_Position  = vec4(hgPosition.xy, 0, hgPosition.z);\n  gl_PointSize = pointSize;\n\n  vec4 id = pickId + pickOffset;\n  id.y += floor(id.x / 256.0);\n  id.x -= floor(id.x / 256.0) * 256.0;\n\n  id.z += floor(id.y / 256.0);\n  id.y -= floor(id.y / 256.0) * 256.0;\n\n  id.w += floor(id.z / 256.0);\n  id.z -= floor(id.z / 256.0) * 256.0;\n\n  fragId = id;\n}\n"]),r.pickFragment=n(["precision mediump float;\n#define GLSLIFY 1\n\nvarying vec4 fragId;\n\nvoid main() {\n  float radius = length(2.0 * gl_PointCoord.xy - 1.0);\n  if(radius > 1.0) {\n    discard;\n  }\n  gl_FragColor = fragId / 255.0;\n}\n"])},{glslify:377}],279:[function(t,e,r){"use strict";var n=t("gl-shader"),i=t("gl-buffer"),a=t("typedarray-pool"),o=t("./lib/shader");function s(t,e,r,n,i){this.plot=t,this.offsetBuffer=e,this.pickBuffer=r,this.shader=n,this.pickShader=i,this.sizeMin=.5,this.sizeMinCap=2,this.sizeMax=20,this.areaRatio=1,this.pointCount=0,this.color=[1,0,0,1],this.borderColor=[0,0,0,1],this.blend=!1,this.pickOffset=0,this.points=null}e.exports=function(t,e){var r=t.gl,a=i(r),l=i(r),c=n(r,o.pointVertex,o.pointFragment),u=n(r,o.pickVertex,o.pickFragment),h=new s(t,a,l,c,u);return h.update(e),t.addObject(h),h};var l,c,u=s.prototype;u.dispose=function(){this.shader.dispose(),this.pickShader.dispose(),this.offsetBuffer.dispose(),this.pickBuffer.dispose(),this.plot.removeObject(this)},u.update=function(t){var e;function r(e,r){return e in t?t[e]:r}t=t||{},this.sizeMin=r("sizeMin",.5),this.sizeMax=r("sizeMax",20),this.color=r("color",[1,0,0,1]).slice(),this.areaRatio=r("areaRatio",1),this.borderColor=r("borderColor",[0,0,0,1]).slice(),this.blend=r("blend",!1);var n=t.positions.length>>>1,i=t.positions instanceof Float32Array,o=t.idToIndex instanceof Int32Array&&t.idToIndex.length>=n,s=t.positions,l=i?s:a.mallocFloat32(s.length),c=o?t.idToIndex:a.mallocInt32(n);if(i||l.set(s),!o)for(l.set(s),e=0;e<n;e++)c[e]=e;this.points=s,this.offsetBuffer.update(l),this.pickBuffer.update(c),i||a.free(l),o||a.free(c),this.pointCount=n,this.pickOffset=0},u.unifiedDraw=(l=[1,0,0,0,1,0,0,0,1],c=[0,0,0,0],function(t){var e=void 0!==t,r=e?this.pickShader:this.shader,n=this.plot.gl,i=this.plot.dataBox;if(0===this.pointCount)return t;var a=i[2]-i[0],o=i[3]-i[1],s=function(t,e){var r,n=0,i=t.length>>>1;for(r=0;r<i;r++){var a=t[2*r],o=t[2*r+1];a>=e[0]&&a<=e[2]&&o>=e[1]&&o<=e[3]&&n++}return n}(this.points,i),u=this.plot.pickPixelRatio*Math.max(Math.min(this.sizeMinCap,this.sizeMin),Math.min(this.sizeMax,this.sizeMax/Math.pow(s,.33333)));l[0]=2/a,l[4]=2/o,l[6]=-2*i[0]/a-1,l[7]=-2*i[1]/o-1,this.offsetBuffer.bind(),r.bind(),r.attributes.position.pointer(),r.uniforms.matrix=l,r.uniforms.color=this.color,r.uniforms.borderColor=this.borderColor,r.uniforms.pointCloud=u<5,r.uniforms.pointSize=u,r.uniforms.centerFraction=Math.min(1,Math.max(0,Math.sqrt(1-this.areaRatio))),e&&(c[0]=255&t,c[1]=t>>8&255,c[2]=t>>16&255,c[3]=t>>24&255,this.pickBuffer.bind(),r.attributes.pickId.pointer(n.UNSIGNED_BYTE),r.uniforms.pickOffset=c,this.pickOffset=t);var h=n.getParameter(n.BLEND),f=n.getParameter(n.DITHER);return h&&!this.blend&&n.disable(n.BLEND),f&&n.disable(n.DITHER),n.drawArrays(n.POINTS,0,this.pointCount),h&&!this.blend&&n.enable(n.BLEND),f&&n.enable(n.DITHER),t+this.pointCount}),u.draw=u.unifiedDraw,u.drawPick=u.unifiedDraw,u.pick=function(t,e,r){var n=this.pickOffset,i=this.pointCount;if(r<n||r>=n+i)return null;var a=r-n,o=this.points;return{object:this,pointId:a,dataCoord:[o[2*a],o[2*a+1]]}}},{"./lib/shader":278,"gl-buffer":230,"gl-shader":287,"typedarray-pool":507}],280:[function(t,e,r){e.exports=function(t,e,r,n){var i,a,o,s,l,c=e[0],u=e[1],h=e[2],f=e[3],p=r[0],d=r[1],g=r[2],m=r[3];(a=c*p+u*d+h*g+f*m)<0&&(a=-a,p=-p,d=-d,g=-g,m=-m);1-a>1e-6?(i=Math.acos(a),o=Math.sin(i),s=Math.sin((1-n)*i)/o,l=Math.sin(n*i)/o):(s=1-n,l=n);return t[0]=s*c+l*p,t[1]=s*u+l*d,t[2]=s*h+l*g,t[3]=s*f+l*m,t}},{}],281:[function(t,e,r){"use strict";var n=t("vectorize-text");e.exports=function(t,e){var r=i[e];r||(r=i[e]={});if(t in r)return r[t];for(var a=n(t,{textAlign:"center",textBaseline:"middle",lineHeight:1,font:e}),o=n(t,{triangles:!0,textAlign:"center",textBaseline:"middle",lineHeight:1,font:e}),s=[[1/0,1/0],[-1/0,-1/0]],l=0;l<a.positions.length;++l)for(var c=a.positions[l],u=0;u<2;++u)s[0][u]=Math.min(s[0][u],c[u]),s[1][u]=Math.max(s[1][u],c[u]);return r[t]=[o,a,s]};var i={}},{"vectorize-text":515}],282:[function(t,e,r){var n=t("gl-shader"),i=t("glslify"),a=i(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position;\nattribute vec4 color;\nattribute vec2 glyph;\nattribute vec4 id;\n\nuniform vec4 highlightId;\nuniform float highlightScale;\nuniform mat4 model, view, projection;\nuniform vec3 clipBounds[2];\n\nvarying vec4 interpColor;\nvarying vec4 pickId;\nvarying vec3 dataCoordinate;\n\nvoid main() {\n  if(any(lessThan(position, clipBounds[0]))   || \n     any(greaterThan(position, clipBounds[1])) ) {\n    gl_Position = vec4(0,0,0,0);\n  } else {\n    float scale = 1.0;\n    if(distance(highlightId, id) < 0.0001) {\n      scale = highlightScale;\n    }\n\n    vec4 worldPosition = model * vec4(position, 1);\n    vec4 viewPosition = view * worldPosition;\n    viewPosition = viewPosition / viewPosition.w;\n    vec4 clipPosition = projection * (viewPosition + scale * vec4(glyph.x, -glyph.y, 0, 0));\n    \n    gl_Position = clipPosition;\n    interpColor = color;\n    pickId = id;\n    dataCoordinate = position;\n  }\n}"]),o=i(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position;\nattribute vec4 color;\nattribute vec2 glyph;\nattribute vec4 id;\n\nuniform mat4 model, view, projection;\nuniform vec2 screenSize;\nuniform vec3 clipBounds[2];\nuniform float highlightScale, pixelRatio;\nuniform vec4 highlightId;\n\nvarying vec4 interpColor;\nvarying vec4 pickId;\nvarying vec3 dataCoordinate;\n\nvoid main() {\n  if(any(lessThan(position, clipBounds[0])) || any(greaterThan(position, clipBounds[1]))) {\n    gl_Position = vec4(0,0,0,0);\n  } else {\n    float scale = pixelRatio;\n    if(distance(highlightId.bgr, id.bgr) < 0.001) {\n      scale *= highlightScale;\n    }\n\n    vec4 worldPosition = model * vec4(position, 1.0);\n    vec4 viewPosition = view * worldPosition;\n    vec4 clipPosition = projection * viewPosition;\n    clipPosition /= clipPosition.w;\n    \n    gl_Position = clipPosition + vec4(screenSize * scale * vec2(glyph.x, -glyph.y), 0.0, 0.0);\n    interpColor = color;\n    pickId = id;\n    dataCoordinate = position;\n  }\n}"]),s=i(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position;\nattribute vec4 color;\nattribute vec2 glyph;\nattribute vec4 id;\n\nuniform float highlightScale;\nuniform vec4 highlightId;\nuniform vec3 axes[2];\nuniform mat4 model, view, projection;\nuniform vec2 screenSize;\nuniform vec3 clipBounds[2];\nuniform float scale, pixelRatio;\n\nvarying vec4 interpColor;\nvarying vec4 pickId;\nvarying vec3 dataCoordinate;\n\nvoid main() {\n  if(any(lessThan(position, clipBounds[0]))   ||\n     any(greaterThan(position, clipBounds[1])) ) {\n    gl_Position = vec4(0,0,0,0);\n  } else {\n    float lscale = pixelRatio * scale;\n    if(distance(highlightId, id) < 0.0001) {\n      lscale *= highlightScale;\n    }\n\n    vec4 clipCenter   = projection * view * model * vec4(position, 1);\n    vec3 dataPosition = position + 0.5*lscale*(axes[0] * glyph.x + axes[1] * glyph.y) * clipCenter.w * screenSize.y;\n    vec4 clipPosition = projection * view * model * vec4(dataPosition, 1);\n\n    gl_Position = clipPosition;\n    interpColor = color;\n    pickId = id;\n    dataCoordinate = dataPosition;\n  }\n}\n"]),l=i(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec3 fragClipBounds[2];\nuniform float opacity;\n\nvarying vec4 interpColor;\nvarying vec4 pickId;\nvarying vec3 dataCoordinate;\n\nvoid main() {\n  if(any(lessThan(dataCoordinate, fragClipBounds[0]))   ||\n     any(greaterThan(dataCoordinate, fragClipBounds[1])) ) {\n    discard;\n  } else {\n    gl_FragColor = interpColor * opacity;\n  }\n}\n"]),c=i(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec3 fragClipBounds[2];\nuniform float pickGroup;\n\nvarying vec4 pickId;\nvarying vec3 dataCoordinate;\n\nvoid main() {\n  if(any(lessThan(dataCoordinate, fragClipBounds[0]))   || \n     any(greaterThan(dataCoordinate, fragClipBounds[1])) ) {\n    discard;\n  } else {\n    gl_FragColor = vec4(pickGroup, pickId.bgr);\n  }\n}"]),u=[{name:"position",type:"vec3"},{name:"color",type:"vec4"},{name:"glyph",type:"vec2"},{name:"id",type:"vec4"}],h={vertex:a,fragment:l,attributes:u},f={vertex:o,fragment:l,attributes:u},p={vertex:s,fragment:l,attributes:u},d={vertex:a,fragment:c,attributes:u},g={vertex:o,fragment:c,attributes:u},m={vertex:s,fragment:c,attributes:u};function v(t,e){var r=n(t,e),i=r.attributes;return i.position.location=0,i.color.location=1,i.glyph.location=2,i.id.location=3,r}r.createPerspective=function(t){return v(t,h)},r.createOrtho=function(t){return v(t,f)},r.createProject=function(t){return v(t,p)},r.createPickPerspective=function(t){return v(t,d)},r.createPickOrtho=function(t){return v(t,g)},r.createPickProject=function(t){return v(t,m)}},{"gl-shader":287,glslify:377}],283:[function(t,e,r){"use strict";var n=t("gl-buffer"),i=t("gl-vao"),a=t("typedarray-pool"),o=t("gl-mat4/multiply"),s=t("./lib/shaders"),l=t("./lib/glyphs"),c=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function u(t,e){var r=t[0],n=t[1],i=t[2],a=t[3];return t[0]=e[0]*r+e[4]*n+e[8]*i+e[12]*a,t[1]=e[1]*r+e[5]*n+e[9]*i+e[13]*a,t[2]=e[2]*r+e[6]*n+e[10]*i+e[14]*a,t[3]=e[3]*r+e[7]*n+e[11]*i+e[15]*a,t}function h(t,e,r,n){return u(n,n),u(n,n),u(n,n)}function f(t,e){this.index=t,this.dataCoordinate=this.position=e}function p(t,e,r,n,i,a,o,s,l,c,u,h){this.gl=t,this.pixelRatio=1,this.shader=e,this.orthoShader=r,this.projectShader=n,this.pointBuffer=i,this.colorBuffer=a,this.glyphBuffer=o,this.idBuffer=s,this.vao=l,this.vertexCount=0,this.lineVertexCount=0,this.opacity=1,this.lineWidth=0,this.projectScale=[2/3,2/3,2/3],this.projectOpacity=[1,1,1],this.pickId=0,this.pickPerspectiveShader=c,this.pickOrthoShader=u,this.pickProjectShader=h,this.points=[],this._selectResult=new f(0,[0,0,0]),this.useOrtho=!0,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.axesProject=[!0,!0,!0],this.axesBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.highlightId=[1,1,1,1],this.highlightScale=2,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.dirty=!0}e.exports=function(t){var e=t.gl,r=s.createPerspective(e),a=s.createOrtho(e),o=s.createProject(e),l=s.createPickPerspective(e),c=s.createPickOrtho(e),u=s.createPickProject(e),h=n(e),f=n(e),d=n(e),g=n(e),m=i(e,[{buffer:h,size:3,type:e.FLOAT},{buffer:f,size:4,type:e.FLOAT},{buffer:d,size:2,type:e.FLOAT},{buffer:g,size:4,type:e.UNSIGNED_BYTE,normalized:!0}]),v=new p(e,r,a,o,h,f,d,g,m,l,c,u);return v.update(t),v};var d=p.prototype;d.pickSlots=1,d.setPickBase=function(t){this.pickId=t},d.isTransparent=function(){if(this.opacity<1)return!0;for(var t=0;t<3;++t)if(this.axesProject[t]&&this.projectOpacity[t]<1)return!0;return!1},d.isOpaque=function(){if(this.opacity>=1)return!0;for(var t=0;t<3;++t)if(this.axesProject[t]&&this.projectOpacity[t]>=1)return!0;return!1};var g=[0,0],m=[0,0,0],v=[0,0,0],y=[0,0,0,1],x=[0,0,0,1],b=c.slice(),_=[0,0,0],w=[[0,0,0],[0,0,0]];function k(t){return t[0]=t[1]=t[2]=0,t}function M(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=1,t}function A(t,e,r,n){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[r]=n,t}function T(t,e,r,n,i){var a,s=e.axesProject,l=e.gl,u=t.uniforms,f=r.model||c,p=r.view||c,d=r.projection||c,T=e.axesBounds,S=function(t){for(var e=w,r=0;r<2;++r)for(var n=0;n<3;++n)e[r][n]=Math.max(Math.min(t[r][n],1e8),-1e8);return e}(e.clipBounds);a=e.axes&&e.axes.lastCubeProps?e.axes.lastCubeProps.axis:[1,1,1],g[0]=2/l.drawingBufferWidth,g[1]=2/l.drawingBufferHeight,t.bind(),u.view=p,u.projection=d,u.screenSize=g,u.highlightId=e.highlightId,u.highlightScale=e.highlightScale,u.clipBounds=S,u.pickGroup=e.pickId/255,u.pixelRatio=e.pixelRatio;for(var E=0;E<3;++E)if(s[E]&&e.projectOpacity[E]<1===n){u.scale=e.projectScale[E],u.opacity=e.projectOpacity[E];for(var C=b,L=0;L<16;++L)C[L]=0;for(L=0;L<4;++L)C[5*L]=1;C[5*E]=0,a[E]<0?C[12+E]=T[0][E]:C[12+E]=T[1][E],o(C,f,C),u.model=C;var z=(E+1)%3,P=(E+2)%3,I=k(m),O=k(v);I[z]=1,O[P]=1;var D=h(0,0,0,M(y,I)),R=h(0,0,0,M(x,O));if(Math.abs(D[1])>Math.abs(R[1])){var B=D;D=R,R=B,B=I,I=O,O=B;var F=z;z=P,P=F}D[0]<0&&(I[z]=-1),R[1]>0&&(O[P]=-1);var N=0,j=0;for(L=0;L<4;++L)N+=Math.pow(f[4*z+L],2),j+=Math.pow(f[4*P+L],2);I[z]/=Math.sqrt(N),O[P]/=Math.sqrt(j),u.axes[0]=I,u.axes[1]=O,u.fragClipBounds[0]=A(_,S[0],E,-1e8),u.fragClipBounds[1]=A(_,S[1],E,1e8),e.vao.draw(l.TRIANGLES,e.vertexCount),e.lineWidth>0&&(l.lineWidth(e.lineWidth),e.vao.draw(l.LINES,e.lineVertexCount,e.vertexCount))}}var S=[[-1e8,-1e8,-1e8],[1e8,1e8,1e8]];function E(t,e,r,n,i,a){var o=r.gl;if(r.vao.bind(),i===r.opacity<1||a){t.bind();var s=t.uniforms;s.model=n.model||c,s.view=n.view||c,s.projection=n.projection||c,g[0]=2/o.drawingBufferWidth,g[1]=2/o.drawingBufferHeight,s.screenSize=g,s.highlightId=r.highlightId,s.highlightScale=r.highlightScale,s.fragClipBounds=S,s.clipBounds=r.axes.bounds,s.opacity=r.opacity,s.pickGroup=r.pickId/255,s.pixelRatio=r.pixelRatio,r.vao.draw(o.TRIANGLES,r.vertexCount),r.lineWidth>0&&(o.lineWidth(r.lineWidth),r.vao.draw(o.LINES,r.lineVertexCount,r.vertexCount))}T(e,r,n,i),r.vao.unbind()}d.draw=function(t){E(this.useOrtho?this.orthoShader:this.shader,this.projectShader,this,t,!1,!1)},d.drawTransparent=function(t){E(this.useOrtho?this.orthoShader:this.shader,this.projectShader,this,t,!0,!1)},d.drawPick=function(t){E(this.useOrtho?this.pickOrthoShader:this.pickPerspectiveShader,this.pickProjectShader,this,t,!1,!0)},d.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;var e=t.value[2]+(t.value[1]<<8)+(t.value[0]<<16);if(e>=this.pointCount||e<0)return null;var r=this.points[e],n=this._selectResult;n.index=e;for(var i=0;i<3;++i)n.position[i]=n.dataCoordinate[i]=r[i];return n},d.highlight=function(t){if(t){var e=t.index,r=255&e,n=e>>8&255,i=e>>16&255;this.highlightId=[r/255,n/255,i/255,0]}else this.highlightId=[1,1,1,1]},d.update=function(t){if("perspective"in(t=t||{})&&(this.useOrtho=!t.perspective),"orthographic"in t&&(this.useOrtho=!!t.orthographic),"lineWidth"in t&&(this.lineWidth=t.lineWidth),"project"in t)if(Array.isArray(t.project))this.axesProject=t.project;else{var e=!!t.project;this.axesProject=[e,e,e]}if("projectScale"in t)if(Array.isArray(t.projectScale))this.projectScale=t.projectScale.slice();else{var r=+t.projectScale;this.projectScale=[r,r,r]}if("projectOpacity"in t)if(Array.isArray(t.projectOpacity))this.projectOpacity=t.projectOpacity.slice();else{r=+t.projectOpacity;this.projectOpacity=[r,r,r]}"opacity"in t&&(this.opacity=t.opacity),this.dirty=!0;var n=t.position;if(n){var i=t.font||"normal",o=t.alignment||[0,0],s=[1/0,1/0,1/0],c=[-1/0,-1/0,-1/0],u=t.glyph,h=t.color,f=t.size,p=t.angle,d=t.lineColor,g=0,m=0,v=0,y=n.length;t:for(var x=0;x<y;++x){for(var b=n[x],_=0;_<3;++_)if(isNaN(b[_])||!isFinite(b[_]))continue t;var w=(B=Array.isArray(u)?l(u[x],i):l(u||"\u25cf",i))[0],k=B[1],M=B[2];m+=3*w.cells.length,v+=2*k.edges.length}var A=m+v,T=a.mallocFloat(3*A),S=a.mallocFloat(4*A),E=a.mallocFloat(2*A),C=a.mallocUint32(A),L=[0,o[1]],z=0,P=m,I=[0,0,0,1],O=[0,0,0,1],D=Array.isArray(h)&&Array.isArray(h[0]),R=Array.isArray(d)&&Array.isArray(d[0]);t:for(x=0;x<y;++x){var B;for(b=n[x],_=0;_<3;++_){if(isNaN(b[_])||!isFinite(b[_])){g+=1;continue t}c[_]=Math.max(c[_],b[_]),s[_]=Math.min(s[_],b[_])}var F;w=(B=Array.isArray(u)?l(u[x],i):l(u||"\u25cf",i))[0],k=B[1],M=B[2];if(Array.isArray(h)){if(3===(F=D?h[x]:h).length){for(_=0;_<3;++_)I[_]=F[_];I[3]=1}else if(4===F.length)for(_=0;_<4;++_)I[_]=F[_]}else I[0]=I[1]=I[2]=0,I[3]=1;if(Array.isArray(d)){if(3===(F=R?d[x]:d).length){for(_=0;_<3;++_)O[_]=F[_];O[_]=1}else if(4===F.length)for(_=0;_<4;++_)O[_]=F[_]}else O[0]=O[1]=O[2]=0,O[3]=1;var N=.5;Array.isArray(f)?N=+f[x]:f?N=+f:this.useOrtho&&(N=12);var j=0;Array.isArray(p)?j=+p[x]:p&&(j=+p);var V=Math.cos(j),U=Math.sin(j);for(b=n[x],_=0;_<3;++_)c[_]=Math.max(c[_],b[_]),s[_]=Math.min(s[_],b[_]);o[0]<0?L[0]=o[0]*(1+M[1][0]):o[0]>0&&(L[0]=-o[0]*(1+M[0][0]));var q=w.cells,H=w.positions;for(_=0;_<q.length;++_)for(var G=q[_],W=0;W<3;++W){for(var Y=0;Y<3;++Y)T[3*z+Y]=b[Y];for(Y=0;Y<4;++Y)S[4*z+Y]=I[Y];C[z]=g;var X=H[G[W]];E[2*z]=N*(V*X[0]-U*X[1]+L[0]),E[2*z+1]=N*(U*X[0]+V*X[1]+L[1]),z+=1}for(q=k.edges,H=k.positions,_=0;_<q.length;++_)for(G=q[_],W=0;W<2;++W){for(Y=0;Y<3;++Y)T[3*P+Y]=b[Y];for(Y=0;Y<4;++Y)S[4*P+Y]=O[Y];C[P]=g;X=H[G[W]];E[2*P]=N*(V*X[0]-U*X[1]+L[0]),E[2*P+1]=N*(U*X[0]+V*X[1]+L[1]),P+=1}g+=1}this.vertexCount=m,this.lineVertexCount=v,this.pointBuffer.update(T),this.colorBuffer.update(S),this.glyphBuffer.update(E),this.idBuffer.update(new Uint32Array(C)),a.free(T),a.free(S),a.free(E),a.free(C),this.bounds=[s,c],this.points=n,this.pointCount=n.length}},d.dispose=function(){this.shader.dispose(),this.orthoShader.dispose(),this.pickPerspectiveShader.dispose(),this.pickOrthoShader.dispose(),this.vao.dispose(),this.pointBuffer.dispose(),this.colorBuffer.dispose(),this.glyphBuffer.dispose(),this.idBuffer.dispose()}},{"./lib/glyphs":281,"./lib/shaders":282,"gl-buffer":230,"gl-mat4/multiply":256,"gl-vao":308,"typedarray-pool":507}],284:[function(t,e,r){"use strict";var n=t("glslify");r.boxVertex=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec2 vertex;\n\nuniform vec2 cornerA, cornerB;\n\nvoid main() {\n  gl_Position = vec4(mix(cornerA, cornerB, vertex), 0, 1);\n}\n"]),r.boxFragment=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec4 color;\n\nvoid main() {\n  gl_FragColor = color;\n}\n"])},{glslify:377}],285:[function(t,e,r){"use strict";var n=t("gl-shader"),i=t("gl-buffer"),a=t("./lib/shaders");function o(t,e,r){this.plot=t,this.boxBuffer=e,this.boxShader=r,this.enabled=!0,this.selectBox=[1/0,1/0,-1/0,-1/0],this.borderColor=[0,0,0,1],this.innerFill=!1,this.innerColor=[0,0,0,.25],this.outerFill=!0,this.outerColor=[0,0,0,.5],this.borderWidth=10}e.exports=function(t,e){var r=t.gl,s=i(r,[0,0,0,1,1,0,1,1]),l=n(r,a.boxVertex,a.boxFragment),c=new o(t,s,l);return c.update(e),t.addOverlay(c),c};var s=o.prototype;s.draw=function(){if(this.enabled){var t=this.plot,e=this.selectBox,r=this.borderWidth,n=(this.innerFill,this.innerColor),i=(this.outerFill,this.outerColor),a=this.borderColor,o=t.box,s=t.screenBox,l=t.dataBox,c=t.viewBox,u=t.pixelRatio,h=(e[0]-l[0])*(c[2]-c[0])/(l[2]-l[0])+c[0],f=(e[1]-l[1])*(c[3]-c[1])/(l[3]-l[1])+c[1],p=(e[2]-l[0])*(c[2]-c[0])/(l[2]-l[0])+c[0],d=(e[3]-l[1])*(c[3]-c[1])/(l[3]-l[1])+c[1];if(h=Math.max(h,c[0]),f=Math.max(f,c[1]),p=Math.min(p,c[2]),d=Math.min(d,c[3]),!(p<h||d<f)){o.bind();var g=s[2]-s[0],m=s[3]-s[1];if(this.outerFill&&(o.drawBox(0,0,g,f,i),o.drawBox(0,f,h,d,i),o.drawBox(0,d,g,m,i),o.drawBox(p,f,g,d,i)),this.innerFill&&o.drawBox(h,f,p,d,n),r>0){var v=r*u;o.drawBox(h-v,f-v,p+v,f+v,a),o.drawBox(h-v,d-v,p+v,d+v,a),o.drawBox(h-v,f-v,h+v,d+v,a),o.drawBox(p-v,f-v,p+v,d+v,a)}}}},s.update=function(t){t=t||{},this.innerFill=!!t.innerFill,this.outerFill=!!t.outerFill,this.innerColor=(t.innerColor||[0,0,0,.5]).slice(),this.outerColor=(t.outerColor||[0,0,0,.5]).slice(),this.borderColor=(t.borderColor||[0,0,0,1]).slice(),this.borderWidth=t.borderWidth||0,this.selectBox=(t.selectBox||this.selectBox).slice()},s.dispose=function(){this.boxBuffer.dispose(),this.boxShader.dispose(),this.plot.removeOverlay(this)}},{"./lib/shaders":284,"gl-buffer":230,"gl-shader":287}],286:[function(t,e,r){"use strict";e.exports=function(t,e){var r=n(t,e),a=i.mallocUint8(e[0]*e[1]*4);return new c(t,r,a)};var n=t("gl-fbo"),i=t("typedarray-pool"),a=t("ndarray"),o=t("bit-twiddle").nextPow2,s=t("cwise/lib/wrapper")({args:["array",{offset:[0,0,1],array:0},{offset:[0,0,2],array:0},{offset:[0,0,3],array:0},"scalar","scalar","index"],pre:{body:"{this_closestD2=1e8,this_closestX=-1,this_closestY=-1}",args:[],thisVars:["this_closestD2","this_closestX","this_closestY"],localVars:[]},body:{body:"{if(_inline_16_arg0_<255||_inline_16_arg1_<255||_inline_16_arg2_<255||_inline_16_arg3_<255){var _inline_16_l=_inline_16_arg4_-_inline_16_arg6_[0],_inline_16_a=_inline_16_arg5_-_inline_16_arg6_[1],_inline_16_f=_inline_16_l*_inline_16_l+_inline_16_a*_inline_16_a;_inline_16_f<this_closestD2&&(this_closestD2=_inline_16_f,this_closestX=_inline_16_arg6_[0],this_closestY=_inline_16_arg6_[1])}}",args:[{name:"_inline_16_arg0_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_16_arg1_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_16_arg2_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_16_arg3_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_16_arg4_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_16_arg5_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_16_arg6_",lvalue:!1,rvalue:!0,count:4}],thisVars:["this_closestD2","this_closestX","this_closestY"],localVars:["_inline_16_a","_inline_16_f","_inline_16_l"]},post:{body:"{return[this_closestX,this_closestY,this_closestD2]}",args:[],thisVars:["this_closestD2","this_closestX","this_closestY"],localVars:[]},debug:!1,funcName:"cwise",blockSize:64});function l(t,e,r,n,i){this.coord=[t,e],this.id=r,this.value=n,this.distance=i}function c(t,e,r){this.gl=t,this.fbo=e,this.buffer=r,this._readTimeout=null;var n=this;this._readCallback=function(){n.gl&&(e.bind(),t.readPixels(0,0,e.shape[0],e.shape[1],t.RGBA,t.UNSIGNED_BYTE,n.buffer),n._readTimeout=null)}}var u=c.prototype;Object.defineProperty(u,"shape",{get:function(){return this.gl?this.fbo.shape.slice():[0,0]},set:function(t){if(this.gl){this.fbo.shape=t;var e=this.fbo.shape[0],r=this.fbo.shape[1];if(r*e*4>this.buffer.length){i.free(this.buffer);for(var n=this.buffer=i.mallocUint8(o(r*e*4)),a=0;a<r*e*4;++a)n[a]=255}return t}}}),u.begin=function(){var t=this.gl;this.shape;t&&(this.fbo.bind(),t.clearColor(1,1,1,1),t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT))},u.end=function(){var t=this.gl;t&&(t.bindFramebuffer(t.FRAMEBUFFER,null),this._readTimeout||clearTimeout(this._readTimeout),this._readTimeout=setTimeout(this._readCallback,1))},u.query=function(t,e,r){if(!this.gl)return null;var n=this.fbo.shape.slice();t|=0,e|=0,"number"!=typeof r&&(r=1);var i=0|Math.min(Math.max(t-r,0),n[0]),o=0|Math.min(Math.max(t+r,0),n[0]),c=0|Math.min(Math.max(e-r,0),n[1]),u=0|Math.min(Math.max(e+r,0),n[1]);if(o<=i||u<=c)return null;var h=[o-i,u-c],f=a(this.buffer,[h[0],h[1],4],[4,4*n[0],1],4*(i+n[0]*c)),p=s(f.hi(h[0],h[1],1),r,r),d=p[0],g=p[1];return d<0||Math.pow(this.radius,2)<p[2]?null:new l(d+i|0,g+c|0,f.get(d,g,0),[f.get(d,g,1),f.get(d,g,2),f.get(d,g,3)],Math.sqrt(p[2]))},u.dispose=function(){this.gl&&(this.fbo.dispose(),i.free(this.buffer),this.gl=null,this._readTimeout&&clearTimeout(this._readTimeout))}},{"bit-twiddle":80,"cwise/lib/wrapper":136,"gl-fbo":239,ndarray:417,"typedarray-pool":507}],287:[function(t,e,r){"use strict";var n=t("./lib/create-uniforms"),i=t("./lib/create-attributes"),a=t("./lib/reflect"),o=t("./lib/shader-cache"),s=t("./lib/runtime-reflect"),l=t("./lib/GLError");function c(t){this.gl=t,this.gl.lastAttribCount=0,this._vref=this._fref=this._relink=this.vertShader=this.fragShader=this.program=this.attributes=this.uniforms=this.types=null}var u=c.prototype;function h(t,e){return t.name<e.name?-1:1}u.bind=function(){var t;this.program||this._relink();var e=this.gl.getProgramParameter(this.program,this.gl.ACTIVE_ATTRIBUTES),r=this.gl.lastAttribCount;if(e>r)for(t=r;t<e;t++)this.gl.enableVertexAttribArray(t);else if(r>e)for(t=e;t<r;t++)this.gl.disableVertexAttribArray(t);this.gl.lastAttribCount=e,this.gl.useProgram(this.program)},u.dispose=function(){for(var t=this.gl.lastAttribCount,e=0;e<t;e++)this.gl.disableVertexAttribArray(e);this.gl.lastAttribCount=0,this._fref&&this._fref.dispose(),this._vref&&this._vref.dispose(),this.attributes=this.types=this.vertShader=this.fragShader=this.program=this._relink=this._fref=this._vref=null},u.update=function(t,e,r,c){if(!e||1===arguments.length){var u=t;t=u.vertex,e=u.fragment,r=u.uniforms,c=u.attributes}var f=this,p=f.gl,d=f._vref;f._vref=o.shader(p,p.VERTEX_SHADER,t),d&&d.dispose(),f.vertShader=f._vref.shader;var g=this._fref;if(f._fref=o.shader(p,p.FRAGMENT_SHADER,e),g&&g.dispose(),f.fragShader=f._fref.shader,!r||!c){var m=p.createProgram();if(p.attachShader(m,f.fragShader),p.attachShader(m,f.vertShader),p.linkProgram(m),!p.getProgramParameter(m,p.LINK_STATUS)){var v=p.getProgramInfoLog(m);throw new l(v,"Error linking program:"+v)}r=r||s.uniforms(p,m),c=c||s.attributes(p,m),p.deleteProgram(m)}(c=c.slice()).sort(h);var y,x=[],b=[],_=[];for(y=0;y<c.length;++y){var w=c[y];if(w.type.indexOf("mat")>=0){for(var k=0|w.type.charAt(w.type.length-1),M=new Array(k),A=0;A<k;++A)M[A]=_.length,b.push(w.name+"["+A+"]"),"number"==typeof w.location?_.push(w.location+A):Array.isArray(w.location)&&w.location.length===k&&"number"==typeof w.location[A]?_.push(0|w.location[A]):_.push(-1);x.push({name:w.name,type:w.type,locations:M})}else x.push({name:w.name,type:w.type,locations:[_.length]}),b.push(w.name),"number"==typeof w.location?_.push(0|w.location):_.push(-1)}var T=0;for(y=0;y<_.length;++y)if(_[y]<0){for(;_.indexOf(T)>=0;)T+=1;_[y]=T}var S=new Array(r.length);function E(){f.program=o.program(p,f._vref,f._fref,b,_);for(var t=0;t<r.length;++t)S[t]=p.getUniformLocation(f.program,r[t].name)}E(),f._relink=E,f.types={uniforms:a(r),attributes:a(c)},f.attributes=i(p,f,x,_),Object.defineProperty(f,"uniforms",n(p,f,r,S))},e.exports=function(t,e,r,n,i){var a=new c(t);return a.update(e,r,n,i),a}},{"./lib/GLError":288,"./lib/create-attributes":289,"./lib/create-uniforms":290,"./lib/reflect":291,"./lib/runtime-reflect":292,"./lib/shader-cache":293}],288:[function(t,e,r){function n(t,e,r){this.shortMessage=e||"",this.longMessage=r||"",this.rawError=t||"",this.message="gl-shader: "+(e||t||"")+(r?"\n"+r:""),this.stack=(new Error).stack}n.prototype=new Error,n.prototype.name="GLError",n.prototype.constructor=n,e.exports=n},{}],289:[function(t,e,r){"use strict";e.exports=function(t,e,r,i){for(var a={},l=0,c=r.length;l<c;++l){var u=r[l],h=u.name,f=u.type,p=u.locations;switch(f){case"bool":case"int":case"float":o(t,e,p[0],i,1,a,h);break;default:if(f.indexOf("vec")>=0){var d=f.charCodeAt(f.length-1)-48;if(d<2||d>4)throw new n("","Invalid data type for attribute "+h+": "+f);o(t,e,p[0],i,d,a,h)}else{if(!(f.indexOf("mat")>=0))throw new n("","Unknown data type for attribute "+h+": "+f);var d=f.charCodeAt(f.length-1)-48;if(d<2||d>4)throw new n("","Invalid data type for attribute "+h+": "+f);s(t,e,p,i,d,a,h)}}}return a};var n=t("./GLError");function i(t,e,r,n,i,a){this._gl=t,this._wrapper=e,this._index=r,this._locations=n,this._dimension=i,this._constFunc=a}var a=i.prototype;function o(t,e,r,n,a,o,s){for(var l=["gl","v"],c=[],u=0;u<a;++u)l.push("x"+u),c.push("x"+u);l.push("if(x0.length===void 0){return gl.vertexAttrib"+a+"f(v,"+c.join()+")}else{return gl.vertexAttrib"+a+"fv(v,x0)}");var h=Function.apply(null,l),f=new i(t,e,r,n,a,h);Object.defineProperty(o,s,{set:function(e){return t.disableVertexAttribArray(n[r]),h(t,n[r],e),e},get:function(){return f},enumerable:!0})}function s(t,e,r,n,i,a,s){for(var l=new Array(i),c=new Array(i),u=0;u<i;++u)o(t,e,r[u],n,i,l,u),c[u]=l[u];Object.defineProperty(l,"location",{set:function(t){if(Array.isArray(t))for(var e=0;e<i;++e)c[e].location=t[e];else for(e=0;e<i;++e)c[e].location=t+e;return t},get:function(){for(var t=new Array(i),e=0;e<i;++e)t[e]=n[r[e]];return t},enumerable:!0}),l.pointer=function(e,a,o,s){e=e||t.FLOAT,a=!!a,o=o||i*i,s=s||0;for(var l=0;l<i;++l){var c=n[r[l]];t.vertexAttribPointer(c,i,e,a,o,s+l*i),t.enableVertexAttribArray(c)}};var h=new Array(i),f=t["vertexAttrib"+i+"fv"];Object.defineProperty(a,s,{set:function(e){for(var a=0;a<i;++a){var o=n[r[a]];if(t.disableVertexAttribArray(o),Array.isArray(e[0]))f.call(t,o,e[a]);else{for(var s=0;s<i;++s)h[s]=e[i*a+s];f.call(t,o,h)}}return e},get:function(){return l},enumerable:!0})}a.pointer=function(t,e,r,n){var i=this._gl,a=this._locations[this._index];i.vertexAttribPointer(a,this._dimension,t||i.FLOAT,!!e,r||0,n||0),i.enableVertexAttribArray(a)},a.set=function(t,e,r,n){return this._constFunc(this._locations[this._index],t,e,r,n)},Object.defineProperty(a,"location",{get:function(){return this._locations[this._index]},set:function(t){return t!==this._locations[this._index]&&(this._locations[this._index]=0|t,this._wrapper.program=null),0|t}})},{"./GLError":288}],290:[function(t,e,r){"use strict";var n=t("./reflect"),i=t("./GLError");function a(t){return new Function("y","return function(){return y}")(t)}function o(t,e){for(var r=new Array(t),n=0;n<t;++n)r[n]=e;return r}e.exports=function(t,e,r,s){function l(t,e,r){switch(r){case"bool":case"int":case"sampler2D":case"samplerCube":return"gl.uniform1i(locations["+e+"],obj"+t+")";case"float":return"gl.uniform1f(locations["+e+"],obj"+t+")";default:var n=r.indexOf("vec");if(!(0<=n&&n<=1&&r.length===4+n)){if(0===r.indexOf("mat")&&4===r.length){var a=r.charCodeAt(r.length-1)-48;if(a<2||a>4)throw new i("","Invalid uniform dimension type for matrix "+name+": "+r);return"gl.uniformMatrix"+a+"fv(locations["+e+"],false,obj"+t+")"}throw new i("","Unknown uniform data type for "+name+": "+r)}var a=r.charCodeAt(r.length-1)-48;if(a<2||a>4)throw new i("","Invalid data type");switch(r.charAt(0)){case"b":case"i":return"gl.uniform"+a+"iv(locations["+e+"],obj"+t+")";case"v":return"gl.uniform"+a+"fv(locations["+e+"],obj"+t+")";default:throw new i("","Unrecognized data type for vector "+name+": "+r)}}}function c(e){for(var n=["return function updateProperty(obj){"],i=function t(e,r){if("object"!=typeof r)return[[e,r]];var n=[];for(var i in r){var a=r[i],o=e;parseInt(i)+""===i?o+="["+i+"]":o+="."+i,"object"==typeof a?n.push.apply(n,t(o,a)):n.push([o,a])}return n}("",e),a=0;a<i.length;++a){var o=i[a],c=o[0],u=o[1];s[u]&&n.push(l(c,u,r[u].type))}n.push("return obj}");var h=new Function("gl","locations",n.join("\n"));return h(t,s)}function u(n,l,u){if("object"==typeof u){var f=h(u);Object.defineProperty(n,l,{get:a(f),set:c(u),enumerable:!0,configurable:!1})}else s[u]?Object.defineProperty(n,l,{get:(p=u,new Function("gl","wrapper","locations","return function(){return gl.getUniform(wrapper.program,locations["+p+"])}")(t,e,s)),set:c(u),enumerable:!0,configurable:!1}):n[l]=function(t){switch(t){case"bool":return!1;case"int":case"sampler2D":case"samplerCube":case"float":return 0;default:var e=t.indexOf("vec");if(0<=e&&e<=1&&t.length===4+e){var r=t.charCodeAt(t.length-1)-48;if(r<2||r>4)throw new i("","Invalid data type");return"b"===t.charAt(0)?o(r,!1):o(r,0)}if(0===t.indexOf("mat")&&4===t.length){var r=t.charCodeAt(t.length-1)-48;if(r<2||r>4)throw new i("","Invalid uniform dimension type for matrix "+name+": "+t);return o(r*r,0)}throw new i("","Unknown uniform data type for "+name+": "+t)}}(r[u].type);var p}function h(t){var e;if(Array.isArray(t)){e=new Array(t.length);for(var r=0;r<t.length;++r)u(e,r,t[r])}else for(var n in e={},t)u(e,n,t[n]);return e}var f=n(r,!0);return{get:a(h(f)),set:c(f),enumerable:!0,configurable:!0}}},{"./GLError":288,"./reflect":291}],291:[function(t,e,r){"use strict";e.exports=function(t,e){for(var r={},n=0;n<t.length;++n)for(var i=t[n].name,a=i.split("."),o=r,s=0;s<a.length;++s){var l=a[s].split("[");if(l.length>1){l[0]in o||(o[l[0]]=[]),o=o[l[0]];for(var c=1;c<l.length;++c){var u=parseInt(l[c]);c<l.length-1||s<a.length-1?(u in o||(c<l.length-1?o[u]=[]:o[u]={}),o=o[u]):o[u]=e?n:t[n].type}}else s<a.length-1?(l[0]in o||(o[l[0]]={}),o=o[l[0]]):o[l[0]]=e?n:t[n].type}return r}},{}],292:[function(t,e,r){"use strict";r.uniforms=function(t,e){for(var r=t.getProgramParameter(e,t.ACTIVE_UNIFORMS),n=[],i=0;i<r;++i){var o=t.getActiveUniform(e,i);if(o){var s=a(t,o.type);if(o.size>1)for(var l=0;l<o.size;++l)n.push({name:o.name.replace("[0]","["+l+"]"),type:s});else n.push({name:o.name,type:s})}}return n},r.attributes=function(t,e){for(var r=t.getProgramParameter(e,t.ACTIVE_ATTRIBUTES),n=[],i=0;i<r;++i){var o=t.getActiveAttrib(e,i);o&&n.push({name:o.name,type:a(t,o.type)})}return n};var n={FLOAT:"float",FLOAT_VEC2:"vec2",FLOAT_VEC3:"vec3",FLOAT_VEC4:"vec4",INT:"int",INT_VEC2:"ivec2",INT_VEC3:"ivec3",INT_VEC4:"ivec4",BOOL:"bool",BOOL_VEC2:"bvec2",BOOL_VEC3:"bvec3",BOOL_VEC4:"bvec4",FLOAT_MAT2:"mat2",FLOAT_MAT3:"mat3",FLOAT_MAT4:"mat4",SAMPLER_2D:"sampler2D",SAMPLER_CUBE:"samplerCube"},i=null;function a(t,e){if(!i){var r=Object.keys(n);i={};for(var a=0;a<r.length;++a){var o=r[a];i[t[o]]=n[o]}}return i[e]}},{}],293:[function(t,e,r){"use strict";r.shader=function(t,e,r){return u(t).getShaderReference(e,r)},r.program=function(t,e,r,n,i){return u(t).getProgram(e,r,n,i)};var n=t("./GLError"),i=t("gl-format-compiler-error"),a=new("undefined"==typeof WeakMap?t("weakmap-shim"):WeakMap),o=0;function s(t,e,r,n,i,a,o){this.id=t,this.src=e,this.type=r,this.shader=n,this.count=a,this.programs=[],this.cache=o}function l(t){this.gl=t,this.shaders=[{},{}],this.programs={}}s.prototype.dispose=function(){if(0==--this.count){for(var t=this.cache,e=t.gl,r=this.programs,n=0,i=r.length;n<i;++n){var a=t.programs[r[n]];a&&(delete t.programs[n],e.deleteProgram(a))}e.deleteShader(this.shader),delete t.shaders[this.type===e.FRAGMENT_SHADER|0][this.src]}};var c=l.prototype;function u(t){var e=a.get(t);return e||(e=new l(t),a.set(t,e)),e}c.getShaderReference=function(t,e){var r=this.gl,a=this.shaders[t===r.FRAGMENT_SHADER|0],l=a[e];if(l&&r.isShader(l.shader))l.count+=1;else{var c=function(t,e,r){var a=t.createShader(e);if(t.shaderSource(a,r),t.compileShader(a),!t.getShaderParameter(a,t.COMPILE_STATUS)){var o=t.getShaderInfoLog(a);try{var s=i(o,r,e)}catch(t){throw console.warn("Failed to format compiler error: "+t),new n(o,"Error compiling shader:\n"+o)}throw new n(o,s.short,s.long)}return a}(r,t,e);l=a[e]=new s(o++,e,t,c,[],1,this)}return l},c.getProgram=function(t,e,r,i){var a=[t.id,e.id,r.join(":"),i.join(":")].join("@"),o=this.programs[a];return o&&this.gl.isProgram(o)||(this.programs[a]=o=function(t,e,r,i,a){var o=t.createProgram();t.attachShader(o,e),t.attachShader(o,r);for(var s=0;s<i.length;++s)t.bindAttribLocation(o,a[s],i[s]);if(t.linkProgram(o),!t.getProgramParameter(o,t.LINK_STATUS)){var l=t.getProgramInfoLog(o);throw new n(l,"Error linking program: "+l)}return o}(this.gl,t.shader,e.shader,r,i),t.programs.push(a),e.programs.push(a)),o}},{"./GLError":288,"gl-format-compiler-error":240,"weakmap-shim":520}],294:[function(t,e,r){"use strict";function n(t){this.plot=t,this.enable=[!0,!0,!1,!1],this.width=[1,1,1,1],this.color=[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.center=[1/0,1/0]}e.exports=function(t,e){var r=new n(t);return r.update(e),t.addOverlay(r),r};var i=n.prototype;i.update=function(t){t=t||{},this.enable=(t.enable||[!0,!0,!1,!1]).slice(),this.width=(t.width||[1,1,1,1]).slice(),this.color=(t.color||[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]]).map(function(t){return t.slice()}),this.center=(t.center||[1/0,1/0]).slice(),this.plot.setOverlayDirty()},i.draw=function(){var t=this.enable,e=this.width,r=this.color,n=this.center,i=this.plot,a=i.line,o=i.dataBox,s=i.viewBox;if(a.bind(),o[0]<=n[0]&&n[0]<=o[2]&&o[1]<=n[1]&&n[1]<=o[3]){var l=s[0]+(n[0]-o[0])/(o[2]-o[0])*(s[2]-s[0]),c=s[1]+(n[1]-o[1])/(o[3]-o[1])*(s[3]-s[1]);t[0]&&a.drawLine(l,c,s[0],c,e[0],r[0]),t[1]&&a.drawLine(l,c,l,s[1],e[1],r[1]),t[2]&&a.drawLine(l,c,s[2],c,e[2],r[2]),t[3]&&a.drawLine(l,c,l,s[3],e[3],r[3])}},i.dispose=function(){this.plot.removeOverlay(this)}},{}],295:[function(t,e,r){"use strict";var n=t("glslify"),i=t("gl-shader"),a=n(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec3 position, color;\nattribute float weight;\n\nuniform mat4 model, view, projection;\nuniform vec3 coordinates[3];\nuniform vec4 colors[3];\nuniform vec2 screenShape;\nuniform float lineWidth;\n\nvarying vec4 fragColor;\n\nvoid main() {\n  vec3 vertexPosition = mix(coordinates[0],\n    mix(coordinates[2], coordinates[1], 0.5 * (position + 1.0)), abs(position));\n\n  vec4 clipPos = projection * view * model * vec4(vertexPosition, 1.0);\n  vec2 clipOffset = (projection * view * model * vec4(color, 0.0)).xy;\n  vec2 delta = weight * clipOffset * screenShape;\n  vec2 lineOffset = normalize(vec2(delta.y, -delta.x)) / screenShape;\n\n  gl_Position   = vec4(clipPos.xy + clipPos.w * 0.5 * lineWidth * lineOffset, clipPos.z, clipPos.w);\n  fragColor     = color.x * colors[0] + color.y * colors[1] + color.z * colors[2];\n}\n"]),o=n(["precision mediump float;\n#define GLSLIFY 1\n\nvarying vec4 fragColor;\n\nvoid main() {\n  gl_FragColor = fragColor;\n}"]);e.exports=function(t){return i(t,a,o,null,[{name:"position",type:"vec3"},{name:"color",type:"vec3"},{name:"weight",type:"float"}])}},{"gl-shader":287,glslify:377}],296:[function(t,e,r){"use strict";var n=t("gl-buffer"),i=t("gl-vao"),a=t("./shaders/index");e.exports=function(t,e){var r=[];function o(t,e,n,i,a,o){var s=[t,e,n,0,0,0,1];s[i+3]=1,s[i]=a,r.push.apply(r,s),s[6]=-1,r.push.apply(r,s),s[i]=o,r.push.apply(r,s),r.push.apply(r,s),s[6]=1,r.push.apply(r,s),s[i]=a,r.push.apply(r,s)}o(0,0,0,0,0,1),o(0,0,0,1,0,1),o(0,0,0,2,0,1),o(1,0,0,1,-1,1),o(1,0,0,2,-1,1),o(0,1,0,0,-1,1),o(0,1,0,2,-1,1),o(0,0,1,0,-1,1),o(0,0,1,1,-1,1);var l=n(t,r),c=i(t,[{type:t.FLOAT,buffer:l,size:3,offset:0,stride:28},{type:t.FLOAT,buffer:l,size:3,offset:12,stride:28},{type:t.FLOAT,buffer:l,size:1,offset:24,stride:28}]),u=a(t);u.attributes.position.location=0,u.attributes.color.location=1,u.attributes.weight.location=2;var h=new s(t,l,c,u);return h.update(e),h};var o=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function s(t,e,r,n){this.gl=t,this.buffer=e,this.vao=r,this.shader=n,this.pixelRatio=1,this.bounds=[[-1e3,-1e3,-1e3],[1e3,1e3,1e3]],this.position=[0,0,0],this.lineWidth=[2,2,2],this.colors=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.enabled=[!0,!0,!0],this.drawSides=[!0,!0,!0],this.axes=null}var l=s.prototype,c=[0,0,0],u=[0,0,0],h=[0,0];l.isTransparent=function(){return!1},l.drawTransparent=function(t){},l.draw=function(t){var e=this.gl,r=this.vao,n=this.shader;r.bind(),n.bind();var i,a=t.model||o,s=t.view||o,l=t.projection||o;this.axes&&(i=this.axes.lastCubeProps.axis);for(var f=c,p=u,d=0;d<3;++d)i&&i[d]<0?(f[d]=this.bounds[0][d],p[d]=this.bounds[1][d]):(f[d]=this.bounds[1][d],p[d]=this.bounds[0][d]);h[0]=e.drawingBufferWidth,h[1]=e.drawingBufferHeight,n.uniforms.model=a,n.uniforms.view=s,n.uniforms.projection=l,n.uniforms.coordinates=[this.position,f,p],n.uniforms.colors=this.colors,n.uniforms.screenShape=h;for(d=0;d<3;++d)n.uniforms.lineWidth=this.lineWidth[d]*this.pixelRatio,this.enabled[d]&&(r.draw(e.TRIANGLES,6,6*d),this.drawSides[d]&&r.draw(e.TRIANGLES,12,18+12*d));r.unbind()},l.update=function(t){t&&("bounds"in t&&(this.bounds=t.bounds),"position"in t&&(this.position=t.position),"lineWidth"in t&&(this.lineWidth=t.lineWidth),"colors"in t&&(this.colors=t.colors),"enabled"in t&&(this.enabled=t.enabled),"drawSides"in t&&(this.drawSides=t.drawSides))},l.dispose=function(){this.vao.dispose(),this.buffer.dispose(),this.shader.dispose()}},{"./shaders/index":295,"gl-buffer":230,"gl-vao":308}],297:[function(t,e,r){arguments[4][232][0].apply(r,arguments)},{barycentric:61,dup:232,"polytope-closest-point/lib/closest_point_2d.js":448}],298:[function(t,e,r){var n=t("glslify"),i=n(["precision mediump float;\n#define GLSLIFY 1\n\nfloat inverse(float m) {\n  return 1.0 / m;\n}\n\nmat2 inverse(mat2 m) {\n  return mat2(m[1][1],-m[0][1],\n             -m[1][0], m[0][0]) / (m[0][0]*m[1][1] - m[0][1]*m[1][0]);\n}\n\nmat3 inverse(mat3 m) {\n  float a00 = m[0][0], a01 = m[0][1], a02 = m[0][2];\n  float a10 = m[1][0], a11 = m[1][1], a12 = m[1][2];\n  float a20 = m[2][0], a21 = m[2][1], a22 = m[2][2];\n\n  float b01 = a22 * a11 - a12 * a21;\n  float b11 = -a22 * a10 + a12 * a20;\n  float b21 = a21 * a10 - a11 * a20;\n\n  float det = a00 * b01 + a01 * b11 + a02 * b21;\n\n  return mat3(b01, (-a22 * a01 + a02 * a21), (a12 * a01 - a02 * a11),\n              b11, (a22 * a00 - a02 * a20), (-a12 * a00 + a02 * a10),\n              b21, (-a21 * a00 + a01 * a20), (a11 * a00 - a01 * a10)) / det;\n}\n\nmat4 inverse(mat4 m) {\n  float\n      a00 = m[0][0], a01 = m[0][1], a02 = m[0][2], a03 = m[0][3],\n      a10 = m[1][0], a11 = m[1][1], a12 = m[1][2], a13 = m[1][3],\n      a20 = m[2][0], a21 = m[2][1], a22 = m[2][2], a23 = m[2][3],\n      a30 = m[3][0], a31 = m[3][1], a32 = m[3][2], a33 = m[3][3],\n\n      b00 = a00 * a11 - a01 * a10,\n      b01 = a00 * a12 - a02 * a10,\n      b02 = a00 * a13 - a03 * a10,\n      b03 = a01 * a12 - a02 * a11,\n      b04 = a01 * a13 - a03 * a11,\n      b05 = a02 * a13 - a03 * a12,\n      b06 = a20 * a31 - a21 * a30,\n      b07 = a20 * a32 - a22 * a30,\n      b08 = a20 * a33 - a23 * a30,\n      b09 = a21 * a32 - a22 * a31,\n      b10 = a21 * a33 - a23 * a31,\n      b11 = a22 * a33 - a23 * a32,\n\n      det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n\n  return mat4(\n      a11 * b11 - a12 * b10 + a13 * b09,\n      a02 * b10 - a01 * b11 - a03 * b09,\n      a31 * b05 - a32 * b04 + a33 * b03,\n      a22 * b04 - a21 * b05 - a23 * b03,\n      a12 * b08 - a10 * b11 - a13 * b07,\n      a00 * b11 - a02 * b08 + a03 * b07,\n      a32 * b02 - a30 * b05 - a33 * b01,\n      a20 * b05 - a22 * b02 + a23 * b01,\n      a10 * b10 - a11 * b08 + a13 * b06,\n      a01 * b08 - a00 * b10 - a03 * b06,\n      a30 * b04 - a31 * b02 + a33 * b00,\n      a21 * b02 - a20 * b04 - a23 * b00,\n      a11 * b07 - a10 * b09 - a12 * b06,\n      a00 * b09 - a01 * b07 + a02 * b06,\n      a31 * b01 - a30 * b03 - a32 * b00,\n      a20 * b03 - a21 * b01 + a22 * b00) / det;\n}\n\nvec3 getOrthogonalVector(vec3 v) {\n  // Return up-vector for only-z vector.\n  // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\n  // From the above if-statement we have ||a|| > 0  U  ||b|| > 0.\n  // Assign z = 0, x = -b, y = a:\n  // a*-b + b*a + c*0 = -ba + ba + 0 = 0\n  if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\n    return normalize(vec3(-v.y, v.x, 0.0));\n  } else {\n    return normalize(vec3(0.0, v.z, -v.y));\n  }\n}\n\n// Calculate the tube vertex and normal at the given index.\n//\n// The returned vertex is for a tube ring with its center at origin, radius of length(d), pointing in the direction of d.\n//\n// Each tube segment is made up of a ring of vertices.\n// These vertices are used to make up the triangles of the tube by connecting them together in the vertex array.\n// The indexes of tube segments run from 0 to 8.\n//\nvec3 getTubePosition(vec3 d, float index, out vec3 normal) {\n  float segmentCount = 8.0;\n\n  float angle = 2.0 * 3.14159 * (index / segmentCount);\n\n  vec3 u = getOrthogonalVector(d);\n  vec3 v = normalize(cross(u, d));\n\n  vec3 x = u * cos(angle) * length(d);\n  vec3 y = v * sin(angle) * length(d);\n  vec3 v3 = x + y;\n\n  normal = normalize(v3);\n\n  return v3;\n}\n\nattribute vec4 vector;\nattribute vec4 color, position;\nattribute vec2 uv;\nuniform float tubeScale;\n\nuniform mat4 model\n           , view\n           , projection;\nuniform vec3 eyePosition\n           , lightPosition;\n\nvarying vec3 f_normal\n           , f_lightDirection\n           , f_eyeDirection\n           , f_data;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n  // Scale the vector magnitude to stay constant with\n  // model & view changes.\n  vec3 normal;\n  vec4 tubePosition = model * vec4(position.xyz, 1.0) + vec4(getTubePosition(mat3(model) * (tubeScale * vector.w * normalize(vector.xyz)), position.w, normal), 0.0);\n  normal = normalize(normal * inverse(mat3(model)));\n\n  vec4 t_position  = view * tubePosition;\n  gl_Position      = projection * t_position;\n  f_color          = color;\n  f_normal         = normal;\n  f_data           = tubePosition.xyz;\n  f_eyeDirection   = eyePosition   - tubePosition.xyz;\n  f_lightDirection = lightPosition - tubePosition.xyz;\n  f_uv             = uv;\n}\n"]),a=n(["precision mediump float;\n#define GLSLIFY 1\n\nfloat beckmannDistribution(float x, float roughness) {\n  float NdotH = max(x, 0.0001);\n  float cos2Alpha = NdotH * NdotH;\n  float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\n  float roughness2 = roughness * roughness;\n  float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\n  return exp(tan2Alpha / roughness2) / denom;\n}\n\nfloat cookTorranceSpecular(\n  vec3 lightDirection,\n  vec3 viewDirection,\n  vec3 surfaceNormal,\n  float roughness,\n  float fresnel) {\n\n  float VdotN = max(dot(viewDirection, surfaceNormal), 0.0);\n  float LdotN = max(dot(lightDirection, surfaceNormal), 0.0);\n\n  //Half angle vector\n  vec3 H = normalize(lightDirection + viewDirection);\n\n  //Geometric term\n  float NdotH = max(dot(surfaceNormal, H), 0.0);\n  float VdotH = max(dot(viewDirection, H), 0.000001);\n  float LdotH = max(dot(lightDirection, H), 0.000001);\n  float G1 = (2.0 * NdotH * VdotN) / VdotH;\n  float G2 = (2.0 * NdotH * LdotN) / LdotH;\n  float G = min(1.0, min(G1, G2));\n  \n  //Distribution term\n  float D = beckmannDistribution(NdotH, roughness);\n\n  //Fresnel term\n  float F = pow(1.0 - VdotN, fresnel);\n\n  //Multiply terms and done\n  return  G * F * D / max(3.14159265 * VdotN, 0.000001);\n}\n\nuniform vec3 clipBounds[2];\nuniform float roughness\n            , fresnel\n            , kambient\n            , kdiffuse\n            , kspecular\n            , opacity;\nuniform sampler2D texture;\n\nvarying vec3 f_normal\n           , f_lightDirection\n           , f_eyeDirection\n           , f_data;\nvarying vec4 f_color;\nvarying vec2 f_uv;\n\nvoid main() {\n  vec3 N = normalize(f_normal);\n  vec3 L = normalize(f_lightDirection);\n  vec3 V = normalize(f_eyeDirection);\n  \n  if(!gl_FrontFacing) {\n    N = -N;\n  }\n\n  float specular = cookTorranceSpecular(L, V, N, roughness, fresnel);\n  float diffuse  = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\n\n  vec4 surfaceColor =  texture2D(texture, f_uv);\n  vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular,  1.0);\n\n  gl_FragColor = litColor * opacity;\n}"]),o=n(["precision mediump float;\n#define GLSLIFY 1\n\nvec3 getOrthogonalVector(vec3 v) {\n  // Return up-vector for only-z vector.\n  // Return ax + by + cz = 0, a point that lies on the plane that has v as a normal and that isn't (0,0,0).\n  // From the above if-statement we have ||a|| > 0  U  ||b|| > 0.\n  // Assign z = 0, x = -b, y = a:\n  // a*-b + b*a + c*0 = -ba + ba + 0 = 0\n  if (v.x*v.x > v.z*v.z || v.y*v.y > v.z*v.z) {\n    return normalize(vec3(-v.y, v.x, 0.0));\n  } else {\n    return normalize(vec3(0.0, v.z, -v.y));\n  }\n}\n\n// Calculate the tube vertex and normal at the given index.\n//\n// The returned vertex is for a tube ring with its center at origin, radius of length(d), pointing in the direction of d.\n//\n// Each tube segment is made up of a ring of vertices.\n// These vertices are used to make up the triangles of the tube by connecting them together in the vertex array.\n// The indexes of tube segments run from 0 to 8.\n//\nvec3 getTubePosition(vec3 d, float index, out vec3 normal) {\n  float segmentCount = 8.0;\n\n  float angle = 2.0 * 3.14159 * (index / segmentCount);\n\n  vec3 u = getOrthogonalVector(d);\n  vec3 v = normalize(cross(u, d));\n\n  vec3 x = u * cos(angle) * length(d);\n  vec3 y = v * sin(angle) * length(d);\n  vec3 v3 = x + y;\n\n  normal = normalize(v3);\n\n  return v3;\n}\n\nattribute vec4 vector;\nattribute vec4 position;\nattribute vec4 id;\n\nuniform mat4 model, view, projection;\nuniform float tubeScale;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n  vec3 normal;\n  vec4 tubePosition = model * vec4(position.xyz, 1.0) + vec4(getTubePosition(mat3(model) * (tubeScale * vector.w * normalize(vector.xyz)), position.w, normal), 0.0);\n  gl_Position = projection * view * tubePosition;\n  f_id        = id;\n  f_position  = position.xyz;\n}\n"]),s=n(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec3  clipBounds[2];\nuniform float pickId;\n\nvarying vec3 f_position;\nvarying vec4 f_id;\n\nvoid main() {\n  gl_FragColor = vec4(pickId, f_id.xyz);\n}"]);r.meshShader={vertex:i,fragment:a,attributes:[{name:"position",type:"vec4"},{name:"normal",type:"vec3"},{name:"color",type:"vec4"},{name:"uv",type:"vec2"},{name:"vector",type:"vec4"}]},r.pickShader={vertex:o,fragment:s,attributes:[{name:"position",type:"vec4"},{name:"id",type:"vec4"},{name:"vector",type:"vec4"}]}},{glslify:377}],299:[function(t,e,r){"use strict";var n=t("gl-shader"),i=t("gl-buffer"),a=t("gl-vao"),o=t("gl-texture2d"),s=t("normals"),l=t("gl-mat4/multiply"),c=t("gl-mat4/invert"),u=t("ndarray"),h=t("colormap"),f=t("simplicial-complex-contour"),p=t("typedarray-pool"),d=t("./shaders"),g=(t("./closest-point"),d.meshShader),m=d.pickShader,v=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1];function y(t,e,r,n,i,a,o,s,l,c,u,h,f,p,d,g,m,y,x,b,_,w,k,M,A,T,S,E){this.gl=t,this.cells=[],this.positions=[],this.intensity=[],this.texture=e,this.dirty=!0,this.triShader=r,this.lineShader=n,this.pointShader=i,this.pickShader=a,this.pointPickShader=o,this.contourShader=s,this.trianglePositions=l,this.triangleVectors=c,this.triangleColors=h,this.triangleNormals=p,this.triangleUVs=f,this.triangleIds=u,this.triangleVAO=d,this.triangleCount=0,this.lineWidth=1,this.edgePositions=g,this.edgeColors=y,this.edgeUVs=x,this.edgeIds=m,this.edgeVAO=b,this.edgeCount=0,this.pointPositions=_,this.pointColors=k,this.pointUVs=M,this.pointSizes=A,this.pointIds=w,this.pointVAO=T,this.pointCount=0,this.contourLineWidth=1,this.contourPositions=S,this.contourVAO=E,this.contourCount=0,this.contourColor=[0,0,0],this.contourEnable=!1,this.pickId=1,this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.lightPosition=[1e5,1e5,0],this.ambientLight=.8,this.diffuseLight=.8,this.specularLight=2,this.roughness=.5,this.fresnel=1.5,this.opacity=1,this.tubeScale=1,this._model=v,this._view=v,this._projection=v,this._resolution=[1,1]}var x=y.prototype;function b(t){var e=n(t,m.vertex,m.fragment,null,m.attributes);return e.attributes.position.location=0,e.attributes.id.location=1,e.attributes.vector.location=5,e}x.isOpaque=function(){return this.opacity>=1},x.isTransparent=function(){return this.opacity<1},x.pickSlots=1,x.setPickBase=function(t){this.pickId=t},x.highlight=function(t){if(t&&this.contourEnable){for(var e=f(this.cells,this.intensity,t.intensity),r=e.cells,n=e.vertexIds,i=e.vertexWeights,a=r.length,o=p.mallocFloat32(6*a),s=0,l=0;l<a;++l)for(var c=r[l],u=0;u<2;++u){var h=c[0];2===c.length&&(h=c[u]);for(var d=n[h][0],g=n[h][1],m=i[h],v=1-m,y=this.positions[d],x=this.positions[g],b=0;b<3;++b)o[s++]=m*y[b]+v*x[b]}this.contourCount=s/3|0,this.contourPositions.update(o.subarray(0,s)),p.free(o)}else this.contourCount=0},x.update=function(t){t=t||{};var e=this.gl;this.dirty=!0,"contourEnable"in t&&(this.contourEnable=t.contourEnable),"contourColor"in t&&(this.contourColor=t.contourColor),"lineWidth"in t&&(this.lineWidth=t.lineWidth),"lightPosition"in t&&(this.lightPosition=t.lightPosition),"opacity"in t&&(this.opacity=t.opacity),"ambient"in t&&(this.ambientLight=t.ambient),"diffuse"in t&&(this.diffuseLight=t.diffuse),"specular"in t&&(this.specularLight=t.specular),"roughness"in t&&(this.roughness=t.roughness),"fresnel"in t&&(this.fresnel=t.fresnel),t.texture?(this.texture.dispose(),this.texture=o(e,t.texture)):t.colormap&&(this.texture.shape=[256,256],this.texture.minFilter=e.LINEAR_MIPMAP_LINEAR,this.texture.magFilter=e.LINEAR,this.texture.setPixels(function(t){for(var e=h({colormap:t,nshades:256,format:"rgba"}),r=new Uint8Array(1024),n=0;n<256;++n){for(var i=e[n],a=0;a<3;++a)r[4*n+a]=i[a];r[4*n+3]=255*i[3]}return u(r,[256,256,4],[4,0,1])}(t.colormap)),this.texture.generateMipmap());var r=t.cells,n=t.positions,i=t.vectors;if(n&&r&&i){void 0!==t.tubeScale&&(this.tubeScale=t.tubeScale);var a=[],l=[],c=[],f=[],p=[],d=[],g=[],m=[],v=[],y=[],x=[],b=[],_=[],w=[],k=[];this.cells=r,this.positions=n,this.vectors=i;var M=t.vertexNormals,A=t.cellNormals,T=void 0===t.vertexNormalsEpsilon?1e-6:t.vertexNormalsEpsilon,S=void 0===t.faceNormalsEpsilon?1e-6:t.faceNormalsEpsilon;t.useFacetNormals&&!A&&(A=s.faceNormals(r,n,S)),A||M||(M=s.vertexNormals(r,n,T));var E=t.vertexColors,C=t.cellColors,L=t.meshColor||[1,1,1,1],z=t.vertexUVs,P=t.vertexIntensity,I=t.cellUVs,O=t.cellIntensity,D=1/0,R=-1/0;if(!z&&!I)if(P)if(t.vertexIntensityBounds)D=+t.vertexIntensityBounds[0],R=+t.vertexIntensityBounds[1];else for(var B=0;B<P.length;++B){var F=P[B];D=Math.min(D,F),R=Math.max(R,F)}else if(O)for(B=0;B<O.length;++B){F=O[B];D=Math.min(D,F),R=Math.max(R,F)}else for(B=0;B<n.length;++B){F=n[B][2];D=Math.min(D,F),R=Math.max(R,F)}this.intensity=P||(O?function(t,e,r){for(var n=new Array(e),i=0;i<e;++i)n[i]=0;var a=t.length;for(i=0;i<a;++i)for(var o=t[i],s=0;s<o.length;++s)n[o[s]]=r[i];return n}(r,n.length,O):function(t){for(var e=t.length,r=new Array(e),n=0;n<e;++n)r[n]=t[n][2];return r}(n));var N=t.pointSizes,j=t.pointSize||1;this.bounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]];for(B=0;B<n.length;++B)for(var V=n[B],U=0;U<3;++U)!isNaN(V[U])&&isFinite(V[U])&&(this.bounds[0][U]=Math.min(this.bounds[0][U],V[U]),this.bounds[1][U]=Math.max(this.bounds[1][U],V[U]));var q=0,H=0,G=0;t:for(B=0;B<r.length;++B){var W=r[B];switch(W.length){case 1:for(V=n[X=W[0]],U=0;U<3;++U)if(isNaN(V[U])||!isFinite(V[U]))continue t;x.push(V[0],V[1],V[2],V[3]),3===(Z=E?E[X]:C?C[B]:L).length?b.push(Z[0],Z[1],Z[2],1):b.push(Z[0],Z[1],Z[2],Z[3]),$=z?z[X]:P?[(P[X]-D)/(R-D),0]:I?I[B]:O?[(O[B]-D)/(R-D),0]:[(V[2]-D)/(R-D),0],_.push($[0],$[1]),N?w.push(N[X]):w.push(j),k.push(B),G+=1;break;case 2:for(U=0;U<2;++U){V=n[X=W[U]];for(var Y=0;Y<3;++Y)if(isNaN(V[Y])||!isFinite(V[Y]))continue t}for(U=0;U<2;++U){V=n[X=W[U]];g.push(V[0],V[1],V[2]),3===(Z=E?E[X]:C?C[B]:L).length?m.push(Z[0],Z[1],Z[2],1):m.push(Z[0],Z[1],Z[2],Z[3]),$=z?z[X]:P?[(P[X]-D)/(R-D),0]:I?I[B]:O?[(O[B]-D)/(R-D),0]:[(V[2]-D)/(R-D),0],v.push($[0],$[1]),y.push(B)}H+=1;break;case 3:for(U=0;U<3;++U)for(V=n[X=W[U]],Y=0;Y<3;++Y)if(isNaN(V[Y])||!isFinite(V[Y]))continue t;for(U=0;U<3;++U){var X;V=n[X=W[U]];a.push(V[0],V[1],V[2],V[3]);var Z,$,J,K=i[X];l.push(K[0],K[1],K[2],K[3]),3===(Z=E?E[X]:C?C[B]:L).length?c.push(Z[0],Z[1],Z[2],1):c.push(Z[0],Z[1],Z[2],Z[3]),$=z?z[X]:P?[(P[X]-D)/(R-D),0]:I?I[B]:O?[(O[B]-D)/(R-D),0]:[(V[2]-D)/(R-D),0],p.push($[0],$[1]),J=M?M[X]:A[B],f.push(J[0],J[1],J[2]),d.push(B)}q+=1}}this.pointCount=G,this.edgeCount=H,this.triangleCount=q,this.pointPositions.update(x),this.pointColors.update(b),this.pointUVs.update(_),this.pointSizes.update(w),this.pointIds.update(new Uint32Array(k)),this.edgePositions.update(g),this.edgeColors.update(m),this.edgeUVs.update(v),this.edgeIds.update(new Uint32Array(y)),this.trianglePositions.update(a),this.triangleVectors.update(l),this.triangleColors.update(c),this.triangleUVs.update(p),this.triangleNormals.update(f),this.triangleIds.update(new Uint32Array(d))}},x.drawTransparent=x.draw=function(t){t=t||{};for(var e=this.gl,r=t.model||v,n=t.view||v,i=t.projection||v,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);var s={model:r,view:n,projection:i,clipBounds:a,kambient:this.ambientLight,kdiffuse:this.diffuseLight,kspecular:this.specularLight,roughness:this.roughness,fresnel:this.fresnel,eyePosition:[0,0,0],lightPosition:[0,0,0],opacity:this.opacity,tubeScale:this.tubeScale,contourColor:this.contourColor,texture:0};this.texture.bind(0);var u=new Array(16);l(u,s.view,s.model),l(u,s.projection,u),c(u,u);for(o=0;o<3;++o)s.eyePosition[o]=u[12+o]/u[15];var h,f=u[15];for(o=0;o<3;++o)f+=this.lightPosition[o]*u[4*o+3];for(o=0;o<3;++o){for(var p=u[12+o],d=0;d<3;++d)p+=u[4*d+o]*this.lightPosition[d];s.lightPosition[o]=p/f}this.triangleCount>0&&((h=this.triShader).bind(),h.uniforms=s,this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind());this.edgeCount>0&&this.lineWidth>0&&((h=this.lineShader).bind(),h.uniforms=s,this.edgeVAO.bind(),e.lineWidth(this.lineWidth),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind());this.pointCount>0&&((h=this.pointShader).bind(),h.uniforms=s,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind());this.contourEnable&&this.contourCount>0&&this.contourLineWidth>0&&((h=this.contourShader).bind(),h.uniforms=s,this.contourVAO.bind(),e.drawArrays(e.LINES,0,this.contourCount),this.contourVAO.unbind())},x.drawPick=function(t){t=t||{};for(var e=this.gl,r=t.model||v,n=t.view||v,i=t.projection||v,a=[[-1e6,-1e6,-1e6],[1e6,1e6,1e6]],o=0;o<3;++o)a[0][o]=Math.max(a[0][o],this.clipBounds[0][o]),a[1][o]=Math.min(a[1][o],this.clipBounds[1][o]);this._model=[].slice.call(r),this._view=[].slice.call(n),this._projection=[].slice.call(i),this._resolution=[e.drawingBufferWidth,e.drawingBufferHeight];var s,l={model:r,view:n,projection:i,clipBounds:a,tubeScale:this.tubeScale,pickId:this.pickId/255};((s=this.pickShader).bind(),s.uniforms=l,this.triangleCount>0&&(this.triangleVAO.bind(),e.drawArrays(e.TRIANGLES,0,3*this.triangleCount),this.triangleVAO.unbind()),this.edgeCount>0&&(this.edgeVAO.bind(),e.lineWidth(this.lineWidth),e.drawArrays(e.LINES,0,2*this.edgeCount),this.edgeVAO.unbind()),this.pointCount>0)&&((s=this.pointPickShader).bind(),s.uniforms=l,this.pointVAO.bind(),e.drawArrays(e.POINTS,0,this.pointCount),this.pointVAO.unbind())},x.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;var e=t.value[0]+256*t.value[1]+65536*t.value[2],r=this.cells[e],n=this.positions[r[1]].slice(0,3);return{index:e,position:n,intensity:this.intensity[r[1]],velocity:this.vectors[r[1]].slice(0,3),divergence:this.vectors[r[1]][3],dataCoordinate:n}},x.dispose=function(){this.texture.dispose(),this.triShader.dispose(),this.pickShader.dispose(),this.triangleVAO.dispose(),this.trianglePositions.dispose(),this.triangleVectors.dispose(),this.triangleColors.dispose(),this.triangleUVs.dispose(),this.triangleNormals.dispose(),this.triangleIds.dispose(),this.edgeVAO.dispose(),this.edgePositions.dispose(),this.edgeColors.dispose(),this.edgeUVs.dispose(),this.edgeIds.dispose(),this.pointVAO.dispose(),this.pointPositions.dispose(),this.pointColors.dispose(),this.pointUVs.dispose(),this.pointSizes.dispose(),this.pointIds.dispose(),this.contourVAO.dispose(),this.contourPositions.dispose()},e.exports=function(t,e){1===arguments.length&&(t=(e=t).gl);var r=e.triShader||function(t){var e=n(t,g.vertex,g.fragment,null,g.attributes);return e.attributes.position.location=0,e.attributes.color.location=2,e.attributes.uv.location=3,e.attributes.vector.location=5,e}(t),s=b(t),l=o(t,u(new Uint8Array([255,255,255,255]),[1,1,4]));l.generateMipmap(),l.minFilter=t.LINEAR_MIPMAP_LINEAR,l.magFilter=t.LINEAR;var c=i(t),h=i(t),f=i(t),p=i(t),d=i(t),m=i(t),v=a(t,[{buffer:c,type:t.FLOAT,size:4},{buffer:m,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:f,type:t.FLOAT,size:4},{buffer:p,type:t.FLOAT,size:2},{buffer:d,type:t.FLOAT,size:3},{buffer:h,type:t.FLOAT,size:4}]),x=i(t),_=i(t),w=i(t),k=i(t),M=a(t,[{buffer:x,type:t.FLOAT,size:3},{buffer:k,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:_,type:t.FLOAT,size:4},{buffer:w,type:t.FLOAT,size:2}]),A=i(t),T=i(t),S=i(t),E=i(t),C=i(t),L=a(t,[{buffer:A,type:t.FLOAT,size:3},{buffer:C,type:t.UNSIGNED_BYTE,size:4,normalized:!0},{buffer:T,type:t.FLOAT,size:4},{buffer:S,type:t.FLOAT,size:2},{buffer:E,type:t.FLOAT,size:1}]),z=i(t),P=new y(t,l,r,null,null,s,null,null,c,h,m,f,p,d,v,x,k,_,w,M,A,C,T,S,E,L,z,a(t,[{buffer:z,type:t.FLOAT,size:3}]));return P.update(e),P}},{"./closest-point":297,"./shaders":298,colormap:113,"gl-buffer":230,"gl-mat4/invert":254,"gl-mat4/multiply":256,"gl-shader":287,"gl-texture2d":303,"gl-vao":308,ndarray:417,normals:420,"simplicial-complex-contour":479,"typedarray-pool":507}],300:[function(t,e,r){"use strict";var n=t("gl-vec3"),i=t("gl-vec4"),a=function(t,e,r,a){for(var o=0,s=0;s<t.length;s++)for(var l=t[s].velocities,c=0;c<l.length;c++){var u=n.length(l[c]);u>o&&(o=u)}var h=t.map(function(t){return function(t,e,r,a){var o,s,l,c=t.points,u=t.velocities,h=t.divergences;n.set(n.create(),0,1,0),n.create(),n.create();n.create();for(var f=[],p=[],d=[],g=[],m=[],v=[],y=0,x=0,b=i.create(),_=i.create(),w=0;w<c.length;w++){o=c[w],s=u[w],l=h[w],0===e&&(l=.05*r),x=n.length(s)/a,b=i.create(),n.copy(b,s),b[3]=l;for(var k=0;k<8;k++)m[k]=[o[0],o[1],o[2],k];if(g.length>0)for(k=0;k<8;k++){var M=(k+1)%8;f.push(g[k],m[k],m[M],m[M],g[M],g[k]),d.push(_,b,b,b,_,_),v.push(y,x,x,x,y,y),p.push([f.length-6,f.length-5,f.length-4],[f.length-3,f.length-2,f.length-1])}var A=g;g=m,m=A,A=_,_=b,b=A,A=y,y=x,x=A}return{positions:f,cells:p,vectors:d,vertexIntensity:v}}(t,r,a,o)}),f=[],p=[],d=[],g=[];for(s=0;s<h.length;s++){var m=h[s],v=f.length;f=f.concat(m.positions),d=d.concat(m.vectors),g=g.concat(m.vertexIntensity);for(c=0;c<m.cells.length;c++){var y=m.cells[c],x=[];p.push(x);for(var b=0;b<y.length;b++)x.push(y[b]+v)}}return{positions:f,cells:p,vectors:d,vertexIntensity:g,colormap:e}},o=function(t,e){var r=n.create(),i=1e-4;n.add(r,t,[i,0,0]);var a=this.getVelocity(r);n.subtract(a,a,e),n.scale(a,a,1e4),n.add(r,t,[0,i,0]);var o=this.getVelocity(r);n.subtract(o,o,e),n.scale(o,o,1e4),n.add(r,t,[0,0,i]);var s=this.getVelocity(r);return n.subtract(s,s,e),n.scale(s,s,1e4),n.add(r,a,o),n.add(r,r,s),r},s=function(t){return f(t,this.vectors,this.meshgrid,this.clampBorders)},l=function(t,e){for(var r=0;r<t.length;r++){var n=t[r];if(n===e)return r;if(n>e)return r-1}return r},c=n.create(),u=n.create(),h=function(t,e,r){return t<e?e:t>r?r:t},f=function(t,e,r,i){var a=t[0],o=t[1],s=t[2],f=r[0].length,p=r[1].length,d=r[2].length,g=l(r[0],a),m=l(r[1],o),v=l(r[2],s),y=g+1,x=m+1,b=v+1;if(r[0][g]===a&&(y=g),r[1][m]===o&&(x=m),r[2][v]===s&&(b=v),i&&(g=h(g,0,f-1),y=h(y,0,f-1),m=h(m,0,p-1),x=h(x,0,p-1),v=h(v,0,d-1),b=h(b,0,d-1)),g<0||m<0||v<0||y>=f||x>=p||b>=d)return n.create();var _=(a-r[0][g])/(r[0][y]-r[0][g]),w=(o-r[1][m])/(r[1][x]-r[1][m]),k=(s-r[2][v])/(r[2][b]-r[2][v]);(_<0||_>1||isNaN(_))&&(_=0),(w<0||w>1||isNaN(w))&&(w=0),(k<0||k>1||isNaN(k))&&(k=0);var M=v*f*p,A=b*f*p,T=m*f,S=x*f,E=g,C=y,L=e[T+M+E],z=e[T+M+C],P=e[S+M+E],I=e[S+M+C],O=e[T+A+E],D=e[T+A+C],R=e[S+A+E],B=e[S+A+C],F=n.create();return n.lerp(F,L,z,_),n.lerp(c,P,I,_),n.lerp(F,F,c,w),n.lerp(c,O,D,_),n.lerp(u,R,B,_),n.lerp(c,c,u,w),n.lerp(F,F,c,k),F},p=function(t){var e=1/0;t.sort(function(t,e){return t-e});for(var r=1;r<t.length;r++){var n=Math.abs(t[r]-t[r-1]);n<e&&(e=n)}return e};e.exports=function(t,e){var r=t.startingPositions,i=t.maxLength||1e3,l=t.tubeSize||1,c=t.absoluteTubeSize;t.getDivergence||(t.getDivergence=o),t.getVelocity||(t.getVelocity=s),void 0===t.clampBorders&&(t.clampBorders=!0);var u=[],h=e[0][0],f=e[0][1],d=e[0][2],g=e[1][0],m=e[1][1],v=e[1][2],y=function(t,e){var r=e[0],n=e[1],i=e[2];return r>=h&&r<=g&&n>=f&&n<=m&&i>=d&&i<=v},x=10*n.distance(e[0],e[1])/i,b=x*x,_=1,w=0;n.create();r.length>=2&&(_=function(t){for(var e=[],r=[],n=[],i={},a={},o={},s=0;s<t.length;s++){var l=t[s],c=l[0],u=l[1],h=l[2];i[c]||(e.push(c),i[c]=!0),a[u]||(r.push(u),a[u]=!0),o[h]||(n.push(h),o[h]=!0)}var f=p(e),d=p(r),g=p(n),m=Math.min(f,d,g);return isFinite(m)?m:1}(r));for(var k=0;k<r.length;k++){var M=n.create();n.copy(M,r[k]);var A=[M],T=[],S=t.getVelocity(M),E=M;T.push(S);var C=[],L=t.getDivergence(M,S);(O=n.length(L))>w&&!isNaN(O)&&isFinite(O)&&(w=O),C.push(O),u.push({points:A,velocities:T,divergences:C});for(var z=0;z<100*i&&A.length<i&&y(0,M);){z++;var P=n.clone(S),I=n.squaredLength(P);if(0===I)break;if(I>b&&n.scale(P,P,x/Math.sqrt(I)),n.add(P,P,M),S=t.getVelocity(P),n.squaredDistance(E,P)-b>-1e-4*b){A.push(P),E=P,T.push(S);L=t.getDivergence(P,S);(O=n.length(L))>w&&!isNaN(O)&&isFinite(O)&&(w=O),C.push(O)}M=P}}for(k=0;k<C.length;k++){var O=C[k];!isNaN(O)&&isFinite(O)||(C[k]=w)}var D=a(u,t.colormap,w,_);return c?D.tubeScale=c:(0===w&&(w=1),D.tubeScale=.5*l*_/w),D},e.exports.createTubeMesh=t("./lib/tubemesh")},{"./lib/tubemesh":299,"gl-vec3":320,"gl-vec4":350}],301:[function(t,e,r){var n=t("gl-shader"),i=t("glslify"),a=i(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec4 uv;\nattribute vec3 f;\nattribute vec3 normal;\n\nuniform mat4 model, view, projection, inverseModel;\nuniform vec3 lightPosition, eyePosition;\nuniform sampler2D colormap;\n\nvarying float value, kill;\nvarying vec3 worldCoordinate;\nvarying vec2 planeCoordinate;\nvarying vec3 lightDirection, eyeDirection, surfaceNormal;\nvarying vec4 vColor;\n\nvoid main() {\n  worldCoordinate = vec3(uv.zw, f.x);\n  vec4 worldPosition = model * vec4(worldCoordinate, 1.0);\n  vec4 clipPosition = projection * view * worldPosition;\n  gl_Position = clipPosition;\n  kill = f.y;\n  value = f.z;\n  planeCoordinate = uv.xy;\n\n  vColor = texture2D(colormap, vec2(value, value));\n\n  //Lighting geometry parameters\n  vec4 cameraCoordinate = view * worldPosition;\n  cameraCoordinate.xyz /= cameraCoordinate.w;\n  lightDirection = lightPosition - cameraCoordinate.xyz;\n  eyeDirection   = eyePosition - cameraCoordinate.xyz;\n  surfaceNormal  = normalize((vec4(normal,0) * inverseModel).xyz);\n}\n"]),o=i(["precision mediump float;\n#define GLSLIFY 1\n\nfloat beckmannDistribution(float x, float roughness) {\n  float NdotH = max(x, 0.0001);\n  float cos2Alpha = NdotH * NdotH;\n  float tan2Alpha = (cos2Alpha - 1.0) / cos2Alpha;\n  float roughness2 = roughness * roughness;\n  float denom = 3.141592653589793 * roughness2 * cos2Alpha * cos2Alpha;\n  return exp(tan2Alpha / roughness2) / denom;\n}\n\nfloat beckmannSpecular(\n  vec3 lightDirection,\n  vec3 viewDirection,\n  vec3 surfaceNormal,\n  float roughness) {\n  return beckmannDistribution(dot(surfaceNormal, normalize(lightDirection + viewDirection)), roughness);\n}\n\nuniform vec3 lowerBound, upperBound;\nuniform float contourTint;\nuniform vec4 contourColor;\nuniform sampler2D colormap;\nuniform vec3 clipBounds[2];\nuniform float roughness, fresnel, kambient, kdiffuse, kspecular, opacity;\nuniform float vertexColor;\n\nvarying float value, kill;\nvarying vec3 worldCoordinate;\nvarying vec3 lightDirection, eyeDirection, surfaceNormal;\nvarying vec4 vColor;\n\nvoid main() {\n  if (kill > 0.0 ||\n    any(lessThan(worldCoordinate, clipBounds[0])) || any(greaterThan(worldCoordinate, clipBounds[1]))) {\n    discard;\n  }\n\n  vec3 N = normalize(surfaceNormal);\n  vec3 V = normalize(eyeDirection);\n  vec3 L = normalize(lightDirection);\n\n  if(gl_FrontFacing) {\n    N = -N;\n  }\n\n  float specular = max(beckmannSpecular(L, V, N, roughness), 0.);\n  float diffuse  = min(kambient + kdiffuse * max(dot(N, L), 0.0), 1.0);\n\n  //decide how to interpolate color \u2014 in vertex or in fragment\n  vec4 surfaceColor = step(vertexColor, .5) * texture2D(colormap, vec2(value, value)) + step(.5, vertexColor) * vColor;\n\n  vec4 litColor = surfaceColor.a * vec4(diffuse * surfaceColor.rgb + kspecular * vec3(1,1,1) * specular,  1.0);\n\n  gl_FragColor = mix(litColor, contourColor, contourTint) * opacity;\n}\n"]),s=i(["precision mediump float;\n#define GLSLIFY 1\n\nattribute vec4 uv;\nattribute float f;\n\nuniform mat3 permutation;\nuniform mat4 model, view, projection;\nuniform float height, zOffset;\nuniform sampler2D colormap;\n\nvarying float value, kill;\nvarying vec3 worldCoordinate;\nvarying vec2 planeCoordinate;\nvarying vec3 lightDirection, eyeDirection, surfaceNormal;\nvarying vec4 vColor;\n\nvoid main() {\n  vec3 dataCoordinate = permutation * vec3(uv.xy, height);\n  vec4 worldPosition = model * vec4(dataCoordinate, 1.0);\n\n  vec4 clipPosition = projection * view * worldPosition;\n  clipPosition.z = clipPosition.z + zOffset;\n\n  gl_Position = clipPosition;\n  value = f;\n  kill = -1.0;\n  worldCoordinate = dataCoordinate;\n  planeCoordinate = uv.zw;\n\n  vColor = texture2D(colormap, vec2(value, value));\n\n  //Don't do lighting for contours\n  surfaceNormal   = vec3(1,0,0);\n  eyeDirection    = vec3(0,1,0);\n  lightDirection  = vec3(0,0,1);\n}\n"]),l=i(["precision mediump float;\n#define GLSLIFY 1\n\nuniform vec2 shape;\nuniform vec3 clipBounds[2];\nuniform float pickId;\n\nvarying float value, kill;\nvarying vec3 worldCoordinate;\nvarying vec2 planeCoordinate;\nvarying vec3 surfaceNormal;\n\nvec2 splitFloat(float v) {\n  float vh = 255.0 * v;\n  float upper = floor(vh);\n  float lower = fract(vh);\n  return vec2(upper / 255.0, floor(lower * 16.0) / 16.0);\n}\n\nvoid main() {\n  if(kill > 0.0 ||\n    any(lessThan(worldCoordinate, clipBounds[0])) || any(greaterThan(worldCoordinate, clipBounds[1]))) {\n    discard;\n  }\n  vec2 ux = splitFloat(planeCoordinate.x / shape.x);\n  vec2 uy = splitFloat(planeCoordinate.y / shape.y);\n  gl_FragColor = vec4(pickId, ux.x, uy.x, ux.y + (uy.y/16.0));\n}\n"]);r.createShader=function(t){var e=n(t,a,o,null,[{name:"uv",type:"vec4"},{name:"f",type:"vec3"},{name:"normal",type:"vec3"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e.attributes.normal.location=2,e},r.createPickShader=function(t){var e=n(t,a,l,null,[{name:"uv",type:"vec4"},{name:"f",type:"vec3"},{name:"normal",type:"vec3"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e.attributes.normal.location=2,e},r.createContourShader=function(t){var e=n(t,s,o,null,[{name:"uv",type:"vec4"},{name:"f",type:"float"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e},r.createPickContourShader=function(t){var e=n(t,s,l,null,[{name:"uv",type:"vec4"},{name:"f",type:"float"}]);return e.attributes.uv.location=0,e.attributes.f.location=1,e}},{"gl-shader":287,glslify:377}],302:[function(t,e,r){"use strict";e.exports=function(t){var e=t.gl,r=y(e),n=b(e),s=x(e),l=_(e),c=i(e),u=a(e,[{buffer:c,size:4,stride:w,offset:0},{buffer:c,size:3,stride:w,offset:16},{buffer:c,size:3,stride:w,offset:28}]),h=i(e),f=a(e,[{buffer:h,size:4,stride:20,offset:0},{buffer:h,size:1,stride:20,offset:16}]),p=i(e),d=a(e,[{buffer:p,size:2,type:e.FLOAT}]),g=o(e,1,S,e.RGBA,e.UNSIGNED_BYTE);g.minFilter=e.LINEAR,g.magFilter=e.LINEAR;var m=new E(e,[0,0],[[0,0,0],[0,0,0]],r,n,c,u,g,s,l,h,f,p,d),v={levels:[[],[],[]]};for(var k in t)v[k]=t[k];return v.colormap=v.colormap||"jet",m.update(v),m};var n=t("bit-twiddle"),i=t("gl-buffer"),a=t("gl-vao"),o=t("gl-texture2d"),s=t("typedarray-pool"),l=t("colormap"),c=t("ndarray-ops"),u=t("ndarray-pack"),h=t("ndarray"),f=t("surface-nets"),p=t("gl-mat4/multiply"),d=t("gl-mat4/invert"),g=t("binary-search-bounds"),m=t("ndarray-gradient"),v=t("./lib/shaders"),y=v.createShader,x=v.createContourShader,b=v.createPickShader,_=v.createPickContourShader,w=40,k=[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1],M=[[0,0],[0,1],[1,0],[1,1],[1,0],[0,1]],A=[[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0],[0,0,0,0,0,0,0,0,0]];function T(t,e,r,n,i){this.position=t,this.index=e,this.uv=r,this.level=n,this.dataCoordinate=i}!function(){for(var t=0;t<3;++t){var e=A[t],r=(t+2)%3;e[(t+1)%3+0]=1,e[r+3]=1,e[t+6]=1}}();var S=256;function E(t,e,r,n,i,a,o,l,c,u,f,p,d,g){this.gl=t,this.shape=e,this.bounds=r,this.intensityBounds=[],this._shader=n,this._pickShader=i,this._coordinateBuffer=a,this._vao=o,this._colorMap=l,this._contourShader=c,this._contourPickShader=u,this._contourBuffer=f,this._contourVAO=p,this._contourOffsets=[[],[],[]],this._contourCounts=[[],[],[]],this._vertexCount=0,this._pickResult=new T([0,0,0],[0,0],[0,0],[0,0,0],[0,0,0]),this._dynamicBuffer=d,this._dynamicVAO=g,this._dynamicOffsets=[0,0,0],this._dynamicCounts=[0,0,0],this.contourWidth=[1,1,1],this.contourLevels=[[1],[1],[1]],this.contourTint=[0,0,0],this.contourColor=[[.5,.5,.5,1],[.5,.5,.5,1],[.5,.5,.5,1]],this.showContour=!0,this.showSurface=!0,this.enableHighlight=[!0,!0,!0],this.highlightColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.highlightTint=[1,1,1],this.highlightLevel=[-1,-1,-1],this.enableDynamic=[!0,!0,!0],this.dynamicLevel=[NaN,NaN,NaN],this.dynamicColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.dynamicTint=[1,1,1],this.dynamicWidth=[1,1,1],this.axesBounds=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]],this.surfaceProject=[!1,!1,!1],this.contourProject=[[!1,!1,!1],[!1,!1,!1],[!1,!1,!1]],this.colorBounds=[!1,!1],this._field=[h(s.mallocFloat(1024),[0,0]),h(s.mallocFloat(1024),[0,0]),h(s.mallocFloat(1024),[0,0])],this.pickId=1,this.clipBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.snapToData=!1,this.opacity=1,this.lightPosition=[10,1e4,0],this.ambientLight=.8,this.diffuseLight=.8,this.specularLight=2,this.roughness=.5,this.fresnel=1.5,this.vertexColor=0,this.dirty=!0}var C=E.prototype;C.isTransparent=function(){return this.opacity<1},C.isOpaque=function(){if(this.opacity>=1)return!0;for(var t=0;t<3;++t)if(this._contourCounts[t].length>0||this._dynamicCounts[t]>0)return!0;return!1},C.pickSlots=1,C.setPickBase=function(t){this.pickId=t};var L=[0,0,0],z={showSurface:!1,showContour:!1,projections:[k.slice(),k.slice(),k.slice()],clipBounds:[[[0,0,0],[0,0,0]],[[0,0,0],[0,0,0]],[[0,0,0],[0,0,0]]]};function P(t,e){var r,n,i,a=e.axes&&e.axes.lastCubeProps.axis||L,o=e.showSurface,s=e.showContour;for(r=0;r<3;++r)for(o=o||e.surfaceProject[r],n=0;n<3;++n)s=s||e.contourProject[r][n];for(r=0;r<3;++r){var l=z.projections[r];for(n=0;n<16;++n)l[n]=0;for(n=0;n<4;++n)l[5*n]=1;l[5*r]=0,l[12+r]=e.axesBounds[+(a[r]>0)][r],p(l,t.model,l);var c=z.clipBounds[r];for(i=0;i<2;++i)for(n=0;n<3;++n)c[i][n]=t.clipBounds[i][n];c[0][r]=-1e8,c[1][r]=1e8}return z.showSurface=o,z.showContour=s,z}var I={model:k,view:k,projection:k,inverseModel:k.slice(),lowerBound:[0,0,0],upperBound:[0,0,0],colorMap:0,clipBounds:[[0,0,0],[0,0,0]],height:0,contourTint:0,contourColor:[0,0,0,1],permutation:[1,0,0,0,1,0,0,0,1],zOffset:-1e-4,kambient:1,kdiffuse:1,kspecular:1,lightPosition:[1e3,1e3,1e3],eyePosition:[0,0,0],roughness:1,fresnel:1,opacity:1,vertexColor:0},O=k.slice(),D=[1,0,0,0,1,0,0,0,1];function R(t,e){t=t||{};var r=this.gl;r.disable(r.CULL_FACE),this._colorMap.bind(0);var n=I;n.model=t.model||k,n.view=t.view||k,n.projection=t.projection||k,n.lowerBound=[this.bounds[0][0],this.bounds[0][1],this.colorBounds[0]||this.bounds[0][2]],n.upperBound=[this.bounds[1][0],this.bounds[1][1],this.colorBounds[1]||this.bounds[1][2]],n.contourColor=this.contourColor[0],n.inverseModel=d(n.inverseModel,n.model);for(var i=0;i<2;++i)for(var a=n.clipBounds[i],o=0;o<3;++o)a[o]=Math.min(Math.max(this.clipBounds[i][o],-1e8),1e8);n.kambient=this.ambientLight,n.kdiffuse=this.diffuseLight,n.kspecular=this.specularLight,n.roughness=this.roughness,n.fresnel=this.fresnel,n.opacity=this.opacity,n.height=0,n.permutation=D,n.vertexColor=this.vertexColor;var s=O;for(p(s,n.view,n.model),p(s,n.projection,s),d(s,s),i=0;i<3;++i)n.eyePosition[i]=s[12+i]/s[15];var l=s[15];for(i=0;i<3;++i)l+=this.lightPosition[i]*s[4*i+3];for(i=0;i<3;++i){var c=s[12+i];for(o=0;o<3;++o)c+=s[4*o+i]*this.lightPosition[o];n.lightPosition[i]=c/l}var u=P(n,this);if(u.showSurface&&e===this.opacity<1){for(this._shader.bind(),this._shader.uniforms=n,this._vao.bind(),this.showSurface&&this._vertexCount&&this._vao.draw(r.TRIANGLES,this._vertexCount),i=0;i<3;++i)this.surfaceProject[i]&&this.vertexCount&&(this._shader.uniforms.model=u.projections[i],this._shader.uniforms.clipBounds=u.clipBounds[i],this._vao.draw(r.TRIANGLES,this._vertexCount));this._vao.unbind()}if(u.showContour&&!e){var h=this._contourShader;n.kambient=1,n.kdiffuse=0,n.kspecular=0,n.opacity=1,h.bind(),h.uniforms=n;var f=this._contourVAO;for(f.bind(),i=0;i<3;++i)for(h.uniforms.permutation=A[i],r.lineWidth(this.contourWidth[i]),o=0;o<this.contourLevels[i].length;++o)o===this.highlightLevel[i]?(h.uniforms.contourColor=this.highlightColor[i],h.uniforms.contourTint=this.highlightTint[i]):0!==o&&o-1!==this.highlightLevel[i]||(h.uniforms.contourColor=this.contourColor[i],h.uniforms.contourTint=this.contourTint[i]),this._contourCounts[i][o]&&(h.uniforms.height=this.contourLevels[i][o],f.draw(r.LINES,this._contourCounts[i][o],this._contourOffsets[i][o]));for(i=0;i<3;++i)for(h.uniforms.model=u.projections[i],h.uniforms.clipBounds=u.clipBounds[i],o=0;o<3;++o)if(this.contourProject[i][o]){h.uniforms.permutation=A[o],r.lineWidth(this.contourWidth[o]);for(var g=0;g<this.contourLevels[o].length;++g)g===this.highlightLevel[o]?(h.uniforms.contourColor=this.highlightColor[o],h.uniforms.contourTint=this.highlightTint[o]):0!==g&&g-1!==this.highlightLevel[o]||(h.uniforms.contourColor=this.contourColor[o],h.uniforms.contourTint=this.contourTint[o]),h.uniforms.height=this.contourLevels[o][g],f.draw(r.LINES,this._contourCounts[o][g],this._contourOffsets[o][g])}for(f.unbind(),(f=this._dynamicVAO).bind(),i=0;i<3;++i)if(0!==this._dynamicCounts[i])for(h.uniforms.model=n.model,h.uniforms.clipBounds=n.clipBounds,h.uniforms.permutation=A[i],r.lineWidth(this.dynamicWidth[i]),h.uniforms.contourColor=this.dynamicColor[i],h.uniforms.contourTint=this.dynamicTint[i],h.uniforms.height=this.dynamicLevel[i],f.draw(r.LINES,this._dynamicCounts[i],this._dynamicOffsets[i]),o=0;o<3;++o)this.contourProject[o][i]&&(h.uniforms.model=u.projections[o],h.uniforms.clipBounds=u.clipBounds[o],f.draw(r.LINES,this._dynamicCounts[i],this._dynamicOffsets[i]));f.unbind()}}C.draw=function(t){return R.call(this,t,!1)},C.drawTransparent=function(t){return R.call(this,t,!0)};var B={model:k,view:k,projection:k,inverseModel:k,clipBounds:[[0,0,0],[0,0,0]],height:0,shape:[0,0],pickId:0,lowerBound:[0,0,0],upperBound:[0,0,0],zOffset:0,permutation:[1,0,0,0,1,0,0,0,1],lightPosition:[0,0,0],eyePosition:[0,0,0]};function F(t,e){var r=e.shape.slice(),n=t.shape.slice();c.assign(t.lo(1,1).hi(r[0],r[1]),e),c.assign(t.lo(1).hi(r[0],1),e.hi(r[0],1)),c.assign(t.lo(1,n[1]-1).hi(r[0],1),e.lo(0,r[1]-1).hi(r[0],1)),c.assign(t.lo(0,1).hi(1,r[1]),e.hi(1)),c.assign(t.lo(n[0]-1,1).hi(1,r[1]),e.lo(r[0]-1)),t.set(0,0,e.get(0,0)),t.set(0,n[1]-1,e.get(0,r[1]-1)),t.set(n[0]-1,0,e.get(r[0]-1,0)),t.set(n[0]-1,n[1]-1,e.get(r[0]-1,r[1]-1))}function N(t,e){return Array.isArray(t)?[e(t[0]),e(t[1]),e(t[2])]:[e(t),e(t),e(t)]}function j(t){return Array.isArray(t)?3===t.length?[t[0],t[1],t[2],1]:[t[0],t[1],t[2],t[3]]:[0,0,0,1]}function V(t){if(Array.isArray(t)){if(Array.isArray(t))return[j(t[0]),j(t[1]),j(t[2])];var e=j(t);return[e.slice(),e.slice(),e.slice()]}}C.drawPick=function(t){t=t||{};var e=this.gl;e.disable(e.CULL_FACE);var r=B;r.model=t.model||k,r.view=t.view||k,r.projection=t.projection||k,r.shape=this._field[2].shape,r.pickId=this.pickId/255,r.lowerBound=this.bounds[0],r.upperBound=this.bounds[1],r.permutation=D;for(var n=0;n<2;++n)for(var i=r.clipBounds[n],a=0;a<3;++a)i[a]=Math.min(Math.max(this.clipBounds[n][a],-1e8),1e8);var o=P(r,this);if(o.showSurface){for(this._pickShader.bind(),this._pickShader.uniforms=r,this._vao.bind(),this._vao.draw(e.TRIANGLES,this._vertexCount),n=0;n<3;++n)this.surfaceProject[n]&&(this._pickShader.uniforms.model=o.projections[n],this._pickShader.uniforms.clipBounds=o.clipBounds[n],this._vao.draw(e.TRIANGLES,this._vertexCount));this._vao.unbind()}if(o.showContour){var s=this._contourPickShader;s.bind(),s.uniforms=r;var l=this._contourVAO;for(l.bind(),a=0;a<3;++a)for(e.lineWidth(this.contourWidth[a]),s.uniforms.permutation=A[a],n=0;n<this.contourLevels[a].length;++n)this._contourCounts[a][n]&&(s.uniforms.height=this.contourLevels[a][n],l.draw(e.LINES,this._contourCounts[a][n],this._contourOffsets[a][n]));for(n=0;n<3;++n)for(s.uniforms.model=o.projections[n],s.uniforms.clipBounds=o.clipBounds[n],a=0;a<3;++a)if(this.contourProject[n][a]){s.uniforms.permutation=A[a],e.lineWidth(this.contourWidth[a]);for(var c=0;c<this.contourLevels[a].length;++c)this._contourCounts[a][c]&&(s.uniforms.height=this.contourLevels[a][c],l.draw(e.LINES,this._contourCounts[a][c],this._contourOffsets[a][c]))}l.unbind()}},C.pick=function(t){if(!t)return null;if(t.id!==this.pickId)return null;var e=this._field[2].shape,r=this._pickResult,n=e[0]*(t.value[0]+(t.value[2]>>4)/16)/255,i=Math.floor(n),a=n-i,o=e[1]*(t.value[1]+(15&t.value[2])/16)/255,s=Math.floor(o),l=o-s;i+=1,s+=1;var c=r.position;c[0]=c[1]=c[2]=0;for(var u=0;u<2;++u)for(var h=u?a:1-a,f=0;f<2;++f)for(var p=i+u,d=s+f,m=h*(f?l:1-l),v=0;v<3;++v)c[v]+=this._field[v].get(p,d)*m;for(var y=this._pickResult.level,x=0;x<3;++x)if(y[x]=g.le(this.contourLevels[x],c[x]),y[x]<0)this.contourLevels[x].length>0&&(y[x]=0);else if(y[x]<this.contourLevels[x].length-1){var b=this.contourLevels[x][y[x]],_=this.contourLevels[x][y[x]+1];Math.abs(b-c[x])>Math.abs(_-c[x])&&(y[x]+=1)}for(r.index[0]=a<.5?i:i+1,r.index[1]=l<.5?s:s+1,r.uv[0]=n/e[0],r.uv[1]=o/e[1],v=0;v<3;++v)r.dataCoordinate[v]=this._field[v].get(r.index[0],r.index[1]);return r},C.update=function(t){t=t||{},this.dirty=!0,"contourWidth"in t&&(this.contourWidth=N(t.contourWidth,Number)),"showContour"in t&&(this.showContour=N(t.showContour,Boolean)),"showSurface"in t&&(this.showSurface=!!t.showSurface),"contourTint"in t&&(this.contourTint=N(t.contourTint,Boolean)),"contourColor"in t&&(this.contourColor=V(t.contourColor)),"contourProject"in t&&(this.contourProject=N(t.contourProject,function(t){return N(t,Boolean)})),"surfaceProject"in t&&(this.surfaceProject=t.surfaceProject),"dynamicColor"in t&&(this.dynamicColor=V(t.dynamicColor)),"dynamicTint"in t&&(this.dynamicTint=N(t.dynamicTint,Number)),"dynamicWidth"in t&&(this.dynamicWidth=N(t.dynamicWidth,Number)),"opacity"in t&&(this.opacity=t.opacity),"colorBounds"in t&&(this.colorBounds=t.colorBounds),"vertexColor"in t&&(this.vertexColor=t.vertexColor?1:0);var e=t.field||t.coords&&t.coords[2]||null,r=!1;if(e||(e=this._field[2].shape[0]||this._field[2].shape[2]?this._field[2].lo(1,1).hi(this._field[2].shape[0]-2,this._field[2].shape[1]-2):this._field[2].hi(0,0)),"field"in t||"coords"in t){var i=(e.shape[0]+2)*(e.shape[1]+2);i>this._field[2].data.length&&(s.freeFloat(this._field[2].data),this._field[2].data=s.mallocFloat(n.nextPow2(i))),this._field[2]=h(this._field[2].data,[e.shape[0]+2,e.shape[1]+2]),F(this._field[2],e),this.shape=e.shape.slice();for(var a=this.shape,o=0;o<2;++o)this._field[2].size>this._field[o].data.length&&(s.freeFloat(this._field[o].data),this._field[o].data=s.mallocFloat(this._field[2].size)),this._field[o]=h(this._field[o].data,[a[0]+2,a[1]+2]);if(t.coords){var p=t.coords;if(!Array.isArray(p)||3!==p.length)throw new Error("gl-surface: invalid coordinates for x/y");for(o=0;o<2;++o){var d=p[o];for(b=0;b<2;++b)if(d.shape[b]!==a[b])throw new Error("gl-surface: coords have incorrect shape");F(this._field[o],d)}}else if(t.ticks){var g=t.ticks;if(!Array.isArray(g)||2!==g.length)throw new Error("gl-surface: invalid ticks");for(o=0;o<2;++o){var v=g[o];if((Array.isArray(v)||v.length)&&(v=h(v)),v.shape[0]!==a[o])throw new Error("gl-surface: invalid tick length");var y=h(v.data,a);y.stride[o]=v.stride[0],y.stride[1^o]=0,F(this._field[o],y)}}else{for(o=0;o<2;++o){var x=[0,0];x[o]=1,this._field[o]=h(this._field[o].data,[a[0]+2,a[1]+2],x,0)}this._field[0].set(0,0,0);for(var b=0;b<a[0];++b)this._field[0].set(b+1,0,b);for(this._field[0].set(a[0]+1,0,a[0]-1),this._field[1].set(0,0,0),b=0;b<a[1];++b)this._field[1].set(0,b+1,b);this._field[1].set(0,a[1]+1,a[1]-1)}var _=this._field,w=h(s.mallocFloat(3*_[2].size*2),[3,a[0]+2,a[1]+2,2]);for(o=0;o<3;++o)m(w.pick(o),_[o],"mirror");var k=h(s.mallocFloat(3*_[2].size),[a[0]+2,a[1]+2,3]);for(o=0;o<a[0]+2;++o)for(b=0;b<a[1]+2;++b){var A=w.get(0,o,b,0),T=w.get(0,o,b,1),E=w.get(1,o,b,0),C=w.get(1,o,b,1),L=w.get(2,o,b,0),z=w.get(2,o,b,1),P=E*z-C*L,I=L*T-z*A,O=A*C-T*E,D=Math.sqrt(P*P+I*I+O*O);D<1e-8?(D=Math.max(Math.abs(P),Math.abs(I),Math.abs(O)))<1e-8?(O=1,I=P=0,D=1):D=1/D:D=1/Math.sqrt(D),k.set(o,b,0,P*D),k.set(o,b,1,I*D),k.set(o,b,2,O*D)}s.free(w.data);var R=[1/0,1/0,1/0],B=[-1/0,-1/0,-1/0],j=1/0,U=-1/0,q=(a[0]-1)*(a[1]-1)*6,H=s.mallocFloat(n.nextPow2(10*q)),G=0,W=0;for(o=0;o<a[0]-1;++o)t:for(b=0;b<a[1]-1;++b){for(var Y=0;Y<2;++Y)for(var X=0;X<2;++X)for(var Z=0;Z<3;++Z){var $=this._field[Z].get(1+o+Y,1+b+X);if(isNaN($)||!isFinite($))continue t}for(Z=0;Z<6;++Z){var J=o+M[Z][0],K=b+M[Z][1],Q=this._field[0].get(J+1,K+1),tt=this._field[1].get(J+1,K+1),et=$=this._field[2].get(J+1,K+1);P=k.get(J+1,K+1,0),I=k.get(J+1,K+1,1),O=k.get(J+1,K+1,2),t.intensity&&(et=t.intensity.get(J,K)),H[G++]=J,H[G++]=K,H[G++]=Q,H[G++]=tt,H[G++]=$,H[G++]=0,H[G++]=et,H[G++]=P,H[G++]=I,H[G++]=O,R[0]=Math.min(R[0],Q),R[1]=Math.min(R[1],tt),R[2]=Math.min(R[2],$),j=Math.min(j,et),B[0]=Math.max(B[0],Q),B[1]=Math.max(B[1],tt),B[2]=Math.max(B[2],$),U=Math.max(U,et),W+=1}}for(t.intensityBounds&&(j=+t.intensityBounds[0],U=+t.intensityBounds[1]),o=6;o<G;o+=10)H[o]=(H[o]-j)/(U-j);this._vertexCount=W,this._coordinateBuffer.update(H.subarray(0,G)),s.freeFloat(H),s.free(k.data),this.bounds=[R,B],this.intensity=t.intensity||this._field[2],this.intensityBounds[0]===j&&this.intensityBounds[1]===U||(r=!0),this.intensityBounds=[j,U]}if("levels"in t){var rt=t.levels;for(rt=Array.isArray(rt[0])?rt.slice():[[],[],rt],o=0;o<3;++o)rt[o]=rt[o].slice(),rt.sort(function(t,e){return t-e});t:for(o=0;o<3;++o){if(rt[o].length!==this.contourLevels[o].length){r=!0;break}for(b=0;b<rt[o].length;++b)if(rt[o][b]!==this.contourLevels[o][b]){r=!0;break t}}this.contourLevels=rt}if(r){_=this._field,a=this.shape;for(var nt=[],it=0;it<3;++it){rt=this.contourLevels[it];var at=[],ot=[],st=[0,0,0];for(o=0;o<rt.length;++o){var lt=f(this._field[it],rt[o]);at.push(nt.length/5|0),W=0;t:for(b=0;b<lt.cells.length;++b){var ct=lt.cells[b];for(Z=0;Z<2;++Z){var ut=lt.positions[ct[Z]],ht=ut[0],ft=0|Math.floor(ht),pt=ht-ft,dt=ut[1],gt=0|Math.floor(dt),mt=dt-gt,vt=!1;e:for(var yt=0;yt<3;++yt){st[yt]=0;var xt=(it+yt+1)%3;for(Y=0;Y<2;++Y){var bt=Y?pt:1-pt;for(J=0|Math.min(Math.max(ft+Y,0),a[0]),X=0;X<2;++X){var _t=X?mt:1-mt;if(K=0|Math.min(Math.max(gt+X,0),a[1]),$=yt<2?this._field[xt].get(J,K):(this.intensity.get(J,K)-this.intensityBounds[0])/(this.intensityBounds[1]-this.intensityBounds[0]),!isFinite($)||isNaN($)){vt=!0;break e}var wt=bt*_t;st[yt]+=wt*$}}}if(vt){if(Z>0){for(var kt=0;kt<5;++kt)nt.pop();W-=1}continue t}nt.push(st[0],st[1],ut[0],ut[1],st[2]),W+=1}}ot.push(W)}this._contourOffsets[it]=at,this._contourCounts[it]=ot}var Mt=s.mallocFloat(nt.length);for(o=0;o<nt.length;++o)Mt[o]=nt[o];this._contourBuffer.update(Mt),s.freeFloat(Mt)}t.colormap&&this._colorMap.setPixels(function(t){var e=u([l({colormap:t,nshades:S,format:"rgba"}).map(function(t){return[t[0],t[1],t[2],255*t[3]]})]);return c.divseq(e,255),e}(t.colormap))},C.dispose=function(){this._shader.dispose(),this._vao.dispose(),this._coordinateBuffer.dispose(),this._colorMap.dispose(),this._contourBuffer.dispose(),this._contourVAO.dispose(),this._contourShader.dispose(),this._contourPickShader.dispose(),this._dynamicBuffer.dispose(),this._dynamicVAO.dispose();for(var t=0;t<3;++t)s.freeFloat(this._field[t].data)},C.highlight=function(t){if(!t)return this._dynamicCounts=[0,0,0],this.dyanamicLevel=[NaN,NaN,NaN],void(this.highlightLevel=[-1,-1,-1]);for(var e=0;e<3;++e)this.enableHighlight[e]?this.highlightLevel[e]=t.level[e]:this.highlightLevel[e]=-1;var r;if(r=this.snapToData?t.dataCoordinate:t.position,this.enableDynamic[0]&&r[0]!==this.dynamicLevel[0]||this.enableDynamic[1]&&r[1]!==this.dynamicLevel[1]||this.enableDynamic[2]&&r[2]!==this.dynamicLevel[2]){for(var n=0,i=this.shape,a=s.mallocFloat(12*i[0]*i[1]),o=0;o<3;++o)if(this.enableDynamic[o]){this.dynamicLevel[o]=r[o];var l=(o+1)%3,c=(o+2)%3,u=this._field[o],h=this._field[l],p=this._field[c],d=(this.intensity,f(u,r[o])),g=d.cells,m=d.positions;for(this._dynamicOffsets[o]=n,e=0;e<g.length;++e)for(var v=g[e],y=0;y<2;++y){var x=m[v[y]],b=+x[0],_=0|b,w=0|Math.min(_+1,i[0]),k=b-_,M=1-k,A=+x[1],T=0|A,S=0|Math.min(T+1,i[1]),E=A-T,C=1-E,L=M*C,z=M*E,P=k*C,I=k*E,O=L*h.get(_,T)+z*h.get(_,S)+P*h.get(w,T)+I*h.get(w,S),D=L*p.get(_,T)+z*p.get(_,S)+P*p.get(w,T)+I*p.get(w,S);if(isNaN(O)||isNaN(D)){y&&(n-=1);break}a[2*n+0]=O,a[2*n+1]=D,n+=1}this._dynamicCounts[o]=n-this._dynamicOffsets[o]}else this.dynamicLevel[o]=NaN,this._dynamicCounts[o]=0;this._dynamicBuffer.update(a.subarray(0,2*n)),s.freeFloat(a)}}},{"./lib/shaders":301,"binary-search-bounds":79,"bit-twiddle":80,colormap:113,"gl-buffer":230,"gl-mat4/invert":254,"gl-mat4/multiply":256,"gl-texture2d":303,"gl-vao":308,ndarray:417,"ndarray-gradient":408,"ndarray-ops":411,"ndarray-pack":412,"surface-nets":493,"typedarray-pool":507}],303:[function(t,e,r){"use strict";var n=t("ndarray"),i=t("ndarray-ops"),a=t("typedarray-pool");e.exports=function(t){if(arguments.length<=1)throw new Error("gl-texture2d: Missing arguments for texture2d constructor");o||function(t){o=[t.LINEAR,t.NEAREST_MIPMAP_LINEAR,t.LINEAR_MIPMAP_NEAREST,t.LINEAR_MIPMAP_NEAREST],s=[t.NEAREST,t.LINEAR,t.NEAREST_MIPMAP_NEAREST,t.NEAREST_MIPMAP_LINEAR,t.LINEAR_MIPMAP_NEAREST,t.LINEAR_MIPMAP_LINEAR],l=[t.REPEAT,t.CLAMP_TO_EDGE,t.MIRRORED_REPEAT]}(t);if("number"==typeof arguments[1])return m(t,arguments[1],arguments[2],arguments[3]||t.RGBA,arguments[4]||t.UNSIGNED_BYTE);if(Array.isArray(arguments[1]))return m(t,0|arguments[1][0],0|arguments[1][1],arguments[2]||t.RGBA,arguments[3]||t.UNSIGNED_BYTE);if("object"==typeof arguments[1]){var e=arguments[1],r=c(e)?e:e.raw;if(r)return function(t,e,r,n,i,a){var o=g(t);return t.texImage2D(t.TEXTURE_2D,0,i,i,a,e),new f(t,o,r,n,i,a)}(t,r,0|e.width,0|e.height,arguments[2]||t.RGBA,arguments[3]||t.UNSIGNED_BYTE);if(e.shape&&e.data&&e.stride)return function(t,e){var r=e.dtype,o=e.shape.slice(),s=t.getParameter(t.MAX_TEXTURE_SIZE);if(o[0]<0||o[0]>s||o[1]<0||o[1]>s)throw new Error("gl-texture2d: Invalid texture size");var l=d(o,e.stride.slice()),c=0;"float32"===r?c=t.FLOAT:"float64"===r?(c=t.FLOAT,l=!1,r="float32"):"uint8"===r?c=t.UNSIGNED_BYTE:(c=t.UNSIGNED_BYTE,l=!1,r="uint8");var h,p,m=0;if(2===o.length)m=t.LUMINANCE,o=[o[0],o[1],1],e=n(e.data,o,[e.stride[0],e.stride[1],1],e.offset);else{if(3!==o.length)throw new Error("gl-texture2d: Invalid shape for texture");if(1===o[2])m=t.ALPHA;else if(2===o[2])m=t.LUMINANCE_ALPHA;else if(3===o[2])m=t.RGB;else{if(4!==o[2])throw new Error("gl-texture2d: Invalid shape for pixel coords");m=t.RGBA}}c!==t.FLOAT||t.getExtension("OES_texture_float")||(c=t.UNSIGNED_BYTE,l=!1);var v=e.size;if(l)h=0===e.offset&&e.data.length===v?e.data:e.data.subarray(e.offset,e.offset+v);else{var y=[o[2],o[2]*o[0],1];p=a.malloc(v,r);var x=n(p,o,y,0);"float32"!==r&&"float64"!==r||c!==t.UNSIGNED_BYTE?i.assign(x,e):u(x,e),h=p.subarray(0,v)}var b=g(t);t.texImage2D(t.TEXTURE_2D,0,m,o[0],o[1],0,m,c,h),l||a.free(p);return new f(t,b,o[0],o[1],m,c)}(t,e)}throw new Error("gl-texture2d: Invalid arguments for texture2d constructor")};var o=null,s=null,l=null;function c(t){return"undefined"!=typeof HTMLCanvasElement&&t instanceof HTMLCanvasElement||"undefined"!=typeof HTMLImageElement&&t instanceof HTMLImageElement||"undefined"!=typeof HTMLVideoElement&&t instanceof HTMLVideoElement||"undefined"!=typeof ImageData&&t instanceof ImageData}var u=function(t,e){i.muls(t,e,255)};function h(t,e,r){var n=t.gl,i=n.getParameter(n.MAX_TEXTURE_SIZE);if(e<0||e>i||r<0||r>i)throw new Error("gl-texture2d: Invalid texture size");return t._shape=[e,r],t.bind(),n.texImage2D(n.TEXTURE_2D,0,t.format,e,r,0,t.format,t.type,null),t._mipLevels=[0],t}function f(t,e,r,n,i,a){this.gl=t,this.handle=e,this.format=i,this.type=a,this._shape=[r,n],this._mipLevels=[0],this._magFilter=t.NEAREST,this._minFilter=t.NEAREST,this._wrapS=t.CLAMP_TO_EDGE,this._wrapT=t.CLAMP_TO_EDGE,this._anisoSamples=1;var o=this,s=[this._wrapS,this._wrapT];Object.defineProperties(s,[{get:function(){return o._wrapS},set:function(t){return o.wrapS=t}},{get:function(){return o._wrapT},set:function(t){return o.wrapT=t}}]),this._wrapVector=s;var l=[this._shape[0],this._shape[1]];Object.defineProperties(l,[{get:function(){return o._shape[0]},set:function(t){return o.width=t}},{get:function(){return o._shape[1]},set:function(t){return o.height=t}}]),this._shapeVector=l}var p=f.prototype;function d(t,e){return 3===t.length?1===e[2]&&e[1]===t[0]*t[2]&&e[0]===t[2]:1===e[0]&&e[1]===t[0]}function g(t){var e=t.createTexture();return t.bindTexture(t.TEXTURE_2D,e),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MIN_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_MAG_FILTER,t.NEAREST),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_S,t.CLAMP_TO_EDGE),t.texParameteri(t.TEXTURE_2D,t.TEXTURE_WRAP_T,t.CLAMP_TO_EDGE),e}function m(t,e,r,n,i){var a=t.getParameter(t.MAX_TEXTURE_SIZE);if(e<0||e>a||r<0||r>a)throw new Error("gl-texture2d: Invalid texture shape");if(i===t.FLOAT&&!t.getExtension("OES_texture_float"))throw new Error("gl-texture2d: Floating point textures not supported on this platform");var o=g(t);return t.texImage2D(t.TEXTURE_2D,0,n,e,r,0,n,i,null),new f(t,o,e,r,n,i)}Object.defineProperties(p,{minFilter:{get:function(){return this._minFilter},set:function(t){this.bind();var e=this.gl;if(this.type===e.FLOAT&&o.indexOf(t)>=0&&(e.getExtension("OES_texture_float_linear")||(t=e.NEAREST)),s.indexOf(t)<0)throw new Error("gl-texture2d: Unknown filter mode "+t);return e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,t),this._minFilter=t}},magFilter:{get:function(){return this._magFilter},set:function(t){this.bind();var e=this.gl;if(this.type===e.FLOAT&&o.indexOf(t)>=0&&(e.getExtension("OES_texture_float_linear")||(t=e.NEAREST)),s.indexOf(t)<0)throw new Error("gl-texture2d: Unknown filter mode "+t);return e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,t),this._magFilter=t}},mipSamples:{get:function(){return this._anisoSamples},set:function(t){var e=this._anisoSamples;if(this._anisoSamples=0|Math.max(t,1),e!==this._anisoSamples){var r=this.gl.getExtension("EXT_texture_filter_anisotropic");r&&this.gl.texParameterf(this.gl.TEXTURE_2D,r.TEXTURE_MAX_ANISOTROPY_EXT,this._anisoSamples)}return this._anisoSamples}},wrapS:{get:function(){return this._wrapS},set:function(t){if(this.bind(),l.indexOf(t)<0)throw new Error("gl-texture2d: Unknown wrap mode "+t);return this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_S,t),this._wrapS=t}},wrapT:{get:function(){return this._wrapT},set:function(t){if(this.bind(),l.indexOf(t)<0)throw new Error("gl-texture2d: Unknown wrap mode "+t);return this.gl.texParameteri(this.gl.TEXTURE_2D,this.gl.TEXTURE_WRAP_T,t),this._wrapT=t}},wrap:{get:function(){return this._wrapVector},set:function(t){if(Array.isArray(t)||(t=[t,t]),2!==t.length)throw new Error("gl-texture2d: Must specify wrap mode for rows and columns");for(var e=0;e<2;++e)if(l.indexOf(t[e])<0)throw new Error("gl-texture2d: Unknown wrap mode "+t);this._wrapS=t[0],this._wrapT=t[1];var r=this.gl;return this.bind(),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_S,this._wrapS),r.texParameteri(r.TEXTURE_2D,r.TEXTURE_WRAP_T,this._wrapT),t}},shape:{get:function(){return this._shapeVector},set:function(t){if(Array.isArray(t)){if(2!==t.length)throw new Error("gl-texture2d: Invalid texture shape")}else t=[0|t,0|t];return h(this,0|t[0],0|t[1]),[0|t[0],0|t[1]]}},width:{get:function(){return this._shape[0]},set:function(t){return h(this,t|=0,this._shape[1]),t}},height:{get:function(){return this._shape[1]},set:function(t){return t|=0,h(this,this._shape[0],t),t}}}),p.bind=function(t){var e=this.gl;return void 0!==t&&e.activeTexture(e.TEXTURE0+(0|t)),e.bindTexture(e.TEXTURE_2D,this.handle),void 0!==t?0|t:e.getParameter(e.ACTIVE_TEXTURE)-e.TEXTURE0},p.dispose=function(){this.gl.deleteTexture(this.handle)},p.generateMipmap=function(){this.bind(),this.gl.generateMipmap(this.gl.TEXTURE_2D);for(var t=Math.min(this._shape[0],this._shape[1]),e=0;t>0;++e,t>>>=1)this._mipLevels.indexOf(e)<0&&this._mipLevels.push(e)},p.setPixels=function(t,e,r,o){var s=this.gl;this.bind(),Array.isArray(e)?(o=r,r=0|e[1],e=0|e[0]):(e=e||0,r=r||0),o=o||0;var l=c(t)?t:t.raw;if(l){this._mipLevels.indexOf(o)<0?(s.texImage2D(s.TEXTURE_2D,0,this.format,this.format,this.type,l),this._mipLevels.push(o)):s.texSubImage2D(s.TEXTURE_2D,o,e,r,this.format,this.type,l)}else{if(!(t.shape&&t.stride&&t.data))throw new Error("gl-texture2d: Unsupported data type");if(t.shape.length<2||e+t.shape[1]>this._shape[1]>>>o||r+t.shape[0]>this._shape[0]>>>o||e<0||r<0)throw new Error("gl-texture2d: Texture dimensions are out of bounds");!function(t,e,r,o,s,l,c,h){var f=h.dtype,p=h.shape.slice();if(p.length<2||p.length>3)throw new Error("gl-texture2d: Invalid ndarray, must be 2d or 3d");var g=0,m=0,v=d(p,h.stride.slice());"float32"===f?g=t.FLOAT:"float64"===f?(g=t.FLOAT,v=!1,f="float32"):"uint8"===f?g=t.UNSIGNED_BYTE:(g=t.UNSIGNED_BYTE,v=!1,f="uint8");if(2===p.length)m=t.LUMINANCE,p=[p[0],p[1],1],h=n(h.data,p,[h.stride[0],h.stride[1],1],h.offset);else{if(3!==p.length)throw new Error("gl-texture2d: Invalid shape for texture");if(1===p[2])m=t.ALPHA;else if(2===p[2])m=t.LUMINANCE_ALPHA;else if(3===p[2])m=t.RGB;else{if(4!==p[2])throw new Error("gl-texture2d: Invalid shape for pixel coords");m=t.RGBA}p[2]}m!==t.LUMINANCE&&m!==t.ALPHA||s!==t.LUMINANCE&&s!==t.ALPHA||(m=s);if(m!==s)throw new Error("gl-texture2d: Incompatible texture format for setPixels");var y=h.size,x=c.indexOf(o)<0;x&&c.push(o);if(g===l&&v)0===h.offset&&h.data.length===y?x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,h.data):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,h.data):x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,h.data.subarray(h.offset,h.offset+y)):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,h.data.subarray(h.offset,h.offset+y));else{var b;b=l===t.FLOAT?a.mallocFloat32(y):a.mallocUint8(y);var _=n(b,p,[p[2],p[2]*p[0],1]);g===t.FLOAT&&l===t.UNSIGNED_BYTE?u(_,h):i.assign(_,h),x?t.texImage2D(t.TEXTURE_2D,o,s,p[0],p[1],0,s,l,b.subarray(0,y)):t.texSubImage2D(t.TEXTURE_2D,o,e,r,p[0],p[1],s,l,b.subarray(0,y)),l===t.FLOAT?a.freeFloat32(b):a.freeUint8(b)}}(s,e,r,o,this.format,this.type,this._mipLevels,t)}}},{ndarray:417,"ndarray-ops":411,"typedarray-pool":507}],304:[function(t,e,r){"use strict";var n=t("pick-by-alias");function i(t){if(t.container)if(t.container==document.body)document.body.style.width||(t.canvas.width=t.width||t.pixelRatio*window.innerWidth),document.body.style.height||(t.canvas.height=t.height||t.pixelRatio*window.innerHeight);else{var e=t.container.getBoundingClientRect();t.canvas.width=t.width||e.right-e.left,t.canvas.height=t.height||e.bottom-e.top}}function a(t){return"function"==typeof t.getContext&&"width"in t&&"height"in t}e.exports=function(t){var e;if(t?"string"==typeof t&&(t={container:t}):t={},a(t)?t={container:t}:t="string"==typeof(e=t).nodeName&&"function"==typeof e.appendChild&&"function"==typeof e.getBoundingClientRect?{container:t}:function(t){return"function"==typeof t.drawArrays||"function"==typeof t.drawElements}(t)?{gl:t}:n(t,{container:"container target element el canvas holder parent parentNode wrapper use ref root node",gl:"gl context webgl glContext",attrs:"attributes attrs contextAttributes",pixelRatio:"pixelRatio pxRatio px ratio pxratio pixelratio"},!0),t.pixelRatio||(t.pixelRatio=window.pixelRatio||1),t.gl)return t.gl;if(t.canvas&&(t.container=t.canvas.parentNode),t.container){if("string"==typeof t.container){var r=document.querySelector(t.container);if(!r)throw Error("Element "+t.container+" is not found");t.container=r}a(t.container)?(t.canvas=t.container,t.container=t.canvas.parentNode):t.canvas||(t.canvas=document.createElement("canvas"),t.container.appendChild(t.canvas),i(t))}else t.canvas||(t.container=document.body||document.documentElement,t.canvas=document.createElement("canvas"),t.canvas.style.position="absolute",t.canvas.style.top=0,t.canvas.style.left=0,t.container.appendChild(t.canvas),i(t));if(!t.gl)try{t.gl=t.canvas.getContext("webgl",t.attrs)}catch(e){try{t.gl=t.canvas.getContext("experimental-webgl",t.attrs)}catch(e){t.gl=t.canvas.getContext("webgl-experimental",t.attrs)}}return t.gl}},{"pick-by-alias":432}],305:[function(t,e,r){"use strict";e.exports=function(t,e,r){e?e.bind():t.bindBuffer(t.ELEMENT_ARRAY_BUFFER,null);var n=0|t.getParameter(t.MAX_VERTEX_ATTRIBS);if(r){if(r.length>n)throw new Error("gl-vao: Too many vertex attributes");for(var i=0;i<r.length;++i){var a=r[i];if(a.buffer){var o=a.buffer,s=a.size||4,l=a.type||t.FLOAT,c=!!a.normalized,u=a.stride||0,h=a.offset||0;o.bind(),t.enableVertexAttribArray(i),t.vertexAttribPointer(i,s,l,c,u,h)}else{if("number"==typeof a)t.vertexAttrib1f(i,a);else if(1===a.length)t.vertexAttrib1f(i,a[0]);else if(2===a.length)t.vertexAttrib2f(i,a[0],a[1]);else if(3===a.length)t.vertexAttrib3f(i,a[0],a[1],a[2]);else{if(4!==a.length)throw new Error("gl-vao: Invalid vertex attribute");t.vertexAttrib4f(i,a[0],a[1],a[2],a[3])}t.disableVertexAttribArray(i)}}for(;i<n;++i)t.disableVertexAttribArray(i)}else for(t.bindBuffer(t.ARRAY_BUFFER,null),i=0;i<n;++i)t.disableVertexAttribArray(i)}},{}],306:[function(t,e,r){"use strict";var n=t("./do-bind.js");function i(t){this.gl=t,this._elements=null,this._attributes=null,this._elementsType=t.UNSIGNED_SHORT}i.prototype.bind=function(){n(this.gl,this._elements,this._attributes)},i.prototype.update=function(t,e,r){this._elements=e,this._attributes=t,this._elementsType=r||this.gl.UNSIGNED_SHORT},i.prototype.dispose=function(){},i.prototype.unbind=function(){},i.prototype.draw=function(t,e,r){r=r||0;var n=this.gl;this._elements?n.drawElements(t,e,this._elementsType,r):n.drawArrays(t,r,e)},e.exports=function(t){return new i(t)}},{"./do-bind.js":305}],307:[function(t,e,r){"use strict";var n=t("./do-bind.js");function i(t,e,r,n,i,a){this.location=t,this.dimension=e,this.a=r,this.b=n,this.c=i,this.d=a}function a(t,e,r){this.gl=t,this._ext=e,this.handle=r,this._attribs=[],this._useElements=!1,this._elementsType=t.UNSIGNED_SHORT}i.prototype.bind=function(t){switch(this.dimension){case 1:t.vertexAttrib1f(this.location,this.a);break;case 2:t.vertexAttrib2f(this.location,this.a,this.b);break;case 3:t.vertexAttrib3f(this.location,this.a,this.b,this.c);break;case 4:t.vertexAttrib4f(this.location,this.a,this.b,this.c,this.d)}},a.prototype.bind=function(){this._ext.bindVertexArrayOES(this.handle);for(var t=0;t<this._attribs.length;++t)this._attribs[t].bind(this.gl)},a.prototype.unbind=function(){this._ext.bindVertexArrayOES(null)},a.prototype.dispose=function(){this._ext.deleteVertexArrayOES(this.handle)},a.prototype.update=function(t,e,r){if(this.bind(),n(this.gl,e,t),this.unbind(),this._attribs.length=0,t)for(var a=0;a<t.length;++a){var o=t[a];"number"==typeof o?this._attribs.push(new i(a,1,o)):Array.isArray(o)&&this._attribs.push(new i(a,o.length,o[0],o[1],o[2],o[3]))}this._useElements=!!e,this._elementsType=r||this.gl.UNSIGNED_SHORT},a.prototype.draw=function(t,e,r){r=r||0;var n=this.gl;this._useElements?n.drawElements(t,e,this._elementsType,r):n.drawArrays(t,r,e)},e.exports=function(t,e){return new a(t,e,e.createVertexArrayOES())}},{"./do-bind.js":305}],308:[function(t,e,r){"use strict";var n=t("./lib/vao-native.js"),i=t("./lib/vao-emulated.js");function a(t){this.bindVertexArrayOES=t.bindVertexArray.bind(t),this.createVertexArrayOES=t.createVertexArray.bind(t),this.deleteVertexArrayOES=t.deleteVertexArray.bind(t)}e.exports=function(t,e,r,o){var s,l=t.createVertexArray?new a(t):t.getExtension("OES_vertex_array_object");return(s=l?n(t,l):i(t)).update(e,r,o),s}},{"./lib/vao-emulated.js":306,"./lib/vao-native.js":307}],309:[function(t,e,r){e.exports=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t}},{}],310:[function(t,e,r){e.exports=function(t,e){var r=n(t[0],t[1],t[2]),o=n(e[0],e[1],e[2]);i(r,r),i(o,o);var s=a(r,o);return s>1?0:Math.acos(s)};var n=t("./fromValues"),i=t("./normalize"),a=t("./dot")},{"./dot":317,"./fromValues":319,"./normalize":328}],311:[function(t,e,r){e.exports=function(t){var e=new Float32Array(3);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e}},{}],312:[function(t,e,r){e.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t}},{}],313:[function(t,e,r){e.exports=function(){var t=new Float32Array(3);return t[0]=0,t[1]=0,t[2]=0,t}},{}],314:[function(t,e,r){e.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2];return t[0]=i*l-a*s,t[1]=a*o-n*l,t[2]=n*s-i*o,t}},{}],315:[function(t,e,r){e.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2];return Math.sqrt(r*r+n*n+i*i)}},{}],316:[function(t,e,r){e.exports=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t}},{}],317:[function(t,e,r){e.exports=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]}},{}],318:[function(t,e,r){e.exports=function(t,e,r,i,a,o){var s,l;e||(e=3);r||(r=0);l=i?Math.min(i*e+r,t.length):t.length;for(s=r;s<l;s+=e)n[0]=t[s],n[1]=t[s+1],n[2]=t[s+2],a(n,n,o),t[s]=n[0],t[s+1]=n[1],t[s+2]=n[2];return t};var n=t("./create")()},{"./create":313}],319:[function(t,e,r){e.exports=function(t,e,r){var n=new Float32Array(3);return n[0]=t,n[1]=e,n[2]=r,n}},{}],320:[function(t,e,r){e.exports={create:t("./create"),clone:t("./clone"),angle:t("./angle"),fromValues:t("./fromValues"),copy:t("./copy"),set:t("./set"),add:t("./add"),subtract:t("./subtract"),multiply:t("./multiply"),divide:t("./divide"),min:t("./min"),max:t("./max"),scale:t("./scale"),scaleAndAdd:t("./scaleAndAdd"),distance:t("./distance"),squaredDistance:t("./squaredDistance"),length:t("./length"),squaredLength:t("./squaredLength"),negate:t("./negate"),inverse:t("./inverse"),normalize:t("./normalize"),dot:t("./dot"),cross:t("./cross"),lerp:t("./lerp"),random:t("./random"),transformMat4:t("./transformMat4"),transformMat3:t("./transformMat3"),transformQuat:t("./transformQuat"),rotateX:t("./rotateX"),rotateY:t("./rotateY"),rotateZ:t("./rotateZ"),forEach:t("./forEach")}},{"./add":309,"./angle":310,"./clone":311,"./copy":312,"./create":313,"./cross":314,"./distance":315,"./divide":316,"./dot":317,"./forEach":318,"./fromValues":319,"./inverse":321,"./length":322,"./lerp":323,"./max":324,"./min":325,"./multiply":326,"./negate":327,"./normalize":328,"./random":329,"./rotateX":330,"./rotateY":331,"./rotateZ":332,"./scale":333,"./scaleAndAdd":334,"./set":335,"./squaredDistance":336,"./squaredLength":337,"./subtract":338,"./transformMat3":339,"./transformMat4":340,"./transformQuat":341}],321:[function(t,e,r){e.exports=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t}},{}],322:[function(t,e,r){e.exports=function(t){var e=t[0],r=t[1],n=t[2];return Math.sqrt(e*e+r*r+n*n)}},{}],323:[function(t,e,r){e.exports=function(t,e,r,n){var i=e[0],a=e[1],o=e[2];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t[2]=o+n*(r[2]-o),t}},{}],324:[function(t,e,r){e.exports=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t}},{}],325:[function(t,e,r){e.exports=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t}},{}],326:[function(t,e,r){e.exports=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t}},{}],327:[function(t,e,r){e.exports=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t}},{}],328:[function(t,e,r){e.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=r*r+n*n+i*i;a>0&&(a=1/Math.sqrt(a),t[0]=e[0]*a,t[1]=e[1]*a,t[2]=e[2]*a);return t}},{}],329:[function(t,e,r){e.exports=function(t,e){e=e||1;var r=2*Math.random()*Math.PI,n=2*Math.random()-1,i=Math.sqrt(1-n*n)*e;return t[0]=Math.cos(r)*i,t[1]=Math.sin(r)*i,t[2]=n*e,t}},{}],330:[function(t,e,r){e.exports=function(t,e,r,n){var i=[],a=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],a[0]=i[0],a[1]=i[1]*Math.cos(n)-i[2]*Math.sin(n),a[2]=i[1]*Math.sin(n)+i[2]*Math.cos(n),t[0]=a[0]+r[0],t[1]=a[1]+r[1],t[2]=a[2]+r[2],t}},{}],331:[function(t,e,r){e.exports=function(t,e,r,n){var i=[],a=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],a[0]=i[2]*Math.sin(n)+i[0]*Math.cos(n),a[1]=i[1],a[2]=i[2]*Math.cos(n)-i[0]*Math.sin(n),t[0]=a[0]+r[0],t[1]=a[1]+r[1],t[2]=a[2]+r[2],t}},{}],332:[function(t,e,r){e.exports=function(t,e,r,n){var i=[],a=[];return i[0]=e[0]-r[0],i[1]=e[1]-r[1],i[2]=e[2]-r[2],a[0]=i[0]*Math.cos(n)-i[1]*Math.sin(n),a[1]=i[0]*Math.sin(n)+i[1]*Math.cos(n),a[2]=i[2],t[0]=a[0]+r[0],t[1]=a[1]+r[1],t[2]=a[2]+r[2],t}},{}],333:[function(t,e,r){e.exports=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t}},{}],334:[function(t,e,r){e.exports=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t}},{}],335:[function(t,e,r){e.exports=function(t,e,r,n){return t[0]=e,t[1]=r,t[2]=n,t}},{}],336:[function(t,e,r){e.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2];return r*r+n*n+i*i}},{}],337:[function(t,e,r){e.exports=function(t){var e=t[0],r=t[1],n=t[2];return e*e+r*r+n*n}},{}],338:[function(t,e,r){e.exports=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t}},{}],339:[function(t,e,r){e.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2];return t[0]=n*r[0]+i*r[3]+a*r[6],t[1]=n*r[1]+i*r[4]+a*r[7],t[2]=n*r[2]+i*r[5]+a*r[8],t}},{}],340:[function(t,e,r){e.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[3]*n+r[7]*i+r[11]*a+r[15];return o=o||1,t[0]=(r[0]*n+r[4]*i+r[8]*a+r[12])/o,t[1]=(r[1]*n+r[5]*i+r[9]*a+r[13])/o,t[2]=(r[2]*n+r[6]*i+r[10]*a+r[14])/o,t}},{}],341:[function(t,e,r){e.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2],c=r[3],u=c*n+s*a-l*i,h=c*i+l*n-o*a,f=c*a+o*i-s*n,p=-o*n-s*i-l*a;return t[0]=u*c+p*-o+h*-l-f*-s,t[1]=h*c+p*-s+f*-o-u*-l,t[2]=f*c+p*-l+u*-s-h*-o,t}},{}],342:[function(t,e,r){e.exports=function(t,e,r){return t[0]=e[0]+r[0],t[1]=e[1]+r[1],t[2]=e[2]+r[2],t[3]=e[3]+r[3],t}},{}],343:[function(t,e,r){e.exports=function(t){var e=new Float32Array(4);return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e}},{}],344:[function(t,e,r){e.exports=function(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}},{}],345:[function(t,e,r){e.exports=function(){var t=new Float32Array(4);return t[0]=0,t[1]=0,t[2]=0,t[3]=0,t}},{}],346:[function(t,e,r){e.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return Math.sqrt(r*r+n*n+i*i+a*a)}},{}],347:[function(t,e,r){e.exports=function(t,e,r){return t[0]=e[0]/r[0],t[1]=e[1]/r[1],t[2]=e[2]/r[2],t[3]=e[3]/r[3],t}},{}],348:[function(t,e,r){e.exports=function(t,e){return t[0]*e[0]+t[1]*e[1]+t[2]*e[2]+t[3]*e[3]}},{}],349:[function(t,e,r){e.exports=function(t,e,r,n){var i=new Float32Array(4);return i[0]=t,i[1]=e,i[2]=r,i[3]=n,i}},{}],350:[function(t,e,r){e.exports={create:t("./create"),clone:t("./clone"),fromValues:t("./fromValues"),copy:t("./copy"),set:t("./set"),add:t("./add"),subtract:t("./subtract"),multiply:t("./multiply"),divide:t("./divide"),min:t("./min"),max:t("./max"),scale:t("./scale"),scaleAndAdd:t("./scaleAndAdd"),distance:t("./distance"),squaredDistance:t("./squaredDistance"),length:t("./length"),squaredLength:t("./squaredLength"),negate:t("./negate"),inverse:t("./inverse"),normalize:t("./normalize"),dot:t("./dot"),lerp:t("./lerp"),random:t("./random"),transformMat4:t("./transformMat4"),transformQuat:t("./transformQuat")}},{"./add":342,"./clone":343,"./copy":344,"./create":345,"./distance":346,"./divide":347,"./dot":348,"./fromValues":349,"./inverse":351,"./length":352,"./lerp":353,"./max":354,"./min":355,"./multiply":356,"./negate":357,"./normalize":358,"./random":359,"./scale":360,"./scaleAndAdd":361,"./set":362,"./squaredDistance":363,"./squaredLength":364,"./subtract":365,"./transformMat4":366,"./transformQuat":367}],351:[function(t,e,r){e.exports=function(t,e){return t[0]=1/e[0],t[1]=1/e[1],t[2]=1/e[2],t[3]=1/e[3],t}},{}],352:[function(t,e,r){e.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return Math.sqrt(e*e+r*r+n*n+i*i)}},{}],353:[function(t,e,r){e.exports=function(t,e,r,n){var i=e[0],a=e[1],o=e[2],s=e[3];return t[0]=i+n*(r[0]-i),t[1]=a+n*(r[1]-a),t[2]=o+n*(r[2]-o),t[3]=s+n*(r[3]-s),t}},{}],354:[function(t,e,r){e.exports=function(t,e,r){return t[0]=Math.max(e[0],r[0]),t[1]=Math.max(e[1],r[1]),t[2]=Math.max(e[2],r[2]),t[3]=Math.max(e[3],r[3]),t}},{}],355:[function(t,e,r){e.exports=function(t,e,r){return t[0]=Math.min(e[0],r[0]),t[1]=Math.min(e[1],r[1]),t[2]=Math.min(e[2],r[2]),t[3]=Math.min(e[3],r[3]),t}},{}],356:[function(t,e,r){e.exports=function(t,e,r){return t[0]=e[0]*r[0],t[1]=e[1]*r[1],t[2]=e[2]*r[2],t[3]=e[3]*r[3],t}},{}],357:[function(t,e,r){e.exports=function(t,e){return t[0]=-e[0],t[1]=-e[1],t[2]=-e[2],t[3]=-e[3],t}},{}],358:[function(t,e,r){e.exports=function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=r*r+n*n+i*i+a*a;o>0&&(o=1/Math.sqrt(o),t[0]=r*o,t[1]=n*o,t[2]=i*o,t[3]=a*o);return t}},{}],359:[function(t,e,r){var n=t("./normalize"),i=t("./scale");e.exports=function(t,e){return e=e||1,t[0]=Math.random(),t[1]=Math.random(),t[2]=Math.random(),t[3]=Math.random(),n(t,t),i(t,t,e),t}},{"./normalize":358,"./scale":360}],360:[function(t,e,r){e.exports=function(t,e,r){return t[0]=e[0]*r,t[1]=e[1]*r,t[2]=e[2]*r,t[3]=e[3]*r,t}},{}],361:[function(t,e,r){e.exports=function(t,e,r,n){return t[0]=e[0]+r[0]*n,t[1]=e[1]+r[1]*n,t[2]=e[2]+r[2]*n,t[3]=e[3]+r[3]*n,t}},{}],362:[function(t,e,r){e.exports=function(t,e,r,n,i){return t[0]=e,t[1]=r,t[2]=n,t[3]=i,t}},{}],363:[function(t,e,r){e.exports=function(t,e){var r=e[0]-t[0],n=e[1]-t[1],i=e[2]-t[2],a=e[3]-t[3];return r*r+n*n+i*i+a*a}},{}],364:[function(t,e,r){e.exports=function(t){var e=t[0],r=t[1],n=t[2],i=t[3];return e*e+r*r+n*n+i*i}},{}],365:[function(t,e,r){e.exports=function(t,e,r){return t[0]=e[0]-r[0],t[1]=e[1]-r[1],t[2]=e[2]-r[2],t[3]=e[3]-r[3],t}},{}],366:[function(t,e,r){e.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t}},{}],367:[function(t,e,r){e.exports=function(t,e,r){var n=e[0],i=e[1],a=e[2],o=r[0],s=r[1],l=r[2],c=r[3],u=c*n+s*a-l*i,h=c*i+l*n-o*a,f=c*a+o*i-s*n,p=-o*n-s*i-l*a;return t[0]=u*c+p*-o+h*-l-f*-s,t[1]=h*c+p*-s+f*-o-u*-l,t[2]=f*c+p*-l+u*-s-h*-o,t[3]=e[3],t}},{}],368:[function(t,e,r){e.exports=function(t,e,r,a){return n[0]=a,n[1]=r,n[2]=e,n[3]=t,i[0]};var n=new Uint8Array(4),i=new Float32Array(n.buffer)},{}],369:[function(t,e,r){var n=t("glsl-tokenizer"),i=t("atob-lite");e.exports=function(t){for(var e=Array.isArray(t)?t:n(t),r=0;r<e.length;r++){var a=e[r];if("preprocessor"===a.type){var o=a.data.match(/\#define\s+SHADER_NAME(_B64)?\s+(.+)$/);if(o&&o[2]){var s=o[1],l=o[2];return(s?i(l):l).trim()}}}}},{"atob-lite":60,"glsl-tokenizer":376}],370:[function(t,e,r){e.exports=function(t){var e,r,k,M=0,A=0,T=l,S=[],E=[],C=1,L=0,z=0,P=!1,I=!1,O="",D=a,R=n;"300 es"===(t=t||{}).version&&(D=s,R=o);return function(t){return E=[],null!==t?function(t){var r;M=0,k=(O+=t).length;for(;e=O[M],M<k;){switch(r=M,T){case u:M=V();break;case h:case f:M=j();break;case p:M=U();break;case d:M=G();break;case _:M=H();break;case g:M=W();break;case c:M=Y();break;case x:M=N();break;case l:M=F()}if(r!==M)switch(O[r]){case"\n":L=0,++C;break;default:++L}}return A+=M,O=O.slice(M),E}(t.replace?t.replace(/\r\n/g,"\n"):t):function(t){S.length&&B(S.join(""));return T=b,B("(eof)"),E}()};function B(t){t.length&&E.push({type:w[T],data:t,position:z,line:C,column:L})}function F(){return S=S.length?[]:S,"/"===r&&"*"===e?(z=A+M-1,T=u,r=e,M+1):"/"===r&&"/"===e?(z=A+M-1,T=h,r=e,M+1):"#"===e?(T=f,z=A+M,M):/\s/.test(e)?(T=x,z=A+M,M):(P=/\d/.test(e),I=/[^\w_]/.test(e),z=A+M,T=P?d:I?p:c,M)}function N(){return/[^\s]/g.test(e)?(B(S.join("")),T=l,M):(S.push(e),r=e,M+1)}function j(){return"\r"!==e&&"\n"!==e||"\\"===r?(S.push(e),r=e,M+1):(B(S.join("")),T=l,M)}function V(){return"/"===e&&"*"===r?(S.push(e),B(S.join("")),T=l,M+1):(S.push(e),r=e,M+1)}function U(){if("."===r&&/\d/.test(e))return T=g,M;if("/"===r&&"*"===e)return T=u,M;if("/"===r&&"/"===e)return T=h,M;if("."===e&&S.length){for(;q(S););return T=g,M}if(";"===e||")"===e||"("===e){if(S.length)for(;q(S););return B(e),T=l,M+1}var t=2===S.length&&"="!==e;if(/[\w_\d\s]/.test(e)||t){for(;q(S););return T=l,M}return S.push(e),r=e,M+1}function q(t){for(var e,r,n=0;;){if(e=i.indexOf(t.slice(0,t.length+n).join("")),r=i[e],-1===e){if(n--+t.length>0)continue;r=t.slice(0,1).join("")}return B(r),z+=r.length,(S=S.slice(r.length)).length}}function H(){return/[^a-fA-F0-9]/.test(e)?(B(S.join("")),T=l,M):(S.push(e),r=e,M+1)}function G(){return"."===e?(S.push(e),T=g,r=e,M+1):/[eE]/.test(e)?(S.push(e),T=g,r=e,M+1):"x"===e&&1===S.length&&"0"===S[0]?(T=_,S.push(e),r=e,M+1):/[^\d]/.test(e)?(B(S.join("")),T=l,M):(S.push(e),r=e,M+1)}function W(){return"f"===e&&(S.push(e),r=e,M+=1),/[eE]/.test(e)?(S.push(e),r=e,M+1):"-"===e&&/[eE]/.test(r)?(S.push(e),r=e,M+1):/[^\d]/.test(e)?(B(S.join("")),T=l,M):(S.push(e),r=e,M+1)}function Y(){if(/[^\d\w_]/.test(e)){var t=S.join("");return T=R.indexOf(t)>-1?y:D.indexOf(t)>-1?v:m,B(S.join("")),T=l,M}return S.push(e),r=e,M+1}};var n=t("./lib/literals"),i=t("./lib/operators"),a=t("./lib/builtins"),o=t("./lib/literals-300es"),s=t("./lib/builtins-300es"),l=999,c=9999,u=0,h=1,f=2,p=3,d=4,g=5,m=6,v=7,y=8,x=9,b=10,_=11,w=["block-comment","line-comment","preprocessor","operator","integer","float","ident","builtin","keyword","whitespace","eof","integer"]},{"./lib/builtins":372,"./lib/builtins-300es":371,"./lib/literals":374,"./lib/literals-300es":373,"./lib/operators":375}],371:[function(t,e,r){var n=t("./builtins");n=n.slice().filter(function(t){return!/^(gl\_|texture)/.test(t)}),e.exports=n.concat(["gl_VertexID","gl_InstanceID","gl_Position","gl_PointSize","gl_FragCoord","gl_FrontFacing","gl_FragDepth","gl_PointCoord","gl_MaxVertexAttribs","gl_MaxVertexUniformVectors","gl_MaxVertexOutputVectors","gl_MaxFragmentInputVectors","gl_MaxVertexTextureImageUnits","gl_MaxCombinedTextureImageUnits","gl_MaxTextureImageUnits","gl_MaxFragmentUniformVectors","gl_MaxDrawBuffers","gl_MinProgramTexelOffset","gl_MaxProgramTexelOffset","gl_DepthRangeParameters","gl_DepthRange","trunc","round","roundEven","isnan","isinf","floatBitsToInt","floatBitsToUint","intBitsToFloat","uintBitsToFloat","packSnorm2x16","unpackSnorm2x16","packUnorm2x16","unpackUnorm2x16","packHalf2x16","unpackHalf2x16","outerProduct","transpose","determinant","inverse","texture","textureSize","textureProj","textureLod","textureOffset","texelFetch","texelFetchOffset","textureProjOffset","textureLodOffset","textureProjLod","textureProjLodOffset","textureGrad","textureGradOffset","textureProjGrad","textureProjGradOffset"])},{"./builtins":372}],372:[function(t,e,r){e.exports=["abs","acos","all","any","asin","atan","ceil","clamp","cos","cross","dFdx","dFdy","degrees","distance","dot","equal","exp","exp2","faceforward","floor","fract","gl_BackColor","gl_BackLightModelProduct","gl_BackLightProduct","gl_BackMaterial","gl_BackSecondaryColor","gl_ClipPlane","gl_ClipVertex","gl_Color","gl_DepthRange","gl_DepthRangeParameters","gl_EyePlaneQ","gl_EyePlaneR","gl_EyePlaneS","gl_EyePlaneT","gl_Fog","gl_FogCoord","gl_FogFragCoord","gl_FogParameters","gl_FragColor","gl_FragCoord","gl_FragData","gl_FragDepth","gl_FragDepthEXT","gl_FrontColor","gl_FrontFacing","gl_FrontLightModelProduct","gl_FrontLightProduct","gl_FrontMaterial","gl_FrontSecondaryColor","gl_LightModel","gl_LightModelParameters","gl_LightModelProducts","gl_LightProducts","gl_LightSource","gl_LightSourceParameters","gl_MaterialParameters","gl_MaxClipPlanes","gl_MaxCombinedTextureImageUnits","gl_MaxDrawBuffers","gl_MaxFragmentUniformComponents","gl_MaxLights","gl_MaxTextureCoords","gl_MaxTextureImageUnits","gl_MaxTextureUnits","gl_MaxVaryingFloats","gl_MaxVertexAttribs","gl_MaxVertexTextureImageUnits","gl_MaxVertexUniformComponents","gl_ModelViewMatrix","gl_ModelViewMatrixInverse","gl_ModelViewMatrixInverseTranspose","gl_ModelViewMatrixTranspose","gl_ModelViewProjectionMatrix","gl_ModelViewProjectionMatrixInverse","gl_ModelViewProjectionMatrixInverseTranspose","gl_ModelViewProjectionMatrixTranspose","gl_MultiTexCoord0","gl_MultiTexCoord1","gl_MultiTexCoord2","gl_MultiTexCoord3","gl_MultiTexCoord4","gl_MultiTexCoord5","gl_MultiTexCoord6","gl_MultiTexCoord7","gl_Normal","gl_NormalMatrix","gl_NormalScale","gl_ObjectPlaneQ","gl_ObjectPlaneR","gl_ObjectPlaneS","gl_ObjectPlaneT","gl_Point","gl_PointCoord","gl_PointParameters","gl_PointSize","gl_Position","gl_ProjectionMatrix","gl_ProjectionMatrixInverse","gl_ProjectionMatrixInverseTranspose","gl_ProjectionMatrixTranspose","gl_SecondaryColor","gl_TexCoord","gl_TextureEnvColor","gl_TextureMatrix","gl_TextureMatrixInverse","gl_TextureMatrixInverseTranspose","gl_TextureMatrixTranspose","gl_Vertex","greaterThan","greaterThanEqual","inversesqrt","length","lessThan","lessThanEqual","log","log2","matrixCompMult","max","min","mix","mod","normalize","not","notEqual","pow","radians","reflect","refract","sign","sin","smoothstep","sqrt","step","tan","texture2D","texture2DLod","texture2DProj","texture2DProjLod","textureCube","textureCubeLod","texture2DLodEXT","texture2DProjLodEXT","textureCubeLodEXT","texture2DGradEXT","texture2DProjGradEXT","textureCubeGradEXT"]},{}],373:[function(t,e,r){var n=t("./literals");e.exports=n.slice().concat(["layout","centroid","smooth","case","mat2x2","mat2x3","mat2x4","mat3x2","mat3x3","mat3x4","mat4x2","mat4x3","mat4x4","uint","uvec2","uvec3","uvec4","samplerCubeShadow","sampler2DArray","sampler2DArrayShadow","isampler2D","isampler3D","isamplerCube","isampler2DArray","usampler2D","usampler3D","usamplerCube","usampler2DArray","coherent","restrict","readonly","writeonly","resource","atomic_uint","noperspective","patch","sample","subroutine","common","partition","active","filter","image1D","image2D","image3D","imageCube","iimage1D","iimage2D","iimage3D","iimageCube","uimage1D","uimage2D","uimage3D","uimageCube","image1DArray","image2DArray","iimage1DArray","iimage2DArray","uimage1DArray","uimage2DArray","image1DShadow","image2DShadow","image1DArrayShadow","image2DArrayShadow","imageBuffer","iimageBuffer","uimageBuffer","sampler1DArray","sampler1DArrayShadow","isampler1D","isampler1DArray","usampler1D","usampler1DArray","isampler2DRect","usampler2DRect","samplerBuffer","isamplerBuffer","usamplerBuffer","sampler2DMS","isampler2DMS","usampler2DMS","sampler2DMSArray","isampler2DMSArray","usampler2DMSArray"])},{"./literals":374}],374:[function(t,e,r){e.exports=["precision","highp","mediump","lowp","attribute","const","uniform","varying","break","continue","do","for","while","if","else","in","out","inout","float","int","void","bool","true","false","discard","return","mat2","mat3","mat4","vec2","vec3","vec4","ivec2","ivec3","ivec4","bvec2","bvec3","bvec4","sampler1D","sampler2D","sampler3D","samplerCube","sampler1DShadow","sampler2DShadow","struct","asm","class","union","enum","typedef","template","this","packed","goto","switch","default","inline","noinline","volatile","public","static","extern","external","interface","long","short","double","half","fixed","unsigned","input","output","hvec2","hvec3","hvec4","dvec2","dvec3","dvec4","fvec2","fvec3","fvec4","sampler2DRect","sampler3DRect","sampler2DRectShadow","sizeof","cast","namespace","using"]},{}],375:[function(t,e,r){e.exports=["<<=",">>=","++","--","<<",">>","<=",">=","==","!=","&&","||","+=","-=","*=","/=","%=","&=","^^","^=","|=","(",")","[","]",".","!","~","*","/","%","+","-","<",">","&","^","|","?",":","=",",",";","{","}"]},{}],376:[function(t,e,r){var n=t("./index");e.exports=function(t,e){var r=n(e),i=[];return i=(i=i.concat(r(t))).concat(r(null))}},{"./index":370}],377:[function(t,e,r){e.exports=function(t){"string"==typeof t&&(t=[t]);for(var e=[].slice.call(arguments,1),r=[],n=0;n<t.length-1;n++)r.push(t[n],e[n]||"");return r.push(t[n]),r.join("")}},{}],378:[function(t,e,r){(function(r){"use strict";var n,i=t("is-browser");n="function"==typeof r.matchMedia?!r.matchMedia("(hover: none)").matches:i,e.exports=n}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"is-browser":385}],379:[function(t,e,r){"use strict";var n=t("is-browser");e.exports=n&&function(){var t=!1;try{var e=Object.defineProperty({},"passive",{get:function(){t=!0}});window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(e){t=!1}return t}()},{"is-browser":385}],380:[function(t,e,r){r.read=function(t,e,r,n,i){var a,o,s=8*i-n-1,l=(1<<s)-1,c=l>>1,u=-7,h=r?i-1:0,f=r?-1:1,p=t[e+h];for(h+=f,a=p&(1<<-u)-1,p>>=-u,u+=s;u>0;a=256*a+t[e+h],h+=f,u-=8);for(o=a&(1<<-u)-1,a>>=-u,u+=n;u>0;o=256*o+t[e+h],h+=f,u-=8);if(0===a)a=1-c;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=c}return(p?-1:1)*o*Math.pow(2,a-n)},r.write=function(t,e,r,n,i,a){var o,s,l,c=8*a-i-1,u=(1<<c)-1,h=u>>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=u):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+h>=1?f/l:f*Math.pow(2,1-h))*l>=2&&(o++,l/=2),o+h>=u?(s=0,o=u):o+h>=1?(s=(e*l-1)*Math.pow(2,i),o+=h):(s=e*Math.pow(2,h-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<<i|s,c+=i;c>0;t[r+p]=255&o,p+=d,o/=256,c-=8);t[r+p-d]|=128*g}},{}],381:[function(t,e,r){"use strict";e.exports=function(t,e){var r=t.length;if(0===r)throw new Error("Must have at least d+1 points");var i=t[0].length;if(r<=i)throw new Error("Must input at least d+1 points");var o=t.slice(0,i+1),s=n.apply(void 0,o);if(0===s)throw new Error("Input not in general position");for(var l=new Array(i+1),u=0;u<=i;++u)l[u]=u;s<0&&(l[0]=1,l[1]=0);for(var h=new a(l,new Array(i+1),!1),f=h.adjacent,p=new Array(i+2),u=0;u<=i;++u){for(var d=l.slice(),g=0;g<=i;++g)g===u&&(d[g]=-1);var m=d[0];d[0]=d[1],d[1]=m;var v=new a(d,new Array(i+1),!0);f[u]=v,p[u]=v}p[i+1]=h;for(var u=0;u<=i;++u)for(var d=f[u].vertices,y=f[u].adjacent,g=0;g<=i;++g){var x=d[g];if(x<0)y[g]=h;else for(var b=0;b<=i;++b)f[b].vertices.indexOf(x)<0&&(y[g]=f[b])}for(var _=new c(i,o,p),w=!!e,u=i+1;u<r;++u)_.insert(t[u],w);return _.boundary()};var n=t("robust-orientation"),i=t("simplicial-complex").compareCells;function a(t,e,r){this.vertices=t,this.adjacent=e,this.boundary=r,this.lastVisited=-1}function o(t,e,r){this.vertices=t,this.cell=e,this.index=r}function s(t,e){return i(t.vertices,e.vertices)}a.prototype.flip=function(){var t=this.vertices[0];this.vertices[0]=this.vertices[1],this.vertices[1]=t;var e=this.adjacent[0];this.adjacent[0]=this.adjacent[1],this.adjacent[1]=e};var l=[];function c(t,e,r){this.dimension=t,this.vertices=e,this.simplices=r,this.interior=r.filter(function(t){return!t.boundary}),this.tuple=new Array(t+1);for(var i=0;i<=t;++i)this.tuple[i]=this.vertices[i];var a=l[t];a||(a=l[t]=function(t){for(var e=["function orient(){var tuple=this.tuple;return test("],r=0;r<=t;++r)r>0&&e.push(","),e.push("tuple[",r,"]");e.push(")}return orient");var i=new Function("test",e.join("")),a=n[t+1];return a||(a=n),i(a)}(t)),this.orient=a}var u=c.prototype;u.handleBoundaryDegeneracy=function(t,e){var r=this.dimension,n=this.vertices.length-1,i=this.tuple,a=this.vertices,o=[t];for(t.lastVisited=-n;o.length>0;){(t=o.pop()).vertices;for(var s=t.adjacent,l=0;l<=r;++l){var c=s[l];if(c.boundary&&!(c.lastVisited<=-n)){for(var u=c.vertices,h=0;h<=r;++h){var f=u[h];i[h]=f<0?e:a[f]}var p=this.orient();if(p>0)return c;c.lastVisited=-n,0===p&&o.push(c)}}}return null},u.walk=function(t,e){var r=this.vertices.length-1,n=this.dimension,i=this.vertices,a=this.tuple,o=e?this.interior.length*Math.random()|0:this.interior.length-1,s=this.interior[o];t:for(;!s.boundary;){for(var l=s.vertices,c=s.adjacent,u=0;u<=n;++u)a[u]=i[l[u]];s.lastVisited=r;for(u=0;u<=n;++u){var h=c[u];if(!(h.lastVisited>=r)){var f=a[u];a[u]=t;var p=this.orient();if(a[u]=f,p<0){s=h;continue t}h.boundary?h.lastVisited=-r:h.lastVisited=r}}return}return s},u.addPeaks=function(t,e){var r=this.vertices.length-1,n=this.dimension,i=this.vertices,l=this.tuple,c=this.interior,u=this.simplices,h=[e];e.lastVisited=r,e.vertices[e.vertices.indexOf(-1)]=r,e.boundary=!1,c.push(e);for(var f=[];h.length>0;){var p=(e=h.pop()).vertices,d=e.adjacent,g=p.indexOf(r);if(!(g<0))for(var m=0;m<=n;++m)if(m!==g){var v=d[m];if(v.boundary&&!(v.lastVisited>=r)){var y=v.vertices;if(v.lastVisited!==-r){for(var x=0,b=0;b<=n;++b)y[b]<0?(x=b,l[b]=t):l[b]=i[y[b]];if(this.orient()>0){y[x]=r,v.boundary=!1,c.push(v),h.push(v),v.lastVisited=r;continue}v.lastVisited=-r}var _=v.adjacent,w=p.slice(),k=d.slice(),M=new a(w,k,!0);u.push(M);var A=_.indexOf(e);if(!(A<0)){_[A]=M,k[g]=v,w[m]=-1,k[m]=e,d[m]=M,M.flip();for(b=0;b<=n;++b){var T=w[b];if(!(T<0||T===r)){for(var S=new Array(n-1),E=0,C=0;C<=n;++C){var L=w[C];L<0||C===b||(S[E++]=L)}f.push(new o(S,M,b))}}}}}}f.sort(s);for(m=0;m+1<f.length;m+=2){var z=f[m],P=f[m+1],I=z.index,O=P.index;I<0||O<0||(z.cell.adjacent[z.index]=P.cell,P.cell.adjacent[P.index]=z.cell)}},u.insert=function(t,e){var r=this.vertices;r.push(t);var n=this.walk(t,e);if(n){for(var i=this.dimension,a=this.tuple,o=0;o<=i;++o){var s=n.vertices[o];a[o]=s<0?t:r[s]}var l=this.orient(a);l<0||(0!==l||(n=this.handleBoundaryDegeneracy(n,t)))&&this.addPeaks(t,n)}},u.boundary=function(){for(var t=this.dimension,e=[],r=this.simplices,n=r.length,i=0;i<n;++i){var a=r[i];if(a.boundary){for(var o=new Array(t),s=a.vertices,l=0,c=0,u=0;u<=t;++u)s[u]>=0?o[l++]=s[u]:c=1&u;if(c===(1&t)){var h=o[0];o[0]=o[1],o[1]=h}e.push(o)}}return e}},{"robust-orientation":471,"simplicial-complex":481}],382:[function(t,e,r){"use strict";var n=t("binary-search-bounds"),i=0,a=1;function o(t,e,r,n,i){this.mid=t,this.left=e,this.right=r,this.leftPoints=n,this.rightPoints=i,this.count=(e?e.count:0)+(r?r.count:0)+n.length}e.exports=function(t){if(!t||0===t.length)return new x(null);return new x(y(t))};var s=o.prototype;function l(t,e){t.mid=e.mid,t.left=e.left,t.right=e.right,t.leftPoints=e.leftPoints,t.rightPoints=e.rightPoints,t.count=e.count}function c(t,e){var r=y(e);t.mid=r.mid,t.left=r.left,t.right=r.right,t.leftPoints=r.leftPoints,t.rightPoints=r.rightPoints,t.count=r.count}function u(t,e){var r=t.intervals([]);r.push(e),c(t,r)}function h(t,e){var r=t.intervals([]),n=r.indexOf(e);return n<0?i:(r.splice(n,1),c(t,r),a)}function f(t,e,r){for(var n=0;n<t.length&&t[n][0]<=e;++n){var i=r(t[n]);if(i)return i}}function p(t,e,r){for(var n=t.length-1;n>=0&&t[n][1]>=e;--n){var i=r(t[n]);if(i)return i}}function d(t,e){for(var r=0;r<t.length;++r){var n=e(t[r]);if(n)return n}}function g(t,e){return t-e}function m(t,e){var r=t[0]-e[0];return r||t[1]-e[1]}function v(t,e){var r=t[1]-e[1];return r||t[0]-e[0]}function y(t){if(0===t.length)return null;for(var e=[],r=0;r<t.length;++r)e.push(t[r][0],t[r][1]);e.sort(g);var n=e[e.length>>1],i=[],a=[],s=[];for(r=0;r<t.length;++r){var l=t[r];l[1]<n?i.push(l):n<l[0]?a.push(l):s.push(l)}var c=s,u=s.slice();return c.sort(m),u.sort(v),new o(n,y(i),y(a),c,u)}function x(t){this.root=t}s.intervals=function(t){return t.push.apply(t,this.leftPoints),this.left&&this.left.intervals(t),this.right&&this.right.intervals(t),t},s.insert=function(t){var e=this.count-this.leftPoints.length;if(this.count+=1,t[1]<this.mid)this.left?4*(this.left.count+1)>3*(e+1)?u(this,t):this.left.insert(t):this.left=y([t]);else if(t[0]>this.mid)this.right?4*(this.right.count+1)>3*(e+1)?u(this,t):this.right.insert(t):this.right=y([t]);else{var r=n.ge(this.leftPoints,t,m),i=n.ge(this.rightPoints,t,v);this.leftPoints.splice(r,0,t),this.rightPoints.splice(i,0,t)}},s.remove=function(t){var e=this.count-this.leftPoints;if(t[1]<this.mid)return this.left?4*(this.right?this.right.count:0)>3*(e-1)?h(this,t):2===(c=this.left.remove(t))?(this.left=null,this.count-=1,a):(c===a&&(this.count-=1),c):i;if(t[0]>this.mid)return this.right?4*(this.left?this.left.count:0)>3*(e-1)?h(this,t):2===(c=this.right.remove(t))?(this.right=null,this.count-=1,a):(c===a&&(this.count-=1),c):i;if(1===this.count)return this.leftPoints[0]===t?2:i;if(1===this.leftPoints.length&&this.leftPoints[0]===t){if(this.left&&this.right){for(var r=this,o=this.left;o.right;)r=o,o=o.right;if(r===this)o.right=this.right;else{var s=this.left,c=this.right;r.count-=o.count,r.right=o.left,o.left=s,o.right=c}l(this,o),this.count=(this.left?this.left.count:0)+(this.right?this.right.count:0)+this.leftPoints.length}else this.left?l(this,this.left):l(this,this.right);return a}for(s=n.ge(this.leftPoints,t,m);s<this.leftPoints.length&&this.leftPoints[s][0]===t[0];++s)if(this.leftPoints[s]===t){this.count-=1,this.leftPoints.splice(s,1);for(c=n.ge(this.rightPoints,t,v);c<this.rightPoints.length&&this.rightPoints[c][1]===t[1];++c)if(this.rightPoints[c]===t)return this.rightPoints.splice(c,1),a}return i},s.queryPoint=function(t,e){if(t<this.mid){if(this.left)if(r=this.left.queryPoint(t,e))return r;return f(this.leftPoints,t,e)}if(t>this.mid){var r;if(this.right)if(r=this.right.queryPoint(t,e))return r;return p(this.rightPoints,t,e)}return d(this.leftPoints,e)},s.queryInterval=function(t,e,r){var n;if(t<this.mid&&this.left&&(n=this.left.queryInterval(t,e,r)))return n;if(e>this.mid&&this.right&&(n=this.right.queryInterval(t,e,r)))return n;return e<this.mid?f(this.leftPoints,e,r):t>this.mid?p(this.rightPoints,t,r):d(this.leftPoints,r)};var b=x.prototype;b.insert=function(t){this.root?this.root.insert(t):this.root=new o(t[0],null,null,[t],[t])},b.remove=function(t){if(this.root){var e=this.root.remove(t);return 2===e&&(this.root=null),e!==i}return!1},b.queryPoint=function(t,e){if(this.root)return this.root.queryPoint(t,e)},b.queryInterval=function(t,e,r){if(t<=e&&this.root)return this.root.queryInterval(t,e,r)},Object.defineProperty(b,"count",{get:function(){return this.root?this.root.count:0}}),Object.defineProperty(b,"intervals",{get:function(){return this.root?this.root.intervals([]):[]}})},{"binary-search-bounds":79}],383:[function(t,e,r){"use strict";e.exports=function(t,e){e=e||new Array(t.length);for(var r=0;r<t.length;++r)e[t[r]]=r;return e}},{}],384:[function(t,e,r){"use strict";e.exports=function(t){for(var e=new Array(t),r=0;r<t;++r)e[r]=r;return e}},{}],385:[function(t,e,r){e.exports=!0},{}],386:[function(t,e,r){function n(t){return!!t.constructor&&"function"==typeof t.constructor.isBuffer&&t.constructor.isBuffer(t)}e.exports=function(t){return null!=t&&(n(t)||function(t){return"function"==typeof t.readFloatLE&&"function"==typeof t.slice&&n(t.slice(0,0))}(t)||!!t._isBuffer)}},{}],387:[function(t,e,r){"use strict";e.exports="undefined"!=typeof navigator&&(/MSIE/.test(navigator.userAgent)||/Trident\//.test(navigator.appVersion))},{}],388:[function(t,e,r){e.exports=function(t){t||"undefined"==typeof navigator||(t=navigator.userAgent);t&&t.headers&&"string"==typeof t.headers["user-agent"]&&(t=t.headers["user-agent"]);return"string"==typeof t&&(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(t)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(t.substr(0,4)))}},{}],389:[function(t,e,r){"use strict";e.exports=function(t){var e=typeof t;return null!==t&&("object"===e||"function"===e)}},{}],390:[function(t,e,r){"use strict";var n=Object.prototype.toString;e.exports=function(t){var e;return"[object Object]"===n.call(t)&&(null===(e=Object.getPrototypeOf(t))||e===Object.getPrototypeOf({}))}},{}],391:[function(t,e,r){"use strict";e.exports=function(t){return"string"==typeof t&&(t=t.trim(),!!(/^[mzlhvcsqta]\s*[-+.0-9][^mlhvzcsqta]+/i.test(t)&&/[\dz]$/i.test(t)&&t.length>4))}},{}],392:[function(t,e,r){e.exports=function(t,e,r){return t*(1-r)+e*r}},{}],393:[function(t,e,r){(function(t){!function(t,n){"object"==typeof r&&"undefined"!=typeof e?e.exports=n():t.mapboxgl=n()}(this,function(){"use strict";var e,r,n;function i(t,i){if(e)if(r){var a="var sharedChunk = {}; ("+e+")(sharedChunk); ("+r+")(sharedChunk);",o={};e(o),(n=i(o)).workerUrl=window.URL.createObjectURL(new Blob([a],{type:"text/javascript"}))}else r=i;else e=i}return i(0,function(e){var r="undefined"!=typeof window?window:"undefined"!=typeof t?t:"undefined"!=typeof self?self:{};function n(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}function i(t,e){return t(e={exports:{}},e.exports),e.exports}var a=o;function o(t,e,r,n){this.cx=3*t,this.bx=3*(r-t)-this.cx,this.ax=1-this.cx-this.bx,this.cy=3*e,this.by=3*(n-e)-this.cy,this.ay=1-this.cy-this.by,this.p1x=t,this.p1y=n,this.p2x=r,this.p2y=n}o.prototype.sampleCurveX=function(t){return((this.ax*t+this.bx)*t+this.cx)*t},o.prototype.sampleCurveY=function(t){return((this.ay*t+this.by)*t+this.cy)*t},o.prototype.sampleCurveDerivativeX=function(t){return(3*this.ax*t+2*this.bx)*t+this.cx},o.prototype.solveCurveX=function(t,e){var r,n,i,a,o;for(void 0===e&&(e=1e-6),i=t,o=0;o<8;o++){if(a=this.sampleCurveX(i)-t,Math.abs(a)<e)return i;var s=this.sampleCurveDerivativeX(i);if(Math.abs(s)<1e-6)break;i-=a/s}if((i=t)<(r=0))return r;if(i>(n=1))return n;for(;r<n;){if(a=this.sampleCurveX(i),Math.abs(a-t)<e)return i;t>a?r=i:n=i,i=.5*(n-r)+r}return i},o.prototype.solve=function(t,e){return this.sampleCurveY(this.solveCurveX(t,e))};var s=function(t,e,r){this.column=t,this.row=e,this.zoom=r};s.prototype.clone=function(){return new s(this.column,this.row,this.zoom)},s.prototype.zoomTo=function(t){return this.clone()._zoomTo(t)},s.prototype.sub=function(t){return this.clone()._sub(t)},s.prototype._zoomTo=function(t){var e=Math.pow(2,t-this.zoom);return this.column*=e,this.row*=e,this.zoom=t,this},s.prototype._sub=function(t){return t=t.zoomTo(this.zoom),this.column-=t.column,this.row-=t.row,this};var l=c;function c(t,e){this.x=t,this.y=e}function u(t,e,r,n){var i=new a(t,e,r,n);return function(t){return i.solve(t)}}c.prototype={clone:function(){return new c(this.x,this.y)},add:function(t){return this.clone()._add(t)},sub:function(t){return this.clone()._sub(t)},multByPoint:function(t){return this.clone()._multByPoint(t)},divByPoint:function(t){return this.clone()._divByPoint(t)},mult:function(t){return this.clone()._mult(t)},div:function(t){return this.clone()._div(t)},rotate:function(t){return this.clone()._rotate(t)},rotateAround:function(t,e){return this.clone()._rotateAround(t,e)},matMult:function(t){return this.clone()._matMult(t)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(t){return this.x===t.x&&this.y===t.y},dist:function(t){return Math.sqrt(this.distSqr(t))},distSqr:function(t){var e=t.x-this.x,r=t.y-this.y;return e*e+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(t){return Math.atan2(this.y-t.y,this.x-t.x)},angleWith:function(t){return this.angleWithSep(t.x,t.y)},angleWithSep:function(t,e){return Math.atan2(this.x*e-this.y*t,this.x*t+this.y*e)},_matMult:function(t){var e=t[0]*this.x+t[1]*this.y,r=t[2]*this.x+t[3]*this.y;return this.x=e,this.y=r,this},_add:function(t){return this.x+=t.x,this.y+=t.y,this},_sub:function(t){return this.x-=t.x,this.y-=t.y,this},_mult:function(t){return this.x*=t,this.y*=t,this},_div:function(t){return this.x/=t,this.y/=t,this},_multByPoint:function(t){return this.x*=t.x,this.y*=t.y,this},_divByPoint:function(t){return this.x/=t.x,this.y/=t.y,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var t=this.y;return this.y=this.x,this.x=-t,this},_rotate:function(t){var e=Math.cos(t),r=Math.sin(t),n=e*this.x-r*this.y,i=r*this.x+e*this.y;return this.x=n,this.y=i,this},_rotateAround:function(t,e){var r=Math.cos(t),n=Math.sin(t),i=e.x+r*(this.x-e.x)-n*(this.y-e.y),a=e.y+n*(this.x-e.x)+r*(this.y-e.y);return this.x=i,this.y=a,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},c.convert=function(t){return t instanceof c?t:Array.isArray(t)?new c(t[0],t[1]):t};var h=u(.25,.1,.25,1);function f(t,e,r){return Math.min(r,Math.max(e,t))}function p(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];for(var n=0,i=e;n<i.length;n+=1){var a=i[n];for(var o in a)t[o]=a[o]}return t}var d=1;function g(t,e){t.forEach(function(t){e[t]&&(e[t]=e[t].bind(e))})}function m(t,e){return-1!==t.indexOf(e,t.length-e.length)}function v(t,e,r){var n={};for(var i in t)n[i]=e.call(r||this,t[i],i,t);return n}function y(t,e,r){var n={};for(var i in t)e.call(r||this,t[i],i,t)&&(n[i]=t[i]);return n}function x(t){return Array.isArray(t)?t.map(x):"object"==typeof t&&t?v(t,x):t}var b={};function _(t){b[t]||("undefined"!=typeof console&&console.warn(t),b[t]=!0)}function w(t,e,r){return(r.y-t.y)*(e.x-t.x)>(e.y-t.y)*(r.x-t.x)}function k(t){for(var e=0,r=0,n=t.length,i=n-1,a=void 0,o=void 0;r<n;i=r++)a=t[r],e+=((o=t[i]).x-a.x)*(a.y+o.y);return e}var M={Unknown:"Unknown",Style:"Style",Source:"Source",Tile:"Tile",Glyphs:"Glyphs",SpriteImage:"SpriteImage",SpriteJSON:"SpriteJSON",Image:"Image"};"function"==typeof Object.freeze&&Object.freeze(M);var A=function(t){function e(e,r,n){t.call(this,e),this.status=r,this.url=n,this.name=this.constructor.name,this.message=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.toString=function(){return this.name+": "+this.message+" ("+this.status+"): "+this.url},e}(Error);function T(t){var e=new self.XMLHttpRequest;for(var r in e.open("GET",t.url,!0),t.headers)e.setRequestHeader(r,t.headers[r]);return e.withCredentials="include"===t.credentials,e}var S=function(t,e){var r=T(t);return r.responseType="arraybuffer",r.onerror=function(){e(new Error(r.statusText))},r.onload=function(){var n=r.response;if(0===n.byteLength&&200===r.status)return e(new Error("http status 200 returned without content."));r.status>=200&&r.status<300&&r.response?e(null,{data:n,cacheControl:r.getResponseHeader("Cache-Control"),expires:r.getResponseHeader("Expires")}):e(new A(r.statusText,r.status,t.url))},r.send(),r};function E(t,e,r){r[t]=r[t]||[],r[t].push(e)}function C(t,e,r){if(r&&r[t]){var n=r[t].indexOf(e);-1!==n&&r[t].splice(n,1)}}var L=function(t,e){void 0===e&&(e={}),p(this,e),this.type=t},z=function(t){function e(e,r){void 0===r&&(r={}),t.call(this,"error",p({error:e},r))}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(L),P=function(){};P.prototype.on=function(t,e){return this._listeners=this._listeners||{},E(t,e,this._listeners),this},P.prototype.off=function(t,e){return C(t,e,this._listeners),C(t,e,this._oneTimeListeners),this},P.prototype.once=function(t,e){return this._oneTimeListeners=this._oneTimeListeners||{},E(t,e,this._oneTimeListeners),this},P.prototype.fire=function(t){"string"==typeof t&&(t=new L(t,arguments[1]||{}));var e=t.type;if(this.listens(e)){t.target=this;for(var r=0,n=this._listeners&&this._listeners[e]?this._listeners[e].slice():[];r<n.length;r+=1)n[r].call(this,t);for(var i=0,a=this._oneTimeListeners&&this._oneTimeListeners[e]?this._oneTimeListeners[e].slice():[];i<a.length;i+=1){var o=a[i];C(e,o,this._oneTimeListeners),o.call(this,t)}var s=this._eventedParent;s&&(p(t,"function"==typeof this._eventedParentData?this._eventedParentData():this._eventedParentData),s.fire(t))}else m(e,"error")?console.error(t&&t.error||t||"Empty error event"):m(e,"warning")&&console.warn(t&&t.warning||t||"Empty warning event");return this},P.prototype.listens=function(t){return this._listeners&&this._listeners[t]&&this._listeners[t].length>0||this._oneTimeListeners&&this._oneTimeListeners[t]&&this._oneTimeListeners[t].length>0||this._eventedParent&&this._eventedParent.listens(t)},P.prototype.setEventedParent=function(t,e){return this._eventedParent=t,this._eventedParentData=e,this};var I={$version:8,$root:{version:{required:!0,type:"enum",values:[8]},name:{type:"string"},metadata:{type:"*"},center:{type:"array",value:"number"},zoom:{type:"number"},bearing:{type:"number",default:0,period:360,units:"degrees"},pitch:{type:"number",default:0,units:"degrees"},light:{type:"light"},sources:{required:!0,type:"sources"},sprite:{type:"string"},glyphs:{type:"string"},transition:{type:"transition"},layers:{required:!0,type:"array",value:"layer"}},sources:{"*":{type:"source"}},source:["source_vector","source_raster","source_raster_dem","source_geojson","source_video","source_image"],source_vector:{type:{required:!0,type:"enum",values:{vector:{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.0511,180,85.0511]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},attribution:{type:"string"},"*":{type:"*"}},source_raster:{type:{required:!0,type:"enum",values:{raster:{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.0511,180,85.0511]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},tileSize:{type:"number",default:512,units:"pixels"},scheme:{type:"enum",values:{xyz:{},tms:{}},default:"xyz"},attribution:{type:"string"},"*":{type:"*"}},source_raster_dem:{type:{required:!0,type:"enum",values:{"raster-dem":{}}},url:{type:"string"},tiles:{type:"array",value:"string"},bounds:{type:"array",value:"number",length:4,default:[-180,-85.0511,180,85.0511]},minzoom:{type:"number",default:0},maxzoom:{type:"number",default:22},tileSize:{type:"number",default:512,units:"pixels"},attribution:{type:"string"},encoding:{type:"enum",values:{terrarium:{},mapbox:{}},default:"mapbox"},"*":{type:"*"}},source_geojson:{type:{required:!0,type:"enum",values:{geojson:{}}},data:{type:"*"},maxzoom:{type:"number",default:18},buffer:{type:"number",default:128,maximum:512,minimum:0},tolerance:{type:"number",default:.375},cluster:{type:"boolean",default:!1},clusterRadius:{type:"number",default:50,minimum:0},clusterMaxZoom:{type:"number"},lineMetrics:{type:"boolean",default:!1}},source_video:{type:{required:!0,type:"enum",values:{video:{}}},urls:{required:!0,type:"array",value:"string"},coordinates:{required:!0,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},source_image:{type:{required:!0,type:"enum",values:{image:{}}},url:{required:!0,type:"string"},coordinates:{required:!0,type:"array",length:4,value:{type:"array",length:2,value:"number"}}},layer:{id:{type:"string",required:!0},type:{type:"enum",values:{fill:{},line:{},symbol:{},circle:{},heatmap:{},"fill-extrusion":{},raster:{},hillshade:{},background:{}},required:!0},metadata:{type:"*"},source:{type:"string"},"source-layer":{type:"string"},minzoom:{type:"number",minimum:0,maximum:24},maxzoom:{type:"number",minimum:0,maximum:24},filter:{type:"filter"},layout:{type:"layout"},paint:{type:"paint"}},layout:["layout_fill","layout_line","layout_circle","layout_heatmap","layout_fill-extrusion","layout_symbol","layout_raster","layout_hillshade","layout_background"],layout_background:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible"}},layout_fill:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible"}},layout_circle:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible"}},layout_heatmap:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible"}},layout_line:{"line-cap":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{butt:{},round:{},square:{}},default:"butt"},"line-join":{type:"enum",function:"piecewise-constant","zoom-function":!0,"property-function":!0,values:{bevel:{},round:{},miter:{}},default:"miter"},"line-miter-limit":{type:"number",default:2,function:"interpolated","zoom-function":!0,requires:[{"line-join":"miter"}]},"line-round-limit":{type:"number",default:1.05,function:"interpolated","zoom-function":!0,requires:[{"line-join":"round"}]},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible"}},layout_symbol:{"symbol-placement":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{point:{},line:{}},default:"point"},"symbol-spacing":{type:"number",default:250,minimum:1,function:"interpolated","zoom-function":!0,units:"pixels",requires:[{"symbol-placement":"line"}]},"symbol-avoid-edges":{type:"boolean",function:"piecewise-constant","zoom-function":!0,default:!1},"icon-allow-overlap":{type:"boolean",function:"piecewise-constant","zoom-function":!0,default:!1,requires:["icon-image"]},"icon-ignore-placement":{type:"boolean",function:"piecewise-constant","zoom-function":!0,default:!1,requires:["icon-image"]},"icon-optional":{type:"boolean",function:"piecewise-constant","zoom-function":!0,default:!1,requires:["icon-image","text-field"]},"icon-rotation-alignment":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{},auto:{}},default:"auto",requires:["icon-image"]},"icon-size":{type:"number",default:1,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,units:"factor of the original icon size",requires:["icon-image"]},"icon-text-fit":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{none:{},width:{},height:{},both:{}},default:"none",requires:["icon-image","text-field"]},"icon-text-fit-padding":{type:"array",value:"number",length:4,default:[0,0,0,0],units:"pixels",function:"interpolated","zoom-function":!0,requires:["icon-image","text-field",{"icon-text-fit":["both","width","height"]}]},"icon-image":{type:"string",function:"piecewise-constant","zoom-function":!0,"property-function":!0,tokens:!0},"icon-rotate":{type:"number",default:0,period:360,function:"interpolated","zoom-function":!0,"property-function":!0,units:"degrees",requires:["icon-image"]},"icon-padding":{type:"number",default:2,minimum:0,function:"interpolated","zoom-function":!0,units:"pixels",requires:["icon-image"]},"icon-keep-upright":{type:"boolean",function:"piecewise-constant","zoom-function":!0,default:!1,requires:["icon-image",{"icon-rotation-alignment":"map"},{"symbol-placement":"line"}]},"icon-offset":{type:"array",value:"number",length:2,default:[0,0],function:"interpolated","zoom-function":!0,"property-function":!0,requires:["icon-image"]},"icon-anchor":{type:"enum",function:"piecewise-constant","zoom-function":!0,"property-function":!0,values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},default:"center",requires:["icon-image"]},"icon-pitch-alignment":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{},auto:{}},default:"auto",requires:["icon-image"]},"text-pitch-alignment":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{},auto:{}},default:"auto",requires:["text-field"]},"text-rotation-alignment":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{},auto:{}},default:"auto",requires:["text-field"]},"text-field":{type:"string",function:"piecewise-constant","zoom-function":!0,"property-function":!0,default:"",tokens:!0},"text-font":{type:"array",value:"string",function:"piecewise-constant","zoom-function":!0,"property-function":!0,default:["Open Sans Regular","Arial Unicode MS Regular"],requires:["text-field"]},"text-size":{type:"number",default:16,minimum:0,units:"pixels",function:"interpolated","zoom-function":!0,"property-function":!0,requires:["text-field"]},"text-max-width":{type:"number",default:10,minimum:0,units:"ems",function:"interpolated","zoom-function":!0,"property-function":!0,requires:["text-field"]},"text-line-height":{type:"number",default:1.2,units:"ems",function:"interpolated","zoom-function":!0,requires:["text-field"]},"text-letter-spacing":{type:"number",default:0,units:"ems",function:"interpolated","zoom-function":!0,"property-function":!0,requires:["text-field"]},"text-justify":{type:"enum",function:"piecewise-constant","zoom-function":!0,"property-function":!0,values:{left:{},center:{},right:{}},default:"center",requires:["text-field"]},"text-anchor":{type:"enum",function:"piecewise-constant","zoom-function":!0,"property-function":!0,values:{center:{},left:{},right:{},top:{},bottom:{},"top-left":{},"top-right":{},"bottom-left":{},"bottom-right":{}},default:"center",requires:["text-field"]},"text-max-angle":{type:"number",default:45,units:"degrees",function:"interpolated","zoom-function":!0,requires:["text-field",{"symbol-placement":"line"}]},"text-rotate":{type:"number",default:0,period:360,units:"degrees",function:"interpolated","zoom-function":!0,"property-function":!0,requires:["text-field"]},"text-padding":{type:"number",default:2,minimum:0,units:"pixels",function:"interpolated","zoom-function":!0,requires:["text-field"]},"text-keep-upright":{type:"boolean",function:"piecewise-constant","zoom-function":!0,default:!0,requires:["text-field",{"text-rotation-alignment":"map"},{"symbol-placement":"line"}]},"text-transform":{type:"enum",function:"piecewise-constant","zoom-function":!0,"property-function":!0,values:{none:{},uppercase:{},lowercase:{}},default:"none",requires:["text-field"]},"text-offset":{type:"array",value:"number",units:"ems",function:"interpolated","zoom-function":!0,"property-function":!0,length:2,default:[0,0],requires:["text-field"]},"text-allow-overlap":{type:"boolean",function:"piecewise-constant","zoom-function":!0,default:!1,requires:["text-field"]},"text-ignore-placement":{type:"boolean",function:"piecewise-constant","zoom-function":!0,default:!1,requires:["text-field"]},"text-optional":{type:"boolean",function:"piecewise-constant","zoom-function":!0,default:!1,requires:["text-field","icon-image"]},visibility:{type:"enum",values:{visible:{},none:{}},default:"visible"}},layout_raster:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible"}},layout_hillshade:{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible"}},filter:{type:"array",value:"*"},filter_operator:{type:"enum",values:{"==":{},"!=":{},">":{},">=":{},"<":{},"<=":{},in:{},"!in":{},all:{},any:{},none:{},has:{},"!has":{}}},geometry_type:{type:"enum",values:{Point:{},LineString:{},Polygon:{}}},function_stop:{type:"array",minimum:0,maximum:22,value:["number","color"],length:2},expression:{type:"array",value:"*",minimum:1},expression_name:{type:"enum",values:{let:{group:"Variable binding"},var:{group:"Variable binding"},literal:{group:"Types"},array:{group:"Types"},at:{group:"Lookup"},case:{group:"Decision"},match:{group:"Decision"},coalesce:{group:"Decision"},step:{group:"Ramps, scales, curves"},interpolate:{group:"Ramps, scales, curves"},ln2:{group:"Math"},pi:{group:"Math"},e:{group:"Math"},typeof:{group:"Types"},string:{group:"Types"},number:{group:"Types"},boolean:{group:"Types"},object:{group:"Types"},collator:{group:"Types"},"to-string":{group:"Types"},"to-number":{group:"Types"},"to-boolean":{group:"Types"},"to-rgba":{group:"Color"},"to-color":{group:"Types"},rgb:{group:"Color"},rgba:{group:"Color"},get:{group:"Lookup"},has:{group:"Lookup"},length:{group:"Lookup"},properties:{group:"Feature data"},"geometry-type":{group:"Feature data"},id:{group:"Feature data"},zoom:{group:"Zoom"},"heatmap-density":{group:"Heatmap"},"line-progress":{group:"Heatmap"},"+":{group:"Math"},"*":{group:"Math"},"-":{group:"Math"},"/":{group:"Math"},"%":{group:"Math"},"^":{group:"Math"},sqrt:{group:"Math"},log10:{group:"Math"},ln:{group:"Math"},log2:{group:"Math"},sin:{group:"Math"},cos:{group:"Math"},tan:{group:"Math"},asin:{group:"Math"},acos:{group:"Math"},atan:{group:"Math"},min:{group:"Math"},max:{group:"Math"},round:{group:"Math"},abs:{group:"Math"},ceil:{group:"Math"},floor:{group:"Math"},"==":{group:"Decision"},"!=":{group:"Decision"},">":{group:"Decision"},"<":{group:"Decision"},">=":{group:"Decision"},"<=":{group:"Decision"},all:{group:"Decision"},any:{group:"Decision"},"!":{group:"Decision"},"is-supported-script":{group:"String"},upcase:{group:"String"},downcase:{group:"String"},concat:{group:"String"},"resolved-locale":{group:"String"}}},light:{anchor:{type:"enum",default:"viewport",values:{map:{},viewport:{}},transition:!1,"zoom-function":!0,"property-function":!1,function:"piecewise-constant"},position:{type:"array",default:[1.15,210,30],length:3,value:"number",transition:!0,function:"interpolated","zoom-function":!0,"property-function":!1},color:{type:"color",default:"#ffffff",function:"interpolated","zoom-function":!0,"property-function":!1,transition:!0},intensity:{type:"number",default:.5,minimum:0,maximum:1,function:"interpolated","zoom-function":!0,"property-function":!1,transition:!0}},paint:["paint_fill","paint_line","paint_circle","paint_heatmap","paint_fill-extrusion","paint_symbol","paint_raster","paint_hillshade","paint_background"],paint_fill:{"fill-antialias":{type:"boolean",function:"piecewise-constant","zoom-function":!0,default:!0},"fill-opacity":{type:"number",function:"interpolated","zoom-function":!0,"property-function":!0,default:1,minimum:0,maximum:1,transition:!0},"fill-color":{type:"color",default:"#000000",function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,requires:[{"!":"fill-pattern"}]},"fill-outline-color":{type:"color",function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,requires:[{"!":"fill-pattern"},{"fill-antialias":!0}]},"fill-translate":{type:"array",value:"number",length:2,default:[0,0],function:"interpolated","zoom-function":!0,transition:!0,units:"pixels"},"fill-translate-anchor":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{}},default:"map",requires:["fill-translate"]},"fill-pattern":{type:"string",function:"piecewise-constant","zoom-function":!0,transition:!0}},paint_line:{"line-opacity":{type:"number",function:"interpolated","zoom-function":!0,"property-function":!0,default:1,minimum:0,maximum:1,transition:!0},"line-color":{type:"color",default:"#000000",function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,requires:[{"!":"line-pattern"}]},"line-translate":{type:"array",value:"number",length:2,default:[0,0],function:"interpolated","zoom-function":!0,transition:!0,units:"pixels"},"line-translate-anchor":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{}},default:"map",requires:["line-translate"]},"line-width":{type:"number",default:1,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels"},"line-gap-width":{type:"number",default:0,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels"},"line-offset":{type:"number",default:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels"},"line-blur":{type:"number",default:0,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels"},"line-dasharray":{type:"array",value:"number",function:"piecewise-constant","zoom-function":!0,minimum:0,transition:!0,units:"line widths",requires:[{"!":"line-pattern"}]},"line-pattern":{type:"string",function:"piecewise-constant","zoom-function":!0,transition:!0},"line-gradient":{type:"color",function:"interpolated","zoom-function":!1,"property-function":!1,transition:!1,requires:[{"!":"line-dasharray"},{"!":"line-pattern"},{source:"geojson",has:{lineMetrics:!0}}]}},paint_circle:{"circle-radius":{type:"number",default:5,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels"},"circle-color":{type:"color",default:"#000000",function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0},"circle-blur":{type:"number",default:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0},"circle-opacity":{type:"number",default:1,minimum:0,maximum:1,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0},"circle-translate":{type:"array",value:"number",length:2,default:[0,0],function:"interpolated","zoom-function":!0,transition:!0,units:"pixels"},"circle-translate-anchor":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{}},default:"map",requires:["circle-translate"]},"circle-pitch-scale":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{}},default:"map"},"circle-pitch-alignment":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{}},default:"viewport"},"circle-stroke-width":{type:"number",default:0,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels"},"circle-stroke-color":{type:"color",default:"#000000",function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0},"circle-stroke-opacity":{type:"number",default:1,minimum:0,maximum:1,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0}},paint_heatmap:{"heatmap-radius":{type:"number",default:30,minimum:1,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels"},"heatmap-weight":{type:"number",default:1,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!1},"heatmap-intensity":{type:"number",default:1,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!1,transition:!0},"heatmap-color":{type:"color",default:["interpolate",["linear"],["heatmap-density"],0,"rgba(0, 0, 255, 0)",.1,"royalblue",.3,"cyan",.5,"lime",.7,"yellow",1,"red"],function:"interpolated","zoom-function":!1,"property-function":!1,transition:!1},"heatmap-opacity":{type:"number",default:1,minimum:0,maximum:1,function:"interpolated","zoom-function":!0,"property-function":!1,transition:!0}},paint_symbol:{"icon-opacity":{type:"number",default:1,minimum:0,maximum:1,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,requires:["icon-image"]},"icon-color":{type:"color",default:"#000000",function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,requires:["icon-image"]},"icon-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,requires:["icon-image"]},"icon-halo-width":{type:"number",default:0,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels",requires:["icon-image"]},"icon-halo-blur":{type:"number",default:0,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels",requires:["icon-image"]},"icon-translate":{type:"array",value:"number",length:2,default:[0,0],function:"interpolated","zoom-function":!0,transition:!0,units:"pixels",requires:["icon-image"]},"icon-translate-anchor":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{}},default:"map",requires:["icon-image","icon-translate"]},"text-opacity":{type:"number",default:1,minimum:0,maximum:1,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,requires:["text-field"]},"text-color":{type:"color",default:"#000000",function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,requires:["text-field"]},"text-halo-color":{type:"color",default:"rgba(0, 0, 0, 0)",function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,requires:["text-field"]},"text-halo-width":{type:"number",default:0,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels",requires:["text-field"]},"text-halo-blur":{type:"number",default:0,minimum:0,function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,units:"pixels",requires:["text-field"]},"text-translate":{type:"array",value:"number",length:2,default:[0,0],function:"interpolated","zoom-function":!0,transition:!0,units:"pixels",requires:["text-field"]},"text-translate-anchor":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{}},default:"map",requires:["text-field","text-translate"]}},paint_raster:{"raster-opacity":{type:"number",default:1,minimum:0,maximum:1,function:"interpolated","zoom-function":!0,transition:!0},"raster-hue-rotate":{type:"number",default:0,period:360,function:"interpolated","zoom-function":!0,transition:!0,units:"degrees"},"raster-brightness-min":{type:"number",function:"interpolated","zoom-function":!0,default:0,minimum:0,maximum:1,transition:!0},"raster-brightness-max":{type:"number",function:"interpolated","zoom-function":!0,default:1,minimum:0,maximum:1,transition:!0},"raster-saturation":{type:"number",default:0,minimum:-1,maximum:1,function:"interpolated","zoom-function":!0,transition:!0},"raster-contrast":{type:"number",default:0,minimum:-1,maximum:1,function:"interpolated","zoom-function":!0,transition:!0},"raster-fade-duration":{type:"number",default:300,minimum:0,function:"interpolated","zoom-function":!0,transition:!1,units:"milliseconds"}},paint_hillshade:{"hillshade-illumination-direction":{type:"number",default:335,minimum:0,maximum:359,function:"interpolated","zoom-function":!0,transition:!1},"hillshade-illumination-anchor":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{}},default:"viewport"},"hillshade-exaggeration":{type:"number",default:.5,minimum:0,maximum:1,function:"interpolated","zoom-function":!0,transition:!0},"hillshade-shadow-color":{type:"color",default:"#000000",function:"interpolated","zoom-function":!0,transition:!0},"hillshade-highlight-color":{type:"color",default:"#FFFFFF",function:"interpolated","zoom-function":!0,transition:!0},"hillshade-accent-color":{type:"color",default:"#000000",function:"interpolated","zoom-function":!0,transition:!0}},paint_background:{"background-color":{type:"color",default:"#000000",function:"interpolated","zoom-function":!0,transition:!0,requires:[{"!":"background-pattern"}]},"background-pattern":{type:"string",function:"piecewise-constant","zoom-function":!0,transition:!0},"background-opacity":{type:"number",default:1,minimum:0,maximum:1,function:"interpolated","zoom-function":!0,transition:!0}},transition:{duration:{type:"number",default:300,minimum:0,units:"milliseconds"},delay:{type:"number",default:0,minimum:0,units:"milliseconds"}},"layout_fill-extrusion":{visibility:{type:"enum",values:{visible:{},none:{}},default:"visible"}},function:{expression:{type:"expression"},stops:{type:"array",value:"function_stop"},base:{type:"number",default:1,minimum:0},property:{type:"string",default:"$zoom"},type:{type:"enum",values:{identity:{},exponential:{},interval:{},categorical:{}},default:"exponential"},colorSpace:{type:"enum",values:{rgb:{},lab:{},hcl:{}},default:"rgb"},default:{type:"*",required:!1}},"paint_fill-extrusion":{"fill-extrusion-opacity":{type:"number",function:"interpolated","zoom-function":!0,"property-function":!1,default:1,minimum:0,maximum:1,transition:!0},"fill-extrusion-color":{type:"color",default:"#000000",function:"interpolated","zoom-function":!0,"property-function":!0,transition:!0,requires:[{"!":"fill-extrusion-pattern"}]},"fill-extrusion-translate":{type:"array",value:"number",length:2,default:[0,0],function:"interpolated","zoom-function":!0,transition:!0,units:"pixels"},"fill-extrusion-translate-anchor":{type:"enum",function:"piecewise-constant","zoom-function":!0,values:{map:{},viewport:{}},default:"map",requires:["fill-extrusion-translate"]},"fill-extrusion-pattern":{type:"string",function:"piecewise-constant","zoom-function":!0,transition:!0},"fill-extrusion-height":{type:"number",function:"interpolated","zoom-function":!0,"property-function":!0,default:0,minimum:0,units:"meters",transition:!0},"fill-extrusion-base":{type:"number",function:"interpolated","zoom-function":!0,"property-function":!0,default:0,minimum:0,units:"meters",transition:!0,requires:["fill-extrusion-height"]}}},O=function(t,e,r,n){this.message=(t?t+": ":"")+r,n&&(this.identifier=n),null!=e&&e.__line__&&(this.line=e.__line__)};function D(t){var e=t.key,r=t.value;return r?[new O(e,r,"constants have been deprecated as of v8")]:[]}function R(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];for(var n=0,i=e;n<i.length;n+=1){var a=i[n];for(var o in a)t[o]=a[o]}return t}function B(t){return t instanceof Number||t instanceof String||t instanceof Boolean?t.valueOf():t}function F(t){return Array.isArray(t)?t.map(F):B(t)}var N=function(t){function e(e,r){t.call(this,r),this.message=r,this.key=e}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Error),j=function(t,e){void 0===e&&(e=[]),this.parent=t,this.bindings={};for(var r=0,n=e;r<n.length;r+=1){var i=n[r],a=i[0],o=i[1];this.bindings[a]=o}};j.prototype.concat=function(t){return new j(this,t)},j.prototype.get=function(t){if(this.bindings[t])return this.bindings[t];if(this.parent)return this.parent.get(t);throw new Error(t+" not found in scope.")},j.prototype.has=function(t){return!!this.bindings[t]||!!this.parent&&this.parent.has(t)};var V={kind:"null"},U={kind:"number"},q={kind:"string"},H={kind:"boolean"},G={kind:"color"},W={kind:"object"},Y={kind:"value"},X={kind:"collator"};function Z(t,e){return{kind:"array",itemType:t,N:e}}function $(t){if("array"===t.kind){var e=$(t.itemType);return"number"==typeof t.N?"array<"+e+", "+t.N+">":"value"===t.itemType.kind?"array":"array<"+e+">"}return t.kind}var J=[V,U,q,H,G,W,Z(Y)];function K(t,e){if("error"===e.kind)return null;if("array"===t.kind){if("array"===e.kind&&!K(t.itemType,e.itemType)&&("number"!=typeof t.N||t.N===e.N))return null}else{if(t.kind===e.kind)return null;if("value"===t.kind)for(var r=0,n=J;r<n.length;r+=1)if(!K(n[r],e))return null}return"Expected "+$(t)+" but found "+$(e)+" instead."}var Q=i(function(t,e){var r={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function n(t){return(t=Math.round(t))<0?0:t>255?255:t}function i(t){return t<0?0:t>1?1:t}function a(t){return"%"===t[t.length-1]?n(parseFloat(t)/100*255):n(parseInt(t))}function o(t){return"%"===t[t.length-1]?i(parseFloat(t)/100):i(parseFloat(t))}function s(t,e,r){return r<0?r+=1:r>1&&(r-=1),6*r<1?t+(e-t)*r*6:2*r<1?e:3*r<2?t+(e-t)*(2/3-r)*6:t}try{e.parseCSSColor=function(t){var e,i=t.replace(/ /g,"").toLowerCase();if(i in r)return r[i].slice();if("#"===i[0])return 4===i.length?(e=parseInt(i.substr(1),16))>=0&&e<=4095?[(3840&e)>>4|(3840&e)>>8,240&e|(240&e)>>4,15&e|(15&e)<<4,1]:null:7===i.length&&(e=parseInt(i.substr(1),16))>=0&&e<=16777215?[(16711680&e)>>16,(65280&e)>>8,255&e,1]:null;var l=i.indexOf("("),c=i.indexOf(")");if(-1!==l&&c+1===i.length){var u=i.substr(0,l),h=i.substr(l+1,c-(l+1)).split(","),f=1;switch(u){case"rgba":if(4!==h.length)return null;f=o(h.pop());case"rgb":return 3!==h.length?null:[a(h[0]),a(h[1]),a(h[2]),f];case"hsla":if(4!==h.length)return null;f=o(h.pop());case"hsl":if(3!==h.length)return null;var p=(parseFloat(h[0])%360+360)%360/360,d=o(h[1]),g=o(h[2]),m=g<=.5?g*(d+1):g+d-g*d,v=2*g-m;return[n(255*s(v,m,p+1/3)),n(255*s(v,m,p)),n(255*s(v,m,p-1/3)),f];default:return null}}return null}}catch(t){}}).parseCSSColor,tt=function(t,e,r,n){void 0===n&&(n=1),this.r=t,this.g=e,this.b=r,this.a=n};tt.parse=function(t){if(t){if(t instanceof tt)return t;if("string"==typeof t){var e=Q(t);if(e)return new tt(e[0]/255*e[3],e[1]/255*e[3],e[2]/255*e[3],e[3])}}},tt.prototype.toString=function(){var t=this.toArray(),e=t[0],r=t[1],n=t[2],i=t[3];return"rgba("+Math.round(e)+","+Math.round(r)+","+Math.round(n)+","+i+")"},tt.prototype.toArray=function(){var t=this.r,e=this.g,r=this.b,n=this.a;return 0===n?[0,0,0,0]:[255*t/n,255*e/n,255*r/n,n]},tt.black=new tt(0,0,0,1),tt.white=new tt(1,1,1,1),tt.transparent=new tt(0,0,0,0);var et=function(t,e,r){this.sensitivity=t?e?"variant":"case":e?"accent":"base",this.locale=r,this.collator=new Intl.Collator(this.locale?this.locale:[],{sensitivity:this.sensitivity,usage:"search"})};et.prototype.compare=function(t,e){return this.collator.compare(t,e)},et.prototype.resolvedLocale=function(){return new Intl.Collator(this.locale?this.locale:[]).resolvedOptions().locale};var rt=function(t,e,r){this.type=X,this.locale=r,this.caseSensitive=t,this.diacriticSensitive=e};function nt(t,e,r,n){return"number"==typeof t&&t>=0&&t<=255&&"number"==typeof e&&e>=0&&e<=255&&"number"==typeof r&&r>=0&&r<=255?void 0===n||"number"==typeof n&&n>=0&&n<=1?null:"Invalid rgba value ["+[t,e,r,n].join(", ")+"]: 'a' must be between 0 and 1.":"Invalid rgba value ["+("number"==typeof n?[t,e,r,n]:[t,e,r]).join(", ")+"]: 'r', 'g', and 'b' must be between 0 and 255."}function it(t){if(null===t)return V;if("string"==typeof t)return q;if("boolean"==typeof t)return H;if("number"==typeof t)return U;if(t instanceof tt)return G;if(t instanceof et)return X;if(Array.isArray(t)){for(var e,r=t.length,n=0,i=t;n<i.length;n+=1){var a=it(i[n]);if(e){if(e===a)continue;e=Y;break}e=a}return Z(e||Y,r)}return W}rt.parse=function(t,e){if(2!==t.length)return e.error("Expected one argument.");var r=t[1];if("object"!=typeof r||Array.isArray(r))return e.error("Collator options argument must be an object.");var n=e.parse(void 0!==r["case-sensitive"]&&r["case-sensitive"],1,H);if(!n)return null;var i=e.parse(void 0!==r["diacritic-sensitive"]&&r["diacritic-sensitive"],1,H);if(!i)return null;var a=null;return r.locale&&!(a=e.parse(r.locale,1,q))?null:new rt(n,i,a)},rt.prototype.evaluate=function(t){return new et(this.caseSensitive.evaluate(t),this.diacriticSensitive.evaluate(t),this.locale?this.locale.evaluate(t):null)},rt.prototype.eachChild=function(t){t(this.caseSensitive),t(this.diacriticSensitive),this.locale&&t(this.locale)},rt.prototype.possibleOutputs=function(){return[void 0]},rt.prototype.serialize=function(){var t={};return t["case-sensitive"]=this.caseSensitive.serialize(),t["diacritic-sensitive"]=this.diacriticSensitive.serialize(),this.locale&&(t.locale=this.locale.serialize()),["collator",t]};var at=function(t,e){this.type=t,this.value=e};at.parse=function(t,e){if(2!==t.length)return e.error("'literal' expression requires exactly one argument, but found "+(t.length-1)+" instead.");if(!function t(e){if(null===e)return!0;if("string"==typeof e)return!0;if("boolean"==typeof e)return!0;if("number"==typeof e)return!0;if(e instanceof tt)return!0;if(e instanceof et)return!0;if(Array.isArray(e)){for(var r=0,n=e;r<n.length;r+=1)if(!t(n[r]))return!1;return!0}if("object"==typeof e){for(var i in e)if(!t(e[i]))return!1;return!0}return!1}(t[1]))return e.error("invalid value");var r=t[1],n=it(r),i=e.expectedType;return"array"!==n.kind||0!==n.N||!i||"array"!==i.kind||"number"==typeof i.N&&0!==i.N||(n=i),new at(n,r)},at.prototype.evaluate=function(){return this.value},at.prototype.eachChild=function(){},at.prototype.possibleOutputs=function(){return[this.value]},at.prototype.serialize=function(){return"array"===this.type.kind||"object"===this.type.kind?["literal",this.value]:this.value instanceof tt?["rgba"].concat(this.value.toArray()):this.value};var ot=function(t){this.name="ExpressionEvaluationError",this.message=t};ot.prototype.toJSON=function(){return this.message};var st={string:q,number:U,boolean:H,object:W},lt=function(t,e){this.type=t,this.args=e};lt.parse=function(t,e){if(t.length<2)return e.error("Expected at least one argument.");for(var r=t[0],n=st[r],i=[],a=1;a<t.length;a++){var o=e.parse(t[a],a,Y);if(!o)return null;i.push(o)}return new lt(n,i)},lt.prototype.evaluate=function(t){for(var e=0;e<this.args.length;e++){var r=this.args[e].evaluate(t);if(!K(this.type,it(r)))return r;if(e===this.args.length-1)throw new ot("Expected value to be of type "+$(this.type)+", but found "+$(it(r))+" instead.")}return null},lt.prototype.eachChild=function(t){this.args.forEach(t)},lt.prototype.possibleOutputs=function(){return(t=[]).concat.apply(t,this.args.map(function(t){return t.possibleOutputs()}));var t},lt.prototype.serialize=function(){return[this.type.kind].concat(this.args.map(function(t){return t.serialize()}))};var ct={string:q,number:U,boolean:H},ut=function(t,e){this.type=t,this.input=e};ut.parse=function(t,e){if(t.length<2||t.length>4)return e.error("Expected 1, 2, or 3 arguments, but found "+(t.length-1)+" instead.");var r,n;if(t.length>2){var i=t[1];if("string"!=typeof i||!(i in ct))return e.error('The item type argument of "array" must be one of string, number, boolean',1);r=ct[i]}else r=Y;if(t.length>3){if("number"!=typeof t[2]||t[2]<0||t[2]!==Math.floor(t[2]))return e.error('The length argument to "array" must be a positive integer literal',2);n=t[2]}var a=Z(r,n),o=e.parse(t[t.length-1],t.length-1,Y);return o?new ut(a,o):null},ut.prototype.evaluate=function(t){var e=this.input.evaluate(t);if(K(this.type,it(e)))throw new ot("Expected value to be of type "+$(this.type)+", but found "+$(it(e))+" instead.");return e},ut.prototype.eachChild=function(t){t(this.input)},ut.prototype.possibleOutputs=function(){return this.input.possibleOutputs()},ut.prototype.serialize=function(){var t=["array"],e=this.type.itemType;if("string"===e.kind||"number"===e.kind||"boolean"===e.kind){t.push(e.kind);var r=this.type.N;"number"==typeof r&&t.push(r)}return t.push(this.input.serialize()),t};var ht={"to-number":U,"to-color":G},ft=function(t,e){this.type=t,this.args=e};ft.parse=function(t,e){if(t.length<2)return e.error("Expected at least one argument.");for(var r=t[0],n=ht[r],i=[],a=1;a<t.length;a++){var o=e.parse(t[a],a,Y);if(!o)return null;i.push(o)}return new ft(n,i)},ft.prototype.evaluate=function(t){if("color"===this.type.kind){for(var e,r,n=0,i=this.args;n<i.length;n+=1)if(r=null,"string"==typeof(e=i[n].evaluate(t))){var a=t.parseColor(e);if(a)return a}else if(Array.isArray(e)&&!(r=e.length<3||e.length>4?"Invalid rbga value "+JSON.stringify(e)+": expected an array containing either three or four numeric values.":nt(e[0],e[1],e[2],e[3])))return new tt(e[0]/255,e[1]/255,e[2]/255,e[3]);throw new ot(r||"Could not parse color from value '"+("string"==typeof e?e:JSON.stringify(e))+"'")}for(var o=null,s=0,l=this.args;s<l.length;s+=1)if(null!==(o=l[s].evaluate(t))){var c=Number(o);if(!isNaN(c))return c}throw new ot("Could not convert "+JSON.stringify(o)+" to number.")},ft.prototype.eachChild=function(t){this.args.forEach(t)},ft.prototype.possibleOutputs=function(){return(t=[]).concat.apply(t,this.args.map(function(t){return t.possibleOutputs()}));var t},ft.prototype.serialize=function(){var t=["to-"+this.type.kind];return this.eachChild(function(e){t.push(e.serialize())}),t};var pt=["Unknown","Point","LineString","Polygon"],dt=function(){this._parseColorCache={}};dt.prototype.id=function(){return this.feature&&"id"in this.feature?this.feature.id:null},dt.prototype.geometryType=function(){return this.feature?"number"==typeof this.feature.type?pt[this.feature.type]:this.feature.type:null},dt.prototype.properties=function(){return this.feature&&this.feature.properties||{}},dt.prototype.parseColor=function(t){var e=this._parseColorCache[t];return e||(e=this._parseColorCache[t]=tt.parse(t)),e};var gt=function(t,e,r,n){this.name=t,this.type=e,this._evaluate=r,this.args=n};function mt(t){if(t instanceof gt){if("get"===t.name&&1===t.args.length)return!1;if("has"===t.name&&1===t.args.length)return!1;if("properties"===t.name||"geometry-type"===t.name||"id"===t.name)return!1;if(/^filter-/.test(t.name))return!1}var e=!0;return t.eachChild(function(t){e&&!mt(t)&&(e=!1)}),e}function vt(t,e){if(t instanceof gt&&e.indexOf(t.name)>=0)return!1;var r=!0;return t.eachChild(function(t){r&&!vt(t,e)&&(r=!1)}),r}gt.prototype.evaluate=function(t){return this._evaluate(t,this.args)},gt.prototype.eachChild=function(t){this.args.forEach(t)},gt.prototype.possibleOutputs=function(){return[void 0]},gt.prototype.serialize=function(){return[this.name].concat(this.args.map(function(t){return t.serialize()}))},gt.parse=function(t,e){var r=t[0],n=gt.definitions[r];if(!n)return e.error('Unknown expression "'+r+'". If you wanted a literal array, use ["literal", [...]].',0);for(var i=Array.isArray(n)?n[0]:n.type,a=Array.isArray(n)?[[n[1],n[2]]]:n.overloads,o=a.filter(function(e){var r=e[0];return!Array.isArray(r)||r.length===t.length-1}),s=[],l=1;l<t.length;l++){var c=t[l],u=void 0;if(1===o.length){var h=o[0][0];u=Array.isArray(h)?h[l-1]:h.type}var f=e.parse(c,1+s.length,u);if(!f)return null;s.push(f)}for(var p=null,d=0,g=o;d<g.length;d+=1){var m=g[d],v=m[0],y=m[1];if(p=new xt(e.registry,e.path,null,e.scope),Array.isArray(v)&&v.length!==s.length)p.error("Expected "+v.length+" arguments, but found "+s.length+" instead.");else{for(var x=0;x<s.length;x++){var b=Array.isArray(v)?v[x]:v.type,_=s[x];p.concat(x+1).checkSubtype(b,_.type)}if(0===p.errors.length)return new gt(r,i,y,s)}}if(1===o.length)e.errors.push.apply(e.errors,p.errors);else{var w=(o.length?o:a).map(function(t){var e;return e=t[0],Array.isArray(e)?"("+e.map($).join(", ")+")":"("+$(e.type)+"...)"}).join(" | "),k=s.map(function(t){return $(t.type)}).join(", ");e.error("Expected arguments of type "+w+", but found ("+k+") instead.")}return null},gt.register=function(t,e){for(var r in gt.definitions=e,e)t[r]=gt};var yt=function(t,e){this.type=e.type,this.name=t,this.boundExpression=e};yt.parse=function(t,e){if(2!==t.length||"string"!=typeof t[1])return e.error("'var' expression requires exactly one string literal argument.");var r=t[1];return e.scope.has(r)?new yt(r,e.scope.get(r)):e.error('Unknown variable "'+r+'". Make sure "'+r+'" has been bound in an enclosing "let" expression before using it.',1)},yt.prototype.evaluate=function(t){return this.boundExpression.evaluate(t)},yt.prototype.eachChild=function(){},yt.prototype.possibleOutputs=function(){return[void 0]},yt.prototype.serialize=function(){return["var",this.name]};var xt=function(t,e,r,n,i){void 0===e&&(e=[]),void 0===n&&(n=new j),void 0===i&&(i=[]),this.registry=t,this.path=e,this.key=e.map(function(t){return"["+t+"]"}).join(""),this.scope=n,this.errors=i,this.expectedType=r};function bt(t,e){for(var r,n,i=0,a=t.length-1,o=0;i<=a;){if(r=t[o=Math.floor((i+a)/2)],n=t[o+1],e===r||e>r&&e<n)return o;if(r<e)i=o+1;else{if(!(r>e))throw new ot("Input is not a number.");a=o-1}}return Math.max(o-1,0)}xt.prototype.parse=function(t,e,r,n,i){return void 0===i&&(i={}),e?this.concat(e,r,n)._parse(t,i):this._parse(t,i)},xt.prototype._parse=function(t,e){if(null!==t&&"string"!=typeof t&&"boolean"!=typeof t&&"number"!=typeof t||(t=["literal",t]),Array.isArray(t)){if(0===t.length)return this.error('Expected an array with at least one element. If you wanted a literal array, use ["literal", []].');var r=t[0];if("string"!=typeof r)return this.error("Expression name must be a string, but found "+typeof r+' instead. If you wanted a literal array, use ["literal", [...]].',0),null;var n=this.registry[r];if(n){var i=n.parse(t,this);if(!i)return null;if(this.expectedType){var a=this.expectedType,o=i.type;if("string"!==a.kind&&"number"!==a.kind&&"boolean"!==a.kind&&"object"!==a.kind||"value"!==o.kind)if("array"===a.kind&&"value"===o.kind)e.omitTypeAnnotations||(i=new ut(a,i));else if("color"!==a.kind||"value"!==o.kind&&"string"!==o.kind){if(this.checkSubtype(this.expectedType,i.type))return null}else e.omitTypeAnnotations||(i=new ft(a,[i]));else e.omitTypeAnnotations||(i=new lt(a,[i]))}if(!(i instanceof at)&&function t(e){if(e instanceof yt)return t(e.boundExpression);if(e instanceof gt&&"error"===e.name)return!1;if(e instanceof rt)return!1;var r=e instanceof ft||e instanceof lt||e instanceof ut,n=!0;return e.eachChild(function(e){n=r?n&&t(e):n&&e instanceof at}),!!n&&(mt(e)&&vt(e,["zoom","heatmap-density","line-progress","is-supported-script"]))}(i)){var s=new dt;try{i=new at(i.type,i.evaluate(s))}catch(t){return this.error(t.message),null}}return i}return this.error('Unknown expression "'+r+'". If you wanted a literal array, use ["literal", [...]].',0)}return void 0===t?this.error("'undefined' value invalid. Use null instead."):"object"==typeof t?this.error('Bare objects invalid. Use ["literal", {...}] instead.'):this.error("Expected an array, but found "+typeof t+" instead.")},xt.prototype.concat=function(t,e,r){var n="number"==typeof t?this.path.concat(t):this.path,i=r?this.scope.concat(r):this.scope;return new xt(this.registry,n,e||null,i,this.errors)},xt.prototype.error=function(t){for(var e=[],r=arguments.length-1;r-- >0;)e[r]=arguments[r+1];var n=""+this.key+e.map(function(t){return"["+t+"]"}).join("");this.errors.push(new N(n,t))},xt.prototype.checkSubtype=function(t,e){var r=K(t,e);return r&&this.error(r),r};var _t=function(t,e,r){this.type=t,this.input=e,this.labels=[],this.outputs=[];for(var n=0,i=r;n<i.length;n+=1){var a=i[n],o=a[0],s=a[1];this.labels.push(o),this.outputs.push(s)}};function wt(t,e,r){return t*(1-r)+e*r}_t.parse=function(t,e){var r=t[1],n=t.slice(2);if(t.length-1<4)return e.error("Expected at least 4 arguments, but found only "+(t.length-1)+".");if((t.length-1)%2!=0)return e.error("Expected an even number of arguments.");if(!(r=e.parse(r,1,U)))return null;var i=[],a=null;e.expectedType&&"value"!==e.expectedType.kind&&(a=e.expectedType),n.unshift(-1/0);for(var o=0;o<n.length;o+=2){var s=n[o],l=n[o+1],c=o+1,u=o+2;if("number"!=typeof s)return e.error('Input/output pairs for "step" expressions must be defined using literal numeric values (not computed expressions) for the input values.',c);if(i.length&&i[i.length-1][0]>=s)return e.error('Input/output pairs for "step" expressions must be arranged with input values in strictly ascending order.',c);var h=e.parse(l,u,a);if(!h)return null;a=a||h.type,i.push([s,h])}return new _t(a,r,i)},_t.prototype.evaluate=function(t){var e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);var n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);var i=e.length;return n>=e[i-1]?r[i-1].evaluate(t):r[bt(e,n)].evaluate(t)},_t.prototype.eachChild=function(t){t(this.input);for(var e=0,r=this.outputs;e<r.length;e+=1)t(r[e])},_t.prototype.possibleOutputs=function(){return(t=[]).concat.apply(t,this.outputs.map(function(t){return t.possibleOutputs()}));var t},_t.prototype.serialize=function(){for(var t=["step",this.input.serialize()],e=0;e<this.labels.length;e++)e>0&&t.push(this.labels[e]),t.push(this.outputs[e].serialize());return t};var kt=Object.freeze({number:wt,color:function(t,e,r){return new tt(wt(t.r,e.r,r),wt(t.g,e.g,r),wt(t.b,e.b,r),wt(t.a,e.a,r))},array:function(t,e,r){return t.map(function(t,n){return wt(t,e[n],r)})}}),Mt=function(t,e,r,n){this.type=t,this.interpolation=e,this.input=r,this.labels=[],this.outputs=[];for(var i=0,a=n;i<a.length;i+=1){var o=a[i],s=o[0],l=o[1];this.labels.push(s),this.outputs.push(l)}};function At(t,e,r,n){var i=n-r,a=t-r;return 0===i?0:1===e?a/i:(Math.pow(e,a)-1)/(Math.pow(e,i)-1)}Mt.interpolationFactor=function(t,e,r,n){var i=0;if("exponential"===t.name)i=At(e,t.base,r,n);else if("linear"===t.name)i=At(e,1,r,n);else if("cubic-bezier"===t.name){var o=t.controlPoints;i=new a(o[0],o[1],o[2],o[3]).solve(At(e,1,r,n))}return i},Mt.parse=function(t,e){var r=t[1],n=t[2],i=t.slice(3);if(!Array.isArray(r)||0===r.length)return e.error("Expected an interpolation type expression.",1);if("linear"===r[0])r={name:"linear"};else if("exponential"===r[0]){var a=r[1];if("number"!=typeof a)return e.error("Exponential interpolation requires a numeric base.",1,1);r={name:"exponential",base:a}}else{if("cubic-bezier"!==r[0])return e.error("Unknown interpolation type "+String(r[0]),1,0);var o=r.slice(1);if(4!==o.length||o.some(function(t){return"number"!=typeof t||t<0||t>1}))return e.error("Cubic bezier interpolation requires four numeric arguments with values between 0 and 1.",1);r={name:"cubic-bezier",controlPoints:o}}if(t.length-1<4)return e.error("Expected at least 4 arguments, but found only "+(t.length-1)+".");if((t.length-1)%2!=0)return e.error("Expected an even number of arguments.");if(!(n=e.parse(n,2,U)))return null;var s=[],l=null;e.expectedType&&"value"!==e.expectedType.kind&&(l=e.expectedType);for(var c=0;c<i.length;c+=2){var u=i[c],h=i[c+1],f=c+3,p=c+4;if("number"!=typeof u)return e.error('Input/output pairs for "interpolate" expressions must be defined using literal numeric values (not computed expressions) for the input values.',f);if(s.length&&s[s.length-1][0]>=u)return e.error('Input/output pairs for "interpolate" expressions must be arranged with input values in strictly ascending order.',f);var d=e.parse(h,p,l);if(!d)return null;l=l||d.type,s.push([u,d])}return"number"===l.kind||"color"===l.kind||"array"===l.kind&&"number"===l.itemType.kind&&"number"==typeof l.N?new Mt(l,r,n,s):e.error("Type "+$(l)+" is not interpolatable.")},Mt.prototype.evaluate=function(t){var e=this.labels,r=this.outputs;if(1===e.length)return r[0].evaluate(t);var n=this.input.evaluate(t);if(n<=e[0])return r[0].evaluate(t);var i=e.length;if(n>=e[i-1])return r[i-1].evaluate(t);var a=bt(e,n),o=e[a],s=e[a+1],l=Mt.interpolationFactor(this.interpolation,n,o,s),c=r[a].evaluate(t),u=r[a+1].evaluate(t);return kt[this.type.kind.toLowerCase()](c,u,l)},Mt.prototype.eachChild=function(t){t(this.input);for(var e=0,r=this.outputs;e<r.length;e+=1)t(r[e])},Mt.prototype.possibleOutputs=function(){return(t=[]).concat.apply(t,this.outputs.map(function(t){return t.possibleOutputs()}));var t},Mt.prototype.serialize=function(){for(var t=["interpolate","linear"===this.interpolation.name?["linear"]:"exponential"===this.interpolation.name?1===this.interpolation.base?["linear"]:["exponential",this.interpolation.base]:["cubic-bezier"].concat(this.interpolation.controlPoints),this.input.serialize()],e=0;e<this.labels.length;e++)t.push(this.labels[e],this.outputs[e].serialize());return t};var Tt=function(t,e){this.type=t,this.args=e};Tt.parse=function(t,e){if(t.length<2)return e.error("Expectected at least one argument.");var r=null,n=e.expectedType;n&&"value"!==n.kind&&(r=n);for(var i=[],a=0,o=t.slice(1);a<o.length;a+=1){var s=o[a],l=e.parse(s,1+i.length,r,void 0,{omitTypeAnnotations:!0});if(!l)return null;r=r||l.type,i.push(l)}var c=n&&i.some(function(t){return K(n,t.type)});return new Tt(c?Y:r,i)},Tt.prototype.evaluate=function(t){for(var e=null,r=0,n=this.args;r<n.length&&null===(e=n[r].evaluate(t));r+=1);return e},Tt.prototype.eachChild=function(t){this.args.forEach(t)},Tt.prototype.possibleOutputs=function(){return(t=[]).concat.apply(t,this.args.map(function(t){return t.possibleOutputs()}));var t},Tt.prototype.serialize=function(){var t=["coalesce"];return this.eachChild(function(e){t.push(e.serialize())}),t};var St=function(t,e){this.type=e.type,this.bindings=[].concat(t),this.result=e};St.prototype.evaluate=function(t){return this.result.evaluate(t)},St.prototype.eachChild=function(t){for(var e=0,r=this.bindings;e<r.length;e+=1)t(r[e][1]);t(this.result)},St.parse=function(t,e){if(t.length<4)return e.error("Expected at least 3 arguments, but found "+(t.length-1)+" instead.");for(var r=[],n=1;n<t.length-1;n+=2){var i=t[n];if("string"!=typeof i)return e.error("Expected string, but found "+typeof i+" instead.",n);if(/[^a-zA-Z0-9_]/.test(i))return e.error("Variable names must contain only alphanumeric characters or '_'.",n);var a=e.parse(t[n+1],n+1);if(!a)return null;r.push([i,a])}var o=e.parse(t[t.length-1],t.length-1,void 0,r);return o?new St(r,o):null},St.prototype.possibleOutputs=function(){return this.result.possibleOutputs()},St.prototype.serialize=function(){for(var t=["let"],e=0,r=this.bindings;e<r.length;e+=1){var n=r[e],i=n[0],a=n[1];t.push(i,a.serialize())}return t.push(this.result.serialize()),t};var Et=function(t,e,r){this.type=t,this.index=e,this.input=r};Et.parse=function(t,e){if(3!==t.length)return e.error("Expected 2 arguments, but found "+(t.length-1)+" instead.");var r=e.parse(t[1],1,U),n=e.parse(t[2],2,Z(e.expectedType||Y));if(!r||!n)return null;var i=n.type;return new Et(i.itemType,r,n)},Et.prototype.evaluate=function(t){var e=this.index.evaluate(t),r=this.input.evaluate(t);if(e<0)throw new ot("Array index out of bounds: "+e+" < 0.");if(e>=r.length)throw new ot("Array index out of bounds: "+e+" > "+(r.length-1)+".");if(e!==Math.floor(e))throw new ot("Array index must be an integer, but found "+e+" instead.");return r[e]},Et.prototype.eachChild=function(t){t(this.index),t(this.input)},Et.prototype.possibleOutputs=function(){return[void 0]},Et.prototype.serialize=function(){return["at",this.index.serialize(),this.input.serialize()]};var Ct=function(t,e,r,n,i,a){this.inputType=t,this.type=e,this.input=r,this.cases=n,this.outputs=i,this.otherwise=a};Ct.parse=function(t,e){if(t.length<5)return e.error("Expected at least 4 arguments, but found only "+(t.length-1)+".");if(t.length%2!=1)return e.error("Expected an even number of arguments.");var r,n;e.expectedType&&"value"!==e.expectedType.kind&&(n=e.expectedType);for(var i={},a=[],o=2;o<t.length-1;o+=2){var s=t[o],l=t[o+1];Array.isArray(s)||(s=[s]);var c=e.concat(o);if(0===s.length)return c.error("Expected at least one branch label.");for(var u=0,h=s;u<h.length;u+=1){var f=h[u];if("number"!=typeof f&&"string"!=typeof f)return c.error("Branch labels must be numbers or strings.");if("number"==typeof f&&Math.abs(f)>Number.MAX_SAFE_INTEGER)return c.error("Branch labels must be integers no larger than "+Number.MAX_SAFE_INTEGER+".");if("number"==typeof f&&Math.floor(f)!==f)return c.error("Numeric branch labels must be integer values.");if(r){if(c.checkSubtype(r,it(f)))return null}else r=it(f);if(void 0!==i[String(f)])return c.error("Branch labels must be unique.");i[String(f)]=a.length}var p=e.parse(l,o,n);if(!p)return null;n=n||p.type,a.push(p)}var d=e.parse(t[1],1,r);if(!d)return null;var g=e.parse(t[t.length-1],t.length-1,n);return g?new Ct(r,n,d,i,a,g):null},Ct.prototype.evaluate=function(t){var e=this.input.evaluate(t);return(this.outputs[this.cases[e]]||this.otherwise).evaluate(t)},Ct.prototype.eachChild=function(t){t(this.input),this.outputs.forEach(t),t(this.otherwise)},Ct.prototype.possibleOutputs=function(){return(t=[]).concat.apply(t,this.outputs.map(function(t){return t.possibleOutputs()})).concat(this.otherwise.possibleOutputs());var t},Ct.prototype.serialize=function(){for(var t=this,e=["match",this.input.serialize()],r=[],n={},i=0,a=Object.keys(this.cases).sort();i<a.length;i+=1){var o=a[i],s=n[t.cases[o]];void 0===s?(n[t.cases[o]]=r.length,r.push([t.cases[o],[o]])):r[s][1].push(o)}for(var l=function(e){return"number"===t.input.type.kind?Number(e):e},c=0,u=r;c<u.length;c+=1){var h=u[c],f=h[0],p=h[1];1===p.length?e.push(l(p[0])):e.push(p.map(l)),e.push(t.outputs[f].serialize())}return e.push(this.otherwise.serialize()),e};var Lt=function(t,e,r){this.type=t,this.branches=e,this.otherwise=r};function zt(t){return"string"===t.kind||"number"===t.kind||"boolean"===t.kind||"null"===t.kind}function Pt(t,e){return function(){function r(t,e,r){this.type=H,this.lhs=t,this.rhs=e,this.collator=r}return r.parse=function(t,e){if(3!==t.length&&4!==t.length)return e.error("Expected two or three arguments.");var n=e.parse(t[1],1,Y);if(!n)return null;var i=e.parse(t[2],2,Y);if(!i)return null;if(!zt(n.type)&&!zt(i.type))return e.error("Expected at least one argument to be a string, number, boolean, or null, but found ("+$(n.type)+", "+$(i.type)+") instead.");if(n.type.kind!==i.type.kind&&"value"!==n.type.kind&&"value"!==i.type.kind)return e.error("Cannot compare "+$(n.type)+" and "+$(i.type)+".");var a=null;if(4===t.length){if("string"!==n.type.kind&&"string"!==i.type.kind)return e.error("Cannot use collator to compare non-string types.");if(!(a=e.parse(t[3],3,X)))return null}return new r(n,i,a)},r.prototype.evaluate=function(t){var r=this.collator?0===this.collator.evaluate(t).compare(this.lhs.evaluate(t),this.rhs.evaluate(t)):this.lhs.evaluate(t)===this.rhs.evaluate(t);return e?!r:r},r.prototype.eachChild=function(t){t(this.lhs),t(this.rhs),this.collator&&t(this.collator)},r.prototype.possibleOutputs=function(){return[!0,!1]},r.prototype.serialize=function(){var e=[t];return this.eachChild(function(t){e.push(t.serialize())}),e},r}()}Lt.parse=function(t,e){if(t.length<4)return e.error("Expected at least 3 arguments, but found only "+(t.length-1)+".");if(t.length%2!=0)return e.error("Expected an odd number of arguments.");var r;e.expectedType&&"value"!==e.expectedType.kind&&(r=e.expectedType);for(var n=[],i=1;i<t.length-1;i+=2){var a=e.parse(t[i],i,H);if(!a)return null;var o=e.parse(t[i+1],i+1,r);if(!o)return null;n.push([a,o]),r=r||o.type}var s=e.parse(t[t.length-1],t.length-1,r);return s?new Lt(r,n,s):null},Lt.prototype.evaluate=function(t){for(var e=0,r=this.branches;e<r.length;e+=1){var n=r[e],i=n[0],a=n[1];if(i.evaluate(t))return a.evaluate(t)}return this.otherwise.evaluate(t)},Lt.prototype.eachChild=function(t){for(var e=0,r=this.branches;e<r.length;e+=1){var n=r[e],i=n[0],a=n[1];t(i),t(a)}t(this.otherwise)},Lt.prototype.possibleOutputs=function(){return(t=[]).concat.apply(t,this.branches.map(function(t){return t[0],t[1].possibleOutputs()})).concat(this.otherwise.possibleOutputs());var t},Lt.prototype.serialize=function(){var t=["case"];return this.eachChild(function(e){t.push(e.serialize())}),t};var It=Pt("==",!1),Ot=Pt("!=",!0),Dt=function(t){this.type=U,this.input=t};Dt.parse=function(t,e){if(2!==t.length)return e.error("Expected 1 argument, but found "+(t.length-1)+" instead.");var r=e.parse(t[1],1);return r?"array"!==r.type.kind&&"string"!==r.type.kind&&"value"!==r.type.kind?e.error("Expected argument of type string or array, but found "+$(r.type)+" instead."):new Dt(r):null},Dt.prototype.evaluate=function(t){var e=this.input.evaluate(t);if("string"==typeof e)return e.length;if(Array.isArray(e))return e.length;throw new ot("Expected value to be of type string or array, but found "+$(it(e))+" instead.")},Dt.prototype.eachChild=function(t){t(this.input)},Dt.prototype.possibleOutputs=function(){return[void 0]},Dt.prototype.serialize=function(){var t=["length"];return this.eachChild(function(e){t.push(e.serialize())}),t};var Rt={"==":It,"!=":Ot,array:ut,at:Et,boolean:lt,case:Lt,coalesce:Tt,collator:rt,interpolate:Mt,length:Dt,let:St,literal:at,match:Ct,number:lt,object:lt,step:_t,string:lt,"to-color":ft,"to-number":ft,var:yt};function Bt(t,e){var r=e[0],n=e[1],i=e[2],a=e[3];r=r.evaluate(t),n=n.evaluate(t),i=i.evaluate(t);var o=a?a.evaluate(t):1,s=nt(r,n,i,o);if(s)throw new ot(s);return new tt(r/255*o,n/255*o,i/255*o,o)}function Ft(t,e){return t in e}function Nt(t,e){var r=e[t];return void 0===r?null:r}function jt(t,e){var r=e[0],n=e[1];return r.evaluate(t)<n.evaluate(t)}function Vt(t,e){var r=e[0],n=e[1];return r.evaluate(t)>n.evaluate(t)}function Ut(t,e){var r=e[0],n=e[1];return r.evaluate(t)<=n.evaluate(t)}function qt(t,e){var r=e[0],n=e[1];return r.evaluate(t)>=n.evaluate(t)}function Ht(t){return{type:t}}function Gt(t){return{result:"success",value:t}}function Wt(t){return{result:"error",value:t}}gt.register(Rt,{error:[{kind:"error"},[q],function(t,e){var r=e[0];throw new ot(r.evaluate(t))}],typeof:[q,[Y],function(t,e){return $(it(e[0].evaluate(t)))}],"to-string":[q,[Y],function(t,e){var r=e[0],n=typeof(r=r.evaluate(t));return null===r?"":"string"===n||"number"===n||"boolean"===n?String(r):r instanceof tt?r.toString():JSON.stringify(r)}],"to-boolean":[H,[Y],function(t,e){var r=e[0];return Boolean(r.evaluate(t))}],"to-rgba":[Z(U,4),[G],function(t,e){return e[0].evaluate(t).toArray()}],rgb:[G,[U,U,U],Bt],rgba:[G,[U,U,U,U],Bt],has:{type:H,overloads:[[[q],function(t,e){return Ft(e[0].evaluate(t),t.properties())}],[[q,W],function(t,e){var r=e[0],n=e[1];return Ft(r.evaluate(t),n.evaluate(t))}]]},get:{type:Y,overloads:[[[q],function(t,e){return Nt(e[0].evaluate(t),t.properties())}],[[q,W],function(t,e){var r=e[0],n=e[1];return Nt(r.evaluate(t),n.evaluate(t))}]]},properties:[W,[],function(t){return t.properties()}],"geometry-type":[q,[],function(t){return t.geometryType()}],id:[Y,[],function(t){return t.id()}],zoom:[U,[],function(t){return t.globals.zoom}],"heatmap-density":[U,[],function(t){return t.globals.heatmapDensity||0}],"line-progress":[U,[],function(t){return t.globals.lineProgress||0}],"+":[U,Ht(U),function(t,e){for(var r=0,n=0,i=e;n<i.length;n+=1)r+=i[n].evaluate(t);return r}],"*":[U,Ht(U),function(t,e){for(var r=1,n=0,i=e;n<i.length;n+=1)r*=i[n].evaluate(t);return r}],"-":{type:U,overloads:[[[U,U],function(t,e){var r=e[0],n=e[1];return r.evaluate(t)-n.evaluate(t)}],[[U],function(t,e){return-e[0].evaluate(t)}]]},"/":[U,[U,U],function(t,e){var r=e[0],n=e[1];return r.evaluate(t)/n.evaluate(t)}],"%":[U,[U,U],function(t,e){var r=e[0],n=e[1];return r.evaluate(t)%n.evaluate(t)}],ln2:[U,[],function(){return Math.LN2}],pi:[U,[],function(){return Math.PI}],e:[U,[],function(){return Math.E}],"^":[U,[U,U],function(t,e){var r=e[0],n=e[1];return Math.pow(r.evaluate(t),n.evaluate(t))}],sqrt:[U,[U],function(t,e){var r=e[0];return Math.sqrt(r.evaluate(t))}],log10:[U,[U],function(t,e){var r=e[0];return Math.log10(r.evaluate(t))}],ln:[U,[U],function(t,e){var r=e[0];return Math.log(r.evaluate(t))}],log2:[U,[U],function(t,e){var r=e[0];return Math.log2(r.evaluate(t))}],sin:[U,[U],function(t,e){var r=e[0];return Math.sin(r.evaluate(t))}],cos:[U,[U],function(t,e){var r=e[0];return Math.cos(r.evaluate(t))}],tan:[U,[U],function(t,e){var r=e[0];return Math.tan(r.evaluate(t))}],asin:[U,[U],function(t,e){var r=e[0];return Math.asin(r.evaluate(t))}],acos:[U,[U],function(t,e){var r=e[0];return Math.acos(r.evaluate(t))}],atan:[U,[U],function(t,e){var r=e[0];return Math.atan(r.evaluate(t))}],min:[U,Ht(U),function(t,e){return Math.min.apply(Math,e.map(function(e){return e.evaluate(t)}))}],max:[U,Ht(U),function(t,e){return Math.max.apply(Math,e.map(function(e){return e.evaluate(t)}))}],abs:[U,[U],function(t,e){var r=e[0];return Math.abs(r.evaluate(t))}],round:[U,[U],function(t,e){var r=e[0].evaluate(t);return r<0?-Math.round(-r):Math.round(r)}],floor:[U,[U],function(t,e){var r=e[0];return Math.floor(r.evaluate(t))}],ceil:[U,[U],function(t,e){var r=e[0];return Math.ceil(r.evaluate(t))}],"filter-==":[H,[q,Y],function(t,e){var r=e[0],n=e[1];return t.properties()[r.value]===n.value}],"filter-id-==":[H,[Y],function(t,e){var r=e[0];return t.id()===r.value}],"filter-type-==":[H,[q],function(t,e){var r=e[0];return t.geometryType()===r.value}],"filter-<":[H,[q,Y],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i<a}],"filter-id-<":[H,[Y],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n<i}],"filter->":[H,[q,Y],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i>a}],"filter-id->":[H,[Y],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n>i}],"filter-<=":[H,[q,Y],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i<=a}],"filter-id-<=":[H,[Y],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n<=i}],"filter->=":[H,[q,Y],function(t,e){var r=e[0],n=e[1],i=t.properties()[r.value],a=n.value;return typeof i==typeof a&&i>=a}],"filter-id->=":[H,[Y],function(t,e){var r=e[0],n=t.id(),i=r.value;return typeof n==typeof i&&n>=i}],"filter-has":[H,[Y],function(t,e){return e[0].value in t.properties()}],"filter-has-id":[H,[],function(t){return null!==t.id()}],"filter-type-in":[H,[Z(q)],function(t,e){return e[0].value.indexOf(t.geometryType())>=0}],"filter-id-in":[H,[Z(Y)],function(t,e){return e[0].value.indexOf(t.id())>=0}],"filter-in-small":[H,[q,Z(Y)],function(t,e){var r=e[0];return e[1].value.indexOf(t.properties()[r.value])>=0}],"filter-in-large":[H,[q,Z(Y)],function(t,e){var r=e[0],n=e[1];return function(t,e,r,n){for(;r<=n;){var i=r+n>>1;if(e[i]===t)return!0;e[i]>t?n=i-1:r=i+1}return!1}(t.properties()[r.value],n.value,0,n.value.length-1)}],">":{type:H,overloads:[[[U,U],Vt],[[q,q],Vt],[[q,q,X],function(t,e){var r=e[0],n=e[1];return e[2].evaluate(t).compare(r.evaluate(t),n.evaluate(t))>0}]]},"<":{type:H,overloads:[[[U,U],jt],[[q,q],jt],[[q,q,X],function(t,e){var r=e[0],n=e[1];return e[2].evaluate(t).compare(r.evaluate(t),n.evaluate(t))<0}]]},">=":{type:H,overloads:[[[U,U],qt],[[q,q],qt],[[q,q,X],function(t,e){var r=e[0],n=e[1];return e[2].evaluate(t).compare(r.evaluate(t),n.evaluate(t))>=0}]]},"<=":{type:H,overloads:[[[U,U],Ut],[[q,q],Ut],[[q,q,X],function(t,e){var r=e[0],n=e[1];return e[2].evaluate(t).compare(r.evaluate(t),n.evaluate(t))<=0}]]},all:{type:H,overloads:[[[H,H],function(t,e){var r=e[0],n=e[1];return r.evaluate(t)&&n.evaluate(t)}],[Ht(H),function(t,e){for(var r=0,n=e;r<n.length;r+=1)if(!n[r].evaluate(t))return!1;return!0}]]},any:{type:H,overloads:[[[H,H],function(t,e){var r=e[0],n=e[1];return r.evaluate(t)||n.evaluate(t)}],[Ht(H),function(t,e){for(var r=0,n=e;r<n.length;r+=1)if(n[r].evaluate(t))return!0;return!1}]]},"!":[H,[H],function(t,e){return!e[0].evaluate(t)}],"is-supported-script":[H,[q],function(t,e){var r=e[0],n=t.globals&&t.globals.isSupportedScript;return!n||n(r.evaluate(t))}],upcase:[q,[q],function(t,e){return e[0].evaluate(t).toUpperCase()}],downcase:[q,[q],function(t,e){return e[0].evaluate(t).toLowerCase()}],concat:[q,Ht(q),function(t,e){return e.map(function(e){return e.evaluate(t)}).join("")}],"resolved-locale":[q,[X],function(t,e){return e[0].evaluate(t).resolvedLocale()}]});var Yt=.95047,Xt=1,Zt=1.08883,$t=4/29,Jt=6/29,Kt=3*Jt*Jt,Qt=Jt*Jt*Jt,te=Math.PI/180,ee=180/Math.PI;function re(t){return t>Qt?Math.pow(t,1/3):t/Kt+$t}function ne(t){return t>Jt?t*t*t:Kt*(t-$t)}function ie(t){return 255*(t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055)}function ae(t){return(t/=255)<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)}function oe(t){var e=ae(t.r),r=ae(t.g),n=ae(t.b),i=re((.4124564*e+.3575761*r+.1804375*n)/Yt),a=re((.2126729*e+.7151522*r+.072175*n)/Xt);return{l:116*a-16,a:500*(i-a),b:200*(a-re((.0193339*e+.119192*r+.9503041*n)/Zt)),alpha:t.a}}function se(t){var e=(t.l+16)/116,r=isNaN(t.a)?e:e+t.a/500,n=isNaN(t.b)?e:e-t.b/200;return e=Xt*ne(e),r=Yt*ne(r),n=Zt*ne(n),new tt(ie(3.2404542*r-1.5371385*e-.4985314*n),ie(-.969266*r+1.8760108*e+.041556*n),ie(.0556434*r-.2040259*e+1.0572252*n),t.alpha)}var le={forward:oe,reverse:se,interpolate:function(t,e,r){return{l:wt(t.l,e.l,r),a:wt(t.a,e.a,r),b:wt(t.b,e.b,r),alpha:wt(t.alpha,e.alpha,r)}}},ce={forward:function(t){var e=oe(t),r=e.l,n=e.a,i=e.b,a=Math.atan2(i,n)*ee;return{h:a<0?a+360:a,c:Math.sqrt(n*n+i*i),l:r,alpha:t.a}},reverse:function(t){var e=t.h*te,r=t.c;return se({l:t.l,a:Math.cos(e)*r,b:Math.sin(e)*r,alpha:t.alpha})},interpolate:function(t,e,r){return{h:function(t,e,r){var n=e-t;return t+r*(n>180||n<-180?n-360*Math.round(n/360):n)}(t.h,e.h,r),c:wt(t.c,e.c,r),l:wt(t.l,e.l,r),alpha:wt(t.alpha,e.alpha,r)}}},ue=Object.freeze({lab:le,hcl:ce});function he(t){return t instanceof Number?"number":t instanceof String?"string":t instanceof Boolean?"boolean":Array.isArray(t)?"array":null===t?"null":typeof t}function fe(t){return"object"==typeof t&&null!==t&&!Array.isArray(t)}function pe(t){return t}function de(t,e,r){return void 0!==t?t:void 0!==e?e:void 0!==r?r:void 0}function ge(t,e,r,n,i){return de(typeof r===i?n[r]:void 0,t.default,e.default)}function me(t,e,r){if("number"!==he(r))return de(t.default,e.default);var n=t.stops.length;if(1===n)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[n-1][0])return t.stops[n-1][1];var i=xe(t.stops,r);return t.stops[i][1]}function ve(t,e,r){var n=void 0!==t.base?t.base:1;if("number"!==he(r))return de(t.default,e.default);var i=t.stops.length;if(1===i)return t.stops[0][1];if(r<=t.stops[0][0])return t.stops[0][1];if(r>=t.stops[i-1][0])return t.stops[i-1][1];var a=xe(t.stops,r),o=function(t,e,r,n){var i=n-r,a=t-r;return 0===i?0:1===e?a/i:(Math.pow(e,a)-1)/(Math.pow(e,i)-1)}(r,n,t.stops[a][0],t.stops[a+1][0]),s=t.stops[a][1],l=t.stops[a+1][1],c=kt[e.type]||pe;if(t.colorSpace&&"rgb"!==t.colorSpace){var u=ue[t.colorSpace];c=function(t,e){return u.reverse(u.interpolate(u.forward(t),u.forward(e),o))}}return"function"==typeof s.evaluate?{evaluate:function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];var r=s.evaluate.apply(void 0,t),n=l.evaluate.apply(void 0,t);if(void 0!==r&&void 0!==n)return c(r,n,o)}}:c(s,l,o)}function ye(t,e,r){return"color"===e.type?r=tt.parse(r):he(r)===e.type||"enum"===e.type&&e.values[r]||(r=void 0),de(r,t.default,e.default)}function xe(t,e){for(var r,n,i=0,a=t.length-1,o=0;i<=a;){if(r=t[o=Math.floor((i+a)/2)][0],n=t[o+1][0],e===r||e>r&&e<n)return o;r<e?i=o+1:r>e&&(a=o-1)}return Math.max(o-1,0)}var be=function(t,e){var r;this.expression=t,this._warningHistory={},this._defaultValue="color"===(r=e).type&&fe(r.default)?new tt(0,0,0,0):"color"===r.type?tt.parse(r.default)||null:void 0===r.default?null:r.default,"enum"===e.type&&(this._enumValues=e.values)};function _e(t){return Array.isArray(t)&&t.length>0&&"string"==typeof t[0]&&t[0]in Rt}function we(t,e){var r=new xt(Rt,[],function(t){var e={color:G,string:q,number:U,enum:q,boolean:H};return"array"===t.type?Z(e[t.value]||Y,t.length):e[t.type]||null}(e)),n=r.parse(t);return n?Gt(new be(n,e)):Wt(r.errors)}be.prototype.evaluateWithoutErrorHandling=function(t,e){return this._evaluator||(this._evaluator=new dt),this._evaluator.globals=t,this._evaluator.feature=e,this.expression.evaluate(this._evaluator)},be.prototype.evaluate=function(t,e){this._evaluator||(this._evaluator=new dt),this._evaluator.globals=t,this._evaluator.feature=e;try{var r=this.expression.evaluate(this._evaluator);if(null==r)return this._defaultValue;if(this._enumValues&&!(r in this._enumValues))throw new ot("Expected value to be one of "+Object.keys(this._enumValues).map(function(t){return JSON.stringify(t)}).join(", ")+", but found "+JSON.stringify(r)+" instead.");return r}catch(t){return this._warningHistory[t.message]||(this._warningHistory[t.message]=!0,"undefined"!=typeof console&&console.warn(t.message)),this._defaultValue}};var ke=function(t,e){this.kind=t,this._styleExpression=e};ke.prototype.evaluateWithoutErrorHandling=function(t,e){return this._styleExpression.evaluateWithoutErrorHandling(t,e)},ke.prototype.evaluate=function(t,e){return this._styleExpression.evaluate(t,e)};var Me=function(t,e,r){this.kind=t,this.zoomStops=r.labels,this._styleExpression=e,r instanceof Mt&&(this._interpolationType=r.interpolation)};function Ae(t,e){if("error"===(t=we(t,e)).result)return t;var r=t.value.expression,n=mt(r);if(!n&&!e["property-function"])return Wt([new N("","property expressions not supported")]);var i=vt(r,["zoom"]);if(!i&&!1===e["zoom-function"])return Wt([new N("","zoom expressions not supported")]);var a=function t(e){var r=null;if(e instanceof St)r=t(e.result);else if(e instanceof Tt)for(var n=0,i=e.args;n<i.length;n+=1){var a=i[n];if(r=t(a))break}else(e instanceof _t||e instanceof Mt)&&e.input instanceof gt&&"zoom"===e.input.name&&(r=e);return r instanceof N?r:(e.eachChild(function(e){var n=t(e);n instanceof N?r=n:!r&&n?r=new N("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.'):r&&n&&r!==n&&(r=new N("",'Only one zoom-based "step" or "interpolate" subexpression may be used in an expression.'))}),r)}(r);return a||i?a instanceof N?Wt([a]):a instanceof Mt&&"piecewise-constant"===e.function?Wt([new N("",'"interpolate" expressions cannot be used with this property')]):Gt(a?new Me(n?"camera":"composite",t.value,a):new ke(n?"constant":"source",t.value)):Wt([new N("",'"zoom" expression may only be used as input to a top-level "step" or "interpolate" expression.')])}Me.prototype.evaluateWithoutErrorHandling=function(t,e){return this._styleExpression.evaluateWithoutErrorHandling(t,e)},Me.prototype.evaluate=function(t,e){return this._styleExpression.evaluate(t,e)},Me.prototype.interpolationFactor=function(t,e,r){return this._interpolationType?Mt.interpolationFactor(this._interpolationType,t,e,r):0};var Te=function(t,e){this._parameters=t,this._specification=e,R(this,function t(e,r){var n,i,a,o="color"===r.type,s=e.stops&&"object"==typeof e.stops[0][0],l=s||void 0!==e.property,c=s||!l,u=e.type||("interpolated"===r.function?"exponential":"interval");if(o&&((e=R({},e)).stops&&(e.stops=e.stops.map(function(t){return[t[0],tt.parse(t[1])]})),e.default?e.default=tt.parse(e.default):e.default=tt.parse(r.default)),e.colorSpace&&"rgb"!==e.colorSpace&&!ue[e.colorSpace])throw new Error("Unknown color space: "+e.colorSpace);if("exponential"===u)n=ve;else if("interval"===u)n=me;else if("categorical"===u){n=ge,i=Object.create(null);for(var h=0,f=e.stops;h<f.length;h+=1){var p=f[h];i[p[0]]=p[1]}a=typeof e.stops[0][0]}else{if("identity"!==u)throw new Error('Unknown function type "'+u+'"');n=ye}if(s){for(var d={},g=[],m=0;m<e.stops.length;m++){var v=e.stops[m],y=v[0].zoom;void 0===d[y]&&(d[y]={zoom:y,type:e.type,property:e.property,default:e.default,stops:[]},g.push(y)),d[y].stops.push([v[0].value,v[1]])}for(var x=[],b=0,_=g;b<_.length;b+=1){var w=_[b];x.push([d[w].zoom,t(d[w],r)])}return{kind:"composite",interpolationFactor:Mt.interpolationFactor.bind(void 0,{name:"linear"}),zoomStops:x.map(function(t){return t[0]}),evaluate:function(t,n){var i=t.zoom;return ve({stops:x,base:e.base},r,i).evaluate(i,n)}}}return c?{kind:"camera",interpolationFactor:"exponential"===u?Mt.interpolationFactor.bind(void 0,{name:"exponential",base:void 0!==e.base?e.base:1}):function(){return 0},zoomStops:e.stops.map(function(t){return t[0]}),evaluate:function(t){var o=t.zoom;return n(e,r,o,i,a)}}:{kind:"source",evaluate:function(t,o){var s=o&&o.properties?o.properties[e.property]:void 0;return void 0===s?de(e.default,r.default):n(e,r,s,i,a)}}}(this._parameters,this._specification))};function Se(t,e){if(fe(t))return new Te(t,e);if(_e(t)){var r=Ae(t,e);if("error"===r.result)throw new Error(r.value.map(function(t){return t.key+": "+t.message}).join(", "));return r.value}var n=t;return"string"==typeof t&&"color"===e.type&&(n=tt.parse(t)),{kind:"constant",evaluate:function(){return n}}}function Ee(t){var e=t.key,r=t.value,n=t.valueSpec||{},i=t.objectElementValidators||{},a=t.style,o=t.styleSpec,s=[],l=he(r);if("object"!==l)return[new O(e,r,"object expected, "+l+" found")];for(var c in r){var u=c.split(".")[0],h=n[u]||n["*"],f=void 0;if(i[u])f=i[u];else if(n[u])f=Ke;else if(i["*"])f=i["*"];else{if(!n["*"]){s.push(new O(e,r[c],'unknown property "'+c+'"'));continue}f=Ke}s=s.concat(f({key:(e?e+".":e)+c,value:r[c],valueSpec:h,style:a,styleSpec:o,object:r,objectKey:c},r))}for(var p in n)i[p]||n[p].required&&void 0===n[p].default&&void 0===r[p]&&s.push(new O(e,r,'missing required property "'+p+'"'));return s}function Ce(t){var e=t.value,r=t.valueSpec,n=t.style,i=t.styleSpec,a=t.key,o=t.arrayElementValidator||Ke;if("array"!==he(e))return[new O(a,e,"array expected, "+he(e)+" found")];if(r.length&&e.length!==r.length)return[new O(a,e,"array length "+r.length+" expected, length "+e.length+" found")];if(r["min-length"]&&e.length<r["min-length"])return[new O(a,e,"array length at least "+r["min-length"]+" expected, length "+e.length+" found")];var s={type:r.value};i.$version<7&&(s.function=r.function),"object"===he(r.value)&&(s=r.value);for(var l=[],c=0;c<e.length;c++)l=l.concat(o({array:e,arrayIndex:c,value:e[c],valueSpec:s,style:n,styleSpec:i,key:a+"["+c+"]"}));return l}function Le(t){var e=t.key,r=t.value,n=t.valueSpec,i=he(r);return"number"!==i?[new O(e,r,"number expected, "+i+" found")]:"minimum"in n&&r<n.minimum?[new O(e,r,r+" is less than the minimum value "+n.minimum)]:"maximum"in n&&r>n.maximum?[new O(e,r,r+" is greater than the maximum value "+n.maximum)]:[]}function ze(t){var e,r,n,i=t.valueSpec,a=B(t.value.type),o={},s="categorical"!==a&&void 0===t.value.property,l=!s,c="array"===he(t.value.stops)&&"array"===he(t.value.stops[0])&&"object"===he(t.value.stops[0][0]),u=Ee({key:t.key,value:t.value,valueSpec:t.styleSpec.function,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{stops:function(t){if("identity"===a)return[new O(t.key,t.value,'identity function may not have a "stops" property')];var e=[],r=t.value;return e=e.concat(Ce({key:t.key,value:r,valueSpec:t.valueSpec,style:t.style,styleSpec:t.styleSpec,arrayElementValidator:h})),"array"===he(r)&&0===r.length&&e.push(new O(t.key,r,"array must have at least one stop")),e},default:function(t){return Ke({key:t.key,value:t.value,valueSpec:i,style:t.style,styleSpec:t.styleSpec})}}});return"identity"===a&&s&&u.push(new O(t.key,t.value,'missing required property "property"')),"identity"===a||t.value.stops||u.push(new O(t.key,t.value,'missing required property "stops"')),"exponential"===a&&"piecewise-constant"===t.valueSpec.function&&u.push(new O(t.key,t.value,"exponential functions not supported")),t.styleSpec.$version>=8&&(l&&!t.valueSpec["property-function"]?u.push(new O(t.key,t.value,"property functions not supported")):s&&!t.valueSpec["zoom-function"]&&"heatmap-color"!==t.objectKey&&"line-gradient"!==t.objectKey&&u.push(new O(t.key,t.value,"zoom functions not supported"))),"categorical"!==a&&!c||void 0!==t.value.property||u.push(new O(t.key,t.value,'"property" property is required')),u;function h(t){var e=[],a=t.value,s=t.key;if("array"!==he(a))return[new O(s,a,"array expected, "+he(a)+" found")];if(2!==a.length)return[new O(s,a,"array length 2 expected, length "+a.length+" found")];if(c){if("object"!==he(a[0]))return[new O(s,a,"object expected, "+he(a[0])+" found")];if(void 0===a[0].zoom)return[new O(s,a,"object stop key must have zoom")];if(void 0===a[0].value)return[new O(s,a,"object stop key must have value")];if(n&&n>B(a[0].zoom))return[new O(s,a[0].zoom,"stop zoom values must appear in ascending order")];B(a[0].zoom)!==n&&(n=B(a[0].zoom),r=void 0,o={}),e=e.concat(Ee({key:s+"[0]",value:a[0],valueSpec:{zoom:{}},style:t.style,styleSpec:t.styleSpec,objectElementValidators:{zoom:Le,value:f}}))}else e=e.concat(f({key:s+"[0]",value:a[0],valueSpec:{},style:t.style,styleSpec:t.styleSpec},a));return e.concat(Ke({key:s+"[1]",value:a[1],valueSpec:i,style:t.style,styleSpec:t.styleSpec}))}function f(t,n){var s=he(t.value),l=B(t.value),c=null!==t.value?t.value:n;if(e){if(s!==e)return[new O(t.key,c,s+" stop domain type must match previous stop domain type "+e)]}else e=s;if("number"!==s&&"string"!==s&&"boolean"!==s)return[new O(t.key,c,"stop domain value must be a number, string, or boolean")];if("number"!==s&&"categorical"!==a){var u="number expected, "+s+" found";return i["property-function"]&&void 0===a&&(u+='\nIf you intended to use a categorical function, specify `"type": "categorical"`.'),[new O(t.key,c,u)]}return"categorical"!==a||"number"!==s||isFinite(l)&&Math.floor(l)===l?"categorical"!==a&&"number"===s&&void 0!==r&&l<r?[new O(t.key,c,"stop domain values must appear in ascending order")]:(r=l,"categorical"===a&&l in o?[new O(t.key,c,"stop domain values must be unique")]:(o[l]=!0,[])):[new O(t.key,c,"integer expected, found "+l)]}}function Pe(t){var e=("property"===t.expressionContext?Ae:we)(F(t.value),t.valueSpec);return"error"===e.result?e.value.map(function(e){return new O(""+t.key+e.key,t.value,e.message)}):"property"===t.expressionContext&&"text-font"===t.propertyKey&&-1!==e.value._styleExpression.expression.possibleOutputs().indexOf(void 0)?[new O(t.key,t.value,'Invalid data expression for "text-font". Output values must be contained as literals within the expression.')]:[]}function Ie(t){var e=t.key,r=t.value,n=t.valueSpec,i=[];return Array.isArray(n.values)?-1===n.values.indexOf(B(r))&&i.push(new O(e,r,"expected one of ["+n.values.join(", ")+"], "+JSON.stringify(r)+" found")):-1===Object.keys(n.values).indexOf(B(r))&&i.push(new O(e,r,"expected one of ["+Object.keys(n.values).join(", ")+"], "+JSON.stringify(r)+" found")),i}function Oe(t){if(!Array.isArray(t)||0===t.length)return!1;switch(t[0]){case"has":return t.length>=2&&"$id"!==t[1]&&"$type"!==t[1];case"in":case"!in":case"!has":case"none":return!1;case"==":case"!=":case">":case">=":case"<":case"<=":return 3===t.length&&(Array.isArray(t[1])||Array.isArray(t[2]));case"any":case"all":for(var e=0,r=t.slice(1);e<r.length;e+=1){var n=r[e];if(!Oe(n)&&"boolean"!=typeof n)return!1}return!0;default:return!0}}Te.deserialize=function(t){return new Te(t._parameters,t._specification)},Te.serialize=function(t){return{_parameters:t._parameters,_specification:t._specification}};var De={type:"boolean",default:!1,function:!0,"property-function":!0,"zoom-function":!0};function Re(t){if(!t)return function(){return!0};Oe(t)||(t=Fe(t));var e=we(t,De);if("error"===e.result)throw new Error(e.value.map(function(t){return t.key+": "+t.message}).join(", "));return function(t,r){return e.value.evaluate(t,r)}}function Be(t,e){return t<e?-1:t>e?1:0}function Fe(t){if(!t)return!0;var e,r=t[0];return t.length<=1?"any"!==r:"=="===r?Ne(t[1],t[2],"=="):"!="===r?Ue(Ne(t[1],t[2],"==")):"<"===r||">"===r||"<="===r||">="===r?Ne(t[1],t[2],r):"any"===r?(e=t.slice(1),["any"].concat(e.map(Fe))):"all"===r?["all"].concat(t.slice(1).map(Fe)):"none"===r?["all"].concat(t.slice(1).map(Fe).map(Ue)):"in"===r?je(t[1],t.slice(2)):"!in"===r?Ue(je(t[1],t.slice(2))):"has"===r?Ve(t[1]):"!has"!==r||Ue(Ve(t[1]))}function Ne(t,e,r){switch(t){case"$type":return["filter-type-"+r,e];case"$id":return["filter-id-"+r,e];default:return["filter-"+r,t,e]}}function je(t,e){if(0===e.length)return!1;switch(t){case"$type":return["filter-type-in",["literal",e]];case"$id":return["filter-id-in",["literal",e]];default:return e.length>200&&!e.some(function(t){return typeof t!=typeof e[0]})?["filter-in-large",t,["literal",e.sort(Be)]]:["filter-in-small",t,["literal",e]]}}function Ve(t){switch(t){case"$type":return!0;case"$id":return["filter-has-id"];default:return["filter-has",t]}}function Ue(t){return["!",t]}function qe(t){return Oe(F(t.value))?Pe(R({},t,{expressionContext:"filter",valueSpec:{value:"boolean"}})):function t(e){var r=e.value,n=e.key;if("array"!==he(r))return[new O(n,r,"array expected, "+he(r)+" found")];var i,a=e.styleSpec,o=[];if(r.length<1)return[new O(n,r,"filter array must have at least 1 element")];switch(o=o.concat(Ie({key:n+"[0]",value:r[0],valueSpec:a.filter_operator,style:e.style,styleSpec:e.styleSpec})),B(r[0])){case"<":case"<=":case">":case">=":r.length>=2&&"$type"===B(r[1])&&o.push(new O(n,r,'"$type" cannot be use with operator "'+r[0]+'"'));case"==":case"!=":3!==r.length&&o.push(new O(n,r,'filter array for operator "'+r[0]+'" must have 3 elements'));case"in":case"!in":r.length>=2&&"string"!==(i=he(r[1]))&&o.push(new O(n+"[1]",r[1],"string expected, "+i+" found"));for(var s=2;s<r.length;s++)i=he(r[s]),"$type"===B(r[1])?o=o.concat(Ie({key:n+"["+s+"]",value:r[s],valueSpec:a.geometry_type,style:e.style,styleSpec:e.styleSpec})):"string"!==i&&"number"!==i&&"boolean"!==i&&o.push(new O(n+"["+s+"]",r[s],"string, number, or boolean expected, "+i+" found"));break;case"any":case"all":case"none":for(var l=1;l<r.length;l++)o=o.concat(t({key:n+"["+l+"]",value:r[l],style:e.style,styleSpec:e.styleSpec}));break;case"has":case"!has":i=he(r[1]),2!==r.length?o.push(new O(n,r,'filter array for "'+r[0]+'" operator must have 2 elements')):"string"!==i&&o.push(new O(n+"[1]",r[1],"string expected, "+i+" found"))}return o}(t)}function He(t,e){var r=t.key,n=t.style,i=t.styleSpec,a=t.value,o=t.objectKey,s=i[e+"_"+t.layerType];if(!s)return[];var l=o.match(/^(.*)-transition$/);if("paint"===e&&l&&s[l[1]]&&s[l[1]].transition)return Ke({key:r,value:a,valueSpec:i.transition,style:n,styleSpec:i});var c,u=t.valueSpec||s[o];if(!u)return[new O(r,a,'unknown property "'+o+'"')];if("string"===he(a)&&u["property-function"]&&!u.tokens&&(c=/^{([^}]+)}$/.exec(a)))return[new O(r,a,'"'+o+'" does not support interpolation syntax\nUse an identity property function instead: `{ "type": "identity", "property": '+JSON.stringify(c[1])+" }`.")];var h=[];return"symbol"===t.layerType&&("text-field"===o&&n&&!n.glyphs&&h.push(new O(r,a,'use of "text-field" requires a style "glyphs" property')),"text-font"===o&&fe(F(a))&&"identity"===B(a.type)&&h.push(new O(r,a,'"text-font" does not support identity functions'))),h.concat(Ke({key:t.key,value:a,valueSpec:u,style:n,styleSpec:i,expressionContext:"property",propertyKey:o}))}function Ge(t){return He(t,"paint")}function We(t){return He(t,"layout")}function Ye(t){var e=[],r=t.value,n=t.key,i=t.style,a=t.styleSpec;r.type||r.ref||e.push(new O(n,r,'either "type" or "ref" is required'));var o,s=B(r.type),l=B(r.ref);if(r.id)for(var c=B(r.id),u=0;u<t.arrayIndex;u++){var h=i.layers[u];B(h.id)===c&&e.push(new O(n,r.id,'duplicate layer id "'+r.id+'", previously used at line '+h.id.__line__))}if("ref"in r)["type","source","source-layer","filter","layout"].forEach(function(t){t in r&&e.push(new O(n,r[t],'"'+t+'" is prohibited for ref layers'))}),i.layers.forEach(function(t){B(t.id)===l&&(o=t)}),o?o.ref?e.push(new O(n,r.ref,"ref cannot reference another ref layer")):s=B(o.type):e.push(new O(n,r.ref,'ref layer "'+l+'" not found'));else if("background"!==s)if(r.source){var f=i.sources&&i.sources[r.source],p=f&&B(f.type);f?"vector"===p&&"raster"===s?e.push(new O(n,r.source,'layer "'+r.id+'" requires a raster source')):"raster"===p&&"raster"!==s?e.push(new O(n,r.source,'layer "'+r.id+'" requires a vector source')):"vector"!==p||r["source-layer"]?"raster-dem"===p&&"hillshade"!==s?e.push(new O(n,r.source,"raster-dem source can only be used with layer type 'hillshade'.")):"line"!==s||!r.paint||!r.paint["line-gradient"]||"geojson"===p&&f.lineMetrics||e.push(new O(n,r,'layer "'+r.id+'" specifies a line-gradient, which requires a GeoJSON source with `lineMetrics` enabled.')):e.push(new O(n,r,'layer "'+r.id+'" must specify a "source-layer"')):e.push(new O(n,r.source,'source "'+r.source+'" not found'))}else e.push(new O(n,r,'missing required property "source"'));return e=e.concat(Ee({key:n,value:r,valueSpec:a.layer,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{"*":function(){return[]},type:function(){return Ke({key:n+".type",value:r.type,valueSpec:a.layer.type,style:t.style,styleSpec:t.styleSpec,object:r,objectKey:"type"})},filter:qe,layout:function(t){return Ee({layer:r,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{"*":function(t){return We(R({layerType:s},t))}}})},paint:function(t){return Ee({layer:r,key:t.key,value:t.value,style:t.style,styleSpec:t.styleSpec,objectElementValidators:{"*":function(t){return Ge(R({layerType:s},t))}}})}}}))}function Xe(t){var e=t.value,r=t.key,n=t.styleSpec,i=t.style;if(!e.type)return[new O(r,e,'"type" is required')];var a=B(e.type),o=[];switch(a){case"vector":case"raster":case"raster-dem":if(o=o.concat(Ee({key:r,value:e,valueSpec:n["source_"+a.replace("-","_")],style:t.style,styleSpec:n})),"url"in e)for(var s in e)["type","url","tileSize"].indexOf(s)<0&&o.push(new O(r+"."+s,e[s],'a source with a "url" property may not include a "'+s+'" property'));return o;case"geojson":return Ee({key:r,value:e,valueSpec:n.source_geojson,style:i,styleSpec:n});case"video":return Ee({key:r,value:e,valueSpec:n.source_video,style:i,styleSpec:n});case"image":return Ee({key:r,value:e,valueSpec:n.source_image,style:i,styleSpec:n});case"canvas":return o.push(new O(r,null,"Please use runtime APIs to add canvas sources, rather than including them in stylesheets.","source.canvas")),o;default:return Ie({key:r+".type",value:e.type,valueSpec:{values:["vector","raster","raster-dem","geojson","video","image"]},style:i,styleSpec:n})}}function Ze(t){var e=t.value,r=t.styleSpec,n=r.light,i=t.style,a=[],o=he(e);if(void 0===e)return a;if("object"!==o)return a.concat([new O("light",e,"object expected, "+o+" found")]);for(var s in e){var l=s.match(/^(.*)-transition$/);a=l&&n[l[1]]&&n[l[1]].transition?a.concat(Ke({key:s,value:e[s],valueSpec:r.transition,style:i,styleSpec:r})):n[s]?a.concat(Ke({key:s,value:e[s],valueSpec:n[s],style:i,styleSpec:r})):a.concat([new O(s,e[s],'unknown property "'+s+'"')])}return a}function $e(t){var e=t.value,r=t.key,n=he(e);return"string"!==n?[new O(r,e,"string expected, "+n+" found")]:[]}var Je={"*":function(){return[]},array:Ce,boolean:function(t){var e=t.value,r=t.key,n=he(e);return"boolean"!==n?[new O(r,e,"boolean expected, "+n+" found")]:[]},number:Le,color:function(t){var e=t.key,r=t.value,n=he(r);return"string"!==n?[new O(e,r,"color expected, "+n+" found")]:null===Q(r)?[new O(e,r,'color expected, "'+r+'" found')]:[]},constants:D,enum:Ie,filter:qe,function:ze,layer:Ye,object:Ee,source:Xe,light:Ze,string:$e};function Ke(t){var e=t.value,r=t.valueSpec,n=t.styleSpec;return r.function&&fe(B(e))?ze(t):r.function&&_e(F(e))?Pe(t):r.type&&Je[r.type]?Je[r.type](t):Ee(R({},t,{valueSpec:r.type?n[r.type]:r}))}function Qe(t){var e=t.value,r=t.key,n=$e(t);return n.length?n:(-1===e.indexOf("{fontstack}")&&n.push(new O(r,e,'"glyphs" url must include a "{fontstack}" token')),-1===e.indexOf("{range}")&&n.push(new O(r,e,'"glyphs" url must include a "{range}" token')),n)}function tr(t,e){e=e||I;var r=[];return r=r.concat(Ke({key:"",value:t,valueSpec:e.$root,styleSpec:e,style:t,objectElementValidators:{glyphs:Qe,"*":function(){return[]}}})),t.constants&&(r=r.concat(D({key:"constants",value:t.constants,style:t,styleSpec:e}))),er(r)}function er(t){return[].concat(t).sort(function(t,e){return t.line-e.line})}function rr(t){return function(){return er(t.apply(this,arguments))}}tr.source=rr(Xe),tr.light=rr(Ze),tr.layer=rr(Ye),tr.filter=rr(qe),tr.paintProperty=rr(Ge),tr.layoutProperty=rr(We);var nr=tr,ir=tr.light,ar=tr.paintProperty,or=tr.layoutProperty;function sr(t,e){var r=!1;if(e&&e.length)for(var n=0,i=e;n<i.length;n+=1){var a=i[n];t.fire(new z(new Error(a.message))),r=!0}return r}var lr=ur,cr=3;function ur(t,e,r){var n=this.cells=[];if(t instanceof ArrayBuffer){this.arrayBuffer=t;var i=new Int32Array(this.arrayBuffer);t=i[0],e=i[1],r=i[2],this.d=e+2*r;for(var a=0;a<this.d*this.d;a++){var o=i[cr+a],s=i[cr+a+1];n.push(o===s?null:i.subarray(o,s))}var l=i[cr+n.length],c=i[cr+n.length+1];this.keys=i.subarray(l,c),this.bboxes=i.subarray(c),this.insert=this._insertReadonly}else{this.d=e+2*r;for(var u=0;u<this.d*this.d;u++)n.push([]);this.keys=[],this.bboxes=[]}this.n=e,this.extent=t,this.padding=r,this.scale=e/t,this.uid=0;var h=r/e*t;this.min=-h,this.max=t+h}ur.prototype.insert=function(t,e,r,n,i){this._forEachCell(e,r,n,i,this._insertCell,this.uid++),this.keys.push(t),this.bboxes.push(e),this.bboxes.push(r),this.bboxes.push(n),this.bboxes.push(i)},ur.prototype._insertReadonly=function(){throw"Cannot insert into a GridIndex created from an ArrayBuffer."},ur.prototype._insertCell=function(t,e,r,n,i,a){this.cells[i].push(a)},ur.prototype.query=function(t,e,r,n){var i=this.min,a=this.max;if(t<=i&&e<=i&&a<=r&&a<=n)return Array.prototype.slice.call(this.keys);var o=[];return this._forEachCell(t,e,r,n,this._queryCell,o,{}),o},ur.prototype._queryCell=function(t,e,r,n,i,a,o){var s=this.cells[i];if(null!==s)for(var l=this.keys,c=this.bboxes,u=0;u<s.length;u++){var h=s[u];if(void 0===o[h]){var f=4*h;t<=c[f+2]&&e<=c[f+3]&&r>=c[f+0]&&n>=c[f+1]?(o[h]=!0,a.push(l[h])):o[h]=!1}}},ur.prototype._forEachCell=function(t,e,r,n,i,a,o){for(var s=this._convertToCellCoord(t),l=this._convertToCellCoord(e),c=this._convertToCellCoord(r),u=this._convertToCellCoord(n),h=s;h<=c;h++)for(var f=l;f<=u;f++){var p=this.d*f+h;if(i.call(this,t,e,r,n,p,a,o))return}},ur.prototype._convertToCellCoord=function(t){return Math.max(0,Math.min(this.d-1,Math.floor(t*this.scale)+this.padding))},ur.prototype.toArrayBuffer=function(){if(this.arrayBuffer)return this.arrayBuffer;for(var t=this.cells,e=cr+this.cells.length+1+1,r=0,n=0;n<this.cells.length;n++)r+=this.cells[n].length;var i=new Int32Array(e+r+this.keys.length+this.bboxes.length);i[0]=this.extent,i[1]=this.n,i[2]=this.padding;for(var a=e,o=0;o<t.length;o++){var s=t[o];i[cr+o]=a,i.set(s,a),a+=s.length}return i[cr+t.length]=a,i.set(this.keys,a),a+=this.keys.length,i[cr+t.length+1]=a,i.set(this.bboxes,a),a+=this.bboxes.length,i.buffer};var hr=self.ImageData,fr={};function pr(t,e,r){void 0===r&&(r={}),Object.defineProperty(e,"_classRegistryKey",{value:t,writeable:!1}),fr[t]={klass:e,omit:r.omit||[],shallow:r.shallow||[]}}for(var dr in pr("Object",Object),lr.serialize=function(t,e){var r=t.toArrayBuffer();return e&&e.push(r),r},lr.deserialize=function(t){return new lr(t)},pr("Grid",lr),pr("Color",tt),pr("Error",Error),pr("StylePropertyFunction",Te),pr("StyleExpression",be,{omit:["_evaluator"]}),pr("ZoomDependentExpression",Me),pr("ZoomConstantExpression",ke),pr("CompoundExpression",gt,{omit:["_evaluate"]}),Rt)Rt[dr]._classRegistryKey||pr("Expression_"+dr,Rt[dr]);function gr(t,e){if(null==t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp)return t;if(t instanceof ArrayBuffer)return e&&e.push(t),t;if(ArrayBuffer.isView(t)){var r=t;return e&&e.push(r.buffer),r}if(t instanceof hr)return e&&e.push(t.data.buffer),t;if(Array.isArray(t)){for(var n=[],i=0,a=t;i<a.length;i+=1){var o=a[i];n.push(gr(o,e))}return n}if("object"==typeof t){var s=t.constructor,l=s._classRegistryKey;if(!l)throw new Error("can't serialize object of unregistered class");var c={};if(s.serialize)c._serialized=s.serialize(t,e);else{for(var u in t)if(t.hasOwnProperty(u)&&!(fr[l].omit.indexOf(u)>=0)){var h=t[u];c[u]=fr[l].shallow.indexOf(u)>=0?h:gr(h,e)}t instanceof Error&&(c.message=t.message)}return{name:l,properties:c}}throw new Error("can't serialize object of type "+typeof t)}function mr(t){if(null==t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||t instanceof Boolean||t instanceof Number||t instanceof String||t instanceof Date||t instanceof RegExp||t instanceof ArrayBuffer||ArrayBuffer.isView(t)||t instanceof hr)return t;if(Array.isArray(t))return t.map(function(t){return mr(t)});if("object"==typeof t){var e=t,r=e.name,n=e.properties;if(!r)throw new Error("can't deserialize object of anonymous class");var i=fr[r].klass;if(!i)throw new Error("can't deserialize unregistered class "+r);if(i.deserialize)return i.deserialize(n._serialized);for(var a=Object.create(i.prototype),o=0,s=Object.keys(n);o<s.length;o+=1){var l=s[o];a[l]=fr[r].shallow.indexOf(l)>=0?n[l]:mr(n[l])}return a}throw new Error("can't deserialize object of type "+typeof t)}var vr=function(){this.first=!0};vr.prototype.update=function(t,e){var r=Math.floor(t);return this.first?(this.first=!1,this.lastIntegerZoom=r,this.lastIntegerZoomTime=0,this.lastZoom=t,this.lastFloorZoom=r,!0):(this.lastFloorZoom>r?(this.lastIntegerZoom=r+1,this.lastIntegerZoomTime=e):this.lastFloorZoom<r&&(this.lastIntegerZoom=r,this.lastIntegerZoomTime=e),t!==this.lastZoom&&(this.lastZoom=t,this.lastFloorZoom=r,!0))};var yr={"Latin-1 Supplement":function(t){return t>=128&&t<=255},Arabic:function(t){return t>=1536&&t<=1791},"Arabic Supplement":function(t){return t>=1872&&t<=1919},"Arabic Extended-A":function(t){return t>=2208&&t<=2303},"Hangul Jamo":function(t){return t>=4352&&t<=4607},"Unified Canadian Aboriginal Syllabics":function(t){return t>=5120&&t<=5759},Khmer:function(t){return t>=6016&&t<=6143},"Unified Canadian Aboriginal Syllabics Extended":function(t){return t>=6320&&t<=6399},"General Punctuation":function(t){return t>=8192&&t<=8303},"Letterlike Symbols":function(t){return t>=8448&&t<=8527},"Number Forms":function(t){return t>=8528&&t<=8591},"Miscellaneous Technical":function(t){return t>=8960&&t<=9215},"Control Pictures":function(t){return t>=9216&&t<=9279},"Optical Character Recognition":function(t){return t>=9280&&t<=9311},"Enclosed Alphanumerics":function(t){return t>=9312&&t<=9471},"Geometric Shapes":function(t){return t>=9632&&t<=9727},"Miscellaneous Symbols":function(t){return t>=9728&&t<=9983},"Miscellaneous Symbols and Arrows":function(t){return t>=11008&&t<=11263},"CJK Radicals Supplement":function(t){return t>=11904&&t<=12031},"Kangxi Radicals":function(t){return t>=12032&&t<=12255},"Ideographic Description Characters":function(t){return t>=12272&&t<=12287},"CJK Symbols and Punctuation":function(t){return t>=12288&&t<=12351},Hiragana:function(t){return t>=12352&&t<=12447},Katakana:function(t){return t>=12448&&t<=12543},Bopomofo:function(t){return t>=12544&&t<=12591},"Hangul Compatibility Jamo":function(t){return t>=12592&&t<=12687},Kanbun:function(t){return t>=12688&&t<=12703},"Bopomofo Extended":function(t){return t>=12704&&t<=12735},"CJK Strokes":function(t){return t>=12736&&t<=12783},"Katakana Phonetic Extensions":function(t){return t>=12784&&t<=12799},"Enclosed CJK Letters and Months":function(t){return t>=12800&&t<=13055},"CJK Compatibility":function(t){return t>=13056&&t<=13311},"CJK Unified Ideographs Extension A":function(t){return t>=13312&&t<=19903},"Yijing Hexagram Symbols":function(t){return t>=19904&&t<=19967},"CJK Unified Ideographs":function(t){return t>=19968&&t<=40959},"Yi Syllables":function(t){return t>=40960&&t<=42127},"Yi Radicals":function(t){return t>=42128&&t<=42191},"Hangul Jamo Extended-A":function(t){return t>=43360&&t<=43391},"Hangul Syllables":function(t){return t>=44032&&t<=55215},"Hangul Jamo Extended-B":function(t){return t>=55216&&t<=55295},"Private Use Area":function(t){return t>=57344&&t<=63743},"CJK Compatibility Ideographs":function(t){return t>=63744&&t<=64255},"Arabic Presentation Forms-A":function(t){return t>=64336&&t<=65023},"Vertical Forms":function(t){return t>=65040&&t<=65055},"CJK Compatibility Forms":function(t){return t>=65072&&t<=65103},"Small Form Variants":function(t){return t>=65104&&t<=65135},"Arabic Presentation Forms-B":function(t){return t>=65136&&t<=65279},"Halfwidth and Fullwidth Forms":function(t){return t>=65280&&t<=65519}};function xr(t){for(var e=0,r=t;e<r.length;e+=1)if(_r(r[e].charCodeAt(0)))return!0;return!1}function br(t){return!(yr.Arabic(t)||yr["Arabic Supplement"](t)||yr["Arabic Extended-A"](t)||yr["Arabic Presentation Forms-A"](t)||yr["Arabic Presentation Forms-B"](t))}function _r(t){return!!(746===t||747===t||!(t<4352)&&(yr["Bopomofo Extended"](t)||yr.Bopomofo(t)||yr["CJK Compatibility Forms"](t)&&!(t>=65097&&t<=65103)||yr["CJK Compatibility Ideographs"](t)||yr["CJK Compatibility"](t)||yr["CJK Radicals Supplement"](t)||yr["CJK Strokes"](t)||!(!yr["CJK Symbols and Punctuation"](t)||t>=12296&&t<=12305||t>=12308&&t<=12319||12336===t)||yr["CJK Unified Ideographs Extension A"](t)||yr["CJK Unified Ideographs"](t)||yr["Enclosed CJK Letters and Months"](t)||yr["Hangul Compatibility Jamo"](t)||yr["Hangul Jamo Extended-A"](t)||yr["Hangul Jamo Extended-B"](t)||yr["Hangul Jamo"](t)||yr["Hangul Syllables"](t)||yr.Hiragana(t)||yr["Ideographic Description Characters"](t)||yr.Kanbun(t)||yr["Kangxi Radicals"](t)||yr["Katakana Phonetic Extensions"](t)||yr.Katakana(t)&&12540!==t||!(!yr["Halfwidth and Fullwidth Forms"](t)||65288===t||65289===t||65293===t||t>=65306&&t<=65310||65339===t||65341===t||65343===t||t>=65371&&t<=65503||65507===t||t>=65512&&t<=65519)||!(!yr["Small Form Variants"](t)||t>=65112&&t<=65118||t>=65123&&t<=65126)||yr["Unified Canadian Aboriginal Syllabics"](t)||yr["Unified Canadian Aboriginal Syllabics Extended"](t)||yr["Vertical Forms"](t)||yr["Yijing Hexagram Symbols"](t)||yr["Yi Syllables"](t)||yr["Yi Radicals"](t)))}function wr(t){return!(_r(t)||function(t){return!!(yr["Latin-1 Supplement"](t)&&(167===t||169===t||174===t||177===t||188===t||189===t||190===t||215===t||247===t)||yr["General Punctuation"](t)&&(8214===t||8224===t||8225===t||8240===t||8241===t||8251===t||8252===t||8258===t||8263===t||8264===t||8265===t||8273===t)||yr["Letterlike Symbols"](t)||yr["Number Forms"](t)||yr["Miscellaneous Technical"](t)&&(t>=8960&&t<=8967||t>=8972&&t<=8991||t>=8996&&t<=9e3||9003===t||t>=9085&&t<=9114||t>=9150&&t<=9165||9167===t||t>=9169&&t<=9179||t>=9186&&t<=9215)||yr["Control Pictures"](t)&&9251!==t||yr["Optical Character Recognition"](t)||yr["Enclosed Alphanumerics"](t)||yr["Geometric Shapes"](t)||yr["Miscellaneous Symbols"](t)&&!(t>=9754&&t<=9759)||yr["Miscellaneous Symbols and Arrows"](t)&&(t>=11026&&t<=11055||t>=11088&&t<=11097||t>=11192&&t<=11243)||yr["CJK Symbols and Punctuation"](t)||yr.Katakana(t)||yr["Private Use Area"](t)||yr["CJK Compatibility Forms"](t)||yr["Small Form Variants"](t)||yr["Halfwidth and Fullwidth Forms"](t)||8734===t||8756===t||8757===t||t>=9984&&t<=10087||t>=10102&&t<=10131||65532===t||65533===t)}(t))}function kr(t,e){return!(!e&&(t>=1424&&t<=2303||yr["Arabic Presentation Forms-A"](t)||yr["Arabic Presentation Forms-B"](t))||t>=2304&&t<=3583||t>=3840&&t<=4255||yr.Khmer(t))}var Mr,Ar=!1,Tr=null,Sr=!1,Er=new P,Cr={applyArabicShaping:null,processBidirectionalText:null,isLoaded:function(){return Sr||null!=Cr.applyArabicShaping}},Lr=function(t,e){this.zoom=t,e?(this.now=e.now,this.fadeDuration=e.fadeDuration,this.zoomHistory=e.zoomHistory,this.transition=e.transition):(this.now=0,this.fadeDuration=0,this.zoomHistory=new vr,this.transition={})};Lr.prototype.isSupportedScript=function(t){return function(t,e){for(var r=0,n=t;r<n.length;r+=1)if(!kr(n[r].charCodeAt(0),e))return!1;return!0}(t,Cr.isLoaded())},Lr.prototype.crossFadingFactor=function(){return 0===this.fadeDuration?1:Math.min((this.now-this.zoomHistory.lastIntegerZoomTime)/this.fadeDuration,1)};var zr=function(t,e){this.property=t,this.value=e,this.expression=Se(void 0===e?t.specification.default:e,t.specification)};zr.prototype.isDataDriven=function(){return"source"===this.expression.kind||"composite"===this.expression.kind},zr.prototype.possiblyEvaluate=function(t){return this.property.possiblyEvaluate(this,t)};var Pr=function(t){this.property=t,this.value=new zr(t,void 0)};Pr.prototype.transitioned=function(t,e){return new Or(this.property,this.value,e,p({},t.transition,this.transition),t.now)},Pr.prototype.untransitioned=function(){return new Or(this.property,this.value,null,{},0)};var Ir=function(t){this._properties=t,this._values=Object.create(t.defaultTransitionablePropertyValues)};Ir.prototype.getValue=function(t){return x(this._values[t].value.value)},Ir.prototype.setValue=function(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Pr(this._values[t].property)),this._values[t].value=new zr(this._values[t].property,null===e?void 0:x(e))},Ir.prototype.getTransition=function(t){return x(this._values[t].transition)},Ir.prototype.setTransition=function(t,e){this._values.hasOwnProperty(t)||(this._values[t]=new Pr(this._values[t].property)),this._values[t].transition=x(e)||void 0},Ir.prototype.serialize=function(){for(var t={},e=0,r=Object.keys(this._values);e<r.length;e+=1){var n=r[e],i=this.getValue(n);void 0!==i&&(t[n]=i);var a=this.getTransition(n);void 0!==a&&(t[n+"-transition"]=a)}return t},Ir.prototype.transitioned=function(t,e){for(var r=new Dr(this._properties),n=0,i=Object.keys(this._values);n<i.length;n+=1){var a=i[n];r._values[a]=this._values[a].transitioned(t,e._values[a])}return r},Ir.prototype.untransitioned=function(){for(var t=new Dr(this._properties),e=0,r=Object.keys(this._values);e<r.length;e+=1){var n=r[e];t._values[n]=this._values[n].untransitioned()}return t};var Or=function(t,e,r,n,i){this.property=t,this.value=e,this.begin=i+n.delay||0,this.end=this.begin+n.duration||0,t.specification.transition&&(n.delay||n.duration)&&(this.prior=r)};Or.prototype.possiblyEvaluate=function(t){var e=t.now||0,r=this.value.possiblyEvaluate(t),n=this.prior;if(n){if(e>this.end)return this.prior=null,r;if(this.value.isDataDriven())return this.prior=null,r;if(e<this.begin)return n.possiblyEvaluate(t);var i=(e-this.begin)/(this.end-this.begin);return this.property.interpolate(n.possiblyEvaluate(t),r,function(t){if(i<=0)return 0;if(i>=1)return 1;var e=i*i,r=e*i;return 4*(i<.5?r:3*(i-e)+r-.75)}())}return r};var Dr=function(t){this._properties=t,this._values=Object.create(t.defaultTransitioningPropertyValues)};Dr.prototype.possiblyEvaluate=function(t){for(var e=new Fr(this._properties),r=0,n=Object.keys(this._values);r<n.length;r+=1){var i=n[r];e._values[i]=this._values[i].possiblyEvaluate(t)}return e},Dr.prototype.hasTransition=function(){for(var t=0,e=Object.keys(this._values);t<e.length;t+=1){var r=e[t];if(this._values[r].prior)return!0}return!1};var Rr=function(t){this._properties=t,this._values=Object.create(t.defaultPropertyValues)};Rr.prototype.getValue=function(t){return x(this._values[t].value)},Rr.prototype.setValue=function(t,e){this._values[t]=new zr(this._values[t].property,null===e?void 0:x(e))},Rr.prototype.serialize=function(){for(var t={},e=0,r=Object.keys(this._values);e<r.length;e+=1){var n=r[e],i=this.getValue(n);void 0!==i&&(t[n]=i)}return t},Rr.prototype.possiblyEvaluate=function(t){for(var e=new Fr(this._properties),r=0,n=Object.keys(this._values);r<n.length;r+=1){var i=n[r];e._values[i]=this._values[i].possiblyEvaluate(t)}return e};var Br=function(t,e,r){this.property=t,this.value=e,this.globals=r};Br.prototype.isConstant=function(){return"constant"===this.value.kind},Br.prototype.constantOr=function(t){return"constant"===this.value.kind?this.value.value:t},Br.prototype.evaluate=function(t){return this.property.evaluate(this.value,this.globals,t)};var Fr=function(t){this._properties=t,this._values=Object.create(t.defaultPossiblyEvaluatedValues)};Fr.prototype.get=function(t){return this._values[t]};var Nr=function(t){this.specification=t};Nr.prototype.possiblyEvaluate=function(t,e){return t.expression.evaluate(e)},Nr.prototype.interpolate=function(t,e,r){var n=kt[this.specification.type];return n?n(t,e,r):t};var jr=function(t){this.specification=t};jr.prototype.possiblyEvaluate=function(t,e){return"constant"===t.expression.kind||"camera"===t.expression.kind?new Br(this,{kind:"constant",value:t.expression.evaluate(e)},e):new Br(this,t.expression,e)},jr.prototype.interpolate=function(t,e,r){if("constant"!==t.value.kind||"constant"!==e.value.kind)return t;if(void 0===t.value.value||void 0===e.value.value)return new Br(this,{kind:"constant",value:void 0},t.globals);var n=kt[this.specification.type];return n?new Br(this,{kind:"constant",value:n(t.value.value,e.value.value,r)},t.globals):t},jr.prototype.evaluate=function(t,e,r){return"constant"===t.kind?t.value:t.evaluate(e,r)};var Vr=function(t){this.specification=t};Vr.prototype.possiblyEvaluate=function(t,e){if(void 0!==t.value){if("constant"===t.expression.kind){var r=t.expression.evaluate(e);return this._calculate(r,r,r,e)}return this._calculate(t.expression.evaluate(new Lr(Math.floor(e.zoom-1),e)),t.expression.evaluate(new Lr(Math.floor(e.zoom),e)),t.expression.evaluate(new Lr(Math.floor(e.zoom+1),e)),e)}},Vr.prototype._calculate=function(t,e,r,n){var i=n.zoom,a=i-Math.floor(i),o=n.crossFadingFactor();return i>n.zoomHistory.lastIntegerZoom?{from:t,to:e,fromScale:2,toScale:1,t:a+(1-a)*o}:{from:r,to:e,fromScale:.5,toScale:1,t:1-(1-o)*a}},Vr.prototype.interpolate=function(t){return t};var Ur=function(t){this.specification=t};Ur.prototype.possiblyEvaluate=function(t,e){return!!t.expression.evaluate(e)},Ur.prototype.interpolate=function(){return!1};var qr=function(t){for(var e in this.properties=t,this.defaultPropertyValues={},this.defaultTransitionablePropertyValues={},this.defaultTransitioningPropertyValues={},this.defaultPossiblyEvaluatedValues={},t){var r=t[e],n=this.defaultPropertyValues[e]=new zr(r,void 0),i=this.defaultTransitionablePropertyValues[e]=new Pr(r);this.defaultTransitioningPropertyValues[e]=i.untransitioned(),this.defaultPossiblyEvaluatedValues[e]=n.possiblyEvaluate({})}};pr("DataDrivenProperty",jr),pr("DataConstantProperty",Nr),pr("CrossFadedProperty",Vr),pr("ColorRampProperty",Ur);var Hr=function(t){function e(e,r){for(var n in t.call(this),this.id=e.id,this.metadata=e.metadata,this.type=e.type,this.minzoom=e.minzoom,this.maxzoom=e.maxzoom,this.visibility="visible","background"!==e.type&&(this.source=e.source,this.sourceLayer=e["source-layer"],this.filter=e.filter),this._featureFilter=function(){return!0},r.layout&&(this._unevaluatedLayout=new Rr(r.layout)),this._transitionablePaint=new Ir(r.paint),e.paint)this.setPaintProperty(n,e.paint[n],{validate:!1});for(var i in e.layout)this.setLayoutProperty(i,e.layout[i],{validate:!1});this._transitioningPaint=this._transitionablePaint.untransitioned()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getLayoutProperty=function(t){return"visibility"===t?this.visibility:this._unevaluatedLayout.getValue(t)},e.prototype.setLayoutProperty=function(t,e,r){if(null!=e){var n="layers."+this.id+".layout."+t;if(this._validate(or,n,t,e,r))return}"visibility"!==t?this._unevaluatedLayout.setValue(t,e):this.visibility="none"===e?e:"visible"},e.prototype.getPaintProperty=function(t){return m(t,"-transition")?this._transitionablePaint.getTransition(t.slice(0,-"-transition".length)):this._transitionablePaint.getValue(t)},e.prototype.setPaintProperty=function(t,e,r){if(null!=e){var n="layers."+this.id+".paint."+t;if(this._validate(ar,n,t,e,r))return}m(t,"-transition")?this._transitionablePaint.setTransition(t.slice(0,-"-transition".length),e||void 0):this._transitionablePaint.setValue(t,e)},e.prototype.isHidden=function(t){return!!(this.minzoom&&t<this.minzoom)||!!(this.maxzoom&&t>=this.maxzoom)||"none"===this.visibility},e.prototype.updateTransitions=function(t){this._transitioningPaint=this._transitionablePaint.transitioned(t,this._transitioningPaint)},e.prototype.hasTransition=function(){return this._transitioningPaint.hasTransition()},e.prototype.recalculate=function(t){this._unevaluatedLayout&&(this.layout=this._unevaluatedLayout.possiblyEvaluate(t)),this.paint=this._transitioningPaint.possiblyEvaluate(t)},e.prototype.serialize=function(){var t={id:this.id,type:this.type,source:this.source,"source-layer":this.sourceLayer,metadata:this.metadata,minzoom:this.minzoom,maxzoom:this.maxzoom,filter:this.filter,layout:this._unevaluatedLayout&&this._unevaluatedLayout.serialize(),paint:this._transitionablePaint&&this._transitionablePaint.serialize()};return"none"===this.visibility&&(t.layout=t.layout||{},t.layout.visibility="none"),y(t,function(t,e){return!(void 0===t||"layout"===e&&!Object.keys(t).length||"paint"===e&&!Object.keys(t).length)})},e.prototype._validate=function(t,e,r,n,i){return(!i||!1!==i.validate)&&sr(this,t.call(nr,{key:e,layerType:this.type,objectKey:r,value:n,styleSpec:I,style:{glyphs:!0,sprite:!0}}))},e.prototype.hasOffscreenPass=function(){return!1},e.prototype.resize=function(){},e}(P),Gr={Int8:Int8Array,Uint8:Uint8Array,Int16:Int16Array,Uint16:Uint16Array,Int32:Int32Array,Uint32:Uint32Array,Float32:Float32Array},Wr=function(t,e){this._structArray=t,this._pos1=e*this.size,this._pos2=this._pos1/2,this._pos4=this._pos1/4,this._pos8=this._pos1/8},Yr=function(){this.isTransferred=!1,this.capacity=-1,this.resize(0)};function Xr(t,e){void 0===e&&(e=1);var r=0,n=0;return{members:t.map(function(t){var i,a=(i=t.type,Gr[i].BYTES_PER_ELEMENT),o=r=Zr(r,Math.max(e,a)),s=t.components||1;return n=Math.max(n,a),r+=a*s,{name:t.name,type:t.type,components:s,offset:o}}),size:Zr(r,Math.max(n,e)),alignment:e}}function Zr(t,e){return Math.ceil(t/e)*e}Yr.serialize=function(t,e){return t._trim(),e&&(t.isTransferred=!0,e.push(t.arrayBuffer)),{length:t.length,arrayBuffer:t.arrayBuffer}},Yr.deserialize=function(t){var e=Object.create(this.prototype);return e.arrayBuffer=t.arrayBuffer,e.length=t.length,e.capacity=t.arrayBuffer.byteLength/e.bytesPerElement,e._refreshViews(),e},Yr.prototype._trim=function(){this.length!==this.capacity&&(this.capacity=this.length,this.arrayBuffer=this.arrayBuffer.slice(0,this.length*this.bytesPerElement),this._refreshViews())},Yr.prototype.clear=function(){this.length=0},Yr.prototype.resize=function(t){this.reserve(t),this.length=t},Yr.prototype.reserve=function(t){if(t>this.capacity){this.capacity=Math.max(t,Math.floor(5*this.capacity),128),this.arrayBuffer=new ArrayBuffer(this.capacity*this.bytesPerElement);var e=this.uint8;this._refreshViews(),e&&this.uint8.set(e)}},Yr.prototype._refreshViews=function(){throw new Error("_refreshViews() must be implemented by each concrete StructArray layout")};var $r=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;this.resize(r+1);var n=2*r;return this.int16[n+0]=t,this.int16[n+1]=e,r},e}(Yr);$r.prototype.bytesPerElement=4,pr("StructArrayLayout2i4",$r);var Jr=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;this.resize(i+1);var a=4*i;return this.int16[a+0]=t,this.int16[a+1]=e,this.int16[a+2]=r,this.int16[a+3]=n,i},e}(Yr);Jr.prototype.bytesPerElement=8,pr("StructArrayLayout4i8",Jr);var Kr=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;this.resize(o+1);var s=6*o;return this.int16[s+0]=t,this.int16[s+1]=e,this.int16[s+2]=r,this.int16[s+3]=n,this.int16[s+4]=i,this.int16[s+5]=a,o},e}(Yr);Kr.prototype.bytesPerElement=12,pr("StructArrayLayout2i4i12",Kr);var Qr=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s){var l=this.length;this.resize(l+1);var c=6*l,u=12*l;return this.int16[c+0]=t,this.int16[c+1]=e,this.int16[c+2]=r,this.int16[c+3]=n,this.uint8[u+8]=i,this.uint8[u+9]=a,this.uint8[u+10]=o,this.uint8[u+11]=s,l},e}(Yr);Qr.prototype.bytesPerElement=12,pr("StructArrayLayout4i4ub12",Qr);var tn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s){var l=this.length;this.resize(l+1);var c=8*l;return this.int16[c+0]=t,this.int16[c+1]=e,this.int16[c+2]=r,this.int16[c+3]=n,this.uint16[c+4]=i,this.uint16[c+5]=a,this.uint16[c+6]=o,this.uint16[c+7]=s,l},e}(Yr);tn.prototype.bytesPerElement=16,pr("StructArrayLayout4i4ui16",tn);var en=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;this.resize(n+1);var i=3*n;return this.float32[i+0]=t,this.float32[i+1]=e,this.float32[i+2]=r,n},e}(Yr);en.prototype.bytesPerElement=12,pr("StructArrayLayout3f12",en);var rn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;this.resize(e+1);var r=1*e;return this.uint32[r+0]=t,e},e}(Yr);rn.prototype.bytesPerElement=4,pr("StructArrayLayout1ul4",rn);var nn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,c,u){var h=this.length;this.resize(h+1);var f=12*h,p=6*h;return this.int16[f+0]=t,this.int16[f+1]=e,this.int16[f+2]=r,this.int16[f+3]=n,this.int16[f+4]=i,this.int16[f+5]=a,this.uint32[p+3]=o,this.uint16[f+8]=s,this.uint16[f+9]=l,this.int16[f+10]=c,this.int16[f+11]=u,h},e}(Yr);nn.prototype.bytesPerElement=24,pr("StructArrayLayout6i1ul2ui2i24",nn);var an=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a){var o=this.length;this.resize(o+1);var s=6*o;return this.int16[s+0]=t,this.int16[s+1]=e,this.int16[s+2]=r,this.int16[s+3]=n,this.int16[s+4]=i,this.int16[s+5]=a,o},e}(Yr);an.prototype.bytesPerElement=12,pr("StructArrayLayout2i2i2i12",an);var on=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;this.resize(r+1);var n=4*r;return this.uint8[n+0]=t,this.uint8[n+1]=e,r},e}(Yr);on.prototype.bytesPerElement=4,pr("StructArrayLayout2ub4",on);var sn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n,i,a,o,s,l,c,u,h,f,p){var d=this.length;this.resize(d+1);var g=20*d,m=10*d,v=40*d;return this.int16[g+0]=t,this.int16[g+1]=e,this.uint16[g+2]=r,this.uint16[g+3]=n,this.uint32[m+2]=i,this.uint32[m+3]=a,this.uint32[m+4]=o,this.uint16[g+10]=s,this.uint16[g+11]=l,this.uint16[g+12]=c,this.float32[m+7]=u,this.float32[m+8]=h,this.uint8[v+36]=f,this.uint8[v+37]=p,d},e}(Yr);sn.prototype.bytesPerElement=40,pr("StructArrayLayout2i2ui3ul3ui2f2ub40",sn);var ln=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t){var e=this.length;this.resize(e+1);var r=1*e;return this.float32[r+0]=t,e},e}(Yr);ln.prototype.bytesPerElement=4,pr("StructArrayLayout1f4",ln);var cn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.int16=new Int16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;this.resize(n+1);var i=3*n;return this.int16[i+0]=t,this.int16[i+1]=e,this.int16[i+2]=r,n},e}(Yr);cn.prototype.bytesPerElement=6,pr("StructArrayLayout3i6",cn);var un=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint32=new Uint32Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;this.resize(n+1);var i=2*n,a=4*n;return this.uint32[i+0]=t,this.uint16[a+2]=e,this.uint16[a+3]=r,n},e}(Yr);un.prototype.bytesPerElement=8,pr("StructArrayLayout1ul2ui8",un);var hn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r){var n=this.length;this.resize(n+1);var i=3*n;return this.uint16[i+0]=t,this.uint16[i+1]=e,this.uint16[i+2]=r,n},e}(Yr);hn.prototype.bytesPerElement=6,pr("StructArrayLayout3ui6",hn);var fn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.uint16=new Uint16Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;this.resize(r+1);var n=2*r;return this.uint16[n+0]=t,this.uint16[n+1]=e,r},e}(Yr);fn.prototype.bytesPerElement=4,pr("StructArrayLayout2ui4",fn);var pn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e){var r=this.length;this.resize(r+1);var n=2*r;return this.float32[n+0]=t,this.float32[n+1]=e,r},e}(Yr);pn.prototype.bytesPerElement=8,pr("StructArrayLayout2f8",pn);var dn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype._refreshViews=function(){this.uint8=new Uint8Array(this.arrayBuffer),this.float32=new Float32Array(this.arrayBuffer)},e.prototype.emplaceBack=function(t,e,r,n){var i=this.length;this.resize(i+1);var a=4*i;return this.float32[a+0]=t,this.float32[a+1]=e,this.float32[a+2]=r,this.float32[a+3]=n,i},e}(Yr);dn.prototype.bytesPerElement=16,pr("StructArrayLayout4f16",dn);var gn=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorPointX:{configurable:!0},anchorPointY:{configurable:!0},x1:{configurable:!0},y1:{configurable:!0},x2:{configurable:!0},y2:{configurable:!0},featureIndex:{configurable:!0},sourceLayerIndex:{configurable:!0},bucketIndex:{configurable:!0},radius:{configurable:!0},signedDistanceFromAnchor:{configurable:!0},anchorPoint:{configurable:!0}};return r.anchorPointX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorPointX.set=function(t){this._structArray.int16[this._pos2+0]=t},r.anchorPointY.get=function(){return this._structArray.int16[this._pos2+1]},r.anchorPointY.set=function(t){this._structArray.int16[this._pos2+1]=t},r.x1.get=function(){return this._structArray.int16[this._pos2+2]},r.x1.set=function(t){this._structArray.int16[this._pos2+2]=t},r.y1.get=function(){return this._structArray.int16[this._pos2+3]},r.y1.set=function(t){this._structArray.int16[this._pos2+3]=t},r.x2.get=function(){return this._structArray.int16[this._pos2+4]},r.x2.set=function(t){this._structArray.int16[this._pos2+4]=t},r.y2.get=function(){return this._structArray.int16[this._pos2+5]},r.y2.set=function(t){this._structArray.int16[this._pos2+5]=t},r.featureIndex.get=function(){return this._structArray.uint32[this._pos4+3]},r.featureIndex.set=function(t){this._structArray.uint32[this._pos4+3]=t},r.sourceLayerIndex.get=function(){return this._structArray.uint16[this._pos2+8]},r.sourceLayerIndex.set=function(t){this._structArray.uint16[this._pos2+8]=t},r.bucketIndex.get=function(){return this._structArray.uint16[this._pos2+9]},r.bucketIndex.set=function(t){this._structArray.uint16[this._pos2+9]=t},r.radius.get=function(){return this._structArray.int16[this._pos2+10]},r.radius.set=function(t){this._structArray.int16[this._pos2+10]=t},r.signedDistanceFromAnchor.get=function(){return this._structArray.int16[this._pos2+11]},r.signedDistanceFromAnchor.set=function(t){this._structArray.int16[this._pos2+11]=t},r.anchorPoint.get=function(){return new l(this.anchorPointX,this.anchorPointY)},Object.defineProperties(e.prototype,r),e}(Wr);gn.prototype.size=24;var mn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new gn(this,t)},e}(nn);pr("CollisionBoxArray",mn);var vn=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={anchorX:{configurable:!0},anchorY:{configurable:!0},glyphStartIndex:{configurable:!0},numGlyphs:{configurable:!0},vertexStartIndex:{configurable:!0},lineStartIndex:{configurable:!0},lineLength:{configurable:!0},segment:{configurable:!0},lowerSize:{configurable:!0},upperSize:{configurable:!0},lineOffsetX:{configurable:!0},lineOffsetY:{configurable:!0},writingMode:{configurable:!0},hidden:{configurable:!0}};return r.anchorX.get=function(){return this._structArray.int16[this._pos2+0]},r.anchorX.set=function(t){this._structArray.int16[this._pos2+0]=t},r.anchorY.get=function(){return this._structArray.int16[this._pos2+1]},r.anchorY.set=function(t){this._structArray.int16[this._pos2+1]=t},r.glyphStartIndex.get=function(){return this._structArray.uint16[this._pos2+2]},r.glyphStartIndex.set=function(t){this._structArray.uint16[this._pos2+2]=t},r.numGlyphs.get=function(){return this._structArray.uint16[this._pos2+3]},r.numGlyphs.set=function(t){this._structArray.uint16[this._pos2+3]=t},r.vertexStartIndex.get=function(){return this._structArray.uint32[this._pos4+2]},r.vertexStartIndex.set=function(t){this._structArray.uint32[this._pos4+2]=t},r.lineStartIndex.get=function(){return this._structArray.uint32[this._pos4+3]},r.lineStartIndex.set=function(t){this._structArray.uint32[this._pos4+3]=t},r.lineLength.get=function(){return this._structArray.uint32[this._pos4+4]},r.lineLength.set=function(t){this._structArray.uint32[this._pos4+4]=t},r.segment.get=function(){return this._structArray.uint16[this._pos2+10]},r.segment.set=function(t){this._structArray.uint16[this._pos2+10]=t},r.lowerSize.get=function(){return this._structArray.uint16[this._pos2+11]},r.lowerSize.set=function(t){this._structArray.uint16[this._pos2+11]=t},r.upperSize.get=function(){return this._structArray.uint16[this._pos2+12]},r.upperSize.set=function(t){this._structArray.uint16[this._pos2+12]=t},r.lineOffsetX.get=function(){return this._structArray.float32[this._pos4+7]},r.lineOffsetX.set=function(t){this._structArray.float32[this._pos4+7]=t},r.lineOffsetY.get=function(){return this._structArray.float32[this._pos4+8]},r.lineOffsetY.set=function(t){this._structArray.float32[this._pos4+8]=t},r.writingMode.get=function(){return this._structArray.uint8[this._pos1+36]},r.writingMode.set=function(t){this._structArray.uint8[this._pos1+36]=t},r.hidden.get=function(){return this._structArray.uint8[this._pos1+37]},r.hidden.set=function(t){this._structArray.uint8[this._pos1+37]=t},Object.defineProperties(e.prototype,r),e}(Wr);vn.prototype.size=40;var yn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new vn(this,t)},e}(sn);pr("PlacedSymbolArray",yn);var xn=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={offsetX:{configurable:!0}};return r.offsetX.get=function(){return this._structArray.float32[this._pos4+0]},r.offsetX.set=function(t){this._structArray.float32[this._pos4+0]=t},Object.defineProperties(e.prototype,r),e}(Wr);xn.prototype.size=4;var bn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getoffsetX=function(t){return this.float32[1*t+0]},e.prototype.get=function(t){return new xn(this,t)},e}(ln);pr("GlyphOffsetArray",bn);var _n=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={x:{configurable:!0},y:{configurable:!0},tileUnitDistanceFromAnchor:{configurable:!0}};return r.x.get=function(){return this._structArray.int16[this._pos2+0]},r.x.set=function(t){this._structArray.int16[this._pos2+0]=t},r.y.get=function(){return this._structArray.int16[this._pos2+1]},r.y.set=function(t){this._structArray.int16[this._pos2+1]=t},r.tileUnitDistanceFromAnchor.get=function(){return this._structArray.int16[this._pos2+2]},r.tileUnitDistanceFromAnchor.set=function(t){this._structArray.int16[this._pos2+2]=t},Object.defineProperties(e.prototype,r),e}(Wr);_n.prototype.size=6;var wn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.getx=function(t){return this.int16[3*t+0]},e.prototype.gety=function(t){return this.int16[3*t+1]},e.prototype.gettileUnitDistanceFromAnchor=function(t){return this.int16[3*t+2]},e.prototype.get=function(t){return new _n(this,t)},e}(cn);pr("SymbolLineVertexArray",wn);var kn=function(t){function e(){t.apply(this,arguments)}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={featureIndex:{configurable:!0},sourceLayerIndex:{configurable:!0},bucketIndex:{configurable:!0}};return r.featureIndex.get=function(){return this._structArray.uint32[this._pos4+0]},r.featureIndex.set=function(t){this._structArray.uint32[this._pos4+0]=t},r.sourceLayerIndex.get=function(){return this._structArray.uint16[this._pos2+2]},r.sourceLayerIndex.set=function(t){this._structArray.uint16[this._pos2+2]=t},r.bucketIndex.get=function(){return this._structArray.uint16[this._pos2+3]},r.bucketIndex.set=function(t){this._structArray.uint16[this._pos2+3]=t},Object.defineProperties(e.prototype,r),e}(Wr);kn.prototype.size=8;var Mn=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.get=function(t){return new kn(this,t)},e}(un);pr("FeatureIndexArray",Mn);var An=Xr([{name:"a_pos",components:2,type:"Int16"}],4).members,Tn=function(t){void 0===t&&(t=[]),this.segments=t};Tn.prototype.prepareSegment=function(t,e,r){var n=this.segments[this.segments.length-1];return t>Tn.MAX_VERTEX_ARRAY_LENGTH&&_("Max vertices per segment is "+Tn.MAX_VERTEX_ARRAY_LENGTH+": bucket requested "+t),(!n||n.vertexLength+t>Tn.MAX_VERTEX_ARRAY_LENGTH)&&(n={vertexOffset:e.length,primitiveOffset:r.length,vertexLength:0,primitiveLength:0},this.segments.push(n)),n},Tn.prototype.get=function(){return this.segments},Tn.prototype.destroy=function(){for(var t=0,e=this.segments;t<e.length;t+=1){var r=e[t];for(var n in r.vaos)r.vaos[n].destroy()}},Tn.MAX_VERTEX_ARRAY_LENGTH=Math.pow(2,16)-1,pr("SegmentVector",Tn);var Sn=function(t,e){return 256*(t=f(Math.floor(t),0,255))+f(Math.floor(e),0,255)};function En(t){return[Sn(255*t.r,255*t.g),Sn(255*t.b,255*t.a)]}var Cn=function(t,e,r){this.value=t,this.name=e,this.type=r,this.statistics={max:-1/0}};Cn.prototype.defines=function(){return["#define HAS_UNIFORM_u_"+this.name]},Cn.prototype.populatePaintArray=function(){},Cn.prototype.upload=function(){},Cn.prototype.destroy=function(){},Cn.prototype.setUniforms=function(t,e,r,n){var i=n.constantOr(this.value),a=t.gl;"color"===this.type?a.uniform4f(e.uniforms["u_"+this.name],i.r,i.g,i.b,i.a):a.uniform1f(e.uniforms["u_"+this.name],i)};var Ln=function(t,e,r){this.expression=t,this.name=e,this.type=r,this.statistics={max:-1/0};var n="color"===r?pn:ln;this.paintVertexAttributes=[{name:"a_"+e,type:"Float32",components:"color"===r?2:1,offset:0}],this.paintVertexArray=new n};Ln.prototype.defines=function(){return[]},Ln.prototype.populatePaintArray=function(t,e){var r=this.paintVertexArray,n=r.length;r.reserve(t);var i=this.expression.evaluate(new Lr(0),e);if("color"===this.type)for(var a=En(i),o=n;o<t;o++)r.emplaceBack(a[0],a[1]);else{for(var s=n;s<t;s++)r.emplaceBack(i);this.statistics.max=Math.max(this.statistics.max,i)}},Ln.prototype.upload=function(t){this.paintVertexArray&&(this.paintVertexBuffer=t.createVertexBuffer(this.paintVertexArray,this.paintVertexAttributes))},Ln.prototype.destroy=function(){this.paintVertexBuffer&&this.paintVertexBuffer.destroy()},Ln.prototype.setUniforms=function(t,e){t.gl.uniform1f(e.uniforms["a_"+this.name+"_t"],0)};var zn=function(t,e,r,n,i){this.expression=t,this.name=e,this.type=r,this.useIntegerZoom=n,this.zoom=i,this.statistics={max:-1/0};var a="color"===r?dn:pn;this.paintVertexAttributes=[{name:"a_"+e,type:"Float32",components:"color"===r?4:2,offset:0}],this.paintVertexArray=new a};zn.prototype.defines=function(){return[]},zn.prototype.populatePaintArray=function(t,e){var r=this.paintVertexArray,n=r.length;r.reserve(t);var i=this.expression.evaluate(new Lr(this.zoom),e),a=this.expression.evaluate(new Lr(this.zoom+1),e);if("color"===this.type)for(var o=En(i),s=En(a),l=n;l<t;l++)r.emplaceBack(o[0],o[1],s[0],s[1]);else{for(var c=n;c<t;c++)r.emplaceBack(i,a);this.statistics.max=Math.max(this.statistics.max,i,a)}},zn.prototype.upload=function(t){this.paintVertexArray&&(this.paintVertexBuffer=t.createVertexBuffer(this.paintVertexArray,this.paintVertexAttributes))},zn.prototype.destroy=function(){this.paintVertexBuffer&&this.paintVertexBuffer.destroy()},zn.prototype.interpolationFactor=function(t){return this.useIntegerZoom?this.expression.interpolationFactor(Math.floor(t),this.zoom,this.zoom+1):this.expression.interpolationFactor(t,this.zoom,this.zoom+1)},zn.prototype.setUniforms=function(t,e,r){t.gl.uniform1f(e.uniforms["a_"+this.name+"_t"],this.interpolationFactor(r.zoom))};var Pn=function(){this.binders={},this.cacheKey="",this._buffers=[]};Pn.createDynamic=function(t,e,r){var n=new Pn,i=[];for(var a in t.paint._values)if(r(a)){var o=t.paint.get(a);if(o instanceof Br&&o.property.specification["property-function"]){var s=On(a,t.type),l=o.property.specification.type,c=o.property.useIntegerZoom;"constant"===o.value.kind?(n.binders[a]=new Cn(o.value,s,l),i.push("/u_"+s)):"source"===o.value.kind?(n.binders[a]=new Ln(o.value,s,l),i.push("/a_"+s)):(n.binders[a]=new zn(o.value,s,l,c,e),i.push("/z_"+s))}}return n.cacheKey=i.sort().join(""),n},Pn.prototype.populatePaintArrays=function(t,e){for(var r in this.binders)this.binders[r].populatePaintArray(t,e)},Pn.prototype.defines=function(){var t=[];for(var e in this.binders)t.push.apply(t,this.binders[e].defines());return t},Pn.prototype.setUniforms=function(t,e,r,n){for(var i in this.binders)this.binders[i].setUniforms(t,e,n,r.get(i))},Pn.prototype.getPaintVertexBuffers=function(){return this._buffers},Pn.prototype.upload=function(t){for(var e in this.binders)this.binders[e].upload(t);var r=[];for(var n in this.binders){var i=this.binders[n];(i instanceof Ln||i instanceof zn)&&i.paintVertexBuffer&&r.push(i.paintVertexBuffer)}this._buffers=r},Pn.prototype.destroy=function(){for(var t in this.binders)this.binders[t].destroy()};var In=function(t,e,r,n){void 0===n&&(n=function(){return!0}),this.programConfigurations={};for(var i=0,a=e;i<a.length;i+=1){var o=a[i];this.programConfigurations[o.id]=Pn.createDynamic(o,r,n),this.programConfigurations[o.id].layoutAttributes=t}};function On(t,e){return{"text-opacity":"opacity","icon-opacity":"opacity","text-color":"fill_color","icon-color":"fill_color","text-halo-color":"halo_color","icon-halo-color":"halo_color","text-halo-blur":"halo_blur","icon-halo-blur":"halo_blur","text-halo-width":"halo_width","icon-halo-width":"halo_width","line-gap-width":"gapwidth"}[t]||t.replace(e+"-","").replace(/-/g,"_")}In.prototype.populatePaintArrays=function(t,e){for(var r in this.programConfigurations)this.programConfigurations[r].populatePaintArrays(t,e)},In.prototype.get=function(t){return this.programConfigurations[t]},In.prototype.upload=function(t){for(var e in this.programConfigurations)this.programConfigurations[e].upload(t)},In.prototype.destroy=function(){for(var t in this.programConfigurations)this.programConfigurations[t].destroy()},pr("ConstantBinder",Cn),pr("SourceExpressionBinder",Ln),pr("CompositeExpressionBinder",zn),pr("ProgramConfiguration",Pn,{omit:["_buffers"]}),pr("ProgramConfigurationSet",In);var Dn=8192,Rn=(16,{min:-1*Math.pow(2,15),max:Math.pow(2,15)-1});function Bn(t){for(var e=Dn/t.extent,r=t.loadGeometry(),n=0;n<r.length;n++)for(var i=r[n],a=0;a<i.length;a++){var o=i[a];o.x=Math.round(o.x*e),o.y=Math.round(o.y*e),(o.x<Rn.min||o.x>Rn.max||o.y<Rn.min||o.y>Rn.max)&&_("Geometry exceeds allowed extent, reduce your vector tile buffer size")}return r}function Fn(t,e,r,n,i){t.emplaceBack(2*e+(n+1)/2,2*r+(i+1)/2)}var Nn=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map(function(t){return t.id}),this.index=t.index,this.layoutVertexArray=new $r,this.indexArray=new hn,this.segments=new Tn,this.programConfigurations=new In(An,t.layers,t.zoom)};function jn(t,e,r){for(var n=0;n<t.length;n++){var i=t[n];if(Zn(i,e))return!0;if(Wn(e,i,r))return!0}return!1}function Vn(t,e){if(1===t.length&&1===t[0].length)return Xn(e,t[0][0]);for(var r=0;r<e.length;r++)for(var n=e[r],i=0;i<n.length;i++)if(Xn(t,n[i]))return!0;for(var a=0;a<t.length;a++){for(var o=t[a],s=0;s<o.length;s++)if(Xn(e,o[s]))return!0;for(var l=0;l<e.length;l++)if(Hn(o,e[l]))return!0}return!1}function Un(t,e,r){for(var n=0;n<e.length;n++)for(var i=e[n],a=0;a<t.length;a++){var o=t[a];if(o.length>=3)for(var s=0;s<i.length;s++)if(Zn(o,i[s]))return!0;if(qn(o,i,r))return!0}return!1}function qn(t,e,r){if(t.length>1){if(Hn(t,e))return!0;for(var n=0;n<e.length;n++)if(Wn(e[n],t,r))return!0}for(var i=0;i<t.length;i++)if(Wn(t[i],e,r))return!0;return!1}function Hn(t,e){if(0===t.length||0===e.length)return!1;for(var r=0;r<t.length-1;r++)for(var n=t[r],i=t[r+1],a=0;a<e.length-1;a++)if(Gn(n,i,e[a],e[a+1]))return!0;return!1}function Gn(t,e,r,n){return w(t,r,n)!==w(e,r,n)&&w(t,e,r)!==w(t,e,n)}function Wn(t,e,r){var n=r*r;if(1===e.length)return t.distSqr(e[0])<n;for(var i=1;i<e.length;i++)if(Yn(t,e[i-1],e[i])<n)return!0;return!1}function Yn(t,e,r){var n=e.distSqr(r);if(0===n)return t.distSqr(e);var i=((t.x-e.x)*(r.x-e.x)+(t.y-e.y)*(r.y-e.y))/n;return i<0?t.distSqr(e):i>1?t.distSqr(r):t.distSqr(r.sub(e)._mult(i)._add(e))}function Xn(t,e){for(var r,n,i,a=!1,o=0;o<t.length;o++)for(var s=0,l=(r=t[o]).length-1;s<r.length;l=s++)n=r[s],i=r[l],n.y>e.y!=i.y>e.y&&e.x<(i.x-n.x)*(e.y-n.y)/(i.y-n.y)+n.x&&(a=!a);return a}function Zn(t,e){for(var r=!1,n=0,i=t.length-1;n<t.length;i=n++){var a=t[n],o=t[i];a.y>e.y!=o.y>e.y&&e.x<(o.x-a.x)*(e.y-a.y)/(o.y-a.y)+a.x&&(r=!r)}return r}function $n(t,e,r){var n=e.paint.get(t).value;return"constant"===n.kind?n.value:r.programConfigurations.get(e.id).binders[t].statistics.max}function Jn(t){return Math.sqrt(t[0]*t[0]+t[1]*t[1])}function Kn(t,e,r,n,i){if(!e[0]&&!e[1])return t;var a=l.convert(e);"viewport"===r&&a._rotate(-n);for(var o=[],s=0;s<t.length;s++){for(var c=t[s],u=[],h=0;h<c.length;h++)u.push(c[h].sub(a._mult(i)));o.push(u)}return o}Nn.prototype.populate=function(t,e){for(var r=0,n=t;r<n.length;r+=1){var i=n[r],a=i.feature,o=i.index,s=i.sourceLayerIndex;if(this.layers[0]._featureFilter(new Lr(this.zoom),a)){var l=Bn(a);this.addFeature(a,l),e.featureIndex.insert(a,l,o,s,this.index)}}},Nn.prototype.isEmpty=function(){return 0===this.layoutVertexArray.length},Nn.prototype.upload=function(t){this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,An),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.programConfigurations.upload(t)},Nn.prototype.destroy=function(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy())},Nn.prototype.addFeature=function(t,e){for(var r=0,n=e;r<n.length;r+=1)for(var i=0,a=n[r];i<a.length;i+=1){var o=a[i],s=o.x,l=o.y;if(!(s<0||s>=Dn||l<0||l>=Dn)){var c=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray),u=c.vertexLength;Fn(this.layoutVertexArray,s,l,-1,-1),Fn(this.layoutVertexArray,s,l,1,-1),Fn(this.layoutVertexArray,s,l,1,1),Fn(this.layoutVertexArray,s,l,-1,1),this.indexArray.emplaceBack(u,u+1,u+2),this.indexArray.emplaceBack(u,u+3,u+2),c.vertexLength+=4,c.primitiveLength+=2}}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t)},pr("CircleBucket",Nn,{omit:["layers"]});var Qn={paint:new qr({"circle-radius":new jr(I.paint_circle["circle-radius"]),"circle-color":new jr(I.paint_circle["circle-color"]),"circle-blur":new jr(I.paint_circle["circle-blur"]),"circle-opacity":new jr(I.paint_circle["circle-opacity"]),"circle-translate":new Nr(I.paint_circle["circle-translate"]),"circle-translate-anchor":new Nr(I.paint_circle["circle-translate-anchor"]),"circle-pitch-scale":new Nr(I.paint_circle["circle-pitch-scale"]),"circle-pitch-alignment":new Nr(I.paint_circle["circle-pitch-alignment"]),"circle-stroke-width":new jr(I.paint_circle["circle-stroke-width"]),"circle-stroke-color":new jr(I.paint_circle["circle-stroke-color"]),"circle-stroke-opacity":new jr(I.paint_circle["circle-stroke-opacity"])})},ti=i(function(t,e){var r;t.exports=((r=new Float32Array(3))[0]=0,r[1]=0,r[2]=0,function(){var t=new Float32Array(4);t[0]=0,t[1]=0,t[2]=0,t[3]=0}(),{vec3:{transformMat3:function(t,e,r){var n=e[0],i=e[1],a=e[2];return t[0]=n*r[0]+i*r[3]+a*r[6],t[1]=n*r[1]+i*r[4]+a*r[7],t[2]=n*r[2]+i*r[5]+a*r[8],t}},vec4:{transformMat4:function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3];return t[0]=r[0]*n+r[4]*i+r[8]*a+r[12]*o,t[1]=r[1]*n+r[5]*i+r[9]*a+r[13]*o,t[2]=r[2]*n+r[6]*i+r[10]*a+r[14]*o,t[3]=r[3]*n+r[7]*i+r[11]*a+r[15]*o,t}},mat2:{create:function(){var t=new Float32Array(4);return t[0]=1,t[1]=0,t[2]=0,t[3]=1,t},rotate:function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=Math.sin(r),l=Math.cos(r);return t[0]=n*l+a*s,t[1]=i*l+o*s,t[2]=n*-s+a*l,t[3]=i*-s+o*l,t},scale:function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=r[0],l=r[1];return t[0]=n*s,t[1]=i*s,t[2]=a*l,t[3]=o*l,t}},mat3:{create:function(){var t=new Float32Array(9);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=1,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t},fromRotation:function(t,e){var r=Math.sin(e),n=Math.cos(e);return t[0]=n,t[1]=r,t[2]=0,t[3]=-r,t[4]=n,t[5]=0,t[6]=0,t[7]=0,t[8]=1,t}},mat4:{create:function(){var t=new Float32Array(16);return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},identity:function(t){return t[0]=1,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=1,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=1,t[11]=0,t[12]=0,t[13]=0,t[14]=0,t[15]=1,t},translate:function(t,e,r){var n,i,a,o,s,l,c,u,h,f,p,d,g=r[0],m=r[1],v=r[2];return e===t?(t[12]=e[0]*g+e[4]*m+e[8]*v+e[12],t[13]=e[1]*g+e[5]*m+e[9]*v+e[13],t[14]=e[2]*g+e[6]*m+e[10]*v+e[14],t[15]=e[3]*g+e[7]*m+e[11]*v+e[15]):(n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],c=e[6],u=e[7],h=e[8],f=e[9],p=e[10],d=e[11],t[0]=n,t[1]=i,t[2]=a,t[3]=o,t[4]=s,t[5]=l,t[6]=c,t[7]=u,t[8]=h,t[9]=f,t[10]=p,t[11]=d,t[12]=n*g+s*m+h*v+e[12],t[13]=i*g+l*m+f*v+e[13],t[14]=a*g+c*m+p*v+e[14],t[15]=o*g+u*m+d*v+e[15]),t},scale:function(t,e,r){var n=r[0],i=r[1],a=r[2];return t[0]=e[0]*n,t[1]=e[1]*n,t[2]=e[2]*n,t[3]=e[3]*n,t[4]=e[4]*i,t[5]=e[5]*i,t[6]=e[6]*i,t[7]=e[7]*i,t[8]=e[8]*a,t[9]=e[9]*a,t[10]=e[10]*a,t[11]=e[11]*a,t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15],t},multiply:function(t,e,r){var n=e[0],i=e[1],a=e[2],o=e[3],s=e[4],l=e[5],c=e[6],u=e[7],h=e[8],f=e[9],p=e[10],d=e[11],g=e[12],m=e[13],v=e[14],y=e[15],x=r[0],b=r[1],_=r[2],w=r[3];return t[0]=x*n+b*s+_*h+w*g,t[1]=x*i+b*l+_*f+w*m,t[2]=x*a+b*c+_*p+w*v,t[3]=x*o+b*u+_*d+w*y,x=r[4],b=r[5],_=r[6],w=r[7],t[4]=x*n+b*s+_*h+w*g,t[5]=x*i+b*l+_*f+w*m,t[6]=x*a+b*c+_*p+w*v,t[7]=x*o+b*u+_*d+w*y,x=r[8],b=r[9],_=r[10],w=r[11],t[8]=x*n+b*s+_*h+w*g,t[9]=x*i+b*l+_*f+w*m,t[10]=x*a+b*c+_*p+w*v,t[11]=x*o+b*u+_*d+w*y,x=r[12],b=r[13],_=r[14],w=r[15],t[12]=x*n+b*s+_*h+w*g,t[13]=x*i+b*l+_*f+w*m,t[14]=x*a+b*c+_*p+w*v,t[15]=x*o+b*u+_*d+w*y,t},perspective:function(t,e,r,n,i){var a=1/Math.tan(e/2),o=1/(n-i);return t[0]=a/r,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=a,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=(i+n)*o,t[11]=-1,t[12]=0,t[13]=0,t[14]=2*i*n*o,t[15]=0,t},rotateX:function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[4],o=e[5],s=e[6],l=e[7],c=e[8],u=e[9],h=e[10],f=e[11];return e!==t&&(t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[4]=a*i+c*n,t[5]=o*i+u*n,t[6]=s*i+h*n,t[7]=l*i+f*n,t[8]=c*i-a*n,t[9]=u*i-o*n,t[10]=h*i-s*n,t[11]=f*i-l*n,t},rotateZ:function(t,e,r){var n=Math.sin(r),i=Math.cos(r),a=e[0],o=e[1],s=e[2],l=e[3],c=e[4],u=e[5],h=e[6],f=e[7];return e!==t&&(t[8]=e[8],t[9]=e[9],t[10]=e[10],t[11]=e[11],t[12]=e[12],t[13]=e[13],t[14]=e[14],t[15]=e[15]),t[0]=a*i+c*n,t[1]=o*i+u*n,t[2]=s*i+h*n,t[3]=l*i+f*n,t[4]=c*i-a*n,t[5]=u*i-o*n,t[6]=h*i-s*n,t[7]=f*i-l*n,t},invert:function(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=e[4],s=e[5],l=e[6],c=e[7],u=e[8],h=e[9],f=e[10],p=e[11],d=e[12],g=e[13],m=e[14],v=e[15],y=r*s-n*o,x=r*l-i*o,b=r*c-a*o,_=n*l-i*s,w=n*c-a*s,k=i*c-a*l,M=u*g-h*d,A=u*m-f*d,T=u*v-p*d,S=h*m-f*g,E=h*v-p*g,C=f*v-p*m,L=y*C-x*E+b*S+_*T-w*A+k*M;return L?(L=1/L,t[0]=(s*C-l*E+c*S)*L,t[1]=(i*E-n*C-a*S)*L,t[2]=(g*k-m*w+v*_)*L,t[3]=(f*w-h*k-p*_)*L,t[4]=(l*T-o*C-c*A)*L,t[5]=(r*C-i*T+a*A)*L,t[6]=(m*b-d*k-v*x)*L,t[7]=(u*k-f*b+p*x)*L,t[8]=(o*E-s*T+c*M)*L,t[9]=(n*T-r*E-a*M)*L,t[10]=(d*w-g*b+v*y)*L,t[11]=(h*b-u*w-p*y)*L,t[12]=(s*A-o*S-l*M)*L,t[13]=(r*S-n*A+i*M)*L,t[14]=(g*x-d*_-m*y)*L,t[15]=(u*_-h*x+f*y)*L,t):null},ortho:function(t,e,r,n,i,a,o){var s=1/(e-r),l=1/(n-i),c=1/(a-o);return t[0]=-2*s,t[1]=0,t[2]=0,t[3]=0,t[4]=0,t[5]=-2*l,t[6]=0,t[7]=0,t[8]=0,t[9]=0,t[10]=2*c,t[11]=0,t[12]=(e+r)*s,t[13]=(i+n)*l,t[14]=(o+a)*c,t[15]=1,t}}})}),ei=(ti.vec3,ti.vec4),ri=(ti.mat2,ti.mat3,ti.mat4),ni=function(t){function e(e){t.call(this,e,Qn)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.createBucket=function(t){return new Nn(t)},e.prototype.queryRadius=function(t){var e=t;return $n("circle-radius",this,e)+$n("circle-stroke-width",this,e)+Jn(this.paint.get("circle-translate"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,a,o){for(var s=Kn(t,this.paint.get("circle-translate"),this.paint.get("circle-translate-anchor"),i.angle,a),l=this.paint.get("circle-radius").evaluate(e)+this.paint.get("circle-stroke-width").evaluate(e),c="map"===this.paint.get("circle-pitch-alignment"),u=c?s:function(t,e,r){return s.map(function(t){return t.map(function(t){return ii(t,e,r)})})}(0,o,i),h=c?l*a:l,f=0,p=r;f<p.length;f+=1)for(var d=0,g=p[f];d<g.length;d+=1){var m=g[d],v=c?m:ii(m,o,i),y=h,x=ei.transformMat4([],[m.x,m.y,0,1],o);if("viewport"===this.paint.get("circle-pitch-scale")&&"map"===this.paint.get("circle-pitch-alignment")?y*=x[3]/i.cameraToCenterDistance:"map"===this.paint.get("circle-pitch-scale")&&"viewport"===this.paint.get("circle-pitch-alignment")&&(y*=i.cameraToCenterDistance/x[3]),jn(u,v,y))return!0}return!1},e}(Hr);function ii(t,e,r){var n=ei.transformMat4([],[t.x,t.y,0,1],e);return new l((n[0]/n[3]+1)*r.width*.5,(n[1]/n[3]+1)*r.height*.5)}var ai=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Nn);function oi(t,e,r,n){var i=e.width,a=e.height;if(n){if(n.length!==i*a*r)throw new RangeError("mismatched image size")}else n=new Uint8Array(i*a*r);return t.width=i,t.height=a,t.data=n,t}function si(t,e,r){var n=e.width,i=e.height;if(n!==t.width||i!==t.height){var a=oi({},{width:n,height:i},r);li(t,a,{x:0,y:0},{x:0,y:0},{width:Math.min(t.width,n),height:Math.min(t.height,i)},r),t.width=n,t.height=i,t.data=a.data}}function li(t,e,r,n,i,a){if(0===i.width||0===i.height)return e;if(i.width>t.width||i.height>t.height||r.x>t.width-i.width||r.y>t.height-i.height)throw new RangeError("out of range source coordinates for image copy");if(i.width>e.width||i.height>e.height||n.x>e.width-i.width||n.y>e.height-i.height)throw new RangeError("out of range destination coordinates for image copy");for(var o=t.data,s=e.data,l=0;l<i.height;l++)for(var c=((r.y+l)*t.width+r.x)*a,u=((n.y+l)*e.width+n.x)*a,h=0;h<i.width*a;h++)s[u+h]=o[c+h];return e}pr("HeatmapBucket",ai,{omit:["layers"]});var ci=function(t,e){oi(this,t,1,e)};ci.prototype.resize=function(t){si(this,t,1)},ci.prototype.clone=function(){return new ci({width:this.width,height:this.height},new Uint8Array(this.data))},ci.copy=function(t,e,r,n,i){li(t,e,r,n,i,1)};var ui=function(t,e){oi(this,t,4,e)};ui.prototype.resize=function(t){si(this,t,4)},ui.prototype.clone=function(){return new ui({width:this.width,height:this.height},new Uint8Array(this.data))},ui.copy=function(t,e,r,n,i){li(t,e,r,n,i,4)},pr("AlphaImage",ci),pr("RGBAImage",ui);var hi={paint:new qr({"heatmap-radius":new jr(I.paint_heatmap["heatmap-radius"]),"heatmap-weight":new jr(I.paint_heatmap["heatmap-weight"]),"heatmap-intensity":new Nr(I.paint_heatmap["heatmap-intensity"]),"heatmap-color":new Ur(I.paint_heatmap["heatmap-color"]),"heatmap-opacity":new Nr(I.paint_heatmap["heatmap-opacity"])})};function fi(t,e){for(var r=new Uint8Array(1024),n={},i=0,a=0;i<256;i++,a+=4){n[e]=i/255;var o=t.evaluate(n);r[a+0]=Math.floor(255*o.r/o.a),r[a+1]=Math.floor(255*o.g/o.a),r[a+2]=Math.floor(255*o.b/o.a),r[a+3]=Math.floor(255*o.a)}return new ui({width:256,height:1},r)}var pi=function(t){function e(e){t.call(this,e,hi),this._updateColorRamp()}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.createBucket=function(t){return new ai(t)},e.prototype.setPaintProperty=function(e,r,n){t.prototype.setPaintProperty.call(this,e,r,n),"heatmap-color"===e&&this._updateColorRamp()},e.prototype._updateColorRamp=function(){var t=this._transitionablePaint._values["heatmap-color"].value.expression;this.colorRamp=fi(t,"heatmapDensity"),this.colorRampTexture=null},e.prototype.resize=function(){this.heatmapFbo&&(this.heatmapFbo.destroy(),this.heatmapFbo=null)},e.prototype.queryRadius=function(){return 0},e.prototype.queryIntersectsFeature=function(){return!1},e.prototype.hasOffscreenPass=function(){return 0!==this.paint.get("heatmap-opacity")&&"none"!==this.visibility},e}(Hr),di={paint:new qr({"hillshade-illumination-direction":new Nr(I.paint_hillshade["hillshade-illumination-direction"]),"hillshade-illumination-anchor":new Nr(I.paint_hillshade["hillshade-illumination-anchor"]),"hillshade-exaggeration":new Nr(I.paint_hillshade["hillshade-exaggeration"]),"hillshade-shadow-color":new Nr(I.paint_hillshade["hillshade-shadow-color"]),"hillshade-highlight-color":new Nr(I.paint_hillshade["hillshade-highlight-color"]),"hillshade-accent-color":new Nr(I.paint_hillshade["hillshade-accent-color"])})},gi=function(t){function e(e){t.call(this,e,di)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.hasOffscreenPass=function(){return 0!==this.paint.get("hillshade-exaggeration")&&"none"!==this.visibility},e}(Hr),mi=Xr([{name:"a_pos",components:2,type:"Int16"}],4).members,vi=xi,yi=xi;function xi(t,e,r){r=r||2;var n,i,a,o,s,l,c,u=e&&e.length,h=u?e[0]*r:t.length,f=bi(t,0,h,r,!0),p=[];if(!f)return p;if(u&&(f=function(t,e,r,n){var i,a,o,s=[];for(i=0,a=e.length;i<a;i++)(o=bi(t,e[i]*n,i<a-1?e[i+1]*n:t.length,n,!1))===o.next&&(o.steiner=!0),s.push(Li(o));for(s.sort(Si),i=0;i<s.length;i++)Ei(s[i],r),r=_i(r,r.next);return r}(t,e,f,r)),t.length>80*r){n=a=t[0],i=o=t[1];for(var d=r;d<h;d+=r)(s=t[d])<n&&(n=s),(l=t[d+1])<i&&(i=l),s>a&&(a=s),l>o&&(o=l);c=0!==(c=Math.max(a-n,o-i))?1/c:0}return wi(f,p,r,n,i,c),p}function bi(t,e,r,n,i){var a,o;if(i===Vi(t,e,r,n)>0)for(a=e;a<r;a+=n)o=Fi(a,t[a],t[a+1],o);else for(a=r-n;a>=e;a-=n)o=Fi(a,t[a],t[a+1],o);return o&&Oi(o,o.next)&&(Ni(o),o=o.next),o}function _i(t,e){if(!t)return t;e||(e=t);var r,n=t;do{if(r=!1,n.steiner||!Oi(n,n.next)&&0!==Ii(n.prev,n,n.next))n=n.next;else{if(Ni(n),(n=e=n.prev)===n.next)break;r=!0}}while(r||n!==e);return e}function wi(t,e,r,n,i,a,o){if(t){!o&&a&&function(t,e,r,n){var i=t;do{null===i.z&&(i.z=Ci(i.x,i.y,e,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next}while(i!==t);i.prevZ.nextZ=null,i.prevZ=null,function(t){var e,r,n,i,a,o,s,l,c=1;do{for(r=t,t=null,a=null,o=0;r;){for(o++,n=r,s=0,e=0;e<c&&(s++,n=n.nextZ);e++);for(l=c;s>0||l>0&&n;)0!==s&&(0===l||!n||r.z<=n.z)?(i=r,r=r.nextZ,s--):(i=n,n=n.nextZ,l--),a?a.nextZ=i:t=i,i.prevZ=a,a=i;r=n}a.nextZ=null,c*=2}while(o>1)}(i)}(t,n,i,a);for(var s,l,c=t;t.prev!==t.next;)if(s=t.prev,l=t.next,a?Mi(t,n,i,a):ki(t))e.push(s.i/r),e.push(t.i/r),e.push(l.i/r),Ni(t),t=l.next,c=l.next;else if((t=l)===c){o?1===o?wi(t=Ai(t,e,r),e,r,n,i,a,2):2===o&&Ti(t,e,r,n,i,a):wi(_i(t),e,r,n,i,a,1);break}}}function ki(t){var e=t.prev,r=t,n=t.next;if(Ii(e,r,n)>=0)return!1;for(var i=t.next.next;i!==t.prev;){if(zi(e.x,e.y,r.x,r.y,n.x,n.y,i.x,i.y)&&Ii(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function Mi(t,e,r,n){var i=t.prev,a=t,o=t.next;if(Ii(i,a,o)>=0)return!1;for(var s=i.x<a.x?i.x<o.x?i.x:o.x:a.x<o.x?a.x:o.x,l=i.y<a.y?i.y<o.y?i.y:o.y:a.y<o.y?a.y:o.y,c=i.x>a.x?i.x>o.x?i.x:o.x:a.x>o.x?a.x:o.x,u=i.y>a.y?i.y>o.y?i.y:o.y:a.y>o.y?a.y:o.y,h=Ci(s,l,e,r,n),f=Ci(c,u,e,r,n),p=t.prevZ,d=t.nextZ;p&&p.z>=h&&d&&d.z<=f;){if(p!==t.prev&&p!==t.next&&zi(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&Ii(p.prev,p,p.next)>=0)return!1;if(p=p.prevZ,d!==t.prev&&d!==t.next&&zi(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&Ii(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(;p&&p.z>=h;){if(p!==t.prev&&p!==t.next&&zi(i.x,i.y,a.x,a.y,o.x,o.y,p.x,p.y)&&Ii(p.prev,p,p.next)>=0)return!1;p=p.prevZ}for(;d&&d.z<=f;){if(d!==t.prev&&d!==t.next&&zi(i.x,i.y,a.x,a.y,o.x,o.y,d.x,d.y)&&Ii(d.prev,d,d.next)>=0)return!1;d=d.nextZ}return!0}function Ai(t,e,r){var n=t;do{var i=n.prev,a=n.next.next;!Oi(i,a)&&Di(i,n,n.next,a)&&Ri(i,a)&&Ri(a,i)&&(e.push(i.i/r),e.push(n.i/r),e.push(a.i/r),Ni(n),Ni(n.next),n=t=a),n=n.next}while(n!==t);return n}function Ti(t,e,r,n,i,a){var o=t;do{for(var s=o.next.next;s!==o.prev;){if(o.i!==s.i&&Pi(o,s)){var l=Bi(o,s);return o=_i(o,o.next),l=_i(l,l.next),wi(o,e,r,n,i,a),void wi(l,e,r,n,i,a)}s=s.next}o=o.next}while(o!==t)}function Si(t,e){return t.x-e.x}function Ei(t,e){if(e=function(t,e){var r,n=e,i=t.x,a=t.y,o=-1/0;do{if(a<=n.y&&a>=n.next.y&&n.next.y!==n.y){var s=n.x+(a-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(s<=i&&s>o){if(o=s,s===i){if(a===n.y)return n;if(a===n.next.y)return n.next}r=n.x<n.next.x?n:n.next}}n=n.next}while(n!==e);if(!r)return null;if(i===o)return r.prev;var l,c=r,u=r.x,h=r.y,f=1/0;for(n=r.next;n!==c;)i>=n.x&&n.x>=u&&i!==n.x&&zi(a<h?i:o,a,u,h,a<h?o:i,a,n.x,n.y)&&((l=Math.abs(a-n.y)/(i-n.x))<f||l===f&&n.x>r.x)&&Ri(n,t)&&(r=n,f=l),n=n.next;return r}(t,e)){var r=Bi(e,t);_i(r,r.next)}}function Ci(t,e,r,n,i){return(t=1431655765&((t=858993459&((t=252645135&((t=16711935&((t=32767*(t-r)*i)|t<<8))|t<<4))|t<<2))|t<<1))|(e=1431655765&((e=858993459&((e=252645135&((e=16711935&((e=32767*(e-n)*i)|e<<8))|e<<4))|e<<2))|e<<1))<<1}function Li(t){var e=t,r=t;do{e.x<r.x&&(r=e),e=e.next}while(e!==t);return r}function zi(t,e,r,n,i,a,o,s){return(i-o)*(e-s)-(t-o)*(a-s)>=0&&(t-o)*(n-s)-(r-o)*(e-s)>=0&&(r-o)*(a-s)-(i-o)*(n-s)>=0}function Pi(t,e){return t.next.i!==e.i&&t.prev.i!==e.i&&!function(t,e){var r=t;do{if(r.i!==t.i&&r.next.i!==t.i&&r.i!==e.i&&r.next.i!==e.i&&Di(r,r.next,t,e))return!0;r=r.next}while(r!==t);return!1}(t,e)&&Ri(t,e)&&Ri(e,t)&&function(t,e){var r=t,n=!1,i=(t.x+e.x)/2,a=(t.y+e.y)/2;do{r.y>a!=r.next.y>a&&r.next.y!==r.y&&i<(r.next.x-r.x)*(a-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next}while(r!==t);return n}(t,e)}function Ii(t,e,r){return(e.y-t.y)*(r.x-e.x)-(e.x-t.x)*(r.y-e.y)}function Oi(t,e){return t.x===e.x&&t.y===e.y}function Di(t,e,r,n){return!!(Oi(t,e)&&Oi(r,n)||Oi(t,n)&&Oi(r,e))||Ii(t,e,r)>0!=Ii(t,e,n)>0&&Ii(r,n,t)>0!=Ii(r,n,e)>0}function Ri(t,e){return Ii(t.prev,t,t.next)<0?Ii(t,e,t.next)>=0&&Ii(t,t.prev,e)>=0:Ii(t,e,t.prev)<0||Ii(t,t.next,e)<0}function Bi(t,e){var r=new ji(t.i,t.x,t.y),n=new ji(e.i,e.x,e.y),i=t.next,a=e.prev;return t.next=e,e.prev=t,r.next=i,i.prev=r,n.next=r,r.prev=n,a.next=n,n.prev=a,n}function Fi(t,e,r,n){var i=new ji(t,e,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function Ni(t){t.next.prev=t.prev,t.prev.next=t.next,t.prevZ&&(t.prevZ.nextZ=t.nextZ),t.nextZ&&(t.nextZ.prevZ=t.prevZ)}function ji(t,e,r){this.i=t,this.x=e,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function Vi(t,e,r,n){for(var i=0,a=e,o=r-n;a<r;a+=n)i+=(t[o]-t[a])*(t[a+1]+t[o+1]),o=a;return i}xi.deviation=function(t,e,r,n){var i=e&&e.length,a=i?e[0]*r:t.length,o=Math.abs(Vi(t,0,a,r));if(i)for(var s=0,l=e.length;s<l;s++){var c=e[s]*r,u=s<l-1?e[s+1]*r:t.length;o-=Math.abs(Vi(t,c,u,r))}var h=0;for(s=0;s<n.length;s+=3){var f=n[s]*r,p=n[s+1]*r,d=n[s+2]*r;h+=Math.abs((t[f]-t[d])*(t[p+1]-t[f+1])-(t[f]-t[p])*(t[d+1]-t[f+1]))}return 0===o&&0===h?0:Math.abs((h-o)/o)},xi.flatten=function(t){for(var e=t[0][0].length,r={vertices:[],holes:[],dimensions:e},n=0,i=0;i<t.length;i++){for(var a=0;a<t[i].length;a++)for(var o=0;o<e;o++)r.vertices.push(t[i][a][o]);i>0&&(n+=t[i-1].length,r.holes.push(n))}return r},vi.default=yi;var Ui=Hi,qi=Hi;function Hi(t,e,r,n,i){!function t(e,r,n,i,a){for(;i>n;){if(i-n>600){var o=i-n+1,s=r-n+1,l=Math.log(o),c=.5*Math.exp(2*l/3),u=.5*Math.sqrt(l*c*(o-c)/o)*(s-o/2<0?-1:1);t(e,r,Math.max(n,Math.floor(r-s*c/o+u)),Math.min(i,Math.floor(r+(o-s)*c/o+u)),a)}var h=e[r],f=n,p=i;for(Gi(e,n,r),a(e[i],h)>0&&Gi(e,n,i);f<p;){for(Gi(e,f,p),f++,p--;a(e[f],h)<0;)f++;for(;a(e[p],h)>0;)p--}0===a(e[n],h)?Gi(e,n,p):Gi(e,++p,i),p<=r&&(n=p+1),r<=p&&(i=p-1)}}(t,e,r||0,n||t.length-1,i||Wi)}function Gi(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function Wi(t,e){return t<e?-1:t>e?1:0}function Yi(t,e){var r=t.length;if(r<=1)return[t];for(var n,i,a=[],o=0;o<r;o++){var s=k(t[o]);0!==s&&(t[o].area=Math.abs(s),void 0===i&&(i=s<0),i===s<0?(n&&a.push(n),n=[t[o]]):n.push(t[o]))}if(n&&a.push(n),e>1)for(var l=0;l<a.length;l++)a[l].length<=e||(Ui(a[l],e,1,a[l].length-1,Xi),a[l]=a[l].slice(0,e));return a}function Xi(t,e){return e.area-t.area}Ui.default=qi;var Zi=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map(function(t){return t.id}),this.index=t.index,this.layoutVertexArray=new $r,this.indexArray=new hn,this.indexArray2=new fn,this.programConfigurations=new In(mi,t.layers,t.zoom),this.segments=new Tn,this.segments2=new Tn};Zi.prototype.populate=function(t,e){for(var r=0,n=t;r<n.length;r+=1){var i=n[r],a=i.feature,o=i.index,s=i.sourceLayerIndex;if(this.layers[0]._featureFilter(new Lr(this.zoom),a)){var l=Bn(a);this.addFeature(a,l),e.featureIndex.insert(a,l,o,s,this.index)}}},Zi.prototype.isEmpty=function(){return 0===this.layoutVertexArray.length},Zi.prototype.upload=function(t){this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,mi),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.indexBuffer2=t.createIndexBuffer(this.indexArray2),this.programConfigurations.upload(t)},Zi.prototype.destroy=function(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.indexBuffer2.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.segments2.destroy())},Zi.prototype.addFeature=function(t,e){for(var r=0,n=Yi(e,500);r<n.length;r+=1){for(var i=n[r],a=0,o=0,s=i;o<s.length;o+=1)a+=s[o].length;for(var l=this.segments.prepareSegment(a,this.layoutVertexArray,this.indexArray),c=l.vertexLength,u=[],h=[],f=0,p=i;f<p.length;f+=1){var d=p[f];if(0!==d.length){d!==i[0]&&h.push(u.length/2);var g=this.segments2.prepareSegment(d.length,this.layoutVertexArray,this.indexArray2),m=g.vertexLength;this.layoutVertexArray.emplaceBack(d[0].x,d[0].y),this.indexArray2.emplaceBack(m+d.length-1,m),u.push(d[0].x),u.push(d[0].y);for(var v=1;v<d.length;v++)this.layoutVertexArray.emplaceBack(d[v].x,d[v].y),this.indexArray2.emplaceBack(m+v-1,m+v),u.push(d[v].x),u.push(d[v].y);g.vertexLength+=d.length,g.primitiveLength+=d.length}}for(var y=vi(u,h),x=0;x<y.length;x+=3)this.indexArray.emplaceBack(c+y[x],c+y[x+1],c+y[x+2]);l.vertexLength+=a,l.primitiveLength+=y.length/3}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t)},pr("FillBucket",Zi,{omit:["layers"]});var $i={paint:new qr({"fill-antialias":new Nr(I.paint_fill["fill-antialias"]),"fill-opacity":new jr(I.paint_fill["fill-opacity"]),"fill-color":new jr(I.paint_fill["fill-color"]),"fill-outline-color":new jr(I.paint_fill["fill-outline-color"]),"fill-translate":new Nr(I.paint_fill["fill-translate"]),"fill-translate-anchor":new Nr(I.paint_fill["fill-translate-anchor"]),"fill-pattern":new Vr(I.paint_fill["fill-pattern"])})},Ji=function(t){function e(e){t.call(this,e,$i)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.recalculate=function(t){this.paint=this._transitioningPaint.possiblyEvaluate(t);var e=this.paint._values["fill-outline-color"];"constant"===e.value.kind&&void 0===e.value.value&&(this.paint._values["fill-outline-color"]=this.paint._values["fill-color"])},e.prototype.createBucket=function(t){return new Zi(t)},e.prototype.queryRadius=function(){return Jn(this.paint.get("fill-translate"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,a){return Vn(Kn(t,this.paint.get("fill-translate"),this.paint.get("fill-translate-anchor"),i.angle,a),r)},e}(Hr),Ki=Xr([{name:"a_pos",components:2,type:"Int16"},{name:"a_normal_ed",components:4,type:"Int16"}],4).members,Qi=Math.pow(2,13);function ta(t,e,r,n,i,a,o,s){t.emplaceBack(e,r,2*Math.floor(n*Qi)+o,i*Qi*2,a*Qi*2,Math.round(s))}var ea=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map(function(t){return t.id}),this.index=t.index,this.layoutVertexArray=new Kr,this.indexArray=new hn,this.programConfigurations=new In(Ki,t.layers,t.zoom),this.segments=new Tn};function ra(t,e){return t.x===e.x&&(t.x<0||t.x>Dn)||t.y===e.y&&(t.y<0||t.y>Dn)}function na(t){return t.every(function(t){return t.x<0})||t.every(function(t){return t.x>Dn})||t.every(function(t){return t.y<0})||t.every(function(t){return t.y>Dn})}ea.prototype.populate=function(t,e){for(var r=0,n=t;r<n.length;r+=1){var i=n[r],a=i.feature,o=i.index,s=i.sourceLayerIndex;if(this.layers[0]._featureFilter(new Lr(this.zoom),a)){var l=Bn(a);this.addFeature(a,l),e.featureIndex.insert(a,l,o,s,this.index)}}},ea.prototype.isEmpty=function(){return 0===this.layoutVertexArray.length},ea.prototype.upload=function(t){this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Ki),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.programConfigurations.upload(t)},ea.prototype.destroy=function(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy())},ea.prototype.addFeature=function(t,e){for(var r=0,n=Yi(e,500);r<n.length;r+=1){for(var i=n[r],a=0,o=0,s=i;o<s.length;o+=1)a+=s[o].length;for(var l=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray),c=0,u=i;c<u.length;c+=1){var h=u[c];if(0!==h.length&&!na(h))for(var f=0,p=0;p<h.length;p++){var d=h[p];if(p>=1){var g=h[p-1];if(!ra(d,g)){l.vertexLength+4>Tn.MAX_VERTEX_ARRAY_LENGTH&&(l=this.segments.prepareSegment(4,this.layoutVertexArray,this.indexArray));var m=d.sub(g)._perp()._unit(),v=g.dist(d);f+v>32768&&(f=0),ta(this.layoutVertexArray,d.x,d.y,m.x,m.y,0,0,f),ta(this.layoutVertexArray,d.x,d.y,m.x,m.y,0,1,f),f+=v,ta(this.layoutVertexArray,g.x,g.y,m.x,m.y,0,0,f),ta(this.layoutVertexArray,g.x,g.y,m.x,m.y,0,1,f);var y=l.vertexLength;this.indexArray.emplaceBack(y,y+1,y+2),this.indexArray.emplaceBack(y+1,y+2,y+3),l.vertexLength+=4,l.primitiveLength+=2}}}}l.vertexLength+a>Tn.MAX_VERTEX_ARRAY_LENGTH&&(l=this.segments.prepareSegment(a,this.layoutVertexArray,this.indexArray));for(var x=[],b=[],_=l.vertexLength,w=0,k=i;w<k.length;w+=1){var M=k[w];if(0!==M.length){M!==i[0]&&b.push(x.length/2);for(var A=0;A<M.length;A++){var T=M[A];ta(this.layoutVertexArray,T.x,T.y,0,0,1,1,0),x.push(T.x),x.push(T.y)}}}for(var S=vi(x,b),E=0;E<S.length;E+=3)this.indexArray.emplaceBack(_+S[E],_+S[E+1],_+S[E+2]);l.primitiveLength+=S.length/3,l.vertexLength+=a}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,t)},pr("FillExtrusionBucket",ea,{omit:["layers"]});var ia={paint:new qr({"fill-extrusion-opacity":new Nr(I["paint_fill-extrusion"]["fill-extrusion-opacity"]),"fill-extrusion-color":new jr(I["paint_fill-extrusion"]["fill-extrusion-color"]),"fill-extrusion-translate":new Nr(I["paint_fill-extrusion"]["fill-extrusion-translate"]),"fill-extrusion-translate-anchor":new Nr(I["paint_fill-extrusion"]["fill-extrusion-translate-anchor"]),"fill-extrusion-pattern":new Vr(I["paint_fill-extrusion"]["fill-extrusion-pattern"]),"fill-extrusion-height":new jr(I["paint_fill-extrusion"]["fill-extrusion-height"]),"fill-extrusion-base":new jr(I["paint_fill-extrusion"]["fill-extrusion-base"])})},aa=function(t){function e(e){t.call(this,e,ia)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.createBucket=function(t){return new ea(t)},e.prototype.queryRadius=function(){return Jn(this.paint.get("fill-extrusion-translate"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,a){return Vn(Kn(t,this.paint.get("fill-extrusion-translate"),this.paint.get("fill-extrusion-translate-anchor"),i.angle,a),r)},e.prototype.hasOffscreenPass=function(){return 0!==this.paint.get("fill-extrusion-opacity")&&"none"!==this.visibility},e.prototype.resize=function(){this.viewportFrame&&(this.viewportFrame.destroy(),this.viewportFrame=null)},e}(Hr),oa=Xr([{name:"a_pos_normal",components:4,type:"Int16"},{name:"a_data",components:4,type:"Uint8"}],4).members,sa=la;function la(t,e,r,n,i){this.properties={},this.extent=r,this.type=0,this._pbf=t,this._geometry=-1,this._keys=n,this._values=i,t.readFields(ca,this,e)}function ca(t,e,r){1==t?e.id=r.readVarint():2==t?function(t,e){for(var r=t.readVarint()+t.pos;t.pos<r;){var n=e._keys[t.readVarint()],i=e._values[t.readVarint()];e.properties[n]=i}}(r,e):3==t?e.type=r.readVarint():4==t&&(e._geometry=r.pos)}function ua(t){for(var e,r,n=0,i=0,a=t.length,o=a-1;i<a;o=i++)e=t[i],n+=((r=t[o]).x-e.x)*(e.y+r.y);return n}la.types=["Unknown","Point","LineString","Polygon"],la.prototype.loadGeometry=function(){var t=this._pbf;t.pos=this._geometry;for(var e,r=t.readVarint()+t.pos,n=1,i=0,a=0,o=0,s=[];t.pos<r;){if(i<=0){var c=t.readVarint();n=7&c,i=c>>3}if(i--,1===n||2===n)a+=t.readSVarint(),o+=t.readSVarint(),1===n&&(e&&s.push(e),e=[]),e.push(new l(a,o));else{if(7!==n)throw new Error("unknown command "+n);e&&e.push(e[0].clone())}}return e&&s.push(e),s},la.prototype.bbox=function(){var t=this._pbf;t.pos=this._geometry;for(var e=t.readVarint()+t.pos,r=1,n=0,i=0,a=0,o=1/0,s=-1/0,l=1/0,c=-1/0;t.pos<e;){if(n<=0){var u=t.readVarint();r=7&u,n=u>>3}if(n--,1===r||2===r)(i+=t.readSVarint())<o&&(o=i),i>s&&(s=i),(a+=t.readSVarint())<l&&(l=a),a>c&&(c=a);else if(7!==r)throw new Error("unknown command "+r)}return[o,l,s,c]},la.prototype.toGeoJSON=function(t,e,r){var n,i,a=this.extent*Math.pow(2,r),o=this.extent*t,s=this.extent*e,l=this.loadGeometry(),c=la.types[this.type];function u(t){for(var e=0;e<t.length;e++){var r=t[e],n=180-360*(r.y+s)/a;t[e]=[360*(r.x+o)/a-180,360/Math.PI*Math.atan(Math.exp(n*Math.PI/180))-90]}}switch(this.type){case 1:var h=[];for(n=0;n<l.length;n++)h[n]=l[n][0];u(l=h);break;case 2:for(n=0;n<l.length;n++)u(l[n]);break;case 3:for(l=function(t){var e=t.length;if(e<=1)return[t];for(var r,n,i=[],a=0;a<e;a++){var o=ua(t[a]);0!==o&&(void 0===n&&(n=o<0),n===o<0?(r&&i.push(r),r=[t[a]]):r.push(t[a]))}return r&&i.push(r),i}(l),n=0;n<l.length;n++)for(i=0;i<l[n].length;i++)u(l[n][i])}1===l.length?l=l[0]:c="Multi"+c;var f={type:"Feature",geometry:{type:c,coordinates:l},properties:this.properties};return"id"in this&&(f.id=this.id),f};var ha=fa;function fa(t,e){this.version=1,this.name=null,this.extent=4096,this.length=0,this._pbf=t,this._keys=[],this._values=[],this._features=[],t.readFields(pa,this,e),this.length=this._features.length}function pa(t,e,r){15===t?e.version=r.readVarint():1===t?e.name=r.readString():5===t?e.extent=r.readVarint():2===t?e._features.push(r.pos):3===t?e._keys.push(r.readString()):4===t&&e._values.push(function(t){for(var e=null,r=t.readVarint()+t.pos;t.pos<r;){var n=t.readVarint()>>3;e=1===n?t.readString():2===n?t.readFloat():3===n?t.readDouble():4===n?t.readVarint64():5===n?t.readVarint():6===n?t.readSVarint():7===n?t.readBoolean():null}return e}(r))}function da(t,e,r){if(3===t){var n=new ha(r,r.readVarint()+r.pos);n.length&&(e[n.name]=n)}}fa.prototype.feature=function(t){if(t<0||t>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[t];var e=this._pbf.readVarint()+this._pbf.pos;return new sa(this._pbf,e,this.extent,this._keys,this._values)};var ga={VectorTile:function(t,e){this.layers=t.readFields(da,{},e)},VectorTileFeature:sa,VectorTileLayer:ha},ma=ga.VectorTileFeature.types,va=63,ya=Math.cos(Math.PI/180*37.5),xa=.5,ba=Math.pow(2,14)/xa;function _a(t,e,r,n,i,a,o){t.emplaceBack(e.x,e.y,n?1:0,i?1:-1,Math.round(va*r.x)+128,Math.round(va*r.y)+128,1+(0===a?0:a<0?-1:1)|(o*xa&63)<<2,o*xa>>6)}var wa=function(t){this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map(function(t){return t.id}),this.index=t.index,this.layoutVertexArray=new Qr,this.indexArray=new hn,this.programConfigurations=new In(oa,t.layers,t.zoom),this.segments=new Tn};function ka(t,e){return(t/e.tileTotal*(e.end-e.start)+e.start)*(ba-1)}wa.prototype.populate=function(t,e){for(var r=0,n=t;r<n.length;r+=1){var i=n[r],a=i.feature,o=i.index,s=i.sourceLayerIndex;if(this.layers[0]._featureFilter(new Lr(this.zoom),a)){var l=Bn(a);this.addFeature(a,l),e.featureIndex.insert(a,l,o,s,this.index)}}},wa.prototype.isEmpty=function(){return 0===this.layoutVertexArray.length},wa.prototype.upload=function(t){this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,oa),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.programConfigurations.upload(t)},wa.prototype.destroy=function(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy())},wa.prototype.addFeature=function(t,e){for(var r=this.layers[0].layout,n=r.get("line-join").evaluate(t),i=r.get("line-cap"),a=r.get("line-miter-limit"),o=r.get("line-round-limit"),s=0,l=e;s<l.length;s+=1){var c=l[s];this.addLine(c,t,n,i,a,o)}},wa.prototype.addLine=function(t,e,r,n,i,a){var o=null;e.properties&&e.properties.hasOwnProperty("mapbox_clip_start")&&e.properties.hasOwnProperty("mapbox_clip_end")&&(o={start:e.properties.mapbox_clip_start,end:e.properties.mapbox_clip_end,tileTotal:void 0});for(var s="Polygon"===ma[e.type],l=t.length;l>=2&&t[l-1].equals(t[l-2]);)l--;for(var c=0;c<l-1&&t[c].equals(t[c+1]);)c++;if(!(l<(s?3:2))){o&&(o.tileTotal=function(t,e,r){for(var n,i,a=0,o=c;o<r-1;o++)n=t[o],i=t[o+1],a+=n.dist(i);return a}(t,0,l)),"bevel"===r&&(i=1.05);var u=Dn/(512*this.overscaling)*15,h=t[c],f=this.segments.prepareSegment(10*l,this.layoutVertexArray,this.indexArray);this.distance=0;var p,d,g,m=n,v=s?"butt":n,y=!0,x=void 0,b=void 0,_=void 0,w=void 0;this.e1=this.e2=this.e3=-1,s&&(p=t[l-2],w=h.sub(p)._unit()._perp());for(var k=c;k<l;k++)if(!(b=s&&k===l-1?t[c+1]:t[k+1])||!t[k].equals(b)){w&&(_=w),p&&(x=p),p=t[k],w=b?b.sub(p)._unit()._perp():_;var M=(_=_||w).add(w);0===M.x&&0===M.y||M._unit();var A=M.x*w.x+M.y*w.y,T=0!==A?1/A:1/0,S=A<ya&&x&&b;if(S&&k>c){var E=p.dist(x);if(E>2*u){var C=p.sub(p.sub(x)._mult(u/E)._round());this.distance+=C.dist(x),this.addCurrentVertex(C,this.distance,_.mult(1),0,0,!1,f,o),x=C}}var L=x&&b,z=L?r:b?m:v;if(L&&"round"===z&&(T<a?z="miter":T<=2&&(z="fakeround")),"miter"===z&&T>i&&(z="bevel"),"bevel"===z&&(T>2&&(z="flipbevel"),T<i&&(z="miter")),x&&(this.distance+=p.dist(x)),"miter"===z)M._mult(T),this.addCurrentVertex(p,this.distance,M,0,0,!1,f,o);else if("flipbevel"===z){if(T>100)M=w.clone().mult(-1);else{var P=_.x*w.y-_.y*w.x>0?-1:1,I=T*_.add(w).mag()/_.sub(w).mag();M._perp()._mult(I*P)}this.addCurrentVertex(p,this.distance,M,0,0,!1,f,o),this.addCurrentVertex(p,this.distance,M.mult(-1),0,0,!1,f,o)}else if("bevel"===z||"fakeround"===z){var O=_.x*w.y-_.y*w.x>0,D=-Math.sqrt(T*T-1);if(O?(g=0,d=D):(d=0,g=D),y||this.addCurrentVertex(p,this.distance,_,d,g,!1,f,o),"fakeround"===z){for(var R=Math.floor(8*(.5-(A-.5))),B=void 0,F=0;F<R;F++)B=w.mult((F+1)/(R+1))._add(_)._unit(),this.addPieSliceVertex(p,this.distance,B,O,f,o);this.addPieSliceVertex(p,this.distance,M,O,f,o);for(var N=R-1;N>=0;N--)B=_.mult((N+1)/(R+1))._add(w)._unit(),this.addPieSliceVertex(p,this.distance,B,O,f,o)}b&&this.addCurrentVertex(p,this.distance,w,-d,-g,!1,f,o)}else"butt"===z?(y||this.addCurrentVertex(p,this.distance,_,0,0,!1,f,o),b&&this.addCurrentVertex(p,this.distance,w,0,0,!1,f,o)):"square"===z?(y||(this.addCurrentVertex(p,this.distance,_,1,1,!1,f,o),this.e1=this.e2=-1),b&&this.addCurrentVertex(p,this.distance,w,-1,-1,!1,f,o)):"round"===z&&(y||(this.addCurrentVertex(p,this.distance,_,0,0,!1,f,o),this.addCurrentVertex(p,this.distance,_,1,1,!0,f,o),this.e1=this.e2=-1),b&&(this.addCurrentVertex(p,this.distance,w,-1,-1,!0,f,o),this.addCurrentVertex(p,this.distance,w,0,0,!1,f,o)));if(S&&k<l-1){var j=p.dist(b);if(j>2*u){var V=p.add(b.sub(p)._mult(u/j)._round());this.distance+=V.dist(p),this.addCurrentVertex(V,this.distance,w.mult(1),0,0,!1,f,o),p=V}}y=!1}this.programConfigurations.populatePaintArrays(this.layoutVertexArray.length,e)}},wa.prototype.addCurrentVertex=function(t,e,r,n,i,a,o,s){var l,c=this.layoutVertexArray,u=this.indexArray;s&&(e=ka(e,s)),l=r.clone(),n&&l._sub(r.perp()._mult(n)),_a(c,t,l,a,!1,n,e),this.e3=o.vertexLength++,this.e1>=0&&this.e2>=0&&(u.emplaceBack(this.e1,this.e2,this.e3),o.primitiveLength++),this.e1=this.e2,this.e2=this.e3,l=r.mult(-1),i&&l._sub(r.perp()._mult(i)),_a(c,t,l,a,!0,-i,e),this.e3=o.vertexLength++,this.e1>=0&&this.e2>=0&&(u.emplaceBack(this.e1,this.e2,this.e3),o.primitiveLength++),this.e1=this.e2,this.e2=this.e3,e>ba/2&&!s&&(this.distance=0,this.addCurrentVertex(t,this.distance,r,n,i,a,o))},wa.prototype.addPieSliceVertex=function(t,e,r,n,i,a){r=r.mult(n?-1:1);var o=this.layoutVertexArray,s=this.indexArray;a&&(e=ka(e,a)),_a(o,t,r,!1,n,0,e),this.e3=i.vertexLength++,this.e1>=0&&this.e2>=0&&(s.emplaceBack(this.e1,this.e2,this.e3),i.primitiveLength++),n?this.e2=this.e3:this.e1=this.e3},pr("LineBucket",wa,{omit:["layers"]});var Ma=new qr({"line-cap":new Nr(I.layout_line["line-cap"]),"line-join":new jr(I.layout_line["line-join"]),"line-miter-limit":new Nr(I.layout_line["line-miter-limit"]),"line-round-limit":new Nr(I.layout_line["line-round-limit"])}),Aa={paint:new qr({"line-opacity":new jr(I.paint_line["line-opacity"]),"line-color":new jr(I.paint_line["line-color"]),"line-translate":new Nr(I.paint_line["line-translate"]),"line-translate-anchor":new Nr(I.paint_line["line-translate-anchor"]),"line-width":new jr(I.paint_line["line-width"]),"line-gap-width":new jr(I.paint_line["line-gap-width"]),"line-offset":new jr(I.paint_line["line-offset"]),"line-blur":new jr(I.paint_line["line-blur"]),"line-dasharray":new Vr(I.paint_line["line-dasharray"]),"line-pattern":new Vr(I.paint_line["line-pattern"]),"line-gradient":new Ur(I.paint_line["line-gradient"])}),layout:Ma},Ta=new(function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.possiblyEvaluate=function(e,r){return r=new Lr(Math.floor(r.zoom),{now:r.now,fadeDuration:r.fadeDuration,zoomHistory:r.zoomHistory,transition:r.transition}),t.prototype.possiblyEvaluate.call(this,e,r)},e.prototype.evaluate=function(e,r,n){return r=p({},r,{zoom:Math.floor(r.zoom)}),t.prototype.evaluate.call(this,e,r,n)},e}(jr))(Aa.paint.properties["line-width"].specification);Ta.useIntegerZoom=!0;var Sa=function(t){function e(e){t.call(this,e,Aa)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.setPaintProperty=function(e,r,n){t.prototype.setPaintProperty.call(this,e,r,n),"line-gradient"===e&&this._updateGradient()},e.prototype._updateGradient=function(){var t=this._transitionablePaint._values["line-gradient"].value.expression;this.gradient=fi(t,"lineProgress"),this.gradientTexture=null},e.prototype.recalculate=function(e){t.prototype.recalculate.call(this,e),this.paint._values["line-floorwidth"]=Ta.possiblyEvaluate(this._transitioningPaint._values["line-width"].value,e)},e.prototype.createBucket=function(t){return new wa(t)},e.prototype.queryRadius=function(t){var e=t,r=Ea($n("line-width",this,e),$n("line-gap-width",this,e)),n=$n("line-offset",this,e);return r/2+Math.abs(n)+Jn(this.paint.get("line-translate"))},e.prototype.queryIntersectsFeature=function(t,e,r,n,i,a){var o=Kn(t,this.paint.get("line-translate"),this.paint.get("line-translate-anchor"),i.angle,a),s=a/2*Ea(this.paint.get("line-width").evaluate(e),this.paint.get("line-gap-width").evaluate(e)),c=this.paint.get("line-offset").evaluate(e);return c&&(r=function(t,e){for(var r=[],n=new l(0,0),i=0;i<t.length;i++){for(var a=t[i],o=[],s=0;s<a.length;s++){var c=a[s-1],u=a[s],h=a[s+1],f=0===s?n:u.sub(c)._unit()._perp(),p=s===a.length-1?n:h.sub(u)._unit()._perp(),d=f._add(p)._unit(),g=d.x*p.x+d.y*p.y;d._mult(1/g),o.push(d._mult(e)._add(u))}r.push(o)}return r}(r,c*a)),Un(o,r,s)},e}(Hr);function Ea(t,e){return e>0?e+2*t:t}var Ca=Xr([{name:"a_pos_offset",components:4,type:"Int16"},{name:"a_data",components:4,type:"Uint16"}]),La=Xr([{name:"a_projected_pos",components:3,type:"Float32"}],4),za=(Xr([{name:"a_fade_opacity",components:1,type:"Uint32"}],4),Xr([{name:"a_placed",components:2,type:"Uint8"}],4)),Pa=(Xr([{type:"Int16",name:"anchorPointX"},{type:"Int16",name:"anchorPointY"},{type:"Int16",name:"x1"},{type:"Int16",name:"y1"},{type:"Int16",name:"x2"},{type:"Int16",name:"y2"},{type:"Uint32",name:"featureIndex"},{type:"Uint16",name:"sourceLayerIndex"},{type:"Uint16",name:"bucketIndex"},{type:"Int16",name:"radius"},{type:"Int16",name:"signedDistanceFromAnchor"}]),Xr([{name:"a_pos",components:2,type:"Int16"},{name:"a_anchor_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"}],4)),Ia=Xr([{name:"a_pos",components:2,type:"Int16"},{name:"a_anchor_pos",components:2,type:"Int16"},{name:"a_extrude",components:2,type:"Int16"}],4);function Oa(t,e,r){var n=e.layout.get("text-transform").evaluate(r);return"uppercase"===n?t=t.toLocaleUpperCase():"lowercase"===n&&(t=t.toLocaleLowerCase()),Cr.applyArabicShaping&&(t=Cr.applyArabicShaping(t)),t}Xr([{type:"Int16",name:"anchorX"},{type:"Int16",name:"anchorY"},{type:"Uint16",name:"glyphStartIndex"},{type:"Uint16",name:"numGlyphs"},{type:"Uint32",name:"vertexStartIndex"},{type:"Uint32",name:"lineStartIndex"},{type:"Uint32",name:"lineLength"},{type:"Uint16",name:"segment"},{type:"Uint16",name:"lowerSize"},{type:"Uint16",name:"upperSize"},{type:"Float32",name:"lineOffsetX"},{type:"Float32",name:"lineOffsetY"},{type:"Uint8",name:"writingMode"},{type:"Uint8",name:"hidden"}]),Xr([{type:"Float32",name:"offsetX"}]),Xr([{type:"Int16",name:"x"},{type:"Int16",name:"y"},{type:"Int16",name:"tileUnitDistanceFromAnchor"}]);var Da={"!":"\ufe15","#":"\uff03",$:"\uff04","%":"\uff05","&":"\uff06","(":"\ufe35",")":"\ufe36","*":"\uff0a","+":"\uff0b",",":"\ufe10","-":"\ufe32",".":"\u30fb","/":"\uff0f",":":"\ufe13",";":"\ufe14","<":"\ufe3f","=":"\uff1d",">":"\ufe40","?":"\ufe16","@":"\uff20","[":"\ufe47","\\":"\uff3c","]":"\ufe48","^":"\uff3e",_:"\ufe33","`":"\uff40","{":"\ufe37","|":"\u2015","}":"\ufe38","~":"\uff5e","\xa2":"\uffe0","\xa3":"\uffe1","\xa5":"\uffe5","\xa6":"\uffe4","\xac":"\uffe2","\xaf":"\uffe3","\u2013":"\ufe32","\u2014":"\ufe31","\u2018":"\ufe43","\u2019":"\ufe44","\u201c":"\ufe41","\u201d":"\ufe42","\u2026":"\ufe19","\u2027":"\u30fb","\u20a9":"\uffe6","\u3001":"\ufe11","\u3002":"\ufe12","\u3008":"\ufe3f","\u3009":"\ufe40","\u300a":"\ufe3d","\u300b":"\ufe3e","\u300c":"\ufe41","\u300d":"\ufe42","\u300e":"\ufe43","\u300f":"\ufe44","\u3010":"\ufe3b","\u3011":"\ufe3c","\u3014":"\ufe39","\u3015":"\ufe3a","\u3016":"\ufe17","\u3017":"\ufe18","\uff01":"\ufe15","\uff08":"\ufe35","\uff09":"\ufe36","\uff0c":"\ufe10","\uff0d":"\ufe32","\uff0e":"\u30fb","\uff1a":"\ufe13","\uff1b":"\ufe14","\uff1c":"\ufe3f","\uff1e":"\ufe40","\uff1f":"\ufe16","\uff3b":"\ufe47","\uff3d":"\ufe48","\uff3f":"\ufe33","\uff5b":"\ufe37","\uff5c":"\u2015","\uff5d":"\ufe38","\uff5f":"\ufe35","\uff60":"\ufe36","\uff61":"\ufe12","\uff62":"\ufe41","\uff63":"\ufe42"},Ra=function(t){function e(e,r,n,i){t.call(this,e,r),this.angle=n,void 0!==i&&(this.segment=i)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.clone=function(){return new e(this.x,this.y,this.angle,this.segment)},e}(l);function Ba(t,e){var r=e.expression;if("constant"===r.kind)return{functionType:"constant",layoutSize:r.evaluate(new Lr(t+1))};if("source"===r.kind)return{functionType:"source"};for(var n=r.zoomStops,i=0;i<n.length&&n[i]<=t;)i++;for(var a=i=Math.max(0,i-1);a<n.length&&n[a]<t+1;)a++;a=Math.min(n.length-1,a);var o={min:n[i],max:n[a]};return"composite"===r.kind?{functionType:"composite",zoomRange:o,propertyValue:e.value}:{functionType:"camera",layoutSize:r.evaluate(new Lr(t+1)),zoomRange:o,sizeRange:{min:r.evaluate(new Lr(o.min)),max:r.evaluate(new Lr(o.max))},propertyValue:e.value}}pr("Anchor",Ra);var Fa=ga.VectorTileFeature.types,Na=[{name:"a_fade_opacity",components:1,type:"Uint8",offset:0}];function ja(t,e,r,n,i,a,o,s){t.emplaceBack(e,r,Math.round(32*n),Math.round(32*i),a,o,s?s[0]:0,s?s[1]:0)}function Va(t,e,r){t.emplaceBack(e.x,e.y,r),t.emplaceBack(e.x,e.y,r),t.emplaceBack(e.x,e.y,r),t.emplaceBack(e.x,e.y,r)}var Ua=function(t){this.layoutVertexArray=new tn,this.indexArray=new hn,this.programConfigurations=t,this.segments=new Tn,this.dynamicLayoutVertexArray=new en,this.opacityVertexArray=new rn,this.placedSymbolArray=new yn};Ua.prototype.upload=function(t,e){this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,Ca.members),this.indexBuffer=t.createIndexBuffer(this.indexArray,e),this.programConfigurations.upload(t),this.dynamicLayoutVertexBuffer=t.createVertexBuffer(this.dynamicLayoutVertexArray,La.members,!0),this.opacityVertexBuffer=t.createVertexBuffer(this.opacityVertexArray,Na,!0),this.opacityVertexBuffer.itemSize=1},Ua.prototype.destroy=function(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.programConfigurations.destroy(),this.segments.destroy(),this.dynamicLayoutVertexBuffer.destroy(),this.opacityVertexBuffer.destroy())},pr("SymbolBuffers",Ua);var qa=function(t,e,r){this.layoutVertexArray=new t,this.layoutAttributes=e,this.indexArray=new r,this.segments=new Tn,this.collisionVertexArray=new on};qa.prototype.upload=function(t){this.layoutVertexBuffer=t.createVertexBuffer(this.layoutVertexArray,this.layoutAttributes),this.indexBuffer=t.createIndexBuffer(this.indexArray),this.collisionVertexBuffer=t.createVertexBuffer(this.collisionVertexArray,za.members,!0)},qa.prototype.destroy=function(){this.layoutVertexBuffer&&(this.layoutVertexBuffer.destroy(),this.indexBuffer.destroy(),this.segments.destroy(),this.collisionVertexBuffer.destroy())},pr("CollisionBuffers",qa);var Ha=function(t){this.collisionBoxArray=t.collisionBoxArray,this.zoom=t.zoom,this.overscaling=t.overscaling,this.layers=t.layers,this.layerIds=this.layers.map(function(t){return t.id}),this.index=t.index,this.pixelRatio=t.pixelRatio,this.sourceLayerIndex=t.sourceLayerIndex;var e=this.layers[0]._unevaluatedLayout._values;this.textSizeData=Ba(this.zoom,e["text-size"]),this.iconSizeData=Ba(this.zoom,e["icon-size"]);var r=this.layers[0].layout;this.sortFeaturesByY=r.get("text-allow-overlap")||r.get("icon-allow-overlap")||r.get("text-ignore-placement")||r.get("icon-ignore-placement")};Ha.prototype.createArrays=function(){this.text=new Ua(new In(Ca.members,this.layers,this.zoom,function(t){return/^text/.test(t)})),this.icon=new Ua(new In(Ca.members,this.layers,this.zoom,function(t){return/^icon/.test(t)})),this.collisionBox=new qa(an,Pa.members,fn),this.collisionCircle=new qa(an,Ia.members,hn),this.glyphOffsetArray=new bn,this.lineVertexArray=new wn},Ha.prototype.populate=function(t,e){var r=this.layers[0],n=r.layout,i=n.get("text-font"),a=n.get("text-field"),o=n.get("icon-image"),s=("constant"!==a.value.kind||a.value.value.length>0)&&("constant"!==i.value.kind||i.value.value.length>0),l="constant"!==o.value.kind||o.value.value&&o.value.value.length>0;if(this.features=[],s||l){for(var c=e.iconDependencies,u=e.glyphDependencies,h=new Lr(this.zoom),f=0,p=t;f<p.length;f+=1){var d=p[f],g=d.feature,m=d.index,v=d.sourceLayerIndex;if(r._featureFilter(h,g)){var y=void 0;s&&(y=Oa(y=r.getValueAndResolveTokens("text-field",g),r,g));var x=void 0;if(l&&(x=r.getValueAndResolveTokens("icon-image",g)),y||x){var b={text:y,icon:x,index:m,sourceLayerIndex:v,geometry:Bn(g),properties:g.properties,type:Fa[g.type]};if(void 0!==g.id&&(b.id=g.id),this.features.push(b),x&&(c[x]=!0),y)for(var _=i.evaluate(g).join(","),w=u[_]=u[_]||{},k="map"===n.get("text-rotation-alignment")&&"line"===n.get("symbol-placement"),M=xr(y),A=0;A<y.length;A++)if(w[y.charCodeAt(A)]=!0,k&&M){var T=Da[y.charAt(A)];T&&(w[T.charCodeAt(0)]=!0)}}}}"line"===n.get("symbol-placement")&&(this.features=function(t){var e={},r={},n=[],i=0;function a(e){n.push(t[e]),i++}function o(t,e,i){var a=r[t];return delete r[t],r[e]=a,n[a].geometry[0].pop(),n[a].geometry[0]=n[a].geometry[0].concat(i[0]),a}function s(t,r,i){var a=e[r];return delete e[r],e[t]=a,n[a].geometry[0].shift(),n[a].geometry[0]=i[0].concat(n[a].geometry[0]),a}function l(t,e,r){var n=r?e[0][e[0].length-1]:e[0][0];return t+":"+n.x+":"+n.y}for(var c=0;c<t.length;c++){var u=t[c],h=u.geometry,f=u.text;if(f){var p=l(f,h),d=l(f,h,!0);if(p in r&&d in e&&r[p]!==e[d]){var g=s(p,d,h),m=o(p,d,n[g].geometry);delete e[p],delete r[d],r[l(f,n[m].geometry,!0)]=m,n[g].geometry=null}else p in r?o(p,d,h):d in e?s(p,d,h):(a(c),e[p]=i-1,r[d]=i-1)}else a(c)}return n.filter(function(t){return t.geometry})}(this.features))}},Ha.prototype.isEmpty=function(){return 0===this.symbolInstances.length},Ha.prototype.upload=function(t){this.text.upload(t,this.sortFeaturesByY),this.icon.upload(t,this.sortFeaturesByY),this.collisionBox.upload(t),this.collisionCircle.upload(t)},Ha.prototype.destroy=function(){this.text.destroy(),this.icon.destroy(),this.collisionBox.destroy(),this.collisionCircle.destroy()},Ha.prototype.addToLineVertexArray=function(t,e){var r=this.lineVertexArray.length;if(void 0!==t.segment){for(var n=t.dist(e[t.segment+1]),i=t.dist(e[t.segment]),a={},o=t.segment+1;o<e.length;o++)a[o]={x:e[o].x,y:e[o].y,tileUnitDistanceFromAnchor:n},o<e.length-1&&(n+=e[o+1].dist(e[o]));for(var s=t.segment||0;s>=0;s--)a[s]={x:e[s].x,y:e[s].y,tileUnitDistanceFromAnchor:i},s>0&&(i+=e[s-1].dist(e[s]));for(var l=0;l<e.length;l++){var c=a[l];this.lineVertexArray.emplaceBack(c.x,c.y,c.tileUnitDistanceFromAnchor)}}return{lineStartIndex:r,lineLength:this.lineVertexArray.length-r}},Ha.prototype.addSymbols=function(t,e,r,n,i,a,o,s,l,c){for(var u=t.indexArray,h=t.layoutVertexArray,f=t.dynamicLayoutVertexArray,p=t.segments.prepareSegment(4*e.length,t.layoutVertexArray,t.indexArray),d=this.glyphOffsetArray.length,g=p.vertexLength,m=0,v=e;m<v.length;m+=1){var y=v[m],x=y.tl,b=y.tr,_=y.bl,w=y.br,k=y.tex,M=p.vertexLength,A=y.glyphOffset[1];ja(h,s.x,s.y,x.x,A+x.y,k.x,k.y,r),ja(h,s.x,s.y,b.x,A+b.y,k.x+k.w,k.y,r),ja(h,s.x,s.y,_.x,A+_.y,k.x,k.y+k.h,r),ja(h,s.x,s.y,w.x,A+w.y,k.x+k.w,k.y+k.h,r),Va(f,s,0),u.emplaceBack(M,M+1,M+2),u.emplaceBack(M+1,M+2,M+3),p.vertexLength+=4,p.primitiveLength+=2,this.glyphOffsetArray.emplaceBack(y.glyphOffset[0])}t.placedSymbolArray.emplaceBack(s.x,s.y,d,this.glyphOffsetArray.length-d,g,l,c,s.segment,r?r[0]:0,r?r[1]:0,n[0],n[1],o,!1),t.programConfigurations.populatePaintArrays(t.layoutVertexArray.length,a)},Ha.prototype._addCollisionDebugVertex=function(t,e,r,n,i){return e.emplaceBack(0,0),t.emplaceBack(r.x,r.y,n.x,n.y,Math.round(i.x),Math.round(i.y))},Ha.prototype.addCollisionDebugVertices=function(t,e,r,n,i,a,o,s){var c=i.segments.prepareSegment(4,i.layoutVertexArray,i.indexArray),u=c.vertexLength,h=i.layoutVertexArray,f=i.collisionVertexArray;if(this._addCollisionDebugVertex(h,f,a,o.anchor,new l(t,e)),this._addCollisionDebugVertex(h,f,a,o.anchor,new l(r,e)),this._addCollisionDebugVertex(h,f,a,o.anchor,new l(r,n)),this._addCollisionDebugVertex(h,f,a,o.anchor,new l(t,n)),c.vertexLength+=4,s){var p=i.indexArray;p.emplaceBack(u,u+1,u+2),p.emplaceBack(u,u+2,u+3),c.primitiveLength+=2}else{var d=i.indexArray;d.emplaceBack(u,u+1),d.emplaceBack(u+1,u+2),d.emplaceBack(u+2,u+3),d.emplaceBack(u+3,u),c.primitiveLength+=4}},Ha.prototype.generateCollisionDebugBuffers=function(){for(var t=0,e=this.symbolInstances;t<e.length;t+=1){var r=e[t];r.textCollisionFeature={boxStartIndex:r.textBoxStartIndex,boxEndIndex:r.textBoxEndIndex},r.iconCollisionFeature={boxStartIndex:r.iconBoxStartIndex,boxEndIndex:r.iconBoxEndIndex};for(var n=0;n<2;n++){var i=r[0===n?"textCollisionFeature":"iconCollisionFeature"];if(i)for(var a=i.boxStartIndex;a<i.boxEndIndex;a++){var o=this.collisionBoxArray.get(a),s=o.x1,l=o.y1,c=o.x2,u=o.y2,h=o.radius>0;this.addCollisionDebugVertices(s,l,c,u,h?this.collisionCircle:this.collisionBox,o.anchorPoint,r,h)}}}},Ha.prototype.deserializeCollisionBoxes=function(t,e,r,n,i){for(var a={},o=e;o<r;o++){var s=t.get(o);if(0===s.radius){a.textBox={x1:s.x1,y1:s.y1,x2:s.x2,y2:s.y2,anchorPointX:s.anchorPointX,anchorPointY:s.anchorPointY},a.textFeatureIndex=s.featureIndex;break}a.textCircles||(a.textCircles=[],a.textFeatureIndex=s.featureIndex),a.textCircles.push(s.anchorPointX,s.anchorPointY,s.radius,s.signedDistanceFromAnchor,1)}for(var l=n;l<i;l++){var c=t.get(l);if(0===c.radius){a.iconBox={x1:c.x1,y1:c.y1,x2:c.x2,y2:c.y2,anchorPointX:c.anchorPointX,anchorPointY:c.anchorPointY},a.iconFeatureIndex=c.featureIndex;break}}return a},Ha.prototype.hasTextData=function(){return this.text.segments.get().length>0},Ha.prototype.hasIconData=function(){return this.icon.segments.get().length>0},Ha.prototype.hasCollisionBoxData=function(){return this.collisionBox.segments.get().length>0},Ha.prototype.hasCollisionCircleData=function(){return this.collisionCircle.segments.get().length>0},Ha.prototype.sortFeatures=function(t){var e=this;if(this.sortFeaturesByY&&this.sortedAngle!==t&&(this.sortedAngle=t,!(this.text.segments.get().length>1||this.icon.segments.get().length>1))){for(var r=[],n=0;n<this.symbolInstances.length;n++)r.push(n);var i=Math.sin(t),a=Math.cos(t);r.sort(function(t,r){var n=e.symbolInstances[t],o=e.symbolInstances[r];return(i*n.anchor.x+a*n.anchor.y|0)-(i*o.anchor.x+a*o.anchor.y|0)||o.featureIndex-n.featureIndex}),this.text.indexArray.clear(),this.icon.indexArray.clear(),this.featureSortOrder=[];for(var o=0,s=r;o<s.length;o+=1){var l=s[o],c=e.symbolInstances[l];e.featureSortOrder.push(c.featureIndex);for(var u=0,h=c.placedTextSymbolIndices;u<h.length;u+=1)for(var f=h[u],p=e.text.placedSymbolArray.get(f),d=p.vertexStartIndex+4*p.numGlyphs,g=p.vertexStartIndex;g<d;g+=4)e.text.indexArray.emplaceBack(g,g+1,g+2),e.text.indexArray.emplaceBack(g+1,g+2,g+3);var m=e.icon.placedSymbolArray.get(l);if(m.numGlyphs){var v=m.vertexStartIndex;e.icon.indexArray.emplaceBack(v,v+1,v+2),e.icon.indexArray.emplaceBack(v+1,v+2,v+3)}}this.text.indexBuffer&&this.text.indexBuffer.updateData(this.text.indexArray),this.icon.indexBuffer&&this.icon.indexBuffer.updateData(this.icon.indexArray)}},pr("SymbolBucket",Ha,{omit:["layers","collisionBoxArray","features","compareText"],shallow:["symbolInstances"]}),Ha.MAX_GLYPHS=65535,Ha.addDynamicAttributes=Va;var Ga=new qr({"symbol-placement":new Nr(I.layout_symbol["symbol-placement"]),"symbol-spacing":new Nr(I.layout_symbol["symbol-spacing"]),"symbol-avoid-edges":new Nr(I.layout_symbol["symbol-avoid-edges"]),"icon-allow-overlap":new Nr(I.layout_symbol["icon-allow-overlap"]),"icon-ignore-placement":new Nr(I.layout_symbol["icon-ignore-placement"]),"icon-optional":new Nr(I.layout_symbol["icon-optional"]),"icon-rotation-alignment":new Nr(I.layout_symbol["icon-rotation-alignment"]),"icon-size":new jr(I.layout_symbol["icon-size"]),"icon-text-fit":new Nr(I.layout_symbol["icon-text-fit"]),"icon-text-fit-padding":new Nr(I.layout_symbol["icon-text-fit-padding"]),"icon-image":new jr(I.layout_symbol["icon-image"]),"icon-rotate":new jr(I.layout_symbol["icon-rotate"]),"icon-padding":new Nr(I.layout_symbol["icon-padding"]),"icon-keep-upright":new Nr(I.layout_symbol["icon-keep-upright"]),"icon-offset":new jr(I.layout_symbol["icon-offset"]),"icon-anchor":new jr(I.layout_symbol["icon-anchor"]),"icon-pitch-alignment":new Nr(I.layout_symbol["icon-pitch-alignment"]),"text-pitch-alignment":new Nr(I.layout_symbol["text-pitch-alignment"]),"text-rotation-alignment":new Nr(I.layout_symbol["text-rotation-alignment"]),"text-field":new jr(I.layout_symbol["text-field"]),"text-font":new jr(I.layout_symbol["text-font"]),"text-size":new jr(I.layout_symbol["text-size"]),"text-max-width":new jr(I.layout_symbol["text-max-width"]),"text-line-height":new Nr(I.layout_symbol["text-line-height"]),"text-letter-spacing":new jr(I.layout_symbol["text-letter-spacing"]),"text-justify":new jr(I.layout_symbol["text-justify"]),"text-anchor":new jr(I.layout_symbol["text-anchor"]),"text-max-angle":new Nr(I.layout_symbol["text-max-angle"]),"text-rotate":new jr(I.layout_symbol["text-rotate"]),"text-padding":new Nr(I.layout_symbol["text-padding"]),"text-keep-upright":new Nr(I.layout_symbol["text-keep-upright"]),"text-transform":new jr(I.layout_symbol["text-transform"]),"text-offset":new jr(I.layout_symbol["text-offset"]),"text-allow-overlap":new Nr(I.layout_symbol["text-allow-overlap"]),"text-ignore-placement":new Nr(I.layout_symbol["text-ignore-placement"]),"text-optional":new Nr(I.layout_symbol["text-optional"])}),Wa={paint:new qr({"icon-opacity":new jr(I.paint_symbol["icon-opacity"]),"icon-color":new jr(I.paint_symbol["icon-color"]),"icon-halo-color":new jr(I.paint_symbol["icon-halo-color"]),"icon-halo-width":new jr(I.paint_symbol["icon-halo-width"]),"icon-halo-blur":new jr(I.paint_symbol["icon-halo-blur"]),"icon-translate":new Nr(I.paint_symbol["icon-translate"]),"icon-translate-anchor":new Nr(I.paint_symbol["icon-translate-anchor"]),"text-opacity":new jr(I.paint_symbol["text-opacity"]),"text-color":new jr(I.paint_symbol["text-color"]),"text-halo-color":new jr(I.paint_symbol["text-halo-color"]),"text-halo-width":new jr(I.paint_symbol["text-halo-width"]),"text-halo-blur":new jr(I.paint_symbol["text-halo-blur"]),"text-translate":new Nr(I.paint_symbol["text-translate"]),"text-translate-anchor":new Nr(I.paint_symbol["text-translate-anchor"])}),layout:Ga},Ya=function(t){function e(e){t.call(this,e,Wa)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.recalculate=function(e){t.prototype.recalculate.call(this,e),"auto"===this.layout.get("icon-rotation-alignment")&&("line"===this.layout.get("symbol-placement")?this.layout._values["icon-rotation-alignment"]="map":this.layout._values["icon-rotation-alignment"]="viewport"),"auto"===this.layout.get("text-rotation-alignment")&&("line"===this.layout.get("symbol-placement")?this.layout._values["text-rotation-alignment"]="map":this.layout._values["text-rotation-alignment"]="viewport"),"auto"===this.layout.get("text-pitch-alignment")&&(this.layout._values["text-pitch-alignment"]=this.layout.get("text-rotation-alignment")),"auto"===this.layout.get("icon-pitch-alignment")&&(this.layout._values["icon-pitch-alignment"]=this.layout.get("icon-rotation-alignment"))},e.prototype.getValueAndResolveTokens=function(t,e){var r,n=this.layout.get(t).evaluate(e),i=this._unevaluatedLayout._values[t];return i.isDataDriven()||_e(i.value)?n:(r=e.properties,n.replace(/{([^{}]+)}/g,function(t,e){return e in r?String(r[e]):""}))},e.prototype.createBucket=function(t){return new Ha(t)},e.prototype.queryRadius=function(){return 0},e.prototype.queryIntersectsFeature=function(){return!1},e}(Hr),Xa={paint:new qr({"background-color":new Nr(I.paint_background["background-color"]),"background-pattern":new Vr(I.paint_background["background-pattern"]),"background-opacity":new Nr(I.paint_background["background-opacity"])})},Za=function(t){function e(e){t.call(this,e,Xa)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Hr),$a={paint:new qr({"raster-opacity":new Nr(I.paint_raster["raster-opacity"]),"raster-hue-rotate":new Nr(I.paint_raster["raster-hue-rotate"]),"raster-brightness-min":new Nr(I.paint_raster["raster-brightness-min"]),"raster-brightness-max":new Nr(I.paint_raster["raster-brightness-max"]),"raster-saturation":new Nr(I.paint_raster["raster-saturation"]),"raster-contrast":new Nr(I.paint_raster["raster-contrast"]),"raster-fade-duration":new Nr(I.paint_raster["raster-fade-duration"])})},Ja={circle:ni,heatmap:pi,hillshade:gi,fill:Ji,"fill-extrusion":aa,line:Sa,symbol:Ya,background:Za,raster:function(t){function e(e){t.call(this,e,$a)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e}(Hr)},Ka=i(function(t,e){t.exports=function(){function t(t,e,r){r=r||{},this.w=t||64,this.h=e||64,this.autoResize=!!r.autoResize,this.shelves=[],this.freebins=[],this.stats={},this.bins={},this.maxId=0}function e(t,e,r){this.x=0,this.y=t,this.w=this.free=e,this.h=r}return t.prototype.pack=function(t,e){t=[].concat(t),e=e||{};for(var r,n,i,a,o=[],s=0;s<t.length;s++)if(r=t[s].w||t[s].width,n=t[s].h||t[s].height,i=t[s].id,r&&n){if(!(a=this.packOne(r,n,i)))continue;e.inPlace&&(t[s].x=a.x,t[s].y=a.y,t[s].id=a.id),o.push(a)}return this.shrink(),o},t.prototype.packOne=function(t,r,n){var i,a,o,s,l,c,u,h,f={freebin:-1,shelf:-1,waste:1/0},p=0;if("string"==typeof n||"number"==typeof n){if(i=this.getBin(n))return this.ref(i),i;"number"==typeof n&&(this.maxId=Math.max(n,this.maxId))}else n=++this.maxId;for(s=0;s<this.freebins.length;s++){if(r===(i=this.freebins[s]).maxh&&t===i.maxw)return this.allocFreebin(s,t,r,n);r>i.maxh||t>i.maxw||r<=i.maxh&&t<=i.maxw&&(o=i.maxw*i.maxh-t*r)<f.waste&&(f.waste=o,f.freebin=s)}for(s=0;s<this.shelves.length;s++)if(p+=(a=this.shelves[s]).h,!(t>a.free)){if(r===a.h)return this.allocShelf(s,t,r,n);r>a.h||r<a.h&&(o=(a.h-r)*t)<f.waste&&(f.freebin=-1,f.waste=o,f.shelf=s)}return-1!==f.freebin?this.allocFreebin(f.freebin,t,r,n):-1!==f.shelf?this.allocShelf(f.shelf,t,r,n):r<=this.h-p&&t<=this.w?(a=new e(p,this.w,r),this.allocShelf(this.shelves.push(a)-1,t,r,n)):this.autoResize?(l=c=this.h,((u=h=this.w)<=l||t>u)&&(h=2*Math.max(t,u)),(l<u||r>l)&&(c=2*Math.max(r,l)),this.resize(h,c),this.packOne(t,r,n)):null},t.prototype.allocFreebin=function(t,e,r,n){var i=this.freebins.splice(t,1)[0];return i.id=n,i.w=e,i.h=r,i.refcount=0,this.bins[n]=i,this.ref(i),i},t.prototype.allocShelf=function(t,e,r,n){var i=this.shelves[t].alloc(e,r,n);return this.bins[n]=i,this.ref(i),i},t.prototype.shrink=function(){if(this.shelves.length>0){for(var t=0,e=0,r=0;r<this.shelves.length;r++){var n=this.shelves[r];e+=n.h,t=Math.max(n.w-n.free,t)}this.resize(t,e)}},t.prototype.getBin=function(t){return this.bins[t]},t.prototype.ref=function(t){if(1==++t.refcount){var e=t.h;this.stats[e]=1+(0|this.stats[e])}return t.refcount},t.prototype.unref=function(t){return 0===t.refcount?0:(0==--t.refcount&&(this.stats[t.h]--,delete this.bins[t.id],this.freebins.push(t)),t.refcount)},t.prototype.clear=function(){this.shelves=[],this.freebins=[],this.stats={},this.bins={},this.maxId=0},t.prototype.resize=function(t,e){this.w=t,this.h=e;for(var r=0;r<this.shelves.length;r++)this.shelves[r].resize(t);return!0},e.prototype.alloc=function(t,e,r){if(t>this.free||e>this.h)return null;var n=this.x;return this.x+=t,this.free-=t,new function(t,e,r,n,i,a,o){this.id=t,this.x=e,this.y=r,this.w=n,this.h=i,this.maxw=a||n,this.maxh=o||i,this.refcount=0}(r,n,this.y,t,e,t,this.h)},e.prototype.resize=function(t){return this.free+=t-this.w,this.w=t,!0},t}()}),Qa=function(t,e){var r=e.pixelRatio;this.paddedRect=t,this.pixelRatio=r},to={tl:{configurable:!0},br:{configurable:!0},displaySize:{configurable:!0}};to.tl.get=function(){return[this.paddedRect.x+1,this.paddedRect.y+1]},to.br.get=function(){return[this.paddedRect.x+this.paddedRect.w-1,this.paddedRect.y+this.paddedRect.h-1]},to.displaySize.get=function(){return[(this.paddedRect.w-2)/this.pixelRatio,(this.paddedRect.h-2)/this.pixelRatio]},Object.defineProperties(Qa.prototype,to);var eo=function(t){var e=new ui({width:0,height:0}),r={},n=new Ka(0,0,{autoResize:!0});for(var i in t){var a=t[i],o=n.packOne(a.data.width+2,a.data.height+2);e.resize({width:n.w,height:n.h}),ui.copy(a.data,e,{x:0,y:0},{x:o.x+1,y:o.y+1},a.data),r[i]=new Qa(o,a)}n.shrink(),e.resize({width:n.w,height:n.h}),this.image=e,this.positions=r};pr("ImagePosition",Qa),pr("ImageAtlas",eo);var ro=function(t,e,r,n,i){var a,o,s=8*i-n-1,l=(1<<s)-1,c=l>>1,u=-7,h=r?i-1:0,f=r?-1:1,p=t[e+h];for(h+=f,a=p&(1<<-u)-1,p>>=-u,u+=s;u>0;a=256*a+t[e+h],h+=f,u-=8);for(o=a&(1<<-u)-1,a>>=-u,u+=n;u>0;o=256*o+t[e+h],h+=f,u-=8);if(0===a)a=1-c;else{if(a===l)return o?NaN:1/0*(p?-1:1);o+=Math.pow(2,n),a-=c}return(p?-1:1)*o*Math.pow(2,a-n)},no=function(t,e,r,n,i,a){var o,s,l,c=8*a-i-1,u=(1<<c)-1,h=u>>1,f=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,p=n?0:a-1,d=n?1:-1,g=e<0||0===e&&1/e<0?1:0;for(e=Math.abs(e),isNaN(e)||e===1/0?(s=isNaN(e)?1:0,o=u):(o=Math.floor(Math.log(e)/Math.LN2),e*(l=Math.pow(2,-o))<1&&(o--,l*=2),(e+=o+h>=1?f/l:f*Math.pow(2,1-h))*l>=2&&(o++,l/=2),o+h>=u?(s=0,o=u):o+h>=1?(s=(e*l-1)*Math.pow(2,i),o+=h):(s=e*Math.pow(2,h-1)*Math.pow(2,i),o=0));i>=8;t[r+p]=255&s,p+=d,s/=256,i-=8);for(o=o<<i|s,c+=i;c>0;t[r+p]=255&o,p+=d,o/=256,c-=8);t[r+p-d]|=128*g},io=ao;function ao(t){this.buf=ArrayBuffer.isView&&ArrayBuffer.isView(t)?t:new Uint8Array(t||0),this.pos=0,this.type=0,this.length=this.buf.length}function oo(t){return t.type===ao.Bytes?t.readVarint()+t.pos:t.pos+1}function so(t,e,r){return r?4294967296*e+(t>>>0):4294967296*(e>>>0)+(t>>>0)}function lo(t,e,r){var n=e<=16383?1:e<=2097151?2:e<=268435455?3:Math.ceil(Math.log(e)/(7*Math.LN2));r.realloc(n);for(var i=r.pos-1;i>=t;i--)r.buf[i+n]=r.buf[i]}function co(t,e){for(var r=0;r<t.length;r++)e.writeVarint(t[r])}function uo(t,e){for(var r=0;r<t.length;r++)e.writeSVarint(t[r])}function ho(t,e){for(var r=0;r<t.length;r++)e.writeFloat(t[r])}function fo(t,e){for(var r=0;r<t.length;r++)e.writeDouble(t[r])}function po(t,e){for(var r=0;r<t.length;r++)e.writeBoolean(t[r])}function go(t,e){for(var r=0;r<t.length;r++)e.writeFixed32(t[r])}function mo(t,e){for(var r=0;r<t.length;r++)e.writeSFixed32(t[r])}function vo(t,e){for(var r=0;r<t.length;r++)e.writeFixed64(t[r])}function yo(t,e){for(var r=0;r<t.length;r++)e.writeSFixed64(t[r])}function xo(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16)+16777216*t[e+3]}function bo(t,e,r){t[r]=e,t[r+1]=e>>>8,t[r+2]=e>>>16,t[r+3]=e>>>24}function _o(t,e){return(t[e]|t[e+1]<<8|t[e+2]<<16)+(t[e+3]<<24)}ao.Varint=0,ao.Fixed64=1,ao.Bytes=2,ao.Fixed32=5,ao.prototype={destroy:function(){this.buf=null},readFields:function(t,e,r){for(r=r||this.length;this.pos<r;){var n=this.readVarint(),i=n>>3,a=this.pos;this.type=7&n,t(i,e,this),this.pos===a&&this.skip(n)}return e},readMessage:function(t,e){return this.readFields(t,e,this.readVarint()+this.pos)},readFixed32:function(){var t=xo(this.buf,this.pos);return this.pos+=4,t},readSFixed32:function(){var t=_o(this.buf,this.pos);return this.pos+=4,t},readFixed64:function(){var t=xo(this.buf,this.pos)+4294967296*xo(this.buf,this.pos+4);return this.pos+=8,t},readSFixed64:function(){var t=xo(this.buf,this.pos)+4294967296*_o(this.buf,this.pos+4);return this.pos+=8,t},readFloat:function(){var t=ro(this.buf,this.pos,!0,23,4);return this.pos+=4,t},readDouble:function(){var t=ro(this.buf,this.pos,!0,52,8);return this.pos+=8,t},readVarint:function(t){var e,r,n=this.buf;return e=127&(r=n[this.pos++]),r<128?e:(e|=(127&(r=n[this.pos++]))<<7,r<128?e:(e|=(127&(r=n[this.pos++]))<<14,r<128?e:(e|=(127&(r=n[this.pos++]))<<21,r<128?e:function(t,e,r){var n,i,a=r.buf;if(n=(112&(i=a[r.pos++]))>>4,i<128)return so(t,n,e);if(n|=(127&(i=a[r.pos++]))<<3,i<128)return so(t,n,e);if(n|=(127&(i=a[r.pos++]))<<10,i<128)return so(t,n,e);if(n|=(127&(i=a[r.pos++]))<<17,i<128)return so(t,n,e);if(n|=(127&(i=a[r.pos++]))<<24,i<128)return so(t,n,e);if(n|=(1&(i=a[r.pos++]))<<31,i<128)return so(t,n,e);throw new Error("Expected varint not more than 10 bytes")}(e|=(15&(r=n[this.pos]))<<28,t,this))))},readVarint64:function(){return this.readVarint(!0)},readSVarint:function(){var t=this.readVarint();return t%2==1?(t+1)/-2:t/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var t=this.readVarint()+this.pos,e=function(t,e,r){for(var n="",i=e;i<r;){var a,o,s,l=t[i],c=null,u=l>239?4:l>223?3:l>191?2:1;if(i+u>r)break;1===u?l<128&&(c=l):2===u?128==(192&(a=t[i+1]))&&(c=(31&l)<<6|63&a)<=127&&(c=null):3===u?(a=t[i+1],o=t[i+2],128==(192&a)&&128==(192&o)&&((c=(15&l)<<12|(63&a)<<6|63&o)<=2047||c>=55296&&c<=57343)&&(c=null)):4===u&&(a=t[i+1],o=t[i+2],s=t[i+3],128==(192&a)&&128==(192&o)&&128==(192&s)&&((c=(15&l)<<18|(63&a)<<12|(63&o)<<6|63&s)<=65535||c>=1114112)&&(c=null)),null===c?(c=65533,u=1):c>65535&&(c-=65536,n+=String.fromCharCode(c>>>10&1023|55296),c=56320|1023&c),n+=String.fromCharCode(c),i+=u}return n}(this.buf,this.pos,t);return this.pos=t,e},readBytes:function(){var t=this.readVarint()+this.pos,e=this.buf.subarray(this.pos,t);return this.pos=t,e},readPackedVarint:function(t,e){var r=oo(this);for(t=t||[];this.pos<r;)t.push(this.readVarint(e));return t},readPackedSVarint:function(t){var e=oo(this);for(t=t||[];this.pos<e;)t.push(this.readSVarint());return t},readPackedBoolean:function(t){var e=oo(this);for(t=t||[];this.pos<e;)t.push(this.readBoolean());return t},readPackedFloat:function(t){var e=oo(this);for(t=t||[];this.pos<e;)t.push(this.readFloat());return t},readPackedDouble:function(t){var e=oo(this);for(t=t||[];this.pos<e;)t.push(this.readDouble());return t},readPackedFixed32:function(t){var e=oo(this);for(t=t||[];this.pos<e;)t.push(this.readFixed32());return t},readPackedSFixed32:function(t){var e=oo(this);for(t=t||[];this.pos<e;)t.push(this.readSFixed32());return t},readPackedFixed64:function(t){var e=oo(this);for(t=t||[];this.pos<e;)t.push(this.readFixed64());return t},readPackedSFixed64:function(t){var e=oo(this);for(t=t||[];this.pos<e;)t.push(this.readSFixed64());return t},skip:function(t){var e=7&t;if(e===ao.Varint)for(;this.buf[this.pos++]>127;);else if(e===ao.Bytes)this.pos=this.readVarint()+this.pos;else if(e===ao.Fixed32)this.pos+=4;else{if(e!==ao.Fixed64)throw new Error("Unimplemented type: "+e);this.pos+=8}},writeTag:function(t,e){this.writeVarint(t<<3|e)},realloc:function(t){for(var e=this.length||16;e<this.pos+t;)e*=2;if(e!==this.length){var r=new Uint8Array(e);r.set(this.buf),this.buf=r,this.length=e}},finish:function(){return this.length=this.pos,this.pos=0,this.buf.subarray(0,this.length)},writeFixed32:function(t){this.realloc(4),bo(this.buf,t,this.pos),this.pos+=4},writeSFixed32:function(t){this.realloc(4),bo(this.buf,t,this.pos),this.pos+=4},writeFixed64:function(t){this.realloc(8),bo(this.buf,-1&t,this.pos),bo(this.buf,Math.floor(t*(1/4294967296)),this.pos+4),this.pos+=8},writeSFixed64:function(t){this.realloc(8),bo(this.buf,-1&t,this.pos),bo(this.buf,Math.floor(t*(1/4294967296)),this.pos+4),this.pos+=8},writeVarint:function(t){(t=+t||0)>268435455||t<0?function(t,e){var r,n;if(t>=0?(r=t%4294967296|0,n=t/4294967296|0):(n=~(-t/4294967296),4294967295^(r=~(-t%4294967296))?r=r+1|0:(r=0,n=n+1|0)),t>=0x10000000000000000||t<-0x10000000000000000)throw new Error("Given varint doesn't fit into 10 bytes");e.realloc(10),function(t,e,r){r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos++]=127&t|128,t>>>=7,r.buf[r.pos]=127&t}(r,0,e),function(t,e){var r=(7&t)<<4;e.buf[e.pos++]|=r|((t>>>=3)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t|((t>>>=7)?128:0),t&&(e.buf[e.pos++]=127&t)))))}(n,e)}(t,this):(this.realloc(4),this.buf[this.pos++]=127&t|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=127&(t>>>=7)|(t>127?128:0),t<=127||(this.buf[this.pos++]=t>>>7&127))))},writeSVarint:function(t){this.writeVarint(t<0?2*-t-1:2*t)},writeBoolean:function(t){this.writeVarint(Boolean(t))},writeString:function(t){t=String(t),this.realloc(4*t.length),this.pos++;var e=this.pos;this.pos=function(t,e,r){for(var n,i,a=0;a<e.length;a++){if((n=e.charCodeAt(a))>55295&&n<57344){if(!i){n>56319||a+1===e.length?(t[r++]=239,t[r++]=191,t[r++]=189):i=n;continue}if(n<56320){t[r++]=239,t[r++]=191,t[r++]=189,i=n;continue}n=i-55296<<10|n-56320|65536,i=null}else i&&(t[r++]=239,t[r++]=191,t[r++]=189,i=null);n<128?t[r++]=n:(n<2048?t[r++]=n>>6|192:(n<65536?t[r++]=n>>12|224:(t[r++]=n>>18|240,t[r++]=n>>12&63|128),t[r++]=n>>6&63|128),t[r++]=63&n|128)}return r}(this.buf,t,this.pos);var r=this.pos-e;r>=128&&lo(e,r,this),this.pos=e-1,this.writeVarint(r),this.pos+=r},writeFloat:function(t){this.realloc(4),no(this.buf,t,this.pos,!0,23,4),this.pos+=4},writeDouble:function(t){this.realloc(8),no(this.buf,t,this.pos,!0,52,8),this.pos+=8},writeBytes:function(t){var e=t.length;this.writeVarint(e),this.realloc(e);for(var r=0;r<e;r++)this.buf[this.pos++]=t[r]},writeRawMessage:function(t,e){this.pos++;var r=this.pos;t(e,this);var n=this.pos-r;n>=128&&lo(r,n,this),this.pos=r-1,this.writeVarint(n),this.pos+=n},writeMessage:function(t,e,r){this.writeTag(t,ao.Bytes),this.writeRawMessage(e,r)},writePackedVarint:function(t,e){this.writeMessage(t,co,e)},writePackedSVarint:function(t,e){this.writeMessage(t,uo,e)},writePackedBoolean:function(t,e){this.writeMessage(t,po,e)},writePackedFloat:function(t,e){this.writeMessage(t,ho,e)},writePackedDouble:function(t,e){this.writeMessage(t,fo,e)},writePackedFixed32:function(t,e){this.writeMessage(t,go,e)},writePackedSFixed32:function(t,e){this.writeMessage(t,mo,e)},writePackedFixed64:function(t,e){this.writeMessage(t,vo,e)},writePackedSFixed64:function(t,e){this.writeMessage(t,yo,e)},writeBytesField:function(t,e){this.writeTag(t,ao.Bytes),this.writeBytes(e)},writeFixed32Field:function(t,e){this.writeTag(t,ao.Fixed32),this.writeFixed32(e)},writeSFixed32Field:function(t,e){this.writeTag(t,ao.Fixed32),this.writeSFixed32(e)},writeFixed64Field:function(t,e){this.writeTag(t,ao.Fixed64),this.writeFixed64(e)},writeSFixed64Field:function(t,e){this.writeTag(t,ao.Fixed64),this.writeSFixed64(e)},writeVarintField:function(t,e){this.writeTag(t,ao.Varint),this.writeVarint(e)},writeSVarintField:function(t,e){this.writeTag(t,ao.Varint),this.writeSVarint(e)},writeStringField:function(t,e){this.writeTag(t,ao.Bytes),this.writeString(e)},writeFloatField:function(t,e){this.writeTag(t,ao.Fixed32),this.writeFloat(e)},writeDoubleField:function(t,e){this.writeTag(t,ao.Fixed64),this.writeDouble(e)},writeBooleanField:function(t,e){this.writeVarintField(t,Boolean(e))}};var wo=3;function ko(t,e,r){1===t&&r.readMessage(Mo,e)}function Mo(t,e,r){if(3===t){var n=r.readMessage(Ao,{}),i=n.id,a=n.bitmap,o=n.width,s=n.height,l=n.left,c=n.top,u=n.advance;e.push({id:i,bitmap:new ci({width:o+2*wo,height:s+2*wo},a),metrics:{width:o,height:s,left:l,top:c,advance:u}})}}function Ao(t,e,r){1===t?e.id=r.readVarint():2===t?e.bitmap=r.readBytes():3===t?e.width=r.readVarint():4===t?e.height=r.readVarint():5===t?e.left=r.readSVarint():6===t?e.top=r.readSVarint():7===t&&(e.advance=r.readVarint())}var To=wo,So=function(t,e,r){this.target=t,this.parent=e,this.mapId=r,this.callbacks={},this.callbackID=0,g(["receive"],this),this.target.addEventListener("message",this.receive,!1)};So.prototype.send=function(t,e,r,n){var i=r?this.mapId+":"+this.callbackID++:null;r&&(this.callbacks[i]=r);var a=[];this.target.postMessage({targetMapId:n,sourceMapId:this.mapId,type:t,id:String(i),data:gr(e,a)},a)},So.prototype.receive=function(t){var e,r=this,n=t.data,i=n.id;if(!n.targetMapId||this.mapId===n.targetMapId){var a=function(t,e){var n=[];r.target.postMessage({sourceMapId:r.mapId,type:"<response>",id:String(i),error:t?gr(t):null,data:gr(e,n)},n)};if("<response>"===n.type)e=this.callbacks[n.id],delete this.callbacks[n.id],e&&n.error?e(mr(n.error)):e&&e(null,mr(n.data));else if(void 0!==n.id&&this.parent[n.type])this.parent[n.type](n.sourceMapId,mr(n.data),a);else if(void 0!==n.id&&this.parent.getWorkerSource){var o=n.type.split(".");this.parent.getWorkerSource(n.sourceMapId,o[0],o[1])[o[2]](mr(n.data),a)}else this.parent[n.type](mr(n.data))}},So.prototype.remove=function(){this.target.removeEventListener("message",this.receive,!1)};var Eo=n(i(function(t,e){!function(t){function e(t,e,n){var i=r(256*t,256*(e=Math.pow(2,n)-e-1),n),a=r(256*(t+1),256*(e+1),n);return i[0]+","+i[1]+","+a[0]+","+a[1]}function r(t,e,r){var n=2*Math.PI*6378137/256/Math.pow(2,r);return[t*n-2*Math.PI*6378137/2,e*n-2*Math.PI*6378137/2]}t.getURL=function(t,r,n,i,a,o){return o=o||{},t+"?"+["bbox="+e(n,i,a),"format="+(o.format||"image/png"),"service="+(o.service||"WMS"),"version="+(o.version||"1.1.1"),"request="+(o.request||"GetMap"),"srs="+(o.srs||"EPSG:3857"),"width="+(o.width||256),"height="+(o.height||256),"layers="+r].join("&")},t.getTileBBox=e,t.getMercCoords=r,Object.defineProperty(t,"__esModule",{value:!0})}(e)})),Co=function(t,e,r){this.z=t,this.x=e,this.y=r,this.key=Po(0,t,e,r)};Co.prototype.equals=function(t){return this.z===t.z&&this.x===t.x&&this.y===t.y},Co.prototype.url=function(t,e){var r=Eo.getTileBBox(this.x,this.y,this.z),n=function(t,e,r){for(var n,i="",a=t;a>0;a--)i+=(e&(n=1<<a-1)?1:0)+(r&n?2:0);return i}(this.z,this.x,this.y);return t[(this.x+this.y)%t.length].replace("{prefix}",(this.x%16).toString(16)+(this.y%16).toString(16)).replace("{z}",String(this.z)).replace("{x}",String(this.x)).replace("{y}",String("tms"===e?Math.pow(2,this.z)-this.y-1:this.y)).replace("{quadkey}",n).replace("{bbox-epsg-3857}",r)};var Lo=function(t,e){this.wrap=t,this.canonical=e,this.key=Po(t,e.z,e.x,e.y)},zo=function(t,e,r,n,i){this.overscaledZ=t,this.wrap=e,this.canonical=new Co(r,+n,+i),this.key=Po(e,t,n,i)};function Po(t,e,r,n){(t*=2)<0&&(t=-1*t-1);var i=1<<e;return 32*(i*i*t+i*n+r)+e}zo.prototype.equals=function(t){return this.overscaledZ===t.overscaledZ&&this.wrap===t.wrap&&this.canonical.equals(t.canonical)},zo.prototype.scaledTo=function(t){var e=this.canonical.z-t;return t>this.canonical.z?new zo(t,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y):new zo(t,this.wrap,t,this.canonical.x>>e,this.canonical.y>>e)},zo.prototype.isChildOf=function(t){var e=this.canonical.z-t.canonical.z;return 0===t.overscaledZ||t.overscaledZ<this.overscaledZ&&t.canonical.x===this.canonical.x>>e&&t.canonical.y===this.canonical.y>>e},zo.prototype.children=function(t){if(this.overscaledZ>=t)return[new zo(this.overscaledZ+1,this.wrap,this.canonical.z,this.canonical.x,this.canonical.y)];var e=this.canonical.z+1,r=2*this.canonical.x,n=2*this.canonical.y;return[new zo(e,this.wrap,e,r,n),new zo(e,this.wrap,e,r+1,n),new zo(e,this.wrap,e,r,n+1),new zo(e,this.wrap,e,r+1,n+1)]},zo.prototype.isLessThan=function(t){return this.wrap<t.wrap||!(this.wrap>t.wrap)&&(this.overscaledZ<t.overscaledZ||!(this.overscaledZ>t.overscaledZ)&&(this.canonical.x<t.canonical.x||!(this.canonical.x>t.canonical.x)&&this.canonical.y<t.canonical.y))},zo.prototype.wrapped=function(){return new zo(this.overscaledZ,0,this.canonical.z,this.canonical.x,this.canonical.y)},zo.prototype.unwrapTo=function(t){return new zo(this.overscaledZ,t,this.canonical.z,this.canonical.x,this.canonical.y)},zo.prototype.overscaleFactor=function(){return Math.pow(2,this.overscaledZ-this.canonical.z)},zo.prototype.toUnwrapped=function(){return new Lo(this.wrap,this.canonical)},zo.prototype.toString=function(){return this.overscaledZ+"/"+this.canonical.x+"/"+this.canonical.y},zo.prototype.toCoordinate=function(){return new s(this.canonical.x+Math.pow(2,this.wrap),this.canonical.y,this.canonical.z)},pr("CanonicalTileID",Co),pr("OverscaledTileID",zo,{omit:["posMatrix"]});var Io=function(t,e,r){if(t<=0)throw new RangeError("Level must have positive dimension");this.dim=t,this.border=e,this.stride=this.dim+2*this.border,this.data=r||new Int32Array((this.dim+2*this.border)*(this.dim+2*this.border))};Io.prototype.set=function(t,e,r){this.data[this._idx(t,e)]=r+65536},Io.prototype.get=function(t,e){return this.data[this._idx(t,e)]-65536},Io.prototype._idx=function(t,e){if(t<-this.border||t>=this.dim+this.border||e<-this.border||e>=this.dim+this.border)throw new RangeError("out of range source coordinates for DEM data");return(e+this.border)*this.stride+(t+this.border)},pr("Level",Io);var Oo=function(t,e,r){this.uid=t,this.scale=e||1,this.level=r||new Io(256,512),this.loaded=!!r};Oo.prototype.loadFromImage=function(t,e){if(t.height!==t.width)throw new RangeError("DEM tiles must be square");if(e&&"mapbox"!==e&&"terrarium"!==e)return _('"'+e+'" is not a valid encoding type. Valid types include "mapbox" and "terrarium".');var r=this.level=new Io(t.width,t.width/2),n=t.data;this._unpackData(r,n,e||"mapbox");for(var i=0;i<r.dim;i++)r.set(-1,i,r.get(0,i)),r.set(r.dim,i,r.get(r.dim-1,i)),r.set(i,-1,r.get(i,0)),r.set(i,r.dim,r.get(i,r.dim-1));r.set(-1,-1,r.get(0,0)),r.set(r.dim,-1,r.get(r.dim-1,0)),r.set(-1,r.dim,r.get(0,r.dim-1)),r.set(r.dim,r.dim,r.get(r.dim-1,r.dim-1)),this.loaded=!0},Oo.prototype._unpackMapbox=function(t,e,r){return(256*t*256+256*e+r)/10-1e4},Oo.prototype._unpackTerrarium=function(t,e,r){return 256*t+e+r/256-32768},Oo.prototype._unpackData=function(t,e,r){for(var n={mapbox:this._unpackMapbox,terrarium:this._unpackTerrarium}[r],i=0;i<t.dim;i++)for(var a=0;a<t.dim;a++){var o=4*(i*t.dim+a);t.set(a,i,this.scale*n(e[o],e[o+1],e[o+2]))}},Oo.prototype.getPixels=function(){return new ui({width:this.level.dim+2*this.level.border,height:this.level.dim+2*this.level.border},new Uint8Array(this.level.data.buffer))},Oo.prototype.backfillBorder=function(t,e,r){var n=this.level,i=t.level;if(n.dim!==i.dim)throw new Error("level mismatch (dem dimension)");var a=e*n.dim,o=e*n.dim+n.dim,s=r*n.dim,l=r*n.dim+n.dim;switch(e){case-1:a=o-1;break;case 1:o=a+1}switch(r){case-1:s=l-1;break;case 1:l=s+1}for(var c=f(a,-n.border,n.dim+n.border),u=f(o,-n.border,n.dim+n.border),h=f(s,-n.border,n.dim+n.border),p=f(l,-n.border,n.dim+n.border),d=-e*n.dim,g=-r*n.dim,m=h;m<p;m++)for(var v=c;v<u;v++)n.set(v,m,i.get(v+d,m+g))},pr("DEMData",Oo);var Do=function(t){this._stringToNumber={},this._numberToString=[];for(var e=0;e<t.length;e++){var r=t[e];this._stringToNumber[r]=e,this._numberToString[e]=r}};Do.prototype.encode=function(t){return this._stringToNumber[t]},Do.prototype.decode=function(t){return this._numberToString[t]};var Ro=function(t,e,r,n){this.type="Feature",this._vectorTileFeature=t,t._z=e,t._x=r,t._y=n,this.properties=t.properties,null!=t.id&&(this.id=t.id)},Bo={geometry:{configurable:!0}};Bo.geometry.get=function(){return void 0===this._geometry&&(this._geometry=this._vectorTileFeature.toGeoJSON(this._vectorTileFeature._x,this._vectorTileFeature._y,this._vectorTileFeature._z).geometry),this._geometry},Bo.geometry.set=function(t){this._geometry=t},Ro.prototype.toJSON=function(){var t={geometry:this.geometry};for(var e in this)"_geometry"!==e&&"_vectorTileFeature"!==e&&(t[e]=this[e]);return t},Object.defineProperties(Ro.prototype,Bo);var Fo=function(t,e,r){this.tileID=t,this.x=t.canonical.x,this.y=t.canonical.y,this.z=t.canonical.z,this.grid=e||new lr(Dn,16,0),this.featureIndexArray=r||new Mn};function No(t,e){return e-t}Fo.prototype.insert=function(t,e,r,n,i){var a=this.featureIndexArray.length;this.featureIndexArray.emplaceBack(r,n,i);for(var o=0;o<e.length;o++){for(var s=e[o],l=[1/0,1/0,-1/0,-1/0],c=0;c<s.length;c++){var u=s[c];l[0]=Math.min(l[0],u.x),l[1]=Math.min(l[1],u.y),l[2]=Math.max(l[2],u.x),l[3]=Math.max(l[3],u.y)}l[0]<Dn&&l[1]<Dn&&l[2]>=0&&l[3]>=0&&this.grid.insert(a,l[0],l[1],l[2],l[3])}},Fo.prototype.loadVTLayers=function(){return this.vtLayers||(this.vtLayers=new ga.VectorTile(new io(this.rawTileData)).layers,this.sourceLayerCoder=new Do(this.vtLayers?Object.keys(this.vtLayers).sort():["_geojsonTileLayer"])),this.vtLayers},Fo.prototype.query=function(t,e){var r=this;this.loadVTLayers();for(var n=t.params||{},i=Dn/t.tileSize/t.scale,a=Re(n.filter),o=t.queryGeometry,s=t.queryPadding*i,l=1/0,c=1/0,u=-1/0,h=-1/0,f=0;f<o.length;f++)for(var p=o[f],d=0;d<p.length;d++){var g=p[d];l=Math.min(l,g.x),c=Math.min(c,g.y),u=Math.max(u,g.x),h=Math.max(h,g.y)}var m=this.grid.query(l-s,c-s,u+s,h+s);m.sort(No);for(var v,y={},x=function(s){var l=m[s];if(l!==v){v=l;var c=r.featureIndexArray.get(l),u=null;r.loadMatchingFeature(y,c.bucketIndex,c.sourceLayerIndex,c.featureIndex,a,n.layers,e,function(e,n){return u||(u=Bn(e)),n.queryIntersectsFeature(o,e,u,r.z,t.transform,i,t.posMatrix)})}},b=0;b<m.length;b++)x(b);return y},Fo.prototype.loadMatchingFeature=function(t,e,r,n,i,a,o,s){var l=this.bucketLayerIDs[e];if(!a||function(t,e){for(var r=0;r<t.length;r++)if(e.indexOf(t[r])>=0)return!0;return!1}(a,l)){var c=this.sourceLayerCoder.decode(r),u=this.vtLayers[c].feature(n);if(i(new Lr(this.tileID.overscaledZ),u))for(var h=0;h<l.length;h++){var f=l[h];if(!(a&&a.indexOf(f)<0)){var p=o[f];if(p&&(!s||s(u,p))){var d=new Ro(u,this.z,this.x,this.y);d.layer=p.serialize();var g=t[f];void 0===g&&(g=t[f]=[]),g.push({featureIndex:n,feature:d})}}}}},Fo.prototype.lookupSymbolFeatures=function(t,e,r,n,i,a){var o={};this.loadVTLayers();for(var s=Re(n),l=0,c=t;l<c.length;l+=1){var u=c[l];this.loadMatchingFeature(o,e,r,u,s,i,a)}return o},Fo.prototype.hasLayer=function(t){for(var e=0,r=this.bucketLayerIDs;e<r.length;e+=1)for(var n=0,i=r[e];n<i.length;n+=1)if(t===i[n])return!0;return!1},pr("FeatureIndex",Fo,{omit:["rawTileData","sourceLayerCoder"]});var jo={horizontal:1,vertical:2,horizontalOnly:3},Vo={9:!0,10:!0,11:!0,12:!0,13:!0,32:!0},Uo={};function qo(t,e,r,n){var i=Math.pow(t-e,2);return n?t<e?i/2:2*i:i+Math.abs(r)*r}function Ho(t,e){var r=0;return 10===t&&(r-=1e4),40!==t&&65288!==t||(r+=50),41!==e&&65289!==e||(r+=50),r}function Go(t,e,r,n,i,a){for(var o=null,s=qo(e,r,i,a),l=0,c=n;l<c.length;l+=1){var u=c[l],h=qo(e-u.x,r,i,a)+u.badness;h<=s&&(o=u,s=h)}return{index:t,x:e,priorBreak:o,badness:s}}function Wo(t,e,r,n){if(!r)return[];if(!t)return[];for(var i,a=[],o=function(t,e,r,n){for(var i=0,a=0;a<t.length;a++){var o=n[t.charCodeAt(a)];o&&(i+=o.metrics.advance+e)}return i/Math.max(1,Math.ceil(i/r))}(t,e,r,n),s=0,l=0;l<t.length;l++){var c=t.charCodeAt(l),u=n[c];u&&!Vo[c]&&(s+=u.metrics.advance+e),l<t.length-1&&(Uo[c]||!((i=c)<11904)&&(yr["Bopomofo Extended"](i)||yr.Bopomofo(i)||yr["CJK Compatibility Forms"](i)||yr["CJK Compatibility Ideographs"](i)||yr["CJK Compatibility"](i)||yr["CJK Radicals Supplement"](i)||yr["CJK Strokes"](i)||yr["CJK Symbols and Punctuation"](i)||yr["CJK Unified Ideographs Extension A"](i)||yr["CJK Unified Ideographs"](i)||yr["Enclosed CJK Letters and Months"](i)||yr["Halfwidth and Fullwidth Forms"](i)||yr.Hiragana(i)||yr["Ideographic Description Characters"](i)||yr["Kangxi Radicals"](i)||yr["Katakana Phonetic Extensions"](i)||yr.Katakana(i)||yr["Vertical Forms"](i)||yr["Yi Radicals"](i)||yr["Yi Syllables"](i)))&&a.push(Go(l+1,s,o,a,Ho(c,t.charCodeAt(l+1)),!1))}return function t(e){return e?t(e.priorBreak).concat(e.index):[]}(Go(t.length,s,o,a,0,!0))}function Yo(t){var e=.5,r=.5;switch(t){case"right":case"top-right":case"bottom-right":e=1;break;case"left":case"top-left":case"bottom-left":e=0}switch(t){case"bottom":case"bottom-right":case"bottom-left":r=1;break;case"top":case"top-right":case"top-left":r=0}return{horizontalAlign:e,verticalAlign:r}}function Xo(t,e,r,n,i){if(i){var a=e[t[n].glyph];if(a)for(var o=a.metrics.advance,s=(t[n].x+o)*i,l=r;l<=n;l++)t[l].x-=s}}Uo[10]=!0,Uo[32]=!0,Uo[38]=!0,Uo[40]=!0,Uo[41]=!0,Uo[43]=!0,Uo[45]=!0,Uo[47]=!0,Uo[173]=!0,Uo[183]=!0,Uo[8203]=!0,Uo[8208]=!0,Uo[8211]=!0,Uo[8231]=!0,e.commonjsGlobal=r,e.unwrapExports=n,e.createCommonjsModule=i,e.default=self,e.default$1=l,e.getJSON=function(t,e){var r=T(t);return r.setRequestHeader("Accept","application/json"),r.onerror=function(){e(new Error(r.statusText))},r.onload=function(){if(r.status>=200&&r.status<300&&r.response){var n;try{n=JSON.parse(r.response)}catch(t){return e(t)}e(null,n)}else 401===r.status&&t.url.match(/mapbox.com/)?e(new A(r.statusText+": you may have provided an invalid Mapbox access token. See https://www.mapbox.com/api-documentation/#access-tokens",r.status,t.url)):e(new A(r.statusText,r.status,t.url))},r.send(),r},e.getImage=function(t,e){return S(t,function(t,r){if(t)e(t);else if(r){var n=new self.Image,i=self.URL||self.webkitURL;n.onload=function(){e(null,n),i.revokeObjectURL(n.src)};var a=new self.Blob([new Uint8Array(r.data)],{type:"image/png"});n.cacheControl=r.cacheControl,n.expires=r.expires,n.src=r.data.byteLength?i.createObjectURL(a):"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAAC0lEQVQYV2NgAAIAAAUAAarVyFEAAAAASUVORK5CYII="}})},e.ResourceType=M,e.RGBAImage=ui,e.default$2=Ka,e.ImagePosition=Qa,e.getArrayBuffer=S,e.default$3=function(t){return new io(t).readFields(ko,[])},e.default$4=yr,e.asyncAll=function(t,e,r){if(!t.length)return r(null,[]);var n=t.length,i=new Array(t.length),a=null;t.forEach(function(t,o){e(t,function(t,e){t&&(a=t),i[o]=e,0==--n&&r(a,i)})})},e.AlphaImage=ci,e.default$5=I,e.endsWith=m,e.extend=p,e.sphericalToCartesian=function(t){var e=t[0],r=t[1],n=t[2];return r+=90,r*=Math.PI/180,n*=Math.PI/180,{x:e*Math.cos(r)*Math.sin(n),y:e*Math.sin(r)*Math.sin(n),z:e*Math.cos(n)}},e.Evented=P,e.validateStyle=nr,e.validateLight=ir,e.emitValidationErrors=sr,e.default$6=tt,e.number=wt,e.Properties=qr,e.Transitionable=Ir,e.Transitioning=Dr,e.PossiblyEvaluated=Fr,e.DataConstantProperty=Nr,e.warnOnce=_,e.uniqueId=function(){return d++},e.default$7=So,e.pick=function(t,e){for(var r={},n=0;n<e.length;n++){var i=e[n];i in t&&(r[i]=t[i])}return r},e.wrap=function(t,e,r){var n=r-e,i=((t-e)%n+n)%n+e;return i===e?r:i},e.clamp=f,e.Event=L,e.ErrorEvent=z,e.OverscaledTileID=zo,e.default$8=Dn,e.createLayout=Xr,e.getCoordinatesCenter=function(t){for(var e=1/0,r=1/0,n=-1/0,i=-1/0,a=0;a<t.length;a++)e=Math.min(e,t[a].column),r=Math.min(r,t[a].row),n=Math.max(n,t[a].column),i=Math.max(i,t[a].row);var o=n-e,l=i-r,c=Math.max(o,l),u=Math.max(0,Math.floor(-Math.log(c)/Math.LN2));return new s((e+n)/2,(r+i)/2,0).zoomTo(u)},e.CanonicalTileID=Co,e.RasterBoundsArray=Jr,e.getVideo=function(t,e){var r,n,i=self.document.createElement("video");i.onloadstart=function(){e(null,i)};for(var a=0;a<t.length;a++){var o=self.document.createElement("source");r=t[a],n=void 0,(n=self.document.createElement("a")).href=r,(n.protocol!==self.document.location.protocol||n.host!==self.document.location.host)&&(i.crossOrigin="Anonymous"),o.src=t[a],i.appendChild(o)}return i},e.default$9=O,e.bindAll=g,e.default$10=function t(e,r){if(Array.isArray(e)){if(!Array.isArray(r)||e.length!==r.length)return!1;for(var n=0;n<e.length;n++)if(!t(e[n],r[n]))return!1;return!0}if("object"==typeof e&&null!==e&&null!==r){if("object"!=typeof r)return!1;if(Object.keys(e).length!==Object.keys(r).length)return!1;for(var i in e)if(!t(e[i],r[i]))return!1;return!0}return e===r},e.parseCacheControl=function(t){var e={};if(t.replace(/(?:^|(?:\s*\,\s*))([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)(?:\=(?:([^\x00-\x20\(\)<>@\,;\:\\"\/\[\]\?\=\{\}\x7F]+)|(?:\"((?:[^"\\]|\\.)*)\")))?/g,function(t,r,n,i){var a=n||i;return e[r]=!a||a.toLowerCase(),""}),e["max-age"]){var r=parseInt(e["max-age"],10);isNaN(r)?delete e["max-age"]:e["max-age"]=r}return e},e.default$11=Fo,e.default$12=Ro,e.default$13=Re,e.default$14=Ha,e.CollisionBoxArray=mn,e.default$15=Tn,e.TriangleIndexArray=hn,e.default$16=Lr,e.default$17=s,e.keysDifference=function(t,e){var r=[];for(var n in t)n in e||r.push(n);return r},e.default$18=["type","source","source-layer","minzoom","maxzoom","filter","layout"],e.mat4=ri,e.vec4=ei,e.getSizeData=Ba,e.evaluateSizeForFeature=function(t,e,r){var n=e;return"source"===t.functionType?r.lowerSize/10:"composite"===t.functionType?wt(r.lowerSize/10,r.upperSize/10,n.uSizeT):n.uSize},e.evaluateSizeForZoom=function(t,e,r){if("constant"===t.functionType)return{uSizeT:0,uSize:t.layoutSize};if("source"===t.functionType)return{uSizeT:0,uSize:0};if("camera"===t.functionType){var n=t.propertyValue,i=t.zoomRange,a=t.sizeRange,o=f(Se(n,r.specification).interpolationFactor(e,i.min,i.max),0,1);return{uSizeT:0,uSize:a.min+o*(a.max-a.min)}}var s=t.propertyValue,l=t.zoomRange;return{uSizeT:f(Se(s,r.specification).interpolationFactor(e,l.min,l.max),0,1),uSize:0}},e.addDynamicAttributes=Va,e.default$19=Wa,e.WritingMode=jo,e.multiPolygonIntersectsBufferedPoint=jn,e.multiPolygonIntersectsMultiPolygon=Vn,e.multiPolygonIntersectsBufferedMultiLine=Un,e.polygonIntersectsPolygon=function(t,e){for(var r=0;r<t.length;r++)if(Zn(e,t[r]))return!0;for(var n=0;n<e.length;n++)if(Zn(t,e[n]))return!0;return!!Hn(t,e)},e.distToSegmentSquared=Yn,e.default$20=ti,e.default$21=Hr,e.default$22=function(t){return new Ja[t.type](t)},e.clone=x,e.filterObject=y,e.mapObject=v,e.registerForPluginAvailability=function(t){return Tr?t({pluginURL:Tr,completionCallback:Mr}):Er.once("pluginAvailable",t),t},e.evented=Er,e.default$23=vr,e.default$24=Pn,e.PosArray=$r,e.UnwrappedTileID=Lo,e.ease=h,e.bezier=u,e.setRTLTextPlugin=function(t,e){if(Ar)throw new Error("setRTLTextPlugin cannot be called multiple times.");Ar=!0,Tr=t,Mr=function(t){t?(Ar=!1,Tr=null,e&&e(t)):Sr=!0},Er.fire(new L("pluginAvailable",{pluginURL:Tr,completionCallback:Mr}))},e.values=function(t){var e=[];for(var r in t)e.push(t[r]);return e},e.default$25=Ra,e.register=pr,e.GLYPH_PBF_BORDER=To,e.shapeText=function(t,e,r,n,i,a,o,s,l,c){var u=t.trim();c===jo.vertical&&(u=function(t){for(var e="",r=0;r<t.length;r++){var n=t.charCodeAt(r+1)||null,i=t.charCodeAt(r-1)||null;n&&wr(n)&&!Da[t[r+1]]||i&&wr(i)&&!Da[t[r-1]]||!Da[t[r]]?e+=t[r]:e+=Da[t[r]]}return e}(u));var h=[],f={positionedGlyphs:h,text:u,top:s[1],bottom:s[1],left:s[0],right:s[0],writingMode:c},p=Cr.processBidirectionalText;return function(t,e,r,n,i,a,o,s,l){for(var c=0,u=-17,h=0,f=t.positionedGlyphs,p="right"===a?1:"left"===a?0:.5,d=0,g=r;d<g.length;d+=1){var m=g[d];if((m=m.trim()).length){for(var v=f.length,y=0;y<m.length;y++){var x=m.charCodeAt(y),b=e[x];b&&(_r(x)&&o!==jo.horizontal?(f.push({glyph:x,x:c,y:0,vertical:!0}),c+=l+s):(f.push({glyph:x,x:c,y:u,vertical:!1}),c+=b.metrics.advance+s))}if(f.length!==v){var _=c-s;h=Math.max(_,h),Xo(f,e,v,f.length-1,p)}c=0,u+=n}else u+=n}var w=Yo(i),k=w.horizontalAlign,M=w.verticalAlign;!function(t,e,r,n,i,a,o){for(var s=(e-r)*i,l=(-n*o+.5)*a,c=0;c<t.length;c++)t[c].x+=s,t[c].y+=l}(f,p,k,M,h,n,r.length);var A=r.length*n;t.top+=-M*A,t.bottom=t.top+A,t.left+=-k*h,t.right=t.left+h}(f,e,p?p(u,Wo(u,o,r,e)):function(t,e){for(var r=[],n=0,i=0,a=e;i<a.length;i+=1){var o=a[i];r.push(t.substring(n,o)),n=o}return n<t.length&&r.push(t.substring(n,t.length)),r}(u,Wo(u,o,r,e)),n,i,a,c,o,l),!!h.length&&f},e.shapeIcon=function(t,e,r){var n=Yo(r),i=n.horizontalAlign,a=n.verticalAlign,o=e[0],s=e[1],l=o-t.displaySize[0]*i,c=l+t.displaySize[0],u=s-t.displaySize[1]*a;return{image:t,top:u,bottom:u+t.displaySize[1],left:l,right:c}},e.allowsVerticalWritingMode=xr,e.allowsLetterSpacing=function(t){for(var e=0,r=t;e<r.length;e+=1)if(!br(r[e].charCodeAt(0)))return!1;return!0},e.default$26=Yi,e.default$27=Do,e.default$28=eo,e.default$29=ga,e.default$30=io,e.default$31=Oo,e.__moduleExports=ga,e.default$32=l,e.__moduleExports$1=io,e.plugin=Cr}),i(0,function(t){function e(t){var r=typeof t;if("number"===r||"boolean"===r||"string"===r||null==t)return JSON.stringify(t);if(Array.isArray(t)){for(var n="[",i=0,a=t;i<a.length;i+=1)n+=e(a[i])+",";return n+"]"}for(var o=Object.keys(t).sort(),s="{",l=0;l<o.length;l++)s+=JSON.stringify(o[l])+":"+e(t[o[l]])+",";return s+"}"}function r(r){for(var n="",i=0,a=t.default$18;i<a.length;i+=1)n+="/"+e(r[a[i]]);return n}var n=function(t){t&&this.replace(t)};function i(t,e,r,n,i){if(void 0===e.segment)return!0;for(var a=e,o=e.segment+1,s=0;s>-r/2;){if(--o<0)return!1;s-=t[o].dist(a),a=t[o]}s+=t[o].dist(t[o+1]),o++;for(var l=[],c=0;s<r/2;){var u=t[o-1],h=t[o],f=t[o+1];if(!f)return!1;var p=u.angleTo(h)-h.angleTo(f);for(p=Math.abs((p+3*Math.PI)%(2*Math.PI)-Math.PI),l.push({distance:s,angleDelta:p}),c+=p;s-l[0].distance>n;)c-=l.shift().angleDelta;if(c>i)return!1;o++,s+=h.dist(f)}return!0}function a(e,r,n,a,o,s,l,c,u){var h=a?.6*s*l:0,f=Math.max(a?a.right-a.left:0,o?o.right-o.left:0),p=0===e[0].x||e[0].x===u||0===e[0].y||e[0].y===u;return r-f*l<r/4&&(r=f*l+r/4),function e(r,n,a,o,s,l,c,u,h){for(var f=l/2,p=0,d=0;d<r.length-1;d++)p+=r[d].dist(r[d+1]);for(var g=0,m=n-a,v=[],y=0;y<r.length-1;y++){for(var x=r[y],b=r[y+1],_=x.dist(b),w=b.angleTo(x);m+a<g+_;){var k=((m+=a)-g)/_,M=t.number(x.x,b.x,k),A=t.number(x.y,b.y,k);if(M>=0&&M<h&&A>=0&&A<h&&m-f>=0&&m+f<=p){var T=new t.default$25(M,A,w,y);T._round(),o&&!i(r,T,l,o,s)||v.push(T)}}g+=_}return u||v.length||c||(v=e(r,g/2,a,o,s,l,c,!0,h)),v}(e,p?r/2*c%r:(f/2+2*s)*l*c%r,r,h,n,f*l,p,!1,u)}n.prototype.replace=function(t){this._layerConfigs={},this._layers={},this.update(t,[])},n.prototype.update=function(e,n){for(var i=this,a=0,o=e;a<o.length;a+=1){var s=o[a];i._layerConfigs[s.id]=s;var l=i._layers[s.id]=t.default$22(s);l._featureFilter=t.default$13(l.filter)}for(var c=0,u=n;c<u.length;c+=1){var h=u[c];delete i._layerConfigs[h],delete i._layers[h]}this.familiesBySource={};for(var f=0,p=function(t){for(var e={},n=0;n<t.length;n++){var i=r(t[n]),a=e[i];a||(a=e[i]=[]),a.push(t[n])}var o=[];for(var s in e)o.push(e[s]);return o}(t.values(this._layerConfigs));f<p.length;f+=1){var d=p[f].map(function(t){return i._layers[t.id]}),g=d[0];if("none"!==g.visibility){var m=g.source||"",v=i.familiesBySource[m];v||(v=i.familiesBySource[m]={});var y=g.sourceLayer||"_geojsonTileLayer",x=v[y];x||(x=v[y]=[]),x.push(d)}}};var o=function(){this.opacity=0,this.targetOpacity=0,this.time=0};o.prototype.clone=function(){var t=new o;return t.opacity=this.opacity,t.targetOpacity=this.targetOpacity,t.time=this.time,t},t.register("OpacityState",o);var s=function(t,e,r,n,i,a,o,s,l,c,u){var h=o.top*s-l,f=o.bottom*s+l,p=o.left*s-l,d=o.right*s+l;if(this.boxStartIndex=t.length,c){var g=f-h,m=d-p;g>0&&(g=Math.max(10*s,g),this._addLineCollisionCircles(t,e,r,r.segment,m,g,n,i,a,u))}else t.emplaceBack(r.x,r.y,p,h,d,f,n,i,a,0,0);this.boxEndIndex=t.length};s.prototype._addLineCollisionCircles=function(t,e,r,n,i,a,o,s,l,c){var u=a/2,h=Math.floor(i/u),f=1+.4*Math.log(c)/Math.LN2,p=Math.floor(h*f/2),d=-a/2,g=r,m=n+1,v=d,y=-i/2,x=y-i/4;do{if(--m<0){if(v>y)return;m=0;break}v-=e[m].dist(g),g=e[m]}while(v>x);for(var b=e[m].dist(e[m+1]),_=-p;_<h+p;_++){var w=_*u,k=y+w;if(w<0&&(k+=w),w>i&&(k+=w-i),!(k<v)){for(;v+b<k;){if(v+=b,++m+1>=e.length)return;b=e[m].dist(e[m+1])}var M=k-v,A=e[m],T=e[m+1].sub(A)._unit()._mult(M)._add(A)._round(),S=Math.abs(k-d)<u?0:.8*(k-d);t.emplaceBack(T.x,T.y,-a/2,-a/2,a/2,a/2,o,s,l,a/2,S)}}};var l=u,c=u;function u(t,e){if(!(this instanceof u))return new u(t,e);if(this.data=t||[],this.length=this.data.length,this.compare=e||h,this.length>0)for(var r=(this.length>>1)-1;r>=0;r--)this._down(r)}function h(t,e){return t<e?-1:t>e?1:0}function f(e,r,n){void 0===r&&(r=1),void 0===n&&(n=!1);for(var i=1/0,a=1/0,o=-1/0,s=-1/0,c=e[0],u=0;u<c.length;u++){var h=c[u];(!u||h.x<i)&&(i=h.x),(!u||h.y<a)&&(a=h.y),(!u||h.x>o)&&(o=h.x),(!u||h.y>s)&&(s=h.y)}var f=o-i,g=s-a,m=Math.min(f,g),v=m/2,y=new l(null,p);if(0===m)return new t.default$1(i,a);for(var x=i;x<o;x+=m)for(var b=a;b<s;b+=m)y.push(new d(x+v,b+v,v,e));for(var _=function(t){for(var e=0,r=0,n=0,i=t[0],a=0,o=i.length,s=o-1;a<o;s=a++){var l=i[a],c=i[s],u=l.x*c.y-c.x*l.y;r+=(l.x+c.x)*u,n+=(l.y+c.y)*u,e+=3*u}return new d(r/e,n/e,0,t)}(e),w=y.length;y.length;){var k=y.pop();(k.d>_.d||!_.d)&&(_=k,n&&console.log("found best %d after %d probes",Math.round(1e4*k.d)/1e4,w)),k.max-_.d<=r||(v=k.h/2,y.push(new d(k.p.x-v,k.p.y-v,v,e)),y.push(new d(k.p.x+v,k.p.y-v,v,e)),y.push(new d(k.p.x-v,k.p.y+v,v,e)),y.push(new d(k.p.x+v,k.p.y+v,v,e)),w+=4)}return n&&(console.log("num probes: "+w),console.log("best distance: "+_.d)),_.p}function p(t,e){return e.max-t.max}function d(e,r,n,i){this.p=new t.default$1(e,r),this.h=n,this.d=function(e,r){for(var n=!1,i=1/0,a=0;a<r.length;a++)for(var o=r[a],s=0,l=o.length,c=l-1;s<l;c=s++){var u=o[s],h=o[c];u.y>e.y!=h.y>e.y&&e.x<(h.x-u.x)*(e.y-u.y)/(h.y-u.y)+u.x&&(n=!n),i=Math.min(i,t.distToSegmentSquared(e,u,h))}return(n?1:-1)*Math.sqrt(i)}(this.p,i),this.max=this.d+this.h*Math.SQRT2}function g(e,r,n,i,a,o){e.createArrays(),e.symbolInstances=[];var s=512*e.overscaling;e.tilePixelRatio=t.default$8/s,e.compareText={},e.iconsNeedLinear=!1;var l=e.layers[0].layout,c=e.layers[0]._unevaluatedLayout._values,u={};if("composite"===e.textSizeData.functionType){var h=e.textSizeData.zoomRange,f=h.min,p=h.max;u.compositeTextSizes=[c["text-size"].possiblyEvaluate(new t.default$16(f)),c["text-size"].possiblyEvaluate(new t.default$16(p))]}if("composite"===e.iconSizeData.functionType){var d=e.iconSizeData.zoomRange,g=d.min,v=d.max;u.compositeIconSizes=[c["icon-size"].possiblyEvaluate(new t.default$16(g)),c["icon-size"].possiblyEvaluate(new t.default$16(v))]}u.layoutTextSize=c["text-size"].possiblyEvaluate(new t.default$16(e.zoom+1)),u.layoutIconSize=c["icon-size"].possiblyEvaluate(new t.default$16(e.zoom+1)),u.textMaxSize=c["text-size"].possiblyEvaluate(new t.default$16(18));for(var y=24*l.get("text-line-height"),x="map"===l.get("text-rotation-alignment")&&"line"===l.get("symbol-placement"),b=l.get("text-keep-upright"),_=0,w=e.features;_<w.length;_+=1){var k=w[_],M=l.get("text-font").evaluate(k).join(","),A=r[M]||{},T=n[M]||{},S={},E=k.text;if(E){var C=l.get("text-offset").evaluate(k).map(function(t){return 24*t}),L=24*l.get("text-letter-spacing").evaluate(k),z=t.allowsLetterSpacing(E)?L:0,P=l.get("text-anchor").evaluate(k),I=l.get("text-justify").evaluate(k),O="line"!==l.get("symbol-placement")?24*l.get("text-max-width").evaluate(k):0;S.horizontal=t.shapeText(E,A,O,y,P,I,z,C,24,t.WritingMode.horizontal),t.allowsVerticalWritingMode(E)&&x&&b&&(S.vertical=t.shapeText(E,A,O,y,P,I,z,C,24,t.WritingMode.vertical))}var D=void 0;if(k.icon){var R=i[k.icon];R&&(D=t.shapeIcon(a[k.icon],l.get("icon-offset").evaluate(k),l.get("icon-anchor").evaluate(k)),void 0===e.sdfIcons?e.sdfIcons=R.sdf:e.sdfIcons!==R.sdf&&t.warnOnce("Style sheet warning: Cannot mix SDF and non-SDF icons in one buffer"),R.pixelRatio!==e.pixelRatio?e.iconsNeedLinear=!0:0!==l.get("icon-rotate").constantOr(1)&&(e.iconsNeedLinear=!0))}(S.horizontal||D)&&m(e,k,S,D,T,u)}o&&e.generateCollisionDebugBuffers()}function m(e,r,n,i,l,c){var u=c.layoutTextSize.evaluate(r),h=c.layoutIconSize.evaluate(r),p=c.textMaxSize.evaluate(r);void 0===p&&(p=u);var d=e.layers[0].layout,g=d.get("text-offset").evaluate(r),m=d.get("icon-offset").evaluate(r),x=u/24,b=e.tilePixelRatio*x,_=e.tilePixelRatio*p/24,w=e.tilePixelRatio*h,k=e.tilePixelRatio*d.get("symbol-spacing"),M=d.get("text-padding")*e.tilePixelRatio,A=d.get("icon-padding")*e.tilePixelRatio,T=d.get("text-max-angle")/180*Math.PI,S="map"===d.get("text-rotation-alignment")&&"line"===d.get("symbol-placement"),E="map"===d.get("icon-rotation-alignment")&&"line"===d.get("symbol-placement"),C=k/2,L=function(a,u){u.x<0||u.x>=t.default$8||u.y<0||u.y>=t.default$8||e.symbolInstances.push(function(e,r,n,i,a,l,c,u,h,f,p,d,g,m,y,x,b,_,w,k,M){var A,T,S=e.addToLineVertexArray(r,n),E=0,C=0,L=0,z=i.horizontal?i.horizontal.text:"",P=[];i.horizontal&&(A=new s(c,n,r,u,h,f,i.horizontal,p,d,g,e.overscaling),C+=v(e,r,i.horizontal,l,g,w,m,S,i.vertical?t.WritingMode.horizontal:t.WritingMode.horizontalOnly,P,k,M),i.vertical&&(L+=v(e,r,i.vertical,l,g,w,m,S,t.WritingMode.vertical,P,k,M)));var I=A?A.boxStartIndex:e.collisionBoxArray.length,O=A?A.boxEndIndex:e.collisionBoxArray.length;if(a){var D=function(e,r,n,i,a,o){var s,l,c,u,h=r.image,f=n.layout,p=r.top-1/h.pixelRatio,d=r.left-1/h.pixelRatio,g=r.bottom+1/h.pixelRatio,m=r.right+1/h.pixelRatio;if("none"!==f.get("icon-text-fit")&&a){var v=m-d,y=g-p,x=f.get("text-size").evaluate(o)/24,b=a.left*x,_=a.right*x,w=a.top*x,k=_-b,M=a.bottom*x-w,A=f.get("icon-text-fit-padding")[0],T=f.get("icon-text-fit-padding")[1],S=f.get("icon-text-fit-padding")[2],E=f.get("icon-text-fit-padding")[3],C="width"===f.get("icon-text-fit")?.5*(M-y):0,L="height"===f.get("icon-text-fit")?.5*(k-v):0,z="width"===f.get("icon-text-fit")||"both"===f.get("icon-text-fit")?k:v,P="height"===f.get("icon-text-fit")||"both"===f.get("icon-text-fit")?M:y;s=new t.default$1(b+L-E,w+C-A),l=new t.default$1(b+L+T+z,w+C-A),c=new t.default$1(b+L+T+z,w+C+S+P),u=new t.default$1(b+L-E,w+C+S+P)}else s=new t.default$1(d,p),l=new t.default$1(m,p),c=new t.default$1(m,g),u=new t.default$1(d,g);var I=n.layout.get("icon-rotate").evaluate(o)*Math.PI/180;if(I){var O=Math.sin(I),D=Math.cos(I),R=[D,-O,O,D];s._matMult(R),l._matMult(R),u._matMult(R),c._matMult(R)}return[{tl:s,tr:l,bl:u,br:c,tex:h.paddedRect,writingMode:void 0,glyphOffset:[0,0]}]}(0,a,l,0,i.horizontal,w);T=new s(c,n,r,u,h,f,a,y,x,!1,e.overscaling),E=4*D.length;var R=e.iconSizeData,B=null;"source"===R.functionType?B=[10*l.layout.get("icon-size").evaluate(w)]:"composite"===R.functionType&&(B=[10*M.compositeIconSizes[0].evaluate(w),10*M.compositeIconSizes[1].evaluate(w)]),e.addSymbols(e.icon,D,B,_,b,w,!1,r,S.lineStartIndex,S.lineLength)}var F=T?T.boxStartIndex:e.collisionBoxArray.length,N=T?T.boxEndIndex:e.collisionBoxArray.length;return e.glyphOffsetArray.length>=t.default$14.MAX_GLYPHS&&t.warnOnce("Too many glyphs being rendered in a tile. See https://github.com/mapbox/mapbox-gl-js/issues/2907"),{key:z,textBoxStartIndex:I,textBoxEndIndex:O,iconBoxStartIndex:F,iconBoxEndIndex:N,textOffset:m,iconOffset:_,anchor:r,line:n,featureIndex:u,feature:w,numGlyphVertices:C,numVerticalGlyphVertices:L,numIconVertices:E,textOpacityState:new o,iconOpacityState:new o,isDuplicate:!1,placedTextSymbolIndices:P,crossTileID:0}}(e,u,a,n,i,e.layers[0],e.collisionBoxArray,r.index,r.sourceLayerIndex,e.index,b,M,S,g,w,A,E,m,r,l,c))};if("line"===d.get("symbol-placement"))for(var z=0,P=function(e,r,n,i,a){for(var o=[],s=0;s<e.length;s++)for(var l=e[s],c=void 0,u=0;u<l.length-1;u++){var h=l[u],f=l[u+1];h.x<0&&f.x<0||(h.x<0?h=new t.default$1(0,h.y+(f.y-h.y)*((0-h.x)/(f.x-h.x)))._round():f.x<0&&(f=new t.default$1(0,h.y+(f.y-h.y)*((0-h.x)/(f.x-h.x)))._round()),h.y<0&&f.y<0||(h.y<0?h=new t.default$1(h.x+(f.x-h.x)*((0-h.y)/(f.y-h.y)),0)._round():f.y<0&&(f=new t.default$1(h.x+(f.x-h.x)*((0-h.y)/(f.y-h.y)),0)._round()),h.x>=i&&f.x>=i||(h.x>=i?h=new t.default$1(i,h.y+(f.y-h.y)*((i-h.x)/(f.x-h.x)))._round():f.x>=i&&(f=new t.default$1(i,h.y+(f.y-h.y)*((i-h.x)/(f.x-h.x)))._round()),h.y>=a&&f.y>=a||(h.y>=a?h=new t.default$1(h.x+(f.x-h.x)*((a-h.y)/(f.y-h.y)),a)._round():f.y>=a&&(f=new t.default$1(h.x+(f.x-h.x)*((a-h.y)/(f.y-h.y)),a)._round()),c&&h.equals(c[c.length-1])||(c=[h],o.push(c)),c.push(f)))))}return o}(r.geometry,0,0,t.default$8,t.default$8);z<P.length;z+=1)for(var I=P[z],O=0,D=a(I,k,T,n.vertical||n.horizontal,i,24,_,e.overscaling,t.default$8);O<D.length;O+=1){var R=D[O],B=n.horizontal;B&&y(e,B.text,C,R)||L(I,R)}else if("Polygon"===r.type)for(var F=0,N=t.default$26(r.geometry,0);F<N.length;F+=1){var j=N[F],V=f(j,16);L(j[0],new t.default$25(V.x,V.y,0))}else if("LineString"===r.type)for(var U=0,q=r.geometry;U<q.length;U+=1){var H=q[U];L(H,new t.default$25(H[0].x,H[0].y,0))}else if("Point"===r.type)for(var G=0,W=r.geometry;G<W.length;G+=1)for(var Y=0,X=W[G];Y<X.length;Y+=1){var Z=X[Y];L([Z],new t.default$25(Z.x,Z.y,0))}}function v(e,r,n,i,a,o,s,l,c,u,h,f){var p=function(e,r,n,i,a,o){for(var s=n.layout.get("text-rotate").evaluate(a)*Math.PI/180,l=n.layout.get("text-offset").evaluate(a).map(function(t){return 24*t}),c=r.positionedGlyphs,u=[],h=0;h<c.length;h++){var f=c[h],p=o[f.glyph];if(p){var d=p.rect;if(d){var g=t.GLYPH_PBF_BORDER+1,m=p.metrics.advance/2,v=i?[f.x+m,f.y]:[0,0],y=i?[0,0]:[f.x+m+l[0],f.y+l[1]],x=p.metrics.left-g-m+y[0],b=-p.metrics.top-g+y[1],_=x+d.w,w=b+d.h,k=new t.default$1(x,b),M=new t.default$1(_,b),A=new t.default$1(x,w),T=new t.default$1(_,w);if(i&&f.vertical){var S=new t.default$1(-m,m),E=-Math.PI/2,C=new t.default$1(5,0);k._rotateAround(E,S)._add(C),M._rotateAround(E,S)._add(C),A._rotateAround(E,S)._add(C),T._rotateAround(E,S)._add(C)}if(s){var L=Math.sin(s),z=Math.cos(s),P=[z,-L,L,z];k._matMult(P),M._matMult(P),A._matMult(P),T._matMult(P)}u.push({tl:k,tr:M,bl:A,br:T,tex:d,writingMode:r.writingMode,glyphOffset:v})}}}return u}(0,n,i,a,o,h),d=e.textSizeData,g=null;return"source"===d.functionType?g=[10*i.layout.get("text-size").evaluate(o)]:"composite"===d.functionType&&(g=[10*f.compositeTextSizes[0].evaluate(o),10*f.compositeTextSizes[1].evaluate(o)]),e.addSymbols(e.text,p,g,s,a,o,c,r,l.lineStartIndex,l.lineLength),u.push(e.text.placedSymbolArray.length-1),4*p.length}function y(t,e,r,n){var i=t.compareText;if(e in i){for(var a=i[e],o=a.length-1;o>=0;o--)if(n.dist(a[o])<r)return!0}else i[e]=[];return i[e].push(n),!1}u.prototype={push:function(t){this.data.push(t),this.length++,this._up(this.length-1)},pop:function(){if(0!==this.length){var t=this.data[0];return this.length--,this.length>0&&(this.data[0]=this.data[this.length],this._down(0)),this.data.pop(),t}},peek:function(){return this.data[0]},_up:function(t){for(var e=this.data,r=this.compare,n=e[t];t>0;){var i=t-1>>1,a=e[i];if(r(n,a)>=0)break;e[t]=a,t=i}e[t]=n},_down:function(t){for(var e=this.data,r=this.compare,n=this.length>>1,i=e[t];t<n;){var a=1+(t<<1),o=a+1,s=e[a];if(o<this.length&&r(e[o],s)<0&&(a=o,s=e[o]),r(s,i)>=0)break;e[t]=s,t=a}e[t]=i}},l.default=c;var x=function(e){var r=new t.AlphaImage({width:0,height:0}),n={},i=new t.default$2(0,0,{autoResize:!0});for(var a in e){var o=e[a],s=n[a]={};for(var l in o){var c=o[+l];if(c&&0!==c.bitmap.width&&0!==c.bitmap.height){var u=i.packOne(c.bitmap.width+2,c.bitmap.height+2);r.resize({width:i.w,height:i.h}),t.AlphaImage.copy(c.bitmap,r,{x:0,y:0},{x:u.x+1,y:u.y+1},c.bitmap),s[l]={rect:u,metrics:c.metrics}}}}i.shrink(),r.resize({width:i.w,height:i.h}),this.image=r,this.positions=n};t.register("GlyphAtlas",x);var b=function(e){this.tileID=new t.OverscaledTileID(e.tileID.overscaledZ,e.tileID.wrap,e.tileID.canonical.z,e.tileID.canonical.x,e.tileID.canonical.y),this.uid=e.uid,this.zoom=e.zoom,this.pixelRatio=e.pixelRatio,this.tileSize=e.tileSize,this.source=e.source,this.overscaling=this.tileID.overscaleFactor(),this.showCollisionBoxes=e.showCollisionBoxes,this.collectResourceTiming=!!e.collectResourceTiming};function _(e,r){for(var n=new t.default$16(r),i=0,a=e;i<a.length;i+=1)a[i].recalculate(n)}b.prototype.parse=function(e,r,n,i){var a=this;this.status="parsing",this.data=e,this.collisionBoxArray=new t.CollisionBoxArray;var o=new t.default$27(Object.keys(e.layers).sort()),s=new t.default$11(this.tileID);s.bucketLayerIDs=[];var l,c,u,h={},f={featureIndex:s,iconDependencies:{},glyphDependencies:{}},p=r.familiesBySource[this.source];for(var d in p){var m=e.layers[d];if(m){1===m.version&&t.warnOnce('Vector tile source "'+a.source+'" layer "'+d+'" does not use vector tile spec v2 and therefore may have some rendering errors.');for(var v=o.encode(d),y=[],b=0;b<m.length;b++){var w=m.feature(b);y.push({feature:w,index:b,sourceLayerIndex:v})}for(var k=0,M=p[d];k<M.length;k+=1){var A=M[k],T=A[0];T.minzoom&&a.zoom<Math.floor(T.minzoom)||T.maxzoom&&a.zoom>=T.maxzoom||"none"!==T.visibility&&(_(A,a.zoom),(h[T.id]=T.createBucket({index:s.bucketLayerIDs.length,layers:A,zoom:a.zoom,pixelRatio:a.pixelRatio,overscaling:a.overscaling,collisionBoxArray:a.collisionBoxArray,sourceLayerIndex:v})).populate(y,f),s.bucketLayerIDs.push(A.map(function(t){return t.id})))}}}var S=t.mapObject(f.glyphDependencies,function(t){return Object.keys(t).map(Number)});Object.keys(S).length?n.send("getGlyphs",{uid:this.uid,stacks:S},function(t,e){l||(l=t,c=e,C.call(a))}):c={};var E=Object.keys(f.iconDependencies);function C(){if(l)return i(l);if(c&&u){var e=new x(c),r=new t.default$28(u);for(var n in h){var a=h[n];a instanceof t.default$14&&(_(a.layers,this.zoom),g(a,c,e.positions,u,r.positions,this.showCollisionBoxes))}this.status="done",i(null,{buckets:t.values(h).filter(function(t){return!t.isEmpty()}),featureIndex:s,collisionBoxArray:this.collisionBoxArray,glyphAtlasImage:e.image,iconAtlasImage:r.image})}}E.length?n.send("getImages",{icons:E},function(t,e){l||(l=t,u=e,C.call(a))}):u={},C.call(this)};var w=function(t){return!(!performance||!performance.getEntriesByName)&&performance.getEntriesByName(t)};function k(e,r){var n=t.getArrayBuffer(e.request,function(e,n){e?r(e):n&&r(null,{vectorTile:new t.default$29.VectorTile(new t.default$30(n.data)),rawData:n.data,cacheControl:n.cacheControl,expires:n.expires})});return function(){n.abort(),r()}}var M=function(t,e,r){this.actor=t,this.layerIndex=e,this.loadVectorData=r||k,this.loading={},this.loaded={}};M.prototype.loadTile=function(e,r){var n=this,i=e.uid;this.loading||(this.loading={});var a=this.loading[i]=new b(e);a.abort=this.loadVectorData(e,function(o,s){if(delete n.loading[i],o||!s)return r(o);var l=s.rawData,c={};s.expires&&(c.expires=s.expires),s.cacheControl&&(c.cacheControl=s.cacheControl);var u={};if(e.request&&e.request.collectResourceTiming){var h=w(e.request.url);h&&(u.resourceTiming=JSON.parse(JSON.stringify(h)))}a.vectorTile=s.vectorTile,a.parse(s.vectorTile,n.layerIndex,n.actor,function(e,n){if(e||!n)return r(e);r(null,t.extend({rawTileData:l.slice(0)},n,c,u))}),n.loaded=n.loaded||{},n.loaded[i]=a})},M.prototype.reloadTile=function(t,e){var r=this.loaded,n=t.uid,i=this;if(r&&r[n]){var a=r[n];a.showCollisionBoxes=t.showCollisionBoxes;var o=function(t,r){var n=a.reloadCallback;n&&(delete a.reloadCallback,a.parse(a.vectorTile,i.layerIndex,i.actor,n)),e(t,r)};"parsing"===a.status?a.reloadCallback=o:"done"===a.status&&a.parse(a.vectorTile,this.layerIndex,this.actor,o)}},M.prototype.abortTile=function(t,e){var r=this.loading,n=t.uid;r&&r[n]&&r[n].abort&&(r[n].abort(),delete r[n]),e()},M.prototype.removeTile=function(t,e){var r=this.loaded,n=t.uid;r&&r[n]&&delete r[n],e()};var A=function(){this.loading={},this.loaded={}};A.prototype.loadTile=function(e,r){var n=e.uid,i=e.encoding,a=new t.default$31(n);this.loading[n]=a,a.loadFromImage(e.rawImageData,i),delete this.loading[n],this.loaded=this.loaded||{},this.loaded[n]=a,r(null,a)},A.prototype.removeTile=function(t){var e=this.loaded,r=t.uid;e&&e[r]&&delete e[r]};var T={RADIUS:6378137,FLATTENING:1/298.257223563,POLAR_RADIUS:6356752.3142};function S(t){var e=0;if(t&&t.length>0){e+=Math.abs(E(t[0]));for(var r=1;r<t.length;r++)e-=Math.abs(E(t[r]))}return e}function E(t){var e,r,n,i,a,o,s=0,l=t.length;if(l>2){for(o=0;o<l;o++)o===l-2?(n=l-2,i=l-1,a=0):o===l-1?(n=l-1,i=0,a=1):(n=o,i=o+1,a=o+2),e=t[n],r=t[i],s+=(C(t[a][0])-C(e[0]))*Math.sin(C(r[1]));s=s*T.RADIUS*T.RADIUS/2}return s}function C(t){return t*Math.PI/180}var L={geometry:function t(e){var r,n=0;switch(e.type){case"Polygon":return S(e.coordinates);case"MultiPolygon":for(r=0;r<e.coordinates.length;r++)n+=S(e.coordinates[r]);return n;case"Point":case"MultiPoint":case"LineString":case"MultiLineString":return 0;case"GeometryCollection":for(r=0;r<e.geometries.length;r++)n+=t(e.geometries[r]);return n}},ring:E};function z(t,e){return function(r){return t(r,e)}}function P(t,e){e=!!e,t[0]=I(t[0],e);for(var r=1;r<t.length;r++)t[r]=I(t[r],!e);return t}function I(t,e){return function(t){return L.ring(t)>=0}(t)===e?t:t.reverse()}var O=t.default$29.VectorTileFeature.prototype.toGeoJSON,D=function(e){this._feature=e,this.extent=t.default$8,this.type=e.type,this.properties=e.tags,"id"in e&&!isNaN(e.id)&&(this.id=parseInt(e.id,10))};D.prototype.loadGeometry=function(){if(1===this._feature.type){for(var e=[],r=0,n=this._feature.geometry;r<n.length;r+=1){var i=n[r];e.push([new t.default$1(i[0],i[1])])}return e}for(var a=[],o=0,s=this._feature.geometry;o<s.length;o+=1){for(var l=[],c=0,u=s[o];c<u.length;c+=1){var h=u[c];l.push(new t.default$1(h[0],h[1]))}a.push(l)}return a},D.prototype.toGeoJSON=function(t,e,r){return O.call(this,t,e,r)};var R=function(e){this.layers={_geojsonTileLayer:this},this.name="_geojsonTileLayer",this.extent=t.default$8,this.length=e.length,this._features=e};R.prototype.feature=function(t){return new D(this._features[t])};var B=t.__moduleExports.VectorTileFeature,F=N;function N(t,e){this.options=e||{},this.features=t,this.length=t.length}function j(t,e){this.id="number"==typeof t.id?t.id:void 0,this.type=t.type,this.rawGeometry=1===t.type?[t.geometry]:t.geometry,this.properties=t.tags,this.extent=e||4096}N.prototype.feature=function(t){return new j(this.features[t],this.options.extent)},j.prototype.loadGeometry=function(){var e=this.rawGeometry;this.geometry=[];for(var r=0;r<e.length;r++){for(var n=e[r],i=[],a=0;a<n.length;a++)i.push(new t.default$32(n[a][0],n[a][1]));this.geometry.push(i)}return this.geometry},j.prototype.bbox=function(){this.geometry||this.loadGeometry();for(var t=this.geometry,e=1/0,r=-1/0,n=1/0,i=-1/0,a=0;a<t.length;a++)for(var o=t[a],s=0;s<o.length;s++){var l=o[s];e=Math.min(e,l.x),r=Math.max(r,l.x),n=Math.min(n,l.y),i=Math.max(i,l.y)}return[e,n,r,i]},j.prototype.toGeoJSON=B.prototype.toGeoJSON;var V=H,U=H,q=F;function H(e){var r=new t.__moduleExports$1;return function(t,e){for(var r in t.layers)e.writeMessage(3,G,t.layers[r])}(e,r),r.finish()}function G(t,e){var r;e.writeVarintField(15,t.version||1),e.writeStringField(1,t.name||""),e.writeVarintField(5,t.extent||4096);var n={keys:[],values:[],keycache:{},valuecache:{}};for(r=0;r<t.length;r++)n.feature=t.feature(r),e.writeMessage(2,W,n);var i=n.keys;for(r=0;r<i.length;r++)e.writeStringField(3,i[r]);var a=n.values;for(r=0;r<a.length;r++)e.writeMessage(4,J,a[r])}function W(t,e){var r=t.feature;void 0!==r.id&&e.writeVarintField(1,r.id),e.writeMessage(2,Y,t),e.writeVarintField(3,r.type),e.writeMessage(4,$,r)}function Y(t,e){var r=t.feature,n=t.keys,i=t.values,a=t.keycache,o=t.valuecache;for(var s in r.properties){var l=a[s];void 0===l&&(n.push(s),l=n.length-1,a[s]=l),e.writeVarint(l);var c=r.properties[s],u=typeof c;"string"!==u&&"boolean"!==u&&"number"!==u&&(c=JSON.stringify(c));var h=u+":"+c,f=o[h];void 0===f&&(i.push(c),f=i.length-1,o[h]=f),e.writeVarint(f)}}function X(t,e){return(e<<3)+(7&t)}function Z(t){return t<<1^t>>31}function $(t,e){for(var r=t.loadGeometry(),n=t.type,i=0,a=0,o=r.length,s=0;s<o;s++){var l=r[s],c=1;1===n&&(c=l.length),e.writeVarint(X(1,c));for(var u=3===n?l.length-1:l.length,h=0;h<u;h++){1===h&&1!==n&&e.writeVarint(X(2,u-1));var f=l[h].x-i,p=l[h].y-a;e.writeVarint(Z(f)),e.writeVarint(Z(p)),i+=f,a+=p}3===n&&e.writeVarint(X(7,0))}}function J(t,e){var r=typeof t;"string"===r?e.writeStringField(1,t):"boolean"===r?e.writeBooleanField(7,t):"number"===r&&(t%1!=0?e.writeDoubleField(3,t):t<0?e.writeSVarintField(6,t):e.writeVarintField(5,t))}V.fromVectorTileJs=U,V.fromGeojsonVt=function(t,e){e=e||{};var r={};for(var n in t)r[n]=new F(t[n].features,e),r[n].name=n,r[n].version=e.version,r[n].extent=e.extent;return H({layers:r})},V.GeoJSONWrapper=q;var K=function t(e,r,n,i,a,o){if(!(a-i<=n)){var s=Math.floor((i+a)/2);!function t(e,r,n,i,a,o){for(;a>i;){if(a-i>600){var s=a-i+1,l=n-i+1,c=Math.log(s),u=.5*Math.exp(2*c/3),h=.5*Math.sqrt(c*u*(s-u)/s)*(l-s/2<0?-1:1);t(e,r,n,Math.max(i,Math.floor(n-l*u/s+h)),Math.min(a,Math.floor(n+(s-l)*u/s+h)),o)}var f=r[2*n+o],p=i,d=a;for(Q(e,r,i,n),r[2*a+o]>f&&Q(e,r,i,a);p<d;){for(Q(e,r,p,d),p++,d--;r[2*p+o]<f;)p++;for(;r[2*d+o]>f;)d--}r[2*i+o]===f?Q(e,r,i,d):Q(e,r,++d,a),d<=n&&(i=d+1),n<=d&&(a=d-1)}}(e,r,s,i,a,o%2),t(e,r,n,i,s-1,o+1),t(e,r,n,s+1,a,o+1)}};function Q(t,e,r,n){tt(t,r,n),tt(e,2*r,2*n),tt(e,2*r+1,2*n+1)}function tt(t,e,r){var n=t[e];t[e]=t[r],t[r]=n}function et(t,e,r,n){var i=t-r,a=e-n;return i*i+a*a}var rt=function(t,e,r,n,i){return new nt(t,e,r,n,i)};function nt(t,e,r,n,i){e=e||it,r=r||at,i=i||Array,this.nodeSize=n||64,this.points=t,this.ids=new i(t.length),this.coords=new i(2*t.length);for(var a=0;a<t.length;a++)this.ids[a]=a,this.coords[2*a]=e(t[a]),this.coords[2*a+1]=r(t[a]);K(this.ids,this.coords,this.nodeSize,0,this.ids.length-1,0)}function it(t){return t[0]}function at(t){return t[1]}nt.prototype={range:function(t,e,r,n){return function(t,e,r,n,i,a,o){for(var s,l,c=[0,t.length-1,0],u=[];c.length;){var h=c.pop(),f=c.pop(),p=c.pop();if(f-p<=o)for(var d=p;d<=f;d++)s=e[2*d],l=e[2*d+1],s>=r&&s<=i&&l>=n&&l<=a&&u.push(t[d]);else{var g=Math.floor((p+f)/2);s=e[2*g],l=e[2*g+1],s>=r&&s<=i&&l>=n&&l<=a&&u.push(t[g]);var m=(h+1)%2;(0===h?r<=s:n<=l)&&(c.push(p),c.push(g-1),c.push(m)),(0===h?i>=s:a>=l)&&(c.push(g+1),c.push(f),c.push(m))}}return u}(this.ids,this.coords,t,e,r,n,this.nodeSize)},within:function(t,e,r){return function(t,e,r,n,i,a){for(var o=[0,t.length-1,0],s=[],l=i*i;o.length;){var c=o.pop(),u=o.pop(),h=o.pop();if(u-h<=a)for(var f=h;f<=u;f++)et(e[2*f],e[2*f+1],r,n)<=l&&s.push(t[f]);else{var p=Math.floor((h+u)/2),d=e[2*p],g=e[2*p+1];et(d,g,r,n)<=l&&s.push(t[p]);var m=(c+1)%2;(0===c?r-i<=d:n-i<=g)&&(o.push(h),o.push(p-1),o.push(m)),(0===c?r+i>=d:n+i>=g)&&(o.push(p+1),o.push(u),o.push(m))}}return s}(this.ids,this.coords,t,e,r,this.nodeSize)}};function ot(t){this.options=pt(Object.create(this.options),t),this.trees=new Array(this.options.maxZoom+1)}function st(t,e,r,n,i){return{x:t,y:e,zoom:1/0,id:n,properties:i,parentId:-1,numPoints:r}}function lt(t,e){var r=t.geometry.coordinates;return{x:ht(r[0]),y:ft(r[1]),zoom:1/0,id:e,parentId:-1}}function ct(t){return{type:"Feature",properties:ut(t),geometry:{type:"Point",coordinates:[(n=t.x,360*(n-.5)),(e=t.y,r=(180-360*e)*Math.PI/180,360*Math.atan(Math.exp(r))/Math.PI-90)]}};var e,r,n}function ut(t){var e=t.numPoints,r=e>=1e4?Math.round(e/1e3)+"k":e>=1e3?Math.round(e/100)/10+"k":e;return pt(pt({},t.properties),{cluster:!0,cluster_id:t.id,point_count:e,point_count_abbreviated:r})}function ht(t){return t/360+.5}function ft(t){var e=Math.sin(t*Math.PI/180),r=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return r<0?0:r>1?1:r}function pt(t,e){for(var r in e)t[r]=e[r];return t}function dt(t){return t.x}function gt(t){return t.y}function mt(t,e,r,n,i,a){var o=i-r,s=a-n;if(0!==o||0!==s){var l=((t-r)*o+(e-n)*s)/(o*o+s*s);l>1?(r=i,n=a):l>0&&(r+=o*l,n+=s*l)}return(o=t-r)*o+(s=e-n)*s}function vt(t,e,r,n){var i={id:t||null,type:e,geometry:r,tags:n,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0};return function(t){var e=t.geometry,r=t.type;if("Point"===r||"MultiPoint"===r||"LineString"===r)yt(t,e);else if("Polygon"===r||"MultiLineString"===r)for(var n=0;n<e.length;n++)yt(t,e[n]);else if("MultiPolygon"===r)for(n=0;n<e.length;n++)for(var i=0;i<e[n].length;i++)yt(t,e[n][i])}(i),i}function yt(t,e){for(var r=0;r<e.length;r+=3)t.minX=Math.min(t.minX,e[r]),t.minY=Math.min(t.minY,e[r+1]),t.maxX=Math.max(t.maxX,e[r]),t.maxY=Math.max(t.maxY,e[r+1])}function xt(t,e,r){if(e.geometry){var n=e.geometry.coordinates,i=e.geometry.type,a=Math.pow(r.tolerance/((1<<r.maxZoom)*r.extent),2),o=[];if("Point"===i)bt(n,o);else if("MultiPoint"===i)for(var s=0;s<n.length;s++)bt(n[s],o);else if("LineString"===i)_t(n,o,a,!1);else if("MultiLineString"===i)if(r.lineMetrics)for(s=0;s<n.length;s++)return o=[],_t(n[s],o,a,!1),void t.push(vt(e.id,"LineString",o,e.properties));else wt(n,o,a,!1);else if("Polygon"===i)wt(n,o,a,!0);else{if("MultiPolygon"!==i){if("GeometryCollection"===i){for(s=0;s<e.geometry.geometries.length;s++)xt(t,{id:e.id,geometry:e.geometry.geometries[s],properties:e.properties},r);return}throw new Error("Input data is not a valid GeoJSON object.")}for(s=0;s<n.length;s++){var l=[];wt(n[s],l,a,!0),o.push(l)}}t.push(vt(e.id,i,o,e.properties))}}function bt(t,e){e.push(kt(t[0])),e.push(Mt(t[1])),e.push(0)}function _t(t,e,r,n){for(var i,a,o=0,s=0;s<t.length;s++){var l=kt(t[s][0]),c=Mt(t[s][1]);e.push(l),e.push(c),e.push(0),s>0&&(o+=n?(i*c-l*a)/2:Math.sqrt(Math.pow(l-i,2)+Math.pow(c-a,2))),i=l,a=c}var u=e.length-3;e[2]=1,function t(e,r,n,i){for(var a,o=i,s=e[r],l=e[r+1],c=e[n],u=e[n+1],h=r+3;h<n;h+=3){var f=mt(e[h],e[h+1],s,l,c,u);f>o&&(a=h,o=f)}o>i&&(a-r>3&&t(e,r,a,i),e[a+2]=o,n-a>3&&t(e,a,n,i))}(e,0,u,r),e[u+2]=1,e.size=Math.abs(o),e.start=0,e.end=e.size}function wt(t,e,r,n){for(var i=0;i<t.length;i++){var a=[];_t(t[i],a,r,n),e.push(a)}}function kt(t){return t/360+.5}function Mt(t){var e=Math.sin(t*Math.PI/180),r=.5-.25*Math.log((1+e)/(1-e))/Math.PI;return r<0?0:r>1?1:r}function At(t,e,r,n,i,a,o,s){if(n/=e,a>=(r/=e)&&o<=n)return t;if(a>n||o<r)return null;for(var l=[],c=0;c<t.length;c++){var u=t[c],h=u.geometry,f=u.type,p=0===i?u.minX:u.minY,d=0===i?u.maxX:u.maxY;if(p>=r&&d<=n)l.push(u);else if(!(p>n||d<r)){var g=[];if("Point"===f||"MultiPoint"===f)Tt(h,g,r,n,i);else if("LineString"===f)St(h,g,r,n,i,!1,s.lineMetrics);else if("MultiLineString"===f)Ct(h,g,r,n,i,!1);else if("Polygon"===f)Ct(h,g,r,n,i,!0);else if("MultiPolygon"===f)for(var m=0;m<h.length;m++){var v=[];Ct(h[m],v,r,n,i,!0),v.length&&g.push(v)}if(g.length){if(s.lineMetrics&&"LineString"===f){for(m=0;m<g.length;m++)l.push(vt(u.id,f,g[m],u.tags));continue}"LineString"!==f&&"MultiLineString"!==f||(1===g.length?(f="LineString",g=g[0]):f="MultiLineString"),"Point"!==f&&"MultiPoint"!==f||(f=3===g.length?"Point":"MultiPoint"),l.push(vt(u.id,f,g,u.tags))}}}return l.length?l:null}function Tt(t,e,r,n,i){for(var a=0;a<t.length;a+=3){var o=t[a+i];o>=r&&o<=n&&(e.push(t[a]),e.push(t[a+1]),e.push(t[a+2]))}}function St(t,e,r,n,i,a,o){for(var s,l,c=Et(t),u=0===i?zt:Pt,h=t.start,f=0;f<t.length-3;f+=3){var p=t[f],d=t[f+1],g=t[f+2],m=t[f+3],v=t[f+4],y=0===i?p:d,x=0===i?m:v,b=!1;o&&(s=Math.sqrt(Math.pow(p-m,2)+Math.pow(d-v,2))),y<r?x>=r&&(l=u(c,p,d,m,v,r),o&&(c.start=h+s*l)):y>n?x<=n&&(l=u(c,p,d,m,v,n),o&&(c.start=h+s*l)):Lt(c,p,d,g),x<r&&y>=r&&(l=u(c,p,d,m,v,r),b=!0),x>n&&y<=n&&(l=u(c,p,d,m,v,n),b=!0),!a&&b&&(o&&(c.end=h+s*l),e.push(c),c=Et(t)),o&&(h+=s)}var _=t.length-3;p=t[_],d=t[_+1],g=t[_+2],(y=0===i?p:d)>=r&&y<=n&&Lt(c,p,d,g),_=c.length-3,a&&_>=3&&(c[_]!==c[0]||c[_+1]!==c[1])&&Lt(c,c[0],c[1],c[2]),c.length&&e.push(c)}function Et(t){var e=[];return e.size=t.size,e.start=t.start,e.end=t.end,e}function Ct(t,e,r,n,i,a){for(var o=0;o<t.length;o++)St(t[o],e,r,n,i,a,!1)}function Lt(t,e,r,n){t.push(e),t.push(r),t.push(n)}function zt(t,e,r,n,i,a){var o=(a-e)/(n-e);return t.push(a),t.push(r+(i-r)*o),t.push(1),o}function Pt(t,e,r,n,i,a){var o=(a-r)/(i-r);return t.push(e+(n-e)*o),t.push(a),t.push(1),o}function It(t,e){for(var r=[],n=0;n<t.length;n++){var i,a=t[n],o=a.type;if("Point"===o||"MultiPoint"===o||"LineString"===o)i=Ot(a.geometry,e);else if("MultiLineString"===o||"Polygon"===o){i=[];for(var s=0;s<a.geometry.length;s++)i.push(Ot(a.geometry[s],e))}else if("MultiPolygon"===o)for(i=[],s=0;s<a.geometry.length;s++){for(var l=[],c=0;c<a.geometry[s].length;c++)l.push(Ot(a.geometry[s][c],e));i.push(l)}r.push(vt(a.id,o,i,a.tags))}return r}function Ot(t,e){var r=[];r.size=t.size,void 0!==t.start&&(r.start=t.start,r.end=t.end);for(var n=0;n<t.length;n+=3)r.push(t[n]+e,t[n+1],t[n+2]);return r}function Dt(t,e){if(t.transformed)return t;var r,n,i,a=1<<t.z,o=t.x,s=t.y;for(r=0;r<t.features.length;r++){var l=t.features[r],c=l.geometry,u=l.type;if(l.geometry=[],1===u)for(n=0;n<c.length;n+=2)l.geometry.push(Rt(c[n],c[n+1],e,a,o,s));else for(n=0;n<c.length;n++){var h=[];for(i=0;i<c[n].length;i+=2)h.push(Rt(c[n][i],c[n][i+1],e,a,o,s));l.geometry.push(h)}}return t.transformed=!0,t}function Rt(t,e,r,n,i,a){return[Math.round(r*(t*n-i)),Math.round(r*(e*n-a))]}function Bt(t,e,r,n,i){for(var a=e===i.maxZoom?0:i.tolerance/((1<<e)*i.extent),o={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:n,z:e,transformed:!1,minX:2,minY:1,maxX:-1,maxY:0},s=0;s<t.length;s++){o.numFeatures++,Ft(o,t[s],a,i);var l=t[s].minX,c=t[s].minY,u=t[s].maxX,h=t[s].maxY;l<o.minX&&(o.minX=l),c<o.minY&&(o.minY=c),u>o.maxX&&(o.maxX=u),h>o.maxY&&(o.maxY=h)}return o}function Ft(t,e,r,n){var i=e.geometry,a=e.type,o=[];if("Point"===a||"MultiPoint"===a)for(var s=0;s<i.length;s+=3)o.push(i[s]),o.push(i[s+1]),t.numPoints++,t.numSimplified++;else if("LineString"===a)Nt(o,i,t,r,!1,!1);else if("MultiLineString"===a||"Polygon"===a)for(s=0;s<i.length;s++)Nt(o,i[s],t,r,"Polygon"===a,0===s);else if("MultiPolygon"===a)for(var l=0;l<i.length;l++){var c=i[l];for(s=0;s<c.length;s++)Nt(o,c[s],t,r,!0,0===s)}if(o.length){var u=e.tags||null;if("LineString"===a&&n.lineMetrics){for(var h in u={},e.tags)u[h]=e.tags[h];u.mapbox_clip_start=i.start/i.size,u.mapbox_clip_end=i.end/i.size}var f={geometry:o,type:"Polygon"===a||"MultiPolygon"===a?3:"LineString"===a||"MultiLineString"===a?2:1,tags:u};null!==e.id&&(f.id=e.id),t.features.push(f)}}function Nt(t,e,r,n,i,a){var o=n*n;if(n>0&&e.size<(i?o:n))r.numPoints+=e.length/3;else{for(var s=[],l=0;l<e.length;l+=3)(0===n||e[l+2]>o)&&(r.numSimplified++,s.push(e[l]),s.push(e[l+1])),r.numPoints++;i&&function(t,e){for(var r=0,n=0,i=t.length,a=i-2;n<i;a=n,n+=2)r+=(t[n]-t[a])*(t[n+1]+t[a+1]);if(r>0===e)for(n=0,i=t.length;n<i/2;n+=2){var o=t[n],s=t[n+1];t[n]=t[i-2-n],t[n+1]=t[i-1-n],t[i-2-n]=o,t[i-1-n]=s}}(s,a),t.push(s)}}function jt(t,e){var r=(e=this.options=function(t,e){for(var r in e)t[r]=e[r];return t}(Object.create(this.options),e)).debug;if(r&&console.time("preprocess data"),e.maxZoom<0||e.maxZoom>24)throw new Error("maxZoom should be in the 0-24 range");var n=function(t,e){var r=[];if("FeatureCollection"===t.type)for(var n=0;n<t.features.length;n++)xt(r,t.features[n],e);else"Feature"===t.type?xt(r,t,e):xt(r,{geometry:t},e);return r}(t,e);this.tiles={},this.tileCoords=[],r&&(console.timeEnd("preprocess data"),console.log("index: maxZoom: %d, maxPoints: %d",e.indexMaxZoom,e.indexMaxPoints),console.time("generate tiles"),this.stats={},this.total=0),(n=function(t,e){var r=e.buffer/e.extent,n=t,i=At(t,1,-1-r,r,0,-1,2,e),a=At(t,1,1-r,2+r,0,-1,2,e);return(i||a)&&(n=At(t,1,-r,1+r,0,-1,2,e)||[],i&&(n=It(i,1).concat(n)),a&&(n=n.concat(It(a,-1)))),n}(n,e)).length&&this.splitTile(n,0,0,0),r&&(n.length&&console.log("features: %d, points: %d",this.tiles[0].numFeatures,this.tiles[0].numPoints),console.timeEnd("generate tiles"),console.log("tiles generated:",this.total,JSON.stringify(this.stats)))}function Vt(t,e,r){return 32*((1<<t)*r+e)+t}function Ut(t,e){var r=t.tileID.canonical;if(!this._geoJSONIndex)return e(null,null);var n=this._geoJSONIndex.getTile(r.z,r.x,r.y);if(!n)return e(null,null);var i=new R(n.features),a=V(i);0===a.byteOffset&&a.byteLength===a.buffer.byteLength||(a=new Uint8Array(a)),e(null,{vectorTile:i,rawData:a.buffer})}ot.prototype={options:{minZoom:0,maxZoom:16,radius:40,extent:512,nodeSize:64,log:!1,reduce:null,initial:function(){return{}},map:function(t){return t}},load:function(t){var e=this.options.log;e&&console.time("total time");var r="prepare "+t.length+" points";e&&console.time(r),this.points=t;var n=t.map(lt);e&&console.timeEnd(r);for(var i=this.options.maxZoom;i>=this.options.minZoom;i--){var a=+Date.now();this.trees[i+1]=rt(n,dt,gt,this.options.nodeSize,Float32Array),n=this._cluster(n,i),e&&console.log("z%d: %d clusters in %dms",i,n.length,+Date.now()-a)}return this.trees[this.options.minZoom]=rt(n,dt,gt,this.options.nodeSize,Float32Array),e&&console.timeEnd("total time"),this},getClusters:function(t,e){for(var r=this.trees[this._limitZoom(e)],n=r.range(ht(t[0]),ft(t[3]),ht(t[2]),ft(t[1])),i=[],a=0;a<n.length;a++){var o=r.points[n[a]];i.push(o.numPoints?ct(o):this.points[o.id])}return i},getChildren:function(t,e){for(var r=this.trees[e+1].points[t],n=this.options.radius/(this.options.extent*Math.pow(2,e)),i=this.trees[e+1].within(r.x,r.y,n),a=[],o=0;o<i.length;o++){var s=this.trees[e+1].points[i[o]];s.parentId===t&&a.push(s.numPoints?ct(s):this.points[s.id])}return a},getLeaves:function(t,e,r,n){r=r||10,n=n||0;var i=[];return this._appendLeaves(i,t,e,r,n,0),i},getTile:function(t,e,r){var n=this.trees[this._limitZoom(t)],i=Math.pow(2,t),a=this.options.extent,o=this.options.radius/a,s=(r-o)/i,l=(r+1+o)/i,c={features:[]};return this._addTileFeatures(n.range((e-o)/i,s,(e+1+o)/i,l),n.points,e,r,i,c),0===e&&this._addTileFeatures(n.range(1-o/i,s,1,l),n.points,i,r,i,c),e===i-1&&this._addTileFeatures(n.range(0,s,o/i,l),n.points,-1,r,i,c),c.features.length?c:null},getClusterExpansionZoom:function(t,e){for(;e<this.options.maxZoom;){var r=this.getChildren(t,e);if(e++,1!==r.length)break;t=r[0].properties.cluster_id}return e},_appendLeaves:function(t,e,r,n,i,a){for(var o=this.getChildren(e,r),s=0;s<o.length;s++){var l=o[s].properties;if(l.cluster?a+l.point_count<=i?a+=l.point_count:a=this._appendLeaves(t,l.cluster_id,r+1,n,i,a):a<i?a++:t.push(o[s]),t.length===n)break}return a},_addTileFeatures:function(t,e,r,n,i,a){for(var o=0;o<t.length;o++){var s=e[t[o]];a.features.push({type:1,geometry:[[Math.round(this.options.extent*(s.x*i-r)),Math.round(this.options.extent*(s.y*i-n))]],tags:s.numPoints?ut(s):this.points[s.id].properties})}},_limitZoom:function(t){return Math.max(this.options.minZoom,Math.min(t,this.options.maxZoom+1))},_cluster:function(t,e){for(var r=[],n=this.options.radius/(this.options.extent*Math.pow(2,e)),i=0;i<t.length;i++){var a=t[i];if(!(a.zoom<=e)){a.zoom=e;var o=this.trees[e+1],s=o.within(a.x,a.y,n),l=a.numPoints||1,c=a.x*l,u=a.y*l,h=null;this.options.reduce&&(h=this.options.initial(),this._accumulate(h,a));for(var f=0;f<s.length;f++){var p=o.points[s[f]];if(e<p.zoom){var d=p.numPoints||1;p.zoom=e,c+=p.x*d,u+=p.y*d,l+=d,p.parentId=i,this.options.reduce&&this._accumulate(h,p)}}1===l?r.push(a):(a.parentId=i,r.push(st(c/l,u/l,l,i,h)))}}return r},_accumulate:function(t,e){var r=e.numPoints?e.properties:this.options.map(this.points[e.id].properties);this.options.reduce(t,r)}},jt.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,tolerance:3,extent:4096,buffer:64,lineMetrics:!1,debug:0},jt.prototype.splitTile=function(t,e,r,n,i,a,o){for(var s=[t,e,r,n],l=this.options,c=l.debug;s.length;){n=s.pop(),r=s.pop(),e=s.pop(),t=s.pop();var u=1<<e,h=Vt(e,r,n),f=this.tiles[h];if(!f&&(c>1&&console.time("creation"),f=this.tiles[h]=Bt(t,e,r,n,l),this.tileCoords.push({z:e,x:r,y:n}),c)){c>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",e,r,n,f.numFeatures,f.numPoints,f.numSimplified),console.timeEnd("creation"));var p="z"+e;this.stats[p]=(this.stats[p]||0)+1,this.total++}if(f.source=t,i){if(e===l.maxZoom||e===i)continue;var d=1<<i-e;if(r!==Math.floor(a/d)||n!==Math.floor(o/d))continue}else if(e===l.indexMaxZoom||f.numPoints<=l.indexMaxPoints)continue;if(f.source=null,0!==t.length){c>1&&console.time("clipping");var g,m,v,y,x,b,_=.5*l.buffer/l.extent,w=.5-_,k=.5+_,M=1+_;g=m=v=y=null,x=At(t,u,r-_,r+k,0,f.minX,f.maxX,l),b=At(t,u,r+w,r+M,0,f.minX,f.maxX,l),t=null,x&&(g=At(x,u,n-_,n+k,1,f.minY,f.maxY,l),m=At(x,u,n+w,n+M,1,f.minY,f.maxY,l),x=null),b&&(v=At(b,u,n-_,n+k,1,f.minY,f.maxY,l),y=At(b,u,n+w,n+M,1,f.minY,f.maxY,l),b=null),c>1&&console.timeEnd("clipping"),s.push(g||[],e+1,2*r,2*n),s.push(m||[],e+1,2*r,2*n+1),s.push(v||[],e+1,2*r+1,2*n),s.push(y||[],e+1,2*r+1,2*n+1)}}},jt.prototype.getTile=function(t,e,r){var n=this.options,i=n.extent,a=n.debug;if(t<0||t>24)return null;var o=1<<t,s=Vt(t,e=(e%o+o)%o,r);if(this.tiles[s])return Dt(this.tiles[s],i);a>1&&console.log("drilling down to z%d-%d-%d",t,e,r);for(var l,c=t,u=e,h=r;!l&&c>0;)c--,u=Math.floor(u/2),h=Math.floor(h/2),l=this.tiles[Vt(c,u,h)];return l&&l.source?(a>1&&console.log("found parent tile z%d-%d-%d",c,u,h),a>1&&console.time("drilling down"),this.splitTile(l.source,c,u,h,t,e,r),a>1&&console.timeEnd("drilling down"),this.tiles[s]?Dt(this.tiles[s],i):null):null};var qt=function(e){function r(t,r,n){e.call(this,t,r,Ut),n&&(this.loadGeoJSON=n)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.loadData=function(t,e){this._pendingCallback&&this._pendingCallback(null,{abandoned:!0}),this._pendingCallback=e,this._pendingLoadDataParams=t,this._state&&"Idle"!==this._state?this._state="NeedsLoadData":(this._state="Coalescing",this._loadData())},r.prototype._loadData=function(){var t=this;if(this._pendingCallback&&this._pendingLoadDataParams){var e=this._pendingCallback,r=this._pendingLoadDataParams;delete this._pendingCallback,delete this._pendingLoadDataParams,this.loadGeoJSON(r,function(n,i){if(n||!i)return e(n);if("object"!=typeof i)return e(new Error("Input data is not a valid GeoJSON object."));!function t(e,r){switch(e&&e.type||null){case"FeatureCollection":return e.features=e.features.map(z(t,r)),e;case"Feature":return e.geometry=t(e.geometry,r),e;case"Polygon":case"MultiPolygon":return function(t,e){return"Polygon"===t.type?t.coordinates=P(t.coordinates,e):"MultiPolygon"===t.type&&(t.coordinates=t.coordinates.map(z(P,e))),t}(e,r);default:return e}}(i,!0);try{t._geoJSONIndex=r.cluster?function(t){return new ot(t)}(r.superclusterOptions).load(i.features):new jt(i,r.geojsonVtOptions)}catch(n){return e(n)}t.loaded={};var a={};if(r.request&&r.request.collectResourceTiming){var o=w(r.request.url);o&&(a.resourceTiming={},a.resourceTiming[r.source]=JSON.parse(JSON.stringify(o)))}e(null,a)})}},r.prototype.coalesce=function(){"Coalescing"===this._state?this._state="Idle":"NeedsLoadData"===this._state&&(this._state="Coalescing",this._loadData())},r.prototype.reloadTile=function(t,r){var n=this.loaded,i=t.uid;return n&&n[i]?e.prototype.reloadTile.call(this,t,r):this.loadTile(t,r)},r.prototype.loadGeoJSON=function(e,r){if(e.request)t.getJSON(e.request,r);else{if("string"!=typeof e.data)return r(new Error("Input data is not a valid GeoJSON object."));try{return r(null,JSON.parse(e.data))}catch(t){return r(new Error("Input data is not a valid GeoJSON object."))}}},r.prototype.removeSource=function(t,e){this._pendingCallback&&this._pendingCallback(null,{abandoned:!0}),e()},r}(M),Ht=function(e){var r=this;this.self=e,this.actor=new t.default$7(e,this),this.layerIndexes={},this.workerSourceTypes={vector:M,geojson:qt},this.workerSources={},this.demWorkerSources={},this.self.registerWorkerSource=function(t,e){if(r.workerSourceTypes[t])throw new Error('Worker source with name "'+t+'" already registered.');r.workerSourceTypes[t]=e},this.self.registerRTLTextPlugin=function(e){if(t.plugin.isLoaded())throw new Error("RTL text plugin already registered.");t.plugin.applyArabicShaping=e.applyArabicShaping,t.plugin.processBidirectionalText=e.processBidirectionalText}};return Ht.prototype.setLayers=function(t,e,r){this.getLayerIndex(t).replace(e),r()},Ht.prototype.updateLayers=function(t,e,r){this.getLayerIndex(t).update(e.layers,e.removedIds),r()},Ht.prototype.loadTile=function(t,e,r){this.getWorkerSource(t,e.type,e.source).loadTile(e,r)},Ht.prototype.loadDEMTile=function(t,e,r){this.getDEMWorkerSource(t,e.source).loadTile(e,r)},Ht.prototype.reloadTile=function(t,e,r){this.getWorkerSource(t,e.type,e.source).reloadTile(e,r)},Ht.prototype.abortTile=function(t,e,r){this.getWorkerSource(t,e.type,e.source).abortTile(e,r)},Ht.prototype.removeTile=function(t,e,r){this.getWorkerSource(t,e.type,e.source).removeTile(e,r)},Ht.prototype.removeDEMTile=function(t,e){this.getDEMWorkerSource(t,e.source).removeTile(e)},Ht.prototype.removeSource=function(t,e,r){if(this.workerSources[t]&&this.workerSources[t][e.type]&&this.workerSources[t][e.type][e.source]){var n=this.workerSources[t][e.type][e.source];delete this.workerSources[t][e.type][e.source],void 0!==n.removeSource?n.removeSource(e,r):r()}},Ht.prototype.loadWorkerSource=function(t,e,r){try{this.self.importScripts(e.url),r()}catch(t){r(t.toString())}},Ht.prototype.loadRTLTextPlugin=function(e,r,n){try{t.plugin.isLoaded()||(this.self.importScripts(r),n(t.plugin.isLoaded()?null:new Error("RTL Text Plugin failed to import scripts from "+r)))}catch(t){n(t.toString())}},Ht.prototype.getLayerIndex=function(t){var e=this.layerIndexes[t];return e||(e=this.layerIndexes[t]=new n),e},Ht.prototype.getWorkerSource=function(t,e,r){var n=this;if(this.workerSources[t]||(this.workerSources[t]={}),this.workerSources[t][e]||(this.workerSources[t][e]={}),!this.workerSources[t][e][r]){var i={send:function(e,r,i){n.actor.send(e,r,i,t)}};this.workerSources[t][e][r]=new this.workerSourceTypes[e](i,this.getLayerIndex(t))}return this.workerSources[t][e][r]},Ht.prototype.getDEMWorkerSource=function(t,e){return this.demWorkerSources[t]||(this.demWorkerSources[t]={}),this.demWorkerSources[t][e]||(this.demWorkerSources[t][e]=new A),this.demWorkerSources[t][e]},"undefined"!=typeof WorkerGlobalScope&&"undefined"!=typeof self&&self instanceof WorkerGlobalScope&&new Ht(self),Ht}),i(0,function(t){var e=t.createCommonjsModule(function(t){function e(t){return!!("undefined"!=typeof window&&"undefined"!=typeof document&&Array.prototype&&Array.prototype.every&&Array.prototype.filter&&Array.prototype.forEach&&Array.prototype.indexOf&&Array.prototype.lastIndexOf&&Array.prototype.map&&Array.prototype.some&&Array.prototype.reduce&&Array.prototype.reduceRight&&Array.isArray&&Function.prototype&&Function.prototype.bind&&Object.keys&&Object.create&&Object.getPrototypeOf&&Object.getOwnPropertyNames&&Object.isSealed&&Object.isFrozen&&Object.isExtensible&&Object.getOwnPropertyDescriptor&&Object.defineProperty&&Object.defineProperties&&Object.seal&&Object.freeze&&Object.preventExtensions&&"JSON"in window&&"parse"in JSON&&"stringify"in JSON&&function(){if(!("Worker"in window&&"Blob"in window&&"URL"in window))return!1;var t,e,r=new Blob([""],{type:"text/javascript"}),n=URL.createObjectURL(r);try{e=new Worker(n),t=!0}catch(e){t=!1}return e&&e.terminate(),URL.revokeObjectURL(n),t}()&&"Uint8ClampedArray"in window&&function(t){return void 0===r[t]&&(r[t]=function(t){var r=document.createElement("canvas"),n=Object.create(e.webGLContextAttributes);return n.failIfMajorPerformanceCaveat=t,r.probablySupportsContext?r.probablySupportsContext("webgl",n)||r.probablySupportsContext("experimental-webgl",n):r.supportsContext?r.supportsContext("webgl",n)||r.supportsContext("experimental-webgl",n):r.getContext("webgl",n)||r.getContext("experimental-webgl",n)}(t)),r[t]}(t&&t.failIfMajorPerformanceCaveat))}t.exports?t.exports=e:window&&(window.mapboxgl=window.mapboxgl||{},window.mapboxgl.supported=e);var r={};e.webGLContextAttributes={antialias:!1,alpha:!0,stencil:!0,depth:!0}}),r=t.default.performance&&t.default.performance.now?t.default.performance.now.bind(t.default.performance):Date.now.bind(Date),n=t.default.requestAnimationFrame||t.default.mozRequestAnimationFrame||t.default.webkitRequestAnimationFrame||t.default.msRequestAnimationFrame,i=t.default.cancelAnimationFrame||t.default.mozCancelAnimationFrame||t.default.webkitCancelAnimationFrame||t.default.msCancelAnimationFrame,a={now:r,frame:function(t){return n(t)},cancelFrame:function(t){return i(t)},getImageData:function(e){var r=t.default.document.createElement("canvas"),n=r.getContext("2d");if(!n)throw new Error("failed to create canvas 2d context");return r.width=e.width,r.height=e.height,n.drawImage(e,0,0,e.width,e.height),n.getImageData(0,0,e.width,e.height)},hardwareConcurrency:t.default.navigator.hardwareConcurrency||4,get devicePixelRatio(){return t.default.devicePixelRatio},supportsWebp:!1};if(t.default.document){var o=t.default.document.createElement("img");o.onload=function(){a.supportsWebp=!0},o.src="data:image/webp;base64,UklGRh4AAABXRUJQVlA4TBEAAAAvAQAAAAfQ//73v/+BiOh/AAA="}var s={create:function(e,r,n){var i=t.default.document.createElement(e);return r&&(i.className=r),n&&n.appendChild(i),i},createNS:function(e,r){return t.default.document.createElementNS(e,r)}},l=t.default.document?t.default.document.documentElement.style:null;function c(t){if(!l)return null;for(var e=0;e<t.length;e++)if(t[e]in l)return t[e];return t[0]}var u,h=c(["userSelect","MozUserSelect","WebkitUserSelect","msUserSelect"]);s.disableDrag=function(){l&&h&&(u=l[h],l[h]="none")},s.enableDrag=function(){l&&h&&(l[h]=u)};var f=c(["transform","WebkitTransform"]);s.setTransform=function(t,e){t.style[f]=e};var p=!1;try{var d=Object.defineProperty({},"passive",{get:function(){p=!0}});t.default.addEventListener("test",d,d),t.default.removeEventListener("test",d,d)}catch(t){p=!1}s.addEventListener=function(t,e,r,n){void 0===n&&(n={}),"passive"in n&&p?t.addEventListener(e,r,n):t.addEventListener(e,r,n.capture)},s.removeEventListener=function(t,e,r,n){void 0===n&&(n={}),"passive"in n&&p?t.removeEventListener(e,r,n):t.removeEventListener(e,r,n.capture)};var g=function(e){e.preventDefault(),e.stopPropagation(),t.default.removeEventListener("click",g,!0)};s.suppressClick=function(){t.default.addEventListener("click",g,!0),t.default.setTimeout(function(){t.default.removeEventListener("click",g,!0)},0)},s.mousePos=function(e,r){var n=e.getBoundingClientRect();return r=r.touches?r.touches[0]:r,new t.default$1(r.clientX-n.left-e.clientLeft,r.clientY-n.top-e.clientTop)},s.touchPos=function(e,r){for(var n=e.getBoundingClientRect(),i=[],a="touchend"===r.type?r.changedTouches:r.touches,o=0;o<a.length;o++)i.push(new t.default$1(a[o].clientX-n.left-e.clientLeft,a[o].clientY-n.top-e.clientTop));return i},s.mouseButton=function(e){return void 0!==t.default.InstallTrigger&&2===e.button&&e.ctrlKey&&t.default.navigator.platform.toUpperCase().indexOf("MAC")>=0?0:e.button},s.remove=function(t){t.parentNode&&t.parentNode.removeChild(t)};var m={API_URL:"https://api.mapbox.com",REQUIRE_ACCESS_TOKEN:!0,ACCESS_TOKEN:null},v="See https://www.mapbox.com/api-documentation/#access-tokens";function y(t,e){var r=A(m.API_URL);if(t.protocol=r.protocol,t.authority=r.authority,"/"!==r.path&&(t.path=""+r.path+t.path),!m.REQUIRE_ACCESS_TOKEN)return T(t);if(!(e=e||m.ACCESS_TOKEN))throw new Error("An API access token is required to use Mapbox GL. "+v);if("s"===e[0])throw new Error("Use a public access token (pk.*) with Mapbox GL, not a secret access token (sk.*). "+v);return t.params.push("access_token="+e),T(t)}function x(t){return 0===t.indexOf("mapbox:")}var b=function(t,e){if(!x(t))return t;var r=A(t);return r.path="/v4/"+r.authority+".json",r.params.push("secure"),y(r,e)},_=function(t,e,r,n){var i=A(t);return x(t)?(i.path="/styles/v1"+i.path+"/sprite"+e+r,y(i,n)):(i.path+=""+e+r,T(i))},w=/(\.(png|jpg)\d*)(?=$)/,k=function(t,e,r){if(!e||!x(e))return t;var n=A(t),i=a.devicePixelRatio>=2||512===r?"@2x":"",o=a.supportsWebp?".webp":"$1";return n.path=n.path.replace(w,""+i+o),function(t){for(var e=0;e<t.length;e++)0===t[e].indexOf("access_token=tk.")&&(t[e]="access_token="+(m.ACCESS_TOKEN||""))}(n.params),T(n)},M=/^(\w+):\/\/([^/?]*)(\/[^?]+)?\??(.+)?/;function A(t){var e=t.match(M);if(!e)throw new Error("Unable to parse URL object");return{protocol:e[1],authority:e[2],path:e[3]||"/",params:e[4]?e[4].split("&"):[]}}function T(t){var e=t.params.length?"?"+t.params.join("&"):"";return t.protocol+"://"+t.authority+t.path+e}var S=t.default.HTMLImageElement,E=t.default.HTMLCanvasElement,C=t.default.HTMLVideoElement,L=t.default.ImageData,z=function(t,e,r,n){this.context=t,this.format=r,this.texture=t.gl.createTexture(),this.update(e,n)};z.prototype.update=function(t,e){var r=t.width,n=t.height,i=!this.size||this.size[0]!==r||this.size[1]!==n,a=this.context,o=a.gl;this.useMipmap=Boolean(e&&e.useMipmap),o.bindTexture(o.TEXTURE_2D,this.texture),i?(this.size=[r,n],a.pixelStoreUnpack.set(1),this.format!==o.RGBA||e&&!1===e.premultiply||a.pixelStoreUnpackPremultiplyAlpha.set(!0),t instanceof S||t instanceof E||t instanceof C||t instanceof L?o.texImage2D(o.TEXTURE_2D,0,this.format,this.format,o.UNSIGNED_BYTE,t):o.texImage2D(o.TEXTURE_2D,0,this.format,r,n,0,this.format,o.UNSIGNED_BYTE,t.data)):t instanceof S||t instanceof E||t instanceof C||t instanceof L?o.texSubImage2D(o.TEXTURE_2D,0,0,0,o.RGBA,o.UNSIGNED_BYTE,t):o.texSubImage2D(o.TEXTURE_2D,0,0,0,r,n,o.RGBA,o.UNSIGNED_BYTE,t.data),this.useMipmap&&this.isSizePowerOfTwo()&&o.generateMipmap(o.TEXTURE_2D)},z.prototype.bind=function(t,e,r){var n=this.context.gl;n.bindTexture(n.TEXTURE_2D,this.texture),r!==n.LINEAR_MIPMAP_NEAREST||this.isSizePowerOfTwo()||(r=n.LINEAR),t!==this.filter&&(n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,t),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,r||t),this.filter=t),e!==this.wrap&&(n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,e),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,e),this.wrap=e)},z.prototype.isSizePowerOfTwo=function(){return this.size[0]===this.size[1]&&Math.log(this.size[0])/Math.LN2%1==0},z.prototype.destroy=function(){this.context.gl.deleteTexture(this.texture),this.texture=null};var P=function(){this.images={},this.loaded=!1,this.requestors=[],this.shelfPack=new t.default$2(64,64,{autoResize:!0}),this.patterns={},this.atlasImage=new t.RGBAImage({width:64,height:64}),this.dirty=!0};P.prototype.isLoaded=function(){return this.loaded},P.prototype.setLoaded=function(t){if(this.loaded!==t&&(this.loaded=t,t)){for(var e=0,r=this.requestors;e<r.length;e+=1){var n=r[e],i=n.ids,a=n.callback;this._notify(i,a)}this.requestors=[]}},P.prototype.getImage=function(t){return this.images[t]},P.prototype.addImage=function(t,e){this.images[t]=e},P.prototype.removeImage=function(t){delete this.images[t];var e=this.patterns[t];e&&(this.shelfPack.unref(e.bin),delete this.patterns[t])},P.prototype.getImages=function(t,e){var r=!0;if(!this.isLoaded())for(var n=0,i=t;n<i.length;n+=1){var a=i[n];this.images[a]||(r=!1)}this.isLoaded()||r?this._notify(t,e):this.requestors.push({ids:t,callback:e})},P.prototype._notify=function(t,e){for(var r={},n=0,i=t;n<i.length;n+=1){var a=i[n],o=this.images[a];o&&(r[a]={data:o.data.clone(),pixelRatio:o.pixelRatio,sdf:o.sdf})}e(null,r)},P.prototype.getPixelSize=function(){return{width:this.shelfPack.w,height:this.shelfPack.h}},P.prototype.getPattern=function(e){var r=this.patterns[e];if(r)return r.position;var n=this.getImage(e);if(!n)return null;var i=n.data.width+2,a=n.data.height+2,o=this.shelfPack.packOne(i,a);if(!o)return null;this.atlasImage.resize(this.getPixelSize());var s=n.data,l=this.atlasImage,c=o.x+1,u=o.y+1,h=s.width,f=s.height;t.RGBAImage.copy(s,l,{x:0,y:0},{x:c,y:u},{width:h,height:f}),t.RGBAImage.copy(s,l,{x:0,y:f-1},{x:c,y:u-1},{width:h,height:1}),t.RGBAImage.copy(s,l,{x:0,y:0},{x:c,y:u+f},{width:h,height:1}),t.RGBAImage.copy(s,l,{x:h-1,y:0},{x:c-1,y:u},{width:1,height:f}),t.RGBAImage.copy(s,l,{x:0,y:0},{x:c+h,y:u},{width:1,height:f}),this.dirty=!0;var p=new t.ImagePosition(o,n);return this.patterns[e]={bin:o,position:p},p},P.prototype.bind=function(t){var e=t.gl;this.atlasTexture?this.dirty&&(this.atlasTexture.update(this.atlasImage),this.dirty=!1):this.atlasTexture=new z(t,this.atlasImage,e.RGBA),this.atlasTexture.bind(e.LINEAR,e.CLAMP_TO_EDGE)};var I=D,O=1e20;function D(t,e,r,n,i,a){this.fontSize=t||24,this.buffer=void 0===e?3:e,this.cutoff=n||.25,this.fontFamily=i||"sans-serif",this.fontWeight=a||"normal",this.radius=r||8;var o=this.size=this.fontSize+2*this.buffer;this.canvas=document.createElement("canvas"),this.canvas.width=this.canvas.height=o,this.ctx=this.canvas.getContext("2d"),this.ctx.font=this.fontWeight+" "+this.fontSize+"px "+this.fontFamily,this.ctx.textBaseline="middle",this.ctx.fillStyle="black",this.gridOuter=new Float64Array(o*o),this.gridInner=new Float64Array(o*o),this.f=new Float64Array(o),this.d=new Float64Array(o),this.z=new Float64Array(o+1),this.v=new Int16Array(o),this.middle=Math.round(o/2*(navigator.userAgent.indexOf("Gecko/")>=0?1.2:1))}function R(t,e,r,n,i,a,o){for(var s=0;s<e;s++){for(var l=0;l<r;l++)n[l]=t[l*e+s];for(B(n,i,a,o,r),l=0;l<r;l++)t[l*e+s]=i[l]}for(l=0;l<r;l++){for(s=0;s<e;s++)n[s]=t[l*e+s];for(B(n,i,a,o,e),s=0;s<e;s++)t[l*e+s]=Math.sqrt(i[s])}}function B(t,e,r,n,i){r[0]=0,n[0]=-O,n[1]=+O;for(var a=1,o=0;a<i;a++){for(var s=(t[a]+a*a-(t[r[o]]+r[o]*r[o]))/(2*a-2*r[o]);s<=n[o];)o--,s=(t[a]+a*a-(t[r[o]]+r[o]*r[o]))/(2*a-2*r[o]);r[++o]=a,n[o]=s,n[o+1]=+O}for(a=0,o=0;a<i;a++){for(;n[o+1]<a;)o++;e[a]=(a-r[o])*(a-r[o])+t[r[o]]}}D.prototype.draw=function(t){this.ctx.clearRect(0,0,this.size,this.size),this.ctx.fillText(t,this.buffer,this.middle);for(var e=this.ctx.getImageData(0,0,this.size,this.size),r=new Uint8ClampedArray(this.size*this.size),n=0;n<this.size*this.size;n++){var i=e.data[4*n+3]/255;this.gridOuter[n]=1===i?0:0===i?O:Math.pow(Math.max(0,.5-i),2),this.gridInner[n]=1===i?O:0===i?0:Math.pow(Math.max(0,i-.5),2)}for(R(this.gridOuter,this.size,this.size,this.f,this.d,this.v,this.z),R(this.gridInner,this.size,this.size,this.f,this.d,this.v,this.z),n=0;n<this.size*this.size;n++){var a=this.gridOuter[n]-this.gridInner[n];r[n]=Math.max(0,Math.min(255,Math.round(255-255*(a/this.radius+this.cutoff))))}return r};var F=function(t,e){this.requestTransform=t,this.localIdeographFontFamily=e,this.entries={}};F.prototype.setURL=function(t){this.url=t},F.prototype.getGlyphs=function(e,r){var n=this,i=[];for(var a in e)for(var o=0,s=e[a];o<s.length;o+=1){var l=s[o];i.push({stack:a,id:l})}t.asyncAll(i,function(t,e){var r=t.stack,i=t.id,a=n.entries[r];a||(a=n.entries[r]={glyphs:{},requests:{}});var o=a.glyphs[i];if(void 0===o)if(o=n._tinySDF(a,r,i))e(null,{stack:r,id:i,glyph:o});else{var s=Math.floor(i/256);if(256*s>65535)e(new Error("glyphs > 65535 not supported"));else{var l=a.requests[s];l||(l=a.requests[s]=[],F.loadGlyphRange(r,s,n.url,n.requestTransform,function(t,e){if(e)for(var r in e)a.glyphs[+r]=e[+r];for(var n=0,i=l;n<i.length;n+=1)(0,i[n])(t,e);delete a.requests[s]})),l.push(function(t,n){t?e(t):n&&e(null,{stack:r,id:i,glyph:n[i]||null})})}}else e(null,{stack:r,id:i,glyph:o})},function(t,e){if(t)r(t);else if(e){for(var n={},i=0,a=e;i<a.length;i+=1){var o=a[i],s=o.stack,l=o.id,c=o.glyph;(n[s]||(n[s]={}))[l]=c&&{id:c.id,bitmap:c.bitmap.clone(),metrics:c.metrics}}r(null,n)}})},F.prototype._tinySDF=function(e,r,n){var i=this.localIdeographFontFamily;if(i&&(t.default$4["CJK Unified Ideographs"](n)||t.default$4["Hangul Syllables"](n))){var a=e.tinySDF;if(!a){var o="400";/bold/i.test(r)?o="900":/medium/i.test(r)?o="500":/light/i.test(r)&&(o="200"),a=e.tinySDF=new F.TinySDF(24,3,8,.25,i,o)}return{id:n,bitmap:new t.AlphaImage({width:30,height:30},a.draw(String.fromCharCode(n))),metrics:{width:24,height:24,left:0,top:-8,advance:24}}}},F.loadGlyphRange=function(e,r,n,i,a){var o=256*r,s=o+255,l=i(function(t,e){if(!x(t))return t;var r=A(t);return r.path="/fonts/v1"+r.path,y(r,e)}(n).replace("{fontstack}",e).replace("{range}",o+"-"+s),t.ResourceType.Glyphs);t.getArrayBuffer(l,function(e,r){if(e)a(e);else if(r){for(var n={},i=0,o=t.default$3(r.data);i<o.length;i+=1){var s=o[i];n[s.id]=s}a(null,n)}})},F.TinySDF=I;var N=function(){this.specification=t.default$5.light.position};N.prototype.possiblyEvaluate=function(e,r){return t.sphericalToCartesian(e.expression.evaluate(r))},N.prototype.interpolate=function(e,r,n){return{x:t.number(e.x,r.x,n),y:t.number(e.y,r.y,n),z:t.number(e.z,r.z,n)}};var j=new t.Properties({anchor:new t.DataConstantProperty(t.default$5.light.anchor),position:new N,color:new t.DataConstantProperty(t.default$5.light.color),intensity:new t.DataConstantProperty(t.default$5.light.intensity)}),V=function(e){function r(r){e.call(this),this._transitionable=new t.Transitionable(j),this.setLight(r),this._transitioning=this._transitionable.untransitioned()}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.getLight=function(){return this._transitionable.serialize()},r.prototype.setLight=function(e){if(!this._validate(t.validateLight,e))for(var r in e){var n=e[r];t.endsWith(r,"-transition")?this._transitionable.setTransition(r.slice(0,-"-transition".length),n):this._transitionable.setValue(r,n)}},r.prototype.updateTransitions=function(t){this._transitioning=this._transitionable.transitioned(t,this._transitioning)},r.prototype.hasTransition=function(){return this._transitioning.hasTransition()},r.prototype.recalculate=function(t){this.properties=this._transitioning.possiblyEvaluate(t)},r.prototype._validate=function(e,r){return t.emitValidationErrors(this,e.call(t.validateStyle,t.extend({value:r,style:{glyphs:!0,sprite:!0},styleSpec:t.default$5})))},r}(t.Evented),U=function(t,e){this.width=t,this.height=e,this.nextRow=0,this.bytes=4,this.data=new Uint8Array(this.width*this.height*this.bytes),this.positions={}};U.prototype.getDash=function(t,e){var r=t.join(",")+String(e);return this.positions[r]||(this.positions[r]=this.addDash(t,e)),this.positions[r]},U.prototype.addDash=function(e,r){var n=r?7:0,i=2*n+1;if(this.nextRow+i>this.height)return t.warnOnce("LineAtlas out of space"),null;for(var a=0,o=0;o<e.length;o++)a+=e[o];for(var s=this.width/a,l=s/2,c=e.length%2==1,u=-n;u<=n;u++)for(var h=this.nextRow+n+u,f=this.width*h,p=c?-e[e.length-1]:0,d=e[0],g=1,m=0;m<this.width;m++){for(;d<m/s;)p=d,d+=e[g],c&&g===e.length-1&&(d+=e[0]),g++;var v=Math.abs(m-p*s),y=Math.abs(m-d*s),x=Math.min(v,y),b=g%2==1,_=void 0;if(r){var w=n?u/n*(l+1):0;if(b){var k=l-Math.abs(w);_=Math.sqrt(x*x+k*k)}else _=l-Math.sqrt(x*x+w*w)}else _=(b?1:-1)*x;this.data[3+4*(f+m)]=Math.max(0,Math.min(255,_+128))}var M={y:(this.nextRow+n+.5)/this.height,height:2*n/this.height,width:a};return this.nextRow+=i,this.dirty=!0,M},U.prototype.bind=function(t){var e=t.gl;this.texture?(e.bindTexture(e.TEXTURE_2D,this.texture),this.dirty&&(this.dirty=!1,e.texSubImage2D(e.TEXTURE_2D,0,0,0,this.width,this.height,e.RGBA,e.UNSIGNED_BYTE,this.data))):(this.texture=e.createTexture(),e.bindTexture(e.TEXTURE_2D,this.texture),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_S,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_WRAP_T,e.REPEAT),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MIN_FILTER,e.LINEAR),e.texParameteri(e.TEXTURE_2D,e.TEXTURE_MAG_FILTER,e.LINEAR),e.texImage2D(e.TEXTURE_2D,0,e.RGBA,this.width,this.height,0,e.RGBA,e.UNSIGNED_BYTE,this.data))};var q=function e(r,n){this.workerPool=r,this.actors=[],this.currentActor=0,this.id=t.uniqueId();for(var i=this.workerPool.acquire(this.id),a=0;a<i.length;a++){var o=i[a],s=new e.Actor(o,n,this.id);s.name="Worker "+a,this.actors.push(s)}};function H(e,r,n){var i=function(e,r){if(e)return n(e);if(r){var i=t.pick(r,["tiles","minzoom","maxzoom","attribution","mapbox_logo","bounds"]);r.vector_layers&&(i.vectorLayers=r.vector_layers,i.vectorLayerIds=i.vectorLayers.map(function(t){return t.id})),n(null,i)}};e.url?t.getJSON(r(b(e.url),t.ResourceType.Source),i):a.frame(function(){return i(null,e)})}q.prototype.broadcast=function(e,r,n){n=n||function(){},t.asyncAll(this.actors,function(t,n){t.send(e,r,n)},n)},q.prototype.send=function(t,e,r,n){return("number"!=typeof n||isNaN(n))&&(n=this.currentActor=(this.currentActor+1)%this.actors.length),this.actors[n].send(t,e,r),n},q.prototype.remove=function(){this.actors.forEach(function(t){t.remove()}),this.actors=[],this.workerPool.release(this.id)},q.Actor=t.default$7;var G=function(t,e){if(isNaN(t)||isNaN(e))throw new Error("Invalid LngLat object: ("+t+", "+e+")");if(this.lng=+t,this.lat=+e,this.lat>90||this.lat<-90)throw new Error("Invalid LngLat latitude value: must be between -90 and 90")};G.prototype.wrap=function(){return new G(t.wrap(this.lng,-180,180),this.lat)},G.prototype.toArray=function(){return[this.lng,this.lat]},G.prototype.toString=function(){return"LngLat("+this.lng+", "+this.lat+")"},G.prototype.toBounds=function(t){var e=360*t/40075017,r=e/Math.cos(Math.PI/180*this.lat);return new W(new G(this.lng-r,this.lat-e),new G(this.lng+r,this.lat+e))},G.convert=function(t){if(t instanceof G)return t;if(Array.isArray(t)&&(2===t.length||3===t.length))return new G(Number(t[0]),Number(t[1]));if(!Array.isArray(t)&&"object"==typeof t&&null!==t)return new G(Number(t.lng),Number(t.lat));throw new Error("`LngLatLike` argument must be specified as a LngLat instance, an object {lng: <lng>, lat: <lat>}, or an array of [<lng>, <lat>]")};var W=function(t,e){t&&(e?this.setSouthWest(t).setNorthEast(e):4===t.length?this.setSouthWest([t[0],t[1]]).setNorthEast([t[2],t[3]]):this.setSouthWest(t[0]).setNorthEast(t[1]))};W.prototype.setNorthEast=function(t){return this._ne=t instanceof G?new G(t.lng,t.lat):G.convert(t),this},W.prototype.setSouthWest=function(t){return this._sw=t instanceof G?new G(t.lng,t.lat):G.convert(t),this},W.prototype.extend=function(t){var e,r,n=this._sw,i=this._ne;if(t instanceof G)e=t,r=t;else{if(!(t instanceof W))return Array.isArray(t)?t.every(Array.isArray)?this.extend(W.convert(t)):this.extend(G.convert(t)):this;if(e=t._sw,r=t._ne,!e||!r)return this}return n||i?(n.lng=Math.min(e.lng,n.lng),n.lat=Math.min(e.lat,n.lat),i.lng=Math.max(r.lng,i.lng),i.lat=Math.max(r.lat,i.lat)):(this._sw=new G(e.lng,e.lat),this._ne=new G(r.lng,r.lat)),this},W.prototype.getCenter=function(){return new G((this._sw.lng+this._ne.lng)/2,(this._sw.lat+this._ne.lat)/2)},W.prototype.getSouthWest=function(){return this._sw},W.prototype.getNorthEast=function(){return this._ne},W.prototype.getNorthWest=function(){return new G(this.getWest(),this.getNorth())},W.prototype.getSouthEast=function(){return new G(this.getEast(),this.getSouth())},W.prototype.getWest=function(){return this._sw.lng},W.prototype.getSouth=function(){return this._sw.lat},W.prototype.getEast=function(){return this._ne.lng},W.prototype.getNorth=function(){return this._ne.lat},W.prototype.toArray=function(){return[this._sw.toArray(),this._ne.toArray()]},W.prototype.toString=function(){return"LngLatBounds("+this._sw.toString()+", "+this._ne.toString()+")"},W.prototype.isEmpty=function(){return!(this._sw&&this._ne)},W.convert=function(t){return!t||t instanceof W?t:new W(t)};var Y=function(t,e,r){this.bounds=W.convert(this.validateBounds(t)),this.minzoom=e||0,this.maxzoom=r||24};Y.prototype.validateBounds=function(t){return Array.isArray(t)&&4===t.length?[Math.max(-180,t[0]),Math.max(-90,t[1]),Math.min(180,t[2]),Math.min(90,t[3])]:[-180,-90,180,90]},Y.prototype.contains=function(t){var e=Math.floor(this.lngX(this.bounds.getWest(),t.z)),r=Math.floor(this.latY(this.bounds.getNorth(),t.z)),n=Math.ceil(this.lngX(this.bounds.getEast(),t.z)),i=Math.ceil(this.latY(this.bounds.getSouth(),t.z));return t.x>=e&&t.x<n&&t.y>=r&&t.y<i},Y.prototype.lngX=function(t,e){return(t+180)*(Math.pow(2,e)/360)},Y.prototype.latY=function(e,r){var n=t.clamp(Math.sin(Math.PI/180*e),-.9999,.9999),i=Math.pow(2,r)/(2*Math.PI);return Math.pow(2,r-1)+.5*Math.log((1+n)/(1-n))*-i};var X=function(e){function r(r,n,i,a){if(e.call(this),this.id=r,this.dispatcher=i,this.type="vector",this.minzoom=0,this.maxzoom=22,this.scheme="xyz",this.tileSize=512,this.reparseOverscaled=!0,this.isTileClipped=!0,t.extend(this,t.pick(n,["url","scheme","tileSize"])),this._options=t.extend({type:"vector"},n),this._collectResourceTiming=n.collectResourceTiming,512!==this.tileSize)throw new Error("vector tile sources must have a tileSize of 512");this.setEventedParent(a)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(){var e=this;this.fire(new t.Event("dataloading",{dataType:"source"})),H(this._options,this.map._transformRequest,function(r,n){r?e.fire(new t.ErrorEvent(r)):n&&(t.extend(e,n),n.bounds&&(e.tileBounds=new Y(n.bounds,e.minzoom,e.maxzoom)),e.fire(new t.Event("data",{dataType:"source",sourceDataType:"metadata"})),e.fire(new t.Event("data",{dataType:"source",sourceDataType:"content"})))})},r.prototype.hasTile=function(t){return!this.tileBounds||this.tileBounds.contains(t.canonical)},r.prototype.onAdd=function(t){this.map=t,this.load()},r.prototype.serialize=function(){return t.extend({},this._options)},r.prototype.loadTile=function(e,r){var n=k(e.tileID.canonical.url(this.tiles,this.scheme),this.url),i={request:this.map._transformRequest(n,t.ResourceType.Tile),uid:e.uid,tileID:e.tileID,zoom:e.tileID.overscaledZ,tileSize:this.tileSize*e.tileID.overscaleFactor(),type:this.type,source:this.id,pixelRatio:a.devicePixelRatio,showCollisionBoxes:this.map.showCollisionBoxes};function o(t,n){return e.aborted?r(null):t?r(t):(n&&n.resourceTiming&&(e.resourceTiming=n.resourceTiming),this.map._refreshExpiredTiles&&e.setExpiryData(n),e.loadVectorData(n,this.map.painter),r(null),void(e.reloadCallback&&(this.loadTile(e,e.reloadCallback),e.reloadCallback=null)))}i.request.collectResourceTiming=this._collectResourceTiming,void 0===e.workerID||"expired"===e.state?e.workerID=this.dispatcher.send("loadTile",i,o.bind(this)):"loading"===e.state?e.reloadCallback=r:this.dispatcher.send("reloadTile",i,o.bind(this),e.workerID)},r.prototype.abortTile=function(t){this.dispatcher.send("abortTile",{uid:t.uid,type:this.type,source:this.id},void 0,t.workerID)},r.prototype.unloadTile=function(t){t.unloadVectorData(),this.dispatcher.send("removeTile",{uid:t.uid,type:this.type,source:this.id},void 0,t.workerID)},r.prototype.hasTransition=function(){return!1},r}(t.Evented),Z=function(e){function r(r,n,i,a){e.call(this),this.id=r,this.dispatcher=i,this.setEventedParent(a),this.type="raster",this.minzoom=0,this.maxzoom=22,this.roundZoom=!0,this.scheme="xyz",this.tileSize=512,this._loaded=!1,this._options=t.extend({},n),t.extend(this,t.pick(n,["url","scheme","tileSize"]))}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(){var e=this;this.fire(new t.Event("dataloading",{dataType:"source"})),H(this._options,this.map._transformRequest,function(r,n){r?e.fire(new t.ErrorEvent(r)):n&&(t.extend(e,n),n.bounds&&(e.tileBounds=new Y(n.bounds,e.minzoom,e.maxzoom)),e.fire(new t.Event("data",{dataType:"source",sourceDataType:"metadata"})),e.fire(new t.Event("data",{dataType:"source",sourceDataType:"content"})))})},r.prototype.onAdd=function(t){this.map=t,this.load()},r.prototype.serialize=function(){return t.extend({},this._options)},r.prototype.hasTile=function(t){return!this.tileBounds||this.tileBounds.contains(t.canonical)},r.prototype.loadTile=function(e,r){var n=this,i=k(e.tileID.canonical.url(this.tiles,this.scheme),this.url,this.tileSize);e.request=t.getImage(this.map._transformRequest(i,t.ResourceType.Tile),function(t,i){if(delete e.request,e.aborted)e.state="unloaded",r(null);else if(t)e.state="errored",r(t);else if(i){n.map._refreshExpiredTiles&&e.setExpiryData(i),delete i.cacheControl,delete i.expires;var a=n.map.painter.context,o=a.gl;e.texture=n.map.painter.getTileTexture(i.width),e.texture?e.texture.update(i,{useMipmap:!0}):(e.texture=new z(a,i,o.RGBA,{useMipmap:!0}),e.texture.bind(o.LINEAR,o.CLAMP_TO_EDGE,o.LINEAR_MIPMAP_NEAREST),a.extTextureFilterAnisotropic&&o.texParameterf(o.TEXTURE_2D,a.extTextureFilterAnisotropic.TEXTURE_MAX_ANISOTROPY_EXT,a.extTextureFilterAnisotropicMax)),e.state="loaded",r(null)}})},r.prototype.abortTile=function(t,e){t.request&&(t.request.abort(),delete t.request),e()},r.prototype.unloadTile=function(t,e){t.texture&&this.map.painter.saveTileTexture(t.texture),e()},r.prototype.hasTransition=function(){return!1},r}(t.Evented),$=function(e){function r(r,n,i,a){e.call(this,r,n,i,a),this.type="raster-dem",this.maxzoom=22,this._options=t.extend({},n),this.encoding=n.encoding||"mapbox"}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.serialize=function(){return{type:"raster-dem",url:this.url,tileSize:this.tileSize,tiles:this.tiles,bounds:this.bounds,encoding:this.encoding}},r.prototype.loadTile=function(e,r){var n=k(e.tileID.canonical.url(this.tiles,this.scheme),this.url,this.tileSize);e.request=t.getImage(this.map._transformRequest(n,t.ResourceType.Tile),function(t,n){if(delete e.request,e.aborted)e.state="unloaded",r(null);else if(t)e.state="errored",r(t);else if(n){this.map._refreshExpiredTiles&&e.setExpiryData(n),delete n.cacheControl,delete n.expires;var i=a.getImageData(n),o={uid:e.uid,coord:e.tileID,source:this.id,rawImageData:i,encoding:this.encoding};e.workerID&&"expired"!==e.state||(e.workerID=this.dispatcher.send("loadDEMTile",o,function(t,n){t&&(e.state="errored",r(t)),n&&(e.dem=n,e.needsHillshadePrepare=!0,e.state="loaded",r(null))}.bind(this)))}}.bind(this)),e.neighboringTiles=this._getNeighboringTiles(e.tileID)},r.prototype._getNeighboringTiles=function(e){var r=e.canonical,n=Math.pow(2,r.z),i=(r.x-1+n)%n,a=0===r.x?e.wrap-1:e.wrap,o=(r.x+1+n)%n,s=r.x+1===n?e.wrap+1:e.wrap,l={};return l[new t.OverscaledTileID(e.overscaledZ,a,r.z,i,r.y).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,s,r.z,o,r.y).key]={backfilled:!1},r.y>0&&(l[new t.OverscaledTileID(e.overscaledZ,a,r.z,i,r.y-1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,e.wrap,r.z,r.x,r.y-1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,s,r.z,o,r.y-1).key]={backfilled:!1}),r.y+1<n&&(l[new t.OverscaledTileID(e.overscaledZ,a,r.z,i,r.y+1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,e.wrap,r.z,r.x,r.y+1).key]={backfilled:!1},l[new t.OverscaledTileID(e.overscaledZ,s,r.z,o,r.y+1).key]={backfilled:!1}),l},r.prototype.unloadTile=function(t){t.demTexture&&this.map.painter.saveTileTexture(t.demTexture),t.fbo&&(t.fbo.destroy(),delete t.fbo),t.dem&&delete t.dem,delete t.neighboringTiles,t.state="unloaded",this.dispatcher.send("removeDEMTile",{uid:t.uid,source:this.id},void 0,t.workerID)},r}(Z),J=function(e){function r(r,n,i,a){e.call(this),this.id=r,this.type="geojson",this.minzoom=0,this.maxzoom=18,this.tileSize=512,this.isTileClipped=!0,this.reparseOverscaled=!0,this._removed=!1,this.dispatcher=i,this.setEventedParent(a),this._data=n.data,this._options=t.extend({},n),this._collectResourceTiming=n.collectResourceTiming,this._resourceTiming=[],void 0!==n.maxzoom&&(this.maxzoom=n.maxzoom),n.type&&(this.type=n.type);var o=t.default$8/this.tileSize;this.workerOptions=t.extend({source:this.id,cluster:n.cluster||!1,geojsonVtOptions:{buffer:(void 0!==n.buffer?n.buffer:128)*o,tolerance:(void 0!==n.tolerance?n.tolerance:.375)*o,extent:t.default$8,maxZoom:this.maxzoom,lineMetrics:n.lineMetrics||!1},superclusterOptions:{maxZoom:void 0!==n.clusterMaxZoom?Math.min(n.clusterMaxZoom,this.maxzoom-1):this.maxzoom-1,extent:t.default$8,radius:(n.clusterRadius||50)*o,log:!1}},n.workerOptions)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(){var e=this;this.fire(new t.Event("dataloading",{dataType:"source"})),this._updateWorkerData(function(r){if(r)e.fire(new t.ErrorEvent(r));else{var n={dataType:"source",sourceDataType:"metadata"};e._collectResourceTiming&&e._resourceTiming&&e._resourceTiming.length>0&&(n.resourceTiming=e._resourceTiming,e._resourceTiming=[]),e.fire(new t.Event("data",n))}})},r.prototype.onAdd=function(t){this.map=t,this.load()},r.prototype.setData=function(e){var r=this;return this._data=e,this.fire(new t.Event("dataloading",{dataType:"source"})),this._updateWorkerData(function(e){if(e)return r.fire(new t.ErrorEvent(e));var n={dataType:"source",sourceDataType:"content"};r._collectResourceTiming&&r._resourceTiming&&r._resourceTiming.length>0&&(n.resourceTiming=r._resourceTiming,r._resourceTiming=[]),r.fire(new t.Event("data",n))}),this},r.prototype._updateWorkerData=function(e){var r,n,i=this,a=t.extend({},this.workerOptions),o=this._data;"string"==typeof o?(a.request=this.map._transformRequest((r=o,(n=t.default.document.createElement("a")).href=r,n.href),t.ResourceType.Source),a.request.collectResourceTiming=this._collectResourceTiming):a.data=JSON.stringify(o),this.workerID=this.dispatcher.send(this.type+"."+a.source+".loadData",a,function(t,r){i._removed||r&&r.abandoned||(i._loaded=!0,r&&r.resourceTiming&&r.resourceTiming[i.id]&&(i._resourceTiming=r.resourceTiming[i.id].slice(0)),i.dispatcher.send(i.type+"."+a.source+".coalesce",null,null,i.workerID),e(t))},this.workerID)},r.prototype.loadTile=function(t,e){var r=this,n=void 0===t.workerID?"loadTile":"reloadTile",i={type:this.type,uid:t.uid,tileID:t.tileID,zoom:t.tileID.overscaledZ,maxZoom:this.maxzoom,tileSize:this.tileSize,source:this.id,pixelRatio:a.devicePixelRatio,showCollisionBoxes:this.map.showCollisionBoxes};t.workerID=this.dispatcher.send(n,i,function(i,a){return t.unloadVectorData(),t.aborted?e(null):i?e(i):(t.loadVectorData(a,r.map.painter,"reloadTile"===n),e(null))},this.workerID)},r.prototype.abortTile=function(t){t.aborted=!0},r.prototype.unloadTile=function(t){t.unloadVectorData(),this.dispatcher.send("removeTile",{uid:t.uid,type:this.type,source:this.id},null,t.workerID)},r.prototype.onRemove=function(){this._removed=!0,this.dispatcher.send("removeSource",{type:this.type,source:this.id},null,this.workerID)},r.prototype.serialize=function(){return t.extend({},this._options,{type:this.type,data:this._data})},r.prototype.hasTransition=function(){return!1},r}(t.Evented),K=t.createLayout([{name:"a_pos",type:"Int16",components:2},{name:"a_texture_pos",type:"Int16",components:2}]),Q=function(){this.boundProgram=null,this.boundLayoutVertexBuffer=null,this.boundPaintVertexBuffers=[],this.boundIndexBuffer=null,this.boundVertexOffset=null,this.boundDynamicVertexBuffer=null,this.vao=null};Q.prototype.bind=function(t,e,r,n,i,a,o,s){this.context=t;for(var l=this.boundPaintVertexBuffers.length!==n.length,c=0;!l&&c<n.length;c++)this.boundPaintVertexBuffers[c]!==n[c]&&(l=!0);var u=!this.vao||this.boundProgram!==e||this.boundLayoutVertexBuffer!==r||l||this.boundIndexBuffer!==i||this.boundVertexOffset!==a||this.boundDynamicVertexBuffer!==o||this.boundDynamicVertexBuffer2!==s;!t.extVertexArrayObject||u?this.freshBind(e,r,n,i,a,o,s):(t.bindVertexArrayOES.set(this.vao),o&&o.bind(),i&&i.dynamicDraw&&i.bind(),s&&s.bind())},Q.prototype.freshBind=function(t,e,r,n,i,a,o){var s,l=t.numAttributes,c=this.context,u=c.gl;if(c.extVertexArrayObject)this.vao&&this.destroy(),this.vao=c.extVertexArrayObject.createVertexArrayOES(),c.bindVertexArrayOES.set(this.vao),s=0,this.boundProgram=t,this.boundLayoutVertexBuffer=e,this.boundPaintVertexBuffers=r,this.boundIndexBuffer=n,this.boundVertexOffset=i,this.boundDynamicVertexBuffer=a,this.boundDynamicVertexBuffer2=o;else{s=c.currentNumAttributes||0;for(var h=l;h<s;h++)u.disableVertexAttribArray(h)}e.enableAttributes(u,t);for(var f=0,p=r;f<p.length;f+=1)p[f].enableAttributes(u,t);a&&a.enableAttributes(u,t),o&&o.enableAttributes(u,t),e.bind(),e.setVertexAttribPointers(u,t,i);for(var d=0,g=r;d<g.length;d+=1){var m=g[d];m.bind(),m.setVertexAttribPointers(u,t,i)}a&&(a.bind(),a.setVertexAttribPointers(u,t,i)),n&&n.bind(),o&&(o.bind(),o.setVertexAttribPointers(u,t,i)),c.currentNumAttributes=l},Q.prototype.destroy=function(){this.vao&&(this.context.extVertexArrayObject.deleteVertexArrayOES(this.vao),this.vao=null)};var tt=function(e){function r(t,r,n,i){e.call(this),this.id=t,this.dispatcher=n,this.coordinates=r.coordinates,this.type="image",this.minzoom=0,this.maxzoom=22,this.tileSize=512,this.tiles={},this.setEventedParent(i),this.options=r}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(){var e=this;this.fire(new t.Event("dataloading",{dataType:"source"})),this.url=this.options.url,t.getImage(this.map._transformRequest(this.url,t.ResourceType.Image),function(r,n){r?e.fire(new t.ErrorEvent(r)):n&&(e.image=a.getImageData(n),e._finishLoading())})},r.prototype._finishLoading=function(){this.map&&(this.setCoordinates(this.coordinates),this.fire(new t.Event("data",{dataType:"source",sourceDataType:"metadata"})))},r.prototype.onAdd=function(t){this.map=t,this.load()},r.prototype.setCoordinates=function(e){this.coordinates=e;var r=this.map,n=e.map(function(t){return r.transform.locationCoordinate(G.convert(t)).zoomTo(0)}),i=this.centerCoord=t.getCoordinatesCenter(n);i.column=Math.floor(i.column),i.row=Math.floor(i.row),this.tileID=new t.CanonicalTileID(i.zoom,i.column,i.row),this.minzoom=this.maxzoom=i.zoom;var a=n.map(function(e){var r=e.zoomTo(i.zoom);return new t.default$1(Math.round((r.column-i.column)*t.default$8),Math.round((r.row-i.row)*t.default$8))});return this._boundsArray=new t.RasterBoundsArray,this._boundsArray.emplaceBack(a[0].x,a[0].y,0,0),this._boundsArray.emplaceBack(a[1].x,a[1].y,t.default$8,0),this._boundsArray.emplaceBack(a[3].x,a[3].y,0,t.default$8),this._boundsArray.emplaceBack(a[2].x,a[2].y,t.default$8,t.default$8),this.boundsBuffer&&(this.boundsBuffer.destroy(),delete this.boundsBuffer),this.fire(new t.Event("data",{dataType:"source",sourceDataType:"content"})),this},r.prototype.prepare=function(){if(0!==Object.keys(this.tiles).length&&this.image){var t=this.map.painter.context,e=t.gl;for(var r in this.boundsBuffer||(this.boundsBuffer=t.createVertexBuffer(this._boundsArray,K.members)),this.boundsVAO||(this.boundsVAO=new Q),this.texture||(this.texture=new z(t,this.image,e.RGBA),this.texture.bind(e.LINEAR,e.CLAMP_TO_EDGE)),this.tiles){var n=this.tiles[r];"loaded"!==n.state&&(n.state="loaded",n.texture=this.texture)}}},r.prototype.loadTile=function(t,e){this.tileID&&this.tileID.equals(t.tileID.canonical)?(this.tiles[String(t.tileID.wrap)]=t,t.buckets={},e(null)):(t.state="errored",e(null))},r.prototype.serialize=function(){return{type:"image",url:this.options.url,coordinates:this.coordinates}},r.prototype.hasTransition=function(){return!1},r}(t.Evented),et=function(e){function r(t,r,n,i){e.call(this,t,r,n,i),this.roundZoom=!0,this.type="video",this.options=r}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(){var e=this,r=this.options;this.urls=[];for(var n=0,i=r.urls;n<i.length;n+=1){var a=i[n];e.urls.push(e.map._transformRequest(a,t.ResourceType.Source).url)}t.getVideo(this.urls,function(r,n){r?e.fire(new t.ErrorEvent(r)):n&&(e.video=n,e.video.loop=!0,e.video.addEventListener("playing",function(){e.map._rerender()}),e.map&&e.video.play(),e._finishLoading())})},r.prototype.getVideo=function(){return this.video},r.prototype.onAdd=function(t){this.map||(this.map=t,this.load(),this.video&&(this.video.play(),this.setCoordinates(this.coordinates)))},r.prototype.prepare=function(){if(!(0===Object.keys(this.tiles).length||this.video.readyState<2)){var t=this.map.painter.context,e=t.gl;for(var r in this.boundsBuffer||(this.boundsBuffer=t.createVertexBuffer(this._boundsArray,K.members)),this.boundsVAO||(this.boundsVAO=new Q),this.texture?this.video.paused||(this.texture.bind(e.LINEAR,e.CLAMP_TO_EDGE),e.texSubImage2D(e.TEXTURE_2D,0,0,0,e.RGBA,e.UNSIGNED_BYTE,this.video)):(this.texture=new z(t,this.video,e.RGBA),this.texture.bind(e.LINEAR,e.CLAMP_TO_EDGE)),this.tiles){var n=this.tiles[r];"loaded"!==n.state&&(n.state="loaded",n.texture=this.texture)}}},r.prototype.serialize=function(){return{type:"video",urls:this.urls,coordinates:this.coordinates}},r.prototype.hasTransition=function(){return this.video&&!this.video.paused},r}(tt),rt=function(e){function r(r,n,i,a){e.call(this,r,n,i,a),n.coordinates?Array.isArray(n.coordinates)&&4===n.coordinates.length&&!n.coordinates.some(function(t){return!Array.isArray(t)||2!==t.length||t.some(function(t){return"number"!=typeof t})})||this.fire(new t.ErrorEvent(new t.default$9("sources."+r,null,'"coordinates" property must be an array of 4 longitude/latitude array pairs'))):this.fire(new t.ErrorEvent(new t.default$9("sources."+r,null,'missing required property "coordinates"'))),n.animate&&"boolean"!=typeof n.animate&&this.fire(new t.ErrorEvent(new t.default$9("sources."+r,null,'optional "animate" property must be a boolean value'))),n.canvas?"string"==typeof n.canvas||n.canvas instanceof t.default.HTMLCanvasElement||this.fire(new t.ErrorEvent(new t.default$9("sources."+r,null,'"canvas" must be either a string representing the ID of the canvas element from which to read, or an HTMLCanvasElement instance'))):this.fire(new t.ErrorEvent(new t.default$9("sources."+r,null,'missing required property "canvas"'))),this.options=n,this.animate=void 0===n.animate||n.animate}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.load=function(){this.canvas||(this.canvas=this.options.canvas instanceof t.default.HTMLCanvasElement?this.options.canvas:t.default.document.getElementById(this.options.canvas)),this.width=this.canvas.width,this.height=this.canvas.height,this._hasInvalidDimensions()?this.fire(new t.ErrorEvent(new Error("Canvas dimensions cannot be less than or equal to zero."))):(this.play=function(){this._playing=!0,this.map._rerender()},this.pause=function(){this._playing=!1},this._finishLoading())},r.prototype.getCanvas=function(){return this.canvas},r.prototype.onAdd=function(t){this.map=t,this.load(),this.canvas&&this.animate&&this.play()},r.prototype.onRemove=function(){this.pause()},r.prototype.prepare=function(){var t=!1;if(this.canvas.width!==this.width&&(this.width=this.canvas.width,t=!0),this.canvas.height!==this.height&&(this.height=this.canvas.height,t=!0),!this._hasInvalidDimensions()&&0!==Object.keys(this.tiles).length){var e=this.map.painter.context,r=e.gl;for(var n in this.boundsBuffer||(this.boundsBuffer=e.createVertexBuffer(this._boundsArray,K.members)),this.boundsVAO||(this.boundsVAO=new Q),this.texture?t?this.texture.update(this.canvas):this._playing&&(this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE),r.texSubImage2D(r.TEXTURE_2D,0,0,0,r.RGBA,r.UNSIGNED_BYTE,this.canvas)):(this.texture=new z(e,this.canvas,r.RGBA),this.texture.bind(r.LINEAR,r.CLAMP_TO_EDGE)),this.tiles){var i=this.tiles[n];"loaded"!==i.state&&(i.state="loaded",i.texture=this.texture)}}},r.prototype.serialize=function(){return{type:"canvas",coordinates:this.coordinates}},r.prototype.hasTransition=function(){return this._playing},r.prototype._hasInvalidDimensions=function(){for(var t=0,e=[this.canvas.width,this.canvas.height];t<e.length;t+=1){var r=e[t];if(isNaN(r)||r<=0)return!0}return!1},r}(tt),nt={vector:X,raster:Z,"raster-dem":$,geojson:J,video:et,image:tt,canvas:rt},it=function(e,r,n,i){var a=new nt[r.type](e,r,n,i);if(a.id!==e)throw new Error("Expected Source id to be "+e+" instead of "+a.id);return t.bindAll(["load","abort","unload","serialize","prepare"],a),a};function at(t,e,r,n,i){var a=i.maxPitchScaleFactor(),o=t.tilesIn(r,a);o.sort(ot);for(var s=[],l=0,c=o;l<c.length;l+=1){var u=c[l];s.push({wrappedTileID:u.tileID.wrapped().key,queryResults:u.tile.queryRenderedFeatures(e,u.queryGeometry,u.scale,n,i,a,t.transform.calculatePosMatrix(u.tileID.toUnwrapped()))})}return function(t){for(var e={},r={},n=0,i=t;n<i.length;n+=1){var a=i[n],o=a.queryResults,s=a.wrappedTileID,l=r[s]=r[s]||{};for(var c in o)for(var u=o[c],h=l[c]=l[c]||{},f=e[c]=e[c]||[],p=0,d=u;p<d.length;p+=1){var g=d[p];h[g.featureIndex]||(h[g.featureIndex]=!0,f.push(g.feature))}}return e}(s)}function ot(t,e){var r=t.tileID,n=e.tileID;return r.overscaledZ-n.overscaledZ||r.canonical.y-n.canonical.y||r.wrap-n.wrap||r.canonical.x-n.canonical.x}var st=function(e,r){this.tileID=e,this.uid=t.uniqueId(),this.uses=0,this.tileSize=r,this.buckets={},this.expirationTime=null,this.queryPadding=0,this.expiredRequestCount=0,this.state="loading"};st.prototype.registerFadeDuration=function(t){var e=t+this.timeAdded;e<a.now()||this.fadeEndTime&&e<this.fadeEndTime||(this.fadeEndTime=e)},st.prototype.wasRequested=function(){return"errored"===this.state||"loaded"===this.state||"reloading"===this.state},st.prototype.loadVectorData=function(e,r,n){if(this.hasData()&&this.unloadVectorData(),this.state="loaded",e){if(e.featureIndex&&(this.latestFeatureIndex=e.featureIndex,e.rawTileData?(this.latestRawTileData=e.rawTileData,this.latestFeatureIndex.rawTileData=e.rawTileData):this.latestRawTileData&&(this.latestFeatureIndex.rawTileData=this.latestRawTileData)),this.collisionBoxArray=e.collisionBoxArray,this.buckets=function(t,e){var r={};if(!e)return r;for(var n=0,i=t;n<i.length;n+=1){var a=i[n],o=a.layerIds.map(function(t){return e.getLayer(t)}).filter(Boolean);if(0!==o.length){a.layers=o;for(var s=0,l=o;s<l.length;s+=1)r[l[s].id]=a}}return r}(e.buckets,r.style),n)for(var i in this.buckets){var a=this.buckets[i];a instanceof t.default$14&&(a.justReloaded=!0)}for(var o in this.queryPadding=0,this.buckets){var s=this.buckets[o];this.queryPadding=Math.max(this.queryPadding,r.style.getLayer(s.layerIds[0]).queryRadius(s))}e.iconAtlasImage&&(this.iconAtlasImage=e.iconAtlasImage),e.glyphAtlasImage&&(this.glyphAtlasImage=e.glyphAtlasImage)}else this.collisionBoxArray=new t.CollisionBoxArray},st.prototype.unloadVectorData=function(){for(var t in this.buckets)this.buckets[t].destroy();this.buckets={},this.iconAtlasTexture&&this.iconAtlasTexture.destroy(),this.glyphAtlasTexture&&this.glyphAtlasTexture.destroy(),this.latestFeatureIndex=null,this.state="unloaded"},st.prototype.unloadDEMData=function(){this.dem=null,this.neighboringTiles=null,this.state="unloaded"},st.prototype.getBucket=function(t){return this.buckets[t.id]},st.prototype.upload=function(t){for(var e in this.buckets){var r=this.buckets[e];r.uploaded||(r.upload(t),r.uploaded=!0)}var n=t.gl;this.iconAtlasImage&&(this.iconAtlasTexture=new z(t,this.iconAtlasImage,n.RGBA),this.iconAtlasImage=null),this.glyphAtlasImage&&(this.glyphAtlasTexture=new z(t,this.glyphAtlasImage,n.ALPHA),this.glyphAtlasImage=null)},st.prototype.queryRenderedFeatures=function(t,e,r,n,i,a,o){return this.latestFeatureIndex&&this.latestFeatureIndex.rawTileData?this.latestFeatureIndex.query({queryGeometry:e,scale:r,tileSize:this.tileSize,posMatrix:o,transform:i,params:n,queryPadding:this.queryPadding*a},t):{}},st.prototype.querySourceFeatures=function(e,r){if(this.latestFeatureIndex&&this.latestFeatureIndex.rawTileData){var n=this.latestFeatureIndex.loadVTLayers(),i=r?r.sourceLayer:"",a=n._geojsonTileLayer||n[i];if(a)for(var o=t.default$13(r&&r.filter),s={z:this.tileID.overscaledZ,x:this.tileID.canonical.x,y:this.tileID.canonical.y},l=0;l<a.length;l++){var c=a.feature(l);if(o(new t.default$16(this.tileID.overscaledZ),c)){var u=new t.default$12(c,s.z,s.x,s.y);u.tile=s,e.push(u)}}}},st.prototype.clearMask=function(){this.segments&&(this.segments.destroy(),delete this.segments),this.maskedBoundsBuffer&&(this.maskedBoundsBuffer.destroy(),delete this.maskedBoundsBuffer),this.maskedIndexBuffer&&(this.maskedIndexBuffer.destroy(),delete this.maskedIndexBuffer)},st.prototype.setMask=function(e,r){if(!t.default$10(this.mask,e)&&(this.mask=e,this.clearMask(),!t.default$10(e,{0:!0}))){var n=new t.RasterBoundsArray,i=new t.TriangleIndexArray;this.segments=new t.default$15,this.segments.prepareSegment(0,n,i);for(var a=Object.keys(e),o=0;o<a.length;o++){var s=e[a[o]],l=t.default$8>>s.z,c=new t.default$1(s.x*l,s.y*l),u=new t.default$1(c.x+l,c.y+l),h=this.segments.prepareSegment(4,n,i);n.emplaceBack(c.x,c.y,c.x,c.y),n.emplaceBack(u.x,c.y,u.x,c.y),n.emplaceBack(c.x,u.y,c.x,u.y),n.emplaceBack(u.x,u.y,u.x,u.y);var f=h.vertexLength;i.emplaceBack(f,f+1,f+2),i.emplaceBack(f+1,f+2,f+3),h.vertexLength+=4,h.primitiveLength+=2}this.maskedBoundsBuffer=r.createVertexBuffer(n,K.members),this.maskedIndexBuffer=r.createIndexBuffer(i)}},st.prototype.hasData=function(){return"loaded"===this.state||"reloading"===this.state||"expired"===this.state},st.prototype.setExpiryData=function(e){var r=this.expirationTime;if(e.cacheControl){var n=t.parseCacheControl(e.cacheControl);n["max-age"]&&(this.expirationTime=Date.now()+1e3*n["max-age"])}else e.expires&&(this.expirationTime=new Date(e.expires).getTime());if(this.expirationTime){var i=Date.now(),a=!1;if(this.expirationTime>i)a=!1;else if(r)if(this.expirationTime<r)a=!0;else{var o=this.expirationTime-r;o?this.expirationTime=i+Math.max(o,3e4):a=!0}else a=!0;a?(this.expiredRequestCount++,this.state="expired"):this.expiredRequestCount=0}},st.prototype.getExpiryTimeout=function(){if(this.expirationTime)return this.expiredRequestCount?1e3*(1<<Math.min(this.expiredRequestCount-1,31)):Math.min(this.expirationTime-(new Date).getTime(),Math.pow(2,31)-1)};var lt=function(t,e){this.max=t,this.onRemove=e,this.reset()};lt.prototype.reset=function(){for(var t in this.data)for(var e=0,r=this.data[t];e<r.length;e+=1){var n=r[e];n.timeout&&clearTimeout(n.timeout),this.onRemove(n.value)}return this.data={},this.order=[],this},lt.prototype.add=function(t,e,r){var n=this,i=t.wrapped().key;void 0===this.data[i]&&(this.data[i]=[]);var a={value:e,timeout:void 0};if(void 0!==r&&(a.timeout=setTimeout(function(){n.remove(t,a)},r)),this.data[i].push(a),this.order.push(i),this.order.length>this.max){var o=this._getAndRemoveByKey(this.order[0]);o&&this.onRemove(o)}return this},lt.prototype.has=function(t){return t.wrapped().key in this.data},lt.prototype.getAndRemove=function(t){return this.has(t)?this._getAndRemoveByKey(t.wrapped().key):null},lt.prototype._getAndRemoveByKey=function(t){var e=this.data[t].shift();return e.timeout&&clearTimeout(e.timeout),0===this.data[t].length&&delete this.data[t],this.order.splice(this.order.indexOf(t),1),e.value},lt.prototype.get=function(t){return this.has(t)?this.data[t.wrapped().key][0].value:null},lt.prototype.remove=function(t,e){if(!this.has(t))return this;var r=t.wrapped().key,n=void 0===e?0:this.data[r].indexOf(e),i=this.data[r][n];return this.data[r].splice(n,1),i.timeout&&clearTimeout(i.timeout),0===this.data[r].length&&delete this.data[r],this.onRemove(i.value),this.order.splice(this.order.indexOf(r),1),this},lt.prototype.setMaxSize=function(t){for(this.max=t;this.order.length>this.max;){var e=this._getAndRemoveByKey(this.order[0]);e&&this.onRemove(e)}return this};var ct=function(t,e,r){this.context=t;var n=t.gl;this.buffer=n.createBuffer(),this.dynamicDraw=Boolean(r),this.unbindVAO(),t.bindElementBuffer.set(this.buffer),n.bufferData(n.ELEMENT_ARRAY_BUFFER,e.arrayBuffer,this.dynamicDraw?n.DYNAMIC_DRAW:n.STATIC_DRAW),this.dynamicDraw||delete e.arrayBuffer};ct.prototype.unbindVAO=function(){this.context.extVertexArrayObject&&this.context.bindVertexArrayOES.set(null)},ct.prototype.bind=function(){this.context.bindElementBuffer.set(this.buffer)},ct.prototype.updateData=function(t){var e=this.context.gl;this.unbindVAO(),this.bind(),e.bufferSubData(e.ELEMENT_ARRAY_BUFFER,0,t.arrayBuffer)},ct.prototype.destroy=function(){var t=this.context.gl;this.buffer&&(t.deleteBuffer(this.buffer),delete this.buffer)};var ut={Int8:"BYTE",Uint8:"UNSIGNED_BYTE",Int16:"SHORT",Uint16:"UNSIGNED_SHORT",Int32:"INT",Uint32:"UNSIGNED_INT",Float32:"FLOAT"},ht=function(t,e,r,n){this.length=e.length,this.attributes=r,this.itemSize=e.bytesPerElement,this.dynamicDraw=n,this.context=t;var i=t.gl;this.buffer=i.createBuffer(),t.bindVertexBuffer.set(this.buffer),i.bufferData(i.ARRAY_BUFFER,e.arrayBuffer,this.dynamicDraw?i.DYNAMIC_DRAW:i.STATIC_DRAW),this.dynamicDraw||delete e.arrayBuffer};ht.prototype.bind=function(){this.context.bindVertexBuffer.set(this.buffer)},ht.prototype.updateData=function(t){var e=this.context.gl;this.bind(),e.bufferSubData(e.ARRAY_BUFFER,0,t.arrayBuffer)},ht.prototype.enableAttributes=function(t,e){for(var r=0;r<this.attributes.length;r++){var n=this.attributes[r],i=e.attributes[n.name];void 0!==i&&t.enableVertexAttribArray(i)}},ht.prototype.setVertexAttribPointers=function(t,e,r){for(var n=0;n<this.attributes.length;n++){var i=this.attributes[n],a=e.attributes[i.name];void 0!==a&&t.vertexAttribPointer(a,i.components,t[ut[i.type]],!1,this.itemSize,i.offset+this.itemSize*(r||0))}},ht.prototype.destroy=function(){var t=this.context.gl;this.buffer&&(t.deleteBuffer(this.buffer),delete this.buffer)};var ft=function(e){this.context=e,this.current=t.default$6.transparent};ft.prototype.get=function(){return this.current},ft.prototype.set=function(t){var e=this.current;t.r===e.r&&t.g===e.g&&t.b===e.b&&t.a===e.a||(this.context.gl.clearColor(t.r,t.g,t.b,t.a),this.current=t)};var pt=function(t){this.context=t,this.current=1};pt.prototype.get=function(){return this.current},pt.prototype.set=function(t){this.current!==t&&(this.context.gl.clearDepth(t),this.current=t)};var dt=function(t){this.context=t,this.current=0};dt.prototype.get=function(){return this.current},dt.prototype.set=function(t){this.current!==t&&(this.context.gl.clearStencil(t),this.current=t)};var gt=function(t){this.context=t,this.current=[!0,!0,!0,!0]};gt.prototype.get=function(){return this.current},gt.prototype.set=function(t){var e=this.current;t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]||(this.context.gl.colorMask(t[0],t[1],t[2],t[3]),this.current=t)};var mt=function(t){this.context=t,this.current=!0};mt.prototype.get=function(){return this.current},mt.prototype.set=function(t){this.current!==t&&(this.context.gl.depthMask(t),this.current=t)};var vt=function(t){this.context=t,this.current=255};vt.prototype.get=function(){return this.current},vt.prototype.set=function(t){this.current!==t&&(this.context.gl.stencilMask(t),this.current=t)};var yt=function(t){this.context=t,this.current={func:t.gl.ALWAYS,ref:0,mask:255}};yt.prototype.get=function(){return this.current},yt.prototype.set=function(t){var e=this.current;t.func===e.func&&t.ref===e.ref&&t.mask===e.mask||(this.context.gl.stencilFunc(t.func,t.ref,t.mask),this.current=t)};var xt=function(t){this.context=t;var e=this.context.gl;this.current=[e.KEEP,e.KEEP,e.KEEP]};xt.prototype.get=function(){return this.current},xt.prototype.set=function(t){var e=this.current;t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]||(this.context.gl.stencilOp(t[0],t[1],t[2]),this.current=t)};var bt=function(t){this.context=t,this.current=!1};bt.prototype.get=function(){return this.current},bt.prototype.set=function(t){if(this.current!==t){var e=this.context.gl;t?e.enable(e.STENCIL_TEST):e.disable(e.STENCIL_TEST),this.current=t}};var _t=function(t){this.context=t,this.current=[0,1]};_t.prototype.get=function(){return this.current},_t.prototype.set=function(t){var e=this.current;t[0]===e[0]&&t[1]===e[1]||(this.context.gl.depthRange(t[0],t[1]),this.current=t)};var wt=function(t){this.context=t,this.current=!1};wt.prototype.get=function(){return this.current},wt.prototype.set=function(t){if(this.current!==t){var e=this.context.gl;t?e.enable(e.DEPTH_TEST):e.disable(e.DEPTH_TEST),this.current=t}};var kt=function(t){this.context=t,this.current=t.gl.LESS};kt.prototype.get=function(){return this.current},kt.prototype.set=function(t){this.current!==t&&(this.context.gl.depthFunc(t),this.current=t)};var Mt=function(t){this.context=t,this.current=!1};Mt.prototype.get=function(){return this.current},Mt.prototype.set=function(t){if(this.current!==t){var e=this.context.gl;t?e.enable(e.BLEND):e.disable(e.BLEND),this.current=t}};var At=function(t){this.context=t;var e=this.context.gl;this.current=[e.ONE,e.ZERO]};At.prototype.get=function(){return this.current},At.prototype.set=function(t){var e=this.current;t[0]===e[0]&&t[1]===e[1]||(this.context.gl.blendFunc(t[0],t[1]),this.current=t)};var Tt=function(e){this.context=e,this.current=t.default$6.transparent};Tt.prototype.get=function(){return this.current},Tt.prototype.set=function(t){var e=this.current;t.r===e.r&&t.g===e.g&&t.b===e.b&&t.a===e.a||(this.context.gl.blendColor(t.r,t.g,t.b,t.a),this.current=t)};var St=function(t){this.context=t,this.current=null};St.prototype.get=function(){return this.current},St.prototype.set=function(t){this.current!==t&&(this.context.gl.useProgram(t),this.current=t)};var Et=function(t){this.context=t,this.current=1};Et.prototype.get=function(){return this.current},Et.prototype.set=function(e){var r=this.context.lineWidthRange,n=t.clamp(e,r[0],r[1]);this.current!==n&&(this.context.gl.lineWidth(n),this.current=e)};var Ct=function(t){this.context=t,this.current=t.gl.TEXTURE0};Ct.prototype.get=function(){return this.current},Ct.prototype.set=function(t){this.current!==t&&(this.context.gl.activeTexture(t),this.current=t)};var Lt=function(t){this.context=t;var e=this.context.gl;this.current=[0,0,e.drawingBufferWidth,e.drawingBufferHeight]};Lt.prototype.get=function(){return this.current},Lt.prototype.set=function(t){var e=this.current;t[0]===e[0]&&t[1]===e[1]&&t[2]===e[2]&&t[3]===e[3]||(this.context.gl.viewport(t[0],t[1],t[2],t[3]),this.current=t)};var zt=function(t){this.context=t,this.current=null};zt.prototype.get=function(){return this.current},zt.prototype.set=function(t){if(this.current!==t){var e=this.context.gl;e.bindFramebuffer(e.FRAMEBUFFER,t),this.current=t}};var Pt=function(t){this.context=t,this.current=null};Pt.prototype.get=function(){return this.current},Pt.prototype.set=function(t){if(this.current!==t){var e=this.context.gl;e.bindRenderbuffer(e.RENDERBUFFER,t),this.current=t}};var It=function(t){this.context=t,this.current=null};It.prototype.get=function(){return this.current},It.prototype.set=function(t){if(this.current!==t){var e=this.context.gl;e.bindTexture(e.TEXTURE_2D,t),this.current=t}};var Ot=function(t){this.context=t,this.current=null};Ot.prototype.get=function(){return this.current},Ot.prototype.set=function(t){if(this.current!==t){var e=this.context.gl;e.bindBuffer(e.ARRAY_BUFFER,t),this.current=t}};var Dt=function(t){this.context=t,this.current=null};Dt.prototype.get=function(){return this.current},Dt.prototype.set=function(t){var e=this.context.gl;e.bindBuffer(e.ELEMENT_ARRAY_BUFFER,t),this.current=t};var Rt=function(t){this.context=t,this.current=null};Rt.prototype.get=function(){return this.current},Rt.prototype.set=function(t){this.current!==t&&this.context.extVertexArrayObject&&(this.context.extVertexArrayObject.bindVertexArrayOES(t),this.current=t)};var Bt=function(t){this.context=t,this.current=4};Bt.prototype.get=function(){return this.current},Bt.prototype.set=function(t){if(this.current!==t){var e=this.context.gl;e.pixelStorei(e.UNPACK_ALIGNMENT,t),this.current=t}};var Ft=function(t){this.context=t,this.current=!1};Ft.prototype.get=function(){return this.current},Ft.prototype.set=function(t){if(this.current!==t){var e=this.context.gl;e.pixelStorei(e.UNPACK_PREMULTIPLY_ALPHA_WEBGL,t),this.current=t}};var Nt=function(t,e){this.context=t,this.current=null,this.parent=e};Nt.prototype.get=function(){return this.current};var jt=function(t){function e(e,r){t.call(this,e,r),this.dirty=!1}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.set=function(t){if(this.dirty||this.current!==t){var e=this.context.gl;this.context.bindFramebuffer.set(this.parent),e.framebufferTexture2D(e.FRAMEBUFFER,e.COLOR_ATTACHMENT0,e.TEXTURE_2D,t,0),this.current=t,this.dirty=!1}},e.prototype.setDirty=function(){this.dirty=!0},e}(Nt),Vt=function(t){function e(){t.apply(this,arguments)}return t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e,e.prototype.set=function(t){if(this.current!==t){var e=this.context.gl;this.context.bindFramebuffer.set(this.parent),e.framebufferRenderbuffer(e.FRAMEBUFFER,e.DEPTH_ATTACHMENT,e.RENDERBUFFER,t),this.current=t}},e}(Nt),Ut=function(t,e,r){this.context=t,this.width=e,this.height=r;var n=t.gl,i=this.framebuffer=n.createFramebuffer();this.colorAttachment=new jt(t,i),this.depthAttachment=new Vt(t,i)};Ut.prototype.destroy=function(){var t=this.context.gl,e=this.colorAttachment.get();e&&t.deleteTexture(e);var r=this.depthAttachment.get();r&&t.deleteRenderbuffer(r),t.deleteFramebuffer(this.framebuffer)};var qt=function(t,e,r){this.func=t,this.mask=e,this.range=r};qt.ReadOnly=!1,qt.ReadWrite=!0,qt.disabled=new qt(519,qt.ReadOnly,[0,1]);var Ht=function(t,e,r,n,i,a){this.test=t,this.ref=e,this.mask=r,this.fail=n,this.depthFail=i,this.pass=a};Ht.disabled=new Ht({func:519,mask:0},0,0,7680,7680,7680);var Gt=function(t,e,r){this.blendFunction=t,this.blendColor=e,this.mask=r};Gt.disabled=new Gt(Gt.Replace=[1,0],t.default$6.transparent,[!1,!1,!1,!1]),Gt.unblended=new Gt(Gt.Replace,t.default$6.transparent,[!0,!0,!0,!0]),Gt.alphaBlended=new Gt([1,771],t.default$6.transparent,[!0,!0,!0,!0]);var Wt=function(t){this.gl=t,this.extVertexArrayObject=this.gl.getExtension("OES_vertex_array_object"),this.lineWidthRange=t.getParameter(t.ALIASED_LINE_WIDTH_RANGE),this.clearColor=new ft(this),this.clearDepth=new pt(this),this.clearStencil=new dt(this),this.colorMask=new gt(this),this.depthMask=new mt(this),this.stencilMask=new vt(this),this.stencilFunc=new yt(this),this.stencilOp=new xt(this),this.stencilTest=new bt(this),this.depthRange=new _t(this),this.depthTest=new wt(this),this.depthFunc=new kt(this),this.blend=new Mt(this),this.blendFunc=new At(this),this.blendColor=new Tt(this),this.program=new St(this),this.lineWidth=new Et(this),this.activeTexture=new Ct(this),this.viewport=new Lt(this),this.bindFramebuffer=new zt(this),this.bindRenderbuffer=new Pt(this),this.bindTexture=new It(this),this.bindVertexBuffer=new Ot(this),this.bindElementBuffer=new Dt(this),this.bindVertexArrayOES=this.extVertexArrayObject&&new Rt(this),this.pixelStoreUnpack=new Bt(this),this.pixelStoreUnpackPremultiplyAlpha=new Ft(this),this.extTextureFilterAnisotropic=t.getExtension("EXT_texture_filter_anisotropic")||t.getExtension("MOZ_EXT_texture_filter_anisotropic")||t.getExtension("WEBKIT_EXT_texture_filter_anisotropic"),this.extTextureFilterAnisotropic&&(this.extTextureFilterAnisotropicMax=t.getParameter(this.extTextureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT)),this.extTextureHalfFloat=t.getExtension("OES_texture_half_float"),this.extTextureHalfFloat&&t.getExtension("OES_texture_half_float_linear")};Wt.prototype.createIndexBuffer=function(t,e){return new ct(this,t,e)},Wt.prototype.createVertexBuffer=function(t,e,r){return new ht(this,t,e,r)},Wt.prototype.createRenderbuffer=function(t,e,r){var n=this.gl,i=n.createRenderbuffer();return this.bindRenderbuffer.set(i),n.renderbufferStorage(n.RENDERBUFFER,t,e,r),this.bindRenderbuffer.set(null),i},Wt.prototype.createFramebuffer=function(t,e){return new Ut(this,t,e)},Wt.prototype.clear=function(t){var e=t.color,r=t.depth,n=this.gl,i=0;e&&(i|=n.COLOR_BUFFER_BIT,this.clearColor.set(e),this.colorMask.set([!0,!0,!0,!0])),void 0!==r&&(i|=n.DEPTH_BUFFER_BIT,this.clearDepth.set(r),this.depthMask.set(!0)),n.clear(i)},Wt.prototype.setDepthMode=function(t){t.func!==this.gl.ALWAYS||t.mask?(this.depthTest.set(!0),this.depthFunc.set(t.func),this.depthMask.set(t.mask),this.depthRange.set(t.range)):this.depthTest.set(!1)},Wt.prototype.setStencilMode=function(t){t.test.func!==this.gl.ALWAYS||t.mask?(this.stencilTest.set(!0),this.stencilMask.set(t.mask),this.stencilOp.set([t.fail,t.depthFail,t.pass]),this.stencilFunc.set({func:t.test.func,ref:t.ref,mask:t.test.mask})):this.stencilTest.set(!1)},Wt.prototype.setColorMode=function(e){t.default$10(e.blendFunction,Gt.Replace)?this.blend.set(!1):(this.blend.set(!0),this.blendFunc.set(e.blendFunction),this.blendColor.set(e.blendColor)),this.colorMask.set(e.mask)};var Yt=function(e){function r(t,r,n){var i=this;e.call(this),this.id=t,this.dispatcher=n,this.on("data",function(t){"source"===t.dataType&&"metadata"===t.sourceDataType&&(i._sourceLoaded=!0),i._sourceLoaded&&!i._paused&&"source"===t.dataType&&"content"===t.sourceDataType&&(i.reload(),i.transform&&i.update(i.transform))}),this.on("error",function(){i._sourceErrored=!0}),this._source=it(t,r,n,this),this._tiles={},this._cache=new lt(0,this._unloadTile.bind(this)),this._timers={},this._cacheTimers={},this._maxTileCacheSize=null,this._isIdRenderable=this._isIdRenderable.bind(this),this._coveredTiles={}}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.onAdd=function(t){this.map=t,this._maxTileCacheSize=t?t._maxTileCacheSize:null,this._source&&this._source.onAdd&&this._source.onAdd(t)},r.prototype.onRemove=function(t){this._source&&this._source.onRemove&&this._source.onRemove(t)},r.prototype.loaded=function(){if(this._sourceErrored)return!0;if(!this._sourceLoaded)return!1;for(var t in this._tiles){var e=this._tiles[t];if("loaded"!==e.state&&"errored"!==e.state)return!1}return!0},r.prototype.getSource=function(){return this._source},r.prototype.pause=function(){this._paused=!0},r.prototype.resume=function(){if(this._paused){var t=this._shouldReloadOnResume;this._paused=!1,this._shouldReloadOnResume=!1,t&&this.reload(),this.transform&&this.update(this.transform)}},r.prototype._loadTile=function(t,e){return this._source.loadTile(t,e)},r.prototype._unloadTile=function(t){if(this._source.unloadTile)return this._source.unloadTile(t,function(){})},r.prototype._abortTile=function(t){if(this._source.abortTile)return this._source.abortTile(t,function(){})},r.prototype.serialize=function(){return this._source.serialize()},r.prototype.prepare=function(t){for(var e in this._source.prepare&&this._source.prepare(),this._tiles)this._tiles[e].upload(t)},r.prototype.getIds=function(){var e=this;return Object.keys(this._tiles).map(Number).sort(function(r,n){var i=e._tiles[r].tileID,a=e._tiles[n].tileID,o=new t.default$1(i.canonical.x,i.canonical.y).rotate(e.transform.angle),s=new t.default$1(a.canonical.x,a.canonical.y).rotate(e.transform.angle);return i.overscaledZ-a.overscaledZ||s.y-o.y||s.x-o.x})},r.prototype.getRenderableIds=function(){return this.getIds().filter(this._isIdRenderable)},r.prototype.hasRenderableParent=function(t){var e=this.findLoadedParent(t,0,{});return!!e&&this._isIdRenderable(e.tileID.key)},r.prototype._isIdRenderable=function(t){return this._tiles[t]&&this._tiles[t].hasData()&&!this._coveredTiles[t]},r.prototype.reload=function(){if(this._paused)this._shouldReloadOnResume=!0;else for(var t in this._cache.reset(),this._tiles)this._reloadTile(t,"reloading")},r.prototype._reloadTile=function(t,e){var r=this._tiles[t];r&&("loading"!==r.state&&(r.state=e),this._loadTile(r,this._tileLoaded.bind(this,r,t,e)))},r.prototype._tileLoaded=function(e,r,n,i){if(i)return e.state="errored",void(404!==i.status?this._source.fire(new t.ErrorEvent(i,{tile:e})):this.update(this.transform));e.timeAdded=a.now(),"expired"===n&&(e.refreshedUponExpiration=!0),this._setTileReloadTimer(r,e),"raster-dem"===this.getSource().type&&e.dem&&this._backfillDEM(e),this._source.fire(new t.Event("data",{dataType:"source",tile:e,coord:e.tileID})),this.map&&(this.map.painter.tileExtentVAO.vao=null)},r.prototype._backfillDEM=function(t){for(var e=this.getRenderableIds(),r=0;r<e.length;r++){var n=e[r];if(t.neighboringTiles&&t.neighboringTiles[n]){var i=this.getTileByID(n);a(t,i),a(i,t)}}function a(t,e){t.needsHillshadePrepare=!0;var r=e.tileID.canonical.x-t.tileID.canonical.x,n=e.tileID.canonical.y-t.tileID.canonical.y,i=Math.pow(2,t.tileID.canonical.z),a=e.tileID.key;0===r&&0===n||Math.abs(n)>1||(Math.abs(r)>1&&(1===Math.abs(r+i)?r+=i:1===Math.abs(r-i)&&(r-=i)),e.dem&&t.dem&&(t.dem.backfillBorder(e.dem,r,n),t.neighboringTiles&&t.neighboringTiles[a]&&(t.neighboringTiles[a].backfilled=!0)))}},r.prototype.getTile=function(t){return this.getTileByID(t.key)},r.prototype.getTileByID=function(t){return this._tiles[t]},r.prototype.getZoom=function(t){return t.zoom+t.scaleZoom(t.tileSize/this._source.tileSize)},r.prototype._findLoadedChildren=function(t,e,r){var n=!1;for(var i in this._tiles){var a=this._tiles[i];if(!(r[i]||!a.hasData()||a.tileID.overscaledZ<=t.overscaledZ||a.tileID.overscaledZ>e)){var o=Math.pow(2,a.tileID.canonical.z-t.canonical.z);if(Math.floor(a.tileID.canonical.x/o)===t.canonical.x&&Math.floor(a.tileID.canonical.y/o)===t.canonical.y)for(r[i]=a.tileID,n=!0;a&&a.tileID.overscaledZ-1>t.overscaledZ;){var s=a.tileID.scaledTo(a.tileID.overscaledZ-1);if(!s)break;(a=this._tiles[s.key])&&a.hasData()&&(delete r[i],r[s.key]=s)}}}return n},r.prototype.findLoadedParent=function(t,e,r){for(var n=t.overscaledZ-1;n>=e;n--){var i=t.scaledTo(n);if(!i)return;var a=String(i.key),o=this._tiles[a];if(o&&o.hasData())return r[a]=i,o;if(this._cache.has(i))return r[a]=i,this._cache.get(i)}},r.prototype.updateCacheSize=function(t){var e=(Math.ceil(t.width/this._source.tileSize)+1)*(Math.ceil(t.height/this._source.tileSize)+1),r=Math.floor(5*e),n="number"==typeof this._maxTileCacheSize?Math.min(this._maxTileCacheSize,r):r;this._cache.setMaxSize(n)},r.prototype.handleWrapJump=function(t){var e=(t-(void 0===this._prevLng?t:this._prevLng))/360,r=Math.round(e);if(this._prevLng=t,r){var n={};for(var i in this._tiles){var a=this._tiles[i];a.tileID=a.tileID.unwrapTo(a.tileID.wrap+r),n[a.tileID.key]=a}for(var o in this._tiles=n,this._timers)clearTimeout(this._timers[o]),delete this._timers[o];for(var s in this._tiles){var l=this._tiles[s];this._setTileReloadTimer(s,l)}}},r.prototype.update=function(e){var n=this;if(this.transform=e,this._sourceLoaded&&!this._paused){var i;this.updateCacheSize(e),this.handleWrapJump(this.transform.center.lng),this._coveredTiles={},this.used?this._source.tileID?i=e.getVisibleUnwrappedCoordinates(this._source.tileID).map(function(e){return new t.OverscaledTileID(e.canonical.z,e.wrap,e.canonical.z,e.canonical.x,e.canonical.y)}):(i=e.coveringTiles({tileSize:this._source.tileSize,minzoom:this._source.minzoom,maxzoom:this._source.maxzoom,roundZoom:this._source.roundZoom,reparseOverscaled:this._source.reparseOverscaled}),this._source.hasTile&&(i=i.filter(function(t){return n._source.hasTile(t)}))):i=[];var o,s=(this._source.roundZoom?Math.round:Math.floor)(this.getZoom(e)),l=Math.max(s-r.maxOverzooming,this._source.minzoom),c=Math.max(s+r.maxUnderzooming,this._source.minzoom),u=this._updateRetainedTiles(i,s),h={};if(Zt(this._source.type))for(var f=Object.keys(u),p=0;p<f.length;p++){var d=f[p],g=u[d],m=n._tiles[d];if(m&&(void 0===m.fadeEndTime||m.fadeEndTime>=a.now())){n._findLoadedChildren(g,c,u)&&(u[d]=g);var v=n.findLoadedParent(g,l,h);v&&n._addTile(v.tileID)}}for(o in h)u[o]||(n._coveredTiles[o]=!0);for(o in h)u[o]=h[o];for(var y=t.keysDifference(this._tiles,u),x=0;x<y.length;x++)n._removeTile(y[x])}},r.prototype._updateRetainedTiles=function(t,e){for(var n={},i={},a=Math.max(e-r.maxOverzooming,this._source.minzoom),o=Math.max(e+r.maxUnderzooming,this._source.minzoom),s=0;s<t.length;s++){var l=t[s],c=this._addTile(l),u=!1;if(c.hasData())n[l.key]=l;else{u=c.wasRequested(),n[l.key]=l;var h=!0;if(e+1>this._source.maxzoom){var f=l.children(this._source.maxzoom)[0],p=this.getTile(f);p&&p.hasData()?n[f.key]=f:h=!1}else{this._findLoadedChildren(l,o,n);for(var d=l.children(this._source.maxzoom),g=0;g<d.length;g++)if(!n[d[g].key]){h=!1;break}}if(!h)for(var m=l.overscaledZ-1;m>=a;--m){var v=l.scaledTo(m);if(i[v.key])break;if(i[v.key]=!0,!(c=this.getTile(v))&&u&&(c=this._addTile(v)),c&&(n[v.key]=v,u=c.wasRequested(),c.hasData()))break}}}return n},r.prototype._addTile=function(e){var r=this._tiles[e.key];if(r)return r;(r=this._cache.getAndRemove(e))&&(this._setTileReloadTimer(e.key,r),r.tileID=e);var n=Boolean(r);return n||(r=new st(e,this._source.tileSize*e.overscaleFactor()),this._loadTile(r,this._tileLoaded.bind(this,r,e.key,r.state))),r?(r.uses++,this._tiles[e.key]=r,n||this._source.fire(new t.Event("dataloading",{tile:r,coord:r.tileID,dataType:"source"})),r):null},r.prototype._setTileReloadTimer=function(t,e){var r=this;t in this._timers&&(clearTimeout(this._timers[t]),delete this._timers[t]);var n=e.getExpiryTimeout();n&&(this._timers[t]=setTimeout(function(){r._reloadTile(t,"expired"),delete r._timers[t]},n))},r.prototype._removeTile=function(t){var e=this._tiles[t];e&&(e.uses--,delete this._tiles[t],this._timers[t]&&(clearTimeout(this._timers[t]),delete this._timers[t]),e.uses>0||(e.hasData()?this._cache.add(e.tileID,e,e.getExpiryTimeout()):(e.aborted=!0,this._abortTile(e),this._unloadTile(e))))},r.prototype.clearTiles=function(){for(var t in this._shouldReloadOnResume=!1,this._paused=!1,this._tiles)this._removeTile(t);this._cache.reset()},r.prototype.tilesIn=function(e,r){for(var n=[],i=this.getIds(),a=1/0,o=1/0,s=-1/0,l=-1/0,c=e[0].zoom,u=0;u<e.length;u++){var h=e[u];a=Math.min(a,h.column),o=Math.min(o,h.row),s=Math.max(s,h.column),l=Math.max(l,h.row)}for(var f=0;f<i.length;f++){var p=this._tiles[i[f]],d=p.tileID,g=Math.pow(2,this.transform.zoom-p.tileID.overscaledZ),m=r*p.queryPadding*t.default$8/p.tileSize/g,v=[Xt(d,new t.default$17(a,o,c)),Xt(d,new t.default$17(s,l,c))];if(v[0].x-m<t.default$8&&v[0].y-m<t.default$8&&v[1].x+m>=0&&v[1].y+m>=0){for(var y=[],x=0;x<e.length;x++)y.push(Xt(d,e[x]));n.push({tile:p,tileID:d,queryGeometry:[y],scale:g})}}return n},r.prototype.getVisibleCoordinates=function(){for(var t=this,e=this.getRenderableIds().map(function(e){return t._tiles[e].tileID}),r=0,n=e;r<n.length;r+=1){var i=n[r];i.posMatrix=t.transform.calculatePosMatrix(i.toUnwrapped())}return e},r.prototype.hasTransition=function(){if(this._source.hasTransition())return!0;if(Zt(this._source.type))for(var t in this._tiles){var e=this._tiles[t];if(void 0!==e.fadeEndTime&&e.fadeEndTime>=a.now())return!0}return!1},r}(t.Evented);function Xt(e,r){var n=r.zoomTo(e.canonical.z);return new t.default$1((n.column-(e.canonical.x+e.wrap*Math.pow(2,e.canonical.z)))*t.default$8,(n.row-e.canonical.y)*t.default$8)}function Zt(t){return"raster"===t||"image"===t||"video"===t}function $t(){return new t.default.Worker(En.workerUrl)}Yt.maxOverzooming=10,Yt.maxUnderzooming=3;var Jt,Kt=function(){this.active={}};function Qt(e,r){var n={};for(var i in e)"ref"!==i&&(n[i]=e[i]);return t.default$18.forEach(function(t){t in r&&(n[t]=r[t])}),n}function te(t){t=t.slice();for(var e=Object.create(null),r=0;r<t.length;r++)e[t[r].id]=t[r];for(var n=0;n<t.length;n++)"ref"in t[n]&&(t[n]=Qt(t[n],e[t[n].ref]));return t}Kt.prototype.acquire=function(t){if(!this.workers){var e=En.workerCount;for(this.workers=[];this.workers.length<e;)this.workers.push(new $t)}return this.active[t]=!0,this.workers.slice()},Kt.prototype.release=function(t){delete this.active[t],0===Object.keys(this.active).length&&(this.workers.forEach(function(t){t.terminate()}),this.workers=null)};var ee={setStyle:"setStyle",addLayer:"addLayer",removeLayer:"removeLayer",setPaintProperty:"setPaintProperty",setLayoutProperty:"setLayoutProperty",setFilter:"setFilter",addSource:"addSource",removeSource:"removeSource",setGeoJSONSourceData:"setGeoJSONSourceData",setLayerZoomRange:"setLayerZoomRange",setLayerProperty:"setLayerProperty",setCenter:"setCenter",setZoom:"setZoom",setBearing:"setBearing",setPitch:"setPitch",setSprite:"setSprite",setGlyphs:"setGlyphs",setTransition:"setTransition",setLight:"setLight"};function re(t,e,r){r.push({command:ee.addSource,args:[t,e[t]]})}function ne(t,e,r){e.push({command:ee.removeSource,args:[t]}),r[t]=!0}function ie(t,e,r,n){ne(t,r,n),re(t,e,r)}function ae(e,r,n){var i;for(i in e[n])if(e[n].hasOwnProperty(i)&&"data"!==i&&!t.default$10(e[n][i],r[n][i]))return!1;for(i in r[n])if(r[n].hasOwnProperty(i)&&"data"!==i&&!t.default$10(e[n][i],r[n][i]))return!1;return!0}function oe(e,r,n,i,a,o){var s;for(s in r=r||{},e=e||{})e.hasOwnProperty(s)&&(t.default$10(e[s],r[s])||n.push({command:o,args:[i,s,r[s],a]}));for(s in r)r.hasOwnProperty(s)&&!e.hasOwnProperty(s)&&(t.default$10(e[s],r[s])||n.push({command:o,args:[i,s,r[s],a]}))}function se(t){return t.id}function le(t,e){return t[e.id]=e,t}var ce=function(t,e,r){var n=this.boxCells=[],i=this.circleCells=[];this.xCellCount=Math.ceil(t/r),this.yCellCount=Math.ceil(e/r);for(var a=0;a<this.xCellCount*this.yCellCount;a++)n.push([]),i.push([]);this.circleKeys=[],this.boxKeys=[],this.bboxes=[],this.circles=[],this.width=t,this.height=e,this.xScale=this.xCellCount/t,this.yScale=this.yCellCount/e,this.boxUid=0,this.circleUid=0};ce.prototype.keysLength=function(){return this.boxKeys.length+this.circleKeys.length},ce.prototype.insert=function(t,e,r,n,i){this._forEachCell(e,r,n,i,this._insertBoxCell,this.boxUid++),this.boxKeys.push(t),this.bboxes.push(e),this.bboxes.push(r),this.bboxes.push(n),this.bboxes.push(i)},ce.prototype.insertCircle=function(t,e,r,n){this._forEachCell(e-n,r-n,e+n,r+n,this._insertCircleCell,this.circleUid++),this.circleKeys.push(t),this.circles.push(e),this.circles.push(r),this.circles.push(n)},ce.prototype._insertBoxCell=function(t,e,r,n,i,a){this.boxCells[i].push(a)},ce.prototype._insertCircleCell=function(t,e,r,n,i,a){this.circleCells[i].push(a)},ce.prototype._query=function(t,e,r,n,i){if(r<0||t>this.width||n<0||e>this.height)return!i&&[];var a=[];if(t<=0&&e<=0&&this.width<=r&&this.height<=n){if(i)return!0;for(var o=0;o<this.boxKeys.length;o++)a.push({key:this.boxKeys[o],x1:this.bboxes[4*o],y1:this.bboxes[4*o+1],x2:this.bboxes[4*o+2],y2:this.bboxes[4*o+3]});for(var s=0;s<this.circleKeys.length;s++){var l=this.circles[3*s],c=this.circles[3*s+1],u=this.circles[3*s+2];a.push({key:this.circleKeys[s],x1:l-u,y1:c-u,x2:l+u,y2:c+u})}}else{var h={hitTest:i,seenUids:{box:{},circle:{}}};this._forEachCell(t,e,r,n,this._queryCell,a,h)}return i?a.length>0:a},ce.prototype._queryCircle=function(t,e,r,n){var i=t-r,a=t+r,o=e-r,s=e+r;if(a<0||i>this.width||s<0||o>this.height)return!n&&[];var l=[],c={hitTest:n,circle:{x:t,y:e,radius:r},seenUids:{box:{},circle:{}}};return this._forEachCell(i,o,a,s,this._queryCellCircle,l,c),n?l.length>0:l},ce.prototype.query=function(t,e,r,n){return this._query(t,e,r,n,!1)},ce.prototype.hitTest=function(t,e,r,n){return this._query(t,e,r,n,!0)},ce.prototype.hitTestCircle=function(t,e,r){return this._queryCircle(t,e,r,!0)},ce.prototype._queryCell=function(t,e,r,n,i,a,o){var s=o.seenUids,l=this.boxCells[i];if(null!==l)for(var c=this.bboxes,u=0,h=l;u<h.length;u+=1){var f=h[u];if(!s.box[f]){s.box[f]=!0;var p=4*f;if(t<=c[p+2]&&e<=c[p+3]&&r>=c[p+0]&&n>=c[p+1]){if(o.hitTest)return a.push(!0),!0;a.push({key:this.boxKeys[f],x1:c[p],y1:c[p+1],x2:c[p+2],y2:c[p+3]})}}}var d=this.circleCells[i];if(null!==d)for(var g=this.circles,m=0,v=d;m<v.length;m+=1){var y=v[m];if(!s.circle[y]){s.circle[y]=!0;var x=3*y;if(this._circleAndRectCollide(g[x],g[x+1],g[x+2],t,e,r,n)){if(o.hitTest)return a.push(!0),!0;var b=g[x],_=g[x+1],w=g[x+2];a.push({key:this.circleKeys[y],x1:b-w,y1:_-w,x2:b+w,y2:_+w})}}}},ce.prototype._queryCellCircle=function(t,e,r,n,i,a,o){var s=o.circle,l=o.seenUids,c=this.boxCells[i];if(null!==c)for(var u=this.bboxes,h=0,f=c;h<f.length;h+=1){var p=f[h];if(!l.box[p]){l.box[p]=!0;var d=4*p;if(this._circleAndRectCollide(s.x,s.y,s.radius,u[d+0],u[d+1],u[d+2],u[d+3]))return a.push(!0),!0}}var g=this.circleCells[i];if(null!==g)for(var m=this.circles,v=0,y=g;v<y.length;v+=1){var x=y[v];if(!l.circle[x]){l.circle[x]=!0;var b=3*x;if(this._circlesCollide(m[b],m[b+1],m[b+2],s.x,s.y,s.radius))return a.push(!0),!0}}},ce.prototype._forEachCell=function(t,e,r,n,i,a,o){for(var s=this._convertToXCellCoord(t),l=this._convertToYCellCoord(e),c=this._convertToXCellCoord(r),u=this._convertToYCellCoord(n),h=s;h<=c;h++)for(var f=l;f<=u;f++){var p=this.xCellCount*f+h;if(i.call(this,t,e,r,n,p,a,o))return}},ce.prototype._convertToXCellCoord=function(t){return Math.max(0,Math.min(this.xCellCount-1,Math.floor(t*this.xScale)))},ce.prototype._convertToYCellCoord=function(t){return Math.max(0,Math.min(this.yCellCount-1,Math.floor(t*this.yScale)))},ce.prototype._circlesCollide=function(t,e,r,n,i,a){var o=n-t,s=i-e,l=r+a;return l*l>o*o+s*s},ce.prototype._circleAndRectCollide=function(t,e,r,n,i,a,o){var s=(a-n)/2,l=Math.abs(t-(n+s));if(l>s+r)return!1;var c=(o-i)/2,u=Math.abs(e-(i+c));if(u>c+r)return!1;if(l<=s||u<=c)return!0;var h=l-s,f=u-c;return h*h+f*f<=r*r};var ue=t.default$19.layout;function he(e,r,n,i,a){var o=t.mat4.identity(new Float32Array(16));return r?(t.mat4.identity(o),t.mat4.scale(o,o,[1/a,1/a,1]),n||t.mat4.rotateZ(o,o,i.angle)):(t.mat4.scale(o,o,[i.width/2,-i.height/2,1]),t.mat4.translate(o,o,[1,-1,0]),t.mat4.multiply(o,o,e)),o}function fe(e,r,n,i,a){var o=t.mat4.identity(new Float32Array(16));return r?(t.mat4.multiply(o,o,e),t.mat4.scale(o,o,[a,a,1]),n||t.mat4.rotateZ(o,o,-i.angle)):(t.mat4.scale(o,o,[1,-1,1]),t.mat4.translate(o,o,[-1,-1,0]),t.mat4.scale(o,o,[2/i.width,2/i.height,1])),o}function pe(e,r){var n=[e.x,e.y,0,1];ke(n,n,r);var i=n[3];return{point:new t.default$1(n[0]/i,n[1]/i),signedDistanceFromCamera:i}}function de(t,e){var r=t[0]/t[3],n=t[1]/t[3];return r>=-e[0]&&r<=e[0]&&n>=-e[1]&&n<=e[1]}function ge(e,r,n,i,a,o,s,l){var c=i?e.textSizeData:e.iconSizeData,u=t.evaluateSizeForZoom(c,n.transform.zoom,ue.properties[i?"text-size":"icon-size"]),h=[256/n.width*2+1,256/n.height*2+1],f=i?e.text.dynamicLayoutVertexArray:e.icon.dynamicLayoutVertexArray;f.clear();for(var p=e.lineVertexArray,d=i?e.text.placedSymbolArray:e.icon.placedSymbolArray,g=n.transform.width/n.transform.height,m=!1,v=0;v<d.length;v++){var y=d.get(v);if(y.hidden||y.writingMode===t.WritingMode.vertical&&!m)we(y.numGlyphs,f);else{m=!1;var x=[y.anchorX,y.anchorY,0,1];if(t.vec4.transformMat4(x,x,r),de(x,h)){var b=.5+x[3]/n.transform.cameraToCenterDistance*.5,_=t.evaluateSizeForFeature(c,u,y),w=s?_*b:_/b,k=new t.default$1(y.anchorX,y.anchorY),M=pe(k,a).point,A={},T=ye(y,w,!1,l,r,a,o,e.glyphOffsetArray,p,f,M,k,A,g);m=T.useVertical,(T.notEnoughRoom||m||T.needsFlipping&&ye(y,w,!0,l,r,a,o,e.glyphOffsetArray,p,f,M,k,A,g).notEnoughRoom)&&we(y.numGlyphs,f)}else we(y.numGlyphs,f)}}i?e.text.dynamicLayoutVertexBuffer.updateData(f):e.icon.dynamicLayoutVertexBuffer.updateData(f)}function me(t,e,r,n,i,a,o,s,l,c,u,h){var f=s.glyphStartIndex+s.numGlyphs,p=s.lineStartIndex,d=s.lineStartIndex+s.lineLength,g=e.getoffsetX(s.glyphStartIndex),m=e.getoffsetX(f-1),v=be(t*g,r,n,i,a,o,s.segment,p,d,l,c,u,h);if(!v)return null;var y=be(t*m,r,n,i,a,o,s.segment,p,d,l,c,u,h);return y?{first:v,last:y}:null}function ve(e,r,n,i){return e===t.WritingMode.horizontal&&Math.abs(n.y-r.y)>Math.abs(n.x-r.x)*i?{useVertical:!0}:(e===t.WritingMode.vertical?r.y<n.y:r.x>n.x)?{needsFlipping:!0}:null}function ye(e,r,n,i,a,o,s,l,c,u,h,f,p,d){var g,m=r/24,v=e.lineOffsetX*r,y=e.lineOffsetY*r;if(e.numGlyphs>1){var x=e.glyphStartIndex+e.numGlyphs,b=e.lineStartIndex,_=e.lineStartIndex+e.lineLength,w=me(m,l,v,y,n,h,f,e,c,o,p,!1);if(!w)return{notEnoughRoom:!0};var k=pe(w.first.point,s).point,M=pe(w.last.point,s).point;if(i&&!n){var A=ve(e.writingMode,k,M,d);if(A)return A}g=[w.first];for(var T=e.glyphStartIndex+1;T<x-1;T++)g.push(be(m*l.getoffsetX(T),v,y,n,h,f,e.segment,b,_,c,o,p,!1));g.push(w.last)}else{if(i&&!n){var S=pe(f,a).point,E=e.lineStartIndex+e.segment+1,C=new t.default$1(c.getx(E),c.gety(E)),L=pe(C,a),z=L.signedDistanceFromCamera>0?L.point:xe(f,C,S,1,a),P=ve(e.writingMode,S,z,d);if(P)return P}var I=be(m*l.getoffsetX(e.glyphStartIndex),v,y,n,h,f,e.segment,e.lineStartIndex,e.lineStartIndex+e.lineLength,c,o,p,!1);if(!I)return{notEnoughRoom:!0};g=[I]}for(var O=0,D=g;O<D.length;O+=1){var R=D[O];t.addDynamicAttributes(u,R.point,R.angle)}return{}}function xe(t,e,r,n,i){var a=pe(t.add(t.sub(e)._unit()),i).point,o=r.sub(a);return r.add(o._mult(n/o.mag()))}function be(e,r,n,i,a,o,s,l,c,u,h,f,p){var d=i?e-r:e+r,g=d>0?1:-1,m=0;i&&(g*=-1,m=Math.PI),g<0&&(m+=Math.PI);for(var v=g>0?l+s:l+s+1,y=v,x=a,b=a,_=0,w=0,k=Math.abs(d);_+w<=k;){if((v+=g)<l||v>=c)return null;if(b=x,void 0===(x=f[v])){var M=new t.default$1(u.getx(v),u.gety(v)),A=pe(M,h);if(A.signedDistanceFromCamera>0)x=f[v]=A.point;else{var T=v-g;x=xe(0===_?o:new t.default$1(u.getx(T),u.gety(T)),M,b,k-_+1,h)}}_+=w,w=b.dist(x)}var S=(k-_)/w,E=x.sub(b),C=E.mult(S)._add(b);return C._add(E._unit()._perp()._mult(n*g)),{point:C,angle:m+Math.atan2(x.y-b.y,x.x-b.x),tileDistance:p?{prevTileDistance:v-g===y?0:u.gettileUnitDistanceFromAnchor(v-g),lastSegmentViewportDistance:k-_}:null}}var _e=new Float32Array([-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0,-1/0,-1/0,0]);function we(t,e){for(var r=0;r<t;r++){var n=e.length;e.resize(n+4),e.float32.set(_e,3*n)}}function ke(t,e,r){var n=e[0],i=e[1];return t[0]=r[0]*n+r[4]*i+r[12],t[1]=r[1]*n+r[5]*i+r[13],t[3]=r[3]*n+r[7]*i+r[15],t}t.default$20.mat4;var Me=function(t,e,r){void 0===e&&(e=new ce(t.width+200,t.height+200,25)),void 0===r&&(r=new ce(t.width+200,t.height+200,25)),this.transform=t,this.grid=e,this.ignoredGrid=r,this.pitchfactor=Math.cos(t._pitch)*t.cameraToCenterDistance,this.screenRightBoundary=t.width+100,this.screenBottomBoundary=t.height+100};function Ae(t,e,r){t[e+4]=r?1:0}function Te(e,r,n){return r*(t.default$8/(e.tileSize*Math.pow(2,n-e.tileID.overscaledZ)))}Me.prototype.placeCollisionBox=function(t,e,r,n){var i=this.projectAndGetPerspectiveRatio(n,t.anchorPointX,t.anchorPointY),a=r*i.perspectiveRatio,o=t.x1*a+i.point.x,s=t.y1*a+i.point.y,l=t.x2*a+i.point.x,c=t.y2*a+i.point.y;return!e&&this.grid.hitTest(o,s,l,c)?{box:[],offscreen:!1}:{box:[o,s,l,c],offscreen:this.isOffscreen(o,s,l,c)}},Me.prototype.approximateTileDistance=function(t,e,r,n,i){var a=i?1:n/this.pitchfactor,o=t.lastSegmentViewportDistance*r;return t.prevTileDistance+o+(a-1)*o*Math.abs(Math.sin(e))},Me.prototype.placeCollisionCircles=function(e,r,n,i,a,o,s,l,c,u,h,f,p){var d=[],g=this.projectAnchor(u,o.anchorX,o.anchorY),m=c/24,v=o.lineOffsetX*c,y=o.lineOffsetY*c,x=new t.default$1(o.anchorX,o.anchorY),b=me(m,l,v,y,!1,pe(x,h).point,x,o,s,h,{},!0),_=!1,w=!0,k=g.perspectiveRatio*i,M=1/(i*n),A=0,T=0;b&&(A=this.approximateTileDistance(b.first.tileDistance,b.first.angle,M,g.cameraDistance,p),T=this.approximateTileDistance(b.last.tileDistance,b.last.angle,M,g.cameraDistance,p));for(var S=0;S<e.length;S+=5){var E=e[S],C=e[S+1],L=e[S+2],z=e[S+3];if(!b||z<-A||z>T)Ae(e,S,!1);else{var P=this.projectPoint(u,E,C),I=L*k;if(d.length>0){var O=P.x-d[d.length-4],D=P.y-d[d.length-3];if(I*I*2>O*O+D*D&&S+8<e.length){var R=e[S+8];if(R>-A&&R<T){Ae(e,S,!1);continue}}}var B=S/5;if(d.push(P.x,P.y,I,B),Ae(e,S,!0),w=w&&this.isOffscreen(P.x-I,P.y-I,P.x+I,P.y+I),!r&&this.grid.hitTestCircle(P.x,P.y,I)){if(!f)return{circles:[],offscreen:!1};_=!0}}}return{circles:_?[]:d,offscreen:w}},Me.prototype.queryRenderedSymbols=function(e){if(0===e.length||0===this.grid.keysLength()&&0===this.ignoredGrid.keysLength())return{};for(var r=[],n=1/0,i=1/0,a=-1/0,o=-1/0,s=0,l=e;s<l.length;s+=1){var c=l[s],u=new t.default$1(c.x+100,c.y+100);n=Math.min(n,u.x),i=Math.min(i,u.y),a=Math.max(a,u.x),o=Math.max(o,u.y),r.push(u)}for(var h={},f={},p=0,d=this.grid.query(n,i,a,o).concat(this.ignoredGrid.query(n,i,a,o));p<d.length;p+=1){var g=d[p],m=g.key;if(void 0===h[m.bucketInstanceId]&&(h[m.bucketInstanceId]={}),!h[m.bucketInstanceId][m.featureIndex]){var v=[new t.default$1(g.x1,g.y1),new t.default$1(g.x2,g.y1),new t.default$1(g.x2,g.y2),new t.default$1(g.x1,g.y2)];t.polygonIntersectsPolygon(r,v)&&(h[m.bucketInstanceId][m.featureIndex]=!0,void 0===f[m.bucketInstanceId]&&(f[m.bucketInstanceId]=[]),f[m.bucketInstanceId].push(m.featureIndex))}}return f},Me.prototype.insertCollisionBox=function(t,e,r,n){var i={bucketInstanceId:r,featureIndex:n};(e?this.ignoredGrid:this.grid).insert(i,t[0],t[1],t[2],t[3])},Me.prototype.insertCollisionCircles=function(t,e,r,n){for(var i=e?this.ignoredGrid:this.grid,a={bucketInstanceId:r,featureIndex:n},o=0;o<t.length;o+=4)i.insertCircle(a,t[o],t[o+1],t[o+2])},Me.prototype.projectAnchor=function(t,e,r){var n=[e,r,0,1];return ke(n,n,t),{perspectiveRatio:.5+this.transform.cameraToCenterDistance/n[3]*.5,cameraDistance:n[3]}},Me.prototype.projectPoint=function(e,r,n){var i=[r,n,0,1];return ke(i,i,e),new t.default$1((i[0]/i[3]+1)/2*this.transform.width+100,(-i[1]/i[3]+1)/2*this.transform.height+100)},Me.prototype.projectAndGetPerspectiveRatio=function(e,r,n){var i=[r,n,0,1];return ke(i,i,e),{point:new t.default$1((i[0]/i[3]+1)/2*this.transform.width+100,(-i[1]/i[3]+1)/2*this.transform.height+100),perspectiveRatio:.5+this.transform.cameraToCenterDistance/i[3]*.5}},Me.prototype.isOffscreen=function(t,e,r,n){return r<100||t>=this.screenRightBoundary||n<100||e>this.screenBottomBoundary};var Se=t.default$19.layout,Ee=function(t,e,r,n){this.opacity=t?Math.max(0,Math.min(1,t.opacity+(t.placed?e:-e))):n&&r?1:0,this.placed=r};Ee.prototype.isHidden=function(){return 0===this.opacity&&!this.placed};var Ce=function(t,e,r,n,i){this.text=new Ee(t?t.text:null,e,r,i),this.icon=new Ee(t?t.icon:null,e,n,i)};Ce.prototype.isHidden=function(){return this.text.isHidden()&&this.icon.isHidden()};var Le=function(t,e,r){this.text=t,this.icon=e,this.skipFade=r},ze=function(t,e){this.transform=t.clone(),this.collisionIndex=new Me(this.transform),this.placements={},this.opacities={},this.stale=!1,this.fadeDuration=e,this.retainedQueryData={}};function Pe(t,e,r){t.emplaceBack(e?1:0,r?1:0),t.emplaceBack(e?1:0,r?1:0),t.emplaceBack(e?1:0,r?1:0),t.emplaceBack(e?1:0,r?1:0)}ze.prototype.placeLayerTile=function(e,r,n,i){var a=r.getBucket(e),o=r.latestFeatureIndex;if(a&&o&&e.id===a.layerIds[0]){var s=r.collisionBoxArray,l=a.layers[0].layout,c=Math.pow(2,this.transform.zoom-r.tileID.overscaledZ),u=r.tileSize/t.default$8,h=this.transform.calculatePosMatrix(r.tileID.toUnwrapped()),f=he(h,"map"===l.get("text-pitch-alignment"),"map"===l.get("text-rotation-alignment"),this.transform,Te(r,1,this.transform.zoom)),p=he(h,"map"===l.get("icon-pitch-alignment"),"map"===l.get("icon-rotation-alignment"),this.transform,Te(r,1,this.transform.zoom));this.retainedQueryData[a.bucketInstanceId]=new function(t,e,r,n,i){this.bucketInstanceId=t,this.featureIndex=e,this.sourceLayerIndex=r,this.bucketIndex=n,this.tileID=i}(a.bucketInstanceId,o,a.sourceLayerIndex,a.index,r.tileID),this.placeLayerBucket(a,h,f,p,c,u,n,i,s)}},ze.prototype.placeLayerBucket=function(e,r,n,i,a,o,s,l,c){for(var u=e.layers[0].layout,h=t.evaluateSizeForZoom(e.textSizeData,this.transform.zoom,Se.properties["text-size"]),f=!e.hasTextData()||u.get("text-optional"),p=!e.hasIconData()||u.get("icon-optional"),d=0,g=e.symbolInstances;d<g.length;d+=1){var m=g[d];if(!l[m.crossTileID]){var v=void 0!==m.feature.text,y=void 0!==m.feature.icon,x=!0,b=null,_=null,w=null,k=0,M=0;m.collisionArrays||(m.collisionArrays=e.deserializeCollisionBoxes(c,m.textBoxStartIndex,m.textBoxEndIndex,m.iconBoxStartIndex,m.iconBoxEndIndex)),m.collisionArrays.textFeatureIndex&&(k=m.collisionArrays.textFeatureIndex),m.collisionArrays.textBox&&(v=(b=this.collisionIndex.placeCollisionBox(m.collisionArrays.textBox,u.get("text-allow-overlap"),o,r)).box.length>0,x=x&&b.offscreen);var A=m.collisionArrays.textCircles;if(A){var T=e.text.placedSymbolArray.get(m.placedTextSymbolIndices[0]),S=t.evaluateSizeForFeature(e.textSizeData,h,T);_=this.collisionIndex.placeCollisionCircles(A,u.get("text-allow-overlap"),a,o,m.key,T,e.lineVertexArray,e.glyphOffsetArray,S,r,n,s,"map"===u.get("text-pitch-alignment")),v=u.get("text-allow-overlap")||_.circles.length>0,x=x&&_.offscreen}m.collisionArrays.iconFeatureIndex&&(M=m.collisionArrays.iconFeatureIndex),m.collisionArrays.iconBox&&(y=(w=this.collisionIndex.placeCollisionBox(m.collisionArrays.iconBox,u.get("icon-allow-overlap"),o,r)).box.length>0,x=x&&w.offscreen),f||p?p?f||(y=y&&v):v=y&&v:y=v=y&&v,v&&b&&this.collisionIndex.insertCollisionBox(b.box,u.get("text-ignore-placement"),e.bucketInstanceId,k),y&&w&&this.collisionIndex.insertCollisionBox(w.box,u.get("icon-ignore-placement"),e.bucketInstanceId,M),v&&_&&this.collisionIndex.insertCollisionCircles(_.circles,u.get("text-ignore-placement"),e.bucketInstanceId,k),this.placements[m.crossTileID]=new Le(v,y,x||e.justReloaded),l[m.crossTileID]=!0}}e.justReloaded=!1},ze.prototype.commit=function(t,e){this.commitTime=e;var r=!1,n=t&&0!==this.fadeDuration?(this.commitTime-t.commitTime)/this.fadeDuration:1,i=t?t.opacities:{};for(var a in this.placements){var o=this.placements[a],s=i[a];s?(this.opacities[a]=new Ce(s,n,o.text,o.icon),r=r||o.text!==s.text.placed||o.icon!==s.icon.placed):(this.opacities[a]=new Ce(null,n,o.text,o.icon,o.skipFade),r=r||o.text||o.icon)}for(var l in i){var c=i[l];if(!this.opacities[l]){var u=new Ce(c,n,!1,!1);u.isHidden()||(this.opacities[l]=u,r=r||c.text.placed||c.icon.placed)}}r?this.lastPlacementChangeTime=e:"number"!=typeof this.lastPlacementChangeTime&&(this.lastPlacementChangeTime=t?t.lastPlacementChangeTime:e)},ze.prototype.updateLayerOpacities=function(t,e){for(var r={},n=0,i=e;n<i.length;n+=1){var a=i[n],o=a.getBucket(t);o&&a.latestFeatureIndex&&t.id===o.layerIds[0]&&this.updateBucketOpacities(o,r,a.collisionBoxArray)}},ze.prototype.updateBucketOpacities=function(t,e,r){t.hasTextData()&&t.text.opacityVertexArray.clear(),t.hasIconData()&&t.icon.opacityVertexArray.clear(),t.hasCollisionBoxData()&&t.collisionBox.collisionVertexArray.clear(),t.hasCollisionCircleData()&&t.collisionCircle.collisionVertexArray.clear();for(var n=t.layers[0].layout,i=new Ce(null,0,!1,!1,!0),a=new Ce(null,0,n.get("text-allow-overlap"),n.get("icon-allow-overlap"),!0),o=0;o<t.symbolInstances.length;o++){var s=t.symbolInstances[o],l=e[s.crossTileID],c=this.opacities[s.crossTileID];l?c=i:c||(c=a,this.opacities[s.crossTileID]=c),e[s.crossTileID]=!0;var u=s.numGlyphVertices>0||s.numVerticalGlyphVertices>0,h=s.numIconVertices>0;if(u){for(var f=je(c.text),p=(s.numGlyphVertices+s.numVerticalGlyphVertices)/4,d=0;d<p;d++)t.text.opacityVertexArray.emplaceBack(f);for(var g=0,m=s.placedTextSymbolIndices;g<m.length;g+=1){var v=m[g];t.text.placedSymbolArray.get(v).hidden=c.text.isHidden()}}if(h){for(var y=je(c.icon),x=0;x<s.numIconVertices/4;x++)t.icon.opacityVertexArray.emplaceBack(y);t.icon.placedSymbolArray.get(o).hidden=c.icon.isHidden()}s.collisionArrays||(s.collisionArrays=t.deserializeCollisionBoxes(r,s.textBoxStartIndex,s.textBoxEndIndex,s.iconBoxStartIndex,s.iconBoxEndIndex));var b=s.collisionArrays;if(b){b.textBox&&t.hasCollisionBoxData()&&Pe(t.collisionBox.collisionVertexArray,c.text.placed,!1),b.iconBox&&t.hasCollisionBoxData()&&Pe(t.collisionBox.collisionVertexArray,c.icon.placed,!1);var _=b.textCircles;if(_&&t.hasCollisionCircleData())for(var w=0;w<_.length;w+=5){var k=l||0===_[w+4];Pe(t.collisionCircle.collisionVertexArray,c.text.placed,k)}}}t.sortFeatures(this.transform.angle),this.retainedQueryData[t.bucketInstanceId]&&(this.retainedQueryData[t.bucketInstanceId].featureSortOrder=t.featureSortOrder),t.hasTextData()&&t.text.opacityVertexBuffer&&t.text.opacityVertexBuffer.updateData(t.text.opacityVertexArray),t.hasIconData()&&t.icon.opacityVertexBuffer&&t.icon.opacityVertexBuffer.updateData(t.icon.opacityVertexArray),t.hasCollisionBoxData()&&t.collisionBox.collisionVertexBuffer&&t.collisionBox.collisionVertexBuffer.updateData(t.collisionBox.collisionVertexArray),t.hasCollisionCircleData()&&t.collisionCircle.collisionVertexBuffer&&t.collisionCircle.collisionVertexBuffer.updateData(t.collisionCircle.collisionVertexArray)},ze.prototype.symbolFadeChange=function(t){return 0===this.fadeDuration?1:(t-this.commitTime)/this.fadeDuration},ze.prototype.hasTransitions=function(t){return this.stale||t-this.lastPlacementChangeTime<this.fadeDuration},ze.prototype.stillRecent=function(t){return"undefined"!==this.commitTime&&this.commitTime+this.fadeDuration>t},ze.prototype.setStale=function(){this.stale=!0};var Ie=Math.pow(2,25),Oe=Math.pow(2,24),De=Math.pow(2,17),Re=Math.pow(2,16),Be=Math.pow(2,9),Fe=Math.pow(2,8),Ne=Math.pow(2,1);function je(t){if(0===t.opacity&&!t.placed)return 0;if(1===t.opacity&&t.placed)return 4294967295;var e=t.placed?1:0,r=Math.floor(127*t.opacity);return r*Ie+e*Oe+r*De+e*Re+r*Be+e*Fe+r*Ne+e}var Ve=function(){this._currentTileIndex=0,this._seenCrossTileIDs={}};Ve.prototype.continuePlacement=function(t,e,r,n,i){for(;this._currentTileIndex<t.length;){var a=t[this._currentTileIndex];if(e.placeLayerTile(n,a,r,this._seenCrossTileIDs),this._currentTileIndex++,i())return!0}};var Ue=function(t,e,r,n,i){this.placement=new ze(t,i),this._currentPlacementIndex=e.length-1,this._forceFullPlacement=r,this._showCollisionBoxes=n,this._done=!1};Ue.prototype.isDone=function(){return this._done},Ue.prototype.continuePlacement=function(t,e,r){for(var n=this,i=a.now(),o=function(){var t=a.now()-i;return!n._forceFullPlacement&&t>2};this._currentPlacementIndex>=0;){var s=e[t[n._currentPlacementIndex]],l=n.placement.collisionIndex.transform.zoom;if("symbol"===s.type&&(!s.minzoom||s.minzoom<=l)&&(!s.maxzoom||s.maxzoom>l)){if(n._inProgressLayer||(n._inProgressLayer=new Ve),n._inProgressLayer.continuePlacement(r[s.source],n.placement,n._showCollisionBoxes,s,o))return;delete n._inProgressLayer}n._currentPlacementIndex--}this._done=!0},Ue.prototype.commit=function(t,e){return this.placement.commit(t,e),this.placement};var qe=512/t.default$8/2,He=function(t,e,r){this.tileID=t,this.indexedSymbolInstances={},this.bucketInstanceId=r;for(var n=0,i=e;n<i.length;n+=1){var a=i[n],o=a.key;this.indexedSymbolInstances[o]||(this.indexedSymbolInstances[o]=[]),this.indexedSymbolInstances[o].push({crossTileID:a.crossTileID,coord:this.getScaledCoordinates(a,t)})}};He.prototype.getScaledCoordinates=function(e,r){var n=r.canonical.z-this.tileID.canonical.z,i=qe/Math.pow(2,n),a=e.anchor;return{x:Math.floor((r.canonical.x*t.default$8+a.x)*i),y:Math.floor((r.canonical.y*t.default$8+a.y)*i)}},He.prototype.findMatches=function(t,e,r){for(var n=this.tileID.canonical.z<e.canonical.z?1:Math.pow(2,this.tileID.canonical.z-e.canonical.z),i=0,a=t;i<a.length;i+=1){var o=a[i];if(!o.crossTileID){var s=this.indexedSymbolInstances[o.key];if(s)for(var l=this.getScaledCoordinates(o,e),c=0,u=s;c<u.length;c+=1){var h=u[c];if(Math.abs(h.coord.x-l.x)<=n&&Math.abs(h.coord.y-l.y)<=n&&!r[h.crossTileID]){r[h.crossTileID]=!0,o.crossTileID=h.crossTileID;break}}}}};var Ge=function(){this.maxCrossTileID=0};Ge.prototype.generate=function(){return++this.maxCrossTileID};var We=function(){this.indexes={},this.usedCrossTileIDs={},this.lng=0};We.prototype.handleWrapJump=function(t){var e=Math.round((t-this.lng)/360);if(0!==e)for(var r in this.indexes){var n=this.indexes[r],i={};for(var a in n){var o=n[a];o.tileID=o.tileID.unwrapTo(o.tileID.wrap+e),i[o.tileID.key]=o}this.indexes[r]=i}this.lng=t},We.prototype.addBucket=function(t,e,r){if(this.indexes[t.overscaledZ]&&this.indexes[t.overscaledZ][t.key]){if(this.indexes[t.overscaledZ][t.key].bucketInstanceId===e.bucketInstanceId)return!1;this.removeBucketCrossTileIDs(t.overscaledZ,this.indexes[t.overscaledZ][t.key])}for(var n=0,i=e.symbolInstances;n<i.length;n+=1)i[n].crossTileID=0;this.usedCrossTileIDs[t.overscaledZ]||(this.usedCrossTileIDs[t.overscaledZ]={});var a=this.usedCrossTileIDs[t.overscaledZ];for(var o in this.indexes){var s=this.indexes[o];if(Number(o)>t.overscaledZ)for(var l in s){var c=s[l];c.tileID.isChildOf(t)&&c.findMatches(e.symbolInstances,t,a)}else{var u=s[t.scaledTo(Number(o)).key];u&&u.findMatches(e.symbolInstances,t,a)}}for(var h=0,f=e.symbolInstances;h<f.length;h+=1){var p=f[h];p.crossTileID||(p.crossTileID=r.generate(),a[p.crossTileID]=!0)}return void 0===this.indexes[t.overscaledZ]&&(this.indexes[t.overscaledZ]={}),this.indexes[t.overscaledZ][t.key]=new He(t,e.symbolInstances,e.bucketInstanceId),!0},We.prototype.removeBucketCrossTileIDs=function(t,e){for(var r in e.indexedSymbolInstances)for(var n=0,i=e.indexedSymbolInstances[r];n<i.length;n+=1){var a=i[n];delete this.usedCrossTileIDs[t][a.crossTileID]}},We.prototype.removeStaleBuckets=function(t){var e=!1;for(var r in this.indexes){var n=this.indexes[r];for(var i in n)t[n[i].bucketInstanceId]||(this.removeBucketCrossTileIDs(r,n[i]),delete n[i],e=!0)}return e};var Ye=function(){this.layerIndexes={},this.crossTileIDs=new Ge,this.maxBucketInstanceId=0,this.bucketsInCurrentPlacement={}};Ye.prototype.addLayer=function(t,e,r){var n=this.layerIndexes[t.id];void 0===n&&(n=this.layerIndexes[t.id]=new We);var i=!1,a={};n.handleWrapJump(r);for(var o=0,s=e;o<s.length;o+=1){var l=s[o],c=l.getBucket(t);c&&t.id===c.layerIds[0]&&(c.bucketInstanceId||(c.bucketInstanceId=++this.maxBucketInstanceId),n.addBucket(l.tileID,c,this.crossTileIDs)&&(i=!0),a[c.bucketInstanceId]=!0)}return n.removeStaleBuckets(a)&&(i=!0),i},Ye.prototype.pruneUnusedLayers=function(t){var e={};for(var r in t.forEach(function(t){e[t]=!0}),this.layerIndexes)e[r]||delete this.layerIndexes[r]};var Xe=function(e,r){return t.emitValidationErrors(e,r&&r.filter(function(t){return"source.canvas"!==t.identifier}))},Ze=t.pick(ee,["addLayer","removeLayer","setPaintProperty","setLayoutProperty","setFilter","addSource","removeSource","setLayerZoomRange","setLight","setTransition","setGeoJSONSourceData"]),$e=t.pick(ee,["setCenter","setZoom","setBearing","setPitch"]),Je=function(e){function r(n,i){var a=this;void 0===i&&(i={}),e.call(this),this.map=n,this.dispatcher=new q((Jt||(Jt=new Kt),Jt),this),this.imageManager=new P,this.glyphManager=new F(n._transformRequest,i.localIdeographFontFamily),this.lineAtlas=new U(256,512),this.crossTileSymbolIndex=new Ye,this._layers={},this._order=[],this.sourceCaches={},this.zoomHistory=new t.default$23,this._loaded=!1,this._resetUpdates();var o=this;this._rtlTextPluginCallback=r.registerForPluginAvailability(function(t){for(var e in o.dispatcher.broadcast("loadRTLTextPlugin",t.pluginURL,t.completionCallback),o.sourceCaches)o.sourceCaches[e].reload()}),this.on("data",function(t){if("source"===t.dataType&&"metadata"===t.sourceDataType){var e=a.sourceCaches[t.sourceId];if(e){var r=e.getSource();if(r&&r.vectorLayerIds)for(var n in a._layers){var i=a._layers[n];i.source===r.id&&a._validateLayer(i)}}}})}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.loadURL=function(e,r){var n=this;void 0===r&&(r={}),this.fire(new t.Event("dataloading",{dataType:"style"}));var i="boolean"==typeof r.validate?r.validate:!x(e);e=function(t,e){if(!x(t))return t;var r=A(t);return r.path="/styles/v1"+r.path,y(r,e)}(e,r.accessToken);var a=this.map._transformRequest(e,t.ResourceType.Style);t.getJSON(a,function(e,r){e?n.fire(new t.ErrorEvent(e)):r&&n._load(r,i)})},r.prototype.loadJSON=function(e,r){var n=this;void 0===r&&(r={}),this.fire(new t.Event("dataloading",{dataType:"style"})),a.frame(function(){n._load(e,!1!==r.validate)})},r.prototype._load=function(e,r){var n=this;if(!r||!Xe(this,t.validateStyle(e))){for(var i in this._loaded=!0,this.stylesheet=e,e.sources)n.addSource(i,e.sources[i],{validate:!1});e.sprite?function(e,r,n){var i,o,s,l=a.devicePixelRatio>1?"@2x":"";function c(){if(s)n(s);else if(i&&o){var e=a.getImageData(o),r={};for(var l in i){var c=i[l],u=c.width,h=c.height,f=c.x,p=c.y,d=c.sdf,g=c.pixelRatio,m=new t.RGBAImage({width:u,height:h});t.RGBAImage.copy(e,m,{x:f,y:p},{x:0,y:0},{width:u,height:h}),r[l]={data:m,pixelRatio:g,sdf:d}}n(null,r)}}t.getJSON(r(_(e,l,".json"),t.ResourceType.SpriteJSON),function(t,e){s||(s=t,i=e,c())}),t.getImage(r(_(e,l,".png"),t.ResourceType.SpriteImage),function(t,e){s||(s=t,o=e,c())})}(e.sprite,this.map._transformRequest,function(e,r){if(e)n.fire(new t.ErrorEvent(e));else if(r)for(var i in r)n.imageManager.addImage(i,r[i]);n.imageManager.setLoaded(!0),n.fire(new t.Event("data",{dataType:"style"}))}):this.imageManager.setLoaded(!0),this.glyphManager.setURL(e.glyphs);var o=te(this.stylesheet.layers);this._order=o.map(function(t){return t.id}),this._layers={};for(var s=0,l=o;s<l.length;s+=1){var c=l[s];(c=t.default$22(c)).setEventedParent(n,{layer:{id:c.id}}),n._layers[c.id]=c}this.dispatcher.broadcast("setLayers",this._serializeLayers(this._order)),this.light=new V(this.stylesheet.light),this.fire(new t.Event("data",{dataType:"style"})),this.fire(new t.Event("style.load"))}},r.prototype._validateLayer=function(e){var r=this.sourceCaches[e.source];if(r){var n=e.sourceLayer;if(n){var i=r.getSource();("geojson"===i.type||i.vectorLayerIds&&-1===i.vectorLayerIds.indexOf(n))&&this.fire(new t.ErrorEvent(new Error('Source layer "'+n+'" does not exist on source "'+i.id+'" as specified by style layer "'+e.id+'"')))}}},r.prototype.loaded=function(){if(!this._loaded)return!1;if(Object.keys(this._updatedSources).length)return!1;for(var t in this.sourceCaches)if(!this.sourceCaches[t].loaded())return!1;return!!this.imageManager.isLoaded()},r.prototype._serializeLayers=function(t){var e=this;return t.map(function(t){return e._layers[t].serialize()})},r.prototype.hasTransitions=function(){if(this.light&&this.light.hasTransition())return!0;for(var t in this.sourceCaches)if(this.sourceCaches[t].hasTransition())return!0;for(var e in this._layers)if(this._layers[e].hasTransition())return!0;return!1},r.prototype._checkLoaded=function(){if(!this._loaded)throw new Error("Style is not done loading")},r.prototype.update=function(e){if(this._loaded){if(this._changed){var r=Object.keys(this._updatedLayers),n=Object.keys(this._removedLayers);for(var i in(r.length||n.length)&&this._updateWorkerLayers(r,n),this._updatedSources){var a=this._updatedSources[i];"reload"===a?this._reloadSource(i):"clear"===a&&this._clearSource(i)}for(var o in this._updatedPaintProps)this._layers[o].updateTransitions(e);this.light.updateTransitions(e),this._resetUpdates(),this.fire(new t.Event("data",{dataType:"style"}))}for(var s in this.sourceCaches)this.sourceCaches[s].used=!1;for(var l=0,c=this._order;l<c.length;l+=1){var u=c[l],h=this._layers[u];h.recalculate(e),!h.isHidden(e.zoom)&&h.source&&(this.sourceCaches[h.source].used=!0)}this.light.recalculate(e),this.z=e.zoom}},r.prototype._updateWorkerLayers=function(t,e){this.dispatcher.broadcast("updateLayers",{layers:this._serializeLayers(t),removedIds:e})},r.prototype._resetUpdates=function(){this._changed=!1,this._updatedLayers={},this._removedLayers={},this._updatedSources={},this._updatedPaintProps={}},r.prototype.setState=function(e){var r=this;if(this._checkLoaded(),Xe(this,t.validateStyle(e)))return!1;(e=t.clone(e)).layers=te(e.layers);var n=function(e,r){if(!e)return[{command:ee.setStyle,args:[r]}];var n=[];try{if(!t.default$10(e.version,r.version))return[{command:ee.setStyle,args:[r]}];t.default$10(e.center,r.center)||n.push({command:ee.setCenter,args:[r.center]}),t.default$10(e.zoom,r.zoom)||n.push({command:ee.setZoom,args:[r.zoom]}),t.default$10(e.bearing,r.bearing)||n.push({command:ee.setBearing,args:[r.bearing]}),t.default$10(e.pitch,r.pitch)||n.push({command:ee.setPitch,args:[r.pitch]}),t.default$10(e.sprite,r.sprite)||n.push({command:ee.setSprite,args:[r.sprite]}),t.default$10(e.glyphs,r.glyphs)||n.push({command:ee.setGlyphs,args:[r.glyphs]}),t.default$10(e.transition,r.transition)||n.push({command:ee.setTransition,args:[r.transition]}),t.default$10(e.light,r.light)||n.push({command:ee.setLight,args:[r.light]});var i={},a=[];!function(e,r,n,i){var a;for(a in r=r||{},e=e||{})e.hasOwnProperty(a)&&(r.hasOwnProperty(a)||ne(a,n,i));for(a in r)r.hasOwnProperty(a)&&(e.hasOwnProperty(a)?t.default$10(e[a],r[a])||("geojson"===e[a].type&&"geojson"===r[a].type&&ae(e,r,a)?n.push({command:ee.setGeoJSONSourceData,args:[a,r[a].data]}):ie(a,r,n,i)):re(a,r,n))}(e.sources,r.sources,a,i);var o=[];e.layers&&e.layers.forEach(function(t){i[t.source]?n.push({command:ee.removeLayer,args:[t.id]}):o.push(t)}),n=n.concat(a),function(e,r,n){r=r||[];var i,a,o,s,l,c,u,h=(e=e||[]).map(se),f=r.map(se),p=e.reduce(le,{}),d=r.reduce(le,{}),g=h.slice(),m=Object.create(null);for(i=0,a=0;i<h.length;i++)o=h[i],d.hasOwnProperty(o)?a++:(n.push({command:ee.removeLayer,args:[o]}),g.splice(g.indexOf(o,a),1));for(i=0,a=0;i<f.length;i++)o=f[f.length-1-i],g[g.length-1-i]!==o&&(p.hasOwnProperty(o)?(n.push({command:ee.removeLayer,args:[o]}),g.splice(g.lastIndexOf(o,g.length-a),1)):a++,c=g[g.length-i],n.push({command:ee.addLayer,args:[d[o],c]}),g.splice(g.length-i,0,o),m[o]=!0);for(i=0;i<f.length;i++)if(s=p[o=f[i]],l=d[o],!m[o]&&!t.default$10(s,l))if(t.default$10(s.source,l.source)&&t.default$10(s["source-layer"],l["source-layer"])&&t.default$10(s.type,l.type)){for(u in oe(s.layout,l.layout,n,o,null,ee.setLayoutProperty),oe(s.paint,l.paint,n,o,null,ee.setPaintProperty),t.default$10(s.filter,l.filter)||n.push({command:ee.setFilter,args:[o,l.filter]}),t.default$10(s.minzoom,l.minzoom)&&t.default$10(s.maxzoom,l.maxzoom)||n.push({command:ee.setLayerZoomRange,args:[o,l.minzoom,l.maxzoom]}),s)s.hasOwnProperty(u)&&"layout"!==u&&"paint"!==u&&"filter"!==u&&"metadata"!==u&&"minzoom"!==u&&"maxzoom"!==u&&(0===u.indexOf("paint.")?oe(s[u],l[u],n,o,u.slice(6),ee.setPaintProperty):t.default$10(s[u],l[u])||n.push({command:ee.setLayerProperty,args:[o,u,l[u]]}));for(u in l)l.hasOwnProperty(u)&&!s.hasOwnProperty(u)&&"layout"!==u&&"paint"!==u&&"filter"!==u&&"metadata"!==u&&"minzoom"!==u&&"maxzoom"!==u&&(0===u.indexOf("paint.")?oe(s[u],l[u],n,o,u.slice(6),ee.setPaintProperty):t.default$10(s[u],l[u])||n.push({command:ee.setLayerProperty,args:[o,u,l[u]]}))}else n.push({command:ee.removeLayer,args:[o]}),c=g[g.lastIndexOf(o)+1],n.push({command:ee.addLayer,args:[l,c]})}(o,r.layers,n)}catch(t){console.warn("Unable to compute style diff:",t),n=[{command:ee.setStyle,args:[r]}]}return n}(this.serialize(),e).filter(function(t){return!(t.command in $e)});if(0===n.length)return!1;var i=n.filter(function(t){return!(t.command in Ze)});if(i.length>0)throw new Error("Unimplemented: "+i.map(function(t){return t.command}).join(", ")+".");return n.forEach(function(t){"setTransition"!==t.command&&r[t.command].apply(r,t.args)}),this.stylesheet=e,!0},r.prototype.addImage=function(e,r){if(this.getImage(e))return this.fire(new t.ErrorEvent(new Error("An image with this name already exists.")));this.imageManager.addImage(e,r),this.fire(new t.Event("data",{dataType:"style"}))},r.prototype.getImage=function(t){return this.imageManager.getImage(t)},r.prototype.removeImage=function(e){if(!this.getImage(e))return this.fire(new t.ErrorEvent(new Error("No image with this name exists.")));this.imageManager.removeImage(e),this.fire(new t.Event("data",{dataType:"style"}))},r.prototype.addSource=function(e,r,n){var i=this;if(this._checkLoaded(),void 0!==this.sourceCaches[e])throw new Error("There is already a source with this ID");if(!r.type)throw new Error("The type property must be defined, but the only the following properties were given: "+Object.keys(r).join(", ")+".");if(!(["vector","raster","geojson","video","image"].indexOf(r.type)>=0&&this._validate(t.validateStyle.source,"sources."+e,r,null,n))){this.map&&this.map._collectResourceTiming&&(r.collectResourceTiming=!0);var a=this.sourceCaches[e]=new Yt(e,r,this.dispatcher);a.style=this,a.setEventedParent(this,function(){return{isSourceLoaded:i.loaded(),source:a.serialize(),sourceId:e}}),a.onAdd(this.map),this._changed=!0}},r.prototype.removeSource=function(e){if(this._checkLoaded(),void 0===this.sourceCaches[e])throw new Error("There is no source with this ID");for(var r in this._layers)if(this._layers[r].source===e)return this.fire(new t.ErrorEvent(new Error('Source "'+e+'" cannot be removed while layer "'+r+'" is using it.')));var n=this.sourceCaches[e];delete this.sourceCaches[e],delete this._updatedSources[e],n.fire(new t.Event("data",{sourceDataType:"metadata",dataType:"source",sourceId:e})),n.setEventedParent(null),n.clearTiles(),n.onRemove&&n.onRemove(this.map),this._changed=!0},r.prototype.setGeoJSONSourceData=function(t,e){this._checkLoaded(),this.sourceCaches[t].getSource().setData(e),this._changed=!0},r.prototype.getSource=function(t){return this.sourceCaches[t]&&this.sourceCaches[t].getSource()},r.prototype.addLayer=function(e,r,n){this._checkLoaded();var i=e.id;if(this.getLayer(i))this.fire(new t.ErrorEvent(new Error('Layer with id "'+i+'" already exists on this map')));else if("object"==typeof e.source&&(this.addSource(i,e.source),e=t.clone(e),e=t.extend(e,{source:i})),!this._validate(t.validateStyle.layer,"layers."+i,e,{arrayIndex:-1},n)){var a=t.default$22(e);this._validateLayer(a),a.setEventedParent(this,{layer:{id:i}});var o=r?this._order.indexOf(r):this._order.length;if(r&&-1===o)this.fire(new t.ErrorEvent(new Error('Layer with id "'+r+'" does not exist on this map.')));else{if(this._order.splice(o,0,i),this._layerOrderChanged=!0,this._layers[i]=a,this._removedLayers[i]&&a.source){var s=this._removedLayers[i];delete this._removedLayers[i],s.type!==a.type?this._updatedSources[a.source]="clear":(this._updatedSources[a.source]="reload",this.sourceCaches[a.source].pause())}this._updateLayer(a)}}},r.prototype.moveLayer=function(e,r){if(this._checkLoaded(),this._changed=!0,this._layers[e]){if(e!==r){var n=this._order.indexOf(e);this._order.splice(n,1);var i=r?this._order.indexOf(r):this._order.length;r&&-1===i?this.fire(new t.ErrorEvent(new Error('Layer with id "'+r+'" does not exist on this map.'))):(this._order.splice(i,0,e),this._layerOrderChanged=!0)}}else this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be moved.")))},r.prototype.removeLayer=function(e){this._checkLoaded();var r=this._layers[e];if(r){r.setEventedParent(null);var n=this._order.indexOf(e);this._order.splice(n,1),this._layerOrderChanged=!0,this._changed=!0,this._removedLayers[e]=r,delete this._layers[e],delete this._updatedLayers[e],delete this._updatedPaintProps[e]}else this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be removed.")))},r.prototype.getLayer=function(t){return this._layers[t]},r.prototype.setLayerZoomRange=function(e,r,n){this._checkLoaded();var i=this.getLayer(e);i?i.minzoom===r&&i.maxzoom===n||(null!=r&&(i.minzoom=r),null!=n&&(i.maxzoom=n),this._updateLayer(i)):this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot have zoom extent.")))},r.prototype.setFilter=function(e,r){this._checkLoaded();var n=this.getLayer(e);if(n){if(!t.default$10(n.filter,r))return null==r?(n.filter=void 0,void this._updateLayer(n)):void(this._validate(t.validateStyle.filter,"layers."+n.id+".filter",r)||(n.filter=t.clone(r),this._updateLayer(n)))}else this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be filtered.")))},r.prototype.getFilter=function(e){return t.clone(this.getLayer(e).filter)},r.prototype.setLayoutProperty=function(e,r,n){this._checkLoaded();var i=this.getLayer(e);i?t.default$10(i.getLayoutProperty(r),n)||(i.setLayoutProperty(r,n),this._updateLayer(i)):this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be styled.")))},r.prototype.getLayoutProperty=function(t,e){return this.getLayer(t).getLayoutProperty(e)},r.prototype.setPaintProperty=function(e,r,n){this._checkLoaded();var i=this.getLayer(e);if(i){if(!t.default$10(i.getPaintProperty(r),n)){var a=i._transitionablePaint._values[r].value.isDataDriven();i.setPaintProperty(r,n),(i._transitionablePaint._values[r].value.isDataDriven()||a)&&this._updateLayer(i),this._changed=!0,this._updatedPaintProps[e]=!0}}else this.fire(new t.ErrorEvent(new Error("The layer '"+e+"' does not exist in the map's style and cannot be styled.")))},r.prototype.getPaintProperty=function(t,e){return this.getLayer(t).getPaintProperty(e)},r.prototype.getTransition=function(){return t.extend({duration:300,delay:0},this.stylesheet&&this.stylesheet.transition)},r.prototype.serialize=function(){var e=this;return t.filterObject({version:this.stylesheet.version,name:this.stylesheet.name,metadata:this.stylesheet.metadata,light:this.stylesheet.light,center:this.stylesheet.center,zoom:this.stylesheet.zoom,bearing:this.stylesheet.bearing,pitch:this.stylesheet.pitch,sprite:this.stylesheet.sprite,glyphs:this.stylesheet.glyphs,transition:this.stylesheet.transition,sources:t.mapObject(this.sourceCaches,function(t){return t.serialize()}),layers:this._order.map(function(t){return e._layers[t].serialize()})},function(t){return void 0!==t})},r.prototype._updateLayer=function(t){this._updatedLayers[t.id]=!0,t.source&&!this._updatedSources[t.source]&&(this._updatedSources[t.source]="reload",this.sourceCaches[t.source].pause()),this._changed=!0},r.prototype._flattenRenderedFeatures=function(t){for(var e=[],r=this._order.length-1;r>=0;r--)for(var n=this._order[r],i=0,a=t;i<a.length;i+=1){var o=a[i][n];if(o)for(var s=0,l=o;s<l.length;s+=1){var c=l[s];e.push(c)}}return e},r.prototype.queryRenderedFeatures=function(e,r,n){r&&r.filter&&this._validate(t.validateStyle.filter,"queryRenderedFeatures.filter",r.filter);var i={};if(r&&r.layers){if(!Array.isArray(r.layers))return this.fire(new t.ErrorEvent(new Error("parameters.layers must be an Array."))),[];for(var a=0,o=r.layers;a<o.length;a+=1){var s=o[a],l=this._layers[s];if(!l)return this.fire(new t.ErrorEvent(new Error("The layer '"+s+"' does not exist in the map's style and cannot be queried for features."))),[];i[l.source]=!0}}var c=[];for(var u in this.sourceCaches)r.layers&&!i[u]||c.push(at(this.sourceCaches[u],this._layers,e.worldCoordinate,r,n));return this.placement&&c.push(function(t,e,r,n,i){for(var a={},o=n.queryRenderedSymbols(e),s=[],l=0,c=Object.keys(o).map(Number);l<c.length;l+=1){var u=c[l];s.push(i[u])}s.sort(ot);for(var h=function(){var e=p[f],n=e.featureIndex.lookupSymbolFeatures(o[e.bucketInstanceId],e.bucketIndex,e.sourceLayerIndex,r.filter,r.layers,t);for(var i in n){var s=a[i]=a[i]||[],l=n[i];l.sort(function(t,r){var n=e.featureSortOrder;if(n){var i=n.indexOf(t.featureIndex);return n.indexOf(r.featureIndex)-i}return r.featureIndex-t.featureIndex});for(var c=0,u=l;c<u.length;c+=1){var h=u[c];s.push(h.feature)}}},f=0,p=s;f<p.length;f+=1)h();return a}(this._layers,e.viewport,r,this.placement.collisionIndex,this.placement.retainedQueryData)),this._flattenRenderedFeatures(c)},r.prototype.querySourceFeatures=function(e,r){r&&r.filter&&this._validate(t.validateStyle.filter,"querySourceFeatures.filter",r.filter);var n=this.sourceCaches[e];return n?function(t,e){for(var r=t.getRenderableIds().map(function(e){return t.getTileByID(e)}),n=[],i={},a=0;a<r.length;a++){var o=r[a],s=o.tileID.canonical.key;i[s]||(i[s]=!0,o.querySourceFeatures(n,e))}return n}(n,r):[]},r.prototype.addSourceType=function(t,e,n){return r.getSourceType(t)?n(new Error('A source type called "'+t+'" already exists.')):(r.setSourceType(t,e),e.workerSourceURL?void this.dispatcher.broadcast("loadWorkerSource",{name:t,url:e.workerSourceURL},n):n(null,null))},r.prototype.getLight=function(){return this.light.getLight()},r.prototype.setLight=function(e){this._checkLoaded();var r=this.light.getLight(),n=!1;for(var i in e)if(!t.default$10(e[i],r[i])){n=!0;break}if(n){var o={now:a.now(),transition:t.extend({duration:300,delay:0},this.stylesheet.transition)};this.light.setLight(e),this.light.updateTransitions(o)}},r.prototype._validate=function(e,r,n,i,a){return(!a||!1!==a.validate)&&Xe(this,e.call(t.validateStyle,t.extend({key:r,style:this.serialize(),value:n,styleSpec:t.default$5},i)))},r.prototype._remove=function(){for(var e in t.evented.off("pluginAvailable",this._rtlTextPluginCallback),this.sourceCaches)this.sourceCaches[e].clearTiles();this.dispatcher.remove()},r.prototype._clearSource=function(t){this.sourceCaches[t].clearTiles()},r.prototype._reloadSource=function(t){this.sourceCaches[t].resume(),this.sourceCaches[t].reload()},r.prototype._updateSources=function(t){for(var e in this.sourceCaches)this.sourceCaches[e].update(t)},r.prototype._generateCollisionBoxes=function(){for(var t in this.sourceCaches)this._reloadSource(t)},r.prototype._updatePlacement=function(t,e,r){for(var n=!1,i=!1,o={},s=0,l=this._order;s<l.length;s+=1){var c=l[s],u=this._layers[c];if("symbol"===u.type){if(!o[u.source]){var h=this.sourceCaches[u.source];o[u.source]=h.getRenderableIds().map(function(t){return h.getTileByID(t)}).sort(function(t,e){return e.tileID.overscaledZ-t.tileID.overscaledZ||(t.tileID.isLessThan(e.tileID)?-1:1)})}var f=this.crossTileSymbolIndex.addLayer(u,o[u.source],t.center.lng);n=n||f}}this.crossTileSymbolIndex.pruneUnusedLayers(this._order);var p=this._layerOrderChanged;if((p||!this.pauseablePlacement||this.pauseablePlacement.isDone()&&!this.placement.stillRecent(a.now()))&&(this.pauseablePlacement=new Ue(t,this._order,p,e,r),this._layerOrderChanged=!1),this.pauseablePlacement.isDone()?this.placement.setStale():(this.pauseablePlacement.continuePlacement(this._order,this._layers,o),this.pauseablePlacement.isDone()&&(this.placement=this.pauseablePlacement.commit(this.placement,a.now()),i=!0),n&&this.pauseablePlacement.placement.setStale()),i||n)for(var d=0,g=this._order;d<g.length;d+=1){var m=g[d],v=this._layers[m];"symbol"===v.type&&this.placement.updateLayerOpacities(v,o[v.source])}return!this.pauseablePlacement.isDone()||this.placement.hasTransitions(a.now())},r.prototype.getImages=function(t,e,r){this.imageManager.getImages(e.icons,r)},r.prototype.getGlyphs=function(t,e,r){this.glyphManager.getGlyphs(e.stacks,r)},r}(t.Evented);Je.getSourceType=function(t){return nt[t]},Je.setSourceType=function(t,e){nt[t]=e},Je.registerForPluginAvailability=t.registerForPluginAvailability;var Ke=t.createLayout([{name:"a_pos",type:"Int16",components:2}]),Qe={prelude:{fragmentSource:"#ifdef GL_ES\nprecision mediump float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n",vertexSource:"#ifdef GL_ES\nprecision highp float;\n#else\n\n#if !defined(lowp)\n#define lowp\n#endif\n\n#if !defined(mediump)\n#define mediump\n#endif\n\n#if !defined(highp)\n#define highp\n#endif\n\n#endif\n\n// Unpack a pair of values that have been packed into a single float.\n// The packed values are assumed to be 8-bit unsigned integers, and are\n// packed like so:\n// packedValue = floor(input[0]) * 256 + input[1],\nvec2 unpack_float(const float packedValue) {\n    int packedIntValue = int(packedValue);\n    int v0 = packedIntValue / 256;\n    return vec2(v0, packedIntValue - v0 * 256);\n}\n\nvec2 unpack_opacity(const float packedOpacity) {\n    int intOpacity = int(packedOpacity) / 2;\n    return vec2(float(intOpacity) / 127.0, mod(packedOpacity, 2.0));\n}\n\n// To minimize the number of attributes needed, we encode a 4-component\n// color into a pair of floats (i.e. a vec2) as follows:\n// [ floor(color.r * 255) * 256 + color.g * 255,\n//   floor(color.b * 255) * 256 + color.g * 255 ]\nvec4 decode_color(const vec2 encodedColor) {\n    return vec4(\n        unpack_float(encodedColor[0]) / 255.0,\n        unpack_float(encodedColor[1]) / 255.0\n    );\n}\n\n// Unpack a pair of paint values and interpolate between them.\nfloat unpack_mix_vec2(const vec2 packedValue, const float t) {\n    return mix(packedValue[0], packedValue[1], t);\n}\n\n// Unpack a pair of paint values and interpolate between them.\nvec4 unpack_mix_vec4(const vec4 packedColors, const float t) {\n    vec4 minColor = decode_color(vec2(packedColors[0], packedColors[1]));\n    vec4 maxColor = decode_color(vec2(packedColors[2], packedColors[3]));\n    return mix(minColor, maxColor, t);\n}\n\n// The offset depends on how many pixels are between the world origin and the edge of the tile:\n// vec2 offset = mod(pixel_coord, size)\n//\n// At high zoom levels there are a ton of pixels between the world origin and the edge of the tile.\n// The glsl spec only guarantees 16 bits of precision for highp floats. We need more than that.\n//\n// The pixel_coord is passed in as two 16 bit values:\n// pixel_coord_upper = floor(pixel_coord / 2^16)\n// pixel_coord_lower = mod(pixel_coord, 2^16)\n//\n// The offset is calculated in a series of steps that should preserve this precision:\nvec2 get_pattern_pos(const vec2 pixel_coord_upper, const vec2 pixel_coord_lower,\n    const vec2 pattern_size, const float tile_units_to_pixels, const vec2 pos) {\n\n    vec2 offset = mod(mod(mod(pixel_coord_upper, pattern_size) * 256.0, pattern_size) * 256.0 + pixel_coord_lower, pattern_size);\n    return (tile_units_to_pixels * pos + offset) / pattern_size;\n}\n"},background:{fragmentSource:"uniform vec4 u_color;\nuniform float u_opacity;\n\nvoid main() {\n    gl_FragColor = u_color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"},backgroundPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_mix;\nuniform float u_opacity;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\nvoid main() {\n    vec2 imagecoord = mod(v_pos_a, 1.0);\n    vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);\n    vec4 color1 = texture2D(u_image, pos);\n\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\n    vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);\n    vec4 color2 = texture2D(u_image, pos2);\n\n    gl_FragColor = mix(color1, color2, u_mix) * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\nvoid main() {\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n    v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n    v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n"},circle:{fragmentSource:"#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec3 v_data;\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 color\n    #pragma mapbox: initialize mediump float radius\n    #pragma mapbox: initialize lowp float blur\n    #pragma mapbox: initialize lowp float opacity\n    #pragma mapbox: initialize highp vec4 stroke_color\n    #pragma mapbox: initialize mediump float stroke_width\n    #pragma mapbox: initialize lowp float stroke_opacity\n\n    vec2 extrude = v_data.xy;\n    float extrude_length = length(extrude);\n\n    lowp float antialiasblur = v_data.z;\n    float antialiased_blur = -max(blur, antialiasblur);\n\n    float opacity_t = smoothstep(0.0, antialiased_blur, extrude_length - 1.0);\n\n    float color_t = stroke_width < 0.01 ? 0.0 : smoothstep(\n        antialiased_blur,\n        0.0,\n        extrude_length - radius / (radius + stroke_width)\n    );\n\n    gl_FragColor = opacity_t * mix(color * opacity, stroke_color * stroke_opacity, color_t);\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform bool u_scale_with_map;\nuniform bool u_pitch_with_map;\nuniform vec2 u_extrude_scale;\nuniform highp float u_camera_to_center_distance;\n\nattribute vec2 a_pos;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define mediump float radius\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define highp vec4 stroke_color\n#pragma mapbox: define mediump float stroke_width\n#pragma mapbox: define lowp float stroke_opacity\n\nvarying vec3 v_data;\n\nvoid main(void) {\n    #pragma mapbox: initialize highp vec4 color\n    #pragma mapbox: initialize mediump float radius\n    #pragma mapbox: initialize lowp float blur\n    #pragma mapbox: initialize lowp float opacity\n    #pragma mapbox: initialize highp vec4 stroke_color\n    #pragma mapbox: initialize mediump float stroke_width\n    #pragma mapbox: initialize lowp float stroke_opacity\n\n    // unencode the extrusion vector that we snuck into the a_pos vector\n    vec2 extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n    // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n    // in extrusion data\n    vec2 circle_center = floor(a_pos * 0.5);\n    if (u_pitch_with_map) {\n        vec2 corner_position = circle_center;\n        if (u_scale_with_map) {\n            corner_position += extrude * (radius + stroke_width) * u_extrude_scale;\n        } else {\n            // Pitching the circle with the map effectively scales it with the map\n            // To counteract the effect for pitch-scale: viewport, we rescale the\n            // whole circle based on the pitch scaling effect at its central point\n            vec4 projected_center = u_matrix * vec4(circle_center, 0, 1);\n            corner_position += extrude * (radius + stroke_width) * u_extrude_scale * (projected_center.w / u_camera_to_center_distance);\n        }\n\n        gl_Position = u_matrix * vec4(corner_position, 0, 1);\n    } else {\n        gl_Position = u_matrix * vec4(circle_center, 0, 1);\n\n        if (u_scale_with_map) {\n            gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * u_camera_to_center_distance;\n        } else {\n            gl_Position.xy += extrude * (radius + stroke_width) * u_extrude_scale * gl_Position.w;\n        }\n    }\n\n    // This is a minimum blur distance that serves as a faux-antialiasing for\n    // the circle. since blur is a ratio of the circle's size and the intent is\n    // to keep the blur at roughly 1px, the two are inversely related.\n    lowp float antialiasblur = 1.0 / DEVICE_PIXEL_RATIO / (radius + stroke_width);\n\n    v_data = vec3(extrude.x, extrude.y, antialiasblur);\n}\n"},clippingMask:{fragmentSource:"void main() {\n    gl_FragColor = vec4(1.0);\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"},heatmap:{fragmentSource:"#pragma mapbox: define highp float weight\n\nuniform highp float u_intensity;\nvarying vec2 v_extrude;\n\n// Gaussian kernel coefficient: 1 / sqrt(2 * PI)\n#define GAUSS_COEF 0.3989422804014327\n\nvoid main() {\n    #pragma mapbox: initialize highp float weight\n\n    // Kernel density estimation with a Gaussian kernel of size 5x5\n    float d = -0.5 * 3.0 * 3.0 * dot(v_extrude, v_extrude);\n    float val = weight * u_intensity * GAUSS_COEF * exp(d);\n\n    gl_FragColor = vec4(val, 1.0, 1.0, 1.0);\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"#pragma mapbox: define highp float weight\n#pragma mapbox: define mediump float radius\n\nuniform mat4 u_matrix;\nuniform float u_extrude_scale;\nuniform float u_opacity;\nuniform float u_intensity;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_extrude;\n\n// Effective \"0\" in the kernel density texture to adjust the kernel size to;\n// this empirically chosen number minimizes artifacts on overlapping kernels\n// for typical heatmap cases (assuming clustered source)\nconst highp float ZERO = 1.0 / 255.0 / 16.0;\n\n// Gaussian kernel coefficient: 1 / sqrt(2 * PI)\n#define GAUSS_COEF 0.3989422804014327\n\nvoid main(void) {\n    #pragma mapbox: initialize highp float weight\n    #pragma mapbox: initialize mediump float radius\n\n    // unencode the extrusion vector that we snuck into the a_pos vector\n    vec2 unscaled_extrude = vec2(mod(a_pos, 2.0) * 2.0 - 1.0);\n\n    // This 'extrude' comes in ranging from [-1, -1], to [1, 1].  We'll use\n    // it to produce the vertices of a square mesh framing the point feature\n    // we're adding to the kernel density texture.  We'll also pass it as\n    // a varying, so that the fragment shader can determine the distance of\n    // each fragment from the point feature.\n    // Before we do so, we need to scale it up sufficiently so that the\n    // kernel falls effectively to zero at the edge of the mesh.\n    // That is, we want to know S such that\n    // weight * u_intensity * GAUSS_COEF * exp(-0.5 * 3.0^2 * S^2) == ZERO\n    // Which solves to:\n    // S = sqrt(-2.0 * log(ZERO / (weight * u_intensity * GAUSS_COEF))) / 3.0\n    float S = sqrt(-2.0 * log(ZERO / weight / u_intensity / GAUSS_COEF)) / 3.0;\n\n    // Pass the varying in units of radius\n    v_extrude = S * unscaled_extrude;\n\n    // Scale by radius and the zoom-based scale factor to produce actual\n    // mesh position\n    vec2 extrude = v_extrude * radius * u_extrude_scale;\n\n    // multiply a_pos by 0.5, since we had it * 2 in order to sneak\n    // in extrusion data\n    vec4 pos = vec4(floor(a_pos * 0.5) + extrude, 0, 1);\n\n    gl_Position = u_matrix * pos;\n}\n"},heatmapTexture:{fragmentSource:"uniform sampler2D u_image;\nuniform sampler2D u_color_ramp;\nuniform float u_opacity;\nvarying vec2 v_pos;\n\nvoid main() {\n    float t = texture2D(u_image, v_pos).r;\n    vec4 color = texture2D(u_color_ramp, vec2(t, 0.5));\n    gl_FragColor = color * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(0.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_world;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n    gl_Position = u_matrix * vec4(a_pos * u_world, 0, 1);\n\n    v_pos.x = a_pos.x;\n    v_pos.y = 1.0 - a_pos.y;\n}\n"},collisionBox:{fragmentSource:"\nvarying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n\n    float alpha = 0.5;\n\n    // Red = collision, hide label\n    gl_FragColor = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n\n    // Blue = no collision, label is showing\n    if (v_placed > 0.5) {\n        gl_FragColor = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\n    }\n\n    if (v_notUsed > 0.5) {\n        // This box not used, fade it out\n        gl_FragColor *= .1;\n    }\n}",vertexSource:"attribute vec2 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\n\nuniform mat4 u_matrix;\nuniform vec2 u_extrude_scale;\nuniform float u_camera_to_center_distance;\n\nvarying float v_placed;\nvarying float v_notUsed;\n\nvoid main() {\n    vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1);\n    highp float camera_to_anchor_distance = projectedPoint.w;\n    highp float collision_perspective_ratio = clamp(\n        0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance),\n        0.0, // Prevents oversized near-field boxes in pitched/overzoomed tiles\n        4.0);\n\n    gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0);\n    gl_Position.xy += a_extrude * u_extrude_scale * gl_Position.w * collision_perspective_ratio;\n\n    v_placed = a_placed.x;\n    v_notUsed = a_placed.y;\n}\n"},collisionCircle:{fragmentSource:"uniform float u_overscale_factor;\n\nvarying float v_placed;\nvarying float v_notUsed;\nvarying float v_radius;\nvarying vec2 v_extrude;\nvarying vec2 v_extrude_scale;\n\nvoid main() {\n    float alpha = 0.5;\n\n    // Red = collision, hide label\n    vec4 color = vec4(1.0, 0.0, 0.0, 1.0) * alpha;\n\n    // Blue = no collision, label is showing\n    if (v_placed > 0.5) {\n        color = vec4(0.0, 0.0, 1.0, 0.5) * alpha;\n    }\n\n    if (v_notUsed > 0.5) {\n        // This box not used, fade it out\n        color *= .2;\n    }\n\n    float extrude_scale_length = length(v_extrude_scale);\n    float extrude_length = length(v_extrude) * extrude_scale_length;\n    float stroke_width = 15.0 * extrude_scale_length / u_overscale_factor;\n    float radius = v_radius * extrude_scale_length;\n\n    float distance_to_edge = abs(extrude_length - radius);\n    float opacity_t = smoothstep(-stroke_width, 0.0, -distance_to_edge);\n\n    gl_FragColor = opacity_t * color;\n}\n",vertexSource:"attribute vec2 a_pos;\nattribute vec2 a_anchor_pos;\nattribute vec2 a_extrude;\nattribute vec2 a_placed;\n\nuniform mat4 u_matrix;\nuniform vec2 u_extrude_scale;\nuniform float u_camera_to_center_distance;\n\nvarying float v_placed;\nvarying float v_notUsed;\nvarying float v_radius;\n\nvarying vec2 v_extrude;\nvarying vec2 v_extrude_scale;\n\nvoid main() {\n    vec4 projectedPoint = u_matrix * vec4(a_anchor_pos, 0, 1);\n    highp float camera_to_anchor_distance = projectedPoint.w;\n    highp float collision_perspective_ratio = clamp(\n        0.5 + 0.5 * (u_camera_to_center_distance / camera_to_anchor_distance),\n        0.0, // Prevents oversized near-field circles in pitched/overzoomed tiles\n        4.0);\n\n    gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0);\n\n    highp float padding_factor = 1.2; // Pad the vertices slightly to make room for anti-alias blur\n    gl_Position.xy += a_extrude * u_extrude_scale * padding_factor * gl_Position.w * collision_perspective_ratio;\n\n    v_placed = a_placed.x;\n    v_notUsed = a_placed.y;\n    v_radius = abs(a_extrude.y); // We don't pitch the circles, so both units of the extrusion vector are equal in magnitude to the radius\n\n    v_extrude = a_extrude * padding_factor;\n    v_extrude_scale = u_extrude_scale * u_camera_to_center_distance * collision_perspective_ratio;\n}\n"},debug:{fragmentSource:"uniform highp vec4 u_color;\n\nvoid main() {\n    gl_FragColor = u_color;\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\nvoid main() {\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"},fill:{fragmentSource:"#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 color\n    #pragma mapbox: initialize lowp float opacity\n\n    gl_FragColor = color * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 color\n    #pragma mapbox: initialize lowp float opacity\n\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n}\n"},fillOutline:{fragmentSource:"#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_pos;\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 outline_color\n    #pragma mapbox: initialize lowp float opacity\n\n    float dist = length(v_pos - gl_FragCoord.xy);\n    float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n    gl_FragColor = outline_color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"attribute vec2 a_pos;\n\nuniform mat4 u_matrix;\nuniform vec2 u_world;\n\nvarying vec2 v_pos;\n\n#pragma mapbox: define highp vec4 outline_color\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 outline_color\n    #pragma mapbox: initialize lowp float opacity\n\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n    v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"},fillOutlinePattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n    #pragma mapbox: initialize lowp float opacity\n\n    vec2 imagecoord = mod(v_pos_a, 1.0);\n    vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);\n    vec4 color1 = texture2D(u_image, pos);\n\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\n    vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);\n    vec4 color2 = texture2D(u_image, pos2);\n\n    // find distance to outline for alpha interpolation\n\n    float dist = length(v_pos - gl_FragCoord.xy);\n    float alpha = 1.0 - smoothstep(0.0, 1.0, dist);\n\n\n    gl_FragColor = mix(color1, color2, u_mix) * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_world;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec2 v_pos;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n    #pragma mapbox: initialize lowp float opacity\n\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n    v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n    v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n\n    v_pos = (gl_Position.xy / gl_Position.w + 1.0) / 2.0 * u_world;\n}\n"},fillPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n    #pragma mapbox: initialize lowp float opacity\n\n    vec2 imagecoord = mod(v_pos_a, 1.0);\n    vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);\n    vec4 color1 = texture2D(u_image, pos);\n\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\n    vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);\n    vec4 color2 = texture2D(u_image, pos2);\n\n    gl_FragColor = mix(color1, color2, u_mix) * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\n\nattribute vec2 a_pos;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\n\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n    #pragma mapbox: initialize lowp float opacity\n\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n\n    v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, a_pos);\n    v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, a_pos);\n}\n"},fillExtrusion:{fragmentSource:"varying vec4 v_color;\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n#pragma mapbox: define highp vec4 color\n\nvoid main() {\n    #pragma mapbox: initialize lowp float base\n    #pragma mapbox: initialize lowp float height\n    #pragma mapbox: initialize highp vec4 color\n\n    gl_FragColor = v_color;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec4 a_normal_ed;\n\nvarying vec4 v_color;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\n#pragma mapbox: define highp vec4 color\n\nvoid main() {\n    #pragma mapbox: initialize lowp float base\n    #pragma mapbox: initialize lowp float height\n    #pragma mapbox: initialize highp vec4 color\n\n    vec3 normal = a_normal_ed.xyz;\n\n    base = max(0.0, base);\n    height = max(0.0, height);\n\n    float t = mod(normal.x, 2.0);\n\n    gl_Position = u_matrix * vec4(a_pos, t > 0.0 ? height : base, 1);\n\n    // Relative luminance (how dark/bright is the surface color?)\n    float colorvalue = color.r * 0.2126 + color.g * 0.7152 + color.b * 0.0722;\n\n    v_color = vec4(0.0, 0.0, 0.0, 1.0);\n\n    // Add slight ambient lighting so no extrusions are totally black\n    vec4 ambientlight = vec4(0.03, 0.03, 0.03, 1.0);\n    color += ambientlight;\n\n    // Calculate cos(theta), where theta is the angle between surface normal and diffuse light ray\n    float directional = clamp(dot(normal / 16384.0, u_lightpos), 0.0, 1.0);\n\n    // Adjust directional so that\n    // the range of values for highlight/shading is narrower\n    // with lower light intensity\n    // and with lighter/brighter surface colors\n    directional = mix((1.0 - u_lightintensity), max((1.0 - colorvalue + u_lightintensity), 1.0), directional);\n\n    // Add gradient along z axis of side surfaces\n    if (normal.y != 0.0) {\n        directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n    }\n\n    // Assign final color based on surface + ambient light color, diffuse light directional, and light color\n    // with lower bounds adjusted to hue of light\n    // so that shading is tinted with the complementary (opposite) color to the light color\n    v_color.r += clamp(color.r * directional * u_lightcolor.r, mix(0.0, 0.3, 1.0 - u_lightcolor.r), 1.0);\n    v_color.g += clamp(color.g * directional * u_lightcolor.g, mix(0.0, 0.3, 1.0 - u_lightcolor.g), 1.0);\n    v_color.b += clamp(color.b * directional * u_lightcolor.b, mix(0.0, 0.3, 1.0 - u_lightcolor.b), 1.0);\n}\n"},fillExtrusionPattern:{fragmentSource:"uniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_mix;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n    #pragma mapbox: initialize lowp float base\n    #pragma mapbox: initialize lowp float height\n\n    vec2 imagecoord = mod(v_pos_a, 1.0);\n    vec2 pos = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, imagecoord);\n    vec4 color1 = texture2D(u_image, pos);\n\n    vec2 imagecoord_b = mod(v_pos_b, 1.0);\n    vec2 pos2 = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, imagecoord_b);\n    vec4 color2 = texture2D(u_image, pos2);\n\n    vec4 mixedColor = mix(color1, color2, u_mix);\n\n    gl_FragColor = mixedColor * v_lighting;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pixel_coord_upper;\nuniform vec2 u_pixel_coord_lower;\nuniform float u_scale_a;\nuniform float u_scale_b;\nuniform float u_tile_units_to_pixels;\nuniform float u_height_factor;\n\nuniform vec3 u_lightcolor;\nuniform lowp vec3 u_lightpos;\nuniform lowp float u_lightintensity;\n\nattribute vec2 a_pos;\nattribute vec4 a_normal_ed;\n\nvarying vec2 v_pos_a;\nvarying vec2 v_pos_b;\nvarying vec4 v_lighting;\nvarying float v_directional;\n\n#pragma mapbox: define lowp float base\n#pragma mapbox: define lowp float height\n\nvoid main() {\n    #pragma mapbox: initialize lowp float base\n    #pragma mapbox: initialize lowp float height\n\n    vec3 normal = a_normal_ed.xyz;\n    float edgedistance = a_normal_ed.w;\n\n    base = max(0.0, base);\n    height = max(0.0, height);\n\n    float t = mod(normal.x, 2.0);\n    float z = t > 0.0 ? height : base;\n\n    gl_Position = u_matrix * vec4(a_pos, z, 1);\n\n    vec2 pos = normal.x == 1.0 && normal.y == 0.0 && normal.z == 16384.0\n        ? a_pos // extrusion top\n        : vec2(edgedistance, z * u_height_factor); // extrusion side\n\n    v_pos_a = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_a * u_pattern_size_a, u_tile_units_to_pixels, pos);\n    v_pos_b = get_pattern_pos(u_pixel_coord_upper, u_pixel_coord_lower, u_scale_b * u_pattern_size_b, u_tile_units_to_pixels, pos);\n\n    v_lighting = vec4(0.0, 0.0, 0.0, 1.0);\n    float directional = clamp(dot(normal / 16383.0, u_lightpos), 0.0, 1.0);\n    directional = mix((1.0 - u_lightintensity), max((0.5 + u_lightintensity), 1.0), directional);\n\n    if (normal.y != 0.0) {\n        directional *= clamp((t + base) * pow(height / 150.0, 0.5), mix(0.7, 0.98, 1.0 - u_lightintensity), 1.0);\n    }\n\n    v_lighting.rgb += clamp(directional * u_lightcolor, mix(vec3(0.0), vec3(0.3), 1.0 - u_lightcolor), vec3(1.0));\n}\n"},extrusionTexture:{fragmentSource:"uniform sampler2D u_image;\nuniform float u_opacity;\nvarying vec2 v_pos;\n\nvoid main() {\n    gl_FragColor = texture2D(u_image, v_pos) * u_opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(0.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_world;\nattribute vec2 a_pos;\nvarying vec2 v_pos;\n\nvoid main() {\n    gl_Position = u_matrix * vec4(a_pos * u_world, 0, 1);\n\n    v_pos.x = a_pos.x;\n    v_pos.y = 1.0 - a_pos.y;\n}\n"},hillshadePrepare:{fragmentSource:"#ifdef GL_ES\nprecision highp float;\n#endif\n\nuniform sampler2D u_image;\nvarying vec2 v_pos;\nuniform vec2 u_dimension;\nuniform float u_zoom;\nuniform float u_maxzoom;\n\nfloat getElevation(vec2 coord, float bias) {\n    // Convert encoded elevation value to meters\n    vec4 data = texture2D(u_image, coord) * 255.0;\n    return (data.r + data.g * 256.0 + data.b * 256.0 * 256.0) / 4.0;\n}\n\nvoid main() {\n    vec2 epsilon = 1.0 / u_dimension;\n\n    // queried pixels:\n    // +-----------+\n    // |   |   |   |\n    // | a | b | c |\n    // |   |   |   |\n    // +-----------+\n    // |   |   |   |\n    // | d | e | f |\n    // |   |   |   |\n    // +-----------+\n    // |   |   |   |\n    // | g | h | i |\n    // |   |   |   |\n    // +-----------+\n\n    float a = getElevation(v_pos + vec2(-epsilon.x, -epsilon.y), 0.0);\n    float b = getElevation(v_pos + vec2(0, -epsilon.y), 0.0);\n    float c = getElevation(v_pos + vec2(epsilon.x, -epsilon.y), 0.0);\n    float d = getElevation(v_pos + vec2(-epsilon.x, 0), 0.0);\n    float e = getElevation(v_pos, 0.0);\n    float f = getElevation(v_pos + vec2(epsilon.x, 0), 0.0);\n    float g = getElevation(v_pos + vec2(-epsilon.x, epsilon.y), 0.0);\n    float h = getElevation(v_pos + vec2(0, epsilon.y), 0.0);\n    float i = getElevation(v_pos + vec2(epsilon.x, epsilon.y), 0.0);\n\n    // here we divide the x and y slopes by 8 * pixel size\n    // where pixel size (aka meters/pixel) is:\n    // circumference of the world / (pixels per tile * number of tiles)\n    // which is equivalent to: 8 * 40075016.6855785 / (512 * pow(2, u_zoom))\n    // which can be reduced to: pow(2, 19.25619978527 - u_zoom)\n    // we want to vertically exaggerate the hillshading though, because otherwise\n    // it is barely noticeable at low zooms. to do this, we multiply this by some\n    // scale factor pow(2, (u_zoom - u_maxzoom) * a) where a is an arbitrary value\n    // Here we use a=0.3 which works out to the expression below. see \n    // nickidlugash's awesome breakdown for more info\n    // https://github.com/mapbox/mapbox-gl-js/pull/5286#discussion_r148419556\n    float exaggeration = u_zoom < 2.0 ? 0.4 : u_zoom < 4.5 ? 0.35 : 0.3;\n\n    vec2 deriv = vec2(\n        (c + f + f + i) - (a + d + d + g),\n        (g + h + h + i) - (a + b + b + c)\n    ) /  pow(2.0, (u_zoom - u_maxzoom) * exaggeration + 19.2562 - u_zoom);\n\n    gl_FragColor = clamp(vec4(\n        deriv.x / 2.0 + 0.5,\n        deriv.y / 2.0 + 0.5,\n        1.0,\n        1.0), 0.0, 1.0);\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos;\n\nvoid main() {\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n    v_pos = (a_texture_pos / 8192.0) / 2.0 + 0.25;\n}\n"},hillshade:{fragmentSource:"uniform sampler2D u_image;\nvarying vec2 v_pos;\n\nuniform vec2 u_latrange;\nuniform vec2 u_light;\nuniform vec4 u_shadow;\nuniform vec4 u_highlight;\nuniform vec4 u_accent;\n\n#define PI 3.141592653589793\n\nvoid main() {\n    vec4 pixel = texture2D(u_image, v_pos);\n\n    vec2 deriv = ((pixel.rg * 2.0) - 1.0);\n\n    // We divide the slope by a scale factor based on the cosin of the pixel's approximate latitude\n    // to account for mercator projection distortion. see #4807 for details\n    float scaleFactor = cos(radians((u_latrange[0] - u_latrange[1]) * (1.0 - v_pos.y) + u_latrange[1]));\n    // We also multiply the slope by an arbitrary z-factor of 1.25\n    float slope = atan(1.25 * length(deriv) / scaleFactor);\n    float aspect = deriv.x != 0.0 ? atan(deriv.y, -deriv.x) : PI / 2.0 * (deriv.y > 0.0 ? 1.0 : -1.0);\n\n    float intensity = u_light.x;\n    // We add PI to make this property match the global light object, which adds PI/2 to the light's azimuthal\n    // position property to account for 0deg corresponding to north/the top of the viewport in the style spec\n    // and the original shader was written to accept (-illuminationDirection - 90) as the azimuthal.\n    float azimuth = u_light.y + PI;\n\n    // We scale the slope exponentially based on intensity, using a calculation similar to\n    // the exponential interpolation function in the style spec:\n    // https://github.com/mapbox/mapbox-gl-js/blob/master/src/style-spec/expression/definitions/interpolate.js#L217-L228\n    // so that higher intensity values create more opaque hillshading.\n    float base = 1.875 - intensity * 1.75;\n    float maxValue = 0.5 * PI;\n    float scaledSlope = intensity != 0.5 ? ((pow(base, slope) - 1.0) / (pow(base, maxValue) - 1.0)) * maxValue : slope;\n\n    // The accent color is calculated with the cosine of the slope while the shade color is calculated with the sine\n    // so that the accent color's rate of change eases in while the shade color's eases out.\n    float accent = cos(scaledSlope);\n    // We multiply both the accent and shade color by a clamped intensity value\n    // so that intensities >= 0.5 do not additionally affect the color values\n    // while intensity values < 0.5 make the overall color more transparent.\n    vec4 accent_color = (1.0 - accent) * u_accent * clamp(intensity * 2.0, 0.0, 1.0);\n    float shade = abs(mod((aspect + azimuth) / PI + 0.5, 2.0) - 1.0);\n    vec4 shade_color = mix(u_shadow, u_highlight, shade) * sin(scaledSlope) * clamp(intensity * 2.0, 0.0, 1.0);\n    gl_FragColor = accent_color * (1.0 - shade_color.a) + shade_color;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos;\n\nvoid main() {\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n    v_pos = a_texture_pos / 8192.0;\n}\n"},line:{fragmentSource:"#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 color\n    #pragma mapbox: initialize lowp float blur\n    #pragma mapbox: initialize lowp float opacity\n\n    // Calculate the distance of the pixel from the line in pixels.\n    float dist = length(v_normal) * v_width2.s;\n\n    // Calculate the antialiasing fade factor. This is either when fading in\n    // the line in case of an offset line (v_width2.t) or when fading out\n    // (v_width2.s)\n    float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n    float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n    gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\n// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\nvarying highp float v_linesofar;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 color\n    #pragma mapbox: initialize lowp float blur\n    #pragma mapbox: initialize lowp float opacity\n    #pragma mapbox: initialize mediump float gapwidth\n    #pragma mapbox: initialize lowp float offset\n    #pragma mapbox: initialize mediump float width\n\n    vec2 a_extrude = a_data.xy - 128.0;\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n    v_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0;\n\n    vec2 pos = a_pos_normal.xy;\n\n    // x is 1 if it's a round cap, 0 otherwise\n    // y is 1 if the normal points up, and -1 if it points down\n    mediump vec2 normal = a_pos_normal.zw;\n    v_normal = normal;\n\n    // these transformations used to be applied in the JS and native code bases.\n    // moved them into the shader for clarity and simplicity.\n    gapwidth = gapwidth / 2.0;\n    float halfwidth = width / 2.0;\n    offset = -1.0 * offset;\n\n    float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n    float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n    // Scale the extrusion vector down to a normal and then up by the line width\n    // of this vertex.\n    mediump vec2 dist = outset * a_extrude * scale;\n\n    // Calculate the offset when drawing a line that is to the side of the actual line.\n    // We do this by creating a vector that points towards the extrude, but rotate\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\n    // extrude vector points in another direction.\n    mediump float u = 0.5 * a_direction;\n    mediump float t = 1.0 - abs(u);\n    mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n    vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n    gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n    // calculate how much the perspective view squishes or stretches the extrude\n    float extrude_length_without_perspective = length(dist);\n    float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n    v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n    v_width2 = vec2(outset, inset);\n}\n"},lineGradient:{fragmentSource:"\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nuniform sampler2D u_image;\n\nvarying vec2 v_width2;\nvarying vec2 v_normal;\nvarying float v_gamma_scale;\nvarying highp float v_lineprogress;\n\nvoid main() {\n    #pragma mapbox: initialize lowp float blur\n    #pragma mapbox: initialize lowp float opacity\n\n    // Calculate the distance of the pixel from the line in pixels.\n    float dist = length(v_normal) * v_width2.s;\n\n    // Calculate the antialiasing fade factor. This is either when fading in\n    // the line in case of an offset line (v_width2.t) or when fading out\n    // (v_width2.s)\n    float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n    float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n    // For gradient lines, v_lineprogress is the ratio along the entire line,\n    // scaled to [0, 2^15), and the gradient ramp is stored in a texture.\n    vec4 color = texture2D(u_image, vec2(v_lineprogress, 0.5));\n\n    gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"\n// the attribute conveying progress along a line is scaled to [0, 2^15)\n#define MAX_LINE_DISTANCE 32767.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\n// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_gamma_scale;\nvarying highp float v_lineprogress;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n\nvoid main() {\n    #pragma mapbox: initialize lowp float blur\n    #pragma mapbox: initialize lowp float opacity\n    #pragma mapbox: initialize mediump float gapwidth\n    #pragma mapbox: initialize lowp float offset\n    #pragma mapbox: initialize mediump float width\n\n    vec2 a_extrude = a_data.xy - 128.0;\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\n\n    v_lineprogress = (floor(a_data.z / 4.0) + a_data.w * 64.0) * 2.0 / MAX_LINE_DISTANCE;\n\n    vec2 pos = a_pos_normal.xy;\n\n    // x is 1 if it's a round cap, 0 otherwise\n    // y is 1 if the normal points up, and -1 if it points down\n    mediump vec2 normal = a_pos_normal.zw;\n    v_normal = normal;\n\n    // these transformations used to be applied in the JS and native code bases.\n    // moved them into the shader for clarity and simplicity.\n    gapwidth = gapwidth / 2.0;\n    float halfwidth = width / 2.0;\n    offset = -1.0 * offset;\n\n    float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n    float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n    // Scale the extrusion vector down to a normal and then up by the line width\n    // of this vertex.\n    mediump vec2 dist = outset * a_extrude * scale;\n\n    // Calculate the offset when drawing a line that is to the side of the actual line.\n    // We do this by creating a vector that points towards the extrude, but rotate\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\n    // extrude vector points in another direction.\n    mediump float u = 0.5 * a_direction;\n    mediump float t = 1.0 - abs(u);\n    mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n    vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n    gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n    // calculate how much the perspective view squishes or stretches the extrude\n    float extrude_length_without_perspective = length(dist);\n    float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n    v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n    v_width2 = vec2(outset, inset);\n}\n"},linePattern:{fragmentSource:"uniform vec2 u_pattern_size_a;\nuniform vec2 u_pattern_size_b;\nuniform vec2 u_pattern_tl_a;\nuniform vec2 u_pattern_br_a;\nuniform vec2 u_pattern_tl_b;\nuniform vec2 u_pattern_br_b;\nuniform vec2 u_texsize;\nuniform float u_fade;\n\nuniform sampler2D u_image;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n\nvoid main() {\n    #pragma mapbox: initialize lowp float blur\n    #pragma mapbox: initialize lowp float opacity\n\n    // Calculate the distance of the pixel from the line in pixels.\n    float dist = length(v_normal) * v_width2.s;\n\n    // Calculate the antialiasing fade factor. This is either when fading in\n    // the line in case of an offset line (v_width2.t) or when fading out\n    // (v_width2.s)\n    float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n    float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n    float x_a = mod(v_linesofar / u_pattern_size_a.x, 1.0);\n    float x_b = mod(v_linesofar / u_pattern_size_b.x, 1.0);\n\n    // v_normal.y is 0 at the midpoint of the line, -1 at the lower edge, 1 at the upper edge\n    // we clamp the line width outset to be between 0 and half the pattern height plus padding (2.0)\n    // to ensure we don't sample outside the designated symbol on the sprite sheet.\n    // 0.5 is added to shift the component to be bounded between 0 and 1 for interpolation of\n    // the texture coordinate\n    float y_a = 0.5 + (v_normal.y * clamp(v_width2.s, 0.0, (u_pattern_size_a.y + 2.0) / 2.0) / u_pattern_size_a.y);\n    float y_b = 0.5 + (v_normal.y * clamp(v_width2.s, 0.0, (u_pattern_size_b.y + 2.0) / 2.0) / u_pattern_size_b.y);\n    vec2 pos_a = mix(u_pattern_tl_a / u_texsize, u_pattern_br_a / u_texsize, vec2(x_a, y_a));\n    vec2 pos_b = mix(u_pattern_tl_b / u_texsize, u_pattern_br_b / u_texsize, vec2(x_b, y_b));\n\n    vec4 color = mix(texture2D(u_image, pos_a), texture2D(u_image, pos_b), u_fade);\n\n    gl_FragColor = color * alpha * opacity;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying float v_linesofar;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define mediump float width\n\nvoid main() {\n    #pragma mapbox: initialize lowp float blur\n    #pragma mapbox: initialize lowp float opacity\n    #pragma mapbox: initialize lowp float offset\n    #pragma mapbox: initialize mediump float gapwidth\n    #pragma mapbox: initialize mediump float width\n\n    vec2 a_extrude = a_data.xy - 128.0;\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\n    float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n    vec2 pos = a_pos_normal.xy;\n\n    // x is 1 if it's a round cap, 0 otherwise\n    // y is 1 if the normal points up, and -1 if it points down\n    mediump vec2 normal = a_pos_normal.zw;\n    v_normal = normal;\n\n    // these transformations used to be applied in the JS and native code bases.\n    // moved them into the shader for clarity and simplicity.\n    gapwidth = gapwidth / 2.0;\n    float halfwidth = width / 2.0;\n    offset = -1.0 * offset;\n\n    float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n    float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n    // Scale the extrusion vector down to a normal and then up by the line width\n    // of this vertex.\n    mediump vec2 dist = outset * a_extrude * scale;\n\n    // Calculate the offset when drawing a line that is to the side of the actual line.\n    // We do this by creating a vector that points towards the extrude, but rotate\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\n    // extrude vector points in another direction.\n    mediump float u = 0.5 * a_direction;\n    mediump float t = 1.0 - abs(u);\n    mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n    vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n    gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n    // calculate how much the perspective view squishes or stretches the extrude\n    float extrude_length_without_perspective = length(dist);\n    float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n    v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n    v_linesofar = a_linesofar;\n    v_width2 = vec2(outset, inset);\n}\n"},lineSDF:{fragmentSource:"\nuniform sampler2D u_image;\nuniform float u_sdfgamma;\nuniform float u_mix;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 color\n    #pragma mapbox: initialize lowp float blur\n    #pragma mapbox: initialize lowp float opacity\n    #pragma mapbox: initialize mediump float width\n    #pragma mapbox: initialize lowp float floorwidth\n\n    // Calculate the distance of the pixel from the line in pixels.\n    float dist = length(v_normal) * v_width2.s;\n\n    // Calculate the antialiasing fade factor. This is either when fading in\n    // the line in case of an offset line (v_width2.t) or when fading out\n    // (v_width2.s)\n    float blur2 = (blur + 1.0 / DEVICE_PIXEL_RATIO) * v_gamma_scale;\n    float alpha = clamp(min(dist - (v_width2.t - blur2), v_width2.s - dist) / blur2, 0.0, 1.0);\n\n    float sdfdist_a = texture2D(u_image, v_tex_a).a;\n    float sdfdist_b = texture2D(u_image, v_tex_b).a;\n    float sdfdist = mix(sdfdist_a, sdfdist_b, u_mix);\n    alpha *= smoothstep(0.5 - u_sdfgamma / floorwidth, 0.5 + u_sdfgamma / floorwidth, sdfdist);\n\n    gl_FragColor = color * (alpha * opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"// floor(127 / 2) == 63.0\n// the maximum allowed miter limit is 2.0 at the moment. the extrude normal is\n// stored in a byte (-128..127). we scale regular normals up to length 63, but\n// there are also \"special\" normals that have a bigger length (of up to 126 in\n// this case).\n// #define scale 63.0\n#define scale 0.015873016\n\n// We scale the distance before adding it to the buffers so that we can store\n// long distances for long segments. Use this value to unscale the distance.\n#define LINE_DISTANCE_SCALE 2.0\n\n// the distance over which the line edge fades out.\n// Retina devices need a smaller distance to avoid aliasing.\n#define ANTIALIASING 1.0 / DEVICE_PIXEL_RATIO / 2.0\n\nattribute vec4 a_pos_normal;\nattribute vec4 a_data;\n\nuniform mat4 u_matrix;\nuniform mediump float u_ratio;\nuniform vec2 u_patternscale_a;\nuniform float u_tex_y_a;\nuniform vec2 u_patternscale_b;\nuniform float u_tex_y_b;\nuniform vec2 u_gl_units_to_pixels;\n\nvarying vec2 v_normal;\nvarying vec2 v_width2;\nvarying vec2 v_tex_a;\nvarying vec2 v_tex_b;\nvarying float v_gamma_scale;\n\n#pragma mapbox: define highp vec4 color\n#pragma mapbox: define lowp float blur\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define mediump float gapwidth\n#pragma mapbox: define lowp float offset\n#pragma mapbox: define mediump float width\n#pragma mapbox: define lowp float floorwidth\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 color\n    #pragma mapbox: initialize lowp float blur\n    #pragma mapbox: initialize lowp float opacity\n    #pragma mapbox: initialize mediump float gapwidth\n    #pragma mapbox: initialize lowp float offset\n    #pragma mapbox: initialize mediump float width\n    #pragma mapbox: initialize lowp float floorwidth\n\n    vec2 a_extrude = a_data.xy - 128.0;\n    float a_direction = mod(a_data.z, 4.0) - 1.0;\n    float a_linesofar = (floor(a_data.z / 4.0) + a_data.w * 64.0) * LINE_DISTANCE_SCALE;\n\n    vec2 pos = a_pos_normal.xy;\n\n    // x is 1 if it's a round cap, 0 otherwise\n    // y is 1 if the normal points up, and -1 if it points down\n    mediump vec2 normal = a_pos_normal.zw;\n    v_normal = normal;\n\n    // these transformations used to be applied in the JS and native code bases.\n    // moved them into the shader for clarity and simplicity.\n    gapwidth = gapwidth / 2.0;\n    float halfwidth = width / 2.0;\n    offset = -1.0 * offset;\n\n    float inset = gapwidth + (gapwidth > 0.0 ? ANTIALIASING : 0.0);\n    float outset = gapwidth + halfwidth * (gapwidth > 0.0 ? 2.0 : 1.0) + ANTIALIASING;\n\n    // Scale the extrusion vector down to a normal and then up by the line width\n    // of this vertex.\n    mediump vec2 dist =outset * a_extrude * scale;\n\n    // Calculate the offset when drawing a line that is to the side of the actual line.\n    // We do this by creating a vector that points towards the extrude, but rotate\n    // it when we're drawing round end points (a_direction = -1 or 1) since their\n    // extrude vector points in another direction.\n    mediump float u = 0.5 * a_direction;\n    mediump float t = 1.0 - abs(u);\n    mediump vec2 offset2 = offset * a_extrude * scale * normal.y * mat2(t, -u, u, t);\n\n    vec4 projected_extrude = u_matrix * vec4(dist / u_ratio, 0.0, 0.0);\n    gl_Position = u_matrix * vec4(pos + offset2 / u_ratio, 0.0, 1.0) + projected_extrude;\n\n    // calculate how much the perspective view squishes or stretches the extrude\n    float extrude_length_without_perspective = length(dist);\n    float extrude_length_with_perspective = length(projected_extrude.xy / gl_Position.w * u_gl_units_to_pixels);\n    v_gamma_scale = extrude_length_without_perspective / extrude_length_with_perspective;\n\n    v_tex_a = vec2(a_linesofar * u_patternscale_a.x / floorwidth, normal.y * u_patternscale_a.y + u_tex_y_a);\n    v_tex_b = vec2(a_linesofar * u_patternscale_b.x / floorwidth, normal.y * u_patternscale_b.y + u_tex_y_b);\n\n    v_width2 = vec2(outset, inset);\n}\n"},raster:{fragmentSource:"uniform float u_fade_t;\nuniform float u_opacity;\nuniform sampler2D u_image0;\nuniform sampler2D u_image1;\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nuniform float u_brightness_low;\nuniform float u_brightness_high;\n\nuniform float u_saturation_factor;\nuniform float u_contrast_factor;\nuniform vec3 u_spin_weights;\n\nvoid main() {\n\n    // read and cross-fade colors from the main and parent tiles\n    vec4 color0 = texture2D(u_image0, v_pos0);\n    vec4 color1 = texture2D(u_image1, v_pos1);\n    if (color0.a > 0.0) {\n        color0.rgb = color0.rgb / color0.a;\n    }\n    if (color1.a > 0.0) {\n        color1.rgb = color1.rgb / color1.a;\n    }\n    vec4 color = mix(color0, color1, u_fade_t);\n    color.a *= u_opacity;\n    vec3 rgb = color.rgb;\n\n    // spin\n    rgb = vec3(\n        dot(rgb, u_spin_weights.xyz),\n        dot(rgb, u_spin_weights.zxy),\n        dot(rgb, u_spin_weights.yzx));\n\n    // saturation\n    float average = (color.r + color.g + color.b) / 3.0;\n    rgb += (average - rgb) * u_saturation_factor;\n\n    // contrast\n    rgb = (rgb - 0.5) * u_contrast_factor + 0.5;\n\n    // brightness\n    vec3 u_high_vec = vec3(u_brightness_low, u_brightness_low, u_brightness_low);\n    vec3 u_low_vec = vec3(u_brightness_high, u_brightness_high, u_brightness_high);\n\n    gl_FragColor = vec4(mix(u_high_vec, u_low_vec, rgb) * color.a, color.a);\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"uniform mat4 u_matrix;\nuniform vec2 u_tl_parent;\nuniform float u_scale_parent;\nuniform float u_buffer_scale;\n\nattribute vec2 a_pos;\nattribute vec2 a_texture_pos;\n\nvarying vec2 v_pos0;\nvarying vec2 v_pos1;\n\nvoid main() {\n    gl_Position = u_matrix * vec4(a_pos, 0, 1);\n    // We are using Int16 for texture position coordinates to give us enough precision for\n    // fractional coordinates. We use 8192 to scale the texture coordinates in the buffer\n    // as an arbitrarily high number to preserve adequate precision when rendering.\n    // This is also the same value as the EXTENT we are using for our tile buffer pos coordinates,\n    // so math for modifying either is consistent.\n    v_pos0 = (((a_texture_pos / 8192.0) - 0.5) / u_buffer_scale ) + 0.5;\n    v_pos1 = (v_pos0 * u_scale_parent) + u_tl_parent;\n}\n"},symbolIcon:{fragmentSource:"uniform sampler2D u_texture;\n\n#pragma mapbox: define lowp float opacity\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\nvoid main() {\n    #pragma mapbox: initialize lowp float opacity\n\n    lowp float alpha = opacity * v_fade_opacity;\n    gl_FragColor = texture2D(u_texture, v_tex) * alpha;\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\nuniform highp float u_camera_to_center_distance;\nuniform highp float u_pitch;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform float u_fade_change;\n\n#pragma mapbox: define lowp float opacity\n\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_gl_coord_matrix;\n\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_tex;\nvarying float v_fade_opacity;\n\nvoid main() {\n    #pragma mapbox: initialize lowp float opacity\n\n    vec2 a_pos = a_pos_offset.xy;\n    vec2 a_offset = a_pos_offset.zw;\n\n    vec2 a_tex = a_data.xy;\n    vec2 a_size = a_data.zw;\n\n    highp float segment_angle = -a_projected_pos[2];\n\n    float size;\n    if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n        size = mix(a_size[0], a_size[1], u_size_t) / 10.0;\n    } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n        size = a_size[0] / 10.0;\n    } else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {\n        size = u_size;\n    } else {\n        size = u_size;\n    }\n\n    vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n    highp float camera_to_anchor_distance = projectedPoint.w;\n    // See comments in symbol_sdf.vertex\n    highp float distance_ratio = u_pitch_with_map ?\n        camera_to_anchor_distance / u_camera_to_center_distance :\n        u_camera_to_center_distance / camera_to_anchor_distance;\n    highp float perspective_ratio = clamp(\n            0.5 + 0.5 * distance_ratio,\n            0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n            4.0);\n\n    size *= perspective_ratio;\n\n    float fontScale = u_is_text ? size / 24.0 : size;\n\n    highp float symbol_rotation = 0.0;\n    if (u_rotate_symbol) {\n        // See comments in symbol_sdf.vertex\n        vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n        vec2 a = projectedPoint.xy / projectedPoint.w;\n        vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n        symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n    }\n\n    highp float angle_sin = sin(segment_angle + symbol_rotation);\n    highp float angle_cos = cos(segment_angle + symbol_rotation);\n    mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n    vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n    gl_Position = u_gl_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale), 0.0, 1.0);\n\n    v_tex = a_tex / u_texsize;\n    vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n    float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n    v_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n}\n"},symbolSDF:{fragmentSource:"#define SDF_PX 8.0\n#define EDGE_GAMMA 0.105/DEVICE_PIXEL_RATIO\n\nuniform bool u_is_halo;\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nuniform sampler2D u_texture;\nuniform highp float u_gamma_scale;\nuniform bool u_is_text;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 fill_color\n    #pragma mapbox: initialize highp vec4 halo_color\n    #pragma mapbox: initialize lowp float opacity\n    #pragma mapbox: initialize lowp float halo_width\n    #pragma mapbox: initialize lowp float halo_blur\n\n    vec2 tex = v_data0.xy;\n    float gamma_scale = v_data1.x;\n    float size = v_data1.y;\n    float fade_opacity = v_data1[2];\n\n    float fontScale = u_is_text ? size / 24.0 : size;\n\n    lowp vec4 color = fill_color;\n    highp float gamma = EDGE_GAMMA / (fontScale * u_gamma_scale);\n    lowp float buff = (256.0 - 64.0) / 256.0;\n    if (u_is_halo) {\n        color = halo_color;\n        gamma = (halo_blur * 1.19 / SDF_PX + EDGE_GAMMA) / (fontScale * u_gamma_scale);\n        buff = (6.0 - halo_width / fontScale) / SDF_PX;\n    }\n\n    lowp float dist = texture2D(u_texture, tex).a;\n    highp float gamma_scaled = gamma * gamma_scale;\n    highp float alpha = smoothstep(buff - gamma_scaled, buff + gamma_scaled, dist);\n\n    gl_FragColor = color * (alpha * opacity * fade_opacity);\n\n#ifdef OVERDRAW_INSPECTOR\n    gl_FragColor = vec4(1.0);\n#endif\n}\n",vertexSource:"const float PI = 3.141592653589793;\n\nattribute vec4 a_pos_offset;\nattribute vec4 a_data;\nattribute vec3 a_projected_pos;\nattribute float a_fade_opacity;\n\n// contents of a_size vary based on the type of property value\n// used for {text,icon}-size.\n// For constants, a_size is disabled.\n// For source functions, we bind only one value per vertex: the value of {text,icon}-size evaluated for the current feature.\n// For composite functions:\n// [ text-size(lowerZoomStop, feature),\n//   text-size(upperZoomStop, feature) ]\nuniform bool u_is_size_zoom_constant;\nuniform bool u_is_size_feature_constant;\nuniform highp float u_size_t; // used to interpolate between zoom stops when size is a composite function\nuniform highp float u_size; // used when size is both zoom and feature constant\n\n#pragma mapbox: define highp vec4 fill_color\n#pragma mapbox: define highp vec4 halo_color\n#pragma mapbox: define lowp float opacity\n#pragma mapbox: define lowp float halo_width\n#pragma mapbox: define lowp float halo_blur\n\nuniform mat4 u_matrix;\nuniform mat4 u_label_plane_matrix;\nuniform mat4 u_gl_coord_matrix;\n\nuniform bool u_is_text;\nuniform bool u_pitch_with_map;\nuniform highp float u_pitch;\nuniform bool u_rotate_symbol;\nuniform highp float u_aspect_ratio;\nuniform highp float u_camera_to_center_distance;\nuniform float u_fade_change;\n\nuniform vec2 u_texsize;\n\nvarying vec2 v_data0;\nvarying vec3 v_data1;\n\nvoid main() {\n    #pragma mapbox: initialize highp vec4 fill_color\n    #pragma mapbox: initialize highp vec4 halo_color\n    #pragma mapbox: initialize lowp float opacity\n    #pragma mapbox: initialize lowp float halo_width\n    #pragma mapbox: initialize lowp float halo_blur\n\n    vec2 a_pos = a_pos_offset.xy;\n    vec2 a_offset = a_pos_offset.zw;\n\n    vec2 a_tex = a_data.xy;\n    vec2 a_size = a_data.zw;\n\n    highp float segment_angle = -a_projected_pos[2];\n    float size;\n\n    if (!u_is_size_zoom_constant && !u_is_size_feature_constant) {\n        size = mix(a_size[0], a_size[1], u_size_t) / 10.0;\n    } else if (u_is_size_zoom_constant && !u_is_size_feature_constant) {\n        size = a_size[0] / 10.0;\n    } else if (!u_is_size_zoom_constant && u_is_size_feature_constant) {\n        size = u_size;\n    } else {\n        size = u_size;\n    }\n\n    vec4 projectedPoint = u_matrix * vec4(a_pos, 0, 1);\n    highp float camera_to_anchor_distance = projectedPoint.w;\n    // If the label is pitched with the map, layout is done in pitched space,\n    // which makes labels in the distance smaller relative to viewport space.\n    // We counteract part of that effect by multiplying by the perspective ratio.\n    // If the label isn't pitched with the map, we do layout in viewport space,\n    // which makes labels in the distance larger relative to the features around\n    // them. We counteract part of that effect by dividing by the perspective ratio.\n    highp float distance_ratio = u_pitch_with_map ?\n        camera_to_anchor_distance / u_camera_to_center_distance :\n        u_camera_to_center_distance / camera_to_anchor_distance;\n    highp float perspective_ratio = clamp(\n        0.5 + 0.5 * distance_ratio,\n        0.0, // Prevents oversized near-field symbols in pitched/overzoomed tiles\n        4.0);\n\n    size *= perspective_ratio;\n\n    float fontScale = u_is_text ? size / 24.0 : size;\n\n    highp float symbol_rotation = 0.0;\n    if (u_rotate_symbol) {\n        // Point labels with 'rotation-alignment: map' are horizontal with respect to tile units\n        // To figure out that angle in projected space, we draw a short horizontal line in tile\n        // space, project it, and measure its angle in projected space.\n        vec4 offsetProjectedPoint = u_matrix * vec4(a_pos + vec2(1, 0), 0, 1);\n\n        vec2 a = projectedPoint.xy / projectedPoint.w;\n        vec2 b = offsetProjectedPoint.xy / offsetProjectedPoint.w;\n\n        symbol_rotation = atan((b.y - a.y) / u_aspect_ratio, b.x - a.x);\n    }\n\n    highp float angle_sin = sin(segment_angle + symbol_rotation);\n    highp float angle_cos = cos(segment_angle + symbol_rotation);\n    mat2 rotation_matrix = mat2(angle_cos, -1.0 * angle_sin, angle_sin, angle_cos);\n\n    vec4 projected_pos = u_label_plane_matrix * vec4(a_projected_pos.xy, 0.0, 1.0);\n    gl_Position = u_gl_coord_matrix * vec4(projected_pos.xy / projected_pos.w + rotation_matrix * (a_offset / 32.0 * fontScale), 0.0, 1.0);\n    float gamma_scale = gl_Position.w;\n\n    vec2 tex = a_tex / u_texsize;\n    vec2 fade_opacity = unpack_opacity(a_fade_opacity);\n    float fade_change = fade_opacity[1] > 0.5 ? u_fade_change : -u_fade_change;\n    float interpolated_fade_opacity = max(0.0, min(1.0, fade_opacity[0] + fade_change));\n\n    v_data0 = vec2(tex.x, tex.y);\n    v_data1 = vec3(gamma_scale, size, interpolated_fade_opacity);\n}\n"}},tr=/#pragma mapbox: ([\w]+) ([\w]+) ([\w]+) ([\w]+)/g,er=function(t){var e=Qe[t],r={};e.fragmentSource=e.fragmentSource.replace(tr,function(t,e,n,i,a){return r[a]=!0,"define"===e?"\n#ifndef HAS_UNIFORM_u_"+a+"\nvarying "+n+" "+i+" "+a+";\n#else\nuniform "+n+" "+i+" u_"+a+";\n#endif\n":"\n#ifdef HAS_UNIFORM_u_"+a+"\n    "+n+" "+i+" "+a+" = u_"+a+";\n#endif\n"}),e.vertexSource=e.vertexSource.replace(tr,function(t,e,n,i,a){var o="float"===i?"vec2":"vec4";return r[a]?"define"===e?"\n#ifndef HAS_UNIFORM_u_"+a+"\nuniform lowp float a_"+a+"_t;\nattribute "+n+" "+o+" a_"+a+";\nvarying "+n+" "+i+" "+a+";\n#else\nuniform "+n+" "+i+" u_"+a+";\n#endif\n":"\n#ifndef HAS_UNIFORM_u_"+a+"\n    "+a+" = unpack_mix_"+o+"(a_"+a+", a_"+a+"_t);\n#else\n    "+n+" "+i+" "+a+" = u_"+a+";\n#endif\n":"define"===e?"\n#ifndef HAS_UNIFORM_u_"+a+"\nuniform lowp float a_"+a+"_t;\nattribute "+n+" "+o+" a_"+a+";\n#else\nuniform "+n+" "+i+" u_"+a+";\n#endif\n":"\n#ifndef HAS_UNIFORM_u_"+a+"\n    "+n+" "+i+" "+a+" = unpack_mix_"+o+"(a_"+a+", a_"+a+"_t);\n#else\n    "+n+" "+i+" "+a+" = u_"+a+";\n#endif\n"})};for(var rr in Qe)er(rr);var nr=Qe,ir=function(t,e,r,n){var i=t.gl;this.program=i.createProgram();var o=r.defines().concat("#define DEVICE_PIXEL_RATIO "+a.devicePixelRatio.toFixed(1));n&&o.push("#define OVERDRAW_INSPECTOR;");var s=o.concat(nr.prelude.fragmentSource,e.fragmentSource).join("\n"),l=o.concat(nr.prelude.vertexSource,e.vertexSource).join("\n"),c=i.createShader(i.FRAGMENT_SHADER);i.shaderSource(c,s),i.compileShader(c),i.attachShader(this.program,c);var u=i.createShader(i.VERTEX_SHADER);i.shaderSource(u,l),i.compileShader(u),i.attachShader(this.program,u);for(var h=r.layoutAttributes||[],f=0;f<h.length;f++)i.bindAttribLocation(this.program,f,h[f].name);i.linkProgram(this.program),this.numAttributes=i.getProgramParameter(this.program,i.ACTIVE_ATTRIBUTES),this.attributes={},this.uniforms={};for(var p=0;p<this.numAttributes;p++){var d=i.getActiveAttrib(this.program,p);d&&(this.attributes[d.name]=i.getAttribLocation(this.program,d.name))}for(var g=i.getProgramParameter(this.program,i.ACTIVE_UNIFORMS),m=0;m<g;m++){var v=i.getActiveUniform(this.program,m);v&&(this.uniforms[v.name]=i.getUniformLocation(this.program,v.name))}};function ar(e,r,n,i,a){for(var o=0;o<n.length;o++){var s=n[o];if(i.isLessThan(s.tileID))break;if(r.key===s.tileID.key)return;if(s.tileID.isChildOf(r)){for(var l=r.children(1/0),c=0;c<l.length;c++)ar(e,l[c],n.slice(o),i,a);return}}var u=r.overscaledZ-e.overscaledZ,h=new t.CanonicalTileID(u,r.canonical.x-(e.canonical.x<<u),r.canonical.y-(e.canonical.y<<u));a[h.key]=a[h.key]||h}function or(t,e,r,n,i){var a=t.context,o=a.gl,s=i?t.useProgram("collisionCircle"):t.useProgram("collisionBox");a.setDepthMode(qt.disabled),a.setStencilMode(Ht.disabled),a.setColorMode(t.colorModeForRenderPass());for(var l=0;l<n.length;l++){var c=n[l],u=e.getTile(c),h=u.getBucket(r);if(h){var f=i?h.collisionCircle:h.collisionBox;if(f){o.uniformMatrix4fv(s.uniforms.u_matrix,!1,c.posMatrix),i||a.lineWidth.set(1),o.uniform1f(s.uniforms.u_camera_to_center_distance,t.transform.cameraToCenterDistance);var p=Te(u,1,t.transform.zoom),d=Math.pow(2,t.transform.zoom-u.tileID.overscaledZ);o.uniform1f(s.uniforms.u_pixels_to_tile_units,p),o.uniform2f(s.uniforms.u_extrude_scale,t.transform.pixelsToGLUnits[0]/(p*d),t.transform.pixelsToGLUnits[1]/(p*d)),o.uniform1f(s.uniforms.u_overscale_factor,u.tileID.overscaleFactor()),s.draw(a,i?o.TRIANGLES:o.LINES,r.id,f.layoutVertexBuffer,f.indexBuffer,f.segments,null,f.collisionVertexBuffer,null)}}}}ir.prototype.draw=function(t,e,r,n,i,a,o,s,l){for(var c,u=t.gl,h=(c={},c[u.LINES]=2,c[u.TRIANGLES]=3,c)[e],f=0,p=a.get();f<p.length;f+=1){var d=p[f],g=d.vaos||(d.vaos={});(g[r]||(g[r]=new Q)).bind(t,this,n,o?o.getPaintVertexBuffers():[],i,d.vertexOffset,s,l),u.drawElements(e,d.primitiveLength*h,u.UNSIGNED_SHORT,d.primitiveOffset*h*2)}};var sr=t.mat4.identity(new Float32Array(16)),lr=t.default$19.layout;function cr(t,e,r,n,i,a,o,s,l,c){var u,h=t.context,f=h.gl,p=t.transform,d="map"===s,g="map"===l,m=d&&"line"===r.layout.get("symbol-placement"),v=d&&!g&&!m,y=g;h.setDepthMode(y?t.depthModeForSublayer(0,qt.ReadOnly):qt.disabled);for(var x=0,b=n;x<b.length;x+=1){var _=b[x],w=e.getTile(_),k=w.getBucket(r);if(k){var M=i?k.text:k.icon;if(M&&M.segments.get().length){var A=M.programConfigurations.get(r.id),T=i||k.sdfIcons,S=i?k.textSizeData:k.iconSizeData;if(u||(u=t.useProgram(T?"symbolSDF":"symbolIcon",A),A.setUniforms(t.context,u,r.paint,{zoom:t.transform.zoom}),ur(u,t,r,i,v,g,S)),h.activeTexture.set(f.TEXTURE0),f.uniform1i(u.uniforms.u_texture,0),i)w.glyphAtlasTexture.bind(f.LINEAR,f.CLAMP_TO_EDGE),f.uniform2fv(u.uniforms.u_texsize,w.glyphAtlasTexture.size);else{var E=1!==r.layout.get("icon-size").constantOr(0)||k.iconsNeedLinear,C=g||0!==p.pitch;w.iconAtlasTexture.bind(T||t.options.rotating||t.options.zooming||E||C?f.LINEAR:f.NEAREST,f.CLAMP_TO_EDGE),f.uniform2fv(u.uniforms.u_texsize,w.iconAtlasTexture.size)}f.uniformMatrix4fv(u.uniforms.u_matrix,!1,t.translatePosMatrix(_.posMatrix,w,a,o));var L=Te(w,1,t.transform.zoom),z=he(_.posMatrix,g,d,t.transform,L),P=fe(_.posMatrix,g,d,t.transform,L);f.uniformMatrix4fv(u.uniforms.u_gl_coord_matrix,!1,t.translatePosMatrix(P,w,a,o,!0)),m?(f.uniformMatrix4fv(u.uniforms.u_label_plane_matrix,!1,sr),ge(k,_.posMatrix,t,i,z,P,g,c)):f.uniformMatrix4fv(u.uniforms.u_label_plane_matrix,!1,z),f.uniform1f(u.uniforms.u_fade_change,t.options.fadeDuration?t.symbolFadeChange:1),hr(u,A,t,r,w,M,i,T,g)}}}}function ur(e,r,n,i,a,o,s){var l=r.context.gl,c=r.transform;l.uniform1i(e.uniforms.u_pitch_with_map,o?1:0),l.uniform1f(e.uniforms.u_is_text,i?1:0),l.uniform1f(e.uniforms.u_pitch,c.pitch/360*2*Math.PI);var u="constant"===s.functionType||"source"===s.functionType,h="constant"===s.functionType||"camera"===s.functionType;l.uniform1i(e.uniforms.u_is_size_zoom_constant,u?1:0),l.uniform1i(e.uniforms.u_is_size_feature_constant,h?1:0),l.uniform1f(e.uniforms.u_camera_to_center_distance,c.cameraToCenterDistance);var f=t.evaluateSizeForZoom(s,c.zoom,lr.properties[i?"text-size":"icon-size"]);void 0!==f.uSizeT&&l.uniform1f(e.uniforms.u_size_t,f.uSizeT),void 0!==f.uSize&&l.uniform1f(e.uniforms.u_size,f.uSize),l.uniform1f(e.uniforms.u_aspect_ratio,c.width/c.height),l.uniform1i(e.uniforms.u_rotate_symbol,a?1:0)}function hr(t,e,r,n,i,a,o,s,l){var c=r.context,u=c.gl,h=r.transform;if(s){var f=0!==n.paint.get(o?"text-halo-width":"icon-halo-width").constantOr(1),p=l?Math.cos(h._pitch)*h.cameraToCenterDistance:1;u.uniform1f(t.uniforms.u_gamma_scale,p),f&&(u.uniform1f(t.uniforms.u_is_halo,1),fr(a,n,c,t)),u.uniform1f(t.uniforms.u_is_halo,0)}fr(a,n,c,t)}function fr(t,e,r,n){n.draw(r,r.gl.TRIANGLES,e.id,t.layoutVertexBuffer,t.indexBuffer,t.segments,t.programConfigurations.get(e.id),t.dynamicLayoutVertexBuffer,t.opacityVertexBuffer)}function pr(t,e,r,n,i,o,s,l,c){var u,h,f,p,d=e.context,g=d.gl,m=i.paint.get("line-dasharray"),v=i.paint.get("line-pattern");if(l||c){var y=1/Te(r,1,e.transform.tileZoom);if(m){u=e.lineAtlas.getDash(m.from,"round"===i.layout.get("line-cap")),h=e.lineAtlas.getDash(m.to,"round"===i.layout.get("line-cap"));var x=u.width*m.fromScale,b=h.width*m.toScale;g.uniform2f(t.uniforms.u_patternscale_a,y/x,-u.height/2),g.uniform2f(t.uniforms.u_patternscale_b,y/b,-h.height/2),g.uniform1f(t.uniforms.u_sdfgamma,e.lineAtlas.width/(256*Math.min(x,b)*a.devicePixelRatio)/2)}else if(v){if(f=e.imageManager.getPattern(v.from),p=e.imageManager.getPattern(v.to),!f||!p)return;g.uniform2f(t.uniforms.u_pattern_size_a,f.displaySize[0]*v.fromScale/y,f.displaySize[1]),g.uniform2f(t.uniforms.u_pattern_size_b,p.displaySize[0]*v.toScale/y,p.displaySize[1]);var _=e.imageManager.getPixelSize(),w=_.width,k=_.height;g.uniform2fv(t.uniforms.u_texsize,[w,k])}g.uniform2f(t.uniforms.u_gl_units_to_pixels,1/e.transform.pixelsToGLUnits[0],1/e.transform.pixelsToGLUnits[1])}l&&(m?(g.uniform1i(t.uniforms.u_image,0),d.activeTexture.set(g.TEXTURE0),e.lineAtlas.bind(d),g.uniform1f(t.uniforms.u_tex_y_a,u.y),g.uniform1f(t.uniforms.u_tex_y_b,h.y),g.uniform1f(t.uniforms.u_mix,m.t)):v&&(g.uniform1i(t.uniforms.u_image,0),d.activeTexture.set(g.TEXTURE0),e.imageManager.bind(d),g.uniform2fv(t.uniforms.u_pattern_tl_a,f.tl),g.uniform2fv(t.uniforms.u_pattern_br_a,f.br),g.uniform2fv(t.uniforms.u_pattern_tl_b,p.tl),g.uniform2fv(t.uniforms.u_pattern_br_b,p.br),g.uniform1f(t.uniforms.u_fade,v.t))),d.setStencilMode(e.stencilModeForClipping(o));var M=e.translatePosMatrix(o.posMatrix,r,i.paint.get("line-translate"),i.paint.get("line-translate-anchor"));if(g.uniformMatrix4fv(t.uniforms.u_matrix,!1,M),g.uniform1f(t.uniforms.u_ratio,1/Te(r,1,e.transform.zoom)),i.paint.get("line-gradient")){d.activeTexture.set(g.TEXTURE0);var A=i.gradientTexture;if(!i.gradient)return;A||(A=i.gradientTexture=new z(d,i.gradient,g.RGBA)),A.bind(g.LINEAR,g.CLAMP_TO_EDGE),g.uniform1i(t.uniforms.u_image,0)}t.draw(d,g.TRIANGLES,i.id,n.layoutVertexBuffer,n.indexBuffer,n.segments,s)}var dr=function(t,e){if(!t)return!1;var r=e.imageManager.getPattern(t.from),n=e.imageManager.getPattern(t.to);return!r||!n},gr=function(t,e,r){var n=e.context,i=n.gl,a=e.imageManager.getPattern(t.from),o=e.imageManager.getPattern(t.to);i.uniform1i(r.uniforms.u_image,0),i.uniform2fv(r.uniforms.u_pattern_tl_a,a.tl),i.uniform2fv(r.uniforms.u_pattern_br_a,a.br),i.uniform2fv(r.uniforms.u_pattern_tl_b,o.tl),i.uniform2fv(r.uniforms.u_pattern_br_b,o.br);var s=e.imageManager.getPixelSize(),l=s.width,c=s.height;i.uniform2fv(r.uniforms.u_texsize,[l,c]),i.uniform1f(r.uniforms.u_mix,t.t),i.uniform2fv(r.uniforms.u_pattern_size_a,a.displaySize),i.uniform2fv(r.uniforms.u_pattern_size_b,o.displaySize),i.uniform1f(r.uniforms.u_scale_a,t.fromScale),i.uniform1f(r.uniforms.u_scale_b,t.toScale),n.activeTexture.set(i.TEXTURE0),e.imageManager.bind(e.context)},mr=function(t,e,r){var n=e.context.gl;n.uniform1f(r.uniforms.u_tile_units_to_pixels,1/Te(t,1,e.transform.tileZoom));var i=Math.pow(2,t.tileID.overscaledZ),a=t.tileSize*Math.pow(2,e.transform.tileZoom)/i,o=a*(t.tileID.canonical.x+t.tileID.wrap*i),s=a*t.tileID.canonical.y;n.uniform2f(r.uniforms.u_pixel_coord_upper,o>>16,s>>16),n.uniform2f(r.uniforms.u_pixel_coord_lower,65535&o,65535&s)};function vr(t,e,r,n,i){if(!dr(r.paint.get("fill-pattern"),t))for(var a=!0,o=0,s=n;o<s.length;o+=1){var l=s[o],c=e.getTile(l),u=c.getBucket(r);u&&(t.context.setStencilMode(t.stencilModeForClipping(l)),i(t,e,r,c,l,u,a),a=!1)}}function yr(t,e,r,n,i,a,o){var s=t.context.gl,l=a.programConfigurations.get(r.id);br("fill",r.paint.get("fill-pattern"),t,l,r,n,i,o).draw(t.context,s.TRIANGLES,r.id,a.layoutVertexBuffer,a.indexBuffer,a.segments,l)}function xr(t,e,r,n,i,a,o){var s=t.context.gl,l=a.programConfigurations.get(r.id),c=br("fillOutline",r.getPaintProperty("fill-outline-color")?null:r.paint.get("fill-pattern"),t,l,r,n,i,o);s.uniform2f(c.uniforms.u_world,s.drawingBufferWidth,s.drawingBufferHeight),c.draw(t.context,s.LINES,r.id,a.layoutVertexBuffer,a.indexBuffer2,a.segments2,l)}function br(t,e,r,n,i,a,o,s){var l,c=r.context.program.get();return e?(l=r.useProgram(t+"Pattern",n),(s||l.program!==c)&&(n.setUniforms(r.context,l,i.paint,{zoom:r.transform.zoom}),gr(e,r,l)),mr(a,r,l)):(l=r.useProgram(t,n),(s||l.program!==c)&&n.setUniforms(r.context,l,i.paint,{zoom:r.transform.zoom})),r.context.gl.uniformMatrix4fv(l.uniforms.u_matrix,!1,r.translatePosMatrix(o.posMatrix,a,i.paint.get("fill-translate"),i.paint.get("fill-translate-anchor"))),l}var _r=t.default$20.mat3,wr=t.default$20.mat4,kr=t.default$20.vec3;function Mr(t,e,r,n,i,a,o){var s=t.context,l=s.gl,c=r.paint.get("fill-extrusion-pattern"),u=t.context.program.get(),h=a.programConfigurations.get(r.id),f=t.useProgram(c?"fillExtrusionPattern":"fillExtrusion",h);if((o||f.program!==u)&&h.setUniforms(s,f,r.paint,{zoom:t.transform.zoom}),c){if(dr(c,t))return;gr(c,t,f),mr(n,t,f),l.uniform1f(f.uniforms.u_height_factor,-Math.pow(2,i.overscaledZ)/n.tileSize/8)}t.context.gl.uniformMatrix4fv(f.uniforms.u_matrix,!1,t.translatePosMatrix(i.posMatrix,n,r.paint.get("fill-extrusion-translate"),r.paint.get("fill-extrusion-translate-anchor"))),function(t,e){var r=e.context.gl,n=e.style.light,i=n.properties.get("position"),a=[i.x,i.y,i.z],o=_r.create();"viewport"===n.properties.get("anchor")&&_r.fromRotation(o,-e.transform.angle),kr.transformMat3(a,a,o);var s=n.properties.get("color");r.uniform3fv(t.uniforms.u_lightpos,a),r.uniform1f(t.uniforms.u_lightintensity,n.properties.get("intensity")),r.uniform3f(t.uniforms.u_lightcolor,s.r,s.g,s.b)}(f,t),f.draw(s,l.TRIANGLES,r.id,a.layoutVertexBuffer,a.indexBuffer,a.segments,h)}function Ar(e,r,n){var i=e.context,a=i.gl,o=r.fbo;if(o){var s=e.useProgram("hillshade"),l=e.transform.calculatePosMatrix(r.tileID.toUnwrapped(),!0);!function(t,e,r){var n=r.paint.get("hillshade-illumination-direction")*(Math.PI/180);"viewport"===r.paint.get("hillshade-illumination-anchor")&&(n-=e.transform.angle),e.context.gl.uniform2f(t.uniforms.u_light,r.paint.get("hillshade-exaggeration"),n)}(s,e,n);var c=function(e,r){var n=r.toCoordinate(),i=new t.default$17(n.column,n.row+1,n.zoom);return[e.transform.coordinateLocation(n).lat,e.transform.coordinateLocation(i).lat]}(e,r.tileID);i.activeTexture.set(a.TEXTURE0),a.bindTexture(a.TEXTURE_2D,o.colorAttachment.get()),a.uniformMatrix4fv(s.uniforms.u_matrix,!1,l),a.uniform2fv(s.uniforms.u_latrange,c),a.uniform1i(s.uniforms.u_image,0);var u=n.paint.get("hillshade-shadow-color");a.uniform4f(s.uniforms.u_shadow,u.r,u.g,u.b,u.a);var h=n.paint.get("hillshade-highlight-color");a.uniform4f(s.uniforms.u_highlight,h.r,h.g,h.b,h.a);var f=n.paint.get("hillshade-accent-color");if(a.uniform4f(s.uniforms.u_accent,f.r,f.g,f.b,f.a),r.maskedBoundsBuffer&&r.maskedIndexBuffer&&r.segments)s.draw(i,a.TRIANGLES,n.id,r.maskedBoundsBuffer,r.maskedIndexBuffer,r.segments);else{var p=e.rasterBoundsBuffer;e.rasterBoundsVAO.bind(i,s,p,[]),a.drawArrays(a.TRIANGLE_STRIP,0,p.length)}}}function Tr(e,r,n){var i=e.context,a=i.gl;if(r.dem&&r.dem.level){var o=r.dem.level.dim,s=r.dem.getPixels();if(i.activeTexture.set(a.TEXTURE1),i.pixelStoreUnpackPremultiplyAlpha.set(!1),r.demTexture=r.demTexture||e.getTileTexture(r.tileSize),r.demTexture){var l=r.demTexture;l.update(s,{premultiply:!1}),l.bind(a.NEAREST,a.CLAMP_TO_EDGE)}else r.demTexture=new z(i,s,a.RGBA,{premultiply:!1}),r.demTexture.bind(a.NEAREST,a.CLAMP_TO_EDGE);i.activeTexture.set(a.TEXTURE0);var c=r.fbo;if(!c){var u=new z(i,{width:o,height:o,data:null},a.RGBA);u.bind(a.LINEAR,a.CLAMP_TO_EDGE),(c=r.fbo=i.createFramebuffer(o,o)).colorAttachment.set(u.texture)}i.bindFramebuffer.set(c.framebuffer),i.viewport.set([0,0,o,o]);var h=t.mat4.create();t.mat4.ortho(h,0,t.default$8,-t.default$8,0,0,1),t.mat4.translate(h,h,[0,-t.default$8,0]);var f=e.useProgram("hillshadePrepare");a.uniformMatrix4fv(f.uniforms.u_matrix,!1,h),a.uniform1f(f.uniforms.u_zoom,r.tileID.overscaledZ),a.uniform2fv(f.uniforms.u_dimension,[2*o,2*o]),a.uniform1i(f.uniforms.u_image,1),a.uniform1f(f.uniforms.u_maxzoom,n);var p=e.rasterBoundsBuffer;e.rasterBoundsVAO.bind(i,f,p,[]),a.drawArrays(a.TRIANGLE_STRIP,0,p.length),r.needsHillshadePrepare=!1}}function Sr(e,r,n,i,o){var s=i.paint.get("raster-fade-duration");if(s>0){var l=a.now(),c=(l-e.timeAdded)/s,u=r?(l-r.timeAdded)/s:-1,h=n.getSource(),f=o.coveringZoomLevel({tileSize:h.tileSize,roundZoom:h.roundZoom}),p=!r||Math.abs(r.tileID.overscaledZ-f)>Math.abs(e.tileID.overscaledZ-f),d=p&&e.refreshedUponExpiration?1:t.clamp(p?c:1-u,0,1);return e.refreshedUponExpiration&&c>=1&&(e.refreshedUponExpiration=!1),r?{opacity:1,mix:1-d}:{opacity:d,mix:0}}return{opacity:1,mix:0}}function Er(e,r,n){var i=e.context,o=i.gl;i.lineWidth.set(1*a.devicePixelRatio);var s=n.posMatrix,l=e.useProgram("debug");i.setDepthMode(qt.disabled),i.setStencilMode(Ht.disabled),i.setColorMode(e.colorModeForRenderPass()),o.uniformMatrix4fv(l.uniforms.u_matrix,!1,s),o.uniform4f(l.uniforms.u_color,1,0,0,1),e.debugVAO.bind(i,l,e.debugBuffer,[]),o.drawArrays(o.LINE_STRIP,0,e.debugBuffer.length);for(var c=function(t,e,r,n){n=n||1;var i,a,o,s,l,c,u,h,f=[];for(i=0,a=t.length;i<a;i++)if(l=Cr[t[i]]){for(h=null,o=0,s=l[1].length;o<s;o+=2)-1===l[1][o]&&-1===l[1][o+1]?h=null:(c=e+l[1][o]*n,u=200-l[1][o+1]*n,h&&f.push(h.x,h.y,c,u),h={x:c,y:u});e+=l[0]*n}return f}(n.toString(),50,0,5),u=new t.PosArray,h=0;h<c.length;h+=2)u.emplaceBack(c[h],c[h+1]);var f=i.createVertexBuffer(u,Ke.members);(new Q).bind(i,l,f,[]),o.uniform4f(l.uniforms.u_color,1,1,1,1);for(var p=r.getTile(n).tileSize,d=t.default$8/(Math.pow(2,e.transform.zoom-n.overscaledZ)*p),g=[[-1,-1],[-1,1],[1,-1],[1,1]],m=0;m<g.length;m++){var v=g[m];o.uniformMatrix4fv(l.uniforms.u_matrix,!1,t.mat4.translate([],s,[d*v[0],d*v[1],0])),o.drawArrays(o.LINES,0,f.length)}o.uniform4f(l.uniforms.u_color,0,0,0,1),o.uniformMatrix4fv(l.uniforms.u_matrix,!1,s),o.drawArrays(o.LINES,0,f.length)}var Cr={" ":[16,[]],"!":[10,[5,21,5,7,-1,-1,5,2,4,1,5,0,6,1,5,2]],'"':[16,[4,21,4,14,-1,-1,12,21,12,14]],"#":[21,[11,25,4,-7,-1,-1,17,25,10,-7,-1,-1,4,12,18,12,-1,-1,3,6,17,6]],$:[20,[8,25,8,-4,-1,-1,12,25,12,-4,-1,-1,17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],"%":[24,[21,21,3,0,-1,-1,8,21,10,19,10,17,9,15,7,14,5,14,3,16,3,18,4,20,6,21,8,21,10,20,13,19,16,19,19,20,21,21,-1,-1,17,7,15,6,14,4,14,2,16,0,18,0,20,1,21,3,21,5,19,7,17,7]],"&":[26,[23,12,23,13,22,14,21,14,20,13,19,11,17,6,15,3,13,1,11,0,7,0,5,1,4,2,3,4,3,6,4,8,5,9,12,13,13,14,14,16,14,18,13,20,11,21,9,20,8,18,8,16,9,13,11,10,16,3,18,1,20,0,22,0,23,1,23,2]],"'":[10,[5,19,4,20,5,21,6,20,6,18,5,16,4,15]],"(":[14,[11,25,9,23,7,20,5,16,4,11,4,7,5,2,7,-2,9,-5,11,-7]],")":[14,[3,25,5,23,7,20,9,16,10,11,10,7,9,2,7,-2,5,-5,3,-7]],"*":[16,[8,21,8,9,-1,-1,3,18,13,12,-1,-1,13,18,3,12]],"+":[26,[13,18,13,0,-1,-1,4,9,22,9]],",":[10,[6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"-":[26,[4,9,22,9]],".":[10,[5,2,4,1,5,0,6,1,5,2]],"/":[22,[20,25,2,-7]],0:[20,[9,21,6,20,4,17,3,12,3,9,4,4,6,1,9,0,11,0,14,1,16,4,17,9,17,12,16,17,14,20,11,21,9,21]],1:[20,[6,17,8,18,11,21,11,0]],2:[20,[4,16,4,17,5,19,6,20,8,21,12,21,14,20,15,19,16,17,16,15,15,13,13,10,3,0,17,0]],3:[20,[5,21,16,21,10,13,13,13,15,12,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],4:[20,[13,21,3,7,18,7,-1,-1,13,21,13,0]],5:[20,[15,21,5,21,4,12,5,13,8,14,11,14,14,13,16,11,17,8,17,6,16,3,14,1,11,0,8,0,5,1,4,2,3,4]],6:[20,[16,18,15,20,12,21,10,21,7,20,5,17,4,12,4,7,5,3,7,1,10,0,11,0,14,1,16,3,17,6,17,7,16,10,14,12,11,13,10,13,7,12,5,10,4,7]],7:[20,[17,21,7,0,-1,-1,3,21,17,21]],8:[20,[8,21,5,20,4,18,4,16,5,14,7,13,11,12,14,11,16,9,17,7,17,4,16,2,15,1,12,0,8,0,5,1,4,2,3,4,3,7,4,9,6,11,9,12,13,13,15,14,16,16,16,18,15,20,12,21,8,21]],9:[20,[16,14,15,11,13,9,10,8,9,8,6,9,4,11,3,14,3,15,4,18,6,20,9,21,10,21,13,20,15,18,16,14,16,9,15,4,13,1,10,0,8,0,5,1,4,3]],":":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,5,2,4,1,5,0,6,1,5,2]],";":[10,[5,14,4,13,5,12,6,13,5,14,-1,-1,6,1,5,0,4,1,5,2,6,1,6,-1,5,-3,4,-4]],"<":[24,[20,18,4,9,20,0]],"=":[26,[4,12,22,12,-1,-1,4,6,22,6]],">":[24,[4,18,20,9,4,0]],"?":[18,[3,16,3,17,4,19,5,20,7,21,11,21,13,20,14,19,15,17,15,15,14,13,13,12,9,10,9,7,-1,-1,9,2,8,1,9,0,10,1,9,2]],"@":[27,[18,13,17,15,15,16,12,16,10,15,9,14,8,11,8,8,9,6,11,5,14,5,16,6,17,8,-1,-1,12,16,10,14,9,11,9,8,10,6,11,5,-1,-1,18,16,17,8,17,6,19,5,21,5,23,7,24,10,24,12,23,15,22,17,20,19,18,20,15,21,12,21,9,20,7,19,5,17,4,15,3,12,3,9,4,6,5,4,7,2,9,1,12,0,15,0,18,1,20,2,21,3,-1,-1,19,16,18,8,18,6,19,5]],A:[18,[9,21,1,0,-1,-1,9,21,17,0,-1,-1,4,7,14,7]],B:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,-1,-1,4,11,13,11,16,10,17,9,18,7,18,4,17,2,16,1,13,0,4,0]],C:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5]],D:[21,[4,21,4,0,-1,-1,4,21,11,21,14,20,16,18,17,16,18,13,18,8,17,5,16,3,14,1,11,0,4,0]],E:[19,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11,-1,-1,4,0,17,0]],F:[18,[4,21,4,0,-1,-1,4,21,17,21,-1,-1,4,11,12,11]],G:[21,[18,16,17,18,15,20,13,21,9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,18,8,-1,-1,13,8,18,8]],H:[22,[4,21,4,0,-1,-1,18,21,18,0,-1,-1,4,11,18,11]],I:[8,[4,21,4,0]],J:[16,[12,21,12,5,11,2,10,1,8,0,6,0,4,1,3,2,2,5,2,7]],K:[21,[4,21,4,0,-1,-1,18,21,4,7,-1,-1,9,12,18,0]],L:[17,[4,21,4,0,-1,-1,4,0,16,0]],M:[24,[4,21,4,0,-1,-1,4,21,12,0,-1,-1,20,21,12,0,-1,-1,20,21,20,0]],N:[22,[4,21,4,0,-1,-1,4,21,18,0,-1,-1,18,21,18,0]],O:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21]],P:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,14,17,12,16,11,13,10,4,10]],Q:[22,[9,21,7,20,5,18,4,16,3,13,3,8,4,5,5,3,7,1,9,0,13,0,15,1,17,3,18,5,19,8,19,13,18,16,17,18,15,20,13,21,9,21,-1,-1,12,4,18,-2]],R:[21,[4,21,4,0,-1,-1,4,21,13,21,16,20,17,19,18,17,18,15,17,13,16,12,13,11,4,11,-1,-1,11,11,18,0]],S:[20,[17,18,15,20,12,21,8,21,5,20,3,18,3,16,4,14,5,13,7,12,13,10,15,9,16,8,17,6,17,3,15,1,12,0,8,0,5,1,3,3]],T:[16,[8,21,8,0,-1,-1,1,21,15,21]],U:[22,[4,21,4,6,5,3,7,1,10,0,12,0,15,1,17,3,18,6,18,21]],V:[18,[1,21,9,0,-1,-1,17,21,9,0]],W:[24,[2,21,7,0,-1,-1,12,21,7,0,-1,-1,12,21,17,0,-1,-1,22,21,17,0]],X:[20,[3,21,17,0,-1,-1,17,21,3,0]],Y:[18,[1,21,9,11,9,0,-1,-1,17,21,9,11]],Z:[20,[17,21,3,0,-1,-1,3,21,17,21,-1,-1,3,0,17,0]],"[":[14,[4,25,4,-7,-1,-1,5,25,5,-7,-1,-1,4,25,11,25,-1,-1,4,-7,11,-7]],"\\":[14,[0,21,14,-3]],"]":[14,[9,25,9,-7,-1,-1,10,25,10,-7,-1,-1,3,25,10,25,-1,-1,3,-7,10,-7]],"^":[16,[6,15,8,18,10,15,-1,-1,3,12,8,17,13,12,-1,-1,8,17,8,0]],_:[16,[0,-2,16,-2]],"`":[10,[6,21,5,20,4,18,4,16,5,15,6,16,5,17]],a:[19,[15,14,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],b:[19,[4,21,4,0,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],c:[18,[15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],d:[19,[15,21,15,0,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],e:[18,[3,8,15,8,15,10,14,12,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],f:[12,[10,21,8,21,6,20,5,17,5,0,-1,-1,2,14,9,14]],g:[19,[15,14,15,-2,14,-5,13,-6,11,-7,8,-7,6,-6,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],h:[19,[4,21,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],i:[8,[3,21,4,20,5,21,4,22,3,21,-1,-1,4,14,4,0]],j:[10,[5,21,6,20,7,21,6,22,5,21,-1,-1,6,14,6,-3,5,-6,3,-7,1,-7]],k:[17,[4,21,4,0,-1,-1,14,14,4,4,-1,-1,8,8,15,0]],l:[8,[4,21,4,0]],m:[30,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0,-1,-1,15,10,18,13,20,14,23,14,25,13,26,10,26,0]],n:[19,[4,14,4,0,-1,-1,4,10,7,13,9,14,12,14,14,13,15,10,15,0]],o:[19,[8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3,16,6,16,8,15,11,13,13,11,14,8,14]],p:[19,[4,14,4,-7,-1,-1,4,11,6,13,8,14,11,14,13,13,15,11,16,8,16,6,15,3,13,1,11,0,8,0,6,1,4,3]],q:[19,[15,14,15,-7,-1,-1,15,11,13,13,11,14,8,14,6,13,4,11,3,8,3,6,4,3,6,1,8,0,11,0,13,1,15,3]],r:[13,[4,14,4,0,-1,-1,4,8,5,11,7,13,9,14,12,14]],s:[17,[14,11,13,13,10,14,7,14,4,13,3,11,4,9,6,8,11,7,13,6,14,4,14,3,13,1,10,0,7,0,4,1,3,3]],t:[12,[5,21,5,4,6,1,8,0,10,0,-1,-1,2,14,9,14]],u:[19,[4,14,4,4,5,1,7,0,10,0,12,1,15,4,-1,-1,15,14,15,0]],v:[16,[2,14,8,0,-1,-1,14,14,8,0]],w:[22,[3,14,7,0,-1,-1,11,14,7,0,-1,-1,11,14,15,0,-1,-1,19,14,15,0]],x:[17,[3,14,14,0,-1,-1,14,14,3,0]],y:[16,[2,14,8,0,-1,-1,14,14,8,0,6,-4,4,-6,2,-7,1,-7]],z:[17,[14,14,3,0,-1,-1,3,14,14,14,-1,-1,3,0,14,0]],"{":[14,[9,25,7,24,6,23,5,21,5,19,6,17,7,16,8,14,8,12,6,10,-1,-1,7,24,6,22,6,20,7,18,8,17,9,15,9,13,8,11,4,9,8,7,9,5,9,3,8,1,7,0,6,-2,6,-4,7,-6,-1,-1,6,8,8,6,8,4,7,2,6,1,5,-1,5,-3,6,-5,7,-6,9,-7]],"|":[8,[4,25,4,-7]],"}":[14,[5,25,7,24,8,23,9,21,9,19,8,17,7,16,6,14,6,12,8,10,-1,-1,7,24,8,22,8,20,7,18,6,17,5,15,5,13,6,11,10,9,6,7,5,5,5,3,6,1,7,0,8,-2,8,-4,7,-6,-1,-1,8,8,6,6,6,4,7,2,8,1,9,-1,9,-3,8,-5,7,-6,5,-7]],"~":[24,[3,6,3,8,4,11,6,12,8,12,10,11,14,8,16,7,18,7,20,8,21,10,-1,-1,3,8,4,10,6,11,8,11,10,10,14,7,16,6,18,6,20,7,21,10,21,12]]},Lr={symbol:function(t,e,r,n){if("translucent"===t.renderPass){var i=t.context;i.setStencilMode(Ht.disabled),i.setColorMode(t.colorModeForRenderPass()),0!==r.paint.get("icon-opacity").constantOr(1)&&cr(t,e,r,n,!1,r.paint.get("icon-translate"),r.paint.get("icon-translate-anchor"),r.layout.get("icon-rotation-alignment"),r.layout.get("icon-pitch-alignment"),r.layout.get("icon-keep-upright")),0!==r.paint.get("text-opacity").constantOr(1)&&cr(t,e,r,n,!0,r.paint.get("text-translate"),r.paint.get("text-translate-anchor"),r.layout.get("text-rotation-alignment"),r.layout.get("text-pitch-alignment"),r.layout.get("text-keep-upright")),e.map.showCollisionBoxes&&function(t,e,r,n){or(t,e,r,n,!1),or(t,e,r,n,!0)}(t,e,r,n)}},circle:function(t,e,r,n){if("translucent"===t.renderPass){var i=r.paint.get("circle-opacity"),a=r.paint.get("circle-stroke-width"),o=r.paint.get("circle-stroke-opacity");if(0!==i.constantOr(1)||0!==a.constantOr(1)&&0!==o.constantOr(1)){var s=t.context,l=s.gl;s.setDepthMode(t.depthModeForSublayer(0,qt.ReadOnly)),s.setStencilMode(Ht.disabled),s.setColorMode(t.colorModeForRenderPass());for(var c=!0,u=0;u<n.length;u++){var h=n[u],f=e.getTile(h),p=f.getBucket(r);if(p){var d=t.context.program.get(),g=p.programConfigurations.get(r.id),m=t.useProgram("circle",g);if((c||m.program!==d)&&(g.setUniforms(s,m,r.paint,{zoom:t.transform.zoom}),c=!1),l.uniform1f(m.uniforms.u_camera_to_center_distance,t.transform.cameraToCenterDistance),l.uniform1i(m.uniforms.u_scale_with_map,"map"===r.paint.get("circle-pitch-scale")?1:0),"map"===r.paint.get("circle-pitch-alignment")){l.uniform1i(m.uniforms.u_pitch_with_map,1);var v=Te(f,1,t.transform.zoom);l.uniform2f(m.uniforms.u_extrude_scale,v,v)}else l.uniform1i(m.uniforms.u_pitch_with_map,0),l.uniform2fv(m.uniforms.u_extrude_scale,t.transform.pixelsToGLUnits);l.uniformMatrix4fv(m.uniforms.u_matrix,!1,t.translatePosMatrix(h.posMatrix,f,r.paint.get("circle-translate"),r.paint.get("circle-translate-anchor"))),m.draw(s,l.TRIANGLES,r.id,p.layoutVertexBuffer,p.indexBuffer,p.segments,g)}}}}},heatmap:function(e,r,n,i){if(0!==n.paint.get("heatmap-opacity"))if("offscreen"===e.renderPass){var a=e.context,o=a.gl;a.setDepthMode(e.depthModeForSublayer(0,qt.ReadOnly)),a.setStencilMode(Ht.disabled),function(t,e,r){var n=t.gl;t.activeTexture.set(n.TEXTURE1),t.viewport.set([0,0,e.width/4,e.height/4]);var i=r.heatmapFbo;if(i)n.bindTexture(n.TEXTURE_2D,i.colorAttachment.get()),t.bindFramebuffer.set(i.framebuffer);else{var a=n.createTexture();n.bindTexture(n.TEXTURE_2D,a),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_S,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_WRAP_T,n.CLAMP_TO_EDGE),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MIN_FILTER,n.LINEAR),n.texParameteri(n.TEXTURE_2D,n.TEXTURE_MAG_FILTER,n.LINEAR),i=r.heatmapFbo=t.createFramebuffer(e.width/4,e.height/4),function t(e,r,n,i){var a=e.gl;a.texImage2D(a.TEXTURE_2D,0,a.RGBA,r.width/4,r.height/4,0,a.RGBA,e.extTextureHalfFloat?e.extTextureHalfFloat.HALF_FLOAT_OES:a.UNSIGNED_BYTE,null),i.colorAttachment.set(n),e.extTextureHalfFloat&&a.checkFramebufferStatus(a.FRAMEBUFFER)!==a.FRAMEBUFFER_COMPLETE&&(e.extTextureHalfFloat=null,i.colorAttachment.setDirty(),t(e,r,n,i))}(t,e,a,i)}}(a,e,n),a.clear({color:t.default$6.transparent}),a.setColorMode(new Gt([o.ONE,o.ONE],t.default$6.transparent,[!0,!0,!0,!0]));for(var s=!0,l=0;l<i.length;l++){var c=i[l];if(!r.hasRenderableParent(c)){var u=r.getTile(c),h=u.getBucket(n);if(h){var f=e.context.program.get(),p=h.programConfigurations.get(n.id),d=e.useProgram("heatmap",p),g=e.transform.zoom;(s||d.program!==f)&&(p.setUniforms(e.context,d,n.paint,{zoom:g}),s=!1),o.uniform1f(d.uniforms.u_extrude_scale,Te(u,1,g)),o.uniform1f(d.uniforms.u_intensity,n.paint.get("heatmap-intensity")),o.uniformMatrix4fv(d.uniforms.u_matrix,!1,c.posMatrix),d.draw(a,o.TRIANGLES,n.id,h.layoutVertexBuffer,h.indexBuffer,h.segments,p)}}}a.viewport.set([0,0,e.width,e.height])}else"translucent"===e.renderPass&&(e.context.setColorMode(e.colorModeForRenderPass()),function(e,r){var n=e.context,i=n.gl,a=r.heatmapFbo;if(a){n.activeTexture.set(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,a.colorAttachment.get()),n.activeTexture.set(i.TEXTURE1);var o=r.colorRampTexture;o||(o=r.colorRampTexture=new z(n,r.colorRamp,i.RGBA)),o.bind(i.LINEAR,i.CLAMP_TO_EDGE),n.setDepthMode(qt.disabled);var s=e.useProgram("heatmapTexture"),l=r.paint.get("heatmap-opacity");i.uniform1f(s.uniforms.u_opacity,l),i.uniform1i(s.uniforms.u_image,0),i.uniform1i(s.uniforms.u_color_ramp,1);var c=t.mat4.create();t.mat4.ortho(c,0,e.width,e.height,0,0,1),i.uniformMatrix4fv(s.uniforms.u_matrix,!1,c),i.uniform2f(s.uniforms.u_world,i.drawingBufferWidth,i.drawingBufferHeight),e.viewportVAO.bind(e.context,s,e.viewportBuffer,[]),i.drawArrays(i.TRIANGLE_STRIP,0,4)}}(e,n))},line:function(t,e,r,n){if("translucent"===t.renderPass&&0!==r.paint.get("line-opacity").constantOr(1)){var i=t.context;i.setDepthMode(t.depthModeForSublayer(0,qt.ReadOnly)),i.setColorMode(t.colorModeForRenderPass());for(var a,o=r.paint.get("line-dasharray")?"lineSDF":r.paint.get("line-pattern")?"linePattern":r.paint.get("line-gradient")?"lineGradient":"line",s=!0,l=0,c=n;l<c.length;l+=1){var u=c[l],h=e.getTile(u),f=h.getBucket(r);if(f){var p=f.programConfigurations.get(r.id),d=t.context.program.get(),g=t.useProgram(o,p),m=s||g.program!==d,v=a!==h.tileID.overscaledZ;m&&p.setUniforms(t.context,g,r.paint,{zoom:t.transform.zoom}),pr(g,t,h,f,r,u,p,m,v),a=h.tileID.overscaledZ,s=!1}}}},fill:function(e,r,n,i){var a=n.paint.get("fill-color"),o=n.paint.get("fill-opacity");if(0!==o.constantOr(1)){var s=e.context;s.setColorMode(e.colorModeForRenderPass());var l=n.paint.get("fill-pattern")||1!==a.constantOr(t.default$6.transparent).a||1!==o.constantOr(0)?"translucent":"opaque";e.renderPass===l&&(s.setDepthMode(e.depthModeForSublayer(1,"opaque"===e.renderPass?qt.ReadWrite:qt.ReadOnly)),vr(e,r,n,i,yr)),"translucent"===e.renderPass&&n.paint.get("fill-antialias")&&(s.lineWidth.set(2),s.setDepthMode(e.depthModeForSublayer(n.getPaintProperty("fill-outline-color")?2:0,qt.ReadOnly)),vr(e,r,n,i,xr))}},"fill-extrusion":function(e,r,n,i){if(0!==n.paint.get("fill-extrusion-opacity"))if("offscreen"===e.renderPass){!function(e,r){var n=e.context,i=n.gl,a=r.viewportFrame;if(e.depthRboNeedsClear&&e.setupOffscreenDepthRenderbuffer(),!a){var o=new z(n,{width:e.width,height:e.height,data:null},i.RGBA);o.bind(i.LINEAR,i.CLAMP_TO_EDGE),(a=r.viewportFrame=n.createFramebuffer(e.width,e.height)).colorAttachment.set(o.texture)}n.bindFramebuffer.set(a.framebuffer),a.depthAttachment.set(e.depthRbo),e.depthRboNeedsClear&&(n.clear({depth:1}),e.depthRboNeedsClear=!1),n.clear({color:t.default$6.transparent}),n.setStencilMode(Ht.disabled),n.setDepthMode(new qt(i.LEQUAL,qt.ReadWrite,[0,1])),n.setColorMode(e.colorModeForRenderPass())}(e,n);for(var a=!0,o=0,s=i;o<s.length;o+=1){var l=s[o],c=r.getTile(l),u=c.getBucket(n);u&&(Mr(e,0,n,c,l,u,a),a=!1)}}else"translucent"===e.renderPass&&function(t,e){var r=e.viewportFrame;if(r){var n=t.context,i=n.gl,a=t.useProgram("extrusionTexture");n.setStencilMode(Ht.disabled),n.setDepthMode(qt.disabled),n.setColorMode(t.colorModeForRenderPass()),n.activeTexture.set(i.TEXTURE0),i.bindTexture(i.TEXTURE_2D,r.colorAttachment.get()),i.uniform1f(a.uniforms.u_opacity,e.paint.get("fill-extrusion-opacity")),i.uniform1i(a.uniforms.u_image,0);var o=wr.create();wr.ortho(o,0,t.width,t.height,0,0,1),i.uniformMatrix4fv(a.uniforms.u_matrix,!1,o),i.uniform2f(a.uniforms.u_world,i.drawingBufferWidth,i.drawingBufferHeight),t.viewportVAO.bind(n,a,t.viewportBuffer,[]),i.drawArrays(i.TRIANGLE_STRIP,0,4)}}(e,n)},hillshade:function(t,e,r,n){if("offscreen"===t.renderPass||"translucent"===t.renderPass){var i=t.context,a=e.getSource().maxzoom;i.setDepthMode(t.depthModeForSublayer(0,qt.ReadOnly)),i.setStencilMode(Ht.disabled),i.setColorMode(t.colorModeForRenderPass());for(var o=0,s=n;o<s.length;o+=1){var l=s[o],c=e.getTile(l);c.needsHillshadePrepare&&"offscreen"===t.renderPass?Tr(t,c,a):"translucent"===t.renderPass&&Ar(t,c,r)}i.viewport.set([0,0,t.width,t.height])}},raster:function(t,e,r,n){if("translucent"===t.renderPass&&0!==r.paint.get("raster-opacity")){var i,a,o=t.context,s=o.gl,l=e.getSource(),c=t.useProgram("raster");o.setStencilMode(Ht.disabled),o.setColorMode(t.colorModeForRenderPass()),s.uniform1f(c.uniforms.u_brightness_low,r.paint.get("raster-brightness-min")),s.uniform1f(c.uniforms.u_brightness_high,r.paint.get("raster-brightness-max")),s.uniform1f(c.uniforms.u_saturation_factor,(i=r.paint.get("raster-saturation"))>0?1-1/(1.001-i):-i),s.uniform1f(c.uniforms.u_contrast_factor,(a=r.paint.get("raster-contrast"))>0?1/(1-a):1+a),s.uniform3fv(c.uniforms.u_spin_weights,function(t){t*=Math.PI/180;var e=Math.sin(t),r=Math.cos(t);return[(2*r+1)/3,(-Math.sqrt(3)*e-r+1)/3,(Math.sqrt(3)*e-r+1)/3]}(r.paint.get("raster-hue-rotate"))),s.uniform1f(c.uniforms.u_buffer_scale,1),s.uniform1i(c.uniforms.u_image0,0),s.uniform1i(c.uniforms.u_image1,1);for(var u=n.length&&n[0].overscaledZ,h=0,f=n;h<f.length;h+=1){var p=f[h];o.setDepthMode(t.depthModeForSublayer(p.overscaledZ-u,1===r.paint.get("raster-opacity")?qt.ReadWrite:qt.ReadOnly,s.LESS));var d=e.getTile(p),g=t.transform.calculatePosMatrix(p.toUnwrapped(),!0);d.registerFadeDuration(r.paint.get("raster-fade-duration")),s.uniformMatrix4fv(c.uniforms.u_matrix,!1,g);var m=e.findLoadedParent(p,0,{}),v=Sr(d,m,e,r,t.transform),y=void 0,x=void 0;if(o.activeTexture.set(s.TEXTURE0),d.texture.bind(s.LINEAR,s.CLAMP_TO_EDGE,s.LINEAR_MIPMAP_NEAREST),o.activeTexture.set(s.TEXTURE1),m?(m.texture.bind(s.LINEAR,s.CLAMP_TO_EDGE,s.LINEAR_MIPMAP_NEAREST),y=Math.pow(2,m.tileID.overscaledZ-d.tileID.overscaledZ),x=[d.tileID.canonical.x*y%1,d.tileID.canonical.y*y%1]):d.texture.bind(s.LINEAR,s.CLAMP_TO_EDGE,s.LINEAR_MIPMAP_NEAREST),s.uniform2fv(c.uniforms.u_tl_parent,x||[0,0]),s.uniform1f(c.uniforms.u_scale_parent,y||1),s.uniform1f(c.uniforms.u_fade_t,v.mix),s.uniform1f(c.uniforms.u_opacity,v.opacity*r.paint.get("raster-opacity")),l instanceof tt){var b=l.boundsBuffer;l.boundsVAO.bind(o,c,b,[]),s.drawArrays(s.TRIANGLE_STRIP,0,b.length)}else if(d.maskedBoundsBuffer&&d.maskedIndexBuffer&&d.segments)c.draw(o,s.TRIANGLES,r.id,d.maskedBoundsBuffer,d.maskedIndexBuffer,d.segments);else{var _=t.rasterBoundsBuffer;t.rasterBoundsVAO.bind(o,c,_,[]),s.drawArrays(s.TRIANGLE_STRIP,0,_.length)}}}},background:function(t,e,r){var n=r.paint.get("background-color"),i=r.paint.get("background-opacity");if(0!==i){var a=t.context,o=a.gl,s=t.transform,l=s.tileSize,c=r.paint.get("background-pattern"),u=c||1!==n.a||1!==i?"translucent":"opaque";if(t.renderPass===u){var h;if(a.setStencilMode(Ht.disabled),a.setDepthMode(t.depthModeForSublayer(0,"opaque"===u?qt.ReadWrite:qt.ReadOnly)),a.setColorMode(t.colorModeForRenderPass()),c){if(dr(c,t))return;h=t.useProgram("backgroundPattern"),gr(c,t,h),t.tileExtentPatternVAO.bind(a,h,t.tileExtentBuffer,[])}else h=t.useProgram("background"),o.uniform4fv(h.uniforms.u_color,[n.r,n.g,n.b,n.a]),t.tileExtentVAO.bind(a,h,t.tileExtentBuffer,[]);o.uniform1f(h.uniforms.u_opacity,i);for(var f=0,p=s.coveringTiles({tileSize:l});f<p.length;f+=1){var d=p[f];c&&mr({tileID:d,tileSize:l},t,h),o.uniformMatrix4fv(h.uniforms.u_matrix,!1,t.transform.calculatePosMatrix(d.toUnwrapped())),o.drawArrays(o.TRIANGLE_STRIP,0,t.tileExtentBuffer.length)}}}},debug:function(t,e,r){for(var n=0;n<r.length;n++)Er(t,e,r[n])}},zr=function(e,r){this.context=new Wt(e),this.transform=r,this._tileTextures={},this.setup(),this.numSublayers=Yt.maxUnderzooming+Yt.maxOverzooming+1,this.depthEpsilon=1/Math.pow(2,16),this.depthRboNeedsClear=!0,this.emptyProgramConfiguration=new t.default$24,this.crossTileSymbolIndex=new Ye};function Pr(t,e){if(t.row>e.row){var r=t;t=e,e=r}return{x0:t.column,y0:t.row,x1:e.column,y1:e.row,dx:e.column-t.column,dy:e.row-t.row}}function Ir(t,e,r,n,i){var a=Math.max(r,Math.floor(e.y0)),o=Math.min(n,Math.ceil(e.y1));if(t.x0===e.x0&&t.y0===e.y0?t.x0+e.dy/t.dy*t.dx<e.x1:t.x1-e.dy/t.dy*t.dx<e.x0){var s=t;t=e,e=s}for(var l=t.dx/t.dy,c=e.dx/e.dy,u=t.dx>0,h=e.dx<0,f=a;f<o;f++){var p=l*Math.max(0,Math.min(t.dy,f+u-t.y0))+t.x0,d=c*Math.max(0,Math.min(e.dy,f+h-e.y0))+e.x0;i(Math.floor(d),Math.ceil(p),f)}}function Or(t,e,r,n,i,a){var o,s=Pr(t,e),l=Pr(e,r),c=Pr(r,t);s.dy>l.dy&&(o=s,s=l,l=o),s.dy>c.dy&&(o=s,s=c,c=o),l.dy>c.dy&&(o=l,l=c,c=o),s.dy&&Ir(c,s,n,i,a),l.dy&&Ir(c,l,n,i,a)}zr.prototype.resize=function(t,e){var r=this.context.gl;if(this.width=t*a.devicePixelRatio,this.height=e*a.devicePixelRatio,this.context.viewport.set([0,0,this.width,this.height]),this.style)for(var n=0,i=this.style._order;n<i.length;n+=1){var o=i[n];this.style._layers[o].resize()}this.depthRbo&&(r.deleteRenderbuffer(this.depthRbo),this.depthRbo=null)},zr.prototype.setup=function(){var e=this.context,r=new t.PosArray;r.emplaceBack(0,0),r.emplaceBack(t.default$8,0),r.emplaceBack(0,t.default$8),r.emplaceBack(t.default$8,t.default$8),this.tileExtentBuffer=e.createVertexBuffer(r,Ke.members),this.tileExtentVAO=new Q,this.tileExtentPatternVAO=new Q;var n=new t.PosArray;n.emplaceBack(0,0),n.emplaceBack(t.default$8,0),n.emplaceBack(t.default$8,t.default$8),n.emplaceBack(0,t.default$8),n.emplaceBack(0,0),this.debugBuffer=e.createVertexBuffer(n,Ke.members),this.debugVAO=new Q;var i=new t.RasterBoundsArray;i.emplaceBack(0,0,0,0),i.emplaceBack(t.default$8,0,t.default$8,0),i.emplaceBack(0,t.default$8,0,t.default$8),i.emplaceBack(t.default$8,t.default$8,t.default$8,t.default$8),this.rasterBoundsBuffer=e.createVertexBuffer(i,K.members),this.rasterBoundsVAO=new Q;var a=new t.PosArray;a.emplaceBack(0,0),a.emplaceBack(1,0),a.emplaceBack(0,1),a.emplaceBack(1,1),this.viewportBuffer=e.createVertexBuffer(a,Ke.members),this.viewportVAO=new Q},zr.prototype.clearStencil=function(){var e=this.context,r=e.gl;e.setColorMode(Gt.disabled),e.setDepthMode(qt.disabled),e.setStencilMode(new Ht({func:r.ALWAYS,mask:0},0,255,r.ZERO,r.ZERO,r.ZERO));var n=t.mat4.create();t.mat4.ortho(n,0,this.width,this.height,0,0,1),t.mat4.scale(n,n,[r.drawingBufferWidth,r.drawingBufferHeight,0]);var i=this.useProgram("clippingMask");r.uniformMatrix4fv(i.uniforms.u_matrix,!1,n),this.viewportVAO.bind(e,i,this.viewportBuffer,[]),r.drawArrays(r.TRIANGLE_STRIP,0,4)},zr.prototype._renderTileClippingMasks=function(t){var e=this.context,r=e.gl;e.setColorMode(Gt.disabled),e.setDepthMode(qt.disabled);var n=1;this._tileClippingMaskIDs={};for(var i=0,a=t;i<a.length;i+=1){var o=a[i],s=this._tileClippingMaskIDs[o.key]=n++;e.setStencilMode(new Ht({func:r.ALWAYS,mask:0},s,255,r.KEEP,r.KEEP,r.REPLACE));var l=this.useProgram("clippingMask");r.uniformMatrix4fv(l.uniforms.u_matrix,!1,o.posMatrix),this.tileExtentVAO.bind(this.context,l,this.tileExtentBuffer,[]),r.drawArrays(r.TRIANGLE_STRIP,0,this.tileExtentBuffer.length)}},zr.prototype.stencilModeForClipping=function(t){var e=this.context.gl;return new Ht({func:e.EQUAL,mask:255},this._tileClippingMaskIDs[t.key],0,e.KEEP,e.KEEP,e.REPLACE)},zr.prototype.colorModeForRenderPass=function(){var e=this.context.gl;return this._showOverdrawInspector?new Gt([e.CONSTANT_COLOR,e.ONE],new t.default$6(1/8,1/8,1/8,0),[!0,!0,!0,!0]):"opaque"===this.renderPass?Gt.unblended:Gt.alphaBlended},zr.prototype.depthModeForSublayer=function(t,e,r){var n=1-((1+this.currentLayer)*this.numSublayers+t)*this.depthEpsilon,i=n-1+this.depthRange;return new qt(r||this.context.gl.LEQUAL,e,[i,n])},zr.prototype.render=function(e,r){var n=this;for(var i in this.style=e,this.options=r,this.lineAtlas=e.lineAtlas,this.imageManager=e.imageManager,this.glyphManager=e.glyphManager,this.symbolFadeChange=e.placement.symbolFadeChange(a.now()),e.sourceCaches){var o=n.style.sourceCaches[i];o.used&&o.prepare(n.context)}var s=this.style._order,l=t.filterObject(this.style.sourceCaches,function(t){return"raster"===t.getSource().type||"raster-dem"===t.getSource().type}),c=function(e){var r=l[e];!function(e,r){for(var n=e.sort(function(t,e){return t.tileID.isLessThan(e.tileID)?-1:e.tileID.isLessThan(t.tileID)?1:0}),i=0;i<n.length;i++){var a={},o=n[i],s=n.slice(i+1);ar(o.tileID.wrapped(),o.tileID,s,new t.OverscaledTileID(0,o.tileID.wrap+1,0,0,0),a),o.setMask(a,r)}}(r.getVisibleCoordinates().map(function(t){return r.getTile(t)}),n.context)};for(var u in l)c(u);this.renderPass="offscreen";var h,f=[];this.depthRboNeedsClear=!0;for(var p=0;p<s.length;p++){var d=n.style._layers[s[p]];d.hasOffscreenPass()&&!d.isHidden(n.transform.zoom)&&(d.source!==(h&&h.id)&&(f=[],(h=n.style.sourceCaches[d.source])&&(f=h.getVisibleCoordinates()).reverse()),f.length&&n.renderLayer(n,h,d,f))}this.context.bindFramebuffer.set(null),this.context.clear({color:r.showOverdrawInspector?t.default$6.black:t.default$6.transparent,depth:1}),this._showOverdrawInspector=r.showOverdrawInspector,this.depthRange=(e._order.length+2)*this.numSublayers*this.depthEpsilon,this.renderPass="opaque";var g,m=[];for(this.currentLayer=s.length-1,this.currentLayer;this.currentLayer>=0;this.currentLayer--){var v=n.style._layers[s[n.currentLayer]];v.source!==(g&&g.id)&&(m=[],(g=n.style.sourceCaches[v.source])&&(n.clearStencil(),m=g.getVisibleCoordinates(),g.getSource().isTileClipped&&n._renderTileClippingMasks(m))),n.renderLayer(n,g,v,m)}this.renderPass="translucent";var y,x=[];for(this.currentLayer=0,this.currentLayer;this.currentLayer<s.length;this.currentLayer++){var b=n.style._layers[s[n.currentLayer]];b.source!==(y&&y.id)&&(x=[],(y=n.style.sourceCaches[b.source])&&(n.clearStencil(),x=y.getVisibleCoordinates(),y.getSource().isTileClipped&&n._renderTileClippingMasks(x)),x.reverse()),n.renderLayer(n,y,b,x)}if(this.options.showTileBoundaries){var _=this.style.sourceCaches[Object.keys(this.style.sourceCaches)[0]];_&&Lr.debug(this,_,_.getVisibleCoordinates())}},zr.prototype.setupOffscreenDepthRenderbuffer=function(){var t=this.context;this.depthRbo||(this.depthRbo=t.createRenderbuffer(t.gl.DEPTH_COMPONENT16,this.width,this.height))},zr.prototype.renderLayer=function(t,e,r,n){r.isHidden(this.transform.zoom)||("background"===r.type||n.length)&&(this.id=r.id,Lr[r.type](t,e,r,n))},zr.prototype.translatePosMatrix=function(e,r,n,i,a){if(!n[0]&&!n[1])return e;var o=a?"map"===i?this.transform.angle:0:"viewport"===i?-this.transform.angle:0;if(o){var s=Math.sin(o),l=Math.cos(o);n=[n[0]*l-n[1]*s,n[0]*s+n[1]*l]}var c=[a?n[0]:Te(r,n[0],this.transform.zoom),a?n[1]:Te(r,n[1],this.transform.zoom),0],u=new Float32Array(16);return t.mat4.translate(u,e,c),u},zr.prototype.saveTileTexture=function(t){var e=this._tileTextures[t.size[0]];e?e.push(t):this._tileTextures[t.size[0]]=[t]},zr.prototype.getTileTexture=function(t){var e=this._tileTextures[t];return e&&e.length>0?e.pop():null},zr.prototype._createProgramCached=function(t,e){this.cache=this.cache||{};var r=""+t+(e.cacheKey||"")+(this._showOverdrawInspector?"/overdraw":"");return this.cache[r]||(this.cache[r]=new ir(this.context,nr[t],e,this._showOverdrawInspector)),this.cache[r]},zr.prototype.useProgram=function(t,e){var r=this._createProgramCached(t,e||this.emptyProgramConfiguration);return this.context.program.set(r.program),r};var Dr=t.default$20.vec4,Rr=t.default$20.mat4,Br=t.default$20.mat2,Fr=function(t,e,r){this.tileSize=512,this._renderWorldCopies=void 0===r||r,this._minZoom=t||0,this._maxZoom=e||22,this.latRange=[-85.05113,85.05113],this.width=0,this.height=0,this._center=new G(0,0),this.zoom=0,this.angle=0,this._fov=.6435011087932844,this._pitch=0,this._unmodified=!0,this._posMatrixCache={},this._alignedPosMatrixCache={}},Nr={minZoom:{configurable:!0},maxZoom:{configurable:!0},renderWorldCopies:{configurable:!0},worldSize:{configurable:!0},centerPoint:{configurable:!0},size:{configurable:!0},bearing:{configurable:!0},pitch:{configurable:!0},fov:{configurable:!0},zoom:{configurable:!0},center:{configurable:!0},unmodified:{configurable:!0},x:{configurable:!0},y:{configurable:!0},point:{configurable:!0}};Fr.prototype.clone=function(){var t=new Fr(this._minZoom,this._maxZoom,this._renderWorldCopies);return t.tileSize=this.tileSize,t.latRange=this.latRange,t.width=this.width,t.height=this.height,t._center=this._center,t.zoom=this.zoom,t.angle=this.angle,t._fov=this._fov,t._pitch=this._pitch,t._unmodified=this._unmodified,t._calcMatrices(),t},Nr.minZoom.get=function(){return this._minZoom},Nr.minZoom.set=function(t){this._minZoom!==t&&(this._minZoom=t,this.zoom=Math.max(this.zoom,t))},Nr.maxZoom.get=function(){return this._maxZoom},Nr.maxZoom.set=function(t){this._maxZoom!==t&&(this._maxZoom=t,this.zoom=Math.min(this.zoom,t))},Nr.renderWorldCopies.get=function(){return this._renderWorldCopies},Nr.renderWorldCopies.set=function(t){void 0===t?t=!0:null===t&&(t=!1),this._renderWorldCopies=t},Nr.worldSize.get=function(){return this.tileSize*this.scale},Nr.centerPoint.get=function(){return this.size._div(2)},Nr.size.get=function(){return new t.default$1(this.width,this.height)},Nr.bearing.get=function(){return-this.angle/Math.PI*180},Nr.bearing.set=function(e){var r=-t.wrap(e,-180,180)*Math.PI/180;this.angle!==r&&(this._unmodified=!1,this.angle=r,this._calcMatrices(),this.rotationMatrix=Br.create(),Br.rotate(this.rotationMatrix,this.rotationMatrix,this.angle))},Nr.pitch.get=function(){return this._pitch/Math.PI*180},Nr.pitch.set=function(e){var r=t.clamp(e,0,60)/180*Math.PI;this._pitch!==r&&(this._unmodified=!1,this._pitch=r,this._calcMatrices())},Nr.fov.get=function(){return this._fov/Math.PI*180},Nr.fov.set=function(t){t=Math.max(.01,Math.min(60,t)),this._fov!==t&&(this._unmodified=!1,this._fov=t/180*Math.PI,this._calcMatrices())},Nr.zoom.get=function(){return this._zoom},Nr.zoom.set=function(t){var e=Math.min(Math.max(t,this.minZoom),this.maxZoom);this._zoom!==e&&(this._unmodified=!1,this._zoom=e,this.scale=this.zoomScale(e),this.tileZoom=Math.floor(e),this.zoomFraction=e-this.tileZoom,this._constrain(),this._calcMatrices())},Nr.center.get=function(){return this._center},Nr.center.set=function(t){t.lat===this._center.lat&&t.lng===this._center.lng||(this._unmodified=!1,this._center=t,this._constrain(),this._calcMatrices())},Fr.prototype.coveringZoomLevel=function(t){return(t.roundZoom?Math.round:Math.floor)(this.zoom+this.scaleZoom(this.tileSize/t.tileSize))},Fr.prototype.getVisibleUnwrappedCoordinates=function(e){var r=this.pointCoordinate(new t.default$1(0,0),0),n=this.pointCoordinate(new t.default$1(this.width,0),0),i=Math.floor(r.column),a=Math.floor(n.column),o=[new t.UnwrappedTileID(0,e)];if(this._renderWorldCopies)for(var s=i;s<=a;s++)0!==s&&o.push(new t.UnwrappedTileID(s,e));return o},Fr.prototype.coveringTiles=function(e){var r=this.coveringZoomLevel(e),n=r;if(void 0!==e.minzoom&&r<e.minzoom)return[];void 0!==e.maxzoom&&r>e.maxzoom&&(r=e.maxzoom);var i=this.pointCoordinate(this.centerPoint,r),a=new t.default$1(i.column-.5,i.row-.5);return function(e,r,n,i){void 0===i&&(i=!0);var a=1<<e,o={};function s(r,s,l){var c,u,h,f;if(l>=0&&l<=a)for(c=r;c<s;c++)u=Math.floor(c/a),h=(c%a+a)%a,0!==u&&!0!==i||(f=new t.OverscaledTileID(n,u,e,h,l),o[f.key]=f)}return Or(r[0],r[1],r[2],0,a,s),Or(r[2],r[3],r[0],0,a,s),Object.keys(o).map(function(t){return o[t]})}(r,[this.pointCoordinate(new t.default$1(0,0),r),this.pointCoordinate(new t.default$1(this.width,0),r),this.pointCoordinate(new t.default$1(this.width,this.height),r),this.pointCoordinate(new t.default$1(0,this.height),r)],e.reparseOverscaled?n:r,this._renderWorldCopies).sort(function(t,e){return a.dist(t.canonical)-a.dist(e.canonical)})},Fr.prototype.resize=function(t,e){this.width=t,this.height=e,this.pixelsToGLUnits=[2/t,-2/e],this._constrain(),this._calcMatrices()},Nr.unmodified.get=function(){return this._unmodified},Fr.prototype.zoomScale=function(t){return Math.pow(2,t)},Fr.prototype.scaleZoom=function(t){return Math.log(t)/Math.LN2},Fr.prototype.project=function(e){return new t.default$1(this.lngX(e.lng),this.latY(e.lat))},Fr.prototype.unproject=function(t){return new G(this.xLng(t.x),this.yLat(t.y))},Nr.x.get=function(){return this.lngX(this.center.lng)},Nr.y.get=function(){return this.latY(this.center.lat)},Nr.point.get=function(){return new t.default$1(this.x,this.y)},Fr.prototype.lngX=function(t){return(180+t)*this.worldSize/360},Fr.prototype.latY=function(t){return(180-180/Math.PI*Math.log(Math.tan(Math.PI/4+t*Math.PI/360)))*this.worldSize/360},Fr.prototype.xLng=function(t){return 360*t/this.worldSize-180},Fr.prototype.yLat=function(t){var e=180-360*t/this.worldSize;return 360/Math.PI*Math.atan(Math.exp(e*Math.PI/180))-90},Fr.prototype.setLocationAtPoint=function(t,e){var r=this.pointCoordinate(e)._sub(this.pointCoordinate(this.centerPoint));this.center=this.coordinateLocation(this.locationCoordinate(t)._sub(r)),this._renderWorldCopies&&(this.center=this.center.wrap())},Fr.prototype.locationPoint=function(t){return this.coordinatePoint(this.locationCoordinate(t))},Fr.prototype.pointLocation=function(t){return this.coordinateLocation(this.pointCoordinate(t))},Fr.prototype.locationCoordinate=function(e){return new t.default$17(this.lngX(e.lng)/this.tileSize,this.latY(e.lat)/this.tileSize,this.zoom).zoomTo(this.tileZoom)},Fr.prototype.coordinateLocation=function(t){var e=t.zoomTo(this.zoom);return new G(this.xLng(e.column*this.tileSize),this.yLat(e.row*this.tileSize))},Fr.prototype.pointCoordinate=function(e,r){void 0===r&&(r=this.tileZoom);var n=[e.x,e.y,0,1],i=[e.x,e.y,1,1];Dr.transformMat4(n,n,this.pixelMatrixInverse),Dr.transformMat4(i,i,this.pixelMatrixInverse);var a=n[3],o=i[3],s=n[0]/a,l=i[0]/o,c=n[1]/a,u=i[1]/o,h=n[2]/a,f=i[2]/o,p=h===f?0:(0-h)/(f-h);return new t.default$17(t.number(s,l,p)/this.tileSize,t.number(c,u,p)/this.tileSize,this.zoom)._zoomTo(r)},Fr.prototype.coordinatePoint=function(e){var r=e.zoomTo(this.zoom),n=[r.column*this.tileSize,r.row*this.tileSize,0,1];return Dr.transformMat4(n,n,this.pixelMatrix),new t.default$1(n[0]/n[3],n[1]/n[3])},Fr.prototype.calculatePosMatrix=function(e,r){void 0===r&&(r=!1);var n=e.key,i=r?this._alignedPosMatrixCache:this._posMatrixCache;if(i[n])return i[n];var a=e.canonical,o=this.worldSize/this.zoomScale(a.z),s=a.x+Math.pow(2,a.z)*e.wrap,l=Rr.identity(new Float64Array(16));return Rr.translate(l,l,[s*o,a.y*o,0]),Rr.scale(l,l,[o/t.default$8,o/t.default$8,1]),Rr.multiply(l,r?this.alignedProjMatrix:this.projMatrix,l),i[n]=new Float32Array(l),i[n]},Fr.prototype._constrain=function(){if(this.center&&this.width&&this.height&&!this._constraining){this._constraining=!0;var e,r,n,i,a=-90,o=90,s=-180,l=180,c=this.size,u=this._unmodified;if(this.latRange){var h=this.latRange;a=this.latY(h[1]),e=(o=this.latY(h[0]))-a<c.y?c.y/(o-a):0}if(this.lngRange){var f=this.lngRange;s=this.lngX(f[0]),r=(l=this.lngX(f[1]))-s<c.x?c.x/(l-s):0}var p=Math.max(r||0,e||0);if(p)return this.center=this.unproject(new t.default$1(r?(l+s)/2:this.x,e?(o+a)/2:this.y)),this.zoom+=this.scaleZoom(p),this._unmodified=u,void(this._constraining=!1);if(this.latRange){var d=this.y,g=c.y/2;d-g<a&&(i=a+g),d+g>o&&(i=o-g)}if(this.lngRange){var m=this.x,v=c.x/2;m-v<s&&(n=s+v),m+v>l&&(n=l-v)}void 0===n&&void 0===i||(this.center=this.unproject(new t.default$1(void 0!==n?n:this.x,void 0!==i?i:this.y))),this._unmodified=u,this._constraining=!1}},Fr.prototype._calcMatrices=function(){if(this.height){this.cameraToCenterDistance=.5/Math.tan(this._fov/2)*this.height;var t=this._fov/2,e=Math.PI/2+this._pitch,r=Math.sin(t)*this.cameraToCenterDistance/Math.sin(Math.PI-e-t),n=this.x,i=this.y,a=1.01*(Math.cos(Math.PI/2-this._pitch)*r+this.cameraToCenterDistance),o=new Float64Array(16);Rr.perspective(o,this._fov,this.width/this.height,1,a),Rr.scale(o,o,[1,-1,1]),Rr.translate(o,o,[0,0,-this.cameraToCenterDistance]),Rr.rotateX(o,o,this._pitch),Rr.rotateZ(o,o,this.angle),Rr.translate(o,o,[-n,-i,0]);var s=this.worldSize/(2*Math.PI*6378137*Math.abs(Math.cos(this.center.lat*(Math.PI/180))));Rr.scale(o,o,[1,1,s,1]),this.projMatrix=o;var l=this.width%2/2,c=this.height%2/2,u=Math.cos(this.angle),h=Math.sin(this.angle),f=n-Math.round(n)+u*l+h*c,p=i-Math.round(i)+u*c+h*l,d=new Float64Array(o);if(Rr.translate(d,d,[f>.5?f-1:f,p>.5?p-1:p,0]),this.alignedProjMatrix=d,o=Rr.create(),Rr.scale(o,o,[this.width/2,-this.height/2,1]),Rr.translate(o,o,[1,-1,0]),this.pixelMatrix=Rr.multiply(new Float64Array(16),o,this.projMatrix),!(o=Rr.invert(new Float64Array(16),this.pixelMatrix)))throw new Error("failed to invert matrix");this.pixelMatrixInverse=o,this._posMatrixCache={},this._alignedPosMatrixCache={}}},Fr.prototype.maxPitchScaleFactor=function(){if(!this.pixelMatrixInverse)return 1;var e=this.pointCoordinate(new t.default$1(0,0)).zoomTo(this.zoom),r=[e.column*this.tileSize,e.row*this.tileSize,0,1];return Dr.transformMat4(r,r,this.pixelMatrix)[3]/this.cameraToCenterDistance},Object.defineProperties(Fr.prototype,Nr);var jr=function(){var e,r,n,i;t.bindAll(["_onHashChange","_updateHash"],this),this._updateHash=(e=this._updateHashUnthrottled.bind(this),300,r=!1,n=0,i=function(){n=0,r&&(e(),n=setTimeout(i,300),r=!1)},function(){return r=!0,n||i(),n})};jr.prototype.addTo=function(e){return this._map=e,t.default.addEventListener("hashchange",this._onHashChange,!1),this._map.on("moveend",this._updateHash),this},jr.prototype.remove=function(){return t.default.removeEventListener("hashchange",this._onHashChange,!1),this._map.off("moveend",this._updateHash),clearTimeout(this._updateHash()),delete this._map,this},jr.prototype.getHashString=function(t){var e=this._map.getCenter(),r=Math.round(100*this._map.getZoom())/100,n=Math.ceil((r*Math.LN2+Math.log(512/360/.5))/Math.LN10),i=Math.pow(10,n),a=Math.round(e.lng*i)/i,o=Math.round(e.lat*i)/i,s=this._map.getBearing(),l=this._map.getPitch(),c="";return c+=t?"#/"+a+"/"+o+"/"+r:"#"+r+"/"+o+"/"+a,(s||l)&&(c+="/"+Math.round(10*s)/10),l&&(c+="/"+Math.round(l)),c},jr.prototype._onHashChange=function(){var e=t.default.location.hash.replace("#","").split("/");return e.length>=3&&(this._map.jumpTo({center:[+e[2],+e[1]],zoom:+e[0],bearing:+(e[3]||0),pitch:+(e[4]||0)}),!0)},jr.prototype._updateHashUnthrottled=function(){var e=this.getHashString();t.default.history.replaceState(t.default.history.state,"",e)};var Vr=function(e){function r(r,n,i,a){void 0===a&&(a={});var o=s.mousePos(n.getCanvasContainer(),i),l=n.unproject(o);e.call(this,r,t.extend({point:o,lngLat:l,originalEvent:i},a)),this._defaultPrevented=!1,this.target=n}e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r;var n={defaultPrevented:{configurable:!0}};return r.prototype.preventDefault=function(){this._defaultPrevented=!0},n.defaultPrevented.get=function(){return this._defaultPrevented},Object.defineProperties(r.prototype,n),r}(t.Event),Ur=function(e){function r(r,n,i){var a=s.touchPos(n.getCanvasContainer(),i),o=a.map(function(t){return n.unproject(t)}),l=a.reduce(function(t,e,r,n){return t.add(e.div(n.length))},new t.default$1(0,0)),c=n.unproject(l);e.call(this,r,{points:a,point:l,lngLats:o,lngLat:c,originalEvent:i}),this._defaultPrevented=!1}e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r;var n={defaultPrevented:{configurable:!0}};return r.prototype.preventDefault=function(){this._defaultPrevented=!0},n.defaultPrevented.get=function(){return this._defaultPrevented},Object.defineProperties(r.prototype,n),r}(t.Event),qr=function(t){function e(e,r,n){t.call(this,e,{originalEvent:n}),this._defaultPrevented=!1}t&&(e.__proto__=t),e.prototype=Object.create(t&&t.prototype),e.prototype.constructor=e;var r={defaultPrevented:{configurable:!0}};return e.prototype.preventDefault=function(){this._defaultPrevented=!0},r.defaultPrevented.get=function(){return this._defaultPrevented},Object.defineProperties(e.prototype,r),e}(t.Event),Hr=function(e){this._map=e,this._el=e.getCanvasContainer(),this._delta=0,t.bindAll(["_onWheel","_onTimeout","_onScrollFrame","_onScrollFinished"],this)};Hr.prototype.isEnabled=function(){return!!this._enabled},Hr.prototype.isActive=function(){return!!this._active},Hr.prototype.enable=function(t){this.isEnabled()||(this._enabled=!0,this._aroundCenter=t&&"center"===t.around)},Hr.prototype.disable=function(){this.isEnabled()&&(this._enabled=!1)},Hr.prototype.onWheel=function(e){if(this.isEnabled()){var r=e.deltaMode===t.default.WheelEvent.DOM_DELTA_LINE?40*e.deltaY:e.deltaY,n=a.now(),i=n-(this._lastWheelEventTime||0);this._lastWheelEventTime=n,0!==r&&r%4.000244140625==0?this._type="wheel":0!==r&&Math.abs(r)<4?this._type="trackpad":i>400?(this._type=null,this._lastValue=r,this._timeout=setTimeout(this._onTimeout,40,e)):this._type||(this._type=Math.abs(i*r)<200?"trackpad":"wheel",this._timeout&&(clearTimeout(this._timeout),this._timeout=null,r+=this._lastValue)),e.shiftKey&&r&&(r/=4),this._type&&(this._lastWheelEvent=e,this._delta-=r,this.isActive()||this._start(e)),e.preventDefault()}},Hr.prototype._onTimeout=function(t){this._type="wheel",this._delta-=this._lastValue,this.isActive()||this._start(t)},Hr.prototype._start=function(e){if(this._delta){this._frameId&&(this._map._cancelRenderFrame(this._frameId),this._frameId=null),this._active=!0,this._map.fire(new t.Event("movestart",{originalEvent:e})),this._map.fire(new t.Event("zoomstart",{originalEvent:e})),this._finishTimeout&&clearTimeout(this._finishTimeout);var r=s.mousePos(this._el,e);this._around=G.convert(this._aroundCenter?this._map.getCenter():this._map.unproject(r)),this._aroundPoint=this._map.transform.locationPoint(this._around),this._frameId||(this._frameId=this._map._requestRenderFrame(this._onScrollFrame))}},Hr.prototype._onScrollFrame=function(){var e=this;if(this._frameId=null,this.isActive()){var r=this._map.transform;if(0!==this._delta){var n="wheel"===this._type&&Math.abs(this._delta)>4.000244140625?1/450:.01,i=2/(1+Math.exp(-Math.abs(this._delta*n)));this._delta<0&&0!==i&&(i=1/i);var o="number"==typeof this._targetZoom?r.zoomScale(this._targetZoom):r.scale;this._targetZoom=Math.min(r.maxZoom,Math.max(r.minZoom,r.scaleZoom(o*i))),"wheel"===this._type&&(this._startZoom=r.zoom,this._easing=this._smoothOutEasing(200)),this._delta=0}var s=!1;if("wheel"===this._type){var l=Math.min((a.now()-this._lastWheelEventTime)/200,1),c=this._easing(l);r.zoom=t.number(this._startZoom,this._targetZoom,c),l<1?this._frameId||(this._frameId=this._map._requestRenderFrame(this._onScrollFrame)):s=!0}else r.zoom=this._targetZoom,s=!0;r.setLocationAtPoint(this._around,this._aroundPoint),this._map.fire(new t.Event("move",{originalEvent:this._lastWheelEvent})),this._map.fire(new t.Event("zoom",{originalEvent:this._lastWheelEvent})),s&&(this._active=!1,this._finishTimeout=setTimeout(function(){e._map.fire(new t.Event("zoomend",{originalEvent:e._lastWheelEvent})),e._map.fire(new t.Event("moveend",{originalEvent:e._lastWheelEvent})),delete e._targetZoom},200))}},Hr.prototype._smoothOutEasing=function(e){var r=t.ease;if(this._prevEase){var n=this._prevEase,i=(a.now()-n.start)/n.duration,o=n.easing(i+.01)-n.easing(i),s=.27/Math.sqrt(o*o+1e-4)*.01,l=Math.sqrt(.0729-s*s);r=t.bezier(s,l,.25,1)}return this._prevEase={start:a.now(),duration:e,easing:r},r};var Gr=function(e){this._map=e,this._el=e.getCanvasContainer(),this._container=e.getContainer(),t.bindAll(["_onMouseMove","_onMouseUp","_onKeyDown"],this)};Gr.prototype.isEnabled=function(){return!!this._enabled},Gr.prototype.isActive=function(){return!!this._active},Gr.prototype.enable=function(){this.isEnabled()||(this._enabled=!0)},Gr.prototype.disable=function(){this.isEnabled()&&(this._enabled=!1)},Gr.prototype.onMouseDown=function(e){this.isEnabled()&&e.shiftKey&&0===e.button&&(t.default.document.addEventListener("mousemove",this._onMouseMove,!1),t.default.document.addEventListener("keydown",this._onKeyDown,!1),t.default.document.addEventListener("mouseup",this._onMouseUp,!1),s.disableDrag(),this._startPos=s.mousePos(this._el,e),this._active=!0)},Gr.prototype._onMouseMove=function(t){var e=this._startPos,r=s.mousePos(this._el,t);this._box||(this._box=s.create("div","mapboxgl-boxzoom",this._container),this._container.classList.add("mapboxgl-crosshair"),this._fireEvent("boxzoomstart",t));var n=Math.min(e.x,r.x),i=Math.max(e.x,r.x),a=Math.min(e.y,r.y),o=Math.max(e.y,r.y);s.setTransform(this._box,"translate("+n+"px,"+a+"px)"),this._box.style.width=i-n+"px",this._box.style.height=o-a+"px"},Gr.prototype._onMouseUp=function(e){if(0===e.button){var r=this._startPos,n=s.mousePos(this._el,e),i=(new W).extend(this._map.unproject(r)).extend(this._map.unproject(n));this._finish(),s.suppressClick(),r.x===n.x&&r.y===n.y?this._fireEvent("boxzoomcancel",e):this._map.fitBounds(i,{linear:!0}).fire(new t.Event("boxzoomend",{originalEvent:e,boxZoomBounds:i}))}},Gr.prototype._onKeyDown=function(t){27===t.keyCode&&(this._finish(),this._fireEvent("boxzoomcancel",t))},Gr.prototype._finish=function(){this._active=!1,t.default.document.removeEventListener("mousemove",this._onMouseMove,!1),t.default.document.removeEventListener("keydown",this._onKeyDown,!1),t.default.document.removeEventListener("mouseup",this._onMouseUp,!1),this._container.classList.remove("mapboxgl-crosshair"),this._box&&(s.remove(this._box),this._box=null),s.enableDrag()},Gr.prototype._fireEvent=function(e,r){return this._map.fire(new t.Event(e,{originalEvent:r}))};var Wr=t.bezier(0,0,.25,1),Yr=function(e,r){this._map=e,this._el=r.element||e.getCanvasContainer(),this._state="disabled",this._button=r.button||"right",this._bearingSnap=r.bearingSnap||0,this._pitchWithRotate=!1!==r.pitchWithRotate,t.bindAll(["_onMouseMove","_onMouseUp","_onBlur","_onDragFrame"],this)};Yr.prototype.isEnabled=function(){return"disabled"!==this._state},Yr.prototype.isActive=function(){return"active"===this._state},Yr.prototype.enable=function(){this.isEnabled()||(this._state="enabled")},Yr.prototype.disable=function(){if(this.isEnabled())switch(this._state){case"active":this._state="disabled",this._unbind(),this._deactivate(),this._fireEvent("rotateend"),this._pitchWithRotate&&this._fireEvent("pitchend"),this._fireEvent("moveend");break;case"pending":this._state="disabled",this._unbind();break;default:this._state="disabled"}},Yr.prototype.onMouseDown=function(e){if("enabled"===this._state){if("right"===this._button){if(this._eventButton=s.mouseButton(e),this._eventButton!==(e.ctrlKey?0:2))return}else{if(e.ctrlKey||0!==s.mouseButton(e))return;this._eventButton=0}s.disableDrag(),t.default.document.addEventListener("mousemove",this._onMouseMove,{capture:!0}),t.default.document.addEventListener("mouseup",this._onMouseUp),t.default.addEventListener("blur",this._onBlur),this._state="pending",this._inertia=[[a.now(),this._map.getBearing()]],this._previousPos=s.mousePos(this._el,e),this._center=this._map.transform.centerPoint,e.preventDefault()}},Yr.prototype._onMouseMove=function(t){this._lastMoveEvent=t,this._pos=s.mousePos(this._el,t),"pending"===this._state&&(this._state="active",this._fireEvent("rotatestart",t),this._fireEvent("movestart",t),this._pitchWithRotate&&this._fireEvent("pitchstart",t)),this._frameId||(this._frameId=this._map._requestRenderFrame(this._onDragFrame))},Yr.prototype._onDragFrame=function(){this._frameId=null;var t=this._lastMoveEvent;if(t){var e=this._map.transform,r=this._previousPos,n=this._pos,i=.8*(r.x-n.x),o=-.5*(r.y-n.y),s=e.bearing-i,l=e.pitch-o,c=this._inertia,u=c[c.length-1];this._drainInertiaBuffer(),c.push([a.now(),this._map._normalizeBearing(s,u[1])]),e.bearing=s,this._pitchWithRotate&&(this._fireEvent("pitch",t),e.pitch=l),this._fireEvent("rotate",t),this._fireEvent("move",t),delete this._lastMoveEvent,this._previousPos=this._pos}},Yr.prototype._onMouseUp=function(t){if(s.mouseButton(t)===this._eventButton)switch(this._state){case"active":this._state="enabled",s.suppressClick(),this._unbind(),this._deactivate(),this._inertialRotate(t);break;case"pending":this._state="enabled",this._unbind()}},Yr.prototype._onBlur=function(t){switch(this._state){case"active":this._state="enabled",this._unbind(),this._deactivate(),this._fireEvent("rotateend",t),this._pitchWithRotate&&this._fireEvent("pitchend",t),this._fireEvent("moveend",t);break;case"pending":this._state="enabled",this._unbind()}},Yr.prototype._unbind=function(){t.default.document.removeEventListener("mousemove",this._onMouseMove,{capture:!0}),t.default.document.removeEventListener("mouseup",this._onMouseUp),t.default.removeEventListener("blur",this._onBlur),s.enableDrag()},Yr.prototype._deactivate=function(){this._frameId&&(this._map._cancelRenderFrame(this._frameId),this._frameId=null),delete this._lastMoveEvent,delete this._previousPos},Yr.prototype._inertialRotate=function(t){var e=this;this._fireEvent("rotateend",t),this._drainInertiaBuffer();var r=this._map,n=r.getBearing(),i=this._inertia,a=function(){Math.abs(n)<e._bearingSnap?r.resetNorth({noMoveStart:!0},{originalEvent:t}):e._fireEvent("moveend",t),e._pitchWithRotate&&e._fireEvent("pitchend",t)};if(i.length<2)a();else{var o=i[0],s=i[i.length-1],l=i[i.length-2],c=r._normalizeBearing(n,l[1]),u=s[1]-o[1],h=u<0?-1:1,f=(s[0]-o[0])/1e3;if(0!==u&&0!==f){var p=Math.abs(u*(.25/f));p>180&&(p=180);var d=p/180;c+=h*p*(d/2),Math.abs(r._normalizeBearing(c,0))<this._bearingSnap&&(c=r._normalizeBearing(0,c)),r.rotateTo(c,{duration:1e3*d,easing:Wr,noMoveStart:!0},{originalEvent:t})}else a()}},Yr.prototype._fireEvent=function(e,r){return this._map.fire(new t.Event(e,r?{originalEvent:r}:{}))},Yr.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=a.now();t.length>0&&e-t[0][0]>160;)t.shift()};var Xr=t.bezier(0,0,.3,1),Zr=function(e){this._map=e,this._el=e.getCanvasContainer(),this._state="disabled",t.bindAll(["_onMove","_onMouseUp","_onTouchEnd","_onBlur","_onDragFrame"],this)};Zr.prototype.isEnabled=function(){return"disabled"!==this._state},Zr.prototype.isActive=function(){return"active"===this._state},Zr.prototype.enable=function(){this.isEnabled()||(this._el.classList.add("mapboxgl-touch-drag-pan"),this._state="enabled")},Zr.prototype.disable=function(){if(this.isEnabled())switch(this._el.classList.remove("mapboxgl-touch-drag-pan"),this._state){case"active":this._state="disabled",this._unbind(),this._deactivate(),this._fireEvent("dragend"),this._fireEvent("moveend");break;case"pending":this._state="disabled",this._unbind();break;default:this._state="disabled"}},Zr.prototype.onMouseDown=function(e){"enabled"===this._state&&(e.ctrlKey||0!==s.mouseButton(e)||(s.addEventListener(t.default.document,"mousemove",this._onMove,{capture:!0}),s.addEventListener(t.default.document,"mouseup",this._onMouseUp),this._start(e)))},Zr.prototype.onTouchStart=function(e){"enabled"===this._state&&(e.touches.length>1||(s.addEventListener(t.default.document,"touchmove",this._onMove,{capture:!0,passive:!1}),s.addEventListener(t.default.document,"touchend",this._onTouchEnd),this._start(e)))},Zr.prototype._start=function(e){t.default.addEventListener("blur",this._onBlur),this._state="pending",this._previousPos=s.mousePos(this._el,e),this._inertia=[[a.now(),this._previousPos]]},Zr.prototype._onMove=function(t){this._lastMoveEvent=t,t.preventDefault(),this._pos=s.mousePos(this._el,t),this._drainInertiaBuffer(),this._inertia.push([a.now(),this._pos]),"pending"===this._state&&(this._state="active",this._fireEvent("dragstart",t),this._fireEvent("movestart",t)),this._frameId||(this._frameId=this._map._requestRenderFrame(this._onDragFrame))},Zr.prototype._onDragFrame=function(){this._frameId=null;var t=this._lastMoveEvent;if(t){var e=this._map.transform;e.setLocationAtPoint(e.pointLocation(this._previousPos),this._pos),this._fireEvent("drag",t),this._fireEvent("move",t),this._previousPos=this._pos,delete this._lastMoveEvent}},Zr.prototype._onMouseUp=function(t){if(0===s.mouseButton(t))switch(this._state){case"active":this._state="enabled",s.suppressClick(),this._unbind(),this._deactivate(),this._inertialPan(t);break;case"pending":this._state="enabled",this._unbind()}},Zr.prototype._onTouchEnd=function(t){switch(this._state){case"active":this._state="enabled",this._unbind(),this._deactivate(),this._inertialPan(t);break;case"pending":this._state="enabled",this._unbind()}},Zr.prototype._onBlur=function(t){switch(this._state){case"active":this._state="enabled",this._unbind(),this._deactivate(),this._fireEvent("dragend",t),this._fireEvent("moveend",t);break;case"pending":this._state="enabled",this._unbind()}},Zr.prototype._unbind=function(){s.removeEventListener(t.default.document,"touchmove",this._onMove,{capture:!0,passive:!1}),s.removeEventListener(t.default.document,"touchend",this._onTouchEnd),s.removeEventListener(t.default.document,"mousemove",this._onMove,{capture:!0}),s.removeEventListener(t.default.document,"mouseup",this._onMouseUp),s.removeEventListener(t.default,"blur",this._onBlur)},Zr.prototype._deactivate=function(){this._frameId&&(this._map._cancelRenderFrame(this._frameId),this._frameId=null),delete this._lastMoveEvent,delete this._previousPos,delete this._pos},Zr.prototype._inertialPan=function(t){this._fireEvent("dragend",t),this._drainInertiaBuffer();var e=this._inertia;if(e.length<2)this._fireEvent("moveend",t);else{var r=e[e.length-1],n=e[0],i=r[1].sub(n[1]),a=(r[0]-n[0])/1e3;if(0===a||r[1].equals(n[1]))this._fireEvent("moveend",t);else{var o=i.mult(.3/a),s=o.mag();s>1400&&(s=1400,o._unit()._mult(s));var l=s/750,c=o.mult(-l/2);this._map.panBy(c,{duration:1e3*l,easing:Xr,noMoveStart:!0},{originalEvent:t})}}},Zr.prototype._fireEvent=function(e,r){return this._map.fire(new t.Event(e,r?{originalEvent:r}:{}))},Zr.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=a.now();t.length>0&&e-t[0][0]>160;)t.shift()};var $r=function(e){this._map=e,this._el=e.getCanvasContainer(),t.bindAll(["_onKeyDown"],this)};function Jr(t){return t*(2-t)}$r.prototype.isEnabled=function(){return!!this._enabled},$r.prototype.enable=function(){this.isEnabled()||(this._el.addEventListener("keydown",this._onKeyDown,!1),this._enabled=!0)},$r.prototype.disable=function(){this.isEnabled()&&(this._el.removeEventListener("keydown",this._onKeyDown),this._enabled=!1)},$r.prototype._onKeyDown=function(t){if(!(t.altKey||t.ctrlKey||t.metaKey)){var e=0,r=0,n=0,i=0,a=0;switch(t.keyCode){case 61:case 107:case 171:case 187:e=1;break;case 189:case 109:case 173:e=-1;break;case 37:t.shiftKey?r=-1:(t.preventDefault(),i=-1);break;case 39:t.shiftKey?r=1:(t.preventDefault(),i=1);break;case 38:t.shiftKey?n=1:(t.preventDefault(),a=-1);break;case 40:t.shiftKey?n=-1:(a=1,t.preventDefault());break;default:return}var o=this._map,s=o.getZoom(),l={duration:300,delayEndEvents:500,easing:Jr,zoom:e?Math.round(s)+e*(t.shiftKey?2:1):s,bearing:o.getBearing()+15*r,pitch:o.getPitch()+10*n,offset:[100*-i,100*-a],center:o.getCenter()};o.easeTo(l,{originalEvent:t})}};var Kr=function(e){this._map=e,t.bindAll(["_onDblClick","_onZoomEnd"],this)};Kr.prototype.isEnabled=function(){return!!this._enabled},Kr.prototype.isActive=function(){return!!this._active},Kr.prototype.enable=function(){this.isEnabled()||(this._enabled=!0)},Kr.prototype.disable=function(){this.isEnabled()&&(this._enabled=!1)},Kr.prototype.onTouchStart=function(t){var e=this;this.isEnabled()&&(t.points.length>1||(this._tapped?(clearTimeout(this._tapped),this._tapped=null,this._zoom(t)):this._tapped=setTimeout(function(){e._tapped=null},300)))},Kr.prototype.onDblClick=function(t){this.isEnabled()&&(t.originalEvent.preventDefault(),this._zoom(t))},Kr.prototype._zoom=function(t){this._active=!0,this._map.on("zoomend",this._onZoomEnd),this._map.zoomTo(this._map.getZoom()+(t.originalEvent.shiftKey?-1:1),{around:t.lngLat},t)},Kr.prototype._onZoomEnd=function(){this._active=!1,this._map.off("zoomend",this._onZoomEnd)};var Qr=t.bezier(0,0,.15,1),tn=function(e){this._map=e,this._el=e.getCanvasContainer(),t.bindAll(["_onMove","_onEnd","_onTouchFrame"],this)};tn.prototype.isEnabled=function(){return!!this._enabled},tn.prototype.enable=function(t){this.isEnabled()||(this._el.classList.add("mapboxgl-touch-zoom-rotate"),this._enabled=!0,this._aroundCenter=!!t&&"center"===t.around)},tn.prototype.disable=function(){this.isEnabled()&&(this._el.classList.remove("mapboxgl-touch-zoom-rotate"),this._enabled=!1)},tn.prototype.disableRotation=function(){this._rotationDisabled=!0},tn.prototype.enableRotation=function(){this._rotationDisabled=!1},tn.prototype.onStart=function(e){if(this.isEnabled()&&2===e.touches.length){var r=s.mousePos(this._el,e.touches[0]),n=s.mousePos(this._el,e.touches[1]);this._startVec=r.sub(n),this._gestureIntent=void 0,this._inertia=[],s.addEventListener(t.default.document,"touchmove",this._onMove,{passive:!1}),s.addEventListener(t.default.document,"touchend",this._onEnd)}},tn.prototype._getTouchEventData=function(t){var e=s.mousePos(this._el,t.touches[0]),r=s.mousePos(this._el,t.touches[1]),n=e.sub(r);return{vec:n,center:e.add(r).div(2),scale:n.mag()/this._startVec.mag(),bearing:this._rotationDisabled?0:180*n.angleWith(this._startVec)/Math.PI}},tn.prototype._onMove=function(e){if(2===e.touches.length){var r=this._getTouchEventData(e),n=r.vec,i=r.scale,a=r.bearing;if(!this._gestureIntent){var o=Math.abs(1-i)>.15;Math.abs(a)>10?this._gestureIntent="rotate":o&&(this._gestureIntent="zoom"),this._gestureIntent&&(this._map.fire(new t.Event(this._gestureIntent+"start",{originalEvent:e})),this._map.fire(new t.Event("movestart",{originalEvent:e})),this._startVec=n)}this._lastTouchEvent=e,this._frameId||(this._frameId=this._map._requestRenderFrame(this._onTouchFrame)),e.preventDefault()}},tn.prototype._onTouchFrame=function(){this._frameId=null;var e=this._gestureIntent;if(e){var r=this._map.transform;this._startScale||(this._startScale=r.scale,this._startBearing=r.bearing);var n=this._getTouchEventData(this._lastTouchEvent),i=n.center,o=n.bearing,s=n.scale,l=r.pointLocation(i),c=r.locationPoint(l);"rotate"===e&&(r.bearing=this._startBearing+o),r.zoom=r.scaleZoom(this._startScale*s),r.setLocationAtPoint(l,c),this._map.fire(new t.Event(e,{originalEvent:this._lastTouchEvent})),this._map.fire(new t.Event("move",{originalEvent:this._lastTouchEvent})),this._drainInertiaBuffer(),this._inertia.push([a.now(),s,i])}},tn.prototype._onEnd=function(e){s.removeEventListener(t.default.document,"touchmove",this._onMove,{passive:!1}),s.removeEventListener(t.default.document,"touchend",this._onEnd);var r=this._gestureIntent,n=this._startScale;if(this._frameId&&(this._map._cancelRenderFrame(this._frameId),this._frameId=null),delete this._gestureIntent,delete this._startScale,delete this._startBearing,delete this._lastTouchEvent,r){this._map.fire(new t.Event(r+"end",{originalEvent:e})),this._drainInertiaBuffer();var i=this._inertia,a=this._map;if(i.length<2)a.snapToNorth({},{originalEvent:e});else{var o=i[i.length-1],l=i[0],c=a.transform.scaleZoom(n*o[1]),u=a.transform.scaleZoom(n*l[1]),h=c-u,f=(o[0]-l[0])/1e3,p=o[2];if(0!==f&&c!==u){var d=.15*h/f;Math.abs(d)>2.5&&(d=d>0?2.5:-2.5);var g=1e3*Math.abs(d/(12*.15)),m=c+d*g/2e3;m<0&&(m=0),a.easeTo({zoom:m,duration:g,easing:Qr,around:this._aroundCenter?a.getCenter():a.unproject(p),noMoveStart:!0},{originalEvent:e})}else a.snapToNorth({},{originalEvent:e})}}},tn.prototype._drainInertiaBuffer=function(){for(var t=this._inertia,e=a.now();t.length>2&&e-t[0][0]>160;)t.shift()};var en={scrollZoom:Hr,boxZoom:Gr,dragRotate:Yr,dragPan:Zr,keyboard:$r,doubleClickZoom:Kr,touchZoomRotate:tn},rn=function(e){function r(r,n){e.call(this),this._moving=!1,this._zooming=!1,this.transform=r,this._bearingSnap=n.bearingSnap,t.bindAll(["_renderFrameCallback"],this)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.getCenter=function(){return this.transform.center},r.prototype.setCenter=function(t,e){return this.jumpTo({center:t},e)},r.prototype.panBy=function(e,r,n){return e=t.default$1.convert(e).mult(-1),this.panTo(this.transform.center,t.extend({offset:e},r),n)},r.prototype.panTo=function(e,r,n){return this.easeTo(t.extend({center:e},r),n)},r.prototype.getZoom=function(){return this.transform.zoom},r.prototype.setZoom=function(t,e){return this.jumpTo({zoom:t},e),this},r.prototype.zoomTo=function(e,r,n){return this.easeTo(t.extend({zoom:e},r),n)},r.prototype.zoomIn=function(t,e){return this.zoomTo(this.getZoom()+1,t,e),this},r.prototype.zoomOut=function(t,e){return this.zoomTo(this.getZoom()-1,t,e),this},r.prototype.getBearing=function(){return this.transform.bearing},r.prototype.setBearing=function(t,e){return this.jumpTo({bearing:t},e),this},r.prototype.rotateTo=function(e,r,n){return this.easeTo(t.extend({bearing:e},r),n)},r.prototype.resetNorth=function(e,r){return this.rotateTo(0,t.extend({duration:1e3},e),r),this},r.prototype.snapToNorth=function(t,e){return Math.abs(this.getBearing())<this._bearingSnap?this.resetNorth(t,e):this},r.prototype.getPitch=function(){return this.transform.pitch},r.prototype.setPitch=function(t,e){return this.jumpTo({pitch:t},e),this},r.prototype.fitBounds=function(e,r,n){if("number"==typeof(r=t.extend({padding:{top:0,bottom:0,right:0,left:0},offset:[0,0],maxZoom:this.transform.maxZoom},r)).padding){var i=r.padding;r.padding={top:i,bottom:i,right:i,left:i}}if(!t.default$10(Object.keys(r.padding).sort(function(t,e){return t<e?-1:t>e?1:0}),["bottom","left","right","top"]))return t.warnOnce("options.padding must be a positive number, or an Object with keys 'bottom', 'left', 'right', 'top'"),this;e=W.convert(e);var a=[(r.padding.left-r.padding.right)/2,(r.padding.top-r.padding.bottom)/2],o=Math.min(r.padding.right,r.padding.left),s=Math.min(r.padding.top,r.padding.bottom);r.offset=[r.offset[0]+a[0],r.offset[1]+a[1]];var l=t.default$1.convert(r.offset),c=this.transform,u=c.project(e.getNorthWest()),h=c.project(e.getSouthEast()),f=h.sub(u),p=(c.width-2*o-2*Math.abs(l.x))/f.x,d=(c.height-2*s-2*Math.abs(l.y))/f.y;return d<0||p<0?(t.warnOnce("Map cannot fit within canvas with the given bounds, padding, and/or offset."),this):(r.center=c.unproject(u.add(h).div(2)),r.zoom=Math.min(c.scaleZoom(c.scale*Math.min(p,d)),r.maxZoom),r.bearing=0,r.linear?this.easeTo(r,n):this.flyTo(r,n))},r.prototype.jumpTo=function(e,r){this.stop();var n=this.transform,i=!1,a=!1,o=!1;return"zoom"in e&&n.zoom!==+e.zoom&&(i=!0,n.zoom=+e.zoom),void 0!==e.center&&(n.center=G.convert(e.center)),"bearing"in e&&n.bearing!==+e.bearing&&(a=!0,n.bearing=+e.bearing),"pitch"in e&&n.pitch!==+e.pitch&&(o=!0,n.pitch=+e.pitch),this.fire(new t.Event("movestart",r)).fire(new t.Event("move",r)),i&&this.fire(new t.Event("zoomstart",r)).fire(new t.Event("zoom",r)).fire(new t.Event("zoomend",r)),a&&this.fire(new t.Event("rotatestart",r)).fire(new t.Event("rotate",r)).fire(new t.Event("rotateend",r)),o&&this.fire(new t.Event("pitchstart",r)).fire(new t.Event("pitch",r)).fire(new t.Event("pitchend",r)),this.fire(new t.Event("moveend",r))},r.prototype.easeTo=function(e,r){var n=this;this.stop(),!1===(e=t.extend({offset:[0,0],duration:500,easing:t.ease},e)).animate&&(e.duration=0);var i=this.transform,a=this.getZoom(),o=this.getBearing(),s=this.getPitch(),l="zoom"in e?+e.zoom:a,c="bearing"in e?this._normalizeBearing(e.bearing,o):o,u="pitch"in e?+e.pitch:s,h=i.centerPoint.add(t.default$1.convert(e.offset)),f=i.pointLocation(h),p=G.convert(e.center||f);this._normalizeCenter(p);var d,g,m=i.project(f),v=i.project(p).sub(m),y=i.zoomScale(l-a);return e.around&&(d=G.convert(e.around),g=i.locationPoint(d)),this._zooming=l!==a,this._rotating=o!==c,this._pitching=u!==s,this._prepareEase(r,e.noMoveStart),clearTimeout(this._easeEndTimeoutID),this._ease(function(e){if(n._zooming&&(i.zoom=t.number(a,l,e)),n._rotating&&(i.bearing=t.number(o,c,e)),n._pitching&&(i.pitch=t.number(s,u,e)),d)i.setLocationAtPoint(d,g);else{var f=i.zoomScale(i.zoom-a),p=l>a?Math.min(2,y):Math.max(.5,y),x=Math.pow(p,1-e),b=i.unproject(m.add(v.mult(e*x)).mult(f));i.setLocationAtPoint(i.renderWorldCopies?b.wrap():b,h)}n._fireMoveEvents(r)},function(){e.delayEndEvents?n._easeEndTimeoutID=setTimeout(function(){return n._afterEase(r)},e.delayEndEvents):n._afterEase(r)},e),this},r.prototype._prepareEase=function(e,r){this._moving=!0,r||this.fire(new t.Event("movestart",e)),this._zooming&&this.fire(new t.Event("zoomstart",e)),this._rotating&&this.fire(new t.Event("rotatestart",e)),this._pitching&&this.fire(new t.Event("pitchstart",e))},r.prototype._fireMoveEvents=function(e){this.fire(new t.Event("move",e)),this._zooming&&this.fire(new t.Event("zoom",e)),this._rotating&&this.fire(new t.Event("rotate",e)),this._pitching&&this.fire(new t.Event("pitch",e))},r.prototype._afterEase=function(e){var r=this._zooming,n=this._rotating,i=this._pitching;this._moving=!1,this._zooming=!1,this._rotating=!1,this._pitching=!1,r&&this.fire(new t.Event("zoomend",e)),n&&this.fire(new t.Event("rotateend",e)),i&&this.fire(new t.Event("pitchend",e)),this.fire(new t.Event("moveend",e))},r.prototype.flyTo=function(e,r){var n=this;this.stop(),e=t.extend({offset:[0,0],speed:1.2,curve:1.42,easing:t.ease},e);var i=this.transform,a=this.getZoom(),o=this.getBearing(),s=this.getPitch(),l="zoom"in e?t.clamp(+e.zoom,i.minZoom,i.maxZoom):a,c="bearing"in e?this._normalizeBearing(e.bearing,o):o,u="pitch"in e?+e.pitch:s,h=i.zoomScale(l-a),f=i.centerPoint.add(t.default$1.convert(e.offset)),p=i.pointLocation(f),d=G.convert(e.center||p);this._normalizeCenter(d);var g=i.project(p),m=i.project(d).sub(g),v=e.curve,y=Math.max(i.width,i.height),x=y/h,b=m.mag();if("minZoom"in e){var _=t.clamp(Math.min(e.minZoom,a,l),i.minZoom,i.maxZoom),w=y/i.zoomScale(_-a);v=Math.sqrt(w/b*2)}var k=v*v;function M(t){var e=(x*x-y*y+(t?-1:1)*k*k*b*b)/(2*(t?x:y)*k*b);return Math.log(Math.sqrt(e*e+1)-e)}function A(t){return(Math.exp(t)-Math.exp(-t))/2}function T(t){return(Math.exp(t)+Math.exp(-t))/2}var S=M(0),E=function(t){return T(S)/T(S+v*t)},C=function(t){return y*((T(S)*(A(e=S+v*t)/T(e))-A(S))/k)/b;var e},L=(M(1)-S)/v;if(Math.abs(b)<1e-6||!isFinite(L)){if(Math.abs(y-x)<1e-6)return this.easeTo(e,r);var z=x<y?-1:1;L=Math.abs(Math.log(x/y))/v,C=function(){return 0},E=function(t){return Math.exp(z*v*t)}}if("duration"in e)e.duration=+e.duration;else{var P="screenSpeed"in e?+e.screenSpeed/v:+e.speed;e.duration=1e3*L/P}return e.maxDuration&&e.duration>e.maxDuration&&(e.duration=0),this._zooming=!0,this._rotating=o!==c,this._pitching=u!==s,this._prepareEase(r,!1),this._ease(function(e){var l=e*L,h=1/E(l);i.zoom=a+i.scaleZoom(h),n._rotating&&(i.bearing=t.number(o,c,e)),n._pitching&&(i.pitch=t.number(s,u,e));var p=i.unproject(g.add(m.mult(C(l))).mult(h));i.setLocationAtPoint(i.renderWorldCopies?p.wrap():p,f),n._fireMoveEvents(r)},function(){return n._afterEase(r)},e),this},r.prototype.isEasing=function(){return!!this._easeFrameId},r.prototype.stop=function(){if(this._easeFrameId&&(this._cancelRenderFrame(this._easeFrameId),delete this._easeFrameId,delete this._onEaseFrame),this._onEaseEnd){var t=this._onEaseEnd;delete this._onEaseEnd,t.call(this)}return this},r.prototype._ease=function(t,e,r){!1===r.animate||0===r.duration?(t(1),e()):(this._easeStart=a.now(),this._easeOptions=r,this._onEaseFrame=t,this._onEaseEnd=e,this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback))},r.prototype._renderFrameCallback=function(){var t=Math.min((a.now()-this._easeStart)/this._easeOptions.duration,1);this._onEaseFrame(this._easeOptions.easing(t)),t<1?this._easeFrameId=this._requestRenderFrame(this._renderFrameCallback):this.stop()},r.prototype._normalizeBearing=function(e,r){e=t.wrap(e,-180,180);var n=Math.abs(e-r);return Math.abs(e-360-r)<n&&(e-=360),Math.abs(e+360-r)<n&&(e+=360),e},r.prototype._normalizeCenter=function(t){var e=this.transform;if(e.renderWorldCopies&&!e.lngRange){var r=t.lng-e.center.lng;t.lng+=r>180?-360:r<-180?360:0}},r}(t.Evented),nn=function(e){void 0===e&&(e={}),this.options=e,t.bindAll(["_updateEditLink","_updateData","_updateCompact"],this)};nn.prototype.getDefaultPosition=function(){return"bottom-right"},nn.prototype.onAdd=function(t){var e=this.options&&this.options.compact;return this._map=t,this._container=s.create("div","mapboxgl-ctrl mapboxgl-ctrl-attrib"),e&&this._container.classList.add("mapboxgl-compact"),this._updateAttributions(),this._updateEditLink(),this._map.on("sourcedata",this._updateData),this._map.on("moveend",this._updateEditLink),void 0===e&&(this._map.on("resize",this._updateCompact),this._updateCompact()),this._container},nn.prototype.onRemove=function(){s.remove(this._container),this._map.off("sourcedata",this._updateData),this._map.off("moveend",this._updateEditLink),this._map.off("resize",this._updateCompact),this._map=void 0},nn.prototype._updateEditLink=function(){var t=this._editLink;t||(t=this._editLink=this._container.querySelector(".mapbox-improve-map"));var e=[{key:"owner",value:this.styleOwner},{key:"id",value:this.styleId},{key:"access_token",value:m.ACCESS_TOKEN}];if(t){var r=e.reduce(function(t,r,n){return r.value&&(t+=r.key+"="+r.value+(n<e.length-1?"&":"")),t},"?");t.href="https://www.mapbox.com/feedback/"+r+(this._map._hash?this._map._hash.getHashString(!0):"")}},nn.prototype._updateData=function(t){t&&"metadata"===t.sourceDataType&&(this._updateAttributions(),this._updateEditLink())},nn.prototype._updateAttributions=function(){if(this._map.style){var t=[];if(this._map.style.stylesheet){var e=this._map.style.stylesheet;this.styleOwner=e.owner,this.styleId=e.id}var r=this._map.style.sourceCaches;for(var n in r){var i=r[n].getSource();i.attribution&&t.indexOf(i.attribution)<0&&t.push(i.attribution)}t.sort(function(t,e){return t.length-e.length}),(t=t.filter(function(e,r){for(var n=r+1;n<t.length;n++)if(t[n].indexOf(e)>=0)return!1;return!0})).length?(this._container.innerHTML=t.join(" | "),this._container.classList.remove("mapboxgl-attrib-empty")):this._container.classList.add("mapboxgl-attrib-empty"),this._editLink=null}},nn.prototype._updateCompact=function(){this._map.getCanvasContainer().offsetWidth<=640?this._container.classList.add("mapboxgl-compact"):this._container.classList.remove("mapboxgl-compact")};var an=function(){t.bindAll(["_updateLogo"],this)};an.prototype.onAdd=function(t){this._map=t,this._container=s.create("div","mapboxgl-ctrl");var e=s.create("a","mapboxgl-ctrl-logo");return e.target="_blank",e.href="https://www.mapbox.com/",e.setAttribute("aria-label","Mapbox logo"),this._container.appendChild(e),this._container.style.display="none",this._map.on("sourcedata",this._updateLogo),this._updateLogo(),this._container},an.prototype.onRemove=function(){s.remove(this._container),this._map.off("sourcedata",this._updateLogo)},an.prototype.getDefaultPosition=function(){return"bottom-left"},an.prototype._updateLogo=function(t){t&&"metadata"!==t.sourceDataType||(this._container.style.display=this._logoRequired()?"block":"none")},an.prototype._logoRequired=function(){if(this._map.style){var t=this._map.style.sourceCaches;for(var e in t)if(t[e].getSource().mapbox_logo)return!0;return!1}};var on=function(){this._queue=[],this._id=0,this._cleared=!1,this._currentlyRunning=!1};on.prototype.add=function(t){var e=++this._id;return this._queue.push({callback:t,id:e,cancelled:!1}),e},on.prototype.remove=function(t){for(var e=this._currentlyRunning,r=0,n=e?this._queue.concat(e):this._queue;r<n.length;r+=1){var i=n[r];if(i.id===t)return void(i.cancelled=!0)}},on.prototype.run=function(){var t=this._currentlyRunning=this._queue;this._queue=[];for(var e=0,r=t;e<r.length;e+=1){var n=r[e];if(!n.cancelled&&(n.callback(),this._cleared))break}this._cleared=!1,this._currentlyRunning=!1},on.prototype.clear=function(){this._currentlyRunning&&(this._cleared=!0),this._queue=[]};var sn=t.default.HTMLImageElement,ln=t.default.HTMLElement,cn={center:[0,0],zoom:0,bearing:0,pitch:0,minZoom:0,maxZoom:22,interactive:!0,scrollZoom:!0,boxZoom:!0,dragRotate:!0,dragPan:!0,keyboard:!0,doubleClickZoom:!0,touchZoomRotate:!0,bearingSnap:7,hash:!1,attributionControl:!0,failIfMajorPerformanceCaveat:!1,preserveDrawingBuffer:!1,trackResize:!0,renderWorldCopies:!0,refreshExpiredTiles:!0,maxTileCacheSize:null,transformRequest:null,fadeDuration:300},un=function(r){function n(e){if(null!=(e=t.extend({},cn,e)).minZoom&&null!=e.maxZoom&&e.minZoom>e.maxZoom)throw new Error("maxZoom must be greater than minZoom");var n=new Fr(e.minZoom,e.maxZoom,e.renderWorldCopies);r.call(this,n,e),this._interactive=e.interactive,this._maxTileCacheSize=e.maxTileCacheSize,this._failIfMajorPerformanceCaveat=e.failIfMajorPerformanceCaveat,this._preserveDrawingBuffer=e.preserveDrawingBuffer,this._trackResize=e.trackResize,this._bearingSnap=e.bearingSnap,this._refreshExpiredTiles=e.refreshExpiredTiles,this._fadeDuration=e.fadeDuration,this._crossFadingFactor=1,this._collectResourceTiming=e.collectResourceTiming,this._renderTaskQueue=new on;var i=e.transformRequest;if(this._transformRequest=i?function(t,e){return i(t,e)||{url:t}}:function(t){return{url:t}},"string"==typeof e.container){var a=t.default.document.getElementById(e.container);if(!a)throw new Error("Container '"+e.container+"' not found.");this._container=a}else{if(!(e.container instanceof ln))throw new Error("Invalid type: 'container' must be a String or HTMLElement.");this._container=e.container}e.maxBounds&&this.setMaxBounds(e.maxBounds),t.bindAll(["_onWindowOnline","_onWindowResize","_contextLost","_contextRestored","_update","_render","_onData","_onDataLoading"],this),this._setupContainer(),this._setupPainter(),this.on("move",this._update.bind(this,!1)),this.on("zoom",this._update.bind(this,!0)),void 0!==t.default&&(t.default.addEventListener("online",this._onWindowOnline,!1),t.default.addEventListener("resize",this._onWindowResize,!1)),function(t,e){var r=t.getCanvasContainer(),n=null,i=!1;for(var a in en)t[a]=new en[a](t,e),e.interactive&&e[a]&&t[a].enable(e[a]);s.addEventListener(r,"mouseout",function(e){t.fire(new Vr("mouseout",t,e))}),s.addEventListener(r,"mousedown",function(r){i=!0;var n=new Vr("mousedown",t,r);t.fire(n),n.defaultPrevented||(e.interactive&&!t.doubleClickZoom.isActive()&&t.stop(),t.boxZoom.onMouseDown(r),t.boxZoom.isActive()||t.dragPan.isActive()||t.dragRotate.onMouseDown(r),t.boxZoom.isActive()||t.dragRotate.isActive()||t.dragPan.onMouseDown(r))}),s.addEventListener(r,"mouseup",function(e){var r=t.dragRotate.isActive();n&&!r&&t.fire(new Vr("contextmenu",t,n)),n=null,i=!1,t.fire(new Vr("mouseup",t,e))}),s.addEventListener(r,"mousemove",function(e){if(!t.dragPan.isActive()&&!t.dragRotate.isActive()){for(var n=e.toElement||e.target;n&&n!==r;)n=n.parentNode;n===r&&t.fire(new Vr("mousemove",t,e))}}),s.addEventListener(r,"mouseover",function(e){for(var n=e.toElement||e.target;n&&n!==r;)n=n.parentNode;n===r&&t.fire(new Vr("mouseover",t,e))}),s.addEventListener(r,"touchstart",function(r){var n=new Ur("touchstart",t,r);t.fire(n),n.defaultPrevented||(e.interactive&&t.stop(),t.boxZoom.isActive()||t.dragRotate.isActive()||t.dragPan.onTouchStart(r),t.touchZoomRotate.onStart(r),t.doubleClickZoom.onTouchStart(n))},{passive:!1}),s.addEventListener(r,"touchmove",function(e){t.fire(new Ur("touchmove",t,e))},{passive:!1}),s.addEventListener(r,"touchend",function(e){t.fire(new Ur("touchend",t,e))}),s.addEventListener(r,"touchcancel",function(e){t.fire(new Ur("touchcancel",t,e))}),s.addEventListener(r,"click",function(e){t.fire(new Vr("click",t,e))}),s.addEventListener(r,"dblclick",function(e){var r=new Vr("dblclick",t,e);t.fire(r),r.defaultPrevented||t.doubleClickZoom.onDblClick(r)}),s.addEventListener(r,"contextmenu",function(e){var r=t.dragRotate.isActive();i||r?i&&(n=e):t.fire(new Vr("contextmenu",t,e)),e.preventDefault()}),s.addEventListener(r,"wheel",function(e){var r=new qr("wheel",t,e);t.fire(r),r.defaultPrevented||t.scrollZoom.onWheel(e)},{passive:!1})}(this,e),this._hash=e.hash&&(new jr).addTo(this),this._hash&&this._hash._onHashChange()||this.jumpTo({center:e.center,zoom:e.zoom,bearing:e.bearing,pitch:e.pitch}),this.resize(),e.style&&this.setStyle(e.style,{localIdeographFontFamily:e.localIdeographFontFamily}),e.attributionControl&&this.addControl(new nn),this.addControl(new an,e.logoPosition),this.on("style.load",function(){this.transform.unmodified&&this.jumpTo(this.style.stylesheet)}),this.on("data",this._onData),this.on("dataloading",this._onDataLoading)}r&&(n.__proto__=r),n.prototype=Object.create(r&&r.prototype),n.prototype.constructor=n;var i={showTileBoundaries:{configurable:!0},showCollisionBoxes:{configurable:!0},showOverdrawInspector:{configurable:!0},repaint:{configurable:!0},vertices:{configurable:!0}};return n.prototype.addControl=function(t,e){void 0===e&&t.getDefaultPosition&&(e=t.getDefaultPosition()),void 0===e&&(e="top-right");var r=t.onAdd(this),n=this._controlPositions[e];return-1!==e.indexOf("bottom")?n.insertBefore(r,n.firstChild):n.appendChild(r),this},n.prototype.removeControl=function(t){return t.onRemove(this),this},n.prototype.resize=function(e){var r=this._containerDimensions(),n=r[0],i=r[1];return this._resizeCanvas(n,i),this.transform.resize(n,i),this.painter.resize(n,i),this.fire(new t.Event("movestart",e)).fire(new t.Event("move",e)).fire(new t.Event("resize",e)).fire(new t.Event("moveend",e))},n.prototype.getBounds=function(){var e=new W(this.transform.pointLocation(new t.default$1(0,this.transform.height)),this.transform.pointLocation(new t.default$1(this.transform.width,0)));return(this.transform.angle||this.transform.pitch)&&(e.extend(this.transform.pointLocation(new t.default$1(this.transform.size.x,0))),e.extend(this.transform.pointLocation(new t.default$1(0,this.transform.size.y)))),e},n.prototype.getMaxBounds=function(){return this.transform.latRange&&2===this.transform.latRange.length&&this.transform.lngRange&&2===this.transform.lngRange.length?new W([this.transform.lngRange[0],this.transform.latRange[0]],[this.transform.lngRange[1],this.transform.latRange[1]]):null},n.prototype.setMaxBounds=function(t){if(t){var e=W.convert(t);this.transform.lngRange=[e.getWest(),e.getEast()],this.transform.latRange=[e.getSouth(),e.getNorth()],this.transform._constrain(),this._update()}else null==t&&(this.transform.lngRange=null,this.transform.latRange=null,this._update());return this},n.prototype.setMinZoom=function(t){if((t=null==t?0:t)>=0&&t<=this.transform.maxZoom)return this.transform.minZoom=t,this._update(),this.getZoom()<t&&this.setZoom(t),this;throw new Error("minZoom must be between 0 and the current maxZoom, inclusive")},n.prototype.getMinZoom=function(){return this.transform.minZoom},n.prototype.setMaxZoom=function(t){if((t=null==t?22:t)>=this.transform.minZoom)return this.transform.maxZoom=t,this._update(),this.getZoom()>t&&this.setZoom(t),this;throw new Error("maxZoom must be greater than the current minZoom")},n.prototype.getRenderWorldCopies=function(){return this.transform.renderWorldCopies},n.prototype.setRenderWorldCopies=function(t){return this.transform.renderWorldCopies=t,this._update(),this},n.prototype.getMaxZoom=function(){return this.transform.maxZoom},n.prototype.project=function(t){return this.transform.locationPoint(G.convert(t))},n.prototype.unproject=function(e){return this.transform.pointLocation(t.default$1.convert(e))},n.prototype.isMoving=function(){return this._moving||this.dragPan.isActive()||this.dragRotate.isActive()||this.scrollZoom.isActive()},n.prototype.isZooming=function(){return this._zooming||this.scrollZoom.isActive()},n.prototype.isRotating=function(){return this._rotating||this.dragRotate.isActive()},n.prototype.on=function(t,e,n){var i,a=this;if(void 0===n)return r.prototype.on.call(this,t,e);var o=function(){if("mouseenter"===t||"mouseover"===t){var r=!1;return{layer:e,listener:n,delegates:{mousemove:function(i){var o=a.getLayer(e)?a.queryRenderedFeatures(i.point,{layers:[e]}):[];o.length?r||(r=!0,n.call(a,new Vr(t,a,i.originalEvent,{features:o}))):r=!1},mouseout:function(){r=!1}}}}if("mouseleave"===t||"mouseout"===t){var o=!1;return{layer:e,listener:n,delegates:{mousemove:function(r){(a.getLayer(e)?a.queryRenderedFeatures(r.point,{layers:[e]}):[]).length?o=!0:o&&(o=!1,n.call(a,new Vr(t,a,r.originalEvent)))},mouseout:function(e){o&&(o=!1,n.call(a,new Vr(t,a,e.originalEvent)))}}}}return{layer:e,listener:n,delegates:(i={},i[t]=function(t){var r=a.getLayer(e)?a.queryRenderedFeatures(t.point,{layers:[e]}):[];r.length&&(t.features=r,n.call(a,t),delete t.features)},i)}}();for(var s in this._delegatedListeners=this._delegatedListeners||{},this._delegatedListeners[t]=this._delegatedListeners[t]||[],this._delegatedListeners[t].push(o),o.delegates)a.on(s,o.delegates[s]);return this},n.prototype.off=function(t,e,n){if(void 0===n)return r.prototype.off.call(this,t,e);if(this._delegatedListeners&&this._delegatedListeners[t])for(var i=this._delegatedListeners[t],a=0;a<i.length;a++){var o=i[a];if(o.layer===e&&o.listener===n){for(var s in o.delegates)this.off(s,o.delegates[s]);return i.splice(a,1),this}}return this},n.prototype.queryRenderedFeatures=function(e,r){var n;return 2===arguments.length?(e=e,r=r):1===arguments.length&&((n=e)instanceof t.default$1||Array.isArray(n))?(e=e,r={}):1===arguments.length?r=e=void 0:(e=void 0,r={}),this.style?this.style.queryRenderedFeatures(this._makeQueryGeometry(e),r,this.transform):[]},n.prototype._makeQueryGeometry=function(e){var r,n=this;if(void 0===e&&(e=[t.default$1.convert([0,0]),t.default$1.convert([this.transform.width,this.transform.height])]),e instanceof t.default$1||"number"==typeof e[0])r=[t.default$1.convert(e)];else{var i=[t.default$1.convert(e[0]),t.default$1.convert(e[1])];r=[i[0],new t.default$1(i[1].x,i[0].y),i[1],new t.default$1(i[0].x,i[1].y),i[0]]}return{viewport:r,worldCoordinate:r.map(function(t){return n.transform.pointCoordinate(t)})}},n.prototype.querySourceFeatures=function(t,e){return this.style.querySourceFeatures(t,e)},n.prototype.setStyle=function(e,r){if((!r||!1!==r.diff&&!r.localIdeographFontFamily)&&this.style&&e&&"object"==typeof e)try{return this.style.setState(e)&&this._update(!0),this}catch(e){t.warnOnce("Unable to perform style diff: "+(e.message||e.error||e)+".  Rebuilding the style from scratch.")}return this.style&&(this.style.setEventedParent(null),this.style._remove()),e?(this.style=new Je(this,r||{}),this.style.setEventedParent(this,{style:this.style}),"string"==typeof e?this.style.loadURL(e):this.style.loadJSON(e),this):(delete this.style,this)},n.prototype.getStyle=function(){if(this.style)return this.style.serialize()},n.prototype.isStyleLoaded=function(){return this.style?this.style.loaded():t.warnOnce("There is no style added to the map.")},n.prototype.addSource=function(t,e){return this.style.addSource(t,e),this._update(!0),this},n.prototype.isSourceLoaded=function(e){var r=this.style&&this.style.sourceCaches[e];if(void 0!==r)return r.loaded();this.fire(new t.ErrorEvent(new Error("There is no source with ID '"+e+"'")))},n.prototype.areTilesLoaded=function(){var t=this.style&&this.style.sourceCaches;for(var e in t){var r=t[e]._tiles;for(var n in r){var i=r[n];if("loaded"!==i.state&&"errored"!==i.state)return!1}}return!0},n.prototype.addSourceType=function(t,e,r){return this.style.addSourceType(t,e,r)},n.prototype.removeSource=function(t){return this.style.removeSource(t),this._update(!0),this},n.prototype.getSource=function(t){return this.style.getSource(t)},n.prototype.addImage=function(e,r,n){void 0===n&&(n={});var i=n.pixelRatio;void 0===i&&(i=1);var o=n.sdf;if(void 0===o&&(o=!1),r instanceof sn){var s=a.getImageData(r),l=s.width,c=s.height,u=s.data;this.style.addImage(e,{data:new t.RGBAImage({width:l,height:c},u),pixelRatio:i,sdf:o})}else{if(void 0===r.width||void 0===r.height)return this.fire(new t.ErrorEvent(new Error("Invalid arguments to map.addImage(). The second argument must be an `HTMLImageElement`, `ImageData`, or object with `width`, `height`, and `data` properties with the same format as `ImageData`")));var h=r.width,f=r.height,p=r.data;this.style.addImage(e,{data:new t.RGBAImage({width:h,height:f},p.slice(0)),pixelRatio:i,sdf:o})}},n.prototype.hasImage=function(e){return e?!!this.style.getImage(e):(this.fire(new t.ErrorEvent(new Error("Missing required image id"))),!1)},n.prototype.removeImage=function(t){this.style.removeImage(t)},n.prototype.loadImage=function(e,r){t.getImage(this._transformRequest(e,t.ResourceType.Image),r)},n.prototype.addLayer=function(t,e){return this.style.addLayer(t,e),this._update(!0),this},n.prototype.moveLayer=function(t,e){return this.style.moveLayer(t,e),this._update(!0),this},n.prototype.removeLayer=function(t){return this.style.removeLayer(t),this._update(!0),this},n.prototype.getLayer=function(t){return this.style.getLayer(t)},n.prototype.setFilter=function(t,e){return this.style.setFilter(t,e),this._update(!0),this},n.prototype.setLayerZoomRange=function(t,e,r){return this.style.setLayerZoomRange(t,e,r),this._update(!0),this},n.prototype.getFilter=function(t){return this.style.getFilter(t)},n.prototype.setPaintProperty=function(t,e,r){return this.style.setPaintProperty(t,e,r),this._update(!0),this},n.prototype.getPaintProperty=function(t,e){return this.style.getPaintProperty(t,e)},n.prototype.setLayoutProperty=function(t,e,r){return this.style.setLayoutProperty(t,e,r),this._update(!0),this},n.prototype.getLayoutProperty=function(t,e){return this.style.getLayoutProperty(t,e)},n.prototype.setLight=function(t){return this.style.setLight(t),this._update(!0),this},n.prototype.getLight=function(){return this.style.getLight()},n.prototype.getContainer=function(){return this._container},n.prototype.getCanvasContainer=function(){return this._canvasContainer},n.prototype.getCanvas=function(){return this._canvas},n.prototype._containerDimensions=function(){var t=0,e=0;return this._container&&(t=this._container.offsetWidth||400,e=this._container.offsetHeight||300),[t,e]},n.prototype._setupContainer=function(){var t=this._container;t.classList.add("mapboxgl-map"),(this._missingCSSContainer=s.create("div","mapboxgl-missing-css",t)).innerHTML="Missing Mapbox GL JS CSS";var e=this._canvasContainer=s.create("div","mapboxgl-canvas-container",t);this._interactive&&e.classList.add("mapboxgl-interactive"),this._canvas=s.create("canvas","mapboxgl-canvas",e),this._canvas.style.position="absolute",this._canvas.addEventListener("webglcontextlost",this._contextLost,!1),this._canvas.addEventListener("webglcontextrestored",this._contextRestored,!1),this._canvas.setAttribute("tabindex","0"),this._canvas.setAttribute("aria-label","Map");var r=this._containerDimensions();this._resizeCanvas(r[0],r[1]);var n=this._controlContainer=s.create("div","mapboxgl-control-container",t),i=this._controlPositions={};["top-left","top-right","bottom-left","bottom-right"].forEach(function(t){i[t]=s.create("div","mapboxgl-ctrl-"+t,n)})},n.prototype._resizeCanvas=function(e,r){var n=t.default.devicePixelRatio||1;this._canvas.width=n*e,this._canvas.height=n*r,this._canvas.style.width=e+"px",this._canvas.style.height=r+"px"},n.prototype._setupPainter=function(){var r=t.extend({failIfMajorPerformanceCaveat:this._failIfMajorPerformanceCaveat,preserveDrawingBuffer:this._preserveDrawingBuffer},e.webGLContextAttributes),n=this._canvas.getContext("webgl",r)||this._canvas.getContext("experimental-webgl",r);n?this.painter=new zr(n,this.transform):this.fire(new t.ErrorEvent(new Error("Failed to initialize WebGL")))},n.prototype._contextLost=function(e){e.preventDefault(),this._frameId&&(a.cancelFrame(this._frameId),this._frameId=null),this.fire(new t.Event("webglcontextlost",{originalEvent:e}))},n.prototype._contextRestored=function(e){this._setupPainter(),this.resize(),this._update(),this.fire(new t.Event("webglcontextrestored",{originalEvent:e}))},n.prototype.loaded=function(){return!this._styleDirty&&!this._sourcesDirty&&!(!this.style||!this.style.loaded())},n.prototype._update=function(t){this.style&&(this._styleDirty=this._styleDirty||t,this._sourcesDirty=!0,this._rerender())},n.prototype._requestRenderFrame=function(t){return this._update(),this._renderTaskQueue.add(t)},n.prototype._cancelRenderFrame=function(t){this._renderTaskQueue.remove(t)},n.prototype._render=function(){this._renderTaskQueue.run();var e=!1;if(this.style&&this._styleDirty){this._styleDirty=!1;var r=this.transform.zoom,n=a.now();this.style.zoomHistory.update(r,n);var i=new t.default$16(r,{now:n,fadeDuration:this._fadeDuration,zoomHistory:this.style.zoomHistory,transition:this.style.getTransition()}),o=i.crossFadingFactor();1===o&&o===this._crossFadingFactor||(e=!0,this._crossFadingFactor=o),this.style.update(i)}return this.style&&this._sourcesDirty&&(this._sourcesDirty=!1,this.style._updateSources(this.transform)),this._placementDirty=this.style&&this.style._updatePlacement(this.painter.transform,this.showCollisionBoxes,this._fadeDuration),this.painter.render(this.style,{showTileBoundaries:this.showTileBoundaries,showOverdrawInspector:this._showOverdrawInspector,rotating:this.isRotating(),zooming:this.isZooming(),fadeDuration:this._fadeDuration}),this.fire(new t.Event("render")),this.loaded()&&!this._loaded&&(this._loaded=!0,this.fire(new t.Event("load"))),this.style&&(this.style.hasTransitions()||e)&&(this._styleDirty=!0),(this._sourcesDirty||this._repaint||this._styleDirty||this._placementDirty)&&this._rerender(),this},n.prototype.remove=function(){this._hash&&this._hash.remove(),a.cancelFrame(this._frameId),this._renderTaskQueue.clear(),this._frameId=null,this.setStyle(null),void 0!==t.default&&(t.default.removeEventListener("resize",this._onWindowResize,!1),t.default.removeEventListener("online",this._onWindowOnline,!1));var e=this.painter.context.gl.getExtension("WEBGL_lose_context");e&&e.loseContext(),hn(this._canvasContainer),hn(this._controlContainer),hn(this._missingCSSContainer),this._container.classList.remove("mapboxgl-map"),this.fire(new t.Event("remove"))},n.prototype._rerender=function(){var t=this;this.style&&!this._frameId&&(this._frameId=a.frame(function(){t._frameId=null,t._render()}))},n.prototype._onWindowOnline=function(){this._update()},n.prototype._onWindowResize=function(){this._trackResize&&this.stop().resize()._update()},i.showTileBoundaries.get=function(){return!!this._showTileBoundaries},i.showTileBoundaries.set=function(t){this._showTileBoundaries!==t&&(this._showTileBoundaries=t,this._update())},i.showCollisionBoxes.get=function(){return!!this._showCollisionBoxes},i.showCollisionBoxes.set=function(t){this._showCollisionBoxes!==t&&(this._showCollisionBoxes=t,t?this.style._generateCollisionBoxes():this._update())},i.showOverdrawInspector.get=function(){return!!this._showOverdrawInspector},i.showOverdrawInspector.set=function(t){this._showOverdrawInspector!==t&&(this._showOverdrawInspector=t,this._update())},i.repaint.get=function(){return!!this._repaint},i.repaint.set=function(t){this._repaint=t,this._update()},i.vertices.get=function(){return!!this._vertices},i.vertices.set=function(t){this._vertices=t,this._update()},n.prototype._onData=function(e){this._update("style"===e.dataType),this.fire(new t.Event(e.dataType+"data",e))},n.prototype._onDataLoading=function(e){this.fire(new t.Event(e.dataType+"dataloading",e))},Object.defineProperties(n.prototype,i),n}(rn);function hn(t){t.parentNode&&t.parentNode.removeChild(t)}var fn={showCompass:!0,showZoom:!0},pn=function(e){var r=this;this.options=t.extend({},fn,e),this._container=s.create("div","mapboxgl-ctrl mapboxgl-ctrl-group"),this._container.addEventListener("contextmenu",function(t){return t.preventDefault()}),this.options.showZoom&&(this._zoomInButton=this._createButton("mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-in","Zoom In",function(){return r._map.zoomIn()}),this._zoomOutButton=this._createButton("mapboxgl-ctrl-icon mapboxgl-ctrl-zoom-out","Zoom Out",function(){return r._map.zoomOut()})),this.options.showCompass&&(t.bindAll(["_rotateCompassArrow"],this),this._compass=this._createButton("mapboxgl-ctrl-icon mapboxgl-ctrl-compass","Reset North",function(){return r._map.resetNorth()}),this._compassArrow=s.create("span","mapboxgl-ctrl-compass-arrow",this._compass))};function dn(t,e,r){if(t=new G(t.lng,t.lat),e){var n=new G(t.lng-360,t.lat),i=new G(t.lng+360,t.lat),a=r.locationPoint(t).distSqr(e);r.locationPoint(n).distSqr(e)<a?t=n:r.locationPoint(i).distSqr(e)<a&&(t=i)}for(;Math.abs(t.lng-r.center.lng)>180;){var o=r.locationPoint(t);if(o.x>=0&&o.y>=0&&o.x<=r.width&&o.y<=r.height)break;t.lng>r.center.lng?t.lng-=360:t.lng+=360}return t}pn.prototype._rotateCompassArrow=function(){var t="rotate("+this._map.transform.angle*(180/Math.PI)+"deg)";this._compassArrow.style.transform=t},pn.prototype.onAdd=function(t){return this._map=t,this.options.showCompass&&(this._map.on("rotate",this._rotateCompassArrow),this._rotateCompassArrow(),this._handler=new Yr(t,{button:"left",element:this._compass}),this._handler.enable()),this._container},pn.prototype.onRemove=function(){s.remove(this._container),this.options.showCompass&&(this._map.off("rotate",this._rotateCompassArrow),this._handler.disable(),delete this._handler),delete this._map},pn.prototype._createButton=function(t,e,r){var n=s.create("button",t,this._container);return n.type="button",n.setAttribute("aria-label",e),n.addEventListener("click",r),n};var gn={center:"translate(-50%,-50%)",top:"translate(-50%,0)","top-left":"translate(0,0)","top-right":"translate(-100%,0)",bottom:"translate(-50%,-100%)","bottom-left":"translate(0,-100%)","bottom-right":"translate(-100%,-100%)",left:"translate(0,-50%)",right:"translate(-100%,-50%)"};function mn(t,e,r){var n=t.classList;for(var i in gn)n.remove("mapboxgl-"+r+"-anchor-"+i);n.add("mapboxgl-"+r+"-anchor-"+e)}var vn=function(e){if((e instanceof t.default.HTMLElement||2===arguments.length)&&(e=t.extend({element:e},arguments[1])),t.bindAll(["_update","_onMapClick"],this),this._anchor=e&&e.anchor||"center",this._color=e&&e.color||"#3FB1CE",e&&e.element)this._element=e.element,this._offset=t.default$1.convert(e&&e.offset||[0,0]);else{this._defaultMarker=!0,this._element=s.create("div");var r=s.createNS("http://www.w3.org/2000/svg","svg");r.setAttributeNS(null,"height","41px"),r.setAttributeNS(null,"width","27px"),r.setAttributeNS(null,"viewBox","0 0 27 41");var n=s.createNS("http://www.w3.org/2000/svg","g");n.setAttributeNS(null,"stroke","none"),n.setAttributeNS(null,"stroke-width","1"),n.setAttributeNS(null,"fill","none"),n.setAttributeNS(null,"fill-rule","evenodd");var i=s.createNS("http://www.w3.org/2000/svg","g");i.setAttributeNS(null,"fill-rule","nonzero");var a=s.createNS("http://www.w3.org/2000/svg","g");a.setAttributeNS(null,"transform","translate(3.0, 29.0)"),a.setAttributeNS(null,"fill","#000000");for(var o=0,l=[{rx:"10.5",ry:"5.25002273"},{rx:"10.5",ry:"5.25002273"},{rx:"9.5",ry:"4.77275007"},{rx:"8.5",ry:"4.29549936"},{rx:"7.5",ry:"3.81822308"},{rx:"6.5",ry:"3.34094679"},{rx:"5.5",ry:"2.86367051"},{rx:"4.5",ry:"2.38636864"}];o<l.length;o+=1){var c=l[o],u=s.createNS("http://www.w3.org/2000/svg","ellipse");u.setAttributeNS(null,"opacity","0.04"),u.setAttributeNS(null,"cx","10.5"),u.setAttributeNS(null,"cy","5.80029008"),u.setAttributeNS(null,"rx",c.rx),u.setAttributeNS(null,"ry",c.ry),a.appendChild(u)}var h=s.createNS("http://www.w3.org/2000/svg","g");h.setAttributeNS(null,"fill",this._color);var f=s.createNS("http://www.w3.org/2000/svg","path");f.setAttributeNS(null,"d","M27,13.5 C27,19.074644 20.250001,27.000002 14.75,34.500002 C14.016665,35.500004 12.983335,35.500004 12.25,34.500002 C6.7499993,27.000002 0,19.222562 0,13.5 C0,6.0441559 6.0441559,0 13.5,0 C20.955844,0 27,6.0441559 27,13.5 Z"),h.appendChild(f);var p=s.createNS("http://www.w3.org/2000/svg","g");p.setAttributeNS(null,"opacity","0.25"),p.setAttributeNS(null,"fill","#000000");var d=s.createNS("http://www.w3.org/2000/svg","path");d.setAttributeNS(null,"d","M13.5,0 C6.0441559,0 0,6.0441559 0,13.5 C0,19.222562 6.7499993,27 12.25,34.5 C13,35.522727 14.016664,35.500004 14.75,34.5 C20.250001,27 27,19.074644 27,13.5 C27,6.0441559 20.955844,0 13.5,0 Z M13.5,1 C20.415404,1 26,6.584596 26,13.5 C26,15.898657 24.495584,19.181431 22.220703,22.738281 C19.945823,26.295132 16.705119,30.142167 13.943359,33.908203 C13.743445,34.180814 13.612715,34.322738 13.5,34.441406 C13.387285,34.322738 13.256555,34.180814 13.056641,33.908203 C10.284481,30.127985 7.4148684,26.314159 5.015625,22.773438 C2.6163816,19.232715 1,15.953538 1,13.5 C1,6.584596 6.584596,1 13.5,1 Z"),p.appendChild(d);var g=s.createNS("http://www.w3.org/2000/svg","g");g.setAttributeNS(null,"transform","translate(6.0, 7.0)"),g.setAttributeNS(null,"fill","#FFFFFF");var m=s.createNS("http://www.w3.org/2000/svg","g");m.setAttributeNS(null,"transform","translate(8.0, 8.0)");var v=s.createNS("http://www.w3.org/2000/svg","circle");v.setAttributeNS(null,"fill","#000000"),v.setAttributeNS(null,"opacity","0.25"),v.setAttributeNS(null,"cx","5.5"),v.setAttributeNS(null,"cy","5.5"),v.setAttributeNS(null,"r","5.4999962");var y=s.createNS("http://www.w3.org/2000/svg","circle");y.setAttributeNS(null,"fill","#FFFFFF"),y.setAttributeNS(null,"cx","5.5"),y.setAttributeNS(null,"cy","5.5"),y.setAttributeNS(null,"r","5.4999962"),m.appendChild(v),m.appendChild(y),i.appendChild(a),i.appendChild(h),i.appendChild(p),i.appendChild(g),i.appendChild(m),r.appendChild(i),this._element.appendChild(r),this._offset=t.default$1.convert(e&&e.offset||[0,-14])}this._element.classList.add("mapboxgl-marker"),this._popup=null};vn.prototype.addTo=function(t){return this.remove(),this._map=t,t.getCanvasContainer().appendChild(this._element),t.on("move",this._update),t.on("moveend",this._update),this._update(),this._map.on("click",this._onMapClick),this},vn.prototype.remove=function(){return this._map&&(this._map.off("click",this._onMapClick),this._map.off("move",this._update),this._map.off("moveend",this._update),delete this._map),s.remove(this._element),this._popup&&this._popup.remove(),this},vn.prototype.getLngLat=function(){return this._lngLat},vn.prototype.setLngLat=function(t){return this._lngLat=G.convert(t),this._pos=null,this._popup&&this._popup.setLngLat(this._lngLat),this._update(),this},vn.prototype.getElement=function(){return this._element},vn.prototype.setPopup=function(t){if(this._popup&&(this._popup.remove(),this._popup=null),t){if(!("offset"in t.options)){var e=Math.sqrt(Math.pow(13.5,2)/2);t.options.offset=this._defaultMarker?{top:[0,0],"top-left":[0,0],"top-right":[0,0],bottom:[0,-38.1],"bottom-left":[e,-1*(24.6+e)],"bottom-right":[-e,-1*(24.6+e)],left:[13.5,-24.6],right:[-13.5,-24.6]}:this._offset}this._popup=t,this._lngLat&&this._popup.setLngLat(this._lngLat)}return this},vn.prototype._onMapClick=function(t){var e=t.originalEvent.target,r=this._element;this._popup&&(e===r||r.contains(e))&&this.togglePopup()},vn.prototype.getPopup=function(){return this._popup},vn.prototype.togglePopup=function(){var t=this._popup;return t?(t.isOpen()?t.remove():t.addTo(this._map),this):this},vn.prototype._update=function(t){this._map&&(this._map.transform.renderWorldCopies&&(this._lngLat=dn(this._lngLat,this._pos,this._map.transform)),this._pos=this._map.project(this._lngLat)._add(this._offset),t&&"moveend"!==t.type||(this._pos=this._pos.round()),s.setTransform(this._element,gn[this._anchor]+" translate("+this._pos.x+"px, "+this._pos.y+"px)"),mn(this._element,this._anchor,"marker"))},vn.prototype.getOffset=function(){return this._offset},vn.prototype.setOffset=function(e){return this._offset=t.default$1.convert(e),this._update(),this};var yn,xn={positionOptions:{enableHighAccuracy:!1,maximumAge:0,timeout:6e3},fitBoundsOptions:{maxZoom:15},trackUserLocation:!1,showUserLocation:!0},bn=function(e){function r(r){e.call(this),this.options=t.extend({},xn,r),t.bindAll(["_onSuccess","_onError","_finish","_setupUI","_updateCamera","_updateMarker"],this)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.onAdd=function(e){var r;return this._map=e,this._container=s.create("div","mapboxgl-ctrl mapboxgl-ctrl-group"),r=this._setupUI,void 0!==yn?r(yn):void 0!==t.default.navigator.permissions?t.default.navigator.permissions.query({name:"geolocation"}).then(function(t){yn="denied"!==t.state,r(yn)}):(yn=!!t.default.navigator.geolocation,r(yn)),this._container},r.prototype.onRemove=function(){void 0!==this._geolocationWatchID&&(t.default.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0),this.options.showUserLocation&&this._userLocationDotMarker.remove(),s.remove(this._container),this._map=void 0},r.prototype._onSuccess=function(e){if(this.options.trackUserLocation)switch(this._lastKnownPosition=e,this._watchState){case"WAITING_ACTIVE":case"ACTIVE_LOCK":case"ACTIVE_ERROR":this._watchState="ACTIVE_LOCK",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");break;case"BACKGROUND":case"BACKGROUND_ERROR":this._watchState="BACKGROUND",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background")}this.options.showUserLocation&&"OFF"!==this._watchState&&this._updateMarker(e),this.options.trackUserLocation&&"ACTIVE_LOCK"!==this._watchState||this._updateCamera(e),this.options.showUserLocation&&this._dotElement.classList.remove("mapboxgl-user-location-dot-stale"),this.fire(new t.Event("geolocate",e)),this._finish()},r.prototype._updateCamera=function(t){var e=new G(t.coords.longitude,t.coords.latitude),r=t.coords.accuracy;this._map.fitBounds(e.toBounds(r),this.options.fitBoundsOptions,{geolocateSource:!0})},r.prototype._updateMarker=function(t){t?this._userLocationDotMarker.setLngLat([t.coords.longitude,t.coords.latitude]).addTo(this._map):this._userLocationDotMarker.remove()},r.prototype._onError=function(e){if(this.options.trackUserLocation)if(1===e.code)this._watchState="OFF",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"),void 0!==this._geolocationWatchID&&this._clearWatch();else switch(this._watchState){case"WAITING_ACTIVE":this._watchState="ACTIVE_ERROR",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error");break;case"ACTIVE_LOCK":this._watchState="ACTIVE_ERROR",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting");break;case"BACKGROUND":this._watchState="BACKGROUND_ERROR",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background-error"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting")}"OFF"!==this._watchState&&this.options.showUserLocation&&this._dotElement.classList.add("mapboxgl-user-location-dot-stale"),this.fire(new t.Event("error",e)),this._finish()},r.prototype._finish=function(){this._timeoutId&&clearTimeout(this._timeoutId),this._timeoutId=void 0},r.prototype._setupUI=function(e){var r=this;!1!==e&&(this._container.addEventListener("contextmenu",function(t){return t.preventDefault()}),this._geolocateButton=s.create("button","mapboxgl-ctrl-icon mapboxgl-ctrl-geolocate",this._container),this._geolocateButton.type="button",this._geolocateButton.setAttribute("aria-label","Geolocate"),this.options.trackUserLocation&&(this._geolocateButton.setAttribute("aria-pressed","false"),this._watchState="OFF"),this.options.showUserLocation&&(this._dotElement=s.create("div","mapboxgl-user-location-dot"),this._userLocationDotMarker=new vn(this._dotElement),this.options.trackUserLocation&&(this._watchState="OFF")),this._geolocateButton.addEventListener("click",this.trigger.bind(this)),this._setup=!0,this.options.trackUserLocation&&this._map.on("movestart",function(e){e.geolocateSource||"ACTIVE_LOCK"!==r._watchState||(r._watchState="BACKGROUND",r._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background"),r._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),r.fire(new t.Event("trackuserlocationend")))}))},r.prototype.trigger=function(){if(!this._setup)return t.warnOnce("Geolocate control triggered before added to a map"),!1;if(this.options.trackUserLocation){switch(this._watchState){case"OFF":this._watchState="WAITING_ACTIVE",this.fire(new t.Event("trackuserlocationstart"));break;case"WAITING_ACTIVE":case"ACTIVE_LOCK":case"ACTIVE_ERROR":case"BACKGROUND_ERROR":this._watchState="OFF",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-active-error"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background-error"),this.fire(new t.Event("trackuserlocationend"));break;case"BACKGROUND":this._watchState="ACTIVE_LOCK",this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-background"),this._lastKnownPosition&&this._updateCamera(this._lastKnownPosition),this.fire(new t.Event("trackuserlocationstart"))}switch(this._watchState){case"WAITING_ACTIVE":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");break;case"ACTIVE_LOCK":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active");break;case"ACTIVE_ERROR":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-active-error");break;case"BACKGROUND":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background");break;case"BACKGROUND_ERROR":this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-background-error")}"OFF"===this._watchState&&void 0!==this._geolocationWatchID?this._clearWatch():void 0===this._geolocationWatchID&&(this._geolocateButton.classList.add("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.setAttribute("aria-pressed","true"),this._geolocationWatchID=t.default.navigator.geolocation.watchPosition(this._onSuccess,this._onError,this.options.positionOptions))}else t.default.navigator.geolocation.getCurrentPosition(this._onSuccess,this._onError,this.options.positionOptions),this._timeoutId=setTimeout(this._finish,1e4);return!0},r.prototype._clearWatch=function(){t.default.navigator.geolocation.clearWatch(this._geolocationWatchID),this._geolocationWatchID=void 0,this._geolocateButton.classList.remove("mapboxgl-ctrl-geolocate-waiting"),this._geolocateButton.setAttribute("aria-pressed","false"),this.options.showUserLocation&&this._updateMarker(null)},r}(t.Evented),_n={maxWidth:100,unit:"metric"},wn=function(e){this.options=t.extend({},_n,e),t.bindAll(["_onMove","setUnit"],this)};function kn(t,e,r){var n,i,a,o,s,l,c=r&&r.maxWidth||100,u=t._container.clientHeight/2,h=(n=t.unproject([0,u]),i=t.unproject([c,u]),a=Math.PI/180,o=n.lat*a,s=i.lat*a,l=Math.sin(o)*Math.sin(s)+Math.cos(o)*Math.cos(s)*Math.cos((i.lng-n.lng)*a),6371e3*Math.acos(Math.min(l,1)));if(r&&"imperial"===r.unit){var f=3.2808*h;f>5280?Mn(e,c,f/5280,"mi"):Mn(e,c,f,"ft")}else r&&"nautical"===r.unit?Mn(e,c,h/1852,"nm"):Mn(e,c,h,"m")}function Mn(t,e,r,n){var i,a,o,s=(i=r,(a=Math.pow(10,(""+Math.floor(i)).length-1))*(o=(o=i/a)>=10?10:o>=5?5:o>=3?3:o>=2?2:1)),l=s/r;"m"===n&&s>=1e3&&(s/=1e3,n="km"),t.style.width=e*l+"px",t.innerHTML=s+n}wn.prototype.getDefaultPosition=function(){return"bottom-left"},wn.prototype._onMove=function(){kn(this._map,this._container,this.options)},wn.prototype.onAdd=function(t){return this._map=t,this._container=s.create("div","mapboxgl-ctrl mapboxgl-ctrl-scale",t.getContainer()),this._map.on("move",this._onMove),this._onMove(),this._container},wn.prototype.onRemove=function(){s.remove(this._container),this._map.off("move",this._onMove),this._map=void 0},wn.prototype.setUnit=function(t){this.options.unit=t,kn(this._map,this._container,this.options)};var An=function(){this._fullscreen=!1,t.bindAll(["_onClickFullscreen","_changeIcon"],this),"onfullscreenchange"in t.default.document?this._fullscreenchange="fullscreenchange":"onmozfullscreenchange"in t.default.document?this._fullscreenchange="mozfullscreenchange":"onwebkitfullscreenchange"in t.default.document?this._fullscreenchange="webkitfullscreenchange":"onmsfullscreenchange"in t.default.document&&(this._fullscreenchange="MSFullscreenChange"),this._className="mapboxgl-ctrl"};An.prototype.onAdd=function(e){return this._map=e,this._mapContainer=this._map.getContainer(),this._container=s.create("div",this._className+" mapboxgl-ctrl-group"),this._checkFullscreenSupport()?this._setupUI():(this._container.style.display="none",t.warnOnce("This device does not support fullscreen mode.")),this._container},An.prototype.onRemove=function(){s.remove(this._container),this._map=null,t.default.document.removeEventListener(this._fullscreenchange,this._changeIcon)},An.prototype._checkFullscreenSupport=function(){return!!(t.default.document.fullscreenEnabled||t.default.document.mozFullScreenEnabled||t.default.document.msFullscreenEnabled||t.default.document.webkitFullscreenEnabled)},An.prototype._setupUI=function(){var e=this._fullscreenButton=s.create("button",this._className+"-icon "+this._className+"-fullscreen",this._container);e.setAttribute("aria-label","Toggle fullscreen"),e.type="button",this._fullscreenButton.addEventListener("click",this._onClickFullscreen),t.default.document.addEventListener(this._fullscreenchange,this._changeIcon)},An.prototype._isFullscreen=function(){return this._fullscreen},An.prototype._changeIcon=function(){(t.default.document.fullscreenElement||t.default.document.mozFullScreenElement||t.default.document.webkitFullscreenElement||t.default.document.msFullscreenElement)===this._mapContainer!==this._fullscreen&&(this._fullscreen=!this._fullscreen,this._fullscreenButton.classList.toggle(this._className+"-shrink"),this._fullscreenButton.classList.toggle(this._className+"-fullscreen"))},An.prototype._onClickFullscreen=function(){this._isFullscreen()?t.default.document.exitFullscreen?t.default.document.exitFullscreen():t.default.document.mozCancelFullScreen?t.default.document.mozCancelFullScreen():t.default.document.msExitFullscreen?t.default.document.msExitFullscreen():t.default.document.webkitCancelFullScreen&&t.default.document.webkitCancelFullScreen():this._mapContainer.requestFullscreen?this._mapContainer.requestFullscreen():this._mapContainer.mozRequestFullScreen?this._mapContainer.mozRequestFullScreen():this._mapContainer.msRequestFullscreen?this._mapContainer.msRequestFullscreen():this._mapContainer.webkitRequestFullscreen&&this._mapContainer.webkitRequestFullscreen()};var Tn={closeButton:!0,closeOnClick:!0},Sn=function(e){function r(r){e.call(this),this.options=t.extend(Object.create(Tn),r),t.bindAll(["_update","_onClickClose"],this)}return e&&(r.__proto__=e),r.prototype=Object.create(e&&e.prototype),r.prototype.constructor=r,r.prototype.addTo=function(e){return this._map=e,this._map.on("move",this._update),this.options.closeOnClick&&this._map.on("click",this._onClickClose),this._update(),this.fire(new t.Event("open")),this},r.prototype.isOpen=function(){return!!this._map},r.prototype.remove=function(){return this._content&&s.remove(this._content),this._container&&(s.remove(this._container),delete this._container),this._map&&(this._map.off("move",this._update),this._map.off("click",this._onClickClose),delete this._map),this.fire(new t.Event("close")),this},r.prototype.getLngLat=function(){return this._lngLat},r.prototype.setLngLat=function(t){return this._lngLat=G.convert(t),this._pos=null,this._update(),this},r.prototype.setText=function(e){return this.setDOMContent(t.default.document.createTextNode(e))},r.prototype.setHTML=function(e){var r,n=t.default.document.createDocumentFragment(),i=t.default.document.createElement("body");for(i.innerHTML=e;r=i.firstChild;)n.appendChild(r);return this.setDOMContent(n)},r.prototype.setDOMContent=function(t){return this._createContent(),this._content.appendChild(t),this._update(),this},r.prototype._createContent=function(){this._content&&s.remove(this._content),this._content=s.create("div","mapboxgl-popup-content",this._container),this.options.closeButton&&(this._closeButton=s.create("button","mapboxgl-popup-close-button",this._content),this._closeButton.type="button",this._closeButton.setAttribute("aria-label","Close popup"),this._closeButton.innerHTML="&#215;",this._closeButton.addEventListener("click",this._onClickClose))},r.prototype._update=function(){if(this._map&&this._lngLat&&this._content){this._container||(this._container=s.create("div","mapboxgl-popup",this._map.getContainer()),this._tip=s.create("div","mapboxgl-popup-tip",this._container),this._container.appendChild(this._content)),this._map.transform.renderWorldCopies&&(this._lngLat=dn(this._lngLat,this._pos,this._map.transform));var e=this._pos=this._map.project(this._lngLat),r=this.options.anchor,n=function e(r){if(r){if("number"==typeof r){var n=Math.round(Math.sqrt(.5*Math.pow(r,2)));return{center:new t.default$1(0,0),top:new t.default$1(0,r),"top-left":new t.default$1(n,n),"top-right":new t.default$1(-n,n),bottom:new t.default$1(0,-r),"bottom-left":new t.default$1(n,-n),"bottom-right":new t.default$1(-n,-n),left:new t.default$1(r,0),right:new t.default$1(-r,0)}}if(r instanceof t.default$1||Array.isArray(r)){var i=t.default$1.convert(r);return{center:i,top:i,"top-left":i,"top-right":i,bottom:i,"bottom-left":i,"bottom-right":i,left:i,right:i}}return{center:t.default$1.convert(r.center||[0,0]),top:t.default$1.convert(r.top||[0,0]),"top-left":t.default$1.convert(r["top-left"]||[0,0]),"top-right":t.default$1.convert(r["top-right"]||[0,0]),bottom:t.default$1.convert(r.bottom||[0,0]),"bottom-left":t.default$1.convert(r["bottom-left"]||[0,0]),"bottom-right":t.default$1.convert(r["bottom-right"]||[0,0]),left:t.default$1.convert(r.left||[0,0]),right:t.default$1.convert(r.right||[0,0])}}return e(new t.default$1(0,0))}(this.options.offset);if(!r){var i,a=this._container.offsetWidth,o=this._container.offsetHeight;i=e.y+n.bottom.y<o?["top"]:e.y>this._map.transform.height-o?["bottom"]:[],e.x<a/2?i.push("left"):e.x>this._map.transform.width-a/2&&i.push("right"),r=0===i.length?"bottom":i.join("-")}var l=e.add(n[r]).round();s.setTransform(this._container,gn[r]+" translate("+l.x+"px,"+l.y+"px)"),mn(this._container,r,"popup")}},r.prototype._onClickClose=function(){this.remove()},r}(t.Evented),En={version:"0.45.0",supported:e,workerCount:Math.max(Math.floor(a.hardwareConcurrency/2),1),setRTLTextPlugin:t.setRTLTextPlugin,Map:un,NavigationControl:pn,GeolocateControl:bn,AttributionControl:nn,ScaleControl:wn,FullscreenControl:An,Popup:Sn,Marker:vn,Style:Je,LngLat:G,LngLatBounds:W,Point:t.default$1,Evented:t.Evented,config:m,get accessToken(){return m.ACCESS_TOKEN},set accessToken(t){m.ACCESS_TOKEN=t},workerUrl:""};return En}),n})}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],394:[function(t,e,r){"use strict";e.exports=function(t){for(var e=1<<t+1,r=new Array(e),n=0;n<e;++n)r[n]=a(t,n);return r};var n=t("convex-hull");function i(t,e,r){for(var n=new Array(t),i=0;i<t;++i)n[i]=0,i===e&&(n[i]+=.5),i===r&&(n[i]+=.5);return n}function a(t,e){if(0===e||e===(1<<t+1)-1)return[];for(var r=[],a=[],o=0;o<=t;++o)if(e&1<<o){r.push(i(t,o-1,o-1)),a.push(null);for(var s=0;s<=t;++s)~e&1<<s&&(r.push(i(t,o-1,s-1)),a.push([o,s]))}var l=n(r),c=[];t:for(o=0;o<l.length;++o){var u=l[o],h=[];for(s=0;s<u.length;++s){if(!a[u[s]])continue t;h.push(a[u[s]].slice())}c.push(h)}return c}},{"convex-hull":117}],395:[function(t,e,r){var n=t("./normalize"),i=t("gl-mat4/create"),a=t("gl-mat4/clone"),o=t("gl-mat4/determinant"),s=t("gl-mat4/invert"),l=t("gl-mat4/transpose"),c={length:t("gl-vec3/length"),normalize:t("gl-vec3/normalize"),dot:t("gl-vec3/dot"),cross:t("gl-vec3/cross")},u=i(),h=i(),f=[0,0,0,0],p=[[0,0,0],[0,0,0],[0,0,0]],d=[0,0,0];function g(t,e,r,n,i){t[0]=e[0]*n+r[0]*i,t[1]=e[1]*n+r[1]*i,t[2]=e[2]*n+r[2]*i}e.exports=function(t,e,r,i,m,v){if(e||(e=[0,0,0]),r||(r=[0,0,0]),i||(i=[0,0,0]),m||(m=[0,0,0,1]),v||(v=[0,0,0,1]),!n(u,t))return!1;if(a(h,u),h[3]=0,h[7]=0,h[11]=0,h[15]=1,Math.abs(o(h)<1e-8))return!1;var y,x,b,_,w,k,M,A=u[3],T=u[7],S=u[11],E=u[12],C=u[13],L=u[14],z=u[15];if(0!==A||0!==T||0!==S){if(f[0]=A,f[1]=T,f[2]=S,f[3]=z,!s(h,h))return!1;l(h,h),y=m,b=h,_=(x=f)[0],w=x[1],k=x[2],M=x[3],y[0]=b[0]*_+b[4]*w+b[8]*k+b[12]*M,y[1]=b[1]*_+b[5]*w+b[9]*k+b[13]*M,y[2]=b[2]*_+b[6]*w+b[10]*k+b[14]*M,y[3]=b[3]*_+b[7]*w+b[11]*k+b[15]*M}else m[0]=m[1]=m[2]=0,m[3]=1;if(e[0]=E,e[1]=C,e[2]=L,function(t,e){t[0][0]=e[0],t[0][1]=e[1],t[0][2]=e[2],t[1][0]=e[4],t[1][1]=e[5],t[1][2]=e[6],t[2][0]=e[8],t[2][1]=e[9],t[2][2]=e[10]}(p,u),r[0]=c.length(p[0]),c.normalize(p[0],p[0]),i[0]=c.dot(p[0],p[1]),g(p[1],p[1],p[0],1,-i[0]),r[1]=c.length(p[1]),c.normalize(p[1],p[1]),i[0]/=r[1],i[1]=c.dot(p[0],p[2]),g(p[2],p[2],p[0],1,-i[1]),i[2]=c.dot(p[1],p[2]),g(p[2],p[2],p[1],1,-i[2]),r[2]=c.length(p[2]),c.normalize(p[2],p[2]),i[1]/=r[2],i[2]/=r[2],c.cross(d,p[1],p[2]),c.dot(p[0],d)<0)for(var P=0;P<3;P++)r[P]*=-1,p[P][0]*=-1,p[P][1]*=-1,p[P][2]*=-1;return v[0]=.5*Math.sqrt(Math.max(1+p[0][0]-p[1][1]-p[2][2],0)),v[1]=.5*Math.sqrt(Math.max(1-p[0][0]+p[1][1]-p[2][2],0)),v[2]=.5*Math.sqrt(Math.max(1-p[0][0]-p[1][1]+p[2][2],0)),v[3]=.5*Math.sqrt(Math.max(1+p[0][0]+p[1][1]+p[2][2],0)),p[2][1]>p[1][2]&&(v[0]=-v[0]),p[0][2]>p[2][0]&&(v[1]=-v[1]),p[1][0]>p[0][1]&&(v[2]=-v[2]),!0}},{"./normalize":396,"gl-mat4/clone":248,"gl-mat4/create":249,"gl-mat4/determinant":250,"gl-mat4/invert":254,"gl-mat4/transpose":264,"gl-vec3/cross":314,"gl-vec3/dot":317,"gl-vec3/length":322,"gl-vec3/normalize":328}],396:[function(t,e,r){e.exports=function(t,e){var r=e[15];if(0===r)return!1;for(var n=1/r,i=0;i<16;i++)t[i]=e[i]*n;return!0}},{}],397:[function(t,e,r){var n=t("gl-vec3/lerp"),i=t("mat4-recompose"),a=t("mat4-decompose"),o=t("gl-mat4/determinant"),s=t("quat-slerp"),l=h(),c=h(),u=h();function h(){return{translate:f(),scale:f(1),skew:f(),perspective:[0,0,0,1],quaternion:[0,0,0,1]}}function f(t){return[t||0,t||0,t||0]}e.exports=function(t,e,r,h){if(0===o(e)||0===o(r))return!1;var f=a(e,l.translate,l.scale,l.skew,l.perspective,l.quaternion),p=a(r,c.translate,c.scale,c.skew,c.perspective,c.quaternion);return!(!f||!p||(n(u.translate,l.translate,c.translate,h),n(u.skew,l.skew,c.skew,h),n(u.scale,l.scale,c.scale,h),n(u.perspective,l.perspective,c.perspective,h),s(u.quaternion,l.quaternion,c.quaternion,h),i(t,u.translate,u.scale,u.skew,u.perspective,u.quaternion),0))}},{"gl-mat4/determinant":250,"gl-vec3/lerp":323,"mat4-decompose":395,"mat4-recompose":398,"quat-slerp":450}],398:[function(t,e,r){var n={identity:t("gl-mat4/identity"),translate:t("gl-mat4/translate"),multiply:t("gl-mat4/multiply"),create:t("gl-mat4/create"),scale:t("gl-mat4/scale"),fromRotationTranslation:t("gl-mat4/fromRotationTranslation")},i=(n.create(),n.create());e.exports=function(t,e,r,a,o,s){return n.identity(t),n.fromRotationTranslation(t,s,e),t[3]=o[0],t[7]=o[1],t[11]=o[2],t[15]=o[3],n.identity(i),0!==a[2]&&(i[9]=a[2],n.multiply(t,t,i)),0!==a[1]&&(i[9]=0,i[8]=a[1],n.multiply(t,t,i)),0!==a[0]&&(i[8]=0,i[4]=a[0],n.multiply(t,t,i)),n.scale(t,t,r),t}},{"gl-mat4/create":249,"gl-mat4/fromRotationTranslation":252,"gl-mat4/identity":253,"gl-mat4/multiply":256,"gl-mat4/scale":262,"gl-mat4/translate":263}],399:[function(t,e,r){"use strict";e.exports=Math.log2||function(t){return Math.log(t)*Math.LOG2E}},{}],400:[function(t,e,r){"use strict";var n=t("binary-search-bounds"),i=t("mat4-interpolate"),a=t("gl-mat4/invert"),o=t("gl-mat4/rotateX"),s=t("gl-mat4/rotateY"),l=t("gl-mat4/rotateZ"),c=t("gl-mat4/lookAt"),u=t("gl-mat4/translate"),h=(t("gl-mat4/scale"),t("gl-vec3/normalize")),f=[0,0,0];function p(t){this._components=t.slice(),this._time=[0],this.prevMatrix=t.slice(),this.nextMatrix=t.slice(),this.computedMatrix=t.slice(),this.computedInverse=t.slice(),this.computedEye=[0,0,0],this.computedUp=[0,0,0],this.computedCenter=[0,0,0],this.computedRadius=[0],this._limits=[-1/0,1/0]}e.exports=function(t){return new p((t=t||{}).matrix||[1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1])};var d=p.prototype;d.recalcMatrix=function(t){var e=this._time,r=n.le(e,t),o=this.computedMatrix;if(!(r<0)){var s=this._components;if(r===e.length-1)for(var l=16*r,c=0;c<16;++c)o[c]=s[l++];else{var u=e[r+1]-e[r],f=(l=16*r,this.prevMatrix),p=!0;for(c=0;c<16;++c)f[c]=s[l++];var d=this.nextMatrix;for(c=0;c<16;++c)d[c]=s[l++],p=p&&f[c]===d[c];if(u<1e-6||p)for(c=0;c<16;++c)o[c]=f[c];else i(o,f,d,(t-e[r])/u)}var g=this.computedUp;g[0]=o[1],g[1]=o[5],g[2]=o[9],h(g,g);var m=this.computedInverse;a(m,o);var v=this.computedEye,y=m[15];v[0]=m[12]/y,v[1]=m[13]/y,v[2]=m[14]/y;var x=this.computedCenter,b=Math.exp(this.computedRadius[0]);for(c=0;c<3;++c)x[c]=v[c]-o[2+4*c]*b}},d.idle=function(t){if(!(t<this.lastT())){for(var e=this._components,r=e.length-16,n=0;n<16;++n)e.push(e[r++]);this._time.push(t)}},d.flush=function(t){var e=n.gt(this._time,t)-2;e<0||(this._time.splice(0,e),this._components.splice(0,16*e))},d.lastT=function(){return this._time[this._time.length-1]},d.lookAt=function(t,e,r,n){this.recalcMatrix(t),e=e||this.computedEye,r=r||f,n=n||this.computedUp,this.setMatrix(t,c(this.computedMatrix,e,r,n));for(var i=0,a=0;a<3;++a)i+=Math.pow(r[a]-e[a],2);i=Math.log(Math.sqrt(i)),this.computedRadius[0]=i},d.rotate=function(t,e,r,n){this.recalcMatrix(t);var i=this.computedInverse;e&&s(i,i,e),r&&o(i,i,r),n&&l(i,i,n),this.setMatrix(t,a(this.computedMatrix,i))};var g=[0,0,0];d.pan=function(t,e,r,n){g[0]=-(e||0),g[1]=-(r||0),g[2]=-(n||0),this.recalcMatrix(t);var i=this.computedInverse;u(i,i,g),this.setMatrix(t,a(i,i))},d.translate=function(t,e,r,n){g[0]=e||0,g[1]=r||0,g[2]=n||0,this.recalcMatrix(t);var i=this.computedMatrix;u(i,i,g),this.setMatrix(t,i)},d.setMatrix=function(t,e){if(!(t<this.lastT())){this._time.push(t);for(var r=0;r<16;++r)this._components.push(e[r])}},d.setDistance=function(t,e){this.computedRadius[0]=e},d.setDistanceLimits=function(t,e){var r=this._limits;r[0]=t,r[1]=e},d.getDistanceLimits=function(t){var e=this._limits;return t?(t[0]=e[0],t[1]=e[1],t):e}},{"binary-search-bounds":79,"gl-mat4/invert":254,"gl-mat4/lookAt":255,"gl-mat4/rotateX":259,"gl-mat4/rotateY":260,"gl-mat4/rotateZ":261,"gl-mat4/scale":262,"gl-mat4/translate":263,"gl-vec3/normalize":328,"mat4-interpolate":397}],401:[function(t,e,r){"use strict";e.exports=function(t){var e=t.length;if(e<3){for(var r=new Array(e),i=0;i<e;++i)r[i]=i;return 2===e&&t[0][0]===t[1][0]&&t[0][1]===t[1][1]?[0]:r}for(var a=new Array(e),i=0;i<e;++i)a[i]=i;a.sort(function(e,r){var n=t[e][0]-t[r][0];return n||t[e][1]-t[r][1]});for(var o=[a[0],a[1]],s=[a[0],a[1]],i=2;i<e;++i){for(var l=a[i],c=t[l],u=o.length;u>1&&n(t[o[u-2]],t[o[u-1]],c)<=0;)u-=1,o.pop();for(o.push(l),u=s.length;u>1&&n(t[s[u-2]],t[s[u-1]],c)>=0;)u-=1,s.pop();s.push(l)}for(var r=new Array(s.length+o.length-2),h=0,i=0,f=o.length;i<f;++i)r[h++]=o[i];for(var p=s.length-2;p>0;--p)r[h++]=s[p];return r};var n=t("robust-orientation")[3]},{"robust-orientation":471}],402:[function(t,e,r){"use strict";e.exports=function(t,e){e||(e=t,t=window);var r=0,i=0,a=0,o={shift:!1,alt:!1,control:!1,meta:!1},s=!1;function l(t){var e=!1;return"altKey"in t&&(e=e||t.altKey!==o.alt,o.alt=!!t.altKey),"shiftKey"in t&&(e=e||t.shiftKey!==o.shift,o.shift=!!t.shiftKey),"ctrlKey"in t&&(e=e||t.ctrlKey!==o.control,o.control=!!t.ctrlKey),"metaKey"in t&&(e=e||t.metaKey!==o.meta,o.meta=!!t.metaKey),e}function c(t,s){var c=n.x(s),u=n.y(s);"buttons"in s&&(t=0|s.buttons),(t!==r||c!==i||u!==a||l(s))&&(r=0|t,i=c||0,a=u||0,e&&e(r,i,a,o))}function u(t){c(0,t)}function h(){(r||i||a||o.shift||o.alt||o.meta||o.control)&&(i=a=0,r=0,o.shift=o.alt=o.control=o.meta=!1,e&&e(0,0,0,o))}function f(t){l(t)&&e&&e(r,i,a,o)}function p(t){0===n.buttons(t)?c(0,t):c(r,t)}function d(t){c(r|n.buttons(t),t)}function g(t){c(r&~n.buttons(t),t)}function m(){s||(s=!0,t.addEventListener("mousemove",p),t.addEventListener("mousedown",d),t.addEventListener("mouseup",g),t.addEventListener("mouseleave",u),t.addEventListener("mouseenter",u),t.addEventListener("mouseout",u),t.addEventListener("mouseover",u),t.addEventListener("blur",h),t.addEventListener("keyup",f),t.addEventListener("keydown",f),t.addEventListener("keypress",f),t!==window&&(window.addEventListener("blur",h),window.addEventListener("keyup",f),window.addEventListener("keydown",f),window.addEventListener("keypress",f)))}m();var v={element:t};return Object.defineProperties(v,{enabled:{get:function(){return s},set:function(e){e?m():s&&(s=!1,t.removeEventListener("mousemove",p),t.removeEventListener("mousedown",d),t.removeEventListener("mouseup",g),t.removeEventListener("mouseleave",u),t.removeEventListener("mouseenter",u),t.removeEventListener("mouseout",u),t.removeEventListener("mouseover",u),t.removeEventListener("blur",h),t.removeEventListener("keyup",f),t.removeEventListener("keydown",f),t.removeEventListener("keypress",f),t!==window&&(window.removeEventListener("blur",h),window.removeEventListener("keyup",f),window.removeEventListener("keydown",f),window.removeEventListener("keypress",f)))},enumerable:!0},buttons:{get:function(){return r},enumerable:!0},x:{get:function(){return i},enumerable:!0},y:{get:function(){return a},enumerable:!0},mods:{get:function(){return o},enumerable:!0}}),v};var n=t("mouse-event")},{"mouse-event":404}],403:[function(t,e,r){var n={left:0,top:0};e.exports=function(t,e,r){e=e||t.currentTarget||t.srcElement,Array.isArray(r)||(r=[0,0]);var i=t.clientX||0,a=t.clientY||0,o=(s=e,s===window||s===document||s===document.body?n:s.getBoundingClientRect());var s;return r[0]=i-o.left,r[1]=a-o.top,r}},{}],404:[function(t,e,r){"use strict";function n(t){return t.target||t.srcElement||window}r.buttons=function(t){if("object"==typeof t){if("buttons"in t)return t.buttons;if("which"in t){if(2===(e=t.which))return 4;if(3===e)return 2;if(e>0)return 1<<e-1}else if("button"in t){var e;if(1===(e=t.button))return 4;if(2===e)return 2;if(e>=0)return 1<<e}}return 0},r.element=n,r.x=function(t){if("object"==typeof t){if("offsetX"in t)return t.offsetX;var e=n(t).getBoundingClientRect();return t.clientX-e.left}return 0},r.y=function(t){if("object"==typeof t){if("offsetY"in t)return t.offsetY;var e=n(t).getBoundingClientRect();return t.clientY-e.top}return 0}},{}],405:[function(t,e,r){"use strict";var n=t("to-px");e.exports=function(t,e,r){"function"==typeof t&&(r=!!e,e=t,t=window);var i=n("ex",t),a=function(t){r&&t.preventDefault();var n=t.deltaX||0,a=t.deltaY||0,o=t.deltaZ||0,s=t.deltaMode,l=1;switch(s){case 1:l=i;break;case 2:l=window.innerHeight}if(a*=l,o*=l,(n*=l)||a||o)return e(n,a,o,t)};return t.addEventListener("wheel",a),a}},{"to-px":501}],406:[function(t,e,r){"use strict";var n=t("typedarray-pool");function i(t){return"a"+t}function a(t){return"d"+t}function o(t,e){return"c"+t+"_"+e}function s(t){return"s"+t}function l(t,e){return"t"+t+"_"+e}function c(t){return"o"+t}function u(t){return"x"+t}function h(t){return"p"+t}function f(t,e){return"d"+t+"_"+e}function p(t){return"i"+t}function d(t,e){return"u"+t+"_"+e}function g(t){return"b"+t}function m(t){return"y"+t}function v(t){return"e"+t}function y(t){return"v"+t}e.exports=function(t){function e(t){throw new Error("ndarray-extract-contour: "+t)}"object"!=typeof t&&e("Must specify arguments");var r=t.order;Array.isArray(r)||e("Must specify order");var T=t.arrayArguments||1;T<1&&e("Must have at least one array argument");var S=t.scalarArguments||0;S<0&&e("Scalar arg count must be > 0");"function"!=typeof t.vertex&&e("Must specify vertex creation function");"function"!=typeof t.cell&&e("Must specify cell creation function");"function"!=typeof t.phase&&e("Must specify phase function");for(var E=t.getters||[],C=new Array(T),L=0;L<T;++L)E.indexOf(L)>=0?C[L]=!0:C[L]=!1;return function(t,e,r,T,S,E){var C=E.length,L=S.length;if(L<2)throw new Error("ndarray-extract-contour: Dimension must be at least 2");for(var z="extractContour"+S.join("_"),P=[],I=[],O=[],D=0;D<C;++D)O.push(i(D));for(var D=0;D<T;++D)O.push(u(D));for(var D=0;D<L;++D)I.push(s(D)+"="+i(0)+".shape["+D+"]|0");for(var D=0;D<C;++D){I.push(a(D)+"="+i(D)+".data",c(D)+"="+i(D)+".offset|0");for(var R=0;R<L;++R)I.push(l(D,R)+"="+i(D)+".stride["+R+"]|0")}for(var D=0;D<C;++D){I.push(h(D)+"="+c(D)),I.push(o(D,0));for(var R=1;R<1<<L;++R){for(var B=[],F=0;F<L;++F)R&1<<F&&B.push("-"+l(D,F));I.push(f(D,R)+"=("+B.join("")+")|0"),I.push(o(D,R)+"=0")}}for(var D=0;D<C;++D)for(var R=0;R<L;++R){var N=[l(D,S[R])];R>0&&N.push(l(D,S[R-1])+"*"+s(S[R-1])),I.push(d(D,S[R])+"=("+N.join("-")+")|0")}for(var D=0;D<L;++D)I.push(p(D)+"=0");I.push(_+"=0");for(var j=["2"],D=L-2;D>=0;--D)j.push(s(S[D]));I.push(w+"=("+j.join("*")+")|0",b+"=mallocUint32("+w+")",x+"=mallocUint32("+w+")",k+"=0"),I.push(g(0)+"=0");for(var R=1;R<1<<L;++R){for(var V=[],U=[],F=0;F<L;++F)R&1<<F&&(0===U.length?V.push("1"):V.unshift(U.join("*"))),U.push(s(S[F]));var q="";V[0].indexOf(s(S[L-2]))<0&&(q="-");var H=A(L,R,S);I.push(v(H)+"=(-"+V.join("-")+")|0",m(H)+"=("+q+V.join("-")+")|0",g(H)+"=0")}function G(t,e){P.push("for(",p(S[t]),"=",e,";",p(S[t]),"<",s(S[t]),";","++",p(S[t]),"){")}function W(t){for(var e=0;e<C;++e)P.push(h(e),"+=",d(e,S[t]),";");P.push("}")}function Y(){for(var t=1;t<1<<L;++t)P.push(M,"=",v(t),";",v(t),"=",m(t),";",m(t),"=",M,";")}I.push(y(0)+"=0",M+"=0"),function t(e,r){if(e<0)return void function(t){for(var e=0;e<C;++e)E[e]?P.push(o(e,0),"=",a(e),".get(",h(e),");"):P.push(o(e,0),"=",a(e),"[",h(e),"];");for(var r=[],e=0;e<C;++e)r.push(o(e,0));for(var e=0;e<T;++e)r.push(u(e));P.push(g(0),"=",b,"[",k,"]=phase(",r.join(),");");for(var n=1;n<1<<L;++n)P.push(g(n),"=",b,"[",k,"+",v(n),"];");for(var i=[],n=1;n<1<<L;++n)i.push("("+g(0)+"!=="+g(n)+")");P.push("if(",i.join("||"),"){");for(var s=[],e=0;e<L;++e)s.push(p(e));for(var e=0;e<C;++e){s.push(o(e,0));for(var n=1;n<1<<L;++n)E[e]?P.push(o(e,n),"=",a(e),".get(",h(e),"+",f(e,n),");"):P.push(o(e,n),"=",a(e),"[",h(e),"+",f(e,n),"];"),s.push(o(e,n))}for(var e=0;e<1<<L;++e)s.push(g(e));for(var e=0;e<T;++e)s.push(u(e));P.push("vertex(",s.join(),");",y(0),"=",x,"[",k,"]=",_,"++;");for(var l=(1<<L)-1,c=g(l),n=0;n<L;++n)if(0==(t&~(1<<n))){for(var d=l^1<<n,m=g(d),w=[],M=d;M>0;M=M-1&d)w.push(x+"["+k+"+"+v(M)+"]");w.push(y(0));for(var M=0;M<C;++M)1&n?w.push(o(M,l),o(M,d)):w.push(o(M,d),o(M,l));1&n?w.push(c,m):w.push(m,c);for(var M=0;M<T;++M)w.push(u(M));P.push("if(",c,"!==",m,"){","face(",w.join(),")}")}P.push("}",k,"+=1;")}(r);!function(t){for(var e=t-1;e>=0;--e)G(e,0);for(var r=[],e=0;e<C;++e)E[e]?r.push(a(e)+".get("+h(e)+")"):r.push(a(e)+"["+h(e)+"]");for(var e=0;e<T;++e)r.push(u(e));P.push(b,"[",k,"++]=phase(",r.join(),");");for(var e=0;e<t;++e)W(e);for(var n=0;n<C;++n)P.push(h(n),"+=",d(n,S[t]),";")}(e);P.push("if(",s(S[e]),">0){",p(S[e]),"=1;");t(e-1,r|1<<S[e]);for(var n=0;n<C;++n)P.push(h(n),"+=",d(n,S[e]),";");e===L-1&&(P.push(k,"=0;"),Y());G(e,2);t(e-1,r);e===L-1&&(P.push("if(",p(S[L-1]),"&1){",k,"=0;}"),Y());W(e);P.push("}")}(L-1,0),P.push("freeUint32(",x,");freeUint32(",b,");");var X=["'use strict';","function ",z,"(",O.join(),"){","var ",I.join(),";",P.join(""),"}","return ",z].join("");return new Function("vertex","face","phase","mallocUint32","freeUint32",X)(t,e,r,n.mallocUint32,n.freeUint32)}(t.vertex,t.cell,t.phase,S,r,C)};var x="V",b="P",_="N",w="Q",k="X",M="T";function A(t,e,r){for(var n=0,i=0;i<t;++i)e&1<<i&&(n|=1<<r[i]);return n}},{"typedarray-pool":507}],407:[function(t,e,r){"use strict";var n=t("cwise/lib/wrapper")({args:["index","array","scalar"],pre:{body:"{}",args:[],thisVars:[],localVars:[]},body:{body:"{_inline_1_arg1_=_inline_1_arg2_.apply(void 0,_inline_1_arg0_)}",args:[{name:"_inline_1_arg0_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_1_arg1_",lvalue:!0,rvalue:!1,count:1},{name:"_inline_1_arg2_",lvalue:!1,rvalue:!0,count:1}],thisVars:[],localVars:[]},post:{body:"{}",args:[],thisVars:[],localVars:[]},debug:!1,funcName:"cwise",blockSize:64});e.exports=function(t,e){return n(t,e),t}},{"cwise/lib/wrapper":136}],408:[function(t,e,r){"use strict";e.exports=function(t,e,r){if(Array.isArray(r)){if(r.length!==e.dimension)throw new Error("ndarray-gradient: invalid boundary conditions")}else r=n(e.dimension,"string"==typeof r?r:"clamp");if(t.dimension!==e.dimension+1)throw new Error("ndarray-gradient: output dimension must be +1 input dimension");if(t.shape[e.dimension]!==e.dimension)throw new Error("ndarray-gradient: output shape must match input shape");for(var i=0;i<e.dimension;++i)if(t.shape[i]!==e.shape[i])throw new Error("ndarray-gradient: shape mismatch");if(0===e.size)return t;if(e.dimension<=0)return t.set(0),t;return function(t){var e=t.join();if(v=o[e])return v;var r=t.length,n=["function gradient(dst,src){var s=src.shape.slice();"];function i(e){for(var i=r-e.length,a=[],o=[],s=[],l=0;l<r;++l)e.indexOf(l+1)>=0?s.push("0"):e.indexOf(-(l+1))>=0?s.push("s["+l+"]-1"):(s.push("-1"),a.push("1"),o.push("s["+l+"]-2"));var c=".lo("+a.join()+").hi("+o.join()+")";if(0===a.length&&(c=""),i>0){n.push("if(1");for(var l=0;l<r;++l)e.indexOf(l+1)>=0||e.indexOf(-(l+1))>=0||n.push("&&s[",l,"]>2");n.push("){grad",i,"(src.pick(",s.join(),")",c);for(var l=0;l<r;++l)e.indexOf(l+1)>=0||e.indexOf(-(l+1))>=0||n.push(",dst.pick(",s.join(),",",l,")",c);n.push(");")}for(var l=0;l<e.length;++l){var u=Math.abs(e[l])-1,h="dst.pick("+s.join()+","+u+")"+c;switch(t[u]){case"clamp":var f=s.slice(),p=s.slice();e[l]<0?f[u]="s["+u+"]-2":p[u]="1",0===i?n.push("if(s[",u,"]>1){dst.set(",s.join(),",",u,",0.5*(src.get(",f.join(),")-src.get(",p.join(),")))}else{dst.set(",s.join(),",",u,",0)};"):n.push("if(s[",u,"]>1){diff(",h,",src.pick(",f.join(),")",c,",src.pick(",p.join(),")",c,");}else{zero(",h,");};");break;case"mirror":0===i?n.push("dst.set(",s.join(),",",u,",0);"):n.push("zero(",h,");");break;case"wrap":var d=s.slice(),g=s.slice();e[l]<0?(d[u]="s["+u+"]-2",g[u]="0"):(d[u]="s["+u+"]-1",g[u]="1"),0===i?n.push("if(s[",u,"]>2){dst.set(",s.join(),",",u,",0.5*(src.get(",d.join(),")-src.get(",g.join(),")))}else{dst.set(",s.join(),",",u,",0)};"):n.push("if(s[",u,"]>2){diff(",h,",src.pick(",d.join(),")",c,",src.pick(",g.join(),")",c,");}else{zero(",h,");};");break;default:throw new Error("ndarray-gradient: Invalid boundary condition")}}i>0&&n.push("};")}for(var s=0;s<1<<r;++s){for(var h=[],f=0;f<r;++f)s&1<<f&&h.push(f+1);for(var p=0;p<1<<h.length;++p){for(var d=h.slice(),f=0;f<h.length;++f)p&1<<f&&(d[f]=-d[f]);i(d)}}n.push("return dst;};return gradient");for(var g=["diff","zero"],m=[l,c],s=1;s<=r;++s)g.push("grad"+s),m.push(u(s));g.push(n.join(""));var v=Function.apply(void 0,g).apply(void 0,m);return a[e]=v,v}(r)(t,e)};var n=t("dup"),i=t("cwise-compiler"),a={},o={},s={body:"",args:[],thisVars:[],localVars:[]},l=i({args:["array","array","array"],pre:s,post:s,body:{args:[{name:"out",lvalue:!0,rvalue:!1,count:1},{name:"left",lvalue:!1,rvalue:!0,count:1},{name:"right",lvalue:!1,rvalue:!0,count:1}],body:"out=0.5*(left-right)",thisVars:[],localVars:[]},funcName:"cdiff"}),c=i({args:["array"],pre:s,post:s,body:{args:[{name:"out",lvalue:!0,rvalue:!1,count:1}],body:"out=0",thisVars:[],localVars:[]},funcName:"zero"});function u(t){if(t in a)return a[t];for(var e=[],r=0;r<t;++r)e.push("out",r,"s=0.5*(inp",r,"l-inp",r,"r);");var o=["array"],l=["junk"];for(r=0;r<t;++r){o.push("array"),l.push("out"+r+"s");var c=n(t);c[r]=-1,o.push({array:0,offset:c.slice()}),c[r]=1,o.push({array:0,offset:c.slice()}),l.push("inp"+r+"l","inp"+r+"r")}return a[t]=i({args:o,pre:s,post:s,body:{body:e.join(""),args:l.map(function(t){return{name:t,lvalue:0===t.indexOf("out"),rvalue:0===t.indexOf("inp"),count:"junk"!==t|0}}),thisVars:[],localVars:[]},funcName:"fdTemplate"+t})}},{"cwise-compiler":133,dup:154}],409:[function(t,e,r){"use strict";var n=t("ndarray-warp"),i=t("gl-matrix-invert");e.exports=function(t,e,r){var a=e.dimension,o=i([],r);return n(t,e,function(t,e){for(var r=0;r<a;++r){t[r]=o[(a+1)*a+r];for(var n=0;n<a;++n)t[r]+=o[(a+1)*n+r]*e[n]}var i=o[(a+1)*(a+1)-1];for(n=0;n<a;++n)i+=o[(a+1)*n+a]*e[n];var s=1/i;for(r=0;r<a;++r)t[r]*=s;return t}),t}},{"gl-matrix-invert":265,"ndarray-warp":416}],410:[function(t,e,r){"use strict";function n(t,e){var r=Math.floor(e),n=e-r,i=0<=r&&r<t.shape[0],a=0<=r+1&&r+1<t.shape[0];return(1-n)*(i?+t.get(r):0)+n*(a?+t.get(r+1):0)}function i(t,e,r){var n=Math.floor(e),i=e-n,a=0<=n&&n<t.shape[0],o=0<=n+1&&n+1<t.shape[0],s=Math.floor(r),l=r-s,c=0<=s&&s<t.shape[1],u=0<=s+1&&s+1<t.shape[1],h=a&&c?t.get(n,s):0,f=a&&u?t.get(n,s+1):0;return(1-l)*((1-i)*h+i*(o&&c?t.get(n+1,s):0))+l*((1-i)*f+i*(o&&u?t.get(n+1,s+1):0))}function a(t,e,r,n){var i=Math.floor(e),a=e-i,o=0<=i&&i<t.shape[0],s=0<=i+1&&i+1<t.shape[0],l=Math.floor(r),c=r-l,u=0<=l&&l<t.shape[1],h=0<=l+1&&l+1<t.shape[1],f=Math.floor(n),p=n-f,d=0<=f&&f<t.shape[2],g=0<=f+1&&f+1<t.shape[2],m=o&&u&&d?t.get(i,l,f):0,v=o&&h&&d?t.get(i,l+1,f):0,y=s&&u&&d?t.get(i+1,l,f):0,x=s&&h&&d?t.get(i+1,l+1,f):0,b=o&&u&&g?t.get(i,l,f+1):0,_=o&&h&&g?t.get(i,l+1,f+1):0;return(1-p)*((1-c)*((1-a)*m+a*y)+c*((1-a)*v+a*x))+p*((1-c)*((1-a)*b+a*(s&&u&&g?t.get(i+1,l,f+1):0))+c*((1-a)*_+a*(s&&h&&g?t.get(i+1,l+1,f+1):0)))}e.exports=function(t,e,r,o){switch(t.shape.length){case 0:return 0;case 1:return n(t,e);case 2:return i(t,e,r);case 3:return a(t,e,r,o);default:return function(t){var e,r,n=0|t.shape.length,i=new Array(n),a=new Array(n),o=new Array(n),s=new Array(n);for(e=0;e<n;++e)r=+arguments[e+1],i[e]=Math.floor(r),a[e]=r-i[e],o[e]=0<=i[e]&&i[e]<t.shape[e],s[e]=0<=i[e]+1&&i[e]+1<t.shape[e];var l,c,u,h=0;t:for(e=0;e<1<<n;++e){for(c=1,u=t.offset,l=0;l<n;++l)if(e&1<<l){if(!s[l])continue t;c*=a[l],u+=t.stride[l]*(i[l]+1)}else{if(!o[l])continue t;c*=1-a[l],u+=t.stride[l]*i[l]}h+=c*t.data[u]}return h}.apply(void 0,arguments)}},e.exports.d1=n,e.exports.d2=i,e.exports.d3=a},{}],411:[function(t,e,r){"use strict";var n=t("cwise-compiler"),i={body:"",args:[],thisVars:[],localVars:[]};function a(t){if(!t)return i;for(var e=0;e<t.args.length;++e){var r=t.args[e];t.args[e]=0===e?{name:r,lvalue:!0,rvalue:!!t.rvalue,count:t.count||1}:{name:r,lvalue:!1,rvalue:!0,count:1}}return t.thisVars||(t.thisVars=[]),t.localVars||(t.localVars=[]),t}function o(t){for(var e=[],r=0;r<t.args.length;++r)e.push("a"+r);return new Function("P",["return function ",t.funcName,"_ndarrayops(",e.join(","),") {P(",e.join(","),");return a0}"].join(""))(function(t){return n({args:t.args,pre:a(t.pre),body:a(t.body),post:a(t.proc),funcName:t.funcName})}(t))}var s={add:"+",sub:"-",mul:"*",div:"/",mod:"%",band:"&",bor:"|",bxor:"^",lshift:"<<",rshift:">>",rrshift:">>>"};!function(){for(var t in s){var e=s[t];r[t]=o({args:["array","array","array"],body:{args:["a","b","c"],body:"a=b"+e+"c"},funcName:t}),r[t+"eq"]=o({args:["array","array"],body:{args:["a","b"],body:"a"+e+"=b"},rvalue:!0,funcName:t+"eq"}),r[t+"s"]=o({args:["array","array","scalar"],body:{args:["a","b","s"],body:"a=b"+e+"s"},funcName:t+"s"}),r[t+"seq"]=o({args:["array","scalar"],body:{args:["a","s"],body:"a"+e+"=s"},rvalue:!0,funcName:t+"seq"})}}();var l={not:"!",bnot:"~",neg:"-",recip:"1.0/"};!function(){for(var t in l){var e=l[t];r[t]=o({args:["array","array"],body:{args:["a","b"],body:"a="+e+"b"},funcName:t}),r[t+"eq"]=o({args:["array"],body:{args:["a"],body:"a="+e+"a"},rvalue:!0,count:2,funcName:t+"eq"})}}();var c={and:"&&",or:"||",eq:"===",neq:"!==",lt:"<",gt:">",leq:"<=",geq:">="};!function(){for(var t in c){var e=c[t];r[t]=o({args:["array","array","array"],body:{args:["a","b","c"],body:"a=b"+e+"c"},funcName:t}),r[t+"s"]=o({args:["array","array","scalar"],body:{args:["a","b","s"],body:"a=b"+e+"s"},funcName:t+"s"}),r[t+"eq"]=o({args:["array","array"],body:{args:["a","b"],body:"a=a"+e+"b"},rvalue:!0,count:2,funcName:t+"eq"}),r[t+"seq"]=o({args:["array","scalar"],body:{args:["a","s"],body:"a=a"+e+"s"},rvalue:!0,count:2,funcName:t+"seq"})}}();var u=["abs","acos","asin","atan","ceil","cos","exp","floor","log","round","sin","sqrt","tan"];!function(){for(var t=0;t<u.length;++t){var e=u[t];r[e]=o({args:["array","array"],pre:{args:[],body:"this_f=Math."+e,thisVars:["this_f"]},body:{args:["a","b"],body:"a=this_f(b)",thisVars:["this_f"]},funcName:e}),r[e+"eq"]=o({args:["array"],pre:{args:[],body:"this_f=Math."+e,thisVars:["this_f"]},body:{args:["a"],body:"a=this_f(a)",thisVars:["this_f"]},rvalue:!0,count:2,funcName:e+"eq"})}}();var h=["max","min","atan2","pow"];!function(){for(var t=0;t<h.length;++t){var e=h[t];r[e]=o({args:["array","array","array"],pre:{args:[],body:"this_f=Math."+e,thisVars:["this_f"]},body:{args:["a","b","c"],body:"a=this_f(b,c)",thisVars:["this_f"]},funcName:e}),r[e+"s"]=o({args:["array","array","scalar"],pre:{args:[],body:"this_f=Math."+e,thisVars:["this_f"]},body:{args:["a","b","c"],body:"a=this_f(b,c)",thisVars:["this_f"]},funcName:e+"s"}),r[e+"eq"]=o({args:["array","array"],pre:{args:[],body:"this_f=Math."+e,thisVars:["this_f"]},body:{args:["a","b"],body:"a=this_f(a,b)",thisVars:["this_f"]},rvalue:!0,count:2,funcName:e+"eq"}),r[e+"seq"]=o({args:["array","scalar"],pre:{args:[],body:"this_f=Math."+e,thisVars:["this_f"]},body:{args:["a","b"],body:"a=this_f(a,b)",thisVars:["this_f"]},rvalue:!0,count:2,funcName:e+"seq"})}}();var f=["atan2","pow"];!function(){for(var t=0;t<f.length;++t){var e=f[t];r[e+"op"]=o({args:["array","array","array"],pre:{args:[],body:"this_f=Math."+e,thisVars:["this_f"]},body:{args:["a","b","c"],body:"a=this_f(c,b)",thisVars:["this_f"]},funcName:e+"op"}),r[e+"ops"]=o({args:["array","array","scalar"],pre:{args:[],body:"this_f=Math."+e,thisVars:["this_f"]},body:{args:["a","b","c"],body:"a=this_f(c,b)",thisVars:["this_f"]},funcName:e+"ops"}),r[e+"opeq"]=o({args:["array","array"],pre:{args:[],body:"this_f=Math."+e,thisVars:["this_f"]},body:{args:["a","b"],body:"a=this_f(b,a)",thisVars:["this_f"]},rvalue:!0,count:2,funcName:e+"opeq"}),r[e+"opseq"]=o({args:["array","scalar"],pre:{args:[],body:"this_f=Math."+e,thisVars:["this_f"]},body:{args:["a","b"],body:"a=this_f(b,a)",thisVars:["this_f"]},rvalue:!0,count:2,funcName:e+"opseq"})}}(),r.any=n({args:["array"],pre:i,body:{args:[{name:"a",lvalue:!1,rvalue:!0,count:1}],body:"if(a){return true}",localVars:[],thisVars:[]},post:{args:[],localVars:[],thisVars:[],body:"return false"},funcName:"any"}),r.all=n({args:["array"],pre:i,body:{args:[{name:"x",lvalue:!1,rvalue:!0,count:1}],body:"if(!x){return false}",localVars:[],thisVars:[]},post:{args:[],localVars:[],thisVars:[],body:"return true"},funcName:"all"}),r.sum=n({args:["array"],pre:{args:[],localVars:[],thisVars:["this_s"],body:"this_s=0"},body:{args:[{name:"a",lvalue:!1,rvalue:!0,count:1}],body:"this_s+=a",localVars:[],thisVars:["this_s"]},post:{args:[],localVars:[],thisVars:["this_s"],body:"return this_s"},funcName:"sum"}),r.prod=n({args:["array"],pre:{args:[],localVars:[],thisVars:["this_s"],body:"this_s=1"},body:{args:[{name:"a",lvalue:!1,rvalue:!0,count:1}],body:"this_s*=a",localVars:[],thisVars:["this_s"]},post:{args:[],localVars:[],thisVars:["this_s"],body:"return this_s"},funcName:"prod"}),r.norm2squared=n({args:["array"],pre:{args:[],localVars:[],thisVars:["this_s"],body:"this_s=0"},body:{args:[{name:"a",lvalue:!1,rvalue:!0,count:2}],body:"this_s+=a*a",localVars:[],thisVars:["this_s"]},post:{args:[],localVars:[],thisVars:["this_s"],body:"return this_s"},funcName:"norm2squared"}),r.norm2=n({args:["array"],pre:{args:[],localVars:[],thisVars:["this_s"],body:"this_s=0"},body:{args:[{name:"a",lvalue:!1,rvalue:!0,count:2}],body:"this_s+=a*a",localVars:[],thisVars:["this_s"]},post:{args:[],localVars:[],thisVars:["this_s"],body:"return Math.sqrt(this_s)"},funcName:"norm2"}),r.norminf=n({args:["array"],pre:{args:[],localVars:[],thisVars:["this_s"],body:"this_s=0"},body:{args:[{name:"a",lvalue:!1,rvalue:!0,count:4}],body:"if(-a>this_s){this_s=-a}else if(a>this_s){this_s=a}",localVars:[],thisVars:["this_s"]},post:{args:[],localVars:[],thisVars:["this_s"],body:"return this_s"},funcName:"norminf"}),r.norm1=n({args:["array"],pre:{args:[],localVars:[],thisVars:["this_s"],body:"this_s=0"},body:{args:[{name:"a",lvalue:!1,rvalue:!0,count:3}],body:"this_s+=a<0?-a:a",localVars:[],thisVars:["this_s"]},post:{args:[],localVars:[],thisVars:["this_s"],body:"return this_s"},funcName:"norm1"}),r.sup=n({args:["array"],pre:{body:"this_h=-Infinity",args:[],thisVars:["this_h"],localVars:[]},body:{body:"if(_inline_1_arg0_>this_h)this_h=_inline_1_arg0_",args:[{name:"_inline_1_arg0_",lvalue:!1,rvalue:!0,count:2}],thisVars:["this_h"],localVars:[]},post:{body:"return this_h",args:[],thisVars:["this_h"],localVars:[]}}),r.inf=n({args:["array"],pre:{body:"this_h=Infinity",args:[],thisVars:["this_h"],localVars:[]},body:{body:"if(_inline_1_arg0_<this_h)this_h=_inline_1_arg0_",args:[{name:"_inline_1_arg0_",lvalue:!1,rvalue:!0,count:2}],thisVars:["this_h"],localVars:[]},post:{body:"return this_h",args:[],thisVars:["this_h"],localVars:[]}}),r.argmin=n({args:["index","array","shape"],pre:{body:"{this_v=Infinity;this_i=_inline_0_arg2_.slice(0)}",args:[{name:"_inline_0_arg0_",lvalue:!1,rvalue:!1,count:0},{name:"_inline_0_arg1_",lvalue:!1,rvalue:!1,count:0},{name:"_inline_0_arg2_",lvalue:!1,rvalue:!0,count:1}],thisVars:["this_i","this_v"],localVars:[]},body:{body:"{if(_inline_1_arg1_<this_v){this_v=_inline_1_arg1_;for(var _inline_1_k=0;_inline_1_k<_inline_1_arg0_.length;++_inline_1_k){this_i[_inline_1_k]=_inline_1_arg0_[_inline_1_k]}}}",args:[{name:"_inline_1_arg0_",lvalue:!1,rvalue:!0,count:2},{name:"_inline_1_arg1_",lvalue:!1,rvalue:!0,count:2}],thisVars:["this_i","this_v"],localVars:["_inline_1_k"]},post:{body:"{return this_i}",args:[],thisVars:["this_i"],localVars:[]}}),r.argmax=n({args:["index","array","shape"],pre:{body:"{this_v=-Infinity;this_i=_inline_0_arg2_.slice(0)}",args:[{name:"_inline_0_arg0_",lvalue:!1,rvalue:!1,count:0},{name:"_inline_0_arg1_",lvalue:!1,rvalue:!1,count:0},{name:"_inline_0_arg2_",lvalue:!1,rvalue:!0,count:1}],thisVars:["this_i","this_v"],localVars:[]},body:{body:"{if(_inline_1_arg1_>this_v){this_v=_inline_1_arg1_;for(var _inline_1_k=0;_inline_1_k<_inline_1_arg0_.length;++_inline_1_k){this_i[_inline_1_k]=_inline_1_arg0_[_inline_1_k]}}}",args:[{name:"_inline_1_arg0_",lvalue:!1,rvalue:!0,count:2},{name:"_inline_1_arg1_",lvalue:!1,rvalue:!0,count:2}],thisVars:["this_i","this_v"],localVars:["_inline_1_k"]},post:{body:"{return this_i}",args:[],thisVars:["this_i"],localVars:[]}}),r.random=o({args:["array"],pre:{args:[],body:"this_f=Math.random",thisVars:["this_f"]},body:{args:["a"],body:"a=this_f()",thisVars:["this_f"]},funcName:"random"}),r.assign=o({args:["array","array"],body:{args:["a","b"],body:"a=b"},funcName:"assign"}),r.assigns=o({args:["array","scalar"],body:{args:["a","b"],body:"a=b"},funcName:"assigns"}),r.equals=n({args:["array","array"],pre:i,body:{args:[{name:"x",lvalue:!1,rvalue:!0,count:1},{name:"y",lvalue:!1,rvalue:!0,count:1}],body:"if(x!==y){return false}",localVars:[],thisVars:[]},post:{args:[],localVars:[],thisVars:[],body:"return true"},funcName:"equals"})},{"cwise-compiler":133}],412:[function(t,e,r){"use strict";var n=t("ndarray"),i=t("./doConvert.js");e.exports=function(t,e){for(var r=[],a=t,o=1;Array.isArray(a);)r.push(a.length),o*=a.length,a=a[0];return 0===r.length?n():(e||(e=n(new Float64Array(o),r)),i(e,t),e)}},{"./doConvert.js":413,ndarray:417}],413:[function(t,e,r){e.exports=t("cwise-compiler")({args:["array","scalar","index"],pre:{body:"{}",args:[],thisVars:[],localVars:[]},body:{body:"{\nvar _inline_1_v=_inline_1_arg1_,_inline_1_i\nfor(_inline_1_i=0;_inline_1_i<_inline_1_arg2_.length-1;++_inline_1_i) {\n_inline_1_v=_inline_1_v[_inline_1_arg2_[_inline_1_i]]\n}\n_inline_1_arg0_=_inline_1_v[_inline_1_arg2_[_inline_1_arg2_.length-1]]\n}",args:[{name:"_inline_1_arg0_",lvalue:!0,rvalue:!1,count:1},{name:"_inline_1_arg1_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_1_arg2_",lvalue:!1,rvalue:!0,count:4}],thisVars:[],localVars:["_inline_1_i","_inline_1_v"]},post:{body:"{}",args:[],thisVars:[],localVars:[]},funcName:"convert",blockSize:64})},{"cwise-compiler":133}],414:[function(t,e,r){"use strict";var n=t("typedarray-pool"),i=32;function a(t){switch(t){case"uint8":return[n.mallocUint8,n.freeUint8];case"uint16":return[n.mallocUint16,n.freeUint16];case"uint32":return[n.mallocUint32,n.freeUint32];case"int8":return[n.mallocInt8,n.freeInt8];case"int16":return[n.mallocInt16,n.freeInt16];case"int32":return[n.mallocInt32,n.freeInt32];case"float32":return[n.mallocFloat,n.freeFloat];case"float64":return[n.mallocDouble,n.freeDouble];default:return null}}function o(t){for(var e=[],r=0;r<t;++r)e.push("s"+r);for(r=0;r<t;++r)e.push("n"+r);for(r=1;r<t;++r)e.push("d"+r);for(r=1;r<t;++r)e.push("e"+r);for(r=1;r<t;++r)e.push("f"+r);return e}e.exports=function(t,e){var r=["'use strict'"],n=["ndarraySortWrapper",t.join("d"),e].join("");r.push(["function ",n,"(",["array"].join(","),"){"].join(""));for(var s=["data=array.data,offset=array.offset|0,shape=array.shape,stride=array.stride"],l=0;l<t.length;++l)s.push(["s",l,"=stride[",l,"]|0,n",l,"=shape[",l,"]|0"].join(""));var c=new Array(t.length),u=[];for(l=0;l<t.length;++l)0!==(p=t[l])&&(0===u.length?c[p]="1":c[p]=u.join("*"),u.push("n"+p));var h=-1,f=-1;for(l=0;l<t.length;++l){var p,d=t[l];0!==d&&(h>0?s.push(["d",d,"=s",d,"-d",h,"*n",h].join("")):s.push(["d",d,"=s",d].join("")),h=d),0!=(p=t.length-1-l)&&(f>0?s.push(["e",p,"=s",p,"-e",f,"*n",f,",f",p,"=",c[p],"-f",f,"*n",f].join("")):s.push(["e",p,"=s",p,",f",p,"=",c[p]].join("")),f=p)}r.push("var "+s.join(","));var g=["0","n0-1","data","offset"].concat(o(t.length));r.push(["if(n0<=",i,"){","insertionSort(",g.join(","),")}else{","quickSort(",g.join(","),")}"].join("")),r.push("}return "+n);var m=new Function("insertionSort","quickSort",r.join("\n")),v=function(t,e){var r=["'use strict'"],n=["ndarrayInsertionSort",t.join("d"),e].join(""),i=["left","right","data","offset"].concat(o(t.length)),s=a(e),l=["i,j,cptr,ptr=left*s0+offset"];if(t.length>1){for(var c=[],u=1;u<t.length;++u)l.push("i"+u),c.push("n"+u);s?l.push("scratch=malloc("+c.join("*")+")"):l.push("scratch=new Array("+c.join("*")+")"),l.push("dptr","sptr","a","b")}else l.push("scratch");function h(t){return"generic"===e?["data.get(",t,")"].join(""):["data[",t,"]"].join("")}function f(t,r){return"generic"===e?["data.set(",t,",",r,")"].join(""):["data[",t,"]=",r].join("")}if(r.push(["function ",n,"(",i.join(","),"){var ",l.join(",")].join(""),"for(i=left+1;i<=right;++i){","j=i;ptr+=s0","cptr=ptr"),t.length>1){for(r.push("dptr=0;sptr=ptr"),u=t.length-1;u>=0;--u)0!==(p=t[u])&&r.push(["for(i",p,"=0;i",p,"<n",p,";++i",p,"){"].join(""));for(r.push("scratch[dptr++]=",h("sptr")),u=0;u<t.length;++u)0!==(p=t[u])&&r.push("sptr+=d"+p,"}");for(r.push("__g:while(j--\x3eleft){","dptr=0","sptr=cptr-s0"),u=1;u<t.length;++u)1===u&&r.push("__l:"),r.push(["for(i",u,"=0;i",u,"<n",u,";++i",u,"){"].join(""));for(r.push(["a=",h("sptr"),"\nb=scratch[dptr]\nif(a<b){break __g}\nif(a>b){break __l}"].join("")),u=t.length-1;u>=1;--u)r.push("sptr+=e"+u,"dptr+=f"+u,"}");for(r.push("dptr=cptr;sptr=cptr-s0"),u=t.length-1;u>=0;--u)0!==(p=t[u])&&r.push(["for(i",p,"=0;i",p,"<n",p,";++i",p,"){"].join(""));for(r.push(f("dptr",h("sptr"))),u=0;u<t.length;++u)0!==(p=t[u])&&r.push(["dptr+=d",p,";sptr+=d",p].join(""),"}");for(r.push("cptr-=s0\n}"),r.push("dptr=cptr;sptr=0"),u=t.length-1;u>=0;--u)0!==(p=t[u])&&r.push(["for(i",p,"=0;i",p,"<n",p,";++i",p,"){"].join(""));for(r.push(f("dptr","scratch[sptr++]")),u=0;u<t.length;++u){var p;0!==(p=t[u])&&r.push("dptr+=d"+p,"}")}}else r.push("scratch="+h("ptr"),"while((j--\x3eleft)&&("+h("cptr-s0")+">scratch)){",f("cptr",h("cptr-s0")),"cptr-=s0","}",f("cptr","scratch"));return r.push("}"),t.length>1&&s&&r.push("free(scratch)"),r.push("} return "+n),s?new Function("malloc","free",r.join("\n"))(s[0],s[1]):new Function(r.join("\n"))()}(t,e),y=function(t,e,r){var n=["'use strict'"],s=["ndarrayQuickSort",t.join("d"),e].join(""),l=["left","right","data","offset"].concat(o(t.length)),c=a(e),u=0;n.push(["function ",s,"(",l.join(","),"){"].join(""));var h=["sixth=((right-left+1)/6)|0","index1=left+sixth","index5=right-sixth","index3=(left+right)>>1","index2=index3-sixth","index4=index3+sixth","el1=index1","el2=index2","el3=index3","el4=index4","el5=index5","less=left+1","great=right-1","pivots_are_equal=true","tmp","tmp0","x","y","z","k","ptr0","ptr1","ptr2","comp_pivot1=0","comp_pivot2=0","comp=0"];if(t.length>1){for(var f=[],p=1;p<t.length;++p)f.push("n"+p),h.push("i"+p);for(p=0;p<8;++p)h.push("b_ptr"+p);h.push("ptr3","ptr4","ptr5","ptr6","ptr7","pivot_ptr","ptr_shift","elementSize="+f.join("*")),c?h.push("pivot1=malloc(elementSize)","pivot2=malloc(elementSize)"):h.push("pivot1=new Array(elementSize),pivot2=new Array(elementSize)")}else h.push("pivot1","pivot2");function d(t){return["(offset+",t,"*s0)"].join("")}function g(t){return"generic"===e?["data.get(",t,")"].join(""):["data[",t,"]"].join("")}function m(t,r){return"generic"===e?["data.set(",t,",",r,")"].join(""):["data[",t,"]=",r].join("")}function v(e,r,i){if(1===e.length)n.push("ptr0="+d(e[0]));else for(var a=0;a<e.length;++a)n.push(["b_ptr",a,"=s0*",e[a]].join(""));for(r&&n.push("pivot_ptr=0"),n.push("ptr_shift=offset"),a=t.length-1;a>=0;--a)0!==(o=t[a])&&n.push(["for(i",o,"=0;i",o,"<n",o,";++i",o,"){"].join(""));if(e.length>1)for(a=0;a<e.length;++a)n.push(["ptr",a,"=b_ptr",a,"+ptr_shift"].join(""));for(n.push(i),r&&n.push("++pivot_ptr"),a=0;a<t.length;++a){var o;0!==(o=t[a])&&(e.length>1?n.push("ptr_shift+=d"+o):n.push("ptr0+=d"+o),n.push("}"))}}function y(e,r,i,a){if(1===r.length)n.push("ptr0="+d(r[0]));else{for(var o=0;o<r.length;++o)n.push(["b_ptr",o,"=s0*",r[o]].join(""));n.push("ptr_shift=offset")}for(i&&n.push("pivot_ptr=0"),e&&n.push(e+":"),o=1;o<t.length;++o)n.push(["for(i",o,"=0;i",o,"<n",o,";++i",o,"){"].join(""));if(r.length>1)for(o=0;o<r.length;++o)n.push(["ptr",o,"=b_ptr",o,"+ptr_shift"].join(""));for(n.push(a),o=t.length-1;o>=1;--o)i&&n.push("pivot_ptr+=f"+o),r.length>1?n.push("ptr_shift+=e"+o):n.push("ptr0+=e"+o),n.push("}")}function x(){t.length>1&&c&&n.push("free(pivot1)","free(pivot2)")}function b(e,r){var i="el"+e,a="el"+r;if(t.length>1){var o="__l"+ ++u;y(o,[i,a],!1,["comp=",g("ptr0"),"-",g("ptr1"),"\n","if(comp>0){tmp0=",i,";",i,"=",a,";",a,"=tmp0;break ",o,"}\n","if(comp<0){break ",o,"}"].join(""))}else n.push(["if(",g(d(i)),">",g(d(a)),"){tmp0=",i,";",i,"=",a,";",a,"=tmp0}"].join(""))}function _(e,r){t.length>1?v([e,r],!1,m("ptr0",g("ptr1"))):n.push(m(d(e),g(d(r))))}function w(e,r,i){if(t.length>1){var a="__l"+ ++u;y(a,[r],!0,[e,"=",g("ptr0"),"-pivot",i,"[pivot_ptr]\n","if(",e,"!==0){break ",a,"}"].join(""))}else n.push([e,"=",g(d(r)),"-pivot",i].join(""))}function k(e,r){t.length>1?v([e,r],!1,["tmp=",g("ptr0"),"\n",m("ptr0",g("ptr1")),"\n",m("ptr1","tmp")].join("")):n.push(["ptr0=",d(e),"\n","ptr1=",d(r),"\n","tmp=",g("ptr0"),"\n",m("ptr0",g("ptr1")),"\n",m("ptr1","tmp")].join(""))}function M(e,r,i){t.length>1?(v([e,r,i],!1,["tmp=",g("ptr0"),"\n",m("ptr0",g("ptr1")),"\n",m("ptr1",g("ptr2")),"\n",m("ptr2","tmp")].join("")),n.push("++"+r,"--"+i)):n.push(["ptr0=",d(e),"\n","ptr1=",d(r),"\n","ptr2=",d(i),"\n","++",r,"\n","--",i,"\n","tmp=",g("ptr0"),"\n",m("ptr0",g("ptr1")),"\n",m("ptr1",g("ptr2")),"\n",m("ptr2","tmp")].join(""))}function A(t,e){k(t,e),n.push("--"+e)}function T(e,r,i){t.length>1?v([e,r],!0,[m("ptr0",g("ptr1")),"\n",m("ptr1",["pivot",i,"[pivot_ptr]"].join(""))].join("")):n.push(m(d(e),g(d(r))),m(d(r),"pivot"+i))}function S(e,r){n.push(["if((",r,"-",e,")<=",i,"){\n","insertionSort(",e,",",r,",data,offset,",o(t.length).join(","),")\n","}else{\n",s,"(",e,",",r,",data,offset,",o(t.length).join(","),")\n","}"].join(""))}function E(e,r,i){t.length>1?(n.push(["__l",++u,":while(true){"].join("")),v([e],!0,["if(",g("ptr0"),"!==pivot",r,"[pivot_ptr]){break __l",u,"}"].join("")),n.push(i,"}")):n.push(["while(",g(d(e)),"===pivot",r,"){",i,"}"].join(""))}return n.push("var "+h.join(",")),b(1,2),b(4,5),b(1,3),b(2,3),b(1,4),b(3,4),b(2,5),b(2,3),b(4,5),t.length>1?v(["el1","el2","el3","el4","el5","index1","index3","index5"],!0,["pivot1[pivot_ptr]=",g("ptr1"),"\n","pivot2[pivot_ptr]=",g("ptr3"),"\n","pivots_are_equal=pivots_are_equal&&(pivot1[pivot_ptr]===pivot2[pivot_ptr])\n","x=",g("ptr0"),"\n","y=",g("ptr2"),"\n","z=",g("ptr4"),"\n",m("ptr5","x"),"\n",m("ptr6","y"),"\n",m("ptr7","z")].join("")):n.push(["pivot1=",g(d("el2")),"\n","pivot2=",g(d("el4")),"\n","pivots_are_equal=pivot1===pivot2\n","x=",g(d("el1")),"\n","y=",g(d("el3")),"\n","z=",g(d("el5")),"\n",m(d("index1"),"x"),"\n",m(d("index3"),"y"),"\n",m(d("index5"),"z")].join("")),_("index2","left"),_("index4","right"),n.push("if(pivots_are_equal){"),n.push("for(k=less;k<=great;++k){"),w("comp","k",1),n.push("if(comp===0){continue}"),n.push("if(comp<0){"),n.push("if(k!==less){"),k("k","less"),n.push("}"),n.push("++less"),n.push("}else{"),n.push("while(true){"),w("comp","great",1),n.push("if(comp>0){"),n.push("great--"),n.push("}else if(comp<0){"),M("k","less","great"),n.push("break"),n.push("}else{"),A("k","great"),n.push("break"),n.push("}"),n.push("}"),n.push("}"),n.push("}"),n.push("}else{"),n.push("for(k=less;k<=great;++k){"),w("comp_pivot1","k",1),n.push("if(comp_pivot1<0){"),n.push("if(k!==less){"),k("k","less"),n.push("}"),n.push("++less"),n.push("}else{"),w("comp_pivot2","k",2),n.push("if(comp_pivot2>0){"),n.push("while(true){"),w("comp","great",2),n.push("if(comp>0){"),n.push("if(--great<k){break}"),n.push("continue"),n.push("}else{"),w("comp","great",1),n.push("if(comp<0){"),M("k","less","great"),n.push("}else{"),A("k","great"),n.push("}"),n.push("break"),n.push("}"),n.push("}"),n.push("}"),n.push("}"),n.push("}"),n.push("}"),T("left","(less-1)",1),T("right","(great+1)",2),S("left","(less-2)"),S("(great+2)","right"),n.push("if(pivots_are_equal){"),x(),n.push("return"),n.push("}"),n.push("if(less<index1&&great>index5){"),E("less",1,"++less"),E("great",2,"--great"),n.push("for(k=less;k<=great;++k){"),w("comp_pivot1","k",1),n.push("if(comp_pivot1===0){"),n.push("if(k!==less){"),k("k","less"),n.push("}"),n.push("++less"),n.push("}else{"),w("comp_pivot2","k",2),n.push("if(comp_pivot2===0){"),n.push("while(true){"),w("comp","great",2),n.push("if(comp===0){"),n.push("if(--great<k){break}"),n.push("continue"),n.push("}else{"),w("comp","great",1),n.push("if(comp<0){"),M("k","less","great"),n.push("}else{"),A("k","great"),n.push("}"),n.push("break"),n.push("}"),n.push("}"),n.push("}"),n.push("}"),n.push("}"),n.push("}"),x(),S("less","great"),n.push("}return "+s),t.length>1&&c?new Function("insertionSort","malloc","free",n.join("\n"))(r,c[0],c[1]):new Function("insertionSort",n.join("\n"))(r)}(t,e,v);return m(v,y)}},{"typedarray-pool":507}],415:[function(t,e,r){"use strict";var n=t("./lib/compile_sort.js"),i={};e.exports=function(t){var e=t.order,r=t.dtype,a=[e,r].join(":"),o=i[a];return o||(i[a]=o=n(e,r)),o(t),t}},{"./lib/compile_sort.js":414}],416:[function(t,e,r){"use strict";var n=t("ndarray-linear-interpolate"),i=t("cwise/lib/wrapper")({args:["index","array","scalar","scalar","scalar"],pre:{body:"{this_warped=new Array(_inline_3_arg4_)}",args:[{name:"_inline_3_arg0_",lvalue:!1,rvalue:!1,count:0},{name:"_inline_3_arg1_",lvalue:!1,rvalue:!1,count:0},{name:"_inline_3_arg2_",lvalue:!1,rvalue:!1,count:0},{name:"_inline_3_arg3_",lvalue:!1,rvalue:!1,count:0},{name:"_inline_3_arg4_",lvalue:!1,rvalue:!0,count:1}],thisVars:["this_warped"],localVars:[]},body:{body:"{_inline_4_arg2_(this_warped,_inline_4_arg0_),_inline_4_arg1_=_inline_4_arg3_.apply(void 0,this_warped)}",args:[{name:"_inline_4_arg0_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_4_arg1_",lvalue:!0,rvalue:!1,count:1},{name:"_inline_4_arg2_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_4_arg3_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_4_arg4_",lvalue:!1,rvalue:!1,count:0}],thisVars:["this_warped"],localVars:[]},post:{body:"{}",args:[],thisVars:[],localVars:[]},debug:!1,funcName:"warpND",blockSize:64}),a=t("cwise/lib/wrapper")({args:["index","array","scalar","scalar","scalar"],pre:{body:"{this_warped=[0]}",args:[],thisVars:["this_warped"],localVars:[]},body:{body:"{_inline_7_arg2_(this_warped,_inline_7_arg0_),_inline_7_arg1_=_inline_7_arg3_(_inline_7_arg4_,this_warped[0])}",args:[{name:"_inline_7_arg0_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_7_arg1_",lvalue:!0,rvalue:!1,count:1},{name:"_inline_7_arg2_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_7_arg3_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_7_arg4_",lvalue:!1,rvalue:!0,count:1}],thisVars:["this_warped"],localVars:[]},post:{body:"{}",args:[],thisVars:[],localVars:[]},debug:!1,funcName:"warp1D",blockSize:64}),o=t("cwise/lib/wrapper")({args:["index","array","scalar","scalar","scalar"],pre:{body:"{this_warped=[0,0]}",args:[],thisVars:["this_warped"],localVars:[]},body:{body:"{_inline_10_arg2_(this_warped,_inline_10_arg0_),_inline_10_arg1_=_inline_10_arg3_(_inline_10_arg4_,this_warped[0],this_warped[1])}",args:[{name:"_inline_10_arg0_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_10_arg1_",lvalue:!0,rvalue:!1,count:1},{name:"_inline_10_arg2_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_10_arg3_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_10_arg4_",lvalue:!1,rvalue:!0,count:1}],thisVars:["this_warped"],localVars:[]},post:{body:"{}",args:[],thisVars:[],localVars:[]},debug:!1,funcName:"warp2D",blockSize:64}),s=t("cwise/lib/wrapper")({args:["index","array","scalar","scalar","scalar"],pre:{body:"{this_warped=[0,0,0]}",args:[],thisVars:["this_warped"],localVars:[]},body:{body:"{_inline_13_arg2_(this_warped,_inline_13_arg0_),_inline_13_arg1_=_inline_13_arg3_(_inline_13_arg4_,this_warped[0],this_warped[1],this_warped[2])}",args:[{name:"_inline_13_arg0_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_13_arg1_",lvalue:!0,rvalue:!1,count:1},{name:"_inline_13_arg2_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_13_arg3_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_13_arg4_",lvalue:!1,rvalue:!0,count:1}],thisVars:["this_warped"],localVars:[]},post:{body:"{}",args:[],thisVars:[],localVars:[]},debug:!1,funcName:"warp3D",blockSize:64});e.exports=function(t,e,r){switch(e.shape.length){case 1:a(t,r,n.d1,e);break;case 2:o(t,r,n.d2,e);break;case 3:s(t,r,n.d3,e);break;default:i(t,r,n.bind(void 0,e),e.shape.length)}return t}},{"cwise/lib/wrapper":136,"ndarray-linear-interpolate":410}],417:[function(t,e,r){var n=t("iota-array"),i=t("is-buffer"),a="undefined"!=typeof Float64Array;function o(t,e){return t[0]-e[0]}function s(){var t,e=this.stride,r=new Array(e.length);for(t=0;t<r.length;++t)r[t]=[Math.abs(e[t]),t];r.sort(o);var n=new Array(r.length);for(t=0;t<n.length;++t)n[t]=r[t][1];return n}function l(t,e){var r=["View",e,"d",t].join("");e<0&&(r="View_Nil"+t);var i="generic"===t;if(-1===e){var a="function "+r+"(a){this.data=a;};var proto="+r+".prototype;proto.dtype='"+t+"';proto.index=function(){return -1};proto.size=0;proto.dimension=-1;proto.shape=proto.stride=proto.order=[];proto.lo=proto.hi=proto.transpose=proto.step=function(){return new "+r+"(this.data);};proto.get=proto.set=function(){};proto.pick=function(){return null};return function construct_"+r+"(a){return new "+r+"(a);}";return new Function(a)()}if(0===e){a="function "+r+"(a,d) {this.data = a;this.offset = d};var proto="+r+".prototype;proto.dtype='"+t+"';proto.index=function(){return this.offset};proto.dimension=0;proto.size=1;proto.shape=proto.stride=proto.order=[];proto.lo=proto.hi=proto.transpose=proto.step=function "+r+"_copy() {return new "+r+"(this.data,this.offset)};proto.pick=function "+r+"_pick(){return TrivialArray(this.data);};proto.valueOf=proto.get=function "+r+"_get(){return "+(i?"this.data.get(this.offset)":"this.data[this.offset]")+"};proto.set=function "+r+"_set(v){return "+(i?"this.data.set(this.offset,v)":"this.data[this.offset]=v")+"};return function construct_"+r+"(a,b,c,d){return new "+r+"(a,d)}";return new Function("TrivialArray",a)(c[t][0])}a=["'use strict'"];var o=n(e),l=o.map(function(t){return"i"+t}),u="this.offset+"+o.map(function(t){return"this.stride["+t+"]*i"+t}).join("+"),h=o.map(function(t){return"b"+t}).join(","),f=o.map(function(t){return"c"+t}).join(",");a.push("function "+r+"(a,"+h+","+f+",d){this.data=a","this.shape=["+h+"]","this.stride=["+f+"]","this.offset=d|0}","var proto="+r+".prototype","proto.dtype='"+t+"'","proto.dimension="+e),a.push("Object.defineProperty(proto,'size',{get:function "+r+"_size(){return "+o.map(function(t){return"this.shape["+t+"]"}).join("*"),"}})"),1===e?a.push("proto.order=[0]"):(a.push("Object.defineProperty(proto,'order',{get:"),e<4?(a.push("function "+r+"_order(){"),2===e?a.push("return (Math.abs(this.stride[0])>Math.abs(this.stride[1]))?[1,0]:[0,1]}})"):3===e&&a.push("var s0=Math.abs(this.stride[0]),s1=Math.abs(this.stride[1]),s2=Math.abs(this.stride[2]);if(s0>s1){if(s1>s2){return [2,1,0];}else if(s0>s2){return [1,2,0];}else{return [1,0,2];}}else if(s0>s2){return [2,0,1];}else if(s2>s1){return [0,1,2];}else{return [0,2,1];}}})")):a.push("ORDER})")),a.push("proto.set=function "+r+"_set("+l.join(",")+",v){"),i?a.push("return this.data.set("+u+",v)}"):a.push("return this.data["+u+"]=v}"),a.push("proto.get=function "+r+"_get("+l.join(",")+"){"),i?a.push("return this.data.get("+u+")}"):a.push("return this.data["+u+"]}"),a.push("proto.index=function "+r+"_index(",l.join(),"){return "+u+"}"),a.push("proto.hi=function "+r+"_hi("+l.join(",")+"){return new "+r+"(this.data,"+o.map(function(t){return["(typeof i",t,"!=='number'||i",t,"<0)?this.shape[",t,"]:i",t,"|0"].join("")}).join(",")+","+o.map(function(t){return"this.stride["+t+"]"}).join(",")+",this.offset)}");var p=o.map(function(t){return"a"+t+"=this.shape["+t+"]"}),d=o.map(function(t){return"c"+t+"=this.stride["+t+"]"});a.push("proto.lo=function "+r+"_lo("+l.join(",")+"){var b=this.offset,d=0,"+p.join(",")+","+d.join(","));for(var g=0;g<e;++g)a.push("if(typeof i"+g+"==='number'&&i"+g+">=0){d=i"+g+"|0;b+=c"+g+"*d;a"+g+"-=d}");a.push("return new "+r+"(this.data,"+o.map(function(t){return"a"+t}).join(",")+","+o.map(function(t){return"c"+t}).join(",")+",b)}"),a.push("proto.step=function "+r+"_step("+l.join(",")+"){var "+o.map(function(t){return"a"+t+"=this.shape["+t+"]"}).join(",")+","+o.map(function(t){return"b"+t+"=this.stride["+t+"]"}).join(",")+",c=this.offset,d=0,ceil=Math.ceil");for(g=0;g<e;++g)a.push("if(typeof i"+g+"==='number'){d=i"+g+"|0;if(d<0){c+=b"+g+"*(a"+g+"-1);a"+g+"=ceil(-a"+g+"/d)}else{a"+g+"=ceil(a"+g+"/d)}b"+g+"*=d}");a.push("return new "+r+"(this.data,"+o.map(function(t){return"a"+t}).join(",")+","+o.map(function(t){return"b"+t}).join(",")+",c)}");var m=new Array(e),v=new Array(e);for(g=0;g<e;++g)m[g]="a[i"+g+"]",v[g]="b[i"+g+"]";a.push("proto.transpose=function "+r+"_transpose("+l+"){"+l.map(function(t,e){return t+"=("+t+"===undefined?"+e+":"+t+"|0)"}).join(";"),"var a=this.shape,b=this.stride;return new "+r+"(this.data,"+m.join(",")+","+v.join(",")+",this.offset)}"),a.push("proto.pick=function "+r+"_pick("+l+"){var a=[],b=[],c=this.offset");for(g=0;g<e;++g)a.push("if(typeof i"+g+"==='number'&&i"+g+">=0){c=(c+this.stride["+g+"]*i"+g+")|0}else{a.push(this.shape["+g+"]);b.push(this.stride["+g+"])}");return a.push("var ctor=CTOR_LIST[a.length+1];return ctor(this.data,a,b,c)}"),a.push("return function construct_"+r+"(data,shape,stride,offset){return new "+r+"(data,"+o.map(function(t){return"shape["+t+"]"}).join(",")+","+o.map(function(t){return"stride["+t+"]"}).join(",")+",offset)}"),new Function("CTOR_LIST","ORDER",a.join("\n"))(c[t],s)}var c={float32:[],float64:[],int8:[],int16:[],int32:[],uint8:[],uint16:[],uint32:[],array:[],uint8_clamped:[],buffer:[],generic:[]};e.exports=function(t,e,r,n){if(void 0===t)return(0,c.array[0])([]);"number"==typeof t&&(t=[t]),void 0===e&&(e=[t.length]);var o=e.length;if(void 0===r){r=new Array(o);for(var s=o-1,u=1;s>=0;--s)r[s]=u,u*=e[s]}if(void 0===n)for(n=0,s=0;s<o;++s)r[s]<0&&(n-=(e[s]-1)*r[s]);for(var h=function(t){if(i(t))return"buffer";if(a)switch(Object.prototype.toString.call(t)){case"[object Float64Array]":return"float64";case"[object Float32Array]":return"float32";case"[object Int8Array]":return"int8";case"[object Int16Array]":return"int16";case"[object Int32Array]":return"int32";case"[object Uint8Array]":return"uint8";case"[object Uint16Array]":return"uint16";case"[object Uint32Array]":return"uint32";case"[object Uint8ClampedArray]":return"uint8_clamped"}return Array.isArray(t)?"array":"generic"}(t),f=c[h];f.length<=o+1;)f.push(l(h,f.length-1));return(0,f[o+1])(t,e,r,n)}},{"iota-array":384,"is-buffer":386}],418:[function(t,e,r){"use strict";var n=t("double-bits"),i=Math.pow(2,-1074),a=-1>>>0;e.exports=function(t,e){if(isNaN(t)||isNaN(e))return NaN;if(t===e)return t;if(0===t)return e<0?-i:i;var r=n.hi(t),o=n.lo(t);e>t==t>0?o===a?(r+=1,o=0):o+=1:0===o?(o=a,r-=1):o-=1;return n.pack(o,r)}},{"double-bits":151}],419:[function(t,e,r){var n=Math.PI,i=c(120);function a(t,e,r,n){return["C",t,e,r,n,r,n]}function o(t,e,r,n,i,a){return["C",t/3+2/3*r,e/3+2/3*n,i/3+2/3*r,a/3+2/3*n,i,a]}function s(t,e,r,a,o,c,u,h,f,p){if(p)k=p[0],M=p[1],_=p[2],w=p[3];else{var d=l(t,e,-o);t=d.x,e=d.y;var g=(t-(h=(d=l(h,f,-o)).x))/2,m=(e-(f=d.y))/2,v=g*g/(r*r)+m*m/(a*a);v>1&&(r*=v=Math.sqrt(v),a*=v);var y=r*r,x=a*a,b=(c==u?-1:1)*Math.sqrt(Math.abs((y*x-y*m*m-x*g*g)/(y*m*m+x*g*g)));b==1/0&&(b=1);var _=b*r*m/a+(t+h)/2,w=b*-a*g/r+(e+f)/2,k=Math.asin(((e-w)/a).toFixed(9)),M=Math.asin(((f-w)/a).toFixed(9));(k=t<_?n-k:k)<0&&(k=2*n+k),(M=h<_?n-M:M)<0&&(M=2*n+M),u&&k>M&&(k-=2*n),!u&&M>k&&(M-=2*n)}if(Math.abs(M-k)>i){var A=M,T=h,S=f;M=k+i*(u&&M>k?1:-1);var E=s(h=_+r*Math.cos(M),f=w+a*Math.sin(M),r,a,o,0,u,T,S,[M,A,_,w])}var C=Math.tan((M-k)/4),L=4/3*r*C,z=4/3*a*C,P=[2*t-(t+L*Math.sin(k)),2*e-(e-z*Math.cos(k)),h+L*Math.sin(M),f-z*Math.cos(M),h,f];if(p)return P;E&&(P=P.concat(E));for(var I=0;I<P.length;){var O=l(P[I],P[I+1],o);P[I++]=O.x,P[I++]=O.y}return P}function l(t,e,r){return{x:t*Math.cos(r)-e*Math.sin(r),y:t*Math.sin(r)+e*Math.cos(r)}}function c(t){return t*(n/180)}e.exports=function(t){for(var e,r=[],n=0,i=0,l=0,u=0,h=null,f=null,p=0,d=0,g=0,m=t.length;g<m;g++){var v=t[g],y=v[0];switch(y){case"M":l=v[1],u=v[2];break;case"A":(v=s(p,d,v[1],v[2],c(v[3]),v[4],v[5],v[6],v[7])).unshift("C"),v.length>7&&(r.push(v.splice(0,7)),v.unshift("C"));break;case"S":var x=p,b=d;"C"!=e&&"S"!=e||(x+=x-n,b+=b-i),v=["C",x,b,v[1],v[2],v[3],v[4]];break;case"T":"Q"==e||"T"==e?(h=2*p-h,f=2*d-f):(h=p,f=d),v=o(p,d,h,f,v[1],v[2]);break;case"Q":h=v[1],f=v[2],v=o(p,d,v[1],v[2],v[3],v[4]);break;case"L":v=a(p,d,v[1],v[2]);break;case"H":v=a(p,d,v[1],d);break;case"V":v=a(p,d,p,v[1]);break;case"Z":v=a(p,d,l,u)}e=y,p=v[v.length-2],d=v[v.length-1],v.length>4?(n=v[v.length-4],i=v[v.length-3]):(n=p,i=d),r.push(v)}return r}},{}],420:[function(t,e,r){r.vertexNormals=function(t,e,r){for(var n=e.length,i=new Array(n),a=void 0===r?1e-6:r,o=0;o<n;++o)i[o]=[0,0,0];for(o=0;o<t.length;++o)for(var s=t[o],l=0,c=s[s.length-1],u=s[0],h=0;h<s.length;++h){l=c,c=u,u=s[(h+1)%s.length];for(var f=e[l],p=e[c],d=e[u],g=new Array(3),m=0,v=new Array(3),y=0,x=0;x<3;++x)g[x]=f[x]-p[x],m+=g[x]*g[x],v[x]=d[x]-p[x],y+=v[x]*v[x];if(m*y>a){var b=i[c],_=1/Math.sqrt(m*y);for(x=0;x<3;++x){var w=(x+1)%3,k=(x+2)%3;b[x]+=_*(v[w]*g[k]-v[k]*g[w])}}}for(o=0;o<n;++o){b=i[o];var M=0;for(x=0;x<3;++x)M+=b[x]*b[x];if(M>a)for(_=1/Math.sqrt(M),x=0;x<3;++x)b[x]*=_;else for(x=0;x<3;++x)b[x]=0}return i},r.faceNormals=function(t,e,r){for(var n=t.length,i=new Array(n),a=void 0===r?1e-6:r,o=0;o<n;++o){for(var s=t[o],l=new Array(3),c=0;c<3;++c)l[c]=e[s[c]];var u=new Array(3),h=new Array(3);for(c=0;c<3;++c)u[c]=l[1][c]-l[0][c],h[c]=l[2][c]-l[0][c];var f=new Array(3),p=0;for(c=0;c<3;++c){var d=(c+1)%3,g=(c+2)%3;f[c]=u[d]*h[g]-u[g]*h[d],p+=f[c]*f[c]}p=p>a?1/Math.sqrt(p):0;for(c=0;c<3;++c)f[c]*=p;i[o]=f}return i}},{}],421:[function(t,e,r){"use strict";var n=Object.getOwnPropertySymbols,i=Object.prototype.hasOwnProperty,a=Object.prototype.propertyIsEnumerable;e.exports=function(){try{if(!Object.assign)return!1;var t=new String("abc");if(t[5]="de","5"===Object.getOwnPropertyNames(t)[0])return!1;for(var e={},r=0;r<10;r++)e["_"+String.fromCharCode(r)]=r;if("0123456789"!==Object.getOwnPropertyNames(e).map(function(t){return e[t]}).join(""))return!1;var n={};return"abcdefghijklmnopqrst".split("").forEach(function(t){n[t]=t}),"abcdefghijklmnopqrst"===Object.keys(Object.assign({},n)).join("")}catch(t){return!1}}()?Object.assign:function(t,e){for(var r,o,s=function(t){if(null==t)throw new TypeError("Object.assign cannot be called with null or undefined");return Object(t)}(t),l=1;l<arguments.length;l++){for(var c in r=Object(arguments[l]))i.call(r,c)&&(s[c]=r[c]);if(n){o=n(r);for(var u=0;u<o.length;u++)a.call(r,o[u])&&(s[o[u]]=r[o[u]])}}return s}},{}],422:[function(t,e,r){"use strict";e.exports=function(t,e,r,n,i,a,o,s,l,c){var u=e+a+c;if(h>0){var h=Math.sqrt(u+1);t[0]=.5*(o-l)/h,t[1]=.5*(s-n)/h,t[2]=.5*(r-a)/h,t[3]=.5*h}else{var f=Math.max(e,a,c),h=Math.sqrt(2*f-u+1);e>=f?(t[0]=.5*h,t[1]=.5*(i+r)/h,t[2]=.5*(s+n)/h,t[3]=.5*(o-l)/h):a>=f?(t[0]=.5*(r+i)/h,t[1]=.5*h,t[2]=.5*(l+o)/h,t[3]=.5*(s-n)/h):(t[0]=.5*(n+s)/h,t[1]=.5*(o+l)/h,t[2]=.5*h,t[3]=.5*(r-i)/h)}return t}},{}],423:[function(t,e,r){"use strict";e.exports=function(t){var e=(t=t||{}).center||[0,0,0],r=t.rotation||[0,0,0,1],n=t.radius||1;e=[].slice.call(e,0,3),u(r=[].slice.call(r,0,4),r);var i=new h(r,e,Math.log(n));i.setDistanceLimits(t.zoomMin,t.zoomMax),("eye"in t||"up"in t)&&i.lookAt(0,t.eye,t.center,t.up);return i};var n=t("filtered-vector"),i=t("gl-mat4/lookAt"),a=t("gl-mat4/fromQuat"),o=t("gl-mat4/invert"),s=t("./lib/quatFromFrame");function l(t,e,r){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2))}function c(t,e,r,n){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2)+Math.pow(n,2))}function u(t,e){var r=e[0],n=e[1],i=e[2],a=e[3],o=c(r,n,i,a);o>1e-6?(t[0]=r/o,t[1]=n/o,t[2]=i/o,t[3]=a/o):(t[0]=t[1]=t[2]=0,t[3]=1)}function h(t,e,r){this.radius=n([r]),this.center=n(e),this.rotation=n(t),this.computedRadius=this.radius.curve(0),this.computedCenter=this.center.curve(0),this.computedRotation=this.rotation.curve(0),this.computedUp=[.1,0,0],this.computedEye=[.1,0,0],this.computedMatrix=[.1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],this.recalcMatrix(0)}var f=h.prototype;f.lastT=function(){return Math.max(this.radius.lastT(),this.center.lastT(),this.rotation.lastT())},f.recalcMatrix=function(t){this.radius.curve(t),this.center.curve(t),this.rotation.curve(t);var e=this.computedRotation;u(e,e);var r=this.computedMatrix;a(r,e);var n=this.computedCenter,i=this.computedEye,o=this.computedUp,s=Math.exp(this.computedRadius[0]);i[0]=n[0]+s*r[2],i[1]=n[1]+s*r[6],i[2]=n[2]+s*r[10],o[0]=r[1],o[1]=r[5],o[2]=r[9];for(var l=0;l<3;++l){for(var c=0,h=0;h<3;++h)c+=r[l+4*h]*i[h];r[12+l]=-c}},f.getMatrix=function(t,e){this.recalcMatrix(t);var r=this.computedMatrix;if(e){for(var n=0;n<16;++n)e[n]=r[n];return e}return r},f.idle=function(t){this.center.idle(t),this.radius.idle(t),this.rotation.idle(t)},f.flush=function(t){this.center.flush(t),this.radius.flush(t),this.rotation.flush(t)},f.pan=function(t,e,r,n){e=e||0,r=r||0,n=n||0,this.recalcMatrix(t);var i=this.computedMatrix,a=i[1],o=i[5],s=i[9],c=l(a,o,s);a/=c,o/=c,s/=c;var u=i[0],h=i[4],f=i[8],p=u*a+h*o+f*s,d=l(u-=a*p,h-=o*p,f-=s*p);u/=d,h/=d,f/=d;var g=i[2],m=i[6],v=i[10],y=g*a+m*o+v*s,x=g*u+m*h+v*f,b=l(g-=y*a+x*u,m-=y*o+x*h,v-=y*s+x*f);g/=b,m/=b,v/=b;var _=u*e+a*r,w=h*e+o*r,k=f*e+s*r;this.center.move(t,_,w,k);var M=Math.exp(this.computedRadius[0]);M=Math.max(1e-4,M+n),this.radius.set(t,Math.log(M))},f.rotate=function(t,e,r,n){this.recalcMatrix(t),e=e||0,r=r||0;var i=this.computedMatrix,a=i[0],o=i[4],s=i[8],u=i[1],h=i[5],f=i[9],p=i[2],d=i[6],g=i[10],m=e*a+r*u,v=e*o+r*h,y=e*s+r*f,x=-(d*y-g*v),b=-(g*m-p*y),_=-(p*v-d*m),w=Math.sqrt(Math.max(0,1-Math.pow(x,2)-Math.pow(b,2)-Math.pow(_,2))),k=c(x,b,_,w);k>1e-6?(x/=k,b/=k,_/=k,w/=k):(x=b=_=0,w=1);var M=this.computedRotation,A=M[0],T=M[1],S=M[2],E=M[3],C=A*w+E*x+T*_-S*b,L=T*w+E*b+S*x-A*_,z=S*w+E*_+A*b-T*x,P=E*w-A*x-T*b-S*_;if(n){x=p,b=d,_=g;var I=Math.sin(n)/l(x,b,_);x*=I,b*=I,_*=I,P=P*(w=Math.cos(e))-(C=C*w+P*x+L*_-z*b)*x-(L=L*w+P*b+z*x-C*_)*b-(z=z*w+P*_+C*b-L*x)*_}var O=c(C,L,z,P);O>1e-6?(C/=O,L/=O,z/=O,P/=O):(C=L=z=0,P=1),this.rotation.set(t,C,L,z,P)},f.lookAt=function(t,e,r,n){this.recalcMatrix(t),r=r||this.computedCenter,e=e||this.computedEye,n=n||this.computedUp;var a=this.computedMatrix;i(a,e,r,n);var o=this.computedRotation;s(o,a[0],a[1],a[2],a[4],a[5],a[6],a[8],a[9],a[10]),u(o,o),this.rotation.set(t,o[0],o[1],o[2],o[3]);for(var l=0,c=0;c<3;++c)l+=Math.pow(r[c]-e[c],2);this.radius.set(t,.5*Math.log(Math.max(l,1e-6))),this.center.set(t,r[0],r[1],r[2])},f.translate=function(t,e,r,n){this.center.move(t,e||0,r||0,n||0)},f.setMatrix=function(t,e){var r=this.computedRotation;s(r,e[0],e[1],e[2],e[4],e[5],e[6],e[8],e[9],e[10]),u(r,r),this.rotation.set(t,r[0],r[1],r[2],r[3]);var n=this.computedMatrix;o(n,e);var i=n[15];if(Math.abs(i)>1e-6){var a=n[12]/i,l=n[13]/i,c=n[14]/i;this.recalcMatrix(t);var h=Math.exp(this.computedRadius[0]);this.center.set(t,a-n[2]*h,l-n[6]*h,c-n[10]*h),this.radius.idle(t)}else this.center.idle(t),this.radius.idle(t)},f.setDistance=function(t,e){e>0&&this.radius.set(t,Math.log(e))},f.setDistanceLimits=function(t,e){t=t>0?Math.log(t):-1/0,e=e>0?Math.log(e):1/0,e=Math.max(e,t),this.radius.bounds[0][0]=t,this.radius.bounds[1][0]=e},f.getDistanceLimits=function(t){var e=this.radius.bounds;return t?(t[0]=Math.exp(e[0][0]),t[1]=Math.exp(e[1][0]),t):[Math.exp(e[0][0]),Math.exp(e[1][0])]},f.toJSON=function(){return this.recalcMatrix(this.lastT()),{center:this.computedCenter.slice(),rotation:this.computedRotation.slice(),distance:Math.log(this.computedRadius[0]),zoomMin:this.radius.bounds[0][0],zoomMax:this.radius.bounds[1][0]}},f.fromJSON=function(t){var e=this.lastT(),r=t.center;r&&this.center.set(e,r[0],r[1],r[2]);var n=t.rotation;n&&this.rotation.set(e,n[0],n[1],n[2],n[3]);var i=t.distance;i&&i>0&&this.radius.set(e,Math.log(i)),this.setDistanceLimits(t.zoomMin,t.zoomMax)}},{"./lib/quatFromFrame":422,"filtered-vector":215,"gl-mat4/fromQuat":251,"gl-mat4/invert":254,"gl-mat4/lookAt":255}],424:[function(t,e,r){"use strict";var n=t("repeat-string");e.exports=function(t,e,r){return n(r="undefined"!=typeof r?r+"":" ",e)+t}},{"repeat-string":464}],425:[function(t,e,r){"use strict";function n(t,e){if("string"!=typeof t)return[t];var r=[t];"string"==typeof e||Array.isArray(e)?e={brackets:e}:e||(e={});var n=e.brackets?Array.isArray(e.brackets)?e.brackets:[e.brackets]:["{}","[]","()"],i=e.escape||"___",a=!!e.flat;n.forEach(function(t){var e=new RegExp(["\\",t[0],"[^\\",t[0],"\\",t[1],"]*\\",t[1]].join("")),n=[];function a(e,a,o){var s=r.push(e.slice(t[0].length,-t[1].length))-1;return n.push(s),i+s}r.forEach(function(t,n){for(var i,o=0;t!=i;)if(i=t,t=t.replace(e,a),o++>1e4)throw Error("References have circular dependency. Please, check them.");r[n]=t}),n=n.reverse(),r=r.map(function(e){return n.forEach(function(r){e=e.replace(new RegExp("(\\"+i+r+"(?![0-9]))","g"),t[0]+"$1"+t[1])}),e})});var o=new RegExp("\\"+i+"([0-9]+)");return a?r:function t(e,r,n){for(var i,a=[],s=0;i=o.exec(e);){if(s++>1e4)throw Error("Circular references in parenthesis");a.push(e.slice(0,i.index)),a.push(t(r[i[1]],r)),e=e.slice(i.index+i[0].length)}return a.push(e),a}(r[0],r)}function i(t,e){if(e&&e.flat){var r,n=e&&e.escape||"___",i=t[0];if(!i)return"";for(var a=new RegExp("\\"+n+"([0-9]+)"),o=0;i!=r;){if(o++>1e4)throw Error("Circular references in "+t);r=i,i=i.replace(a,s)}return i}return t.reduce(function t(e,r){return Array.isArray(r)&&(r=r.reduce(t,"")),e+r},"");function s(e,r){if(null==t[r])throw Error("Reference "+r+"is undefined");return t[r]}}function a(t,e){return Array.isArray(t)?i(t,e):n(t,e)}a.parse=n,a.stringify=i,e.exports=a},{}],426:[function(t,e,r){"use strict";var n=t("pick-by-alias");e.exports=function(t){var e;arguments.length>1&&(t=arguments);"string"==typeof t?t=t.split(/\s/).map(parseFloat):"number"==typeof t&&(t=[t]);t.length&&"number"==typeof t[0]?e=1===t.length?{width:t[0],height:t[0],x:0,y:0}:2===t.length?{width:t[0],height:t[1],x:0,y:0}:{x:t[0],y:t[1],width:t[2]-t[0]||0,height:t[3]-t[1]||0}:t&&(t=n(t,{left:"x l left Left",top:"y t top Top",width:"w width W Width",height:"h height W Width",bottom:"b bottom Bottom",right:"r right Right"}),e={x:t.left||0,y:t.top||0},null==t.width?t.right?e.width=t.right-e.x:e.width=0:e.width=t.width,null==t.height?t.bottom?e.height=t.bottom-e.y:e.height=0:e.height=t.height);return e}},{"pick-by-alias":432}],427:[function(t,e,r){e.exports=function(t){var e=[];return t.replace(i,function(t,r,i){var o=r.toLowerCase();for(i=function(t){var e=t.match(a);return e?e.map(Number):[]}(i),"m"==o&&i.length>2&&(e.push([r].concat(i.splice(0,2))),o="l",r="m"==r?"l":"L");;){if(i.length==n[o])return i.unshift(r),e.push(i);if(i.length<n[o])throw new Error("malformed path data");e.push([r].concat(i.splice(0,n[o])))}}),e};var n={a:7,c:6,h:1,l:2,m:2,q:4,s:4,t:2,v:1,z:0},i=/([astvzqmhlc])([^astvzqmhlc]*)/ig;var a=/-?[0-9]*\.?[0-9]+(?:e[-+]?\d+)?/ig},{}],428:[function(t,e,r){e.exports=function(t,e){e||(e=[0,""]),t=String(t);var r=parseFloat(t,10);return e[0]=r,e[1]=t.match(/[\d.\-\+]*\s*(.*)/)[1]||"",e}},{}],429:[function(t,e,r){(function(t){(function(){var r,n,i,a,o,s;"undefined"!=typeof performance&&null!==performance&&performance.now?e.exports=function(){return performance.now()}:"undefined"!=typeof t&&null!==t&&t.hrtime?(e.exports=function(){return(r()-o)/1e6},n=t.hrtime,a=(r=function(){var t;return 1e9*(t=n())[0]+t[1]})(),s=1e9*t.uptime(),o=a-s):Date.now?(e.exports=function(){return Date.now()-i},i=Date.now()):(e.exports=function(){return(new Date).getTime()-i},i=(new Date).getTime())}).call(this)}).call(this,t("_process"))},{_process:449}],430:[function(t,e,r){"use strict";e.exports=function(t){var e=t.length;if(e<n){for(var r=1,a=0;a<e;++a)for(var o=0;o<a;++o)if(t[a]<t[o])r=-r;else if(t[a]===t[o])return 0;return r}for(var s=i.mallocUint8(e),a=0;a<e;++a)s[a]=0;for(var r=1,a=0;a<e;++a)if(!s[a]){var l=1;s[a]=1;for(var o=t[a];o!==a;o=t[o]){if(s[o])return i.freeUint8(s),0;l+=1,s[o]=1}1&l||(r=-r)}return i.freeUint8(s),r};var n=32,i=t("typedarray-pool")},{"typedarray-pool":507}],431:[function(t,e,r){"use strict";var n=t("typedarray-pool"),i=t("invert-permutation");r.rank=function(t){var e=t.length;switch(e){case 0:case 1:return 0;case 2:return t[1]}var r,a,o,s=n.mallocUint32(e),l=n.mallocUint32(e),c=0;for(i(t,l),o=0;o<e;++o)s[o]=t[o];for(o=e-1;o>0;--o)a=l[o],r=s[o],s[o]=s[a],s[a]=r,l[o]=l[r],l[r]=a,c=(c+r)*o;return n.freeUint32(l),n.freeUint32(s),c},r.unrank=function(t,e,r){switch(t){case 0:return r||[];case 1:return r?(r[0]=0,r):[0];case 2:return r?(e?(r[0]=0,r[1]=1):(r[0]=1,r[1]=0),r):e?[0,1]:[1,0]}var n,i,a,o=1;for((r=r||new Array(t))[0]=0,a=1;a<t;++a)r[a]=a,o=o*a|0;for(a=t-1;a>0;--a)e=e-(n=e/o|0)*o|0,o=o/a|0,i=0|r[a],r[a]=0|r[n],r[n]=0|i;return r}},{"invert-permutation":383,"typedarray-pool":507}],432:[function(t,e,r){"use strict";e.exports=function(t,e,r){var n,a,o={};if("string"==typeof e&&(e=i(e)),Array.isArray(e)){var s={};for(a=0;a<e.length;a++)s[e[a]]=!0;e=s}for(n in e)e[n]=i(e[n]);var l={};for(n in e){var c=e[n];if(Array.isArray(c))for(a=0;a<c.length;a++){var u=c[a];if(r&&(l[u]=!0),u in t){if(o[n]=t[u],r)for(var h=a;h<c.length;h++)l[c[h]]=!0;break}}else n in t&&(e[n]&&(o[n]=t[n]),r&&(l[n]=!0))}if(r)for(n in t)l[n]||(o[n]=t[n]);return o};var n={};function i(t){return n[t]?n[t]:("string"==typeof t&&(t=n[t]=t.split(/\s*,\s*|\s+/)),t)}},{}],433:[function(t,e,r){"use strict";e.exports=function(t,e){for(var r=0|e.length,i=t.length,a=[new Array(r),new Array(r)],o=0;o<r;++o)a[0][o]=[],a[1][o]=[];for(var o=0;o<i;++o){var s=t[o];a[0][s[0]].push(s),a[1][s[1]].push(s)}for(var l=[],o=0;o<r;++o)a[0][o].length+a[1][o].length===0&&l.push([o]);function c(t,e){var r=a[e][t[e]];r.splice(r.indexOf(t),1)}function u(t,r,i){for(var o,s,l,u=0;u<2;++u)if(a[u][r].length>0){o=a[u][r][0],l=u;break}s=o[1^l];for(var h=0;h<2;++h)for(var f=a[h][r],p=0;p<f.length;++p){var d=f[p],g=d[1^h],m=n(e[t],e[r],e[s],e[g]);m>0&&(o=d,s=g,l=h)}return i?s:(o&&c(o,l),s)}function h(t,r){var i=a[r][t][0],o=[t];c(i,r);for(var s=i[1^r];;){for(;s!==t;)o.push(s),s=u(o[o.length-2],s,!1);if(a[0][t].length+a[1][t].length===0)break;var l=o[o.length-1],h=t,f=o[1],p=u(l,h,!0);if(n(e[l],e[h],e[f],e[p])<0)break;o.push(t),s=u(l,h)}return o}function f(t,e){return e[1]===e[e.length-1]}for(var o=0;o<r;++o)for(var p=0;p<2;++p){for(var d=[];a[p][o].length>0;){a[0][o].length;var g=h(o,p);f(d,g)?d.push.apply(d,g):(d.length>0&&l.push(d),d=g)}d.length>0&&l.push(d)}return l};var n=t("compare-angle")},{"compare-angle":114}],434:[function(t,e,r){"use strict";e.exports=function(t,e){for(var r=n(t,e.length),i=new Array(e.length),a=new Array(e.length),o=[],s=0;s<e.length;++s){var l=r[s].length;a[s]=l,i[s]=!0,l<=1&&o.push(s)}for(;o.length>0;){var c=o.pop();i[c]=!1;for(var u=r[c],s=0;s<u.length;++s){var h=u[s];0==--a[h]&&o.push(h)}}for(var f=new Array(e.length),p=[],s=0;s<e.length;++s)if(i[s]){var c=p.length;f[s]=c,p.push(e[s])}else f[s]=-1;for(var d=[],s=0;s<t.length;++s){var g=t[s];i[g[0]]&&i[g[1]]&&d.push([f[g[0]],f[g[1]]])}return[d,p]};var n=t("edges-to-adjacency-list")},{"edges-to-adjacency-list":156}],435:[function(t,e,r){"use strict";e.exports=function(t,e){var r=c(t,e);t=r[0];for(var h=(e=r[1]).length,f=(t.length,n(t,e.length)),p=0;p<h;++p)if(f[p].length%2==1)throw new Error("planar-graph-to-polyline: graph must be manifold");var d=i(t,e);for(var g=(d=d.filter(function(t){for(var r=t.length,n=[0],i=0;i<r;++i){var a=e[t[i]],l=e[t[(i+1)%r]],c=o(-a[0],a[1]),u=o(-a[0],l[1]),h=o(l[0],a[1]),f=o(l[0],l[1]);n=s(n,s(s(c,u),s(h,f)))}return n[n.length-1]>0})).length,m=new Array(g),v=new Array(g),p=0;p<g;++p){m[p]=p;var y=new Array(g),x=d[p].map(function(t){return e[t]}),b=a([x]),_=0;t:for(var w=0;w<g;++w)if(y[w]=0,p!==w){for(var k=d[w],M=k.length,A=0;A<M;++A){var T=b(e[k[A]]);if(0!==T){T<0&&(y[w]=1,_+=1);continue t}}y[w]=1,_+=1}v[p]=[_,p,y]}v.sort(function(t,e){return e[0]-t[0]});for(var p=0;p<g;++p)for(var y=v[p],S=y[1],E=y[2],w=0;w<g;++w)E[w]&&(m[w]=S);for(var C=function(t){for(var e=new Array(t),r=0;r<t;++r)e[r]=[];return e}(g),p=0;p<g;++p)C[p].push(m[p]),C[m[p]].push(p);for(var L={},z=u(h,!1),p=0;p<g;++p)for(var k=d[p],M=k.length,w=0;w<M;++w){var P=k[w],I=k[(w+1)%M],O=Math.min(P,I)+":"+Math.max(P,I);if(O in L){var D=L[O];C[D].push(p),C[p].push(D),z[P]=z[I]=!0}else L[O]=p}function R(t){for(var e=t.length,r=0;r<e;++r)if(!z[t[r]])return!1;return!0}for(var B=[],F=u(g,-1),p=0;p<g;++p)m[p]!==p||R(d[p])?F[p]=-1:(B.push(p),F[p]=0);var r=[];for(;B.length>0;){var N=B.pop(),j=C[N];l(j,function(t,e){return t-e});var V,U=j.length,q=F[N];if(0===q){var k=d[N];V=[k]}for(var p=0;p<U;++p){var H=j[p];if(!(F[H]>=0)&&(F[H]=1^q,B.push(H),0===q)){var k=d[H];R(k)||(k.reverse(),V.push(k))}}0===q&&r.push(V)}return r};var n=t("edges-to-adjacency-list"),i=t("planar-dual"),a=t("point-in-big-polygon"),o=t("two-product"),s=t("robust-sum"),l=t("uniq"),c=t("./lib/trim-leaves");function u(t,e){for(var r=new Array(t),n=0;n<t;++n)r[n]=e;return r}},{"./lib/trim-leaves":434,"edges-to-adjacency-list":156,"planar-dual":433,"point-in-big-polygon":439,"robust-sum":476,"two-product":505,uniq:509}],436:[function(t,e,r){"use strict";e.exports=t("./quad")},{"./quad":438}],437:[function(t,e,r){arguments[4][98][0].apply(r,arguments)},{dup:98}],438:[function(t,e,r){"use strict";var n=t("binary-search-bounds"),i=t("clamp"),a=t("parse-rect"),o=t("array-bounds"),s=t("pick-by-alias"),l=t("defined"),c=t("flatten-vertex-data"),u=t("is-obj"),h=t("dtype"),f=t("math-log2");function p(t,e){for(var r=e[0],n=e[1],a=1/(e[2]-r),o=1/(e[3]-n),s=new Array(t.length),l=0,c=t.length/2;l<c;l++)s[2*l]=i((t[2*l]-r)*a,0,1),s[2*l+1]=i((t[2*l+1]-n)*o,0,1);return s}e.exports=function(t,e){e||(e={}),t=c(t,"float64"),e=s(e,{bounds:"range bounds dataBox databox",maxDepth:"depth maxDepth maxdepth level maxLevel maxlevel levels",dtype:"type dtype format out dst output destination"});var r=l(e.maxDepth,255),i=l(e.bounds,o(t,2));i[0]===i[2]&&i[2]++,i[1]===i[3]&&i[3]++;var d,g=p(t,i),m=t.length>>>1;e.dtype||(e.dtype="array"),"string"==typeof e.dtype?d=new(h(e.dtype))(m):e.dtype&&(d=e.dtype,Array.isArray(d)&&(d.length=m));for(var v=0;v<m;++v)d[v]=v;var y=[],x=[],b=[],_=[];!function t(e,n,i,a,o,s){if(!a.length)return null;var l=y[o]||(y[o]=[]);var c=b[o]||(b[o]=[]);var u=x[o]||(x[o]=[]);var h=l.length;o++;if(o>r){for(var f=0;f<a.length;f++)l.push(a[f]),c.push(s),u.push(null,null,null,null);return h}l.push(a[0]);c.push(s);if(a.length<=1)return u.push(null,null,null,null),h;var p=.5*i;var d=e+p,m=n+p;var v=[],_=[],w=[],k=[];for(var M=1,A=a.length;M<A;M++){var T=a[M],S=g[2*T],E=g[2*T+1];S<d?E<m?v.push(T):_.push(T):E<m?w.push(T):k.push(T)}s<<=2;u.push(t(e,n,p,v,o,s),t(e,m,p,_,o,s+1),t(d,n,p,w,o,s+2),t(d,m,p,k,o,s+3));return h}(0,0,1,d,0,1);for(var w=0,k=0;k<y.length;k++){var M=y[k];if(d.set)d.set(M,w);else for(var A=0,T=M.length;A<T;A++)d[A+w]=M[A];var S=w+y[k].length;_[k]=[w,S],w=S}return d.range=function(){var e,r=[],o=arguments.length;for(;o--;)r[o]=arguments[o];if(u(r[r.length-1])){var c=r.pop();r.length||null==c.x&&null==c.l&&null==c.left||(r=[c],e={}),e=s(c,{level:"level maxLevel",d:"d diam diameter r radius px pxSize pixel pixelSize maxD size minSize",lod:"lod details ranges offsets"})}else e={};r.length||(r=i);var h=a.apply(void 0,r),d=[Math.min(h.x,h.x+h.width),Math.min(h.y,h.y+h.height),Math.max(h.x,h.x+h.width),Math.max(h.y,h.y+h.height)],g=d[0],m=d[1],v=d[2],w=d[3],k=p([g,m,v,w],i),M=k[0],A=k[1],T=k[2],S=k[3],C=l(e.level,y.length);if(null!=e.d){var L;"number"==typeof e.d?L=[e.d,e.d]:e.d.length&&(L=e.d),C=Math.min(Math.max(Math.ceil(-f(Math.abs(L[0])/(i[2]-i[0]))),Math.ceil(-f(Math.abs(L[1])/(i[3]-i[1])))),C)}if(C=Math.min(C,y.length),e.lod)return function(t,e,r,i,a){for(var o=[],s=0;s<a;s++){var l=b[s],c=_[s][0],u=E(t,e,s),h=E(r,i,s),f=n.ge(l,u),p=n.gt(l,h,f,l.length-1);o[s]=[f+c,p+c]}return o}(M,A,T,S,C);var z=[];return function e(r,n,i,a,o,s){if(null!==o&&null!==s){var l=r+i,c=n+i;if(!(M>l||A>c||T<r||S<n||a>=C||o===s)){var u=y[a];void 0===s&&(s=u.length);for(var h=o;h<s;h++){var f=u[h],p=t[2*f],d=t[2*f+1];p>=g&&p<=v&&d>=m&&d<=w&&z.push(f)}var b=x[a],_=b[4*o+0],k=b[4*o+1],E=b[4*o+2],L=b[4*o+3],P=function(t,e){for(var r=null,n=0;null===r;)if(r=t[4*e+n],++n>t.length)return null;return r}(b,o+1),I=.5*i,O=a+1;e(r,n,I,O,_,k||E||L||P),e(r,n+I,I,O,k,E||L||P),e(r+I,n,I,O,E,L||P),e(r+I,n+I,I,O,L,P)}}}(0,0,1,0,0,1),z},d;function E(t,e,r){for(var n=1,i=.5,a=.5,o=.5,s=0;s<r;s++)n<<=2,n+=t<i?e<a?0:1:e<a?2:3,o*=.5,i+=t<i?-o:o,a+=e<a?-o:o;return n}}},{"array-bounds":56,"binary-search-bounds":437,clamp:102,defined:148,dtype:153,"flatten-vertex-data":216,"is-obj":389,"math-log2":399,"parse-rect":426,"pick-by-alias":432}],439:[function(t,e,r){e.exports=function(t){for(var e=t.length,r=[],a=[],s=0;s<e;++s)for(var u=t[s],h=u.length,f=h-1,p=0;p<h;f=p++){var d=u[f],g=u[p];d[0]===g[0]?a.push([d,g]):r.push([d,g])}if(0===r.length)return 0===a.length?c:(m=l(a),function(t){return m(t[0],t[1])?0:1});var m;var v=i(r),y=function(t,e){return function(r){var i=o.le(e,r[0]);if(i<0)return 1;var a=t[i];if(!a){if(!(i>0&&e[i]===r[0]))return 1;a=t[i-1]}for(var s=1;a;){var l=a.key,c=n(r,l[0],l[1]);if(l[0][0]<l[1][0])if(c<0)a=a.left;else{if(!(c>0))return 0;s=-1,a=a.right}else if(c>0)a=a.left;else{if(!(c<0))return 0;s=1,a=a.right}}return s}}(v.slabs,v.coordinates);return 0===a.length?y:function(t,e){return function(r){return t(r[0],r[1])?0:e(r)}}(l(a),y)};var n=t("robust-orientation")[3],i=t("slab-decomposition"),a=t("interval-tree-1d"),o=t("binary-search-bounds");function s(){return!0}function l(t){for(var e={},r=0;r<t.length;++r){var n=t[r],i=n[0][0],o=n[0][1],l=n[1][1],c=[Math.min(o,l),Math.max(o,l)];i in e?e[i].push(c):e[i]=[c]}var u={},h=Object.keys(e);for(r=0;r<h.length;++r){var f=e[h[r]];u[h[r]]=a(f)}return function(t){return function(e,r){var n=t[e];return!!n&&!!n.queryPoint(r,s)}}(u)}function c(t){return 1}},{"binary-search-bounds":79,"interval-tree-1d":382,"robust-orientation":471,"slab-decomposition":487}],440:[function(t,e,r){var n,i=t("./lib/build-log"),a=t("./lib/epsilon"),o=t("./lib/intersecter"),s=t("./lib/segment-chainer"),l=t("./lib/segment-selector"),c=t("./lib/geojson"),u=!1,h=a();function f(t,e,r){var i=n.segments(t),a=n.segments(e),o=r(n.combine(i,a));return n.polygon(o)}n={buildLog:function(t){return!0===t?u=i():!1===t&&(u=!1),!1!==u&&u.list},epsilon:function(t){return h.epsilon(t)},segments:function(t){var e=o(!0,h,u);return t.regions.forEach(e.addRegion),{segments:e.calculate(t.inverted),inverted:t.inverted}},combine:function(t,e){return{combined:o(!1,h,u).calculate(t.segments,t.inverted,e.segments,e.inverted),inverted1:t.inverted,inverted2:e.inverted}},selectUnion:function(t){return{segments:l.union(t.combined,u),inverted:t.inverted1||t.inverted2}},selectIntersect:function(t){return{segments:l.intersect(t.combined,u),inverted:t.inverted1&&t.inverted2}},selectDifference:function(t){return{segments:l.difference(t.combined,u),inverted:t.inverted1&&!t.inverted2}},selectDifferenceRev:function(t){return{segments:l.differenceRev(t.combined,u),inverted:!t.inverted1&&t.inverted2}},selectXor:function(t){return{segments:l.xor(t.combined,u),inverted:t.inverted1!==t.inverted2}},polygon:function(t){return{regions:s(t.segments,h,u),inverted:t.inverted}},polygonFromGeoJSON:function(t){return c.toPolygon(n,t)},polygonToGeoJSON:function(t){return c.fromPolygon(n,h,t)},union:function(t,e){return f(t,e,n.selectUnion)},intersect:function(t,e){return f(t,e,n.selectIntersect)},difference:function(t,e){return f(t,e,n.selectDifference)},differenceRev:function(t,e){return f(t,e,n.selectDifferenceRev)},xor:function(t,e){return f(t,e,n.selectXor)}},"object"==typeof window&&(window.PolyBool=n),e.exports=n},{"./lib/build-log":441,"./lib/epsilon":442,"./lib/geojson":443,"./lib/intersecter":444,"./lib/segment-chainer":446,"./lib/segment-selector":447}],441:[function(t,e,r){e.exports=function(){var t,e=0,r=!1;function n(e,r){return t.list.push({type:e,data:r?JSON.parse(JSON.stringify(r)):void 0}),t}return t={list:[],segmentId:function(){return e++},checkIntersection:function(t,e){return n("check",{seg1:t,seg2:e})},segmentChop:function(t,e){return n("div_seg",{seg:t,pt:e}),n("chop",{seg:t,pt:e})},statusRemove:function(t){return n("pop_seg",{seg:t})},segmentUpdate:function(t){return n("seg_update",{seg:t})},segmentNew:function(t,e){return n("new_seg",{seg:t,primary:e})},segmentRemove:function(t){return n("rem_seg",{seg:t})},tempStatus:function(t,e,r){return n("temp_status",{seg:t,above:e,below:r})},rewind:function(t){return n("rewind",{seg:t})},status:function(t,e,r){return n("status",{seg:t,above:e,below:r})},vert:function(e){return e===r?t:(r=e,n("vert",{x:e}))},log:function(t){return"string"!=typeof t&&(t=JSON.stringify(t,!1,"  ")),n("log",{txt:t})},reset:function(){return n("reset")},selected:function(t){return n("selected",{segs:t})},chainStart:function(t){return n("chain_start",{seg:t})},chainRemoveHead:function(t,e){return n("chain_rem_head",{index:t,pt:e})},chainRemoveTail:function(t,e){return n("chain_rem_tail",{index:t,pt:e})},chainNew:function(t,e){return n("chain_new",{pt1:t,pt2:e})},chainMatch:function(t){return n("chain_match",{index:t})},chainClose:function(t){return n("chain_close",{index:t})},chainAddHead:function(t,e){return n("chain_add_head",{index:t,pt:e})},chainAddTail:function(t,e){return n("chain_add_tail",{index:t,pt:e})},chainConnect:function(t,e){return n("chain_con",{index1:t,index2:e})},chainReverse:function(t){return n("chain_rev",{index:t})},chainJoin:function(t,e){return n("chain_join",{index1:t,index2:e})},done:function(){return n("done")}}}},{}],442:[function(t,e,r){e.exports=function(t){"number"!=typeof t&&(t=1e-10);var e={epsilon:function(e){return"number"==typeof e&&(t=e),t},pointAboveOrOnLine:function(e,r,n){var i=r[0],a=r[1],o=n[0],s=n[1],l=e[0];return(o-i)*(e[1]-a)-(s-a)*(l-i)>=-t},pointBetween:function(e,r,n){var i=e[1]-r[1],a=n[0]-r[0],o=e[0]-r[0],s=n[1]-r[1],l=o*a+i*s;return!(l<t||l-(a*a+s*s)>-t)},pointsSameX:function(e,r){return Math.abs(e[0]-r[0])<t},pointsSameY:function(e,r){return Math.abs(e[1]-r[1])<t},pointsSame:function(t,r){return e.pointsSameX(t,r)&&e.pointsSameY(t,r)},pointsCompare:function(t,r){return e.pointsSameX(t,r)?e.pointsSameY(t,r)?0:t[1]<r[1]?-1:1:t[0]<r[0]?-1:1},pointsCollinear:function(e,r,n){var i=e[0]-r[0],a=e[1]-r[1],o=r[0]-n[0],s=r[1]-n[1];return Math.abs(i*s-o*a)<t},linesIntersect:function(e,r,n,i){var a=r[0]-e[0],o=r[1]-e[1],s=i[0]-n[0],l=i[1]-n[1],c=a*l-o*s;if(Math.abs(c)<t)return!1;var u=e[0]-n[0],h=e[1]-n[1],f=(s*h-l*u)/c,p=(a*h-o*u)/c,d={alongA:0,alongB:0,pt:[e[0]+f*a,e[1]+f*o]};return d.alongA=f<=-t?-2:f<t?-1:f-1<=-t?0:f-1<t?1:2,d.alongB=p<=-t?-2:p<t?-1:p-1<=-t?0:p-1<t?1:2,d},pointInsideRegion:function(e,r){for(var n=e[0],i=e[1],a=r[r.length-1][0],o=r[r.length-1][1],s=!1,l=0;l<r.length;l++){var c=r[l][0],u=r[l][1];u-i>t!=o-i>t&&(a-c)*(i-u)/(o-u)+c-n>t&&(s=!s),a=c,o=u}return s}};return e}},{}],443:[function(t,e,r){var n={toPolygon:function(t,e){function r(e){if(e.length<=0)return t.segments({inverted:!1,regions:[]});function r(e){var r=e.slice(0,e.length-1);return t.segments({inverted:!1,regions:[r]})}for(var n=r(e[0]),i=1;i<e.length;i++)n=t.selectDifference(t.combine(n,r(e[i])));return n}if("Polygon"===e.type)return t.polygon(r(e.coordinates));if("MultiPolygon"===e.type){for(var n=t.segments({inverted:!1,regions:[]}),i=0;i<e.coordinates.length;i++)n=t.selectUnion(t.combine(n,r(e.coordinates[i])));return t.polygon(n)}throw new Error("PolyBool: Cannot convert GeoJSON object to PolyBool polygon")},fromPolygon:function(t,e,r){function n(t,r){return e.pointInsideRegion([.5*(t[0][0]+t[1][0]),.5*(t[0][1]+t[1][1])],r)}function i(t){return{region:t,children:[]}}r=t.polygon(t.segments(r));var a=i(null);function o(t,e){for(var r=0;r<t.children.length;r++){if(n(e,(s=t.children[r]).region))return void o(s,e)}var a=i(e);for(r=0;r<t.children.length;r++){var s;n((s=t.children[r]).region,e)&&(a.children.push(s),t.children.splice(r,1),r--)}t.children.push(a)}for(var s=0;s<r.regions.length;s++){var l=r.regions[s];l.length<3||o(a,l)}function c(t,e){for(var r=0,n=t[t.length-1][0],i=t[t.length-1][1],a=[],o=0;o<t.length;o++){var s=t[o][0],l=t[o][1];a.push([s,l]),r+=l*n-s*i,n=s,i=l}return r<0!==e&&a.reverse(),a.push([a[0][0],a[0][1]]),a}var u=[];function h(t){var e=[c(t.region,!1)];u.push(e);for(var r=0;r<t.children.length;r++)e.push(f(t.children[r]))}function f(t){for(var e=0;e<t.children.length;e++)h(t.children[e]);return c(t.region,!0)}for(s=0;s<a.children.length;s++)h(a.children[s]);return u.length<=0?{type:"Polygon",coordinates:[]}:1==u.length?{type:"Polygon",coordinates:u[0]}:{type:"MultiPolygon",coordinates:u}}};e.exports=n},{}],444:[function(t,e,r){var n=t("./linked-list");e.exports=function(t,e,r){function i(t,e,n){return{id:r?r.segmentId():-1,start:t,end:e,myFill:{above:n.myFill.above,below:n.myFill.below},otherFill:null}}var a=n.create();function o(t,r){a.insertBefore(t,function(n){return function(t,r,n,i,a,o){var s=e.pointsCompare(r,a);return 0!==s?s:e.pointsSame(n,o)?0:t!==i?t?1:-1:e.pointAboveOrOnLine(n,i?a:o,i?o:a)?1:-1}(t.isStart,t.pt,r,n.isStart,n.pt,n.other.pt)<0})}function s(t,e){var r=function(t,e){var r=n.node({isStart:!0,pt:t.start,seg:t,primary:e,other:null,status:null});return o(r,t.end),r}(t,e);return function(t,e,r){var i=n.node({isStart:!1,pt:e.end,seg:e,primary:r,other:t,status:null});t.other=i,o(i,t.pt)}(r,t,e),r}function l(t,e){var n=i(e,t.seg.end,t.seg);return function(t,e){r&&r.segmentChop(t.seg,e),t.other.remove(),t.seg.end=e,t.other.pt=e,o(t.other,t.pt)}(t,e),s(n,t.primary)}function c(i,o){var s=n.create();function c(t){return s.findTransition(function(r){var n,i,a,o,s,l;return n=t,i=r.ev,a=n.seg.start,o=n.seg.end,s=i.seg.start,l=i.seg.end,(e.pointsCollinear(a,s,l)?e.pointsCollinear(o,s,l)?1:e.pointAboveOrOnLine(o,s,l)?1:-1:e.pointAboveOrOnLine(a,s,l)?1:-1)>0})}function u(t,n){var i=t.seg,a=n.seg,o=i.start,s=i.end,c=a.start,u=a.end;r&&r.checkIntersection(i,a);var h=e.linesIntersect(o,s,c,u);if(!1===h){if(!e.pointsCollinear(o,s,c))return!1;if(e.pointsSame(o,u)||e.pointsSame(s,c))return!1;var f=e.pointsSame(o,c),p=e.pointsSame(s,u);if(f&&p)return n;var d=!f&&e.pointBetween(o,c,u),g=!p&&e.pointBetween(s,c,u);if(f)return g?l(n,s):l(t,u),n;d&&(p||(g?l(n,s):l(t,u)),l(n,o))}else 0===h.alongA&&(-1===h.alongB?l(t,c):0===h.alongB?l(t,h.pt):1===h.alongB&&l(t,u)),0===h.alongB&&(-1===h.alongA?l(n,o):0===h.alongA?l(n,h.pt):1===h.alongA&&l(n,s));return!1}for(var h=[];!a.isEmpty();){var f=a.getHead();if(r&&r.vert(f.pt[0]),f.isStart){r&&r.segmentNew(f.seg,f.primary);var p=c(f),d=p.before?p.before.ev:null,g=p.after?p.after.ev:null;function m(){if(d){var t=u(f,d);if(t)return t}return!!g&&u(f,g)}r&&r.tempStatus(f.seg,!!d&&d.seg,!!g&&g.seg);var v,y,x=m();if(x)t?(y=null===f.seg.myFill.below||f.seg.myFill.above!==f.seg.myFill.below)&&(x.seg.myFill.above=!x.seg.myFill.above):x.seg.otherFill=f.seg.myFill,r&&r.segmentUpdate(x.seg),f.other.remove(),f.remove();if(a.getHead()!==f){r&&r.rewind(f.seg);continue}t?(y=null===f.seg.myFill.below||f.seg.myFill.above!==f.seg.myFill.below,f.seg.myFill.below=g?g.seg.myFill.above:i,f.seg.myFill.above=y?!f.seg.myFill.below:f.seg.myFill.below):null===f.seg.otherFill&&(v=g?f.primary===g.primary?g.seg.otherFill.above:g.seg.myFill.above:f.primary?o:i,f.seg.otherFill={above:v,below:v}),r&&r.status(f.seg,!!d&&d.seg,!!g&&g.seg),f.other.status=p.insert(n.node({ev:f}))}else{var b=f.status;if(null===b)throw new Error("PolyBool: Zero-length segment detected; your epsilon is probably too small or too large");if(s.exists(b.prev)&&s.exists(b.next)&&u(b.prev.ev,b.next.ev),r&&r.statusRemove(b.ev.seg),b.remove(),!f.primary){var _=f.seg.myFill;f.seg.myFill=f.seg.otherFill,f.seg.otherFill=_}h.push(f.seg)}a.getHead().remove()}return r&&r.done(),h}return t?{addRegion:function(t){for(var n,i,a,o=t[t.length-1],l=0;l<t.length;l++){n=o,o=t[l];var c=e.pointsCompare(n,o);0!==c&&s((i=c<0?n:o,a=c<0?o:n,{id:r?r.segmentId():-1,start:i,end:a,myFill:{above:null,below:null},otherFill:null}),!0)}},calculate:function(t){return c(t,!1)}}:{calculate:function(t,e,r,n){return t.forEach(function(t){s(i(t.start,t.end,t),!0)}),r.forEach(function(t){s(i(t.start,t.end,t),!1)}),c(e,n)}}}},{"./linked-list":445}],445:[function(t,e,r){e.exports={create:function(){var t={root:{root:!0,next:null},exists:function(e){return null!==e&&e!==t.root},isEmpty:function(){return null===t.root.next},getHead:function(){return t.root.next},insertBefore:function(e,r){for(var n=t.root,i=t.root.next;null!==i;){if(r(i))return e.prev=i.prev,e.next=i,i.prev.next=e,void(i.prev=e);n=i,i=i.next}n.next=e,e.prev=n,e.next=null},findTransition:function(e){for(var r=t.root,n=t.root.next;null!==n&&!e(n);)r=n,n=n.next;return{before:r===t.root?null:r,after:n,insert:function(t){return t.prev=r,t.next=n,r.next=t,null!==n&&(n.prev=t),t}}}};return t},node:function(t){return t.prev=null,t.next=null,t.remove=function(){t.prev.next=t.next,t.next&&(t.next.prev=t.prev),t.prev=null,t.next=null},t}}},{}],446:[function(t,e,r){e.exports=function(t,e,r){var n=[],i=[];return t.forEach(function(t){var a=t.start,o=t.end;if(e.pointsSame(a,o))console.warn("PolyBool: Warning: Zero-length segment detected; your epsilon is probably too small or too large");else{r&&r.chainStart(t);for(var s={index:0,matches_head:!1,matches_pt1:!1},l={index:0,matches_head:!1,matches_pt1:!1},c=s,u=0;u<n.length;u++){var h=(m=n[u])[0],f=(m[1],m[m.length-1]);if(m[m.length-2],e.pointsSame(h,a)){if(M(u,!0,!0))break}else if(e.pointsSame(h,o)){if(M(u,!0,!1))break}else if(e.pointsSame(f,a)){if(M(u,!1,!0))break}else if(e.pointsSame(f,o)&&M(u,!1,!1))break}if(c===s)return n.push([a,o]),void(r&&r.chainNew(a,o));if(c===l){r&&r.chainMatch(s.index);var p=s.index,d=s.matches_pt1?o:a,g=s.matches_head,m=n[p],v=g?m[0]:m[m.length-1],y=g?m[1]:m[m.length-2],x=g?m[m.length-1]:m[0],b=g?m[m.length-2]:m[1];return e.pointsCollinear(y,v,d)&&(g?(r&&r.chainRemoveHead(s.index,d),m.shift()):(r&&r.chainRemoveTail(s.index,d),m.pop()),v=y),e.pointsSame(x,d)?(n.splice(p,1),e.pointsCollinear(b,x,v)&&(g?(r&&r.chainRemoveTail(s.index,v),m.pop()):(r&&r.chainRemoveHead(s.index,v),m.shift())),r&&r.chainClose(s.index),void i.push(m)):void(g?(r&&r.chainAddHead(s.index,d),m.unshift(d)):(r&&r.chainAddTail(s.index,d),m.push(d)))}var _=s.index,w=l.index;r&&r.chainConnect(_,w);var k=n[_].length<n[w].length;s.matches_head?l.matches_head?k?(A(_),T(_,w)):(A(w),T(w,_)):T(w,_):l.matches_head?T(_,w):k?(A(_),T(w,_)):(A(w),T(_,w))}function M(t,e,r){return c.index=t,c.matches_head=e,c.matches_pt1=r,c===s?(c=l,!1):(c=null,!0)}function A(t){r&&r.chainReverse(t),n[t].reverse()}function T(t,i){var a=n[t],o=n[i],s=a[a.length-1],l=a[a.length-2],c=o[0],u=o[1];e.pointsCollinear(l,s,c)&&(r&&r.chainRemoveTail(t,s),a.pop(),s=l),e.pointsCollinear(s,c,u)&&(r&&r.chainRemoveHead(i,c),o.shift()),r&&r.chainJoin(t,i),n[t]=a.concat(o),n.splice(i,1)}}),i}},{}],447:[function(t,e,r){function n(t,e,r){var n=[];return t.forEach(function(t){var i=(t.myFill.above?8:0)+(t.myFill.below?4:0)+(t.otherFill&&t.otherFill.above?2:0)+(t.otherFill&&t.otherFill.below?1:0);0!==e[i]&&n.push({id:r?r.segmentId():-1,start:t.start,end:t.end,myFill:{above:1===e[i],below:2===e[i]},otherFill:null})}),r&&r.selected(n),n}var i={union:function(t,e){return n(t,[0,2,1,0,2,2,0,0,1,0,1,0,0,0,0,0],e)},intersect:function(t,e){return n(t,[0,0,0,0,0,2,0,2,0,0,1,1,0,2,1,0],e)},difference:function(t,e){return n(t,[0,0,0,0,2,0,2,0,1,1,0,0,0,1,2,0],e)},differenceRev:function(t,e){return n(t,[0,2,1,0,0,0,1,1,0,2,0,2,0,0,0,0],e)},xor:function(t,e){return n(t,[0,2,1,0,2,0,0,1,1,0,0,2,0,1,2,0],e)}};e.exports=i},{}],448:[function(t,e,r){"use strict";var n=new Float64Array(4),i=new Float64Array(4),a=new Float64Array(4);e.exports=function(t,e,r,o,s){n.length<o.length&&(n=new Float64Array(o.length),i=new Float64Array(o.length),a=new Float64Array(o.length));for(var l=0;l<o.length;++l)n[l]=t[l]-o[l],i[l]=e[l]-t[l],a[l]=r[l]-t[l];var c=0,u=0,h=0,f=0,p=0,d=0;for(l=0;l<o.length;++l){var g=i[l],m=a[l],v=n[l];c+=g*g,u+=g*m,h+=m*m,f+=v*g,p+=v*m,d+=v*v}var y,x,b,_,w,k=Math.abs(c*h-u*u),M=u*p-h*f,A=u*f-c*p;if(M+A<=k)if(M<0)A<0&&f<0?(A=0,-f>=c?(M=1,y=c+2*f+d):y=f*(M=-f/c)+d):(M=0,p>=0?(A=0,y=d):-p>=h?(A=1,y=h+2*p+d):y=p*(A=-p/h)+d);else if(A<0)A=0,f>=0?(M=0,y=d):-f>=c?(M=1,y=c+2*f+d):y=f*(M=-f/c)+d;else{var T=1/k;y=(M*=T)*(c*M+u*(A*=T)+2*f)+A*(u*M+h*A+2*p)+d}else M<0?(b=h+p)>(x=u+f)?(_=b-x)>=(w=c-2*u+h)?(M=1,A=0,y=c+2*f+d):y=(M=_/w)*(c*M+u*(A=1-M)+2*f)+A*(u*M+h*A+2*p)+d:(M=0,b<=0?(A=1,y=h+2*p+d):p>=0?(A=0,y=d):y=p*(A=-p/h)+d):A<0?(b=c+f)>(x=u+p)?(_=b-x)>=(w=c-2*u+h)?(A=1,M=0,y=h+2*p+d):y=(M=1-(A=_/w))*(c*M+u*A+2*f)+A*(u*M+h*A+2*p)+d:(A=0,b<=0?(M=1,y=c+2*f+d):f>=0?(M=0,y=d):y=f*(M=-f/c)+d):(_=h+p-u-f)<=0?(M=0,A=1,y=h+2*p+d):_>=(w=c-2*u+h)?(M=1,A=0,y=c+2*f+d):y=(M=_/w)*(c*M+u*(A=1-M)+2*f)+A*(u*M+h*A+2*p)+d;var S=1-M-A;for(l=0;l<o.length;++l)s[l]=S*t[l]+M*e[l]+A*r[l];return y<0?0:y}},{}],449:[function(t,e,r){var n,i,a=e.exports={};function o(){throw new Error("setTimeout has not been defined")}function s(){throw new Error("clearTimeout has not been defined")}function l(t){if(n===setTimeout)return setTimeout(t,0);if((n===o||!n)&&setTimeout)return n=setTimeout,setTimeout(t,0);try{return n(t,0)}catch(e){try{return n.call(null,t,0)}catch(e){return n.call(this,t,0)}}}!function(){try{n="function"==typeof setTimeout?setTimeout:o}catch(t){n=o}try{i="function"==typeof clearTimeout?clearTimeout:s}catch(t){i=s}}();var c,u=[],h=!1,f=-1;function p(){h&&c&&(h=!1,c.length?u=c.concat(u):f=-1,u.length&&d())}function d(){if(!h){var t=l(p);h=!0;for(var e=u.length;e;){for(c=u,u=[];++f<e;)c&&c[f].run();f=-1,e=u.length}c=null,h=!1,function(t){if(i===clearTimeout)return clearTimeout(t);if((i===s||!i)&&clearTimeout)return i=clearTimeout,clearTimeout(t);try{i(t)}catch(e){try{return i.call(null,t)}catch(e){return i.call(this,t)}}}(t)}}function g(t,e){this.fun=t,this.array=e}function m(){}a.nextTick=function(t){var e=new Array(arguments.length-1);if(arguments.length>1)for(var r=1;r<arguments.length;r++)e[r-1]=arguments[r];u.push(new g(t,e)),1!==u.length||h||l(d)},g.prototype.run=function(){this.fun.apply(null,this.array)},a.title="browser",a.browser=!0,a.env={},a.argv=[],a.version="",a.versions={},a.on=m,a.addListener=m,a.once=m,a.off=m,a.removeListener=m,a.removeAllListeners=m,a.emit=m,a.prependListener=m,a.prependOnceListener=m,a.listeners=function(t){return[]},a.binding=function(t){throw new Error("process.binding is not supported")},a.cwd=function(){return"/"},a.chdir=function(t){throw new Error("process.chdir is not supported")},a.umask=function(){return 0}},{}],450:[function(t,e,r){e.exports=t("gl-quat/slerp")},{"gl-quat/slerp":280}],451:[function(t,e,r){(function(r){for(var n=t("performance-now"),i="undefined"==typeof window?r:window,a=["moz","webkit"],o="AnimationFrame",s=i["request"+o],l=i["cancel"+o]||i["cancelRequest"+o],c=0;!s&&c<a.length;c++)s=i[a[c]+"Request"+o],l=i[a[c]+"Cancel"+o]||i[a[c]+"CancelRequest"+o];if(!s||!l){var u=0,h=0,f=[];s=function(t){if(0===f.length){var e=n(),r=Math.max(0,1e3/60-(e-u));u=r+e,setTimeout(function(){var t=f.slice(0);f.length=0;for(var e=0;e<t.length;e++)if(!t[e].cancelled)try{t[e].callback(u)}catch(t){setTimeout(function(){throw t},0)}},Math.round(r))}return f.push({handle:++h,callback:t,cancelled:!1}),h},l=function(t){for(var e=0;e<f.length;e++)f[e].handle===t&&(f[e].cancelled=!0)}}e.exports=function(t){return s.call(i,t)},e.exports.cancel=function(){l.apply(i,arguments)},e.exports.polyfill=function(t){t||(t=i),t.requestAnimationFrame=s,t.cancelAnimationFrame=l}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"performance-now":429}],452:[function(t,e,r){"use strict";var n=t("big-rat/add");e.exports=function(t,e){for(var r=t.length,i=new Array(r),a=0;a<r;++a)i[a]=n(t[a],e[a]);return i}},{"big-rat/add":63}],453:[function(t,e,r){"use strict";e.exports=function(t){for(var e=new Array(t.length),r=0;r<t.length;++r)e[r]=n(t[r]);return e};var n=t("big-rat")},{"big-rat":66}],454:[function(t,e,r){"use strict";var n=t("big-rat"),i=t("big-rat/mul");e.exports=function(t,e){for(var r=n(e),a=t.length,o=new Array(a),s=0;s<a;++s)o[s]=i(t[s],r);return o}},{"big-rat":66,"big-rat/mul":75}],455:[function(t,e,r){"use strict";var n=t("big-rat/sub");e.exports=function(t,e){for(var r=t.length,i=new Array(r),a=0;a<r;++a)i[a]=n(t[a],e[a]);return i}},{"big-rat/sub":77}],456:[function(t,e,r){"use strict";var n=t("compare-cell"),i=t("compare-oriented-cell"),a=t("cell-orientation");e.exports=function(t){t.sort(i);for(var e=t.length,r=0,o=0;o<e;++o){var s=t[o],l=a(s);if(0!==l){if(r>0){var c=t[r-1];if(0===n(s,c)&&a(c)!==l){r-=1;continue}}t[r++]=s}}return t.length=r,t}},{"cell-orientation":99,"compare-cell":115,"compare-oriented-cell":116}],457:[function(t,e,r){"use strict";var n=t("array-bounds"),i=t("color-normalize"),a=t("update-diff"),o=t("pick-by-alias"),s=t("object-assign"),l=t("flatten-vertex-data"),c=t("to-float32"),u=c.float32,h=c.fract32;e.exports=function(t,e){"function"==typeof t?(e||(e={}),e.regl=t):e=t;e.length&&(e.positions=e);if(!(t=e.regl).hasExtension("ANGLE_instanced_arrays"))throw Error("regl-error2d: `ANGLE_instanced_arrays` extension should be enabled");var r,c,p,d,g,m,v=t._gl,y={color:"black",capSize:5,lineWidth:1,opacity:1,viewport:null,range:null,offset:0,count:0,bounds:null,positions:[],errors:[]},x=[];return d=t.buffer({usage:"dynamic",type:"uint8",data:new Uint8Array(0)}),c=t.buffer({usage:"dynamic",type:"float",data:new Uint8Array(0)}),p=t.buffer({usage:"dynamic",type:"float",data:new Uint8Array(0)}),g=t.buffer({usage:"dynamic",type:"float",data:new Uint8Array(0)}),m=t.buffer({usage:"static",type:"float",data:f}),k(e),r=t({vert:"\n\t\tprecision highp float;\n\n\t\tattribute vec2 position, positionFract;\n\t\tattribute vec4 error;\n\t\tattribute vec4 color;\n\n\t\tattribute vec2 direction, lineOffset, capOffset;\n\n\t\tuniform vec4 viewport;\n\t\tuniform float lineWidth, capSize;\n\t\tuniform vec2 scale, scaleFract, translate, translateFract;\n\n\t\tvarying vec4 fragColor;\n\n\t\tvoid main() {\n\t\t\tfragColor = color / 255.;\n\n\t\t\tvec2 pixelOffset = lineWidth * lineOffset + (capSize + lineWidth) * capOffset;\n\n\t\t\tvec2 dxy = -step(.5, direction.xy) * error.xz + step(direction.xy, vec2(-.5)) * error.yw;\n\n\t\t\tvec2 position = position + dxy;\n\n\t\t\tvec2 pos = (position + translate) * scale\n\t\t\t\t+ (positionFract + translateFract) * scale\n\t\t\t\t+ (position + translate) * scaleFract\n\t\t\t\t+ (positionFract + translateFract) * scaleFract;\n\n\t\t\tpos += pixelOffset / viewport.zw;\n\n\t\t\tgl_Position = vec4(pos * 2. - 1., 0, 1);\n\t\t}\n\t\t",frag:"\n\t\tprecision mediump float;\n\n\t\tvarying vec4 fragColor;\n\n\t\tuniform float opacity;\n\n\t\tvoid main() {\n\t\t\tgl_FragColor = fragColor;\n\t\t\tgl_FragColor.a *= opacity;\n\t\t}\n\t\t",uniforms:{range:t.prop("range"),lineWidth:t.prop("lineWidth"),capSize:t.prop("capSize"),opacity:t.prop("opacity"),scale:t.prop("scale"),translate:t.prop("translate"),scaleFract:t.prop("scaleFract"),translateFract:t.prop("translateFract"),viewport:function(t,e){return[e.viewport.x,e.viewport.y,t.viewportWidth,t.viewportHeight]}},attributes:{color:{buffer:d,offset:function(t,e){return 4*e.offset},divisor:1},position:{buffer:c,offset:function(t,e){return 8*e.offset},divisor:1},positionFract:{buffer:p,offset:function(t,e){return 8*e.offset},divisor:1},error:{buffer:g,offset:function(t,e){return 16*e.offset},divisor:1},direction:{buffer:m,stride:24,offset:0},lineOffset:{buffer:m,stride:24,offset:8},capOffset:{buffer:m,stride:24,offset:16}},primitive:"triangles",blend:{enable:!0,color:[0,0,0,0],equation:{rgb:"add",alpha:"add"},func:{srcRGB:"src alpha",dstRGB:"one minus src alpha",srcAlpha:"one minus dst alpha",dstAlpha:"one"}},depth:{enable:!1},scissor:{enable:!0,box:t.prop("viewport")},viewport:t.prop("viewport"),stencil:!1,instances:t.prop("count"),count:f.length}),s(b,{update:k,draw:_,destroy:M,regl:t,gl:v,canvas:v.canvas,groups:x}),b;function b(t){t?k(t):null===t&&M(),_()}function _(e){if("number"==typeof e)return w(e);e&&!Array.isArray(e)&&(e=[e]),t._refresh(),x.forEach(function(t,r){t&&(e&&(e[r]?t.draw=!0:t.draw=!1),t.draw?w(r):t.draw=!0)})}function w(t){"number"==typeof t&&(t=x[t]),null!=t&&t&&t.count&&t.color&&t.opacity&&t.positions&&t.positions.length>1&&(t.scaleRatio=[t.scale[0]*t.viewport.width,t.scale[1]*t.viewport.height],r(t),t.after&&t.after(t))}function k(t){if(t){null!=t.length?"number"==typeof t[0]&&(t=[{positions:t}]):Array.isArray(t)||(t=[t]);var e=0,r=0;if(b.groups=x=t.map(function(t,c){var u=x[c];return t?("function"==typeof t?t={after:t}:"number"==typeof t[0]&&(t={positions:t}),t=o(t,{color:"color colors fill",capSize:"capSize cap capsize cap-size",lineWidth:"lineWidth line-width width line thickness",opacity:"opacity alpha",range:"range dataBox",viewport:"viewport viewBox",errors:"errors error",positions:"positions position data points"}),u||(x[c]=u={id:c,scale:null,translate:null,scaleFract:null,translateFract:null,draw:!0},t=s({},y,t)),a(u,t,[{lineWidth:function(t){return.5*+t},capSize:function(t){return.5*+t},opacity:parseFloat,errors:function(t){return t=l(t),r+=t.length,t},positions:function(t,r){return t=l(t,"float64"),r.count=Math.floor(t.length/2),r.bounds=n(t,2),r.offset=e,e+=r.count,t}},{color:function(t,e){var r=e.count;if(t||(t="transparent"),!Array.isArray(t)||"number"==typeof t[0]){var n=t;t=Array(r);for(var a=0;a<r;a++)t[a]=n}if(t.length<r)throw Error("Not enough colors");for(var o=new Uint8Array(4*r),s=0;s<r;s++){var l=i(t[s],"uint8");o.set(l,4*s)}return o},range:function(t,e,r){var n=e.bounds;return t||(t=n),e.scale=[1/(t[2]-t[0]),1/(t[3]-t[1])],e.translate=[-t[0],-t[1]],e.scaleFract=h(e.scale),e.translateFract=h(e.translate),t},viewport:function(t){var e;return Array.isArray(t)?e={x:t[0],y:t[1],width:t[2]-t[0],height:t[3]-t[1]}:t?(e={x:t.x||t.left||0,y:t.y||t.top||0},t.right?e.width=t.right-e.x:e.width=t.w||t.width||0,t.bottom?e.height=t.bottom-e.y:e.height=t.h||t.height||0):e={x:0,y:0,width:v.drawingBufferWidth,height:v.drawingBufferHeight},e}}]),u):u}),e||r){var f=x.reduce(function(t,e,r){return t+(e?e.count:0)},0),m=new Float64Array(2*f),_=new Uint8Array(4*f),w=new Float32Array(4*f);x.forEach(function(t,e){if(t){var r=t.positions,n=t.count,i=t.offset,a=t.color,o=t.errors;n&&(_.set(a,4*i),w.set(o,4*i),m.set(r,2*i))}}),c(u(m)),p(h(m)),d(_),g(w)}}}function M(){c.destroy(),p.destroy(),d.destroy(),g.destroy(),m.destroy()}};var f=[[1,0,0,1,0,0],[1,0,0,-1,0,0],[-1,0,0,-1,0,0],[-1,0,0,-1,0,0],[-1,0,0,1,0,0],[1,0,0,1,0,0],[1,0,-1,0,0,1],[1,0,-1,0,0,-1],[1,0,1,0,0,-1],[1,0,1,0,0,-1],[1,0,1,0,0,1],[1,0,-1,0,0,1],[-1,0,-1,0,0,1],[-1,0,-1,0,0,-1],[-1,0,1,0,0,-1],[-1,0,1,0,0,-1],[-1,0,1,0,0,1],[-1,0,-1,0,0,1],[0,1,1,0,0,0],[0,1,-1,0,0,0],[0,-1,-1,0,0,0],[0,-1,-1,0,0,0],[0,1,1,0,0,0],[0,-1,1,0,0,0],[0,1,0,-1,1,0],[0,1,0,-1,-1,0],[0,1,0,1,-1,0],[0,1,0,1,1,0],[0,1,0,-1,1,0],[0,1,0,1,-1,0],[0,-1,0,-1,1,0],[0,-1,0,-1,-1,0],[0,-1,0,1,-1,0],[0,-1,0,1,1,0],[0,-1,0,-1,1,0],[0,-1,0,1,-1,0]]},{"array-bounds":56,"color-normalize":107,"flatten-vertex-data":216,"object-assign":421,"pick-by-alias":432,"to-float32":500,"update-diff":511}],458:[function(t,e,r){"use strict";var n=t("color-normalize"),i=t("array-bounds"),a=t("object-assign"),o=t("glslify"),s=t("pick-by-alias"),l=t("flatten-vertex-data"),c=t("earcut"),u=t("array-normalize"),h=t("to-float32"),f=h.float32,p=h.fract32,d=t("es6-weak-map"),g=t("parse-rect");function m(t,e){if(!(this instanceof m))return new m(t,e);if("function"==typeof t?(e||(e={}),e.regl=t):e=t,e.length&&(e.positions=e),!(t=e.regl).hasExtension("ANGLE_instanced_arrays"))throw Error("regl-error2d: `ANGLE_instanced_arrays` extension should be enabled");this.gl=t._gl,this.regl=t,this.passes=[],this.shaders=m.shaders.has(t)?m.shaders.get(t):m.shaders.set(t,m.createShaders(t)).get(t),this.update(e)}e.exports=m,m.dashMult=2,m.maxPatternLength=256,m.precisionThreshold=3e6,m.maxPoints=1e4,m.maxLines=2048,m.shaders=new d,m.createShaders=function(t){var e,r=t.buffer({usage:"static",type:"float",data:[0,1,0,0,1,1,1,0]}),n={primitive:"triangle strip",instances:t.prop("count"),count:4,offset:0,uniforms:{miterMode:function(t,e){return"round"===e.join?2:1},miterLimit:t.prop("miterLimit"),scale:t.prop("scale"),scaleFract:t.prop("scaleFract"),translateFract:t.prop("translateFract"),translate:t.prop("translate"),thickness:t.prop("thickness"),dashPattern:t.prop("dashTexture"),opacity:t.prop("opacity"),pixelRatio:t.context("pixelRatio"),id:t.prop("id"),dashSize:t.prop("dashLength"),viewport:function(t,e){return[e.viewport.x,e.viewport.y,t.viewportWidth,t.viewportHeight]},depth:t.prop("depth")},blend:{enable:!0,color:[0,0,0,0],equation:{rgb:"add",alpha:"add"},func:{srcRGB:"src alpha",dstRGB:"one minus src alpha",srcAlpha:"one minus dst alpha",dstAlpha:"one"}},depth:{enable:function(t,e){return!e.overlay}},stencil:{enable:!1},scissor:{enable:!0,box:t.prop("viewport")},viewport:t.prop("viewport")},i=t(a({vert:o(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec2 aCoord, bCoord, aCoordFract, bCoordFract;\nattribute vec4 color;\nattribute float lineEnd, lineTop;\n\nuniform vec2 scale, scaleFract, translate, translateFract;\nuniform float thickness, pixelRatio, id, depth;\nuniform vec4 viewport;\n\nvarying vec4 fragColor;\nvarying vec2 tangent;\n\nvec2 project(vec2 position, vec2 positionFract, vec2 scale, vec2 scaleFract, vec2 translate, vec2 translateFract) {\n\t// the order is important\n\treturn position * scale + translate\n       + positionFract * scale + translateFract\n       + position * scaleFract\n       + positionFract * scaleFract;\n}\n\nvoid main() {\n\tfloat lineStart = 1. - lineEnd;\n\tfloat lineOffset = lineTop * 2. - 1.;\n\n\tvec2 diff = (bCoord + bCoordFract - aCoord - aCoordFract);\n\ttangent = normalize(diff * scale * viewport.zw);\n\tvec2 normal = vec2(-tangent.y, tangent.x);\n\n\tvec2 position = project(aCoord, aCoordFract, scale, scaleFract, translate, translateFract) * lineStart\n\t\t+ project(bCoord, bCoordFract, scale, scaleFract, translate, translateFract) * lineEnd\n\n\t\t+ thickness * normal * .5 * lineOffset / viewport.zw;\n\n\tgl_Position = vec4(position * 2.0 - 1.0, depth, 1);\n\n\tfragColor = color / 255.;\n}\n"]),frag:o(["precision highp float;\n#define GLSLIFY 1\n\nuniform sampler2D dashPattern;\n\nuniform float dashSize, pixelRatio, thickness, opacity, id;\n\nvarying vec4 fragColor;\nvarying vec2 tangent;\n\nvoid main() {\n\tfloat alpha = 1.;\n\n\tfloat t = fract(dot(tangent, gl_FragCoord.xy) / dashSize) * .5 + .25;\n\tfloat dash = texture2D(dashPattern, vec2(t, .5)).r;\n\n\tgl_FragColor = fragColor;\n\tgl_FragColor.a *= alpha * opacity * dash;\n}\n"]),attributes:{lineEnd:{buffer:r,divisor:0,stride:8,offset:0},lineTop:{buffer:r,divisor:0,stride:8,offset:4},aCoord:{buffer:t.prop("positionBuffer"),stride:8,offset:8,divisor:1},bCoord:{buffer:t.prop("positionBuffer"),stride:8,offset:16,divisor:1},aCoordFract:{buffer:t.prop("positionFractBuffer"),stride:8,offset:8,divisor:1},bCoordFract:{buffer:t.prop("positionFractBuffer"),stride:8,offset:16,divisor:1},color:{buffer:t.prop("colorBuffer"),stride:4,offset:0,divisor:1}}},n));try{e=t(a({cull:{enable:!0,face:"back"},vert:o(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec2 aCoord, bCoord, nextCoord, prevCoord;\nattribute vec4 aColor, bColor;\nattribute float lineEnd, lineTop;\n\nuniform vec2 scale, translate;\nuniform float thickness, pixelRatio, id, depth;\nuniform vec4 viewport;\nuniform float miterLimit, miterMode;\n\nvarying vec4 fragColor;\nvarying vec4 startCutoff, endCutoff;\nvarying vec2 tangent;\nvarying vec2 startCoord, endCoord;\nvarying float enableStartMiter, enableEndMiter;\n\nconst float REVERSE_THRESHOLD = -.875;\nconst float MIN_DIFF = 1e-6;\n\n// TODO: possible optimizations: avoid overcalculating all for vertices and calc just one instead\n// TODO: precalculate dot products, normalize things beforehead etc.\n// TODO: refactor to rectangular algorithm\n\nfloat distToLine(vec2 p, vec2 a, vec2 b) {\n\tvec2 diff = b - a;\n\tvec2 perp = normalize(vec2(-diff.y, diff.x));\n\treturn dot(p - a, perp);\n}\n\nbool isNaN( float val ){\n  return ( val < 0.0 || 0.0 < val || val == 0.0 ) ? false : true;\n}\n\nvoid main() {\n\tvec2 aCoord = aCoord, bCoord = bCoord, prevCoord = prevCoord, nextCoord = nextCoord;\n\n\t// adjust scale for horizontal bars\n\tvec2 scale = max(scale, MIN_DIFF);\n\tvec2 scaleRatio = scale * viewport.zw;\n\n\tvec2 normalWidth = thickness / scaleRatio;\n\n\tfloat lineStart = 1. - lineEnd;\n\tfloat lineBot = 1. - lineTop;\n\n\tfragColor = (lineStart * aColor + lineEnd * bColor) / 255.;\n\n\tif (isNaN(aCoord.x) || isNaN(aCoord.y) || isNaN(bCoord.x) || isNaN(bCoord.y)) return;\n\n\tif (aCoord == prevCoord) prevCoord = aCoord + normalize(bCoord - aCoord);\n\tif (bCoord == nextCoord) nextCoord = bCoord - normalize(bCoord - aCoord);\n\n\tvec2 prevDiff = aCoord - prevCoord;\n\tvec2 currDiff = bCoord - aCoord;\n\tvec2 nextDiff = nextCoord - bCoord;\n\n\tvec2 prevTangent = normalize(prevDiff * scaleRatio);\n\tvec2 currTangent = normalize(currDiff * scaleRatio);\n\tvec2 nextTangent = normalize(nextDiff * scaleRatio);\n\n\tvec2 prevNormal = vec2(-prevTangent.y, prevTangent.x);\n\tvec2 currNormal = vec2(-currTangent.y, currTangent.x);\n\tvec2 nextNormal = vec2(-nextTangent.y, nextTangent.x);\n\n\tvec2 startJoinDirection = normalize(prevTangent - currTangent);\n\tvec2 endJoinDirection = normalize(currTangent - nextTangent);\n\n\t// collapsed/unidirectional segment cases\n\t// FIXME: there should be more elegant solution\n\tvec2 prevTanDiff = abs(prevTangent - currTangent);\n\tvec2 nextTanDiff = abs(nextTangent - currTangent);\n\tif (max(prevTanDiff.x, prevTanDiff.y) < MIN_DIFF) {\n\t\tstartJoinDirection = currNormal;\n\t}\n\tif (max(nextTanDiff.x, nextTanDiff.y) < MIN_DIFF) {\n\t\tendJoinDirection = currNormal;\n\t}\n\tif (aCoord == bCoord) {\n\t\tendJoinDirection = startJoinDirection;\n\t\tcurrNormal = prevNormal;\n\t\tcurrTangent = prevTangent;\n\t}\n\n\ttangent = currTangent;\n\n\t//calculate join shifts relative to normals\n\tfloat startJoinShift = dot(currNormal, startJoinDirection);\n\tfloat endJoinShift = dot(currNormal, endJoinDirection);\n\n\tfloat startMiterRatio = abs(1. / startJoinShift);\n\tfloat endMiterRatio = abs(1. / endJoinShift);\n\n\tvec2 startJoin = startJoinDirection * startMiterRatio;\n\tvec2 endJoin = endJoinDirection * endMiterRatio;\n\n\tvec2 startTopJoin, startBotJoin, endTopJoin, endBotJoin;\n\tstartTopJoin = sign(startJoinShift) * startJoin * .5;\n\tstartBotJoin = -startTopJoin;\n\n\tendTopJoin = sign(endJoinShift) * endJoin * .5;\n\tendBotJoin = -endTopJoin;\n\n\tvec2 aTopCoord = aCoord + normalWidth * startTopJoin;\n\tvec2 bTopCoord = bCoord + normalWidth * endTopJoin;\n\tvec2 aBotCoord = aCoord + normalWidth * startBotJoin;\n\tvec2 bBotCoord = bCoord + normalWidth * endBotJoin;\n\n\t//miter anti-clipping\n\tfloat baClipping = distToLine(bCoord, aCoord, aBotCoord) / dot(normalize(normalWidth * endBotJoin), normalize(normalWidth.yx * vec2(-startBotJoin.y, startBotJoin.x)));\n\tfloat abClipping = distToLine(aCoord, bCoord, bTopCoord) / dot(normalize(normalWidth * startBotJoin), normalize(normalWidth.yx * vec2(-endBotJoin.y, endBotJoin.x)));\n\n\t//prevent close to reverse direction switch\n\tbool prevReverse = dot(currTangent, prevTangent) <= REVERSE_THRESHOLD && abs(dot(currTangent, prevNormal)) * min(length(prevDiff), length(currDiff)) <  length(normalWidth * currNormal);\n\tbool nextReverse = dot(currTangent, nextTangent) <= REVERSE_THRESHOLD && abs(dot(currTangent, nextNormal)) * min(length(nextDiff), length(currDiff)) <  length(normalWidth * currNormal);\n\n\tif (prevReverse) {\n\t\t//make join rectangular\n\t\tvec2 miterShift = normalWidth * startJoinDirection * miterLimit * .5;\n\t\tfloat normalAdjust = 1. - min(miterLimit / startMiterRatio, 1.);\n\t\taBotCoord = aCoord + miterShift - normalAdjust * normalWidth * currNormal * .5;\n\t\taTopCoord = aCoord + miterShift + normalAdjust * normalWidth * currNormal * .5;\n\t}\n\telse if (!nextReverse && baClipping > 0. && baClipping < length(normalWidth * endBotJoin)) {\n\t\t//handle miter clipping\n\t\tbTopCoord -= normalWidth * endTopJoin;\n\t\tbTopCoord += normalize(endTopJoin * normalWidth) * baClipping;\n\t}\n\n\tif (nextReverse) {\n\t\t//make join rectangular\n\t\tvec2 miterShift = normalWidth * endJoinDirection * miterLimit * .5;\n\t\tfloat normalAdjust = 1. - min(miterLimit / endMiterRatio, 1.);\n\t\tbBotCoord = bCoord + miterShift - normalAdjust * normalWidth * currNormal * .5;\n\t\tbTopCoord = bCoord + miterShift + normalAdjust * normalWidth * currNormal * .5;\n\t}\n\telse if (!prevReverse && abClipping > 0. && abClipping < length(normalWidth * startBotJoin)) {\n\t\t//handle miter clipping\n\t\taBotCoord -= normalWidth * startBotJoin;\n\t\taBotCoord += normalize(startBotJoin * normalWidth) * abClipping;\n\t}\n\n\tvec2 aTopPosition = (aTopCoord) * scale + translate;\n\tvec2 aBotPosition = (aBotCoord) * scale + translate;\n\n\tvec2 bTopPosition = (bTopCoord) * scale + translate;\n\tvec2 bBotPosition = (bBotCoord) * scale + translate;\n\n\t//position is normalized 0..1 coord on the screen\n\tvec2 position = (aTopPosition * lineTop + aBotPosition * lineBot) * lineStart + (bTopPosition * lineTop + bBotPosition * lineBot) * lineEnd;\n\n\tstartCoord = aCoord * scaleRatio + translate * viewport.zw + viewport.xy;\n\tendCoord = bCoord * scaleRatio + translate * viewport.zw + viewport.xy;\n\n\tgl_Position = vec4(position  * 2.0 - 1.0, depth, 1);\n\n\tenableStartMiter = step(dot(currTangent, prevTangent), .5);\n\tenableEndMiter = step(dot(currTangent, nextTangent), .5);\n\n\t//bevel miter cutoffs\n\tif (miterMode == 1.) {\n\t\tif (enableStartMiter == 1.) {\n\t\t\tvec2 startMiterWidth = vec2(startJoinDirection) * thickness * miterLimit * .5;\n\t\t\tstartCutoff = vec4(aCoord, aCoord);\n\t\t\tstartCutoff.zw += vec2(-startJoinDirection.y, startJoinDirection.x) / scaleRatio;\n\t\t\tstartCutoff = startCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\n\t\t\tstartCutoff += viewport.xyxy;\n\t\t\tstartCutoff += startMiterWidth.xyxy;\n\t\t}\n\n\t\tif (enableEndMiter == 1.) {\n\t\t\tvec2 endMiterWidth = vec2(endJoinDirection) * thickness * miterLimit * .5;\n\t\t\tendCutoff = vec4(bCoord, bCoord);\n\t\t\tendCutoff.zw += vec2(-endJoinDirection.y, endJoinDirection.x)  / scaleRatio;\n\t\t\tendCutoff = endCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\n\t\t\tendCutoff += viewport.xyxy;\n\t\t\tendCutoff += endMiterWidth.xyxy;\n\t\t}\n\t}\n\n\t//round miter cutoffs\n\telse if (miterMode == 2.) {\n\t\tif (enableStartMiter == 1.) {\n\t\t\tvec2 startMiterWidth = vec2(startJoinDirection) * thickness * abs(dot(startJoinDirection, currNormal)) * .5;\n\t\t\tstartCutoff = vec4(aCoord, aCoord);\n\t\t\tstartCutoff.zw += vec2(-startJoinDirection.y, startJoinDirection.x) / scaleRatio;\n\t\t\tstartCutoff = startCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\n\t\t\tstartCutoff += viewport.xyxy;\n\t\t\tstartCutoff += startMiterWidth.xyxy;\n\t\t}\n\n\t\tif (enableEndMiter == 1.) {\n\t\t\tvec2 endMiterWidth = vec2(endJoinDirection) * thickness * abs(dot(endJoinDirection, currNormal)) * .5;\n\t\t\tendCutoff = vec4(bCoord, bCoord);\n\t\t\tendCutoff.zw += vec2(-endJoinDirection.y, endJoinDirection.x)  / scaleRatio;\n\t\t\tendCutoff = endCutoff * scaleRatio.xyxy + translate.xyxy * viewport.zwzw;\n\t\t\tendCutoff += viewport.xyxy;\n\t\t\tendCutoff += endMiterWidth.xyxy;\n\t\t}\n\t}\n}\n"]),frag:o(["precision highp float;\n#define GLSLIFY 1\n\nuniform sampler2D dashPattern;\nuniform float dashSize, pixelRatio, thickness, opacity, id, miterMode;\n\nvarying vec4 fragColor;\nvarying vec2 tangent;\nvarying vec4 startCutoff, endCutoff;\nvarying vec2 startCoord, endCoord;\nvarying float enableStartMiter, enableEndMiter;\n\nfloat distToLine(vec2 p, vec2 a, vec2 b) {\n\tvec2 diff = b - a;\n\tvec2 perp = normalize(vec2(-diff.y, diff.x));\n\treturn dot(p - a, perp);\n}\n\nvoid main() {\n\tfloat alpha = 1., distToStart, distToEnd;\n\tfloat cutoff = thickness * .5;\n\n\t//bevel miter\n\tif (miterMode == 1.) {\n\t\tif (enableStartMiter == 1.) {\n\t\t\tdistToStart = distToLine(gl_FragCoord.xy, startCutoff.xy, startCutoff.zw);\n\t\t\tif (distToStart < -1.) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\talpha *= min(max(distToStart + 1., 0.), 1.);\n\t\t}\n\n\t\tif (enableEndMiter == 1.) {\n\t\t\tdistToEnd = distToLine(gl_FragCoord.xy, endCutoff.xy, endCutoff.zw);\n\t\t\tif (distToEnd < -1.) {\n\t\t\t\tdiscard;\n\t\t\t\treturn;\n\t\t\t}\n\t\t\talpha *= min(max(distToEnd + 1., 0.), 1.);\n\t\t}\n\t}\n\n\t// round miter\n\telse if (miterMode == 2.) {\n\t\tif (enableStartMiter == 1.) {\n\t\t\tdistToStart = distToLine(gl_FragCoord.xy, startCutoff.xy, startCutoff.zw);\n\t\t\tif (distToStart < 0.) {\n\t\t\t\tfloat radius = length(gl_FragCoord.xy - startCoord);\n\n\t\t\t\tif(radius > cutoff + .5) {\n\t\t\t\t\tdiscard;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\talpha -= smoothstep(cutoff - .5, cutoff + .5, radius);\n\t\t\t}\n\t\t}\n\n\t\tif (enableEndMiter == 1.) {\n\t\t\tdistToEnd = distToLine(gl_FragCoord.xy, endCutoff.xy, endCutoff.zw);\n\t\t\tif (distToEnd < 0.) {\n\t\t\t\tfloat radius = length(gl_FragCoord.xy - endCoord);\n\n\t\t\t\tif(radius > cutoff + .5) {\n\t\t\t\t\tdiscard;\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\talpha -= smoothstep(cutoff - .5, cutoff + .5, radius);\n\t\t\t}\n\t\t}\n\t}\n\n\tfloat t = fract(dot(tangent, gl_FragCoord.xy) / dashSize) * .5 + .25;\n\tfloat dash = texture2D(dashPattern, vec2(t, .5)).r;\n\n\tgl_FragColor = fragColor;\n\tgl_FragColor.a *= alpha * opacity * dash;\n}\n"]),attributes:{lineEnd:{buffer:r,divisor:0,stride:8,offset:0},lineTop:{buffer:r,divisor:0,stride:8,offset:4},aColor:{buffer:t.prop("colorBuffer"),stride:4,offset:0,divisor:1},bColor:{buffer:t.prop("colorBuffer"),stride:4,offset:4,divisor:1},prevCoord:{buffer:t.prop("positionBuffer"),stride:8,offset:0,divisor:1},aCoord:{buffer:t.prop("positionBuffer"),stride:8,offset:8,divisor:1},bCoord:{buffer:t.prop("positionBuffer"),stride:8,offset:16,divisor:1},nextCoord:{buffer:t.prop("positionBuffer"),stride:8,offset:24,divisor:1}}},n))}catch(t){e=i}return{fill:t({primitive:"triangle",elements:function(t,e){return e.triangles},offset:0,vert:o(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec2 position, positionFract;\n\nuniform vec4 color;\nuniform vec2 scale, scaleFract, translate, translateFract;\nuniform float pixelRatio, id;\nuniform vec4 viewport;\nuniform float opacity;\n\nvarying vec4 fragColor;\n\nconst float MAX_LINES = 256.;\n\nvoid main() {\n\tfloat depth = (MAX_LINES - 4. - id) / (MAX_LINES);\n\n\tvec2 position = position * scale + translate\n       + positionFract * scale + translateFract\n       + position * scaleFract\n       + positionFract * scaleFract;\n\n\tgl_Position = vec4(position * 2.0 - 1.0, depth, 1);\n\n\tfragColor = color / 255.;\n\tfragColor.a *= opacity;\n}\n"]),frag:o(["precision highp float;\n#define GLSLIFY 1\n\nvarying vec4 fragColor;\n\nvoid main() {\n\tgl_FragColor = fragColor;\n}\n"]),uniforms:{scale:t.prop("scale"),color:t.prop("fill"),scaleFract:t.prop("scaleFract"),translateFract:t.prop("translateFract"),translate:t.prop("translate"),opacity:t.prop("opacity"),pixelRatio:t.context("pixelRatio"),id:t.prop("id"),viewport:function(t,e){return[e.viewport.x,e.viewport.y,t.viewportWidth,t.viewportHeight]}},attributes:{position:{buffer:t.prop("positionBuffer"),stride:8,offset:8},positionFract:{buffer:t.prop("positionFractBuffer"),stride:8,offset:8}},blend:n.blend,depth:{enable:!1},scissor:n.scissor,stencil:n.stencil,viewport:n.viewport}),rect:i,miter:e}},m.defaults={dashes:null,join:"miter",miterLimit:1,thickness:10,cap:"square",color:"black",opacity:1,overlay:!1,viewport:null,range:null,close:!1,fill:null},m.prototype.render=function(){for(var t,e=[],r=arguments.length;r--;)e[r]=arguments[r];e.length&&(t=this).update.apply(t,e),this.draw()},m.prototype.draw=function(){for(var t=this,e=[],r=arguments.length;r--;)e[r]=arguments[r];return(e.length?e:this.passes).forEach(function(e,r){if(e&&Array.isArray(e))return(n=t).draw.apply(n,e);var n;("number"==typeof e&&(e=t.passes[e]),e&&e.count>1&&e.opacity)&&(t.regl._refresh(),e.fill&&e.triangles&&e.triangles.length>2&&t.shaders.fill(e),e.thickness&&(e.scale[0]*e.viewport.width>m.precisionThreshold||e.scale[1]*e.viewport.height>m.precisionThreshold?t.shaders.rect(e):"rect"===e.join||!e.join&&(e.thickness<=2||e.count>=m.maxPoints)?t.shaders.rect(e):t.shaders.miter(e)))}),this},m.prototype.update=function(t){var e=this;if(t){null!=t.length?"number"==typeof t[0]&&(t=[{positions:t}]):Array.isArray(t)||(t=[t]);var r=this.regl,o=this.gl;if(t.forEach(function(t,h){var d=e.passes[h];if(void 0!==t)if(null!==t){if("number"==typeof t[0]&&(t={positions:t}),t=s(t,{positions:"positions points data coords",thickness:"thickness lineWidth lineWidths line-width linewidth width stroke-width strokewidth strokeWidth",join:"lineJoin linejoin join type mode",miterLimit:"miterlimit miterLimit",dashes:"dash dashes dasharray dash-array dashArray",color:"color colour stroke colors colours stroke-color strokeColor",fill:"fill fill-color fillColor",opacity:"alpha opacity",overlay:"overlay crease overlap intersect",close:"closed close closed-path closePath",range:"range dataBox",viewport:"viewport viewBox",hole:"holes hole hollow"}),d||(e.passes[h]=d={id:h,scale:null,scaleFract:null,translate:null,translateFract:null,count:0,hole:[],depth:0,dashLength:1,dashTexture:r.texture({channels:1,data:new Uint8Array([255]),width:1,height:1,mag:"linear",min:"linear"}),colorBuffer:r.buffer({usage:"dynamic",type:"uint8",data:new Uint8Array}),positionBuffer:r.buffer({usage:"dynamic",type:"float",data:new Uint8Array}),positionFractBuffer:r.buffer({usage:"dynamic",type:"float",data:new Uint8Array})},t=a({},m.defaults,t)),null!=t.thickness&&(d.thickness=parseFloat(t.thickness)),null!=t.opacity&&(d.opacity=parseFloat(t.opacity)),null!=t.miterLimit&&(d.miterLimit=parseFloat(t.miterLimit)),null!=t.overlay&&(d.overlay=!!t.overlay,h<m.maxLines&&(d.depth=2*(m.maxLines-1-h%m.maxLines)/m.maxLines-1)),null!=t.join&&(d.join=t.join),null!=t.hole&&(d.hole=t.hole),null!=t.fill&&(d.fill=t.fill?n(t.fill,"uint8"):null),null!=t.viewport&&(d.viewport=g(t.viewport)),d.viewport||(d.viewport=g([o.drawingBufferWidth,o.drawingBufferHeight])),null!=t.close&&(d.close=t.close),null===t.positions&&(t.positions=[]),t.positions){var v,y;if(t.positions.x&&t.positions.y){var x=t.positions.x,b=t.positions.y;y=d.count=Math.max(x.length,b.length),v=new Float64Array(2*y);for(var _=0;_<y;_++)v[2*_]=x[_],v[2*_+1]=b[_]}else v=l(t.positions,"float64"),y=d.count=Math.floor(v.length/2);var w=d.bounds=i(v,2);if(d.fill){for(var k=[],M={},A=0,T=0,S=0,E=d.count;T<E;T++){var C=v[2*T],L=v[2*T+1];isNaN(C)||isNaN(L)||null==C||null==L?(C=v[2*A],L=v[2*A+1],M[T]=A):A=T,k[S++]=C,k[S++]=L}for(var z=c(k,d.hole||[]),P=0,I=z.length;P<I;P++)null!=M[z[P]]&&(z[P]=M[z[P]]);d.triangles=z}var O=new Float64Array(v);u(O,2,w);var D=new Float64Array(2*y+6);d.close?v[0]===v[2*y-2]&&v[1]===v[2*y-1]?(D[0]=O[2*y-4],D[1]=O[2*y-3]):(D[0]=O[2*y-2],D[1]=O[2*y-1]):(D[0]=O[0],D[1]=O[1]),D.set(O,2),d.close?v[0]===v[2*y-2]&&v[1]===v[2*y-1]?(D[2*y+2]=O[2],D[2*y+3]=O[3],d.count-=1):(D[2*y+2]=O[0],D[2*y+3]=O[1],D[2*y+4]=O[2],D[2*y+5]=O[3]):(D[2*y+2]=O[2*y-2],D[2*y+3]=O[2*y-1],D[2*y+4]=O[2*y-2],D[2*y+5]=O[2*y-1]),d.positionBuffer(f(D)),d.positionFractBuffer(p(D))}if(t.range?d.range=t.range:d.range||(d.range=d.bounds),(t.range||t.positions)&&d.count){var R=d.bounds,B=R[2]-R[0],F=R[3]-R[1],N=d.range[2]-d.range[0],j=d.range[3]-d.range[1];d.scale=[B/N,F/j],d.translate=[-d.range[0]/N+R[0]/N||0,-d.range[1]/j+R[1]/j||0],d.scaleFract=p(d.scale),d.translateFract=p(d.translate)}if(t.dashes){var V,U=0;if(!t.dashes||t.dashes.length<2)U=1,V=new Uint8Array([255,255,255,255,255,255,255,255]);else{U=0;for(var q=0;q<t.dashes.length;++q)U+=t.dashes[q];V=new Uint8Array(U*m.dashMult);for(var H=0,G=255,W=0;W<2;W++)for(var Y=0;Y<t.dashes.length;++Y){for(var X=0,Z=t.dashes[Y]*m.dashMult*.5;X<Z;++X)V[H++]=G;G^=255}}d.dashLength=U,d.dashTexture({channels:1,data:V,width:V.length,height:1,mag:"linear",min:"linear"},0,0)}if(t.color){var $=d.count,J=t.color;J||(J="transparent");var K=new Uint8Array(4*$+4);if(Array.isArray(J)&&"number"!=typeof J[0]){for(var Q=0;Q<$;Q++){var tt=n(J[Q],"uint8");K.set(tt,4*Q)}K.set(n(J[0],"uint8"),4*$)}else for(var et=n(J,"uint8"),rt=0;rt<$+1;rt++)K.set(et,4*rt);d.colorBuffer({usage:"dynamic",type:"uint8",data:K})}}else e.passes[h]=null}),t.length<this.passes.length){for(var h=t.length;h<this.passes.length;h++){var d=e.passes[h];d&&(d.colorBuffer.destroy(),d.positionBuffer.destroy(),d.dashTexture.destroy())}this.passes.length=t.length}return this.passes=this.passes.filter(Boolean),this}},m.prototype.destroy=function(){return this.passes.forEach(function(t){t.colorBuffer.destroy(),t.positionBuffer.destroy(),t.dashTexture.destroy()}),this.passes.length=0,this}},{"array-bounds":56,"array-normalize":57,"color-normalize":107,earcut:155,"es6-weak-map":208,"flatten-vertex-data":216,glslify:377,"object-assign":421,"parse-rect":426,"pick-by-alias":432,"to-float32":500}],459:[function(t,e,r){"use strict";var n=t("./scatter"),i=t("object-assign");e.exports=function(t,e){var r=new n(t,e),a=r.render.bind(r);return i(a,{render:a,update:r.update.bind(r),draw:r.draw.bind(r),destroy:r.destroy.bind(r),regl:r.regl,gl:r.gl,canvas:r.gl.canvas,groups:r.groups,markers:r.markerCache,palette:r.palette}),a}},{"./scatter":460,"object-assign":421}],460:[function(t,e,r){"use strict";var n=t("color-normalize"),i=t("array-bounds"),a=t("color-id"),o=t("point-cluster"),s=t("object-assign"),l=t("glslify"),c=t("pick-by-alias"),u=t("update-diff"),h=t("flatten-vertex-data"),f=t("is-iexplorer"),p=t("to-float32"),d=p.float32,g=p.fract32,m=t("parse-rect");function v(t,e){var r=this;if(!(this instanceof v))return new v(t,e);"function"==typeof t?(e||(e={}),e.regl=t):(e=t,t=null),e&&e.length&&(e.positions=e);var n,i=(t=e.regl)._gl,a=[];this.tooManyColors=f,n=t.texture({data:new Uint8Array(1020),width:255,height:1,type:"uint8",format:"rgba",wrapS:"clamp",wrapT:"clamp",mag:"nearest",min:"nearest"}),s(this,{regl:t,gl:i,groups:[],markerCache:[null],markerTextures:[null],palette:a,paletteIds:{},paletteTexture:n,maxColors:255,maxSize:100,canvas:i.canvas}),this.update(e);var o={uniforms:{pixelRatio:t.context("pixelRatio"),palette:n,paletteSize:function(t,e){return[r.tooManyColors?0:255,n.height]},scale:t.prop("scale"),scaleFract:t.prop("scaleFract"),translate:t.prop("translate"),translateFract:t.prop("translateFract"),opacity:t.prop("opacity"),marker:t.prop("markerTexture")},attributes:{x:function(t,e){return e.xAttr||{buffer:e.positionBuffer,stride:8,offset:0}},y:function(t,e){return e.yAttr||{buffer:e.positionBuffer,stride:8,offset:4}},xFract:function(t,e){return e.xAttr?{constant:[0,0]}:{buffer:e.positionFractBuffer,stride:8,offset:0}},yFract:function(t,e){return e.yAttr?{constant:[0,0]}:{buffer:e.positionFractBuffer,stride:8,offset:4}},size:function(t,e){return e.size.length?{buffer:e.sizeBuffer,stride:2,offset:0}:{constant:[Math.round(255*e.size/r.maxSize)]}},borderSize:function(t,e){return e.borderSize.length?{buffer:e.sizeBuffer,stride:2,offset:1}:{constant:[Math.round(255*e.borderSize/r.maxSize)]}},colorId:function(t,e){return e.color.length?{buffer:e.colorBuffer,stride:r.tooManyColors?8:4,offset:0}:{constant:r.tooManyColors?a.slice(4*e.color,4*e.color+4):[e.color]}},borderColorId:function(t,e){return e.borderColor.length?{buffer:e.colorBuffer,stride:r.tooManyColors?8:4,offset:r.tooManyColors?4:2}:{constant:r.tooManyColors?a.slice(4*e.borderColor,4*e.borderColor+4):[e.borderColor]}},isActive:function(t,e){return!0===e.activation?{constant:[1]}:e.activation?e.activation:{constant:[0]}}},blend:{enable:!0,color:[0,0,0,1],func:{srcRGB:"src alpha",dstRGB:"one minus src alpha",srcAlpha:"one minus dst alpha",dstAlpha:"one"}},scissor:{enable:!0,box:t.prop("viewport")},viewport:t.prop("viewport"),stencil:{enable:!1},depth:{enable:!1},elements:t.prop("elements"),count:t.prop("count"),offset:t.prop("offset"),primitive:"points"},c=s({},o);c.frag=l(["precision mediump float;\n#define GLSLIFY 1\n\nvarying vec4 fragColor, fragBorderColor;\nvarying float fragWidth, fragBorderColorLevel, fragColorLevel;\n\nuniform sampler2D marker;\nuniform float pixelRatio, opacity;\n\nfloat smoothStep(float x, float y) {\n  return 1.0 / (1.0 + exp(50.0*(x - y)));\n}\n\nvoid main() {\n  float dist = texture2D(marker, gl_PointCoord).r, delta = fragWidth;\n\n  // max-distance alpha\n  if (dist < 0.003) discard;\n\n  // null-border case\n  if (fragBorderColorLevel == fragColorLevel || fragBorderColor.a == 0.) {\n    float colorAmt = smoothstep(.5 - delta, .5 + delta, dist);\n    gl_FragColor = vec4(fragColor.rgb, colorAmt * fragColor.a * opacity);\n    return;\n  }\n\n  float borderColorAmt = smoothstep(fragBorderColorLevel - delta, fragBorderColorLevel + delta, dist);\n  float colorAmt = smoothstep(fragColorLevel - delta, fragColorLevel + delta, dist);\n\n  vec4 color = fragBorderColor;\n  color.a *= borderColorAmt;\n  color = mix(color, fragColor, colorAmt);\n  color.a *= opacity;\n\n  gl_FragColor = color;\n}\n"]),c.vert=l(["precision mediump float;\n#define GLSLIFY 1\n\nattribute float x, y, xFract, yFract;\nattribute float size, borderSize;\nattribute vec4 colorId, borderColorId;\nattribute float isActive;\n\nuniform vec2 scale, scaleFract, translate, translateFract, paletteSize;\nuniform float pixelRatio;\nuniform sampler2D palette;\n\nconst float maxSize = 100.;\nconst float borderLevel = .5;\n\nvarying vec4 fragColor, fragBorderColor;\nvarying float fragPointSize, fragBorderRadius,\n    fragWidth, fragBorderColorLevel, fragColorLevel;\n\nvec2 paletteCoord(float id) {\n  return vec2(\n    (mod(id, paletteSize.x) + .5) / paletteSize.x,\n    (floor(id / paletteSize.x) + .5) / paletteSize.y\n  );\n}\nvec2 paletteCoord(vec2 id) {\n  return vec2(\n    (id.x + .5) / paletteSize.x,\n    (id.y + .5) / paletteSize.y\n  );\n}\nvec4 getColor(vec4 id) {\n  // zero-palette means we deal with direct buffer\n  if (paletteSize.x == 0.) return id / 255.;\n  return texture2D(palette, paletteCoord(id.xy));\n}\n\nvoid main() {\n  if (isActive == 0.) return;\n\n  vec2 position = vec2(x, y);\n  vec2 positionFract = vec2(xFract, yFract);\n\n  vec4 color = getColor(colorId);\n  vec4 borderColor = getColor(borderColorId);\n\n  float size = size * maxSize / 255.;\n  float borderSize = borderSize * maxSize / 255.;\n\n  gl_PointSize = 2. * size * pixelRatio;\n  fragPointSize = size * pixelRatio;\n\n  vec2 pos = (position + translate) * scale\n      + (positionFract + translateFract) * scale\n      + (position + translate) * scaleFract\n      + (positionFract + translateFract) * scaleFract;\n\n  gl_Position = vec4(pos * 2. - 1., 0, 1);\n\n  fragColor = color;\n  fragBorderColor = borderColor;\n  fragWidth = 1. / gl_PointSize;\n\n  fragBorderColorLevel = clamp(borderLevel - borderLevel * borderSize / size, 0., 1.);\n  fragColorLevel = clamp(borderLevel + (1. - borderLevel) * borderSize / size, 0., 1.);\n}\n"]);try{this.drawMarker=t(c)}catch(t){}var u=s({},o);u.frag=l(["precision highp float;\n#define GLSLIFY 1\n\nvarying vec4 fragColor, fragBorderColor;\n\nuniform float opacity;\nvarying float fragBorderRadius, fragWidth;\n\nfloat smoothStep(float edge0, float edge1, float x) {\n\tfloat t;\n\tt = clamp((x - edge0) / (edge1 - edge0), 0.0, 1.0);\n\treturn t * t * (3.0 - 2.0 * t);\n}\n\nvoid main() {\n\tfloat radius, alpha = 1.0, delta = fragWidth;\n\n\tradius = length(2.0 * gl_PointCoord.xy - 1.0);\n\n\tif (radius > 1.0 + delta) {\n\t\tdiscard;\n\t}\n\n\talpha -= smoothstep(1.0 - delta, 1.0 + delta, radius);\n\n\tfloat borderRadius = fragBorderRadius;\n\tfloat ratio = smoothstep(borderRadius - delta, borderRadius + delta, radius);\n\tvec4 color = mix(fragColor, fragBorderColor, ratio);\n\tcolor.a *= alpha * opacity;\n\tgl_FragColor = color;\n}\n"]),u.vert=l(["precision highp float;\n#define GLSLIFY 1\n\nattribute float x, y, xFract, yFract;\nattribute float size, borderSize;\nattribute vec4 colorId, borderColorId;\nattribute float isActive;\n\nuniform vec2 scale, scaleFract, translate, translateFract;\nuniform float pixelRatio;\nuniform sampler2D palette;\nuniform vec2 paletteSize;\n\nconst float maxSize = 100.;\n\nvarying vec4 fragColor, fragBorderColor;\nvarying float fragBorderRadius, fragWidth;\n\nvec2 paletteCoord(float id) {\n  return vec2(\n    (mod(id, paletteSize.x) + .5) / paletteSize.x,\n    (floor(id / paletteSize.x) + .5) / paletteSize.y\n  );\n}\nvec2 paletteCoord(vec2 id) {\n  return vec2(\n    (id.x + .5) / paletteSize.x,\n    (id.y + .5) / paletteSize.y\n  );\n}\n\nvec4 getColor(vec4 id) {\n  // zero-palette means we deal with direct buffer\n  if (paletteSize.x == 0.) return id / 255.;\n  return texture2D(palette, paletteCoord(id.xy));\n}\n\nvoid main() {\n  // ignore inactive points\n  if (isActive == 0.) return;\n\n  vec2 position = vec2(x, y);\n  vec2 positionFract = vec2(xFract, yFract);\n\n  vec4 color = getColor(colorId);\n  vec4 borderColor = getColor(borderColorId);\n\n  float size = size * maxSize / 255.;\n  float borderSize = borderSize * maxSize / 255.;\n\n  gl_PointSize = (size + borderSize) * pixelRatio;\n\n  vec2 pos = (position + translate) * scale\n      + (positionFract + translateFract) * scale\n      + (position + translate) * scaleFract\n      + (positionFract + translateFract) * scaleFract;\n\n  gl_Position = vec4(pos * 2. - 1., 0, 1);\n\n  fragBorderRadius = 1. - 2. * borderSize / (size + borderSize);\n  fragColor = color;\n  fragBorderColor = borderColor.a == 0. || borderSize == 0. ? vec4(color.rgb, 0.) : borderColor;\n  fragWidth = 1. / gl_PointSize;\n}\n"]),f&&(u.frag=u.frag.replace("smoothstep","smoothStep")),this.drawCircle=t(u)}e.exports=v,v.defaults={color:"black",borderColor:"transparent",borderSize:0,size:12,opacity:1,marker:void 0,viewport:null,range:null,pixelSize:null,count:0,offset:0,bounds:null,positions:[],snap:1e4},v.prototype.render=function(){for(var t,e=[],r=arguments.length;r--;)e[r]=arguments[r];return e.length&&(t=this).update.apply(t,e),this.draw(),this},v.prototype.draw=function(){for(var t=this,e=[],r=arguments.length;r--;)e[r]=arguments[r];var n=this.groups;if(1===e.length&&Array.isArray(e[0])&&(null===e[0][0]||Array.isArray(e[0][0]))&&(e=e[0]),this.regl._refresh(),e.length)for(var i=0;i<e.length;i++)t.drawItem(i,e[i]);else n.forEach(function(e,r){t.drawItem(r)});return this},v.prototype.drawItem=function(t,e){var r=this.groups,n=r[t];if("number"==typeof e&&(t=e,n=r[e],e=null),n&&n.count&&n.opacity){n.activation[0]&&this.drawCircle(this.getMarkerDrawOptions(0,n,e));for(var i=[],a=1;a<n.activation.length;a++)n.activation[a]&&(!0===n.activation[a]||n.activation[a].data.length)&&i.push.apply(i,this.getMarkerDrawOptions(a,n,e));i.length&&this.drawMarker(i)}},v.prototype.getMarkerDrawOptions=function(t,e,r){var n=e.range,i=e.tree,a=e.viewport,o=e.activation,l=e.selectionBuffer,c=e.count;this.regl;if(!i)return r?[s({},e,{markerTexture:this.markerTextures[t],activation:o[t],count:r.length,elements:r,offset:0})]:[s({},e,{markerTexture:this.markerTextures[t],activation:o[t],offset:0})];var u=[],h=i.range(n,{lod:!0,px:[(n[2]-n[0])/a.width,(n[3]-n[1])/a.height]});if(r){for(var f=o[t].data,p=new Uint8Array(c),d=0;d<r.length;d++){var g=r[d];p[g]=f?f[g]:1}l.subdata(p)}for(var m=h.length;m--;){var v=h[m],y=v[0],x=v[1];u.push(s({},e,{markerTexture:this.markerTextures[t],activation:r?l:o[t],offset:y,count:x-y}))}return u},v.prototype.update=function(){for(var t=this,e=[],r=arguments.length;r--;)e[r]=arguments[r];if(e.length){1===e.length&&Array.isArray(e[0])&&(e=e[0]);var n=this.groups,a=this.gl,l=this.regl,f=this.maxSize,p=this.maxColors,y=this.palette;this.groups=n=e.map(function(e,r){var x=n[r];if(void 0===e)return x;null===e?e={positions:null}:"function"==typeof e?e={ondraw:e}:"number"==typeof e[0]&&(e={positions:e}),null===(e=c(e,{positions:"positions data points",snap:"snap cluster lod tree",size:"sizes size radius",borderSize:"borderSizes borderSize border-size bordersize borderWidth borderWidths border-width borderwidth stroke-width strokeWidth strokewidth outline",color:"colors color fill fill-color fillColor",borderColor:"borderColors borderColor stroke stroke-color strokeColor",marker:"markers marker shape",range:"range dataBox databox",viewport:"viewport viewPort viewBox viewbox",opacity:"opacity alpha transparency",bounds:"bound bounds boundaries limits"})).positions&&(e.positions=[]),x||(n[r]=x={id:r,scale:null,translate:null,scaleFract:null,translateFract:null,activation:[],selectionBuffer:l.buffer({data:new Uint8Array(0),usage:"stream",type:"uint8"}),sizeBuffer:l.buffer({data:new Uint8Array(0),usage:"dynamic",type:"uint8"}),colorBuffer:l.buffer({data:new Uint8Array(0),usage:"dynamic",type:"uint8"}),positionBuffer:l.buffer({data:new Uint8Array(0),usage:"dynamic",type:"float"}),positionFractBuffer:l.buffer({data:new Uint8Array(0),usage:"dynamic",type:"float"})},e=s({},v.defaults,e)),!e.positions||"marker"in e||(e.marker=x.marker,delete x.marker),!e.marker||"positions"in e||(e.positions=x.positions,delete x.positions);var b=0,_=0;if(u(x,e,[{snap:!0,size:function(t,e){return null==t&&(t=v.defaults.size),b+=t&&t.length?1:0,t},borderSize:function(t,e){return null==t&&(t=v.defaults.borderSize),b+=t&&t.length?1:0,t},opacity:parseFloat,color:function(e,r){return null==e&&(e=v.defaults.color),e=t.updateColor(e),_++,e},borderColor:function(e,r){return null==e&&(e=v.defaults.borderColor),e=t.updateColor(e),_++,e},bounds:function(t,e,r){return"range"in r||(r.range=null),t},positions:function(t,e,r){var n=e.snap,a=e.positionBuffer,s=e.positionFractBuffer,c=e.selectionBuffer;if(t.x||t.y)return t.x.length?e.xAttr={buffer:l.buffer(t.x),offset:0,stride:4,count:t.x.length}:e.xAttr={buffer:t.x.buffer,offset:4*t.x.offset||0,stride:4*(t.x.stride||1),count:t.x.count},t.y.length?e.yAttr={buffer:l.buffer(t.y),offset:0,stride:4,count:t.y.length}:e.yAttr={buffer:t.y.buffer,offset:4*t.y.offset||0,stride:4*(t.y.stride||1),count:t.y.count},e.count=Math.max(e.xAttr.count,e.yAttr.count),t;t=h(t,"float64");var u=e.count=Math.floor(t.length/2),f=e.bounds=u?i(t,2):null;if(r.range||e.range||(delete e.range,r.range=f),r.marker||e.marker||(delete e.marker,r.marker=null),n&&(!0===n||u>n)?e.tree=o(t,{bounds:f}):n&&n.length&&(e.tree=n),e.tree){var p={primitive:"points",usage:"static",data:e.tree,type:"uint32"};e.elements?e.elements(p):e.elements=l.elements(p)}return a({data:d(t),usage:"dynamic"}),s({data:g(t),usage:"dynamic"}),c({data:new Uint8Array(u),type:"uint8",usage:"stream"}),t}},{marker:function(e,r,n){var i=r.activation;if(i.forEach(function(t){return t&&t.destroy&&t.destroy()}),i.length=0,e&&"number"!=typeof e[0]){for(var a=[],o=0,s=Math.min(e.length,r.count);o<s;o++){var c=t.addMarker(e[o]);a[c]||(a[c]=new Uint8Array(r.count)),a[c][o]=1}for(var u=0;u<a.length;u++)if(a[u]){var h={data:a[u],type:"uint8",usage:"static"};i[u]?i[u](h):i[u]=l.buffer(h),i[u].data=a[u]}}else{i[t.addMarker(e)]=!0}return e},range:function(t,e,r){var n=e.bounds;if(n)return t||(t=n),e.scale=[1/(t[2]-t[0]),1/(t[3]-t[1])],e.translate=[-t[0],-t[1]],e.scaleFract=g(e.scale),e.translateFract=g(e.translate),t},viewport:function(t){return m(t||[a.drawingBufferWidth,a.drawingBufferHeight])}}]),b){var w=x.count,k=x.size,M=x.borderSize,A=x.sizeBuffer,T=new Uint8Array(2*w);if(k.length||M.length)for(var S=0;S<w;S++)T[2*S]=Math.round(255*(null==k[S]?k:k[S])/f),T[2*S+1]=Math.round(255*(null==M[S]?M:M[S])/f);A({data:T,usage:"dynamic"})}if(_){var E,C=x.count,L=x.color,z=x.borderColor,P=x.colorBuffer;if(t.tooManyColors){if(L.length||z.length){E=new Uint8Array(8*C);for(var I=0;I<C;I++){var O=L[I];E[8*I]=y[4*O],E[8*I+1]=y[4*O+1],E[8*I+2]=y[4*O+2],E[8*I+3]=y[4*O+3];var D=z[I];E[8*I+4]=y[4*D],E[8*I+5]=y[4*D+1],E[8*I+6]=y[4*D+2],E[8*I+7]=y[4*D+3]}}}else if(L.length||z.length){E=new Uint8Array(4*C+2);for(var R=0;R<C;R++)null!=L[R]&&(E[4*R]=L[R]%p,E[4*R+1]=Math.floor(L[R]/p)),null!=z[R]&&(E[4*R+2]=z[R]%p,E[4*R+3]=Math.floor(z[R]/p))}P({data:E||new Uint8Array(0),type:"uint8",usage:"dynamic"})}return x})}},v.prototype.addMarker=function(t){var e,r=this.markerTextures,n=this.regl,i=this.markerCache,a=null==t?0:i.indexOf(t);if(a>=0)return a;if(t instanceof Uint8Array||t instanceof Uint8ClampedArray)e=t;else{e=new Uint8Array(t.length);for(var o=0,s=t.length;o<s;o++)e[o]=255*t[o]}var l=Math.floor(Math.sqrt(e.length));return a=r.length,i.push(t),r.push(n.texture({channels:1,data:e,radius:l,mag:"linear",min:"linear"})),a},v.prototype.updateColor=function(t){var e=this.paletteIds,r=this.palette,i=this.maxColors;Array.isArray(t)||(t=[t]);var o=[];if("number"==typeof t[0]){var s=[];if(Array.isArray(t))for(var l=0;l<t.length;l+=4)s.push(t.slice(l,l+4));else for(var c=0;c<t.length;c+=4)s.push(t.subarray(c,c+4));t=s}for(var u=0;u<t.length;u++){var h=t[u];h=n(h,"uint8");var f=a(h,!1);if(null==e[f]){var p=r.length;e[f]=Math.floor(p/4),r[p]=h[0],r[p+1]=h[1],r[p+2]=h[2],r[p+3]=h[3]}o[u]=e[f]}return!this.tooManyColors&&r.length>i*i*4&&(this.tooManyColors=!0),this.updatePalette(r),1===o.length?o[0]:o},v.prototype.updatePalette=function(t){if(!this.tooManyColors){var e=this.maxColors,r=this.paletteTexture,n=Math.ceil(.25*t.length/e);if(n>1)for(var i=.25*(t=t.slice()).length%e;i<n*e;i++)t.push(0,0,0,0);r.height<n&&r.resize(e,n),r.subimage({width:Math.min(.25*t.length,e),height:n,data:t},0,0)}},v.prototype.destroy=function(){return this.groups.forEach(function(t){t.sizeBuffer.destroy(),t.positionBuffer.destroy(),t.positionFractBuffer.destroy(),t.colorBuffer.destroy(),t.activation.forEach(function(t){return t&&t.destroy&&t.destroy()}),t.selectionBuffer.destroy(),t.elements&&t.elements.destroy()}),this.groups.length=0,this.paletteTexture.destroy(),this.markerTextures.forEach(function(t){return t&&t.destroy&&t.destroy()}),this}},{"array-bounds":56,"color-id":105,"color-normalize":107,"flatten-vertex-data":216,glslify:377,"is-iexplorer":387,"object-assign":421,"parse-rect":426,"pick-by-alias":432,"point-cluster":436,"to-float32":500,"update-diff":511}],461:[function(t,e,r){"use strict";var n=t("regl-scatter2d/scatter"),i=t("pick-by-alias"),a=t("array-bounds"),o=t("raf"),s=t("array-range"),l=t("parse-rect"),c=t("flatten-vertex-data");function u(t,e){if(!(this instanceof u))return new u(t,e);this.traces=[],this.passes={},this.regl=t,this.scatter=n(t),this.canvas=this.scatter.canvas}function h(t,e,r){return(null!=t.id?t.id:t)<<16|(255&e)<<8|255&r}function f(t,e,r){var n,i,a,o,s=t[e],l=t[r];return s.length>2?(s[0],s[2],n=s[1],i=s[3]):s.length?(n=s[0],i=s[1]):(s.x,n=s.y,s.x+s.width,i=s.y+s.height),l.length>2?(a=l[0],o=l[2],l[1],l[3]):l.length?(a=l[0],o=l[1]):(a=l.x,l.y,o=l.x+l.width,l.y+l.height),[a,n,o,i]}function p(t){if("number"==typeof t)return[t,t,t,t];if(2===t.length)return[t[0],t[1],t[0],t[1]];var e=l(t);return[e.x,e.y,e.x+e.width,e.y+e.height]}e.exports=u,u.prototype.render=function(){for(var t,e=this,r=[],n=arguments.length;n--;)r[n]=arguments[n];return r.length&&(t=this).update.apply(t,r),this.regl.attributes.preserveDrawingBuffer?this.draw():(this.dirty?null==this.planned&&(this.planned=o(function(){e.draw(),e.dirty=!0,e.planned=null})):(this.draw(),this.dirty=!0,o(function(){e.dirty=!1})),this)},u.prototype.update=function(){for(var t=[],e=arguments.length;e--;)t[e]=arguments[e];if(t.length){for(var r=0;r<t.length;r++)this.updateItem(r,t[r]);this.traces=this.traces.filter(Boolean);for(var n,i=[],a=0,o=0;o<this.traces.length;o++){for(var s=this.traces[o],l=this.traces[o].passes,c=0;c<l.length;c++)i.push(this.passes[l[c]]);s.passOffset=a,a+=s.passes.length}return(n=this.scatter).update.apply(n,i),this}},u.prototype.updateItem=function(t,e){var r=this.regl;if(null===e)return this.traces[t]=null,this;if(!e)return this;var n,o=i(e,{data:"data items columns rows values dimensions samples x",snap:"snap cluster",size:"sizes size radius",color:"colors color fill fill-color fillColor",opacity:"opacity alpha transparency opaque",borderSize:"borderSizes borderSize border-size bordersize borderWidth borderWidths border-width borderwidth stroke-width strokeWidth strokewidth outline",borderColor:"borderColors borderColor bordercolor stroke stroke-color strokeColor",marker:"markers marker shape",range:"range ranges databox dataBox",viewport:"viewport viewBox viewbox",domain:"domain domains area areas",padding:"pad padding paddings pads margin margins",transpose:"transpose transposed",diagonal:"diagonal diag showDiagonal",upper:"upper up top upperhalf upperHalf showupperhalf showUpper showUpperHalf",lower:"lower low bottom lowerhalf lowerHalf showlowerhalf showLowerHalf showLower"}),s=this.traces[t]||(this.traces[t]={id:t,buffer:r.buffer({usage:"dynamic",type:"float",data:new Uint8Array}),color:"black",marker:null,size:12,borderColor:"transparent",borderSize:1,viewport:l([r._gl.drawingBufferWidth,r._gl.drawingBufferHeight]),padding:[0,0,0,0],opacity:1,diagonal:!0,upper:!0,lower:!0});if(null!=o.color&&(s.color=o.color),null!=o.size&&(s.size=o.size),null!=o.marker&&(s.marker=o.marker),null!=o.borderColor&&(s.borderColor=o.borderColor),null!=o.borderSize&&(s.borderSize=o.borderSize),null!=o.opacity&&(s.opacity=o.opacity),o.viewport&&(s.viewport=l(o.viewport)),null!=o.diagonal&&(s.diagonal=o.diagonal),null!=o.upper&&(s.upper=o.upper),null!=o.lower&&(s.lower=o.lower),o.data){s.buffer(c(o.data)),s.columns=o.data.length,s.count=o.data[0].length,s.bounds=[];for(var u=0;u<s.columns;u++)s.bounds[u]=a(o.data[u],1)}o.range&&(s.range=o.range,n=s.range&&"number"!=typeof s.range[0]),o.domain&&(s.domain=o.domain);var d=!1;null!=o.padding&&(Array.isArray(o.padding)&&o.padding.length===s.columns&&"number"==typeof o.padding[o.padding.length-1]?(s.padding=o.padding.map(p),d=!0):s.padding=p(o.padding));var g=s.columns,m=s.count,v=s.viewport.width,y=s.viewport.height,x=s.viewport.x,b=s.viewport.y,_=v/g,w=y/g;s.passes=[];for(var k=0;k<g;k++)for(var M=0;M<g;M++)if((s.diagonal||M!==k)&&(s.upper||!(k>M))&&(s.lower||!(k<M))){var A=h(s.id,k,M),T=this.passes[A]||(this.passes[A]={});if(o.data&&(o.transpose?T.positions={x:{buffer:s.buffer,offset:M,count:m,stride:g},y:{buffer:s.buffer,offset:k,count:m,stride:g}}:T.positions={x:{buffer:s.buffer,offset:M*m,count:m},y:{buffer:s.buffer,offset:k*m,count:m}},T.bounds=f(s.bounds,k,M)),o.domain||o.viewport||o.data){var S=d?f(s.padding,k,M):s.padding;if(s.domain){var E=f(s.domain,k,M),C=E[0],L=E[1],z=E[2],P=E[3];T.viewport=[x+C*v+S[0],b+L*y+S[1],x+z*v-S[2],b+P*y-S[3]]}else T.viewport=[x+M*_+_*S[0],b+k*w+w*S[1],x+(M+1)*_-_*S[2],b+(k+1)*w-w*S[3]]}o.color&&(T.color=s.color),o.size&&(T.size=s.size),o.marker&&(T.marker=s.marker),o.borderSize&&(T.borderSize=s.borderSize),o.borderColor&&(T.borderColor=s.borderColor),o.opacity&&(T.opacity=s.opacity),o.range&&(T.range=n?f(s.range,k,M):s.range||T.bounds),s.passes.push(A)}return this},u.prototype.draw=function(){for(var t,e=[],r=arguments.length;r--;)e[r]=arguments[r];if(e.length){for(var n=[],i=0;i<e.length;i++)if("number"==typeof e[i]){var a=this.traces[e[i]],o=a.passes,l=a.passOffset;n.push.apply(n,s(l,l+o.length))}else if(e[i].length){var c=e[i],u=this.traces[i],h=u.passes,f=u.passOffset;h=h.map(function(t,e){n[f+e]=c})}(t=this.scatter).draw.apply(t,n)}else this.scatter.draw();return this},u.prototype.destroy=function(){return this.traces.forEach(function(t){t.buffer&&t.buffer.destroy&&t.buffer.destroy()}),this.traces=null,this.passes=null,this.scatter.destroy(),this}},{"array-bounds":56,"array-range":58,"flatten-vertex-data":462,"parse-rect":426,"pick-by-alias":432,raf:451,"regl-scatter2d/scatter":460}],462:[function(t,e,r){arguments[4][48][0].apply(r,arguments)},{dtype:153,dup:48}],463:[function(t,e,r){var n,i;n=this,i=function(){function t(t,e){this.id=V++,this.type=t,this.data=e}function e(t){return"["+function t(e){if(0===e.length)return[];var r=e.charAt(0),n=e.charAt(e.length-1);if(1<e.length&&r===n&&('"'===r||"'"===r))return['"'+e.substr(1,e.length-2).replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'];if(r=/\[(false|true|null|\d+|'[^']*'|"[^"]*")\]/.exec(e))return t(e.substr(0,r.index)).concat(t(r[1])).concat(t(e.substr(r.index+r[0].length)));if(1===(r=e.split(".")).length)return['"'+e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')+'"'];for(e=[],n=0;n<r.length;++n)e=e.concat(t(r[n]));return e}(t).join("][")+"]"}function r(t){return"string"==typeof t?t.split():t}function n(t){return"string"==typeof t?document.querySelector(t):t}function i(t){var e,i,a,o,s=t||{};t={};var l=[],c=[],u="undefined"==typeof window?1:window.devicePixelRatio,h=!1,f=function(t){},p=function(){};if("string"==typeof s?e=document.querySelector(s):"object"==typeof s&&("string"==typeof s.nodeName&&"function"==typeof s.appendChild&&"function"==typeof s.getBoundingClientRect?e=s:"function"==typeof s.drawArrays||"function"==typeof s.drawElements?a=(o=s).canvas:("gl"in s?o=s.gl:"canvas"in s?a=n(s.canvas):"container"in s&&(i=n(s.container)),"attributes"in s&&(t=s.attributes),"extensions"in s&&(l=r(s.extensions)),"optionalExtensions"in s&&(c=r(s.optionalExtensions)),"onDone"in s&&(f=s.onDone),"profile"in s&&(h=!!s.profile),"pixelRatio"in s&&(u=+s.pixelRatio))),e&&("canvas"===e.nodeName.toLowerCase()?a=e:i=e),!o){if(!a){if(!(e=function(t,e,r){function n(){var e=window.innerWidth,n=window.innerHeight;t!==document.body&&(e=(n=t.getBoundingClientRect()).right-n.left,n=n.bottom-n.top),i.width=r*e,i.height=r*n,j(i.style,{width:e+"px",height:n+"px"})}var i=document.createElement("canvas");return j(i.style,{border:0,margin:0,padding:0,top:0,left:0}),t.appendChild(i),t===document.body&&(i.style.position="absolute",j(t.style,{margin:0,padding:0})),window.addEventListener("resize",n,!1),n(),{canvas:i,onDestroy:function(){window.removeEventListener("resize",n),t.removeChild(i)}}}(i||document.body,0,u)))return null;a=e.canvas,p=e.onDestroy}o=function(t,e){function r(r){try{return t.getContext(r,e)}catch(t){return null}}return r("webgl")||r("experimental-webgl")||r("webgl-experimental")}(a,t)}return o?{gl:o,canvas:a,container:i,extensions:l,optionalExtensions:c,pixelRatio:u,profile:h,onDone:f,onDestroy:p}:(p(),f("webgl not supported, try upgrading your browser or graphics drivers http://get.webgl.org"),null)}function a(t,e){for(var r=Array(t),n=0;n<t;++n)r[n]=e(n);return r}function o(t){var e,r;return e=(65535<t)<<4,e|=r=(255<(t>>>=e))<<3,(e|=r=(15<(t>>>=r))<<2)|(r=(3<(t>>>=r))<<1)|t>>>r>>1}function s(){function t(t){t:{for(var e=16;268435456>=e;e*=16)if(t<=e){t=e;break t}t=0}return 0<(e=r[o(t)>>2]).length?e.pop():new ArrayBuffer(t)}function e(t){r[o(t.byteLength)>>2].push(t)}var r=a(8,function(){return[]});return{alloc:t,free:e,allocType:function(e,r){var n=null;switch(e){case 5120:n=new Int8Array(t(r),0,r);break;case 5121:n=new Uint8Array(t(r),0,r);break;case 5122:n=new Int16Array(t(2*r),0,r);break;case 5123:n=new Uint16Array(t(2*r),0,r);break;case 5124:n=new Int32Array(t(4*r),0,r);break;case 5125:n=new Uint32Array(t(4*r),0,r);break;case 5126:n=new Float32Array(t(4*r),0,r);break;default:return null}return n.length!==r?n.subarray(0,r):n},freeType:function(t){e(t.buffer)}}}function l(t){return!!t&&"object"==typeof t&&Array.isArray(t.shape)&&Array.isArray(t.stride)&&"number"==typeof t.offset&&t.shape.length===t.stride.length&&(Array.isArray(t.data)||Y(t.data))}function c(t,e,r,n,i,a){for(var o=0;o<e;++o)for(var s=t[o],l=0;l<r;++l)for(var c=s[l],u=0;u<n;++u)i[a++]=c[u]}function u(t){return 0|$[Object.prototype.toString.call(t)]}function h(t,e){for(var r=0;r<e.length;++r)t[r]=e[r]}function f(t,e,r,n,i,a,o){for(var s=0,l=0;l<r;++l)for(var c=0;c<n;++c)t[s++]=e[i*l+a*c+o]}function p(t,e,r,n){function i(e){this.id=c++,this.buffer=t.createBuffer(),this.type=e,this.usage=35044,this.byteLength=0,this.dimension=1,this.dtype=5121,this.persistentData=null,r.profile&&(this.stats={size:0})}function a(e,r,n){e.byteLength=r.byteLength,t.bufferData(e.type,r,n)}function o(t,e,r,n,i,o){if(t.usage=r,Array.isArray(e)){if(t.dtype=n||5126,0<e.length)if(Array.isArray(e[0])){i=tt(e);for(var s=n=1;s<i.length;++s)n*=i[s];t.dimension=n,a(t,e=Q(e,i,t.dtype),r),o?t.persistentData=e:G.freeType(e)}else"number"==typeof e[0]?(t.dimension=i,h(i=G.allocType(t.dtype,e.length),e),a(t,i,r),o?t.persistentData=i:G.freeType(i)):Y(e[0])&&(t.dimension=e[0].length,t.dtype=n||u(e[0])||5126,a(t,e=Q(e,[e.length,e[0].length],t.dtype),r),o?t.persistentData=e:G.freeType(e))}else if(Y(e))t.dtype=n||u(e),t.dimension=i,a(t,e,r),o&&(t.persistentData=new Uint8Array(new Uint8Array(e.buffer)));else if(l(e)){i=e.shape;var c=e.stride,p=(s=e.offset,0),d=0,g=0,m=0;1===i.length?(p=i[0],d=1,g=c[0],m=0):2===i.length&&(p=i[0],d=i[1],g=c[0],m=c[1]),t.dtype=n||u(e.data)||5126,t.dimension=d,f(i=G.allocType(t.dtype,p*d),e.data,p,d,g,m,s),a(t,i,r),o?t.persistentData=i:G.freeType(i)}}function s(r){e.bufferCount--;for(var i=0;i<n.state.length;++i){var a=n.state[i];a.buffer===r&&(t.disableVertexAttribArray(i),a.buffer=null)}t.deleteBuffer(r.buffer),r.buffer=null,delete p[r.id]}var c=0,p={};i.prototype.bind=function(){t.bindBuffer(this.type,this.buffer)},i.prototype.destroy=function(){s(this)};var d=[];return r.profile&&(e.getTotalBufferSize=function(){var t=0;return Object.keys(p).forEach(function(e){t+=p[e].stats.size}),t}),{create:function(n,a,c,d){function g(e){var n=35044,i=null,a=0,s=0,c=1;return Array.isArray(e)||Y(e)||l(e)?i=e:"number"==typeof e?a=0|e:e&&("data"in e&&(i=e.data),"usage"in e&&(n=K[e.usage]),"type"in e&&(s=J[e.type]),"dimension"in e&&(c=0|e.dimension),"length"in e&&(a=0|e.length)),m.bind(),i?o(m,i,n,s,c,d):(a&&t.bufferData(m.type,a,n),m.dtype=s||5121,m.usage=n,m.dimension=c,m.byteLength=a),r.profile&&(m.stats.size=m.byteLength*et[m.dtype]),g}e.bufferCount++;var m=new i(a);return p[m.id]=m,c||g(n),g._reglType="buffer",g._buffer=m,g.subdata=function(e,r){var n,i=0|(r||0);if(m.bind(),Y(e))t.bufferSubData(m.type,i,e);else if(Array.isArray(e)){if(0<e.length)if("number"==typeof e[0]){var a=G.allocType(m.dtype,e.length);h(a,e),t.bufferSubData(m.type,i,a),G.freeType(a)}else(Array.isArray(e[0])||Y(e[0]))&&(n=tt(e),a=Q(e,n,m.dtype),t.bufferSubData(m.type,i,a),G.freeType(a))}else if(l(e)){n=e.shape;var o=e.stride,s=a=0,c=0,p=0;1===n.length?(a=n[0],s=1,c=o[0],p=0):2===n.length&&(a=n[0],s=n[1],c=o[0],p=o[1]),n=Array.isArray(e.data)?m.dtype:u(e.data),f(n=G.allocType(n,a*s),e.data,a,s,c,p,e.offset),t.bufferSubData(m.type,i,n),G.freeType(n)}return g},r.profile&&(g.stats=m.stats),g.destroy=function(){s(m)},g},createStream:function(t,e){var r=d.pop();return r||(r=new i(t)),r.bind(),o(r,e,35040,0,1,!1),r},destroyStream:function(t){d.push(t)},clear:function(){X(p).forEach(s),d.forEach(s)},getBuffer:function(t){return t&&t._buffer instanceof i?t._buffer:null},restore:function(){X(p).forEach(function(e){e.buffer=t.createBuffer(),t.bindBuffer(e.type,e.buffer),t.bufferData(e.type,e.persistentData||e.byteLength,e.usage)})},_initBuffer:o}}function d(t,e,r,n){function i(t){this.id=c++,s[this.id]=this,this.buffer=t,this.primType=4,this.type=this.vertCount=0}function a(n,i,a,o,s,c,u){if(n.buffer.bind(),i){var h=u;u||Y(i)&&(!l(i)||Y(i.data))||(h=e.oes_element_index_uint?5125:5123),r._initBuffer(n.buffer,i,a,h,3)}else t.bufferData(34963,c,a),n.buffer.dtype=h||5121,n.buffer.usage=a,n.buffer.dimension=3,n.buffer.byteLength=c;if(h=u,!u){switch(n.buffer.dtype){case 5121:case 5120:h=5121;break;case 5123:case 5122:h=5123;break;case 5125:case 5124:h=5125}n.buffer.dtype=h}n.type=h,0>(i=s)&&(i=n.buffer.byteLength,5123===h?i>>=1:5125===h&&(i>>=2)),n.vertCount=i,i=o,0>o&&(i=4,1===(o=n.buffer.dimension)&&(i=0),2===o&&(i=1),3===o&&(i=4)),n.primType=i}function o(t){n.elementsCount--,delete s[t.id],t.buffer.destroy(),t.buffer=null}var s={},c=0,u={uint8:5121,uint16:5123};e.oes_element_index_uint&&(u.uint32=5125),i.prototype.bind=function(){this.buffer.bind()};var h=[];return{create:function(t,e){function s(t){if(t)if("number"==typeof t)c(t),h.primType=4,h.vertCount=0|t,h.type=5121;else{var e=null,r=35044,n=-1,i=-1,o=0,f=0;Array.isArray(t)||Y(t)||l(t)?e=t:("data"in t&&(e=t.data),"usage"in t&&(r=K[t.usage]),"primitive"in t&&(n=rt[t.primitive]),"count"in t&&(i=0|t.count),"type"in t&&(f=u[t.type]),"length"in t?o=0|t.length:(o=i,5123===f||5122===f?o*=2:5125!==f&&5124!==f||(o*=4))),a(h,e,r,n,i,o,f)}else c(),h.primType=4,h.vertCount=0,h.type=5121;return s}var c=r.create(null,34963,!0),h=new i(c._buffer);return n.elementsCount++,s(t),s._reglType="elements",s._elements=h,s.subdata=function(t,e){return c.subdata(t,e),s},s.destroy=function(){o(h)},s},createStream:function(t){var e=h.pop();return e||(e=new i(r.create(null,34963,!0,!1)._buffer)),a(e,t,35040,-1,-1,0,0),e},destroyStream:function(t){h.push(t)},getElements:function(t){return"function"==typeof t&&t._elements instanceof i?t._elements:null},clear:function(){X(s).forEach(o)}}}function g(t){for(var e=G.allocType(5123,t.length),r=0;r<t.length;++r)if(isNaN(t[r]))e[r]=65535;else if(1/0===t[r])e[r]=31744;else if(-1/0===t[r])e[r]=64512;else{nt[0]=t[r];var n=(a=it[0])>>>31<<15,i=(a<<1>>>24)-127,a=a>>13&1023;e[r]=-24>i?n:-14>i?n+(a+1024>>-14-i):15<i?n+31744:n+(i+15<<10)+a}return e}function m(t){return Array.isArray(t)||Y(t)}function v(t){return"[object "+t+"]"}function y(t){return Array.isArray(t)&&(0===t.length||"number"==typeof t[0])}function x(t){return!(!Array.isArray(t)||0===t.length||!m(t[0]))}function b(t){return Object.prototype.toString.call(t)}function _(t){if(!t)return!1;var e=b(t);return 0<=pt.indexOf(e)||(y(t)||x(t)||l(t))}function w(t,e){36193===t.type?(t.data=g(e),G.freeType(e)):t.data=e}function k(t,e,r,n,i,a){if(t="undefined"!=typeof gt[t]?gt[t]:st[t]*dt[e],a&&(t*=6),i){for(n=0;1<=r;)n+=t*r*r,r/=2;return n}return t*r*n}function M(t,e,r,n,i,a,o){function s(){this.format=this.internalformat=6408,this.type=5121,this.flipY=this.premultiplyAlpha=this.compressed=!1,this.unpackAlignment=1,this.colorSpace=37444,this.channels=this.height=this.width=0}function c(t,e){t.internalformat=e.internalformat,t.format=e.format,t.type=e.type,t.compressed=e.compressed,t.premultiplyAlpha=e.premultiplyAlpha,t.flipY=e.flipY,t.unpackAlignment=e.unpackAlignment,t.colorSpace=e.colorSpace,t.width=e.width,t.height=e.height,t.channels=e.channels}function u(t,e){if("object"==typeof e&&e){"premultiplyAlpha"in e&&(t.premultiplyAlpha=e.premultiplyAlpha),"flipY"in e&&(t.flipY=e.flipY),"alignment"in e&&(t.unpackAlignment=e.alignment),"colorSpace"in e&&(t.colorSpace=q[e.colorSpace]),"type"in e&&(t.type=H[e.type]);var r=t.width,n=t.height,i=t.channels,a=!1;"shape"in e?(r=e.shape[0],n=e.shape[1],3===e.shape.length&&(i=e.shape[2],a=!0)):("radius"in e&&(r=n=e.radius),"width"in e&&(r=e.width),"height"in e&&(n=e.height),"channels"in e&&(i=e.channels,a=!0)),t.width=0|r,t.height=0|n,t.channels=0|i,r=!1,"format"in e&&(r=e.format,n=t.internalformat=W[r],t.format=pt[n],r in H&&!("type"in e)&&(t.type=H[r]),r in J&&(t.compressed=!0),r=!0),!a&&r?t.channels=st[t.format]:a&&!r&&t.channels!==ot[t.format]&&(t.format=t.internalformat=ot[t.channels])}}function h(e){t.pixelStorei(37440,e.flipY),t.pixelStorei(37441,e.premultiplyAlpha),t.pixelStorei(37443,e.colorSpace),t.pixelStorei(3317,e.unpackAlignment)}function f(){s.call(this),this.yOffset=this.xOffset=0,this.data=null,this.needsFree=!1,this.element=null,this.needsCopy=!1}function p(t,e){var r=null;if(_(e)?r=e:e&&(u(t,e),"x"in e&&(t.xOffset=0|e.x),"y"in e&&(t.yOffset=0|e.y),_(e.data)&&(r=e.data)),e.copy){var n=i.viewportWidth,a=i.viewportHeight;t.width=t.width||n-t.xOffset,t.height=t.height||a-t.yOffset,t.needsCopy=!0}else if(r){if(Y(r))t.channels=t.channels||4,t.data=r,"type"in e||5121!==t.type||(t.type=0|$[Object.prototype.toString.call(r)]);else if(y(r)){switch(t.channels=t.channels||4,a=(n=r).length,t.type){case 5121:case 5123:case 5125:case 5126:(a=G.allocType(t.type,a)).set(n),t.data=a;break;case 36193:t.data=g(n)}t.alignment=1,t.needsFree=!0}else if(l(r)){n=r.data,Array.isArray(n)||5121!==t.type||(t.type=0|$[Object.prototype.toString.call(n)]);a=r.shape;var o,s,c,h,f=r.stride;3===a.length?(c=a[2],h=f[2]):h=c=1,o=a[0],s=a[1],a=f[0],f=f[1],t.alignment=1,t.width=o,t.height=s,t.channels=c,t.format=t.internalformat=ot[c],t.needsFree=!0,o=h,r=r.offset,c=t.width,h=t.height,s=t.channels;for(var p=G.allocType(36193===t.type?5126:t.type,c*h*s),d=0,v=0;v<h;++v)for(var k=0;k<c;++k)for(var M=0;M<s;++M)p[d++]=n[a*k+f*v+o*M+r];w(t,p)}else if(b(r)===lt||b(r)===ct)b(r)===lt?t.element=r:t.element=r.canvas,t.width=t.element.width,t.height=t.element.height,t.channels=4;else if(b(r)===ut)t.element=r,t.width=r.width,t.height=r.height,t.channels=4;else if(b(r)===ht)t.element=r,t.width=r.naturalWidth,t.height=r.naturalHeight,t.channels=4;else if(b(r)===ft)t.element=r,t.width=r.videoWidth,t.height=r.videoHeight,t.channels=4;else if(x(r)){for(n=t.width||r[0].length,a=t.height||r.length,f=t.channels,f=m(r[0][0])?f||r[0][0].length:f||1,o=Z.shape(r),c=1,h=0;h<o.length;++h)c*=o[h];c=G.allocType(36193===t.type?5126:t.type,c),Z.flatten(r,o,"",c),w(t,c),t.alignment=1,t.width=n,t.height=a,t.channels=f,t.format=t.internalformat=ot[f],t.needsFree=!0}}else t.width=t.width||1,t.height=t.height||1,t.channels=t.channels||4}function d(e,r,i,a,o){var s=e.element,l=e.data,c=e.internalformat,u=e.format,f=e.type,p=e.width,d=e.height;h(e),s?t.texSubImage2D(r,o,i,a,u,f,s):e.compressed?t.compressedTexSubImage2D(r,o,i,a,c,p,d,l):e.needsCopy?(n(),t.copyTexSubImage2D(r,o,i,a,e.xOffset,e.yOffset,p,d)):t.texSubImage2D(r,o,i,a,p,d,u,f,l)}function v(){return dt.pop()||new f}function M(t){t.needsFree&&G.freeType(t.data),f.call(t),dt.push(t)}function A(){s.call(this),this.genMipmaps=!1,this.mipmapHint=4352,this.mipmask=0,this.images=Array(16)}function T(t,e,r){var n=t.images[0]=v();t.mipmask=1,n.width=t.width=e,n.height=t.height=r,n.channels=t.channels=4}function S(t,e){var r=null;if(_(e))c(r=t.images[0]=v(),t),p(r,e),t.mipmask=1;else if(u(t,e),Array.isArray(e.mipmap))for(var n=e.mipmap,i=0;i<n.length;++i)c(r=t.images[i]=v(),t),r.width>>=i,r.height>>=i,p(r,n[i]),t.mipmask|=1<<i;else c(r=t.images[0]=v(),t),p(r,e),t.mipmask=1;c(t,t.images[0])}function E(e,r){for(var i=e.images,a=0;a<i.length&&i[a];++a){var o=i[a],s=r,l=a,c=o.element,u=o.data,f=o.internalformat,p=o.format,d=o.type,g=o.width,m=o.height,v=o.channels;h(o),c?t.texImage2D(s,l,p,p,d,c):o.compressed?t.compressedTexImage2D(s,l,f,g,m,0,u):o.needsCopy?(n(),t.copyTexImage2D(s,l,p,o.xOffset,o.yOffset,g,m,0)):((o=!u)&&(u=G.zero.allocType(d,g*m*v)),t.texImage2D(s,l,p,g,m,0,p,d,u),o&&u&&G.zero.freeType(u))}}function C(){var t=gt.pop()||new A;s.call(t);for(var e=t.mipmask=0;16>e;++e)t.images[e]=null;return t}function L(t){for(var e=t.images,r=0;r<e.length;++r)e[r]&&M(e[r]),e[r]=null;gt.push(t)}function z(){this.magFilter=this.minFilter=9728,this.wrapT=this.wrapS=33071,this.anisotropic=1,this.genMipmaps=!1,this.mipmapHint=4352}function P(t,e){"min"in e&&(t.minFilter=U[e.min],0<=at.indexOf(t.minFilter)&&!("faces"in e)&&(t.genMipmaps=!0)),"mag"in e&&(t.magFilter=V[e.mag]);var r=t.wrapS,n=t.wrapT;if("wrap"in e){var i=e.wrap;"string"==typeof i?r=n=N[i]:Array.isArray(i)&&(r=N[i[0]],n=N[i[1]])}else"wrapS"in e&&(r=N[e.wrapS]),"wrapT"in e&&(n=N[e.wrapT]);if(t.wrapS=r,t.wrapT=n,"anisotropic"in e&&(t.anisotropic=e.anisotropic),"mipmap"in e){switch(r=!1,typeof e.mipmap){case"string":t.mipmapHint=F[e.mipmap],r=t.genMipmaps=!0;break;case"boolean":r=t.genMipmaps=e.mipmap;break;case"object":t.genMipmaps=!1,r=!0}!r||"min"in e||(t.minFilter=9984)}}function I(r,n){t.texParameteri(n,10241,r.minFilter),t.texParameteri(n,10240,r.magFilter),t.texParameteri(n,10242,r.wrapS),t.texParameteri(n,10243,r.wrapT),e.ext_texture_filter_anisotropic&&t.texParameteri(n,34046,r.anisotropic),r.genMipmaps&&(t.hint(33170,r.mipmapHint),t.generateMipmap(n))}function O(e){s.call(this),this.mipmask=0,this.internalformat=6408,this.id=mt++,this.refCount=1,this.target=e,this.texture=t.createTexture(),this.unit=-1,this.bindCount=0,this.texInfo=new z,o.profile&&(this.stats={size:0})}function D(e){t.activeTexture(33984),t.bindTexture(e.target,e.texture)}function R(){var e=xt[0];e?t.bindTexture(e.target,e.texture):t.bindTexture(3553,null)}function B(e){var r=e.texture,n=e.unit,i=e.target;0<=n&&(t.activeTexture(33984+n),t.bindTexture(i,null),xt[n]=null),t.deleteTexture(r),e.texture=null,e.params=null,e.pixels=null,e.refCount=0,delete vt[e.id],a.textureCount--}var F={"don't care":4352,"dont care":4352,nice:4354,fast:4353},N={repeat:10497,clamp:33071,mirror:33648},V={nearest:9728,linear:9729},U=j({mipmap:9987,"nearest mipmap nearest":9984,"linear mipmap nearest":9985,"nearest mipmap linear":9986,"linear mipmap linear":9987},V),q={none:0,browser:37444},H={uint8:5121,rgba4:32819,rgb565:33635,"rgb5 a1":32820},W={alpha:6406,luminance:6409,"luminance alpha":6410,rgb:6407,rgba:6408,rgba4:32854,"rgb5 a1":32855,rgb565:36194},J={};e.ext_srgb&&(W.srgb=35904,W.srgba=35906),e.oes_texture_float&&(H.float32=H.float=5126),e.oes_texture_half_float&&(H.float16=H["half float"]=36193),e.webgl_depth_texture&&(j(W,{depth:6402,"depth stencil":34041}),j(H,{uint16:5123,uint32:5125,"depth stencil":34042})),e.webgl_compressed_texture_s3tc&&j(J,{"rgb s3tc dxt1":33776,"rgba s3tc dxt1":33777,"rgba s3tc dxt3":33778,"rgba s3tc dxt5":33779}),e.webgl_compressed_texture_atc&&j(J,{"rgb atc":35986,"rgba atc explicit alpha":35987,"rgba atc interpolated alpha":34798}),e.webgl_compressed_texture_pvrtc&&j(J,{"rgb pvrtc 4bppv1":35840,"rgb pvrtc 2bppv1":35841,"rgba pvrtc 4bppv1":35842,"rgba pvrtc 2bppv1":35843}),e.webgl_compressed_texture_etc1&&(J["rgb etc1"]=36196);var K=Array.prototype.slice.call(t.getParameter(34467));Object.keys(J).forEach(function(t){var e=J[t];0<=K.indexOf(e)&&(W[t]=e)});var Q=Object.keys(W);r.textureFormats=Q;var tt=[];Object.keys(W).forEach(function(t){tt[W[t]]=t});var et=[];Object.keys(H).forEach(function(t){et[H[t]]=t});var rt=[];Object.keys(V).forEach(function(t){rt[V[t]]=t});var nt=[];Object.keys(U).forEach(function(t){nt[U[t]]=t});var it=[];Object.keys(N).forEach(function(t){it[N[t]]=t});var pt=Q.reduce(function(t,e){var r=W[e];return 6409===r||6406===r||6409===r||6410===r||6402===r||34041===r?t[r]=r:32855===r||0<=e.indexOf("rgba")?t[r]=6408:t[r]=6407,t},{}),dt=[],gt=[],mt=0,vt={},yt=r.maxTextureUnits,xt=Array(yt).map(function(){return null});return j(O.prototype,{bind:function(){this.bindCount+=1;var e=this.unit;if(0>e){for(var r=0;r<yt;++r){var n=xt[r];if(n){if(0<n.bindCount)continue;n.unit=-1}xt[r]=this,e=r;break}o.profile&&a.maxTextureUnits<e+1&&(a.maxTextureUnits=e+1),this.unit=e,t.activeTexture(33984+e),t.bindTexture(this.target,this.texture)}return e},unbind:function(){--this.bindCount},decRef:function(){0>=--this.refCount&&B(this)}}),o.profile&&(a.getTotalTextureSize=function(){var t=0;return Object.keys(vt).forEach(function(e){t+=vt[e].stats.size}),t}),{create2D:function(e,r){function n(t,e){var r=i.texInfo;z.call(r);var a=C();return"number"==typeof t?T(a,0|t,"number"==typeof e?0|e:0|t):t?(P(r,t),S(a,t)):T(a,1,1),r.genMipmaps&&(a.mipmask=(a.width<<1)-1),i.mipmask=a.mipmask,c(i,a),i.internalformat=a.internalformat,n.width=a.width,n.height=a.height,D(i),E(a,3553),I(r,3553),R(),L(a),o.profile&&(i.stats.size=k(i.internalformat,i.type,a.width,a.height,r.genMipmaps,!1)),n.format=tt[i.internalformat],n.type=et[i.type],n.mag=rt[r.magFilter],n.min=nt[r.minFilter],n.wrapS=it[r.wrapS],n.wrapT=it[r.wrapT],n}var i=new O(3553);return vt[i.id]=i,a.textureCount++,n(e,r),n.subimage=function(t,e,r,a){e|=0,r|=0,a|=0;var o=v();return c(o,i),o.width=0,o.height=0,p(o,t),o.width=o.width||(i.width>>a)-e,o.height=o.height||(i.height>>a)-r,D(i),d(o,3553,e,r,a),R(),M(o),n},n.resize=function(e,r){var a=0|e,s=0|r||a;if(a===i.width&&s===i.height)return n;n.width=i.width=a,n.height=i.height=s,D(i);for(var l,c=i.channels,u=i.type,h=0;i.mipmask>>h;++h){var f=a>>h,p=s>>h;if(!f||!p)break;l=G.zero.allocType(u,f*p*c),t.texImage2D(3553,h,i.format,f,p,0,i.format,i.type,l),l&&G.zero.freeType(l)}return R(),o.profile&&(i.stats.size=k(i.internalformat,i.type,a,s,!1,!1)),n},n._reglType="texture2d",n._texture=i,o.profile&&(n.stats=i.stats),n.destroy=function(){i.decRef()},n},createCube:function(e,r,n,i,s,l){function h(t,e,r,n,i,a){var s,l=f.texInfo;for(z.call(l),s=0;6>s;++s)g[s]=C();if("number"!=typeof t&&t){if("object"==typeof t)if(e)S(g[0],t),S(g[1],e),S(g[2],r),S(g[3],n),S(g[4],i),S(g[5],a);else if(P(l,t),u(f,t),"faces"in t)for(t=t.faces,s=0;6>s;++s)c(g[s],f),S(g[s],t[s]);else for(s=0;6>s;++s)S(g[s],t)}else for(t=0|t||1,s=0;6>s;++s)T(g[s],t,t);for(c(f,g[0]),f.mipmask=l.genMipmaps?(g[0].width<<1)-1:g[0].mipmask,f.internalformat=g[0].internalformat,h.width=g[0].width,h.height=g[0].height,D(f),s=0;6>s;++s)E(g[s],34069+s);for(I(l,34067),R(),o.profile&&(f.stats.size=k(f.internalformat,f.type,h.width,h.height,l.genMipmaps,!0)),h.format=tt[f.internalformat],h.type=et[f.type],h.mag=rt[l.magFilter],h.min=nt[l.minFilter],h.wrapS=it[l.wrapS],h.wrapT=it[l.wrapT],s=0;6>s;++s)L(g[s]);return h}var f=new O(34067);vt[f.id]=f,a.cubeCount++;var g=Array(6);return h(e,r,n,i,s,l),h.subimage=function(t,e,r,n,i){r|=0,n|=0,i|=0;var a=v();return c(a,f),a.width=0,a.height=0,p(a,e),a.width=a.width||(f.width>>i)-r,a.height=a.height||(f.height>>i)-n,D(f),d(a,34069+t,r,n,i),R(),M(a),h},h.resize=function(e){if((e|=0)!==f.width){h.width=f.width=e,h.height=f.height=e,D(f);for(var r=0;6>r;++r)for(var n=0;f.mipmask>>n;++n)t.texImage2D(34069+r,n,f.format,e>>n,e>>n,0,f.format,f.type,null);return R(),o.profile&&(f.stats.size=k(f.internalformat,f.type,h.width,h.height,!1,!0)),h}},h._reglType="textureCube",h._texture=f,o.profile&&(h.stats=f.stats),h.destroy=function(){f.decRef()},h},clear:function(){for(var e=0;e<yt;++e)t.activeTexture(33984+e),t.bindTexture(3553,null),xt[e]=null;X(vt).forEach(B),a.cubeCount=0,a.textureCount=0},getTexture:function(t){return null},restore:function(){X(vt).forEach(function(e){e.texture=t.createTexture(),t.bindTexture(e.target,e.texture);for(var r=0;32>r;++r)if(0!=(e.mipmask&1<<r))if(3553===e.target)t.texImage2D(3553,r,e.internalformat,e.width>>r,e.height>>r,0,e.internalformat,e.type,null);else for(var n=0;6>n;++n)t.texImage2D(34069+n,r,e.internalformat,e.width>>r,e.height>>r,0,e.internalformat,e.type,null);I(e.texInfo,e.target)})}}}function A(t,e,r,n,i,a){function o(t,e,r){this.target=t,this.texture=e,this.renderbuffer=r;var n=t=0;e?(t=e.width,n=e.height):r&&(t=r.width,n=r.height),this.width=t,this.height=n}function s(t){t&&(t.texture&&t.texture._texture.decRef(),t.renderbuffer&&t.renderbuffer._renderbuffer.decRef())}function l(t,e,r){t&&(t.texture?t.texture._texture.refCount+=1:t.renderbuffer._renderbuffer.refCount+=1)}function c(e,r){r&&(r.texture?t.framebufferTexture2D(36160,e,r.target,r.texture._texture.texture,0):t.framebufferRenderbuffer(36160,e,36161,r.renderbuffer._renderbuffer.renderbuffer))}function u(t){var e=3553,r=null,n=null,i=t;return"object"==typeof t&&(i=t.data,"target"in t&&(e=0|t.target)),"texture2d"===(t=i._reglType)?r=i:"textureCube"===t?r=i:"renderbuffer"===t&&(n=i,e=36161),new o(e,r,n)}function h(t,e,r,a,s){return r?((t=n.create2D({width:t,height:e,format:a,type:s}))._texture.refCount=0,new o(3553,t,null)):((t=i.create({width:t,height:e,format:a}))._renderbuffer.refCount=0,new o(36161,null,t))}function f(t){return t&&(t.texture||t.renderbuffer)}function p(t,e,r){t&&(t.texture?t.texture.resize(e,r):t.renderbuffer&&t.renderbuffer.resize(e,r))}function d(){this.id=k++,M[this.id]=this,this.framebuffer=t.createFramebuffer(),this.height=this.width=0,this.colorAttachments=[],this.depthStencilAttachment=this.stencilAttachment=this.depthAttachment=null}function g(t){t.colorAttachments.forEach(s),s(t.depthAttachment),s(t.stencilAttachment),s(t.depthStencilAttachment)}function m(e){t.deleteFramebuffer(e.framebuffer),e.framebuffer=null,a.framebufferCount--,delete M[e.id]}function v(e){var n;t.bindFramebuffer(36160,e.framebuffer);var i=e.colorAttachments;for(n=0;n<i.length;++n)c(36064+n,i[n]);for(n=i.length;n<r.maxColorAttachments;++n)t.framebufferTexture2D(36160,36064+n,3553,null,0);t.framebufferTexture2D(36160,33306,3553,null,0),t.framebufferTexture2D(36160,36096,3553,null,0),t.framebufferTexture2D(36160,36128,3553,null,0),c(36096,e.depthAttachment),c(36128,e.stencilAttachment),c(33306,e.depthStencilAttachment),t.checkFramebufferStatus(36160),t.bindFramebuffer(36160,x.next?x.next.framebuffer:null),x.cur=x.next,t.getError()}function y(t,e){function r(t,e){var i,a=0,o=0,s=!0,c=!0;i=null;var p=!0,d="rgba",m="uint8",y=1,x=null,w=null,k=null,M=!1;"number"==typeof t?(a=0|t,o=0|e||a):t?("shape"in t?(a=(o=t.shape)[0],o=o[1]):("radius"in t&&(a=o=t.radius),"width"in t&&(a=t.width),"height"in t&&(o=t.height)),("color"in t||"colors"in t)&&(i=t.color||t.colors,Array.isArray(i)),i||("colorCount"in t&&(y=0|t.colorCount),"colorTexture"in t&&(p=!!t.colorTexture,d="rgba4"),"colorType"in t&&(m=t.colorType,!p)&&("half float"===m||"float16"===m?d="rgba16f":"float"!==m&&"float32"!==m||(d="rgba32f")),"colorFormat"in t&&(d=t.colorFormat,0<=b.indexOf(d)?p=!0:0<=_.indexOf(d)&&(p=!1))),("depthTexture"in t||"depthStencilTexture"in t)&&(M=!(!t.depthTexture&&!t.depthStencilTexture)),"depth"in t&&("boolean"==typeof t.depth?s=t.depth:(x=t.depth,c=!1)),"stencil"in t&&("boolean"==typeof t.stencil?c=t.stencil:(w=t.stencil,s=!1)),"depthStencil"in t&&("boolean"==typeof t.depthStencil?s=c=t.depthStencil:(k=t.depthStencil,c=s=!1))):a=o=1;var A=null,T=null,S=null,E=null;if(Array.isArray(i))A=i.map(u);else if(i)A=[u(i)];else for(A=Array(y),i=0;i<y;++i)A[i]=h(a,o,p,d,m);for(a=a||A[0].width,o=o||A[0].height,x?T=u(x):s&&!c&&(T=h(a,o,M,"depth","uint32")),w?S=u(w):c&&!s&&(S=h(a,o,!1,"stencil","uint8")),k?E=u(k):!x&&!w&&c&&s&&(E=h(a,o,M,"depth stencil","depth stencil")),s=null,i=0;i<A.length;++i)l(A[i]),A[i]&&A[i].texture&&(c=yt[A[i].texture._texture.format]*xt[A[i].texture._texture.type],null===s&&(s=c));return l(T),l(S),l(E),g(n),n.width=a,n.height=o,n.colorAttachments=A,n.depthAttachment=T,n.stencilAttachment=S,n.depthStencilAttachment=E,r.color=A.map(f),r.depth=f(T),r.stencil=f(S),r.depthStencil=f(E),r.width=n.width,r.height=n.height,v(n),r}var n=new d;return a.framebufferCount++,r(t,e),j(r,{resize:function(t,e){var i=0|t,a=0|e||i;if(i===n.width&&a===n.height)return r;for(var o=n.colorAttachments,s=0;s<o.length;++s)p(o[s],i,a);return p(n.depthAttachment,i,a),p(n.stencilAttachment,i,a),p(n.depthStencilAttachment,i,a),n.width=r.width=i,n.height=r.height=a,v(n),r},_reglType:"framebuffer",_framebuffer:n,destroy:function(){m(n),g(n)},use:function(t){x.setFBO({framebuffer:r},t)}})}var x={cur:null,next:null,dirty:!1,setFBO:null},b=["rgba"],_=["rgba4","rgb565","rgb5 a1"];e.ext_srgb&&_.push("srgba"),e.ext_color_buffer_half_float&&_.push("rgba16f","rgb16f"),e.webgl_color_buffer_float&&_.push("rgba32f");var w=["uint8"];e.oes_texture_half_float&&w.push("half float","float16"),e.oes_texture_float&&w.push("float","float32");var k=0,M={};return j(x,{getFramebuffer:function(t){return"function"==typeof t&&"framebuffer"===t._reglType&&(t=t._framebuffer)instanceof d?t:null},create:y,createCube:function(t){function e(t){var i,a={color:null},o=0,s=null;i="rgba";var l="uint8",c=1;if("number"==typeof t?o=0|t:t?("shape"in t?o=t.shape[0]:("radius"in t&&(o=0|t.radius),"width"in t?o=0|t.width:"height"in t&&(o=0|t.height)),("color"in t||"colors"in t)&&(s=t.color||t.colors,Array.isArray(s)),s||("colorCount"in t&&(c=0|t.colorCount),"colorType"in t&&(l=t.colorType),"colorFormat"in t&&(i=t.colorFormat)),"depth"in t&&(a.depth=t.depth),"stencil"in t&&(a.stencil=t.stencil),"depthStencil"in t&&(a.depthStencil=t.depthStencil)):o=1,s)if(Array.isArray(s))for(t=[],i=0;i<s.length;++i)t[i]=s[i];else t=[s];else for(t=Array(c),s={radius:o,format:i,type:l},i=0;i<c;++i)t[i]=n.createCube(s);for(a.color=Array(t.length),i=0;i<t.length;++i)c=t[i],o=o||c.width,a.color[i]={target:34069,data:t[i]};for(i=0;6>i;++i){for(c=0;c<t.length;++c)a.color[c].target=34069+i;0<i&&(a.depth=r[0].depth,a.stencil=r[0].stencil,a.depthStencil=r[0].depthStencil),r[i]?r[i](a):r[i]=y(a)}return j(e,{width:o,height:o,color:t})}var r=Array(6);return e(t),j(e,{faces:r,resize:function(t){var n=0|t;if(n===e.width)return e;var i=e.color;for(t=0;t<i.length;++t)i[t].resize(n);for(t=0;6>t;++t)r[t].resize(n);return e.width=e.height=n,e},_reglType:"framebufferCube",destroy:function(){r.forEach(function(t){t.destroy()})}})},clear:function(){X(M).forEach(m)},restore:function(){X(M).forEach(function(e){e.framebuffer=t.createFramebuffer(),v(e)})}})}function T(){this.w=this.z=this.y=this.x=this.state=0,this.buffer=null,this.size=0,this.normalized=!1,this.type=5126,this.divisor=this.stride=this.offset=0}function S(t,e,r,n){function i(t,e,r,n){this.name=t,this.id=e,this.location=r,this.info=n}function a(t,e){for(var r=0;r<t.length;++r)if(t[r].id===e.id)return void(t[r].location=e.location);t.push(e)}function o(r,n,i){if(!(o=(i=35632===r?c:u)[n])){var a=e.str(n),o=t.createShader(r);t.shaderSource(o,a),t.compileShader(o),i[n]=o}return o}function s(t,e){this.id=p++,this.fragId=t,this.vertId=e,this.program=null,this.uniforms=[],this.attributes=[],n.profile&&(this.stats={uniformsCount:0,attributesCount:0})}function l(r,s){var l,c;l=o(35632,r.fragId),c=o(35633,r.vertId);var u=r.program=t.createProgram();t.attachShader(u,l),t.attachShader(u,c),t.linkProgram(u);var h=t.getProgramParameter(u,35718);n.profile&&(r.stats.uniformsCount=h);var f=r.uniforms;for(l=0;l<h;++l)if(c=t.getActiveUniform(u,l))if(1<c.size)for(var p=0;p<c.size;++p){var d=c.name.replace("[0]","["+p+"]");a(f,new i(d,e.id(d),t.getUniformLocation(u,d),c))}else a(f,new i(c.name,e.id(c.name),t.getUniformLocation(u,c.name),c));for(h=t.getProgramParameter(u,35721),n.profile&&(r.stats.attributesCount=h),f=r.attributes,l=0;l<h;++l)(c=t.getActiveAttrib(u,l))&&a(f,new i(c.name,e.id(c.name),t.getAttribLocation(u,c.name),c))}var c={},u={},h={},f=[],p=0;return n.profile&&(r.getMaxUniformsCount=function(){var t=0;return f.forEach(function(e){e.stats.uniformsCount>t&&(t=e.stats.uniformsCount)}),t},r.getMaxAttributesCount=function(){var t=0;return f.forEach(function(e){e.stats.attributesCount>t&&(t=e.stats.attributesCount)}),t}),{clear:function(){var e=t.deleteShader.bind(t);X(c).forEach(e),c={},X(u).forEach(e),u={},f.forEach(function(e){t.deleteProgram(e.program)}),f.length=0,h={},r.shaderCount=0},program:function(t,e,n){var i=h[e];i||(i=h[e]={});var a=i[t];return a||(a=new s(e,t),r.shaderCount++,l(a),i[t]=a,f.push(a)),a},restore:function(){c={},u={};for(var t=0;t<f.length;++t)l(f[t])},shader:o,frag:-1,vert:-1}}function E(t,e,r,n,i,a,o){function s(i){var a;a=null===e.next?5121:e.next.colorAttachments[0].texture._texture.type;var o=0,s=0,l=n.framebufferWidth,c=n.framebufferHeight,u=null;return Y(i)?u=i:i&&(o=0|i.x,s=0|i.y,l=0|(i.width||n.framebufferWidth-o),c=0|(i.height||n.framebufferHeight-s),u=i.data||null),r(),i=l*c*4,u||(5121===a?u=new Uint8Array(i):5126===a&&(u=u||new Float32Array(i))),t.pixelStorei(3333,4),t.readPixels(o,s,l,c,6408,a,u),u}return function(t){return t&&"framebuffer"in t?function(t){var r;return e.setFBO({framebuffer:t.framebuffer},function(){r=s(t)}),r}(t):s(t)}}function C(t){return Array.prototype.slice.call(t)}function L(t){return C(t).join("")}function z(){function t(){var t=[],e=[];return j(function(){t.push.apply(t,C(arguments))},{def:function(){var n="v"+r++;return e.push(n),0<arguments.length&&(t.push(n,"="),t.push.apply(t,C(arguments)),t.push(";")),n},toString:function(){return L([0<e.length?"var "+e+";":"",L(t)])}})}function e(){function e(t,e){n(t,e,"=",r.def(t,e),";")}var r=t(),n=t(),i=r.toString,a=n.toString;return j(function(){r.apply(r,C(arguments))},{def:r.def,entry:r,exit:n,save:e,set:function(t,n,i){e(t,n),r(t,n,"=",i,";")},toString:function(){return i()+a()}})}var r=0,n=[],i=[],a=t(),o={};return{global:a,link:function(t){for(var e=0;e<i.length;++e)if(i[e]===t)return n[e];return e="g"+r++,n.push(e),i.push(t),e},block:t,proc:function(t,r){function n(){var t="a"+i.length;return i.push(t),t}var i=[];r=r||0;for(var a=0;a<r;++a)n();var s=(a=e()).toString;return o[t]=j(a,{arg:n,toString:function(){return L(["function(",i.join(),"){",s(),"}"])}})},scope:e,cond:function(){var t=L(arguments),r=e(),n=e(),i=r.toString,a=n.toString;return j(r,{then:function(){return r.apply(r,C(arguments)),this},else:function(){return n.apply(n,C(arguments)),this},toString:function(){var e=a();return e&&(e="else{"+e+"}"),L(["if(",t,"){",i(),"}",e])}})},compile:function(){var t=['"use strict";',a,"return {"];Object.keys(o).forEach(function(e){t.push('"',e,'":',o[e].toString(),",")}),t.push("}");var e=L(t).replace(/;/g,";\n").replace(/}/g,"}\n").replace(/{/g,"{\n");return Function.apply(null,n.concat(e)).apply(null,i)}}}function P(t){return Array.isArray(t)||Y(t)||l(t)}function I(t){return t.sort(function(t,e){return"viewport"===t?-1:"viewport"===e?1:t<e?-1:1})}function O(t,e,r,n){this.thisDep=t,this.contextDep=e,this.propDep=r,this.append=n}function D(t){return t&&!(t.thisDep||t.contextDep||t.propDep)}function R(t){return new O(!1,!1,!1,t)}function B(t,e){var r=t.type;return 0===r?new O(!0,1<=(r=t.data.length),2<=r,e):4===r?new O((r=t.data).thisDep,r.contextDep,r.propDep,e):new O(3===r,2===r,1===r,e)}function F(t,e,r,n,i,o,s,l,c,u,h,f,p,d,g){function v(t){return t.replace(".","_")}function y(t,e,r){var n=v(t);nt.push(t),et[n]=tt[n]=!!r,it[n]=e}function x(t,e,r){var n=v(t);nt.push(t),Array.isArray(r)?(tt[n]=r.slice(),et[n]=r.slice()):tt[n]=et[n]=r,at[n]=e}function b(){var t=z(),r=t.link,n=t.global;t.id=lt++,t.batchId="0";var i=r(ot),a=t.shared={props:"a0"};Object.keys(ot).forEach(function(t){a[t]=n.def(i,".",t)});var o=t.next={},s=t.current={};Object.keys(at).forEach(function(t){Array.isArray(tt[t])&&(o[t]=n.def(a.next,".",t),s[t]=n.def(a.current,".",t))});var l=t.constants={};Object.keys(st).forEach(function(t){l[t]=n.def(JSON.stringify(st[t]))}),t.invoke=function(e,n){switch(n.type){case 0:var i=["this",a.context,a.props,t.batchId];return e.def(r(n.data),".call(",i.slice(0,Math.max(n.data.length+1,4)),")");case 1:return e.def(a.props,n.data);case 2:return e.def(a.context,n.data);case 3:return e.def("this",n.data);case 4:return n.data.append(t,e),n.data.ref}},t.attribCache={};var c={};return t.scopeAttrib=function(t){if((t=e.id(t))in c)return c[t];var n=u.scope[t];return n||(n=u.scope[t]=new Z),c[t]=r(n)},t}function _(t,e){var r=t.static,n=t.dynamic;if("framebuffer"in r){var i=r.framebuffer;return i?(i=l.getFramebuffer(i),R(function(t,e){var r=t.link(i),n=t.shared;return e.set(n.framebuffer,".next",r),n=n.context,e.set(n,".framebufferWidth",r+".width"),e.set(n,".framebufferHeight",r+".height"),r})):R(function(t,e){var r=t.shared;return e.set(r.framebuffer,".next","null"),r=r.context,e.set(r,".framebufferWidth",r+".drawingBufferWidth"),e.set(r,".framebufferHeight",r+".drawingBufferHeight"),"null"})}if("framebuffer"in n){var a=n.framebuffer;return B(a,function(t,e){var r=t.invoke(e,a),n=t.shared,i=n.framebuffer;r=e.def(i,".getFramebuffer(",r,")");return e.set(i,".next",r),n=n.context,e.set(n,".framebufferWidth",r+"?"+r+".width:"+n+".drawingBufferWidth"),e.set(n,".framebufferHeight",r+"?"+r+".height:"+n+".drawingBufferHeight"),r})}return null}function w(t){function r(t){if(t in n){var r=e.id(n[t]);return(t=R(function(){return r})).id=r,t}if(t in i){var a=i[t];return B(a,function(t,e){var r=t.invoke(e,a);return e.def(t.shared.strings,".id(",r,")")})}return null}var n=t.static,i=t.dynamic,a=r("frag"),o=r("vert"),s=null;return D(a)&&D(o)?(s=h.program(o.id,a.id),t=R(function(t,e){return t.link(s)})):t=new O(a&&a.thisDep||o&&o.thisDep,a&&a.contextDep||o&&o.contextDep,a&&a.propDep||o&&o.propDep,function(t,e){var r,n,i=t.shared.shader;return r=a?a.append(t,e):e.def(i,".","frag"),n=o?o.append(t,e):e.def(i,".","vert"),e.def(i+".program("+n+","+r+")")}),{frag:a,vert:o,progVar:t,program:s}}function k(t,e){function r(t,e){if(t in n){var r=0|n[t];return R(function(t,n){return e&&(t.OFFSET=r),r})}if(t in i){var o=i[t];return B(o,function(t,r){var n=t.invoke(r,o);return e&&(t.OFFSET=n),n})}return e&&a?R(function(t,e){return t.OFFSET="0",0}):null}var n=t.static,i=t.dynamic,a=function(){if("elements"in n){var t=n.elements;P(t)?t=o.getElements(o.create(t,!0)):t&&(t=o.getElements(t));var e=R(function(e,r){if(t){var n=e.link(t);return e.ELEMENTS=n}return e.ELEMENTS=null});return e.value=t,e}if("elements"in i){var r=i.elements;return B(r,function(t,e){var n=(i=t.shared).isBufferArgs,i=i.elements,a=t.invoke(e,r),o=e.def("null");n=e.def(n,"(",a,")"),a=t.cond(n).then(o,"=",i,".createStream(",a,");").else(o,"=",i,".getElements(",a,");");return e.entry(a),e.exit(t.cond(n).then(i,".destroyStream(",o,");")),t.ELEMENTS=o})}return null}(),s=r("offset",!0);return{elements:a,primitive:function(){if("primitive"in n){var t=n.primitive;return R(function(e,r){return rt[t]})}if("primitive"in i){var e=i.primitive;return B(e,function(t,r){var n=t.constants.primTypes,i=t.invoke(r,e);return r.def(n,"[",i,"]")})}return a?D(a)?a.value?R(function(t,e){return e.def(t.ELEMENTS,".primType")}):R(function(){return 4}):new O(a.thisDep,a.contextDep,a.propDep,function(t,e){var r=t.ELEMENTS;return e.def(r,"?",r,".primType:",4)}):null}(),count:function(){if("count"in n){var t=0|n.count;return R(function(){return t})}if("count"in i){var e=i.count;return B(e,function(t,r){return t.invoke(r,e)})}return a?D(a)?a?s?new O(s.thisDep,s.contextDep,s.propDep,function(t,e){return e.def(t.ELEMENTS,".vertCount-",t.OFFSET)}):R(function(t,e){return e.def(t.ELEMENTS,".vertCount")}):R(function(){return-1}):new O(a.thisDep||s.thisDep,a.contextDep||s.contextDep,a.propDep||s.propDep,function(t,e){var r=t.ELEMENTS;return t.OFFSET?e.def(r,"?",r,".vertCount-",t.OFFSET,":-1"):e.def(r,"?",r,".vertCount:-1")}):null}(),instances:r("instances",!1),offset:s}}function M(t,r){var n=t.static,a=t.dynamic,o={};return Object.keys(n).forEach(function(t){var r=n[t],a=e.id(t),s=new Z;if(P(r))s.state=1,s.buffer=i.getBuffer(i.create(r,34962,!1,!0)),s.type=0;else if(c=i.getBuffer(r))s.state=1,s.buffer=c,s.type=0;else if("constant"in r){var l=r.constant;s.buffer="null",s.state=2,"number"==typeof l?s.x=l:bt.forEach(function(t,e){e<l.length&&(s[t]=l[e])})}else{var c=P(r.buffer)?i.getBuffer(i.create(r.buffer,34962,!1,!0)):i.getBuffer(r.buffer),u=0|r.offset,h=0|r.stride,f=0|r.size,p=!!r.normalized,d=0;"type"in r&&(d=J[r.type]),r=0|r.divisor,s.buffer=c,s.state=1,s.size=f,s.normalized=p,s.type=d||c.dtype,s.offset=u,s.stride=h,s.divisor=r}o[t]=R(function(t,e){var r=t.attribCache;if(a in r)return r[a];var n={isStream:!1};return Object.keys(s).forEach(function(t){n[t]=s[t]}),s.buffer&&(n.buffer=t.link(s.buffer),n.type=n.type||n.buffer+".dtype"),r[a]=n})}),Object.keys(a).forEach(function(t){var e=a[t];o[t]=B(e,function(t,r){function n(t){r(l[t],"=",i,".",t,"|0;")}var i=t.invoke(r,e),a=t.shared,o=a.isBufferArgs,s=a.buffer,l={isStream:r.def(!1)},c=new Z;c.state=1,Object.keys(c).forEach(function(t){l[t]=r.def(""+c[t])});var u=l.buffer,h=l.type;return r("if(",o,"(",i,")){",l.isStream,"=true;",u,"=",s,".createStream(",34962,",",i,");",h,"=",u,".dtype;","}else{",u,"=",s,".getBuffer(",i,");","if(",u,"){",h,"=",u,".dtype;",'}else if("constant" in ',i,"){",l.state,"=",2,";","if(typeof "+i+'.constant === "number"){',l[bt[0]],"=",i,".constant;",bt.slice(1).map(function(t){return l[t]}).join("="),"=0;","}else{",bt.map(function(t,e){return l[t]+"="+i+".constant.length>"+e+"?"+i+".constant["+e+"]:0;"}).join(""),"}}else{","if(",o,"(",i,".buffer)){",u,"=",s,".createStream(",34962,",",i,".buffer);","}else{",u,"=",s,".getBuffer(",i,".buffer);","}",h,'="type" in ',i,"?",a.glTypes,"[",i,".type]:",u,".dtype;",l.normalized,"=!!",i,".normalized;"),n("size"),n("offset"),n("stride"),n("divisor"),r("}}"),r.exit("if(",l.isStream,"){",s,".destroyStream(",u,");","}"),l})}),o}function A(t,e,r,n,i){var o=_(t),s=function(t,e,r){function n(t){if(t in i){var r=i[t];t=!0;var n,o,s=0|r.x,l=0|r.y;return"width"in r?n=0|r.width:t=!1,"height"in r?o=0|r.height:t=!1,new O(!t&&e&&e.thisDep,!t&&e&&e.contextDep,!t&&e&&e.propDep,function(t,e){var i=t.shared.context,a=n;"width"in r||(a=e.def(i,".","framebufferWidth","-",s));var c=o;return"height"in r||(c=e.def(i,".","framebufferHeight","-",l)),[s,l,a,c]})}if(t in a){var c=a[t];return t=B(c,function(t,e){var r=t.invoke(e,c),n=t.shared.context,i=e.def(r,".x|0"),a=e.def(r,".y|0");return[i,a,e.def('"width" in ',r,"?",r,".width|0:","(",n,".","framebufferWidth","-",i,")"),r=e.def('"height" in ',r,"?",r,".height|0:","(",n,".","framebufferHeight","-",a,")")]}),e&&(t.thisDep=t.thisDep||e.thisDep,t.contextDep=t.contextDep||e.contextDep,t.propDep=t.propDep||e.propDep),t}return e?new O(e.thisDep,e.contextDep,e.propDep,function(t,e){var r=t.shared.context;return[0,0,e.def(r,".","framebufferWidth"),e.def(r,".","framebufferHeight")]}):null}var i=t.static,a=t.dynamic;if(t=n("viewport")){var o=t;t=new O(t.thisDep,t.contextDep,t.propDep,function(t,e){var r=o.append(t,e),n=t.shared.context;return e.set(n,".viewportWidth",r[2]),e.set(n,".viewportHeight",r[3]),r})}return{viewport:t,scissor_box:n("scissor.box")}}(t,o),l=k(t),c=function(t,e){var r=t.static,n=t.dynamic,i={};return nt.forEach(function(t){function e(e,a){if(t in r){var s=e(r[t]);i[o]=R(function(){return s})}else if(t in n){var l=n[t];i[o]=B(l,function(t,e){return a(t,e,t.invoke(e,l))})}}var o=v(t);switch(t){case"cull.enable":case"blend.enable":case"dither":case"stencil.enable":case"depth.enable":case"scissor.enable":case"polygonOffset.enable":case"sample.alpha":case"sample.enable":case"depth.mask":return e(function(t){return t},function(t,e,r){return r});case"depth.func":return e(function(t){return kt[t]},function(t,e,r){return e.def(t.constants.compareFuncs,"[",r,"]")});case"depth.range":return e(function(t){return t},function(t,e,r){return[e.def("+",r,"[0]"),e=e.def("+",r,"[1]")]});case"blend.func":return e(function(t){return[wt["srcRGB"in t?t.srcRGB:t.src],wt["dstRGB"in t?t.dstRGB:t.dst],wt["srcAlpha"in t?t.srcAlpha:t.src],wt["dstAlpha"in t?t.dstAlpha:t.dst]]},function(t,e,r){function n(t,n){return e.def('"',t,n,'" in ',r,"?",r,".",t,n,":",r,".",t)}t=t.constants.blendFuncs;var i=n("src","RGB"),a=n("dst","RGB"),o=(i=e.def(t,"[",i,"]"),e.def(t,"[",n("src","Alpha"),"]"));return[i,a=e.def(t,"[",a,"]"),o,t=e.def(t,"[",n("dst","Alpha"),"]")]});case"blend.equation":return e(function(t){return"string"==typeof t?[$[t],$[t]]:"object"==typeof t?[$[t.rgb],$[t.alpha]]:void 0},function(t,e,r){var n=t.constants.blendEquations,i=e.def(),a=e.def();return(t=t.cond("typeof ",r,'==="string"')).then(i,"=",a,"=",n,"[",r,"];"),t.else(i,"=",n,"[",r,".rgb];",a,"=",n,"[",r,".alpha];"),e(t),[i,a]});case"blend.color":return e(function(t){return a(4,function(e){return+t[e]})},function(t,e,r){return a(4,function(t){return e.def("+",r,"[",t,"]")})});case"stencil.mask":return e(function(t){return 0|t},function(t,e,r){return e.def(r,"|0")});case"stencil.func":return e(function(t){return[kt[t.cmp||"keep"],t.ref||0,"mask"in t?t.mask:-1]},function(t,e,r){return[t=e.def('"cmp" in ',r,"?",t.constants.compareFuncs,"[",r,".cmp]",":",7680),e.def(r,".ref|0"),e=e.def('"mask" in ',r,"?",r,".mask|0:-1")]});case"stencil.opFront":case"stencil.opBack":return e(function(e){return["stencil.opBack"===t?1029:1028,Mt[e.fail||"keep"],Mt[e.zfail||"keep"],Mt[e.zpass||"keep"]]},function(e,r,n){function i(t){return r.def('"',t,'" in ',n,"?",a,"[",n,".",t,"]:",7680)}var a=e.constants.stencilOps;return["stencil.opBack"===t?1029:1028,i("fail"),i("zfail"),i("zpass")]});case"polygonOffset.offset":return e(function(t){return[0|t.factor,0|t.units]},function(t,e,r){return[e.def(r,".factor|0"),e=e.def(r,".units|0")]});case"cull.face":return e(function(t){var e=0;return"front"===t?e=1028:"back"===t&&(e=1029),e},function(t,e,r){return e.def(r,'==="front"?',1028,":",1029)});case"lineWidth":return e(function(t){return t},function(t,e,r){return r});case"frontFace":return e(function(t){return At[t]},function(t,e,r){return e.def(r+'==="cw"?2304:2305')});case"colorMask":return e(function(t){return t.map(function(t){return!!t})},function(t,e,r){return a(4,function(t){return"!!"+r+"["+t+"]"})});case"sample.coverage":return e(function(t){return["value"in t?t.value:1,!!t.invert]},function(t,e,r){return[e.def('"value" in ',r,"?+",r,".value:1"),e=e.def("!!",r,".invert")]})}}),i}(t),u=w(t),h=s.viewport;return h&&(c.viewport=h),(s=s[h=v("scissor.box")])&&(c[h]=s),(o={framebuffer:o,draw:l,shader:u,state:c,dirty:s=0<Object.keys(c).length}).profile=function(t){var e,r=t.static;if(t=t.dynamic,"profile"in r){var n=!!r.profile;(e=R(function(t,e){return n})).enable=n}else if("profile"in t){var i=t.profile;e=B(i,function(t,e){return t.invoke(e,i)})}return e}(t),o.uniforms=function(t,e){var r=t.static,n=t.dynamic,i={};return Object.keys(r).forEach(function(t){var e,n=r[t];if("number"==typeof n||"boolean"==typeof n)e=R(function(){return n});else if("function"==typeof n){var o=n._reglType;"texture2d"===o||"textureCube"===o?e=R(function(t){return t.link(n)}):"framebuffer"!==o&&"framebufferCube"!==o||(e=R(function(t){return t.link(n.color[0])}))}else m(n)&&(e=R(function(t){return t.global.def("[",a(n.length,function(t){return n[t]}),"]")}));e.value=n,i[t]=e}),Object.keys(n).forEach(function(t){var e=n[t];i[t]=B(e,function(t,r){return t.invoke(r,e)})}),i}(r),o.attributes=M(e),o.context=function(t){var e=t.static,r=t.dynamic,n={};return Object.keys(e).forEach(function(t){var r=e[t];n[t]=R(function(t,e){return"number"==typeof r||"boolean"==typeof r?""+r:t.link(r)})}),Object.keys(r).forEach(function(t){var e=r[t];n[t]=B(e,function(t,r){return t.invoke(r,e)})}),n}(n),o}function T(t,e,r){var n=t.shared.context,i=t.scope();Object.keys(r).forEach(function(a){e.save(n,"."+a),i(n,".",a,"=",r[a].append(t,e),";")}),e(i)}function S(t,e,r,n){var i,a=(s=t.shared).gl,o=s.framebuffer;Q&&(i=e.def(s.extensions,".webgl_draw_buffers"));var s=(l=t.constants).drawBuffer,l=l.backBuffer;t=r?r.append(t,e):e.def(o,".next"),n||e("if(",t,"!==",o,".cur){"),e("if(",t,"){",a,".bindFramebuffer(",36160,",",t,".framebuffer);"),Q&&e(i,".drawBuffersWEBGL(",s,"[",t,".colorAttachments.length]);"),e("}else{",a,".bindFramebuffer(",36160,",null);"),Q&&e(i,".drawBuffersWEBGL(",l,");"),e("}",o,".cur=",t,";"),n||e("}")}function E(t,e,r){var n=t.shared,i=n.gl,o=t.current,s=t.next,l=n.current,c=n.next,u=t.cond(l,".dirty");nt.forEach(function(e){var n,h;if(!((e=v(e))in r.state))if(e in s){n=s[e],h=o[e];var f=a(tt[e].length,function(t){return u.def(n,"[",t,"]")});u(t.cond(f.map(function(t,e){return t+"!=="+h+"["+e+"]"}).join("||")).then(i,".",at[e],"(",f,");",f.map(function(t,e){return h+"["+e+"]="+t}).join(";"),";"))}else n=u.def(c,".",e),f=t.cond(n,"!==",l,".",e),u(f),e in it?f(t.cond(n).then(i,".enable(",it[e],");").else(i,".disable(",it[e],");"),l,".",e,"=",n,";"):f(i,".",at[e],"(",n,");",l,".",e,"=",n,";")}),0===Object.keys(r.state).length&&u(l,".dirty=false;"),e(u)}function C(t,e,r,n){var i=t.shared,a=t.current,o=i.current,s=i.gl;I(Object.keys(r)).forEach(function(i){var l=r[i];if(!n||n(l)){var c=l.append(t,e);if(it[i]){var u=it[i];D(l)?e(s,c?".enable(":".disable(",u,");"):e(t.cond(c).then(s,".enable(",u,");").else(s,".disable(",u,");")),e(o,".",i,"=",c,";")}else if(m(c)){var h=a[i];e(s,".",at[i],"(",c,");",c.map(function(t,e){return h+"["+e+"]="+t}).join(";"),";")}else e(s,".",at[i],"(",c,");",o,".",i,"=",c,";")}})}function L(t,e){K&&(t.instancing=e.def(t.shared.extensions,".angle_instanced_arrays"))}function F(t,e,r,n,i){function a(){return"undefined"==typeof performance?"Date.now()":"performance.now()"}function o(t){t(c=e.def(),"=",a(),";"),"string"==typeof i?t(f,".count+=",i,";"):t(f,".count++;"),d&&(n?t(u=e.def(),"=",g,".getNumPendingQueries();"):t(g,".beginQuery(",f,");"))}function s(t){t(f,".cpuTime+=",a(),"-",c,";"),d&&(n?t(g,".pushScopeStats(",u,",",g,".getNumPendingQueries(),",f,");"):t(g,".endQuery();"))}function l(t){var r=e.def(p,".profile");e(p,".profile=",t,";"),e.exit(p,".profile=",r,";")}var c,u,h=t.shared,f=t.stats,p=h.current,g=h.timer;if(r=r.profile){if(D(r))return void(r.enable?(o(e),s(e.exit),l("true")):l("false"));l(r=r.append(t,e))}else r=e.def(p,".profile");o(h=t.block()),e("if(",r,"){",h,"}"),s(t=t.block()),e.exit("if(",r,"){",t,"}")}function N(t,e,r,n,i){function a(r,n,i){function a(){e("if(!",u,".buffer){",l,".enableVertexAttribArray(",c,");}");var r,a=i.type;r=i.size?e.def(i.size,"||",n):n,e("if(",u,".type!==",a,"||",u,".size!==",r,"||",p.map(function(t){return u+"."+t+"!=="+i[t]}).join("||"),"){",l,".bindBuffer(",34962,",",h,".buffer);",l,".vertexAttribPointer(",[c,r,a,i.normalized,i.stride,i.offset],");",u,".type=",a,";",u,".size=",r,";",p.map(function(t){return u+"."+t+"="+i[t]+";"}).join(""),"}"),K&&(a=i.divisor,e("if(",u,".divisor!==",a,"){",t.instancing,".vertexAttribDivisorANGLE(",[c,a],");",u,".divisor=",a,";}"))}function s(){e("if(",u,".buffer){",l,".disableVertexAttribArray(",c,");","}if(",bt.map(function(t,e){return u+"."+t+"!=="+f[e]}).join("||"),"){",l,".vertexAttrib4f(",c,",",f,");",bt.map(function(t,e){return u+"."+t+"="+f[e]+";"}).join(""),"}")}var l=o.gl,c=e.def(r,".location"),u=e.def(o.attributes,"[",c,"]");r=i.state;var h=i.buffer,f=[i.x,i.y,i.z,i.w],p=["buffer","normalized","offset","stride"];1===r?a():2===r?s():(e("if(",r,"===",1,"){"),a(),e("}else{"),s(),e("}"))}var o=t.shared;n.forEach(function(n){var o,s=n.name,l=r.attributes[s];if(l){if(!i(l))return;o=l.append(t,e)}else{if(!i(Tt))return;var c=t.scopeAttrib(s);o={},Object.keys(new Z).forEach(function(t){o[t]=e.def(c,".",t)})}a(t.link(n),function(t){switch(t){case 35664:case 35667:case 35671:return 2;case 35665:case 35668:case 35672:return 3;case 35666:case 35669:case 35673:return 4;default:return 1}}(n.info.type),o)})}function j(t,r,n,i,o){for(var s,l=t.shared,c=l.gl,u=0;u<i.length;++u){var h,f=(g=i[u]).name,p=g.info.type,d=n.uniforms[f],g=t.link(g)+".location";if(d){if(!o(d))continue;if(D(d)){if(f=d.value,35678===p||35680===p)r(c,".uniform1i(",g,",",(p=t.link(f._texture||f.color[0]._texture))+".bind());"),r.exit(p,".unbind();");else if(35674===p||35675===p||35676===p)d=2,35675===p?d=3:35676===p&&(d=4),r(c,".uniformMatrix",d,"fv(",g,",false,",f=t.global.def("new Float32Array(["+Array.prototype.slice.call(f)+"])"),");");else{switch(p){case 5126:s="1f";break;case 35664:s="2f";break;case 35665:s="3f";break;case 35666:s="4f";break;case 35670:case 5124:s="1i";break;case 35671:case 35667:s="2i";break;case 35672:case 35668:s="3i";break;case 35673:s="4i";break;case 35669:s="4i"}r(c,".uniform",s,"(",g,",",m(f)?Array.prototype.slice.call(f):f,");")}continue}h=d.append(t,r)}else{if(!o(Tt))continue;h=r.def(l.uniforms,"[",e.id(f),"]")}switch(35678===p?r("if(",h,"&&",h,'._reglType==="framebuffer"){',h,"=",h,".color[0];","}"):35680===p&&r("if(",h,"&&",h,'._reglType==="framebufferCube"){',h,"=",h,".color[0];","}"),f=1,p){case 35678:case 35680:p=r.def(h,"._texture"),r(c,".uniform1i(",g,",",p,".bind());"),r.exit(p,".unbind();");continue;case 5124:case 35670:s="1i";break;case 35667:case 35671:s="2i",f=2;break;case 35668:case 35672:s="3i",f=3;break;case 35669:case 35673:s="4i",f=4;break;case 5126:s="1f";break;case 35664:s="2f",f=2;break;case 35665:s="3f",f=3;break;case 35666:s="4f",f=4;break;case 35674:s="Matrix2fv";break;case 35675:s="Matrix3fv";break;case 35676:s="Matrix4fv"}if(r(c,".uniform",s,"(",g,","),"M"===s.charAt(0)){g=Math.pow(p-35674+2,2);var v=t.global.def("new Float32Array(",g,")");r("false,(Array.isArray(",h,")||",h," instanceof Float32Array)?",h,":(",a(g,function(t){return v+"["+t+"]="+h+"["+t+"]"}),",",v,")")}else r(1<f?a(f,function(t){return h+"["+t+"]"}):h);r(");")}}function V(t,e,r,n){function i(i){var a=f[i];return a?a.contextDep&&n.contextDynamic||a.propDep?a.append(t,r):a.append(t,e):e.def(h,".",i)}function a(){function t(){r(l,".drawElementsInstancedANGLE(",[d,m,v,g+"<<(("+v+"-5121)>>1)",s],");")}function e(){r(l,".drawArraysInstancedANGLE(",[d,g,m,s],");")}p?y?t():(r("if(",p,"){"),t(),r("}else{"),e(),r("}")):e()}function o(){function t(){r(u+".drawElements("+[d,m,v,g+"<<(("+v+"-5121)>>1)"]+");")}function e(){r(u+".drawArrays("+[d,g,m]+");")}p?y?t():(r("if(",p,"){"),t(),r("}else{"),e(),r("}")):e()}var s,l,c=t.shared,u=c.gl,h=c.draw,f=n.draw,p=function(){var i=f.elements,a=e;return i?((i.contextDep&&n.contextDynamic||i.propDep)&&(a=r),i=i.append(t,a)):i=a.def(h,".","elements"),i&&a("if("+i+")"+u+".bindBuffer(34963,"+i+".buffer.buffer);"),i}(),d=i("primitive"),g=i("offset"),m=function(){var i=f.count,a=e;return i?((i.contextDep&&n.contextDynamic||i.propDep)&&(a=r),i=i.append(t,a)):i=a.def(h,".","count"),i}();if("number"==typeof m){if(0===m)return}else r("if(",m,"){"),r.exit("}");K&&(s=i("instances"),l=t.instancing);var v=p+".type",y=f.elements&&D(f.elements);K&&("number"!=typeof s||0<=s)?"string"==typeof s?(r("if(",s,">0){"),a(),r("}else if(",s,"<0){"),o(),r("}")):a():o()}function q(t,e,r,n,i){return i=(e=b()).proc("body",i),K&&(e.instancing=i.def(e.shared.extensions,".angle_instanced_arrays")),t(e,i,r,n),e.compile().body}function H(t,e,r,n){L(t,e),N(t,e,r,n.attributes,function(){return!0}),j(t,e,r,n.uniforms,function(){return!0}),V(t,e,e,r)}function G(t,e,r,n){function i(){return!0}t.batchId="a1",L(t,e),N(t,e,r,n.attributes,i),j(t,e,r,n.uniforms,i),V(t,e,e,r)}function W(t,e,r,n){function i(t){return t.contextDep&&o||t.propDep}function a(t){return!i(t)}L(t,e);var o=r.contextDep,s=e.def(),l=e.def();t.shared.props=l,t.batchId=s;var c=t.scope(),u=t.scope();e(c.entry,"for(",s,"=0;",s,"<","a1",";++",s,"){",l,"=","a0","[",s,"];",u,"}",c.exit),r.needsContext&&T(t,u,r.context),r.needsFramebuffer&&S(t,u,r.framebuffer),C(t,u,r.state,i),r.profile&&i(r.profile)&&F(t,u,r,!1,!0),n?(N(t,c,r,n.attributes,a),N(t,u,r,n.attributes,i),j(t,c,r,n.uniforms,a),j(t,u,r,n.uniforms,i),V(t,c,u,r)):(e=t.global.def("{}"),n=r.shader.progVar.append(t,u),l=u.def(n,".id"),c=u.def(e,"[",l,"]"),u(t.shared.gl,".useProgram(",n,".program);","if(!",c,"){",c,"=",e,"[",l,"]=",t.link(function(e){return q(G,t,r,e,2)}),"(",n,");}",c,".call(this,a0[",s,"],",s,");"))}function Y(t,r){function n(e){var n=r.shader[e];n&&i.set(a.shader,"."+e,n.append(t,i))}var i=t.proc("scope",3);t.batchId="a2";var a=t.shared,o=a.current;T(t,i,r.context),r.framebuffer&&r.framebuffer.append(t,i),I(Object.keys(r.state)).forEach(function(e){var n=r.state[e].append(t,i);m(n)?n.forEach(function(r,n){i.set(t.next[e],"["+n+"]",r)}):i.set(a.next,"."+e,n)}),F(t,i,r,!0,!0),["elements","offset","count","instances","primitive"].forEach(function(e){var n=r.draw[e];n&&i.set(a.draw,"."+e,""+n.append(t,i))}),Object.keys(r.uniforms).forEach(function(n){i.set(a.uniforms,"["+e.id(n)+"]",r.uniforms[n].append(t,i))}),Object.keys(r.attributes).forEach(function(e){var n=r.attributes[e].append(t,i),a=t.scopeAttrib(e);Object.keys(new Z).forEach(function(t){i.set(a,"."+t,n[t])})}),n("vert"),n("frag"),0<Object.keys(r.state).length&&(i(o,".dirty=true;"),i.exit(o,".dirty=true;")),i("a1(",t.shared.context,",a0,",t.batchId,");")}function X(t,e,r){var n=e.static[r];if(n&&function(t){if("object"==typeof t&&!m(t)){for(var e=Object.keys(t),r=0;r<e.length;++r)if(U.isDynamic(t[e[r]]))return!0;return!1}}(n)){var i=t.global,a=Object.keys(n),o=!1,s=!1,l=!1,c=t.global.def("{}");a.forEach(function(e){var r=n[e];if(U.isDynamic(r))"function"==typeof r&&(r=n[e]=U.unbox(r)),e=B(r,null),o=o||e.thisDep,l=l||e.propDep,s=s||e.contextDep;else{switch(i(c,".",e,"="),typeof r){case"number":i(r);break;case"string":i('"',r,'"');break;case"object":Array.isArray(r)&&i("[",r.join(),"]");break;default:i(t.link(r))}i(";")}}),e.dynamic[r]=new U.DynamicVariable(4,{thisDep:o,contextDep:s,propDep:l,ref:c,append:function(t,e){a.forEach(function(r){var i=n[r];U.isDynamic(i)&&(i=t.invoke(e,i),e(c,".",r,"=",i,";"))})}}),delete e.static[r]}}var Z=u.Record,$={add:32774,subtract:32778,"reverse subtract":32779};r.ext_blend_minmax&&($.min=32775,$.max=32776);var K=r.angle_instanced_arrays,Q=r.webgl_draw_buffers,tt={dirty:!0,profile:g.profile},et={},nt=[],it={},at={};y("dither",3024),y("blend.enable",3042),x("blend.color","blendColor",[0,0,0,0]),x("blend.equation","blendEquationSeparate",[32774,32774]),x("blend.func","blendFuncSeparate",[1,0,1,0]),y("depth.enable",2929,!0),x("depth.func","depthFunc",513),x("depth.range","depthRange",[0,1]),x("depth.mask","depthMask",!0),x("colorMask","colorMask",[!0,!0,!0,!0]),y("cull.enable",2884),x("cull.face","cullFace",1029),x("frontFace","frontFace",2305),x("lineWidth","lineWidth",1),y("polygonOffset.enable",32823),x("polygonOffset.offset","polygonOffset",[0,0]),y("sample.alpha",32926),y("sample.enable",32928),x("sample.coverage","sampleCoverage",[1,!1]),y("stencil.enable",2960),x("stencil.mask","stencilMask",-1),x("stencil.func","stencilFunc",[519,0,-1]),x("stencil.opFront","stencilOpSeparate",[1028,7680,7680,7680]),x("stencil.opBack","stencilOpSeparate",[1029,7680,7680,7680]),y("scissor.enable",3089),x("scissor.box","scissor",[0,0,t.drawingBufferWidth,t.drawingBufferHeight]),x("viewport","viewport",[0,0,t.drawingBufferWidth,t.drawingBufferHeight]);var ot={gl:t,context:p,strings:e,next:et,current:tt,draw:f,elements:o,buffer:i,shader:h,attributes:u.state,uniforms:c,framebuffer:l,extensions:r,timer:d,isBufferArgs:P},st={primTypes:rt,compareFuncs:kt,blendFuncs:wt,blendEquations:$,stencilOps:Mt,glTypes:J,orientationType:At};Q&&(st.backBuffer=[1029],st.drawBuffer=a(n.maxDrawbuffers,function(t){return 0===t?[0]:a(t,function(t){return 36064+t})}));var lt=0;return{next:et,current:tt,procs:function(){var t=b(),e=t.proc("poll"),r=t.proc("refresh"),i=t.block();e(i),r(i);var o,s=t.shared,l=s.gl,c=s.next,u=s.current;i(u,".dirty=false;"),S(t,e),S(t,r,null,!0),K&&(o=t.link(K));for(var h=0;h<n.maxAttributes;++h){var f=r.def(s.attributes,"[",h,"]"),p=t.cond(f,".buffer");p.then(l,".enableVertexAttribArray(",h,");",l,".bindBuffer(",34962,",",f,".buffer.buffer);",l,".vertexAttribPointer(",h,",",f,".size,",f,".type,",f,".normalized,",f,".stride,",f,".offset);").else(l,".disableVertexAttribArray(",h,");",l,".vertexAttrib4f(",h,",",f,".x,",f,".y,",f,".z,",f,".w);",f,".buffer=null;"),r(p),K&&r(o,".vertexAttribDivisorANGLE(",h,",",f,".divisor);")}return Object.keys(it).forEach(function(n){var a=it[n],o=i.def(c,".",n),s=t.block();s("if(",o,"){",l,".enable(",a,")}else{",l,".disable(",a,")}",u,".",n,"=",o,";"),r(s),e("if(",o,"!==",u,".",n,"){",s,"}")}),Object.keys(at).forEach(function(n){var o,s,h=at[n],f=tt[n],p=t.block();p(l,".",h,"("),m(f)?(h=f.length,o=t.global.def(c,".",n),s=t.global.def(u,".",n),p(a(h,function(t){return o+"["+t+"]"}),");",a(h,function(t){return s+"["+t+"]="+o+"["+t+"];"}).join("")),e("if(",a(h,function(t){return o+"["+t+"]!=="+s+"["+t+"]"}).join("||"),"){",p,"}")):(o=i.def(c,".",n),s=i.def(u,".",n),p(o,");",u,".",n,"=",o,";"),e("if(",o,"!==",s,"){",p,"}")),r(p)}),t.compile()}(),compile:function(t,e,r,n,i){var a=b();return a.stats=a.link(i),Object.keys(e.static).forEach(function(t){X(a,e,t)}),_t.forEach(function(e){X(a,t,e)}),r=A(t,e,r,n),function(t,e){var r=t.proc("draw",1);L(t,r),T(t,r,e.context),S(t,r,e.framebuffer),E(t,r,e),C(t,r,e.state),F(t,r,e,!1,!0);var n=e.shader.progVar.append(t,r);if(r(t.shared.gl,".useProgram(",n,".program);"),e.shader.program)H(t,r,e,e.shader.program);else{var i=t.global.def("{}"),a=r.def(n,".id"),o=r.def(i,"[",a,"]");r(t.cond(o).then(o,".call(this,a0);").else(o,"=",i,"[",a,"]=",t.link(function(r){return q(H,t,e,r,1)}),"(",n,");",o,".call(this,a0);"))}0<Object.keys(e.state).length&&r(t.shared.current,".dirty=true;")}(a,r),Y(a,r),function(t,e){function r(t){return t.contextDep&&i||t.propDep}var n=t.proc("batch",2);t.batchId="0",L(t,n);var i=!1,a=!0;Object.keys(e.context).forEach(function(t){i=i||e.context[t].propDep}),i||(T(t,n,e.context),a=!1);var o=!1;if((s=e.framebuffer)?(s.propDep?i=o=!0:s.contextDep&&i&&(o=!0),o||S(t,n,s)):S(t,n,null),e.state.viewport&&e.state.viewport.propDep&&(i=!0),E(t,n,e),C(t,n,e.state,function(t){return!r(t)}),e.profile&&r(e.profile)||F(t,n,e,!1,"a1"),e.contextDep=i,e.needsContext=a,e.needsFramebuffer=o,(a=e.shader.progVar).contextDep&&i||a.propDep)W(t,n,e,null);else if(a=a.append(t,n),n(t.shared.gl,".useProgram(",a,".program);"),e.shader.program)W(t,n,e,e.shader.program);else{var s=t.global.def("{}"),l=(o=n.def(a,".id"),n.def(s,"[",o,"]"));n(t.cond(l).then(l,".call(this,a0,a1);").else(l,"=",s,"[",o,"]=",t.link(function(r){return q(W,t,e,r,2)}),"(",a,");",l,".call(this,a0,a1);"))}0<Object.keys(e.state).length&&n(t.shared.current,".dirty=true;")}(a,r),a.compile()}}}function N(t,e){for(var r=0;r<t.length;++r)if(t[r]===e)return r;return-1}var j=function(t,e){for(var r=Object.keys(e),n=0;n<r.length;++n)t[r[n]]=e[r[n]];return t},V=0,U={DynamicVariable:t,define:function(r,n){return new t(r,e(n+""))},isDynamic:function(e){return"function"==typeof e&&!e._reglType||e instanceof t},unbox:function(e,r){return"function"==typeof e?new t(0,e):e},accessor:e},q={next:"function"==typeof requestAnimationFrame?function(t){return requestAnimationFrame(t)}:function(t){return setTimeout(t,16)},cancel:"function"==typeof cancelAnimationFrame?function(t){return cancelAnimationFrame(t)}:clearTimeout},H="undefined"!=typeof performance&&performance.now?function(){return performance.now()}:function(){return+new Date},G=s();G.zero=s();var W=function(t,e){var r=1;e.ext_texture_filter_anisotropic&&(r=t.getParameter(34047));var n=1,i=1;e.webgl_draw_buffers&&(n=t.getParameter(34852),i=t.getParameter(36063));var a=!!e.oes_texture_float;if(a){a=t.createTexture(),t.bindTexture(3553,a),t.texImage2D(3553,0,6408,1,1,0,6408,5126,null);var o=t.createFramebuffer();if(t.bindFramebuffer(36160,o),t.framebufferTexture2D(36160,36064,3553,a,0),t.bindTexture(3553,null),36053!==t.checkFramebufferStatus(36160))a=!1;else{t.viewport(0,0,1,1),t.clearColor(1,0,0,1),t.clear(16384);var s=G.allocType(5126,4);t.readPixels(0,0,1,1,6408,5126,s),t.getError()?a=!1:(t.deleteFramebuffer(o),t.deleteTexture(a),a=1===s[0]),G.freeType(s)}}return s=!0,s=t.createTexture(),o=G.allocType(5121,36),t.activeTexture(33984),t.bindTexture(34067,s),t.texImage2D(34069,0,6408,3,3,0,6408,5121,o),G.freeType(o),t.bindTexture(34067,null),t.deleteTexture(s),s=!t.getError(),{colorBits:[t.getParameter(3410),t.getParameter(3411),t.getParameter(3412),t.getParameter(3413)],depthBits:t.getParameter(3414),stencilBits:t.getParameter(3415),subpixelBits:t.getParameter(3408),extensions:Object.keys(e).filter(function(t){return!!e[t]}),maxAnisotropic:r,maxDrawbuffers:n,maxColorAttachments:i,pointSizeDims:t.getParameter(33901),lineWidthDims:t.getParameter(33902),maxViewportDims:t.getParameter(3386),maxCombinedTextureUnits:t.getParameter(35661),maxCubeMapSize:t.getParameter(34076),maxRenderbufferSize:t.getParameter(34024),maxTextureUnits:t.getParameter(34930),maxTextureSize:t.getParameter(3379),maxAttributes:t.getParameter(34921),maxVertexUniforms:t.getParameter(36347),maxVertexTextureUnits:t.getParameter(35660),maxVaryingVectors:t.getParameter(36348),maxFragmentUniforms:t.getParameter(36349),glsl:t.getParameter(35724),renderer:t.getParameter(7937),vendor:t.getParameter(7936),version:t.getParameter(7938),readFloat:a,npotTextureCube:s}},Y=function(t){return t instanceof Uint8Array||t instanceof Uint16Array||t instanceof Uint32Array||t instanceof Int8Array||t instanceof Int16Array||t instanceof Int32Array||t instanceof Float32Array||t instanceof Float64Array||t instanceof Uint8ClampedArray},X=function(t){return Object.keys(t).map(function(e){return t[e]})},Z={shape:function(t){for(var e=[];t.length;t=t[0])e.push(t.length);return e},flatten:function(t,e,r,n){var i=1;if(e.length)for(var a=0;a<e.length;++a)i*=e[a];else i=0;switch(r=n||G.allocType(r,i),e.length){case 0:break;case 1:for(n=e[0],e=0;e<n;++e)r[e]=t[e];break;case 2:for(n=e[0],e=e[1],a=i=0;a<n;++a)for(var o=t[a],s=0;s<e;++s)r[i++]=o[s];break;case 3:c(t,e[0],e[1],e[2],r,0);break;default:!function t(e,r,n,i,a){for(var o=1,s=n+1;s<r.length;++s)o*=r[s];var l=r[n];if(4==r.length-n){var u=r[n+1],h=r[n+2];for(r=r[n+3],s=0;s<l;++s)c(e[s],u,h,r,i,a),a+=o}else for(s=0;s<l;++s)t(e[s],r,n+1,i,a),a+=o}(t,e,0,r,0)}return r}},$={"[object Int8Array]":5120,"[object Int16Array]":5122,"[object Int32Array]":5124,"[object Uint8Array]":5121,"[object Uint8ClampedArray]":5121,"[object Uint16Array]":5123,"[object Uint32Array]":5125,"[object Float32Array]":5126,"[object Float64Array]":5121,"[object ArrayBuffer]":5121},J={int8:5120,int16:5122,int32:5124,uint8:5121,uint16:5123,uint32:5125,float:5126,float32:5126},K={dynamic:35048,stream:35040,static:35044},Q=Z.flatten,tt=Z.shape,et=[];et[5120]=1,et[5122]=2,et[5124]=4,et[5121]=1,et[5123]=2,et[5125]=4,et[5126]=4;var rt={points:0,point:0,lines:1,line:1,triangles:4,triangle:4,"line loop":2,"line strip":3,"triangle strip":5,"triangle fan":6},nt=new Float32Array(1),it=new Uint32Array(nt.buffer),at=[9984,9986,9985,9987],ot=[0,6409,6410,6407,6408],st={};st[6409]=st[6406]=st[6402]=1,st[34041]=st[6410]=2,st[6407]=st[35904]=3,st[6408]=st[35906]=4;var lt=v("HTMLCanvasElement"),ct=v("CanvasRenderingContext2D"),ut=v("ImageBitmap"),ht=v("HTMLImageElement"),ft=v("HTMLVideoElement"),pt=Object.keys($).concat([lt,ct,ut,ht,ft]),dt=[];dt[5121]=1,dt[5126]=4,dt[36193]=2,dt[5123]=2,dt[5125]=4;var gt=[];gt[32854]=2,gt[32855]=2,gt[36194]=2,gt[34041]=4,gt[33776]=.5,gt[33777]=.5,gt[33778]=1,gt[33779]=1,gt[35986]=.5,gt[35987]=1,gt[34798]=1,gt[35840]=.5,gt[35841]=.25,gt[35842]=.5,gt[35843]=.25,gt[36196]=.5;var mt=[];mt[32854]=2,mt[32855]=2,mt[36194]=2,mt[33189]=2,mt[36168]=1,mt[34041]=4,mt[35907]=4,mt[34836]=16,mt[34842]=8,mt[34843]=6;var vt=function(t,e,r,n,i){function a(t){this.id=c++,this.refCount=1,this.renderbuffer=t,this.format=32854,this.height=this.width=0,i.profile&&(this.stats={size:0})}function o(e){var r=e.renderbuffer;t.bindRenderbuffer(36161,null),t.deleteRenderbuffer(r),e.renderbuffer=null,e.refCount=0,delete u[e.id],n.renderbufferCount--}var s={rgba4:32854,rgb565:36194,"rgb5 a1":32855,depth:33189,stencil:36168,"depth stencil":34041};e.ext_srgb&&(s.srgba=35907),e.ext_color_buffer_half_float&&(s.rgba16f=34842,s.rgb16f=34843),e.webgl_color_buffer_float&&(s.rgba32f=34836);var l=[];Object.keys(s).forEach(function(t){l[s[t]]=t});var c=0,u={};return a.prototype.decRef=function(){0>=--this.refCount&&o(this)},i.profile&&(n.getTotalRenderbufferSize=function(){var t=0;return Object.keys(u).forEach(function(e){t+=u[e].stats.size}),t}),{create:function(e,r){function o(e,r){var n=0,a=0,u=32854;if("object"==typeof e&&e?("shape"in e?(n=0|(a=e.shape)[0],a=0|a[1]):("radius"in e&&(n=a=0|e.radius),"width"in e&&(n=0|e.width),"height"in e&&(a=0|e.height)),"format"in e&&(u=s[e.format])):"number"==typeof e?(n=0|e,a="number"==typeof r?0|r:n):e||(n=a=1),n!==c.width||a!==c.height||u!==c.format)return o.width=c.width=n,o.height=c.height=a,c.format=u,t.bindRenderbuffer(36161,c.renderbuffer),t.renderbufferStorage(36161,u,n,a),i.profile&&(c.stats.size=mt[c.format]*c.width*c.height),o.format=l[c.format],o}var c=new a(t.createRenderbuffer());return u[c.id]=c,n.renderbufferCount++,o(e,r),o.resize=function(e,r){var n=0|e,a=0|r||n;return n===c.width&&a===c.height?o:(o.width=c.width=n,o.height=c.height=a,t.bindRenderbuffer(36161,c.renderbuffer),t.renderbufferStorage(36161,c.format,n,a),i.profile&&(c.stats.size=mt[c.format]*c.width*c.height),o)},o._reglType="renderbuffer",o._renderbuffer=c,i.profile&&(o.stats=c.stats),o.destroy=function(){c.decRef()},o},clear:function(){X(u).forEach(o)},restore:function(){X(u).forEach(function(e){e.renderbuffer=t.createRenderbuffer(),t.bindRenderbuffer(36161,e.renderbuffer),t.renderbufferStorage(36161,e.format,e.width,e.height)}),t.bindRenderbuffer(36161,null)}}},yt=[];yt[6408]=4,yt[6407]=3;var xt=[];xt[5121]=1,xt[5126]=4,xt[36193]=2;var bt=["x","y","z","w"],_t="blend.func blend.equation stencil.func stencil.opFront stencil.opBack sample.coverage viewport scissor.box polygonOffset.offset".split(" "),wt={0:0,1:1,zero:0,one:1,"src color":768,"one minus src color":769,"src alpha":770,"one minus src alpha":771,"dst color":774,"one minus dst color":775,"dst alpha":772,"one minus dst alpha":773,"constant color":32769,"one minus constant color":32770,"constant alpha":32771,"one minus constant alpha":32772,"src alpha saturate":776},kt={never:512,less:513,"<":513,equal:514,"=":514,"==":514,"===":514,lequal:515,"<=":515,greater:516,">":516,notequal:517,"!=":517,"!==":517,gequal:518,">=":518,always:519},Mt={0:0,zero:0,keep:7680,replace:7681,increment:7682,decrement:7683,"increment wrap":34055,"decrement wrap":34056,invert:5386},At={cw:2304,ccw:2305},Tt=new O(!1,!1,!1,function(){});return function(t){function e(){if(0===Z.length)w&&w.update(),Q=null;else{Q=q.next(e),h();for(var t=Z.length-1;0<=t;--t){var r=Z[t];r&&r(z,null,0)}m.flush(),w&&w.update()}}function r(){!Q&&0<Z.length&&(Q=q.next(e))}function n(){Q&&(q.cancel(e),Q=null)}function a(t){t.preventDefault(),n(),$.forEach(function(t){t()})}function o(t){m.getError(),y.restore(),D.restore(),I.restore(),R.restore(),B.restore(),V.restore(),w&&w.restore(),G.procs.refresh(),r(),J.forEach(function(t){t()})}function s(t){function e(t){var e={},r={};return Object.keys(t).forEach(function(n){var i=t[n];U.isDynamic(i)?r[n]=U.unbox(i,n):e[n]=i}),{dynamic:r,static:e}}var r=e(t.context||{}),n=e(t.uniforms||{}),i=e(t.attributes||{}),a=e(function(t){function e(t){if(t in r){var e=r[t];delete r[t],Object.keys(e).forEach(function(n){r[t+"."+n]=e[n]})}}var r=j({},t);return delete r.uniforms,delete r.attributes,delete r.context,"stencil"in r&&r.stencil.op&&(r.stencil.opBack=r.stencil.opFront=r.stencil.op,delete r.stencil.op),e("blend"),e("depth"),e("cull"),e("stencil"),e("polygonOffset"),e("scissor"),e("sample"),r}(t));t={gpuTime:0,cpuTime:0,count:0};var o=(r=G.compile(a,i,n,r,t)).draw,s=r.batch,l=r.scope,c=[];return j(function(t,e){var r;if("function"==typeof t)return l.call(this,null,t,0);if("function"==typeof e)if("number"==typeof t)for(r=0;r<t;++r)l.call(this,null,e,r);else{if(!Array.isArray(t))return l.call(this,t,e,0);for(r=0;r<t.length;++r)l.call(this,t[r],e,r)}else if("number"==typeof t){if(0<t)return s.call(this,function(t){for(;c.length<t;)c.push(null);return c}(0|t),0|t)}else{if(!Array.isArray(t))return o.call(this,t);if(t.length)return s.call(this,t,t.length)}},{stats:t})}function l(t,e){var r=0;G.procs.poll();var n=e.color;n&&(m.clearColor(+n[0]||0,+n[1]||0,+n[2]||0,+n[3]||0),r|=16384),"depth"in e&&(m.clearDepth(+e.depth),r|=256),"stencil"in e&&(m.clearStencil(0|e.stencil),r|=1024),m.clear(r)}function c(t){return Z.push(t),r(),{cancel:function(){var e=N(Z,t);Z[e]=function t(){var e=N(Z,t);Z[e]=Z[Z.length-1],--Z.length,0>=Z.length&&n()}}}}function u(){var t=Y.viewport,e=Y.scissor_box;t[0]=t[1]=e[0]=e[1]=0,z.viewportWidth=z.framebufferWidth=z.drawingBufferWidth=t[2]=e[2]=m.drawingBufferWidth,z.viewportHeight=z.framebufferHeight=z.drawingBufferHeight=t[3]=e[3]=m.drawingBufferHeight}function h(){z.tick+=1,z.time=g(),u(),G.procs.poll()}function f(){u(),G.procs.refresh(),w&&w.update()}function g(){return(H()-k)/1e3}if(!(t=i(t)))return null;var m=t.gl,v=m.getContextAttributes();m.isContextLost();var y=function(t,e){function r(e){var r;e=e.toLowerCase();try{r=n[e]=t.getExtension(e)}catch(t){}return!!r}for(var n={},i=0;i<e.extensions.length;++i){var a=e.extensions[i];if(!r(a))return e.onDestroy(),e.onDone('"'+a+'" extension is not supported by the current WebGL context, try upgrading your system or a different browser'),null}return e.optionalExtensions.forEach(r),{extensions:n,restore:function(){Object.keys(n).forEach(function(t){if(!r(t))throw Error("(regl): error restoring extension "+t)})}}}(m,t);if(!y)return null;var x=function(){var t={"":0},e=[""];return{id:function(r){var n=t[r];return n||(n=t[r]=e.length,e.push(r),n)},str:function(t){return e[t]}}}(),b={bufferCount:0,elementsCount:0,framebufferCount:0,shaderCount:0,textureCount:0,cubeCount:0,renderbufferCount:0,maxTextureUnits:0},_=y.extensions,w=function(t,e){function r(){this.endQueryIndex=this.startQueryIndex=-1,this.sum=0,this.stats=null}function n(t,e,n){var i=s.pop()||new r;i.startQueryIndex=t,i.endQueryIndex=e,i.sum=0,i.stats=n,l.push(i)}var i=e.ext_disjoint_timer_query;if(!i)return null;var a=[],o=[],s=[],l=[],c=[],u=[];return{beginQuery:function(t){var e=a.pop()||i.createQueryEXT();i.beginQueryEXT(35007,e),o.push(e),n(o.length-1,o.length,t)},endQuery:function(){i.endQueryEXT(35007)},pushScopeStats:n,update:function(){var t,e;if(0!==(t=o.length)){u.length=Math.max(u.length,t+1),c.length=Math.max(c.length,t+1),c[0]=0;var r=u[0]=0;for(e=t=0;e<o.length;++e){var n=o[e];i.getQueryObjectEXT(n,34919)?(r+=i.getQueryObjectEXT(n,34918),a.push(n)):o[t++]=n,c[e+1]=r,u[e+1]=t}for(o.length=t,e=t=0;e<l.length;++e){var h=(r=l[e]).startQueryIndex;n=r.endQueryIndex,r.sum+=c[n]-c[h],h=u[h],(n=u[n])===h?(r.stats.gpuTime+=r.sum/1e6,s.push(r)):(r.startQueryIndex=h,r.endQueryIndex=n,l[t++]=r)}l.length=t}},getNumPendingQueries:function(){return o.length},clear:function(){a.push.apply(a,o);for(var t=0;t<a.length;t++)i.deleteQueryEXT(a[t]);o.length=0,a.length=0},restore:function(){o.length=0,a.length=0}}}(0,_),k=H(),C=m.drawingBufferWidth,L=m.drawingBufferHeight,z={tick:0,time:0,viewportWidth:C,viewportHeight:L,framebufferWidth:C,framebufferHeight:L,drawingBufferWidth:C,drawingBufferHeight:L,pixelRatio:t.pixelRatio},P=W(m,_),I=(C=function(t,e,r,n){for(t=r.maxAttributes,e=Array(t),r=0;r<t;++r)e[r]=new T;return{Record:T,scope:{},state:e}}(m,_,P),p(m,b,t,C)),O=d(m,_,I,b),D=S(m,x,b,t),R=M(m,_,P,function(){G.procs.poll()},z,b,t),B=vt(m,_,0,b,t),V=A(m,_,P,R,B,b),G=F(m,x,_,P,I,O,0,V,{},C,D,{elements:null,primitive:4,count:-1,offset:0,instances:-1},z,w,t),Y=(x=E(m,V,G.procs.poll,z),G.next),X=m.canvas,Z=[],$=[],J=[],K=[t.onDestroy],Q=null;X&&(X.addEventListener("webglcontextlost",a,!1),X.addEventListener("webglcontextrestored",o,!1));var tt=V.setFBO=s({framebuffer:U.define.call(null,1,"framebuffer")});return f(),v=j(s,{clear:function(t){if("framebuffer"in t)if(t.framebuffer&&"framebufferCube"===t.framebuffer_reglType)for(var e=0;6>e;++e)tt(j({framebuffer:t.framebuffer.faces[e]},t),l);else tt(t,l);else l(0,t)},prop:U.define.bind(null,1),context:U.define.bind(null,2),this:U.define.bind(null,3),draw:s({}),buffer:function(t){return I.create(t,34962,!1,!1)},elements:function(t){return O.create(t,!1)},texture:R.create2D,cube:R.createCube,renderbuffer:B.create,framebuffer:V.create,framebufferCube:V.createCube,attributes:v,frame:c,on:function(t,e){var r;switch(t){case"frame":return c(e);case"lost":r=$;break;case"restore":r=J;break;case"destroy":r=K}return r.push(e),{cancel:function(){for(var t=0;t<r.length;++t)if(r[t]===e){r[t]=r[r.length-1],r.pop();break}}}},limits:P,hasExtension:function(t){return 0<=P.extensions.indexOf(t.toLowerCase())},read:x,destroy:function(){Z.length=0,n(),X&&(X.removeEventListener("webglcontextlost",a),X.removeEventListener("webglcontextrestored",o)),D.clear(),V.clear(),B.clear(),R.clear(),O.clear(),I.clear(),w&&w.clear(),K.forEach(function(t){t()})},_gl:m,_refresh:f,poll:function(){h(),w&&w.update()},now:g,stats:b}),t.onDone(null,v),v}},"object"==typeof r&&"undefined"!=typeof e?e.exports=i():n.createREGL=i()},{}],464:[function(t,e,r){"use strict";var n,i="";e.exports=function(t,e){if("string"!=typeof t)throw new TypeError("expected a string");if(1===e)return t;if(2===e)return t+t;var r=t.length*e;if(n!==t||"undefined"==typeof n)n=t,i="";else if(i.length>=r)return i.substr(0,r);for(;r>i.length&&e>1;)1&e&&(i+=t),e>>=1,t+=t;return i=(i+=t).substr(0,r)}},{}],465:[function(t,e,r){(function(t){e.exports=t.performance&&t.performance.now?function(){return performance.now()}:Date.now||function(){return+new Date}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],466:[function(t,e,r){"use strict";e.exports=function(t){for(var e=t.length,r=t[t.length-1],n=e,i=e-2;i>=0;--i){var a=r,o=t[i],s=(r=a+o)-a,l=o-s;l&&(t[--n]=r,r=l)}for(var c=0,i=n;i<e;++i){var a=t[i],o=r,s=(r=a+o)-a,l=o-s;l&&(t[c++]=l)}return t[c++]=r,t.length=c,t}},{}],467:[function(t,e,r){"use strict";var n=t("two-product"),i=t("robust-sum"),a=t("robust-scale"),o=t("robust-compress"),s=6;function l(t,e){for(var r=new Array(t.length-1),n=1;n<t.length;++n)for(var i=r[n-1]=new Array(t.length-1),a=0,o=0;a<t.length;++a)a!==e&&(i[o++]=t[n][a]);return r}function c(t){if(2===t.length)return["sum(prod(",t[0][0],",",t[1][1],"),prod(-",t[0][1],",",t[1][0],"))"].join("");for(var e=[],r=0;r<t.length;++r)e.push(["scale(",c(l(t,r)),",",(n=r,1&n?"-":""),t[0][r],")"].join(""));return function t(e){if(1===e.length)return e[0];if(2===e.length)return["sum(",e[0],",",e[1],")"].join("");var r=e.length>>1;return["sum(",t(e.slice(0,r)),",",t(e.slice(r)),")"].join("")}(e);var n}function u(t){return new Function("sum","scale","prod","compress",["function robustDeterminant",t,"(m){return compress(",c(function(t){for(var e=new Array(t),r=0;r<t;++r){e[r]=new Array(t);for(var n=0;n<t;++n)e[r][n]=["m[",r,"][",n,"]"].join("")}return e}(t)),")};return robustDeterminant",t].join(""))(i,a,n,o)}var h=[function(){return[0]},function(t){return[t[0][0]]}];!function(){for(;h.length<s;)h.push(u(h.length));for(var t=[],r=["function robustDeterminant(m){switch(m.length){"],n=0;n<s;++n)t.push("det"+n),r.push("case ",n,":return det",n,"(m);");r.push("}var det=CACHE[m.length];if(!det)det=CACHE[m.length]=gen(m.length);return det(m);}return robustDeterminant"),t.push("CACHE","gen",r.join(""));var i=Function.apply(void 0,t);for(e.exports=i.apply(void 0,h.concat([h,u])),n=0;n<h.length;++n)e.exports[n]=h[n]}()},{"robust-compress":466,"robust-scale":473,"robust-sum":476,"two-product":505}],468:[function(t,e,r){"use strict";var n=t("two-product"),i=t("robust-sum");e.exports=function(t,e){for(var r=n(t[0],e[0]),a=1;a<t.length;++a)r=i(r,n(t[a],e[a]));return r}},{"robust-sum":476,"two-product":505}],469:[function(t,e,r){"use strict";var n=t("two-product"),i=t("robust-sum"),a=t("robust-subtract"),o=t("robust-scale"),s=6;function l(t,e){for(var r=new Array(t.length-1),n=1;n<t.length;++n)for(var i=r[n-1]=new Array(t.length-1),a=0,o=0;a<t.length;++a)a!==e&&(i[o++]=t[n][a]);return r}function c(t){if(1===t.length)return t[0];if(2===t.length)return["sum(",t[0],",",t[1],")"].join("");var e=t.length>>1;return["sum(",c(t.slice(0,e)),",",c(t.slice(e)),")"].join("")}function u(t,e){if("m"===t.charAt(0)){if("w"===e.charAt(0)){var r=t.split("[");return["w",e.substr(1),"m",r[0].substr(1)].join("")}return["prod(",t,",",e,")"].join("")}return u(e,t)}function h(t){if(2===t.length)return[["diff(",u(t[0][0],t[1][1]),",",u(t[1][0],t[0][1]),")"].join("")];for(var e=[],r=0;r<t.length;++r)e.push(["scale(",c(h(l(t,r))),",",(n=r,!0&n?"-":""),t[0][r],")"].join(""));return e;var n}function f(t,e){for(var r=[],n=0;n<e-2;++n)r.push(["prod(m",t,"[",n,"],m",t,"[",n,"])"].join(""));return c(r)}function p(t){for(var e=[],r=[],s=function(t){for(var e=new Array(t),r=0;r<t;++r){e[r]=new Array(t);for(var n=0;n<t;++n)e[r][n]=["m",n,"[",t-r-2,"]"].join("")}return e}(t),u=0;u<t;++u)s[0][u]="1",s[t-1][u]="w"+u;for(u=0;u<t;++u)0==(1&u)?e.push.apply(e,h(l(s,u))):r.push.apply(r,h(l(s,u)));var p=c(e),d=c(r),g="exactInSphere"+t,m=[];for(u=0;u<t;++u)m.push("m"+u);var v=["function ",g,"(",m.join(),"){"];for(u=0;u<t;++u){v.push("var w",u,"=",f(u,t),";");for(var y=0;y<t;++y)y!==u&&v.push("var w",u,"m",y,"=scale(w",u,",m",y,"[0]);")}return v.push("var p=",p,",n=",d,",d=diff(p,n);return d[d.length-1];}return ",g),new Function("sum","diff","prod","scale",v.join(""))(i,a,n,o)}var d=[function(){return 0},function(){return 0},function(){return 0}];!function(){for(;d.length<=s;)d.push(p(d.length));for(var t=[],r=["slow"],n=0;n<=s;++n)t.push("a"+n),r.push("o"+n);var i=["function testInSphere(",t.join(),"){switch(arguments.length){case 0:case 1:return 0;"];for(n=2;n<=s;++n)i.push("case ",n,":return o",n,"(",t.slice(0,n).join(),");");i.push("}var s=new Array(arguments.length);for(var i=0;i<arguments.length;++i){s[i]=arguments[i]};return slow(s);}return testInSphere"),r.push(i.join(""));var a=Function.apply(void 0,r);for(e.exports=a.apply(void 0,[function(t){var e=d[t.length];return e||(e=d[t.length]=p(t.length)),e.apply(void 0,t)}].concat(d)),n=0;n<=s;++n)e.exports[n]=d[n]}()},{"robust-scale":473,"robust-subtract":475,"robust-sum":476,"two-product":505}],470:[function(t,e,r){"use strict";var n=t("robust-determinant"),i=6;function a(t){for(var e="robustLinearSolve"+t+"d",r=["function ",e,"(A,b){return ["],i=0;i<t;++i){r.push("det([");for(var a=0;a<t;++a){a>0&&r.push(","),r.push("[");for(var o=0;o<t;++o)o>0&&r.push(","),o===i?r.push("+b[",a,"]"):r.push("+A[",a,"][",o,"]");r.push("]")}r.push("]),")}r.push("det(A)]}return ",e);var s=new Function("det",r.join(""));return s(t<6?n[t]:n)}var o=[function(){return[0]},function(t,e){return[[e[0]],[t[0][0]]]}];!function(){for(;o.length<i;)o.push(a(o.length));for(var t=[],r=["function dispatchLinearSolve(A,b){switch(A.length){"],n=0;n<i;++n)t.push("s"+n),r.push("case ",n,":return s",n,"(A,b);");r.push("}var s=CACHE[A.length];if(!s)s=CACHE[A.length]=g(A.length);return s(A,b)}return dispatchLinearSolve"),t.push("CACHE","g",r.join(""));var s=Function.apply(void 0,t);for(e.exports=s.apply(void 0,o.concat([o,a])),n=0;n<i;++n)e.exports[n]=o[n]}()},{"robust-determinant":467}],471:[function(t,e,r){"use strict";var n=t("two-product"),i=t("robust-sum"),a=t("robust-scale"),o=t("robust-subtract"),s=5;function l(t,e){for(var r=new Array(t.length-1),n=1;n<t.length;++n)for(var i=r[n-1]=new Array(t.length-1),a=0,o=0;a<t.length;++a)a!==e&&(i[o++]=t[n][a]);return r}function c(t){if(1===t.length)return t[0];if(2===t.length)return["sum(",t[0],",",t[1],")"].join("");var e=t.length>>1;return["sum(",c(t.slice(0,e)),",",c(t.slice(e)),")"].join("")}function u(t){if(2===t.length)return[["sum(prod(",t[0][0],",",t[1][1],"),prod(-",t[0][1],",",t[1][0],"))"].join("")];for(var e=[],r=0;r<t.length;++r)e.push(["scale(",c(u(l(t,r))),",",(n=r,1&n?"-":""),t[0][r],")"].join(""));return e;var n}function h(t){for(var e=[],r=[],s=function(t){for(var e=new Array(t),r=0;r<t;++r){e[r]=new Array(t);for(var n=0;n<t;++n)e[r][n]=["m",n,"[",t-r-1,"]"].join("")}return e}(t),h=[],f=0;f<t;++f)0==(1&f)?e.push.apply(e,u(l(s,f))):r.push.apply(r,u(l(s,f))),h.push("m"+f);var p=c(e),d=c(r),g="orientation"+t+"Exact",m=["function ",g,"(",h.join(),"){var p=",p,",n=",d,",d=sub(p,n);return d[d.length-1];};return ",g].join("");return new Function("sum","prod","scale","sub",m)(i,n,a,o)}var f=h(3),p=h(4),d=[function(){return 0},function(){return 0},function(t,e){return e[0]-t[0]},function(t,e,r){var n,i=(t[1]-r[1])*(e[0]-r[0]),a=(t[0]-r[0])*(e[1]-r[1]),o=i-a;if(i>0){if(a<=0)return o;n=i+a}else{if(!(i<0))return o;if(a>=0)return o;n=-(i+a)}var s=3.3306690738754716e-16*n;return o>=s||o<=-s?o:f(t,e,r)},function(t,e,r,n){var i=t[0]-n[0],a=e[0]-n[0],o=r[0]-n[0],s=t[1]-n[1],l=e[1]-n[1],c=r[1]-n[1],u=t[2]-n[2],h=e[2]-n[2],f=r[2]-n[2],d=a*c,g=o*l,m=o*s,v=i*c,y=i*l,x=a*s,b=u*(d-g)+h*(m-v)+f*(y-x),_=7.771561172376103e-16*((Math.abs(d)+Math.abs(g))*Math.abs(u)+(Math.abs(m)+Math.abs(v))*Math.abs(h)+(Math.abs(y)+Math.abs(x))*Math.abs(f));return b>_||-b>_?b:p(t,e,r,n)}];!function(){for(;d.length<=s;)d.push(h(d.length));for(var t=[],r=["slow"],n=0;n<=s;++n)t.push("a"+n),r.push("o"+n);var i=["function getOrientation(",t.join(),"){switch(arguments.length){case 0:case 1:return 0;"];for(n=2;n<=s;++n)i.push("case ",n,":return o",n,"(",t.slice(0,n).join(),");");i.push("}var s=new Array(arguments.length);for(var i=0;i<arguments.length;++i){s[i]=arguments[i]};return slow(s);}return getOrientation"),r.push(i.join(""));var a=Function.apply(void 0,r);for(e.exports=a.apply(void 0,[function(t){var e=d[t.length];return e||(e=d[t.length]=h(t.length)),e.apply(void 0,t)}].concat(d)),n=0;n<=s;++n)e.exports[n]=d[n]}()},{"robust-scale":473,"robust-subtract":475,"robust-sum":476,"two-product":505}],472:[function(t,e,r){"use strict";var n=t("robust-sum"),i=t("robust-scale");e.exports=function(t,e){if(1===t.length)return i(e,t[0]);if(1===e.length)return i(t,e[0]);if(0===t.length||0===e.length)return[0];var r=[0];if(t.length<e.length)for(var a=0;a<t.length;++a)r=n(r,i(e,t[a]));else for(var a=0;a<e.length;++a)r=n(r,i(t,e[a]));return r}},{"robust-scale":473,"robust-sum":476}],473:[function(t,e,r){"use strict";var n=t("two-product"),i=t("two-sum");e.exports=function(t,e){var r=t.length;if(1===r){var a=n(t[0],e);return a[0]?a:[a[1]]}var o=new Array(2*r),s=[.1,.1],l=[.1,.1],c=0;n(t[0],e,s),s[0]&&(o[c++]=s[0]);for(var u=1;u<r;++u){n(t[u],e,l);var h=s[1];i(h,l[0],s),s[0]&&(o[c++]=s[0]);var f=l[1],p=s[1],d=f+p,g=d-f,m=p-g;s[1]=d,m&&(o[c++]=m)}s[1]&&(o[c++]=s[1]);0===c&&(o[c++]=0);return o.length=c,o}},{"two-product":505,"two-sum":506}],474:[function(t,e,r){"use strict";e.exports=function(t,e,r,i){var a=n(t,r,i),o=n(e,r,i);if(a>0&&o>0||a<0&&o<0)return!1;var s=n(r,t,e),l=n(i,t,e);if(s>0&&l>0||s<0&&l<0)return!1;if(0===a&&0===o&&0===s&&0===l)return function(t,e,r,n){for(var i=0;i<2;++i){var a=t[i],o=e[i],s=Math.min(a,o),l=Math.max(a,o),c=r[i],u=n[i],h=Math.min(c,u),f=Math.max(c,u);if(f<s||l<h)return!1}return!0}(t,e,r,i);return!0};var n=t("robust-orientation")[3]},{"robust-orientation":471}],475:[function(t,e,r){"use strict";e.exports=function(t,e){var r=0|t.length,n=0|e.length;if(1===r&&1===n)return function(t,e){var r=t+e,n=r-t,i=t-(r-n)+(e-n);if(i)return[i,r];return[r]}(t[0],-e[0]);var i,a,o=new Array(r+n),s=0,l=0,c=0,u=Math.abs,h=t[l],f=u(h),p=-e[c],d=u(p);f<d?(a=h,(l+=1)<r&&(h=t[l],f=u(h))):(a=p,(c+=1)<n&&(p=-e[c],d=u(p)));l<r&&f<d||c>=n?(i=h,(l+=1)<r&&(h=t[l],f=u(h))):(i=p,(c+=1)<n&&(p=-e[c],d=u(p)));var g,m,v=i+a,y=v-i,x=a-y,b=x,_=v;for(;l<r&&c<n;)f<d?(i=h,(l+=1)<r&&(h=t[l],f=u(h))):(i=p,(c+=1)<n&&(p=-e[c],d=u(p))),(x=(a=b)-(y=(v=i+a)-i))&&(o[s++]=x),b=_-((g=_+v)-(m=g-_))+(v-m),_=g;for(;l<r;)(x=(a=b)-(y=(v=(i=h)+a)-i))&&(o[s++]=x),b=_-((g=_+v)-(m=g-_))+(v-m),_=g,(l+=1)<r&&(h=t[l]);for(;c<n;)(x=(a=b)-(y=(v=(i=p)+a)-i))&&(o[s++]=x),b=_-((g=_+v)-(m=g-_))+(v-m),_=g,(c+=1)<n&&(p=-e[c]);b&&(o[s++]=b);_&&(o[s++]=_);s||(o[s++]=0);return o.length=s,o}},{}],476:[function(t,e,r){"use strict";e.exports=function(t,e){var r=0|t.length,n=0|e.length;if(1===r&&1===n)return function(t,e){var r=t+e,n=r-t,i=t-(r-n)+(e-n);if(i)return[i,r];return[r]}(t[0],e[0]);var i,a,o=new Array(r+n),s=0,l=0,c=0,u=Math.abs,h=t[l],f=u(h),p=e[c],d=u(p);f<d?(a=h,(l+=1)<r&&(h=t[l],f=u(h))):(a=p,(c+=1)<n&&(p=e[c],d=u(p)));l<r&&f<d||c>=n?(i=h,(l+=1)<r&&(h=t[l],f=u(h))):(i=p,(c+=1)<n&&(p=e[c],d=u(p)));var g,m,v=i+a,y=v-i,x=a-y,b=x,_=v;for(;l<r&&c<n;)f<d?(i=h,(l+=1)<r&&(h=t[l],f=u(h))):(i=p,(c+=1)<n&&(p=e[c],d=u(p))),(x=(a=b)-(y=(v=i+a)-i))&&(o[s++]=x),b=_-((g=_+v)-(m=g-_))+(v-m),_=g;for(;l<r;)(x=(a=b)-(y=(v=(i=h)+a)-i))&&(o[s++]=x),b=_-((g=_+v)-(m=g-_))+(v-m),_=g,(l+=1)<r&&(h=t[l]);for(;c<n;)(x=(a=b)-(y=(v=(i=p)+a)-i))&&(o[s++]=x),b=_-((g=_+v)-(m=g-_))+(v-m),_=g,(c+=1)<n&&(p=e[c]);b&&(o[s++]=b);_&&(o[s++]=_);s||(o[s++]=0);return o.length=s,o}},{}],477:[function(t,e,r){"use strict";e.exports=function(t){return t<0?-1:t>0?1:0}},{}],478:[function(t,e,r){"use strict";e.exports=function(t){return i(n(t))};var n=t("boundary-cells"),i=t("reduce-simplicial-complex")},{"boundary-cells":83,"reduce-simplicial-complex":456}],479:[function(t,e,r){"use strict";e.exports=function(t,e,r,s){r=r||0,"undefined"==typeof s&&(s=function(t){for(var e=t.length,r=0,n=0;n<e;++n)r=0|Math.max(r,t[n].length);return r-1}(t));if(0===t.length||s<1)return{cells:[],vertexIds:[],vertexWeights:[]};var l=function(t,e){for(var r=t.length,n=i.mallocUint8(r),a=0;a<r;++a)n[a]=t[a]<e|0;return n}(e,+r),c=function(t,e){for(var r=t.length,o=e*(e+1)/2*r|0,s=i.mallocUint32(2*o),l=0,c=0;c<r;++c)for(var u=t[c],e=u.length,h=0;h<e;++h)for(var f=0;f<h;++f){var p=u[f],d=u[h];s[l++]=0|Math.min(p,d),s[l++]=0|Math.max(p,d)}a(n(s,[l/2|0,2]));for(var g=2,c=2;c<l;c+=2)s[c-2]===s[c]&&s[c-1]===s[c+1]||(s[g++]=s[c],s[g++]=s[c+1]);return n(s,[g/2|0,2])}(t,s),u=function(t,e,r,a){for(var o=t.data,s=t.shape[0],l=i.mallocDouble(s),c=0,u=0;u<s;++u){var h=o[2*u],f=o[2*u+1];if(r[h]!==r[f]){var p=e[h],d=e[f];o[2*c]=h,o[2*c+1]=f,l[c++]=(d-a)/(d-p)}}return t.shape[0]=c,n(l,[c])}(c,e,l,+r),h=function(t,e){var r=i.mallocInt32(2*e),n=t.shape[0],a=t.data;r[0]=0;for(var o=0,s=0;s<n;++s){var l=a[2*s];if(l!==o){for(r[2*o+1]=s;++o<l;)r[2*o]=s,r[2*o+1]=s;r[2*o]=s}}r[2*o+1]=n;for(;++o<e;)r[2*o]=r[2*o+1]=n;return r}(c,0|e.length),f=o(s)(t,c.data,h,l),p=function(t){for(var e=0|t.shape[0],r=t.data,n=new Array(e),i=0;i<e;++i)n[i]=[r[2*i],r[2*i+1]];return n}(c),d=[].slice.call(u.data,0,u.shape[0]);return i.free(l),i.free(c.data),i.free(u.data),i.free(h),{cells:f,vertexIds:p,vertexWeights:d}};var n=t("ndarray"),i=t("typedarray-pool"),a=t("ndarray-sort"),o=t("./lib/codegen")},{"./lib/codegen":480,ndarray:417,"ndarray-sort":415,"typedarray-pool":507}],480:[function(t,e,r){"use strict";e.exports=function(t){var e=a[t];e||(e=a[t]=function(t){var e=0,r=new Array(t+1);r[0]=[[]];for(var a=1;a<=t;++a)for(var o=r[a]=i(a),s=0;s<o.length;++s)e=Math.max(e,o[a].length);var l=["function B(C,E,i,j){","var a=Math.min(i,j)|0,b=Math.max(i,j)|0,l=C[2*a],h=C[2*a+1];","while(l<h){","var m=(l+h)>>1,v=E[2*m+1];","if(v===b){return m}","if(b<v){h=m}else{l=m+1}","}","return l;","};","function getContour",t,"d(F,E,C,S){","var n=F.length,R=[];","for(var i=0;i<n;++i){var c=F[i],l=c.length;"];function c(t){if(!(t.length<=0)){l.push("R.push(");for(var e=0;e<t.length;++e){var r=t[e];e>0&&l.push(","),l.push("[");for(var n=0;n<r.length;++n){var i=r[n];n>0&&l.push(","),l.push("B(C,E,c[",i[0],"],c[",i[1],"])")}l.push("]")}l.push(");")}}for(var a=t+1;a>1;--a){a<t+1&&l.push("else "),l.push("if(l===",a,"){");for(var u=[],s=0;s<a;++s)u.push("(S[c["+s+"]]<<"+s+")");l.push("var M=",u.join("+"),";if(M===0||M===",(1<<a)-1,"){continue}switch(M){");for(var o=r[a-1],s=0;s<o.length;++s)l.push("case ",s,":"),c(o[s]),l.push("break;");l.push("}}")}return l.push("}return R;};return getContour",t,"d"),new Function("pool",l.join(""))(n)}(t));return e};var n=t("typedarray-pool"),i=t("marching-simplex-table"),a={}},{"marching-simplex-table":394,"typedarray-pool":507}],481:[function(t,e,r){"use strict";"use restrict";var n=t("bit-twiddle"),i=t("union-find");function a(t,e){var r=t.length,n=t.length-e.length,i=Math.min;if(n)return n;switch(r){case 0:return 0;case 1:return t[0]-e[0];case 2:return(s=t[0]+t[1]-e[0]-e[1])||i(t[0],t[1])-i(e[0],e[1]);case 3:var a=t[0]+t[1],o=e[0]+e[1];if(s=a+t[2]-(o+e[2]))return s;var s,l=i(t[0],t[1]),c=i(e[0],e[1]);return(s=i(l,t[2])-i(c,e[2]))||i(l+t[2],a)-i(c+e[2],o);default:var u=t.slice(0);u.sort();var h=e.slice(0);h.sort();for(var f=0;f<r;++f)if(n=u[f]-h[f])return n;return 0}}function o(t,e){return a(t[0],e[0])}function s(t,e){if(e){for(var r=t.length,n=new Array(r),i=0;i<r;++i)n[i]=[t[i],e[i]];n.sort(o);for(i=0;i<r;++i)t[i]=n[i][0],e[i]=n[i][1];return t}return t.sort(a),t}function l(t){if(0===t.length)return[];for(var e=1,r=t.length,n=1;n<r;++n){var i=t[n];if(a(i,t[n-1])){if(n===e){e++;continue}t[e++]=i}}return t.length=e,t}function c(t,e){for(var r=0,n=t.length-1,i=-1;r<=n;){var o=r+n>>1,s=a(t[o],e);s<=0?(0===s&&(i=o),r=o+1):s>0&&(n=o-1)}return i}function u(t,e){for(var r=new Array(t.length),i=0,o=r.length;i<o;++i)r[i]=[];for(var s=[],l=(i=0,e.length);i<l;++i)for(var u=e[i],h=u.length,f=1,p=1<<h;f<p;++f){s.length=n.popCount(f);for(var d=0,g=0;g<h;++g)f&1<<g&&(s[d++]=u[g]);var m=c(t,s);if(!(m<0))for(;r[m++].push(i),!(m>=t.length||0!==a(t[m],s)););}return r}function h(t,e){if(e<0)return[];for(var r=[],i=(1<<e+1)-1,a=0;a<t.length;++a)for(var o=t[a],l=i;l<1<<o.length;l=n.nextCombination(l)){for(var c=new Array(e+1),u=0,h=0;h<o.length;++h)l&1<<h&&(c[u++]=o[h]);r.push(c)}return s(r)}r.dimension=function(t){for(var e=0,r=Math.max,n=0,i=t.length;n<i;++n)e=r(e,t[n].length);return e-1},r.countVertices=function(t){for(var e=-1,r=Math.max,n=0,i=t.length;n<i;++n)for(var a=t[n],o=0,s=a.length;o<s;++o)e=r(e,a[o]);return e+1},r.cloneCells=function(t){for(var e=new Array(t.length),r=0,n=t.length;r<n;++r)e[r]=t[r].slice(0);return e},r.compareCells=a,r.normalize=s,r.unique=l,r.findCell=c,r.incidence=u,r.dual=function(t,e){if(!e)return u(l(h(t,0)),t);for(var r=new Array(e),n=0;n<e;++n)r[n]=[];n=0;for(var i=t.length;n<i;++n)for(var a=t[n],o=0,s=a.length;o<s;++o)r[a[o]].push(n);return r},r.explode=function(t){for(var e=[],r=0,n=t.length;r<n;++r)for(var i=t[r],a=0|i.length,o=1,l=1<<a;o<l;++o){for(var c=[],u=0;u<a;++u)o>>>u&1&&c.push(i[u]);e.push(c)}return s(e)},r.skeleton=h,r.boundary=function(t){for(var e=[],r=0,n=t.length;r<n;++r)for(var i=t[r],a=0,o=i.length;a<o;++a){for(var l=new Array(i.length-1),c=0,u=0;c<o;++c)c!==a&&(l[u++]=i[c]);e.push(l)}return s(e)},r.connectedComponents=function(t,e){return e?function(t,e){for(var r=new i(e),n=0;n<t.length;++n)for(var a=t[n],o=0;o<a.length;++o)for(var s=o+1;s<a.length;++s)r.link(a[o],a[s]);var l=[],c=r.ranks;for(n=0;n<c.length;++n)c[n]=-1;for(n=0;n<t.length;++n){var u=r.find(t[n][0]);c[u]<0?(c[u]=l.length,l.push([t[n].slice(0)])):l[c[u]].push(t[n].slice(0))}return l}(t,e):function(t){for(var e=l(s(h(t,0))),r=new i(e.length),n=0;n<t.length;++n)for(var a=t[n],o=0;o<a.length;++o)for(var u=c(e,[a[o]]),f=o+1;f<a.length;++f)r.link(u,c(e,[a[f]]));var p=[],d=r.ranks;for(n=0;n<d.length;++n)d[n]=-1;for(n=0;n<t.length;++n){var g=r.find(c(e,[t[n][0]]));d[g]<0?(d[g]=p.length,p.push([t[n].slice(0)])):p[d[g]].push(t[n].slice(0))}return p}(t)}},{"bit-twiddle":80,"union-find":508}],482:[function(t,e,r){arguments[4][80][0].apply(r,arguments)},{dup:80}],483:[function(t,e,r){arguments[4][481][0].apply(r,arguments)},{"bit-twiddle":482,dup:481,"union-find":484}],484:[function(t,e,r){"use strict";"use restrict";function n(t){this.roots=new Array(t),this.ranks=new Array(t);for(var e=0;e<t;++e)this.roots[e]=e,this.ranks[e]=0}e.exports=n,n.prototype.length=function(){return this.roots.length},n.prototype.makeSet=function(){var t=this.roots.length;return this.roots.push(t),this.ranks.push(0),t},n.prototype.find=function(t){for(var e=this.roots;e[t]!==t;){var r=e[t];e[t]=e[r],t=r}return t},n.prototype.link=function(t,e){var r=this.find(t),n=this.find(e);if(r!==n){var i=this.ranks,a=this.roots,o=i[r],s=i[n];o<s?a[r]=n:s<o?a[n]=r:(a[n]=r,++i[r])}}},{}],485:[function(t,e,r){"use strict";e.exports=function(t,e,r){for(var a=e.length,o=t.length,s=new Array(a),l=new Array(a),c=new Array(a),u=new Array(a),h=0;h<a;++h)s[h]=l[h]=-1,c[h]=1/0,u[h]=!1;for(var h=0;h<o;++h){var f=t[h];if(2!==f.length)throw new Error("Input must be a graph");var p=f[1],d=f[0];-1!==l[d]?l[d]=-2:l[d]=p,-1!==s[p]?s[p]=-2:s[p]=d}function g(t){if(u[t])return 1/0;var r,i,a,o,c,h=s[t],f=l[t];return h<0||f<0?1/0:(r=e[t],i=e[h],a=e[f],o=Math.abs(n(r,i,a)),c=Math.sqrt(Math.pow(i[0]-a[0],2)+Math.pow(i[1]-a[1],2)),o/c)}function m(t,e){var r=M[t],n=M[e];M[t]=n,M[e]=r,A[r]=e,A[n]=t}function v(t){return c[M[t]]}function y(t){return 1&t?t-1>>1:(t>>1)-1}function x(t){for(var e=v(t);;){var r=e,n=2*t+1,i=2*(t+1),a=t;if(n<S){var o=v(n);o<r&&(a=n,r=o)}if(i<S){var s=v(i);s<r&&(a=i)}if(a===t)return t;m(t,a),t=a}}function b(t){for(var e=v(t);t>0;){var r=y(t);if(r>=0){var n=v(r);if(e<n){m(t,r),t=r;continue}}return t}}function _(){if(S>0){var t=M[0];return m(0,S-1),S-=1,x(0),t}return-1}function w(t,e){var r=M[t];return c[r]===e?t:(c[r]=-1/0,b(t),_(),c[r]=e,b((S+=1)-1))}function k(t){if(!u[t]){u[t]=!0;var e=s[t],r=l[t];s[r]>=0&&(s[r]=e),l[e]>=0&&(l[e]=r),A[e]>=0&&w(A[e],g(e)),A[r]>=0&&w(A[r],g(r))}}for(var M=[],A=new Array(a),h=0;h<a;++h){var T=c[h]=g(h);T<1/0?(A[h]=M.length,M.push(h)):A[h]=-1}for(var S=M.length,h=S>>1;h>=0;--h)x(h);for(;;){var E=_();if(E<0||c[E]>r)break;k(E)}for(var C=[],h=0;h<a;++h)u[h]||(A[h]=C.length,C.push(e[h].slice()));C.length;function L(t,e){if(t[e]<0)return e;var r=e,n=e;do{var i=t[n];if(!u[n]||i<0||i===n)break;if(i=t[n=i],!u[n]||i<0||i===n)break;n=i,r=t[r]}while(r!==n);for(var a=e;a!==n;a=t[a])t[a]=n;return n}var z=[];return t.forEach(function(t){var e=L(s,t[0]),r=L(l,t[1]);if(e>=0&&r>=0&&e!==r){var n=A[e],i=A[r];n!==i&&z.push([n,i])}}),i.unique(i.normalize(z)),{positions:C,edges:z}};var n=t("robust-orientation"),i=t("simplicial-complex")},{"robust-orientation":471,"simplicial-complex":483}],486:[function(t,e,r){"use strict";e.exports=function(t,e){var r,a,o,s;if(e[0][0]<e[1][0])r=e[0],a=e[1];else{if(!(e[0][0]>e[1][0]))return i(e,t);r=e[1],a=e[0]}if(t[0][0]<t[1][0])o=t[0],s=t[1];else{if(!(t[0][0]>t[1][0]))return-i(t,e);o=t[1],s=t[0]}var l=n(r,a,s),c=n(r,a,o);if(l<0){if(c<=0)return l}else if(l>0){if(c>=0)return l}else if(c)return c;if(l=n(s,o,a),c=n(s,o,r),l<0){if(c<=0)return l}else if(l>0){if(c>=0)return l}else if(c)return c;return a[0]-s[0]};var n=t("robust-orientation");function i(t,e){var r,i,a,o;if(e[0][0]<e[1][0])r=e[0],i=e[1];else{if(!(e[0][0]>e[1][0])){var s=Math.min(t[0][1],t[1][1]),l=Math.max(t[0][1],t[1][1]),c=Math.min(e[0][1],e[1][1]),u=Math.max(e[0][1],e[1][1]);return l<c?l-c:s>u?s-u:l-u}r=e[1],i=e[0]}t[0][1]<t[1][1]?(a=t[0],o=t[1]):(a=t[1],o=t[0]);var h=n(i,r,a);return h||((h=n(i,r,o))||o-i)}},{"robust-orientation":471}],487:[function(t,e,r){"use strict";e.exports=function(t){for(var e=t.length,r=2*e,n=new Array(r),a=0;a<e;++a){var l=t[a],c=l[0][0]<l[1][0];n[2*a]=new h(l[0][0],l,c,a),n[2*a+1]=new h(l[1][0],l,!c,a)}n.sort(function(t,e){var r=t.x-e.x;return r||((r=t.create-e.create)||Math.min(t.segment[0][1],t.segment[1][1])-Math.min(e.segment[0][1],e.segment[1][1]))});for(var f=i(o),p=[],d=[],g=[],a=0;a<r;){for(var m=n[a].x,v=[];a<r;){var y=n[a];if(y.x!==m)break;a+=1,y.segment[0][0]===y.x&&y.segment[1][0]===y.x?y.create&&(y.segment[0][1]<y.segment[1][1]?(v.push(new u(y.segment[0][1],y.index,!0,!0)),v.push(new u(y.segment[1][1],y.index,!1,!1))):(v.push(new u(y.segment[1][1],y.index,!0,!1)),v.push(new u(y.segment[0][1],y.index,!1,!0)))):f=y.create?f.insert(y.segment,y.index):f.remove(y.segment)}p.push(f.root),d.push(m),g.push(v)}return new s(p,d,g)};var n=t("binary-search-bounds"),i=t("functional-red-black-tree"),a=t("robust-orientation"),o=t("./lib/order-segments");function s(t,e,r){this.slabs=t,this.coordinates=e,this.horizontal=r}function l(t,e){return t.y-e}function c(t,e){for(var r=null;t;){var n,i,o=t.key;o[0][0]<o[1][0]?(n=o[0],i=o[1]):(n=o[1],i=o[0]);var s=a(n,i,e);if(s<0)t=t.left;else if(s>0)if(e[0]!==o[1][0])r=t,t=t.right;else{if(l=c(t.right,e))return l;t=t.left}else{if(e[0]!==o[1][0])return t;var l;if(l=c(t.right,e))return l;t=t.left}}return r}function u(t,e,r,n){this.y=t,this.index=e,this.start=r,this.closed=n}function h(t,e,r,n){this.x=t,this.segment=e,this.create=r,this.index=n}s.prototype.castUp=function(t){var e=n.le(this.coordinates,t[0]);if(e<0)return-1;this.slabs[e];var r=c(this.slabs[e],t),i=-1;if(r&&(i=r.value),this.coordinates[e]===t[0]){var s=null;if(r&&(s=r.key),e>0){var u=c(this.slabs[e-1],t);u&&(s?o(u.key,s)>0&&(s=u.key,i=u.value):(i=u.value,s=u.key))}var h=this.horizontal[e];if(h.length>0){var f=n.ge(h,t[1],l);if(f<h.length){var p=h[f];if(t[1]===p.y){if(p.closed)return p.index;for(;f<h.length-1&&h[f+1].y===t[1];)if((p=h[f+=1]).closed)return p.index;if(p.y===t[1]&&!p.start){if((f+=1)>=h.length)return i;p=h[f]}}if(p.start)if(s){var d=a(s[0],s[1],[t[0],p.y]);s[0][0]>s[1][0]&&(d=-d),d>0&&(i=p.index)}else i=p.index;else p.y!==t[1]&&(i=p.index)}}}return i}},{"./lib/order-segments":486,"binary-search-bounds":79,"functional-red-black-tree":219,"robust-orientation":471}],488:[function(t,e,r){"use strict";var n=t("robust-dot-product"),i=t("robust-sum");function a(t,e){var r=i(n(t,e),[e[e.length-1]]);return r[r.length-1]}function o(t,e,r,n){var i=-e/(n-e);i<0?i=0:i>1&&(i=1);for(var a=1-i,o=t.length,s=new Array(o),l=0;l<o;++l)s[l]=i*t[l]+a*r[l];return s}e.exports=function(t,e){for(var r=[],n=[],i=a(t[t.length-1],e),s=t[t.length-1],l=t[0],c=0;c<t.length;++c,s=l){var u=a(l=t[c],e);if(i<0&&u>0||i>0&&u<0){var h=o(s,u,l,i);r.push(h),n.push(h.slice())}u<0?n.push(l.slice()):u>0?r.push(l.slice()):(r.push(l.slice()),n.push(l.slice())),i=u}return{positive:r,negative:n}},e.exports.positive=function(t,e){for(var r=[],n=a(t[t.length-1],e),i=t[t.length-1],s=t[0],l=0;l<t.length;++l,i=s){var c=a(s=t[l],e);(n<0&&c>0||n>0&&c<0)&&r.push(o(i,c,s,n)),c>=0&&r.push(s.slice()),n=c}return r},e.exports.negative=function(t,e){for(var r=[],n=a(t[t.length-1],e),i=t[t.length-1],s=t[0],l=0;l<t.length;++l,i=s){var c=a(s=t[l],e);(n<0&&c>0||n>0&&c<0)&&r.push(o(i,c,s,n)),c<=0&&r.push(s.slice()),n=c}return r}},{"robust-dot-product":468,"robust-sum":476}],489:[function(t,e,r){!function(){"use strict";var t={not_string:/[^s]/,not_bool:/[^t]/,not_type:/[^T]/,not_primitive:/[^v]/,number:/[diefg]/,numeric_arg:/[bcdiefguxX]/,json:/[j]/,not_json:/[^j]/,text:/^[^\x25]+/,modulo:/^\x25{2}/,placeholder:/^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-gijostTuvxX])/,key:/^([a-z_][a-z_\d]*)/i,key_access:/^\.([a-z_][a-z_\d]*)/i,index_access:/^\[(\d+)\]/,sign:/^[\+\-]/};function e(r){return function(r,n){var i,a,o,s,l,c,u,h,f,p=1,d=r.length,g="";for(a=0;a<d;a++)if("string"==typeof r[a])g+=r[a];else if(Array.isArray(r[a])){if((s=r[a])[2])for(i=n[p],o=0;o<s[2].length;o++){if(!i.hasOwnProperty(s[2][o]))throw new Error(e('[sprintf] property "%s" does not exist',s[2][o]));i=i[s[2][o]]}else i=s[1]?n[s[1]]:n[p++];if(t.not_type.test(s[8])&&t.not_primitive.test(s[8])&&i instanceof Function&&(i=i()),t.numeric_arg.test(s[8])&&"number"!=typeof i&&isNaN(i))throw new TypeError(e("[sprintf] expecting number but found %T",i));switch(t.number.test(s[8])&&(h=i>=0),s[8]){case"b":i=parseInt(i,10).toString(2);break;case"c":i=String.fromCharCode(parseInt(i,10));break;case"d":case"i":i=parseInt(i,10);break;case"j":i=JSON.stringify(i,null,s[6]?parseInt(s[6]):0);break;case"e":i=s[7]?parseFloat(i).toExponential(s[7]):parseFloat(i).toExponential();break;case"f":i=s[7]?parseFloat(i).toFixed(s[7]):parseFloat(i);break;case"g":i=s[7]?String(Number(i.toPrecision(s[7]))):parseFloat(i);break;case"o":i=(parseInt(i,10)>>>0).toString(8);break;case"s":i=String(i),i=s[7]?i.substring(0,s[7]):i;break;case"t":i=String(!!i),i=s[7]?i.substring(0,s[7]):i;break;case"T":i=Object.prototype.toString.call(i).slice(8,-1).toLowerCase(),i=s[7]?i.substring(0,s[7]):i;break;case"u":i=parseInt(i,10)>>>0;break;case"v":i=i.valueOf(),i=s[7]?i.substring(0,s[7]):i;break;case"x":i=(parseInt(i,10)>>>0).toString(16);break;case"X":i=(parseInt(i,10)>>>0).toString(16).toUpperCase()}t.json.test(s[8])?g+=i:(!t.number.test(s[8])||h&&!s[3]?f="":(f=h?"+":"-",i=i.toString().replace(t.sign,"")),c=s[4]?"0"===s[4]?"0":s[4].charAt(1):" ",u=s[6]-(f+i).length,l=s[6]&&u>0?c.repeat(u):"",g+=s[5]?f+i+l:"0"===c?f+l+i:l+f+i)}return g}(function(e){if(i[e])return i[e];var r,n=e,a=[],o=0;for(;n;){if(null!==(r=t.text.exec(n)))a.push(r[0]);else if(null!==(r=t.modulo.exec(n)))a.push("%");else{if(null===(r=t.placeholder.exec(n)))throw new SyntaxError("[sprintf] unexpected placeholder");if(r[2]){o|=1;var s=[],l=r[2],c=[];if(null===(c=t.key.exec(l)))throw new SyntaxError("[sprintf] failed to parse named argument key");for(s.push(c[1]);""!==(l=l.substring(c[0].length));)if(null!==(c=t.key_access.exec(l)))s.push(c[1]);else{if(null===(c=t.index_access.exec(l)))throw new SyntaxError("[sprintf] failed to parse named argument key");s.push(c[1])}r[2]=s}else o|=2;if(3===o)throw new Error("[sprintf] mixing positional and named placeholders is not (yet) supported");a.push(r)}n=n.substring(r[0].length)}return i[e]=a}(r),arguments)}function n(t,r){return e.apply(null,[t].concat(r||[]))}var i=Object.create(null);"undefined"!=typeof r&&(r.sprintf=e,r.vsprintf=n),"undefined"!=typeof window&&(window.sprintf=e,window.vsprintf=n)}()},{}],490:[function(t,e,r){"use strict";var n=t("parenthesis");e.exports=function(t,e,r){if(null==t)throw Error("First argument should be a string");if(null==e)throw Error("Separator should be a string or a RegExp");r?("string"==typeof r||Array.isArray(r))&&(r={ignore:r}):r={},null==r.escape&&(r.escape=!0),null==r.ignore?r.ignore=["[]","()","{}","<>",'""',"''","``","\u201c\u201d","\xab\xbb"]:("string"==typeof r.ignore&&(r.ignore=[r.ignore]),r.ignore=r.ignore.map(function(t){return 1===t.length&&(t+=t),t}));var i=n.parse(t,{flat:!0,brackets:r.ignore}),a=i[0].split(e);if(r.escape){for(var o=[],s=0;s<a.length;s++){var l=a[s],c=a[s+1];"\\"===l[l.length-1]&&"\\"!==l[l.length-2]?(o.push(l+e+c),s++):o.push(l)}a=o}for(s=0;s<a.length;s++)i[0]=a[s],a[s]=n.stringify(i,{flat:!0});return a}},{parenthesis:425}],491:[function(t,e,r){"use strict";e.exports=function(t){for(var e=t.length,r=new Array(e),n=new Array(e),i=new Array(e),a=new Array(e),o=new Array(e),s=new Array(e),l=0;l<e;++l)r[l]=-1,n[l]=0,i[l]=!1,a[l]=0,o[l]=-1,s[l]=[];var c,u=0,h=[],f=[];function p(e){var l=[e],c=[e];for(r[e]=n[e]=u,i[e]=!0,u+=1;c.length>0;){e=c[c.length-1];var p=t[e];if(a[e]<p.length){for(var d=a[e];d<p.length;++d){var g=p[d];if(r[g]<0){r[g]=n[g]=u,i[g]=!0,u+=1,l.push(g),c.push(g);break}i[g]&&(n[e]=0|Math.min(n[e],n[g])),o[g]>=0&&s[e].push(o[g])}a[e]=d}else{if(n[e]===r[e]){for(var m=[],v=[],y=0,d=l.length-1;d>=0;--d){var x=l[d];if(i[x]=!1,m.push(x),v.push(s[x]),y+=s[x].length,o[x]=h.length,x===e){l.length=d;break}}h.push(m);for(var b=new Array(y),d=0;d<v.length;d++)for(var _=0;_<v[d].length;_++)b[--y]=v[d][_];f.push(b)}c.pop()}}}for(var l=0;l<e;++l)r[l]<0&&p(l);for(var l=0;l<f.length;l++){var d=f[l];if(0!==d.length){d.sort(function(t,e){return t-e}),c=[d[0]];for(var g=1;g<d.length;g++)d[g]!==d[g-1]&&c.push(d[g]);f[l]=c}}return{components:h,adjacencyList:f}}},{}],492:[function(t,e,r){"use strict";e.exports=function(t){return t.split("").map(function(t){return t in n?n[t]:""}).join("")};var n={" ":" ",0:"\u2070",1:"\xb9",2:"\xb2",3:"\xb3",4:"\u2074",5:"\u2075",6:"\u2076",7:"\u2077",8:"\u2078",9:"\u2079","+":"\u207a","-":"\u207b",a:"\u1d43",b:"\u1d47",c:"\u1d9c",d:"\u1d48",e:"\u1d49",f:"\u1da0",g:"\u1d4d",h:"\u02b0",i:"\u2071",j:"\u02b2",k:"\u1d4f",l:"\u02e1",m:"\u1d50",n:"\u207f",o:"\u1d52",p:"\u1d56",r:"\u02b3",s:"\u02e2",t:"\u1d57",u:"\u1d58",v:"\u1d5b",w:"\u02b7",x:"\u02e3",y:"\u02b8",z:"\u1dbb"}},{}],493:[function(t,e,r){"use strict";e.exports=function(t,e){if(t.dimension<=0)return{positions:[],cells:[]};if(1===t.dimension)return function(t,e){for(var r=a(t,e),n=r.length,i=new Array(n),o=new Array(n),s=0;s<n;++s)i[s]=[r[s]],o[s]=[s];return{positions:i,cells:o}}(t,e);var r=t.order.join()+"-"+t.dtype,s=o[r],e=+e||0;s||(s=o[r]=function(t,e){var r=t.length,a=["'use strict';"],o="surfaceNets"+t.join("_")+"d"+e;a.push("var contour=genContour({","order:[",t.join(),"],","scalarArguments: 3,","phase:function phaseFunc(p,a,b,c) { return (p > c)|0 },"),"generic"===e&&a.push("getters:[0],");for(var s=[],l=[],c=0;c<r;++c)s.push("d"+c),l.push("d"+c);for(var c=0;c<1<<r;++c)s.push("v"+c),l.push("v"+c);for(var c=0;c<1<<r;++c)s.push("p"+c),l.push("p"+c);s.push("a","b","c"),l.push("a","c"),a.push("vertex:function vertexFunc(",s.join(),"){");for(var u=[],c=0;c<1<<r;++c)u.push("(p"+c+"<<"+c+")");a.push("var m=(",u.join("+"),")|0;if(m===0||m===",(1<<(1<<r))-1,"){return}");var h=[],f=[];1<<(1<<r)<=128?(a.push("switch(m){"),f=a):a.push("switch(m>>>7){");for(var c=0;c<1<<(1<<r);++c){if(1<<(1<<r)>128&&c%128==0){h.length>0&&f.push("}}");var p="vExtra"+h.length;a.push("case ",c>>>7,":",p,"(m&0x7f,",l.join(),");break;"),f=["function ",p,"(m,",l.join(),"){switch(m){"],h.push(f)}f.push("case ",127&c,":");for(var d=new Array(r),g=new Array(r),m=new Array(r),v=new Array(r),y=0,x=0;x<r;++x)d[x]=[],g[x]=[],m[x]=0,v[x]=0;for(var x=0;x<1<<r;++x)for(var b=0;b<r;++b){var _=x^1<<b;if(!(_>x)&&!(c&1<<_)!=!(c&1<<x)){var w=1;c&1<<_?g[b].push("v"+_+"-v"+x):(g[b].push("v"+x+"-v"+_),w=-w),w<0?(d[b].push("-v"+x+"-v"+_),m[b]+=2):(d[b].push("v"+x+"+v"+_),m[b]-=2),y+=1;for(var k=0;k<r;++k)k!==b&&(_&1<<k?v[k]+=1:v[k]-=1)}}for(var M=[],b=0;b<r;++b)if(0===d[b].length)M.push("d"+b+"-0.5");else{var A="";m[b]<0?A=m[b]+"*c":m[b]>0&&(A="+"+m[b]+"*c");var T=d[b].length/y*.5,S=.5+v[b]/y*.5;M.push("d"+b+"-"+S+"-"+T+"*("+d[b].join("+")+A+")/("+g[b].join("+")+")")}f.push("a.push([",M.join(),"]);","break;")}a.push("}},"),h.length>0&&f.push("}}");for(var E=[],c=0;c<1<<r-1;++c)E.push("v"+c);E.push("c0","c1","p0","p1","a","b","c"),a.push("cell:function cellFunc(",E.join(),"){");var C=i(r-1);a.push("if(p0){b.push(",C.map(function(t){return"["+t.map(function(t){return"v"+t})+"]"}).join(),")}else{b.push(",C.map(function(t){var e=t.slice();return e.reverse(),"["+e.map(function(t){return"v"+t})+"]"}).join(),")}}});function ",o,"(array,level){var verts=[],cells=[];contour(array,verts,cells,level);return {positions:verts,cells:cells};} return ",o,";");for(var c=0;c<h.length;++c)a.push(h[c].join(""));return new Function("genContour",a.join(""))(n)}(t.order,t.dtype));return s(t,e)};var n=t("ndarray-extract-contour"),i=t("triangulate-hypercube"),a=t("zero-crossings");var o={}},{"ndarray-extract-contour":406,"triangulate-hypercube":503,"zero-crossings":539}],494:[function(t,e,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n=function(){return function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return function(t,e){var r=[],n=!0,i=!1,a=void 0;try{for(var o,s=t[Symbol.iterator]();!(n=(o=s.next()).done)&&(r.push(o.value),!e||r.length!==e);n=!0);}catch(t){i=!0,a=t}finally{try{!n&&s.return&&s.return()}finally{if(i)throw a}}return r}(t,e);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}(),i=2*Math.PI,a=function(t,e,r,n,i,a,o){var s=t.x,l=t.y;return{x:n*(s*=e)-i*(l*=r)+a,y:i*s+n*l+o}},o=function(t,e){var r=4/3*Math.tan(e/4),n=Math.cos(t),i=Math.sin(t),a=Math.cos(t+e),o=Math.sin(t+e);return[{x:n-i*r,y:i+n*r},{x:a+o*r,y:o-a*r},{x:a,y:o}]},s=function(t,e,r,n){var i=t*n-e*r<0?-1:1,a=(t*r+e*n)/(Math.sqrt(t*t+e*e)*Math.sqrt(t*t+e*e));return a>1&&(a=1),a<-1&&(a=-1),i*Math.acos(a)};r.default=function(t){var e=t.px,r=t.py,l=t.cx,c=t.cy,u=t.rx,h=t.ry,f=t.xAxisRotation,p=void 0===f?0:f,d=t.largeArcFlag,g=void 0===d?0:d,m=t.sweepFlag,v=void 0===m?0:m,y=[];if(0===u||0===h)return[];var x=Math.sin(p*i/360),b=Math.cos(p*i/360),_=b*(e-l)/2+x*(r-c)/2,w=-x*(e-l)/2+b*(r-c)/2;if(0===_&&0===w)return[];u=Math.abs(u),h=Math.abs(h);var k=Math.pow(_,2)/Math.pow(u,2)+Math.pow(w,2)/Math.pow(h,2);k>1&&(u*=Math.sqrt(k),h*=Math.sqrt(k));var M=function(t,e,r,n,a,o,l,c,u,h,f,p){var d=Math.pow(a,2),g=Math.pow(o,2),m=Math.pow(f,2),v=Math.pow(p,2),y=d*g-d*v-g*m;y<0&&(y=0),y/=d*v+g*m;var x=(y=Math.sqrt(y)*(l===c?-1:1))*a/o*p,b=y*-o/a*f,_=h*x-u*b+(t+r)/2,w=u*x+h*b+(e+n)/2,k=(f-x)/a,M=(p-b)/o,A=(-f-x)/a,T=(-p-b)/o,S=s(1,0,k,M),E=s(k,M,A,T);return 0===c&&E>0&&(E-=i),1===c&&E<0&&(E+=i),[_,w,S,E]}(e,r,l,c,u,h,g,v,x,b,_,w),A=n(M,4),T=A[0],S=A[1],E=A[2],C=A[3],L=Math.max(Math.ceil(Math.abs(C)/(i/4)),1);C/=L;for(var z=0;z<L;z++)y.push(o(E,C)),E+=C;return y.map(function(t){var e=a(t[0],u,h,b,x,T,S),r=e.x,n=e.y,i=a(t[1],u,h,b,x,T,S),o=i.x,s=i.y,l=a(t[2],u,h,b,x,T,S);return{x1:r,y1:n,x2:o,y2:s,x:l.x,y:l.y}})},e.exports=r.default},{}],495:[function(t,e,r){"use strict";var n=t("parse-svg-path"),i=t("abs-svg-path"),a=t("normalize-svg-path"),o=t("is-svg-path"),s=t("assert");e.exports=function(t){Array.isArray(t)&&1===t.length&&"string"==typeof t[0]&&(t=t[0]);"string"==typeof t&&(s(o(t),"String is not an SVG path."),t=n(t));if(s(Array.isArray(t),"Argument should be a string or an array of path segments."),t=i(t),!(t=a(t)).length)return[0,0,0,0];for(var e=[1/0,1/0,-1/0,-1/0],r=0,l=t.length;r<l;r++)for(var c=t[r].slice(1),u=0;u<c.length;u+=2)c[u+0]<e[0]&&(e[0]=c[u+0]),c[u+1]<e[1]&&(e[1]=c[u+1]),c[u+0]>e[2]&&(e[2]=c[u+0]),c[u+1]>e[3]&&(e[3]=c[u+1]);return e}},{"abs-svg-path":51,assert:59,"is-svg-path":391,"normalize-svg-path":496,"parse-svg-path":427}],496:[function(t,e,r){"use strict";e.exports=function(t){for(var e,r=[],o=0,s=0,l=0,c=0,u=null,h=null,f=0,p=0,d=0,g=t.length;d<g;d++){var m=t[d],v=m[0];switch(v){case"M":l=m[1],c=m[2];break;case"A":var y=n({px:f,py:p,cx:m[6],cy:m[7],rx:m[1],ry:m[2],xAxisRotation:m[3],largeArcFlag:m[4],sweepFlag:m[5]});if(!y.length)continue;for(var x,b=0;b<y.length;b++)x=y[b],m=["C",x.x1,x.y1,x.x2,x.y2,x.x,x.y],b<y.length-1&&r.push(m);break;case"S":var _=f,w=p;"C"!=e&&"S"!=e||(_+=_-o,w+=w-s),m=["C",_,w,m[1],m[2],m[3],m[4]];break;case"T":"Q"==e||"T"==e?(u=2*f-u,h=2*p-h):(u=f,h=p),m=a(f,p,u,h,m[1],m[2]);break;case"Q":u=m[1],h=m[2],m=a(f,p,m[1],m[2],m[3],m[4]);break;case"L":m=i(f,p,m[1],m[2]);break;case"H":m=i(f,p,m[1],p);break;case"V":m=i(f,p,f,m[1]);break;case"Z":m=i(f,p,l,c)}e=v,f=m[m.length-2],p=m[m.length-1],m.length>4?(o=m[m.length-4],s=m[m.length-3]):(o=f,s=p),r.push(m)}return r};var n=t("svg-arc-to-cubic-bezier");function i(t,e,r,n){return["C",t,e,r,n,r,n]}function a(t,e,r,n,i,a){return["C",t/3+2/3*r,e/3+2/3*n,i/3+2/3*r,a/3+2/3*n,i,a]}},{"svg-arc-to-cubic-bezier":494}],497:[function(t,e,r){(function(r){"use strict";var n=t("svg-path-bounds"),i=t("parse-svg-path"),a=t("draw-svg-path"),o=t("is-svg-path"),s=t("bitmap-sdf"),l=document.createElement("canvas"),c=l.getContext("2d");e.exports=function(t,e){if(!o(t))throw Error("Argument should be valid svg path string");e||(e={});var u,h;e.shape?(u=e.shape[0],h=e.shape[1]):(u=l.width=e.w||e.width||200,h=l.height=e.h||e.height||200);var f=Math.min(u,h),p=e.stroke||0,d=e.viewbox||e.viewBox||n(t),g=[u/(d[2]-d[0]),h/(d[3]-d[1])],m=Math.min(g[0]||0,g[1]||0)/2;c.fillStyle="black",c.fillRect(0,0,u,h),c.fillStyle="white",p&&("number"!=typeof p&&(p=1),c.strokeStyle=p>0?"white":"black",c.lineWidth=Math.abs(p));if(c.translate(.5*u,.5*h),c.scale(m,m),r.Path2D){var v=new Path2D(t);c.fill(v),p&&c.stroke(v)}else{var y=i(t);a(c,y),c.fill(),p&&c.stroke()}return c.setTransform(1,0,0,1,0,0),s(c,{cutoff:null!=e.cutoff?e.cutoff:.5,radius:null!=e.radius?e.radius:.5*f})}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"bitmap-sdf":81,"draw-svg-path":152,"is-svg-path":391,"parse-svg-path":427,"svg-path-bounds":495}],498:[function(t,e,r){(function(r){"use strict";e.exports=function t(e,r,i){var i=i||{};var o=a[e];o||(o=a[e]={" ":{data:new Float32Array(0),shape:.2}});var s=o[r];if(!s)if(r.length<=1||!/\d/.test(r))s=o[r]=function(t){for(var e=t.cells,r=t.positions,n=new Float32Array(6*e.length),i=0,a=0,o=0;o<e.length;++o)for(var s=e[o],l=0;l<3;++l){var c=r[s[l]];n[i++]=c[0],n[i++]=c[1]+1.4,a=Math.max(c[0],a)}return{data:n,shape:a}}(n(r,{triangles:!0,font:e,textAlign:i.textAlign||"left",textBaseline:"alphabetic"}));else{for(var l=r.split(/(\d|\s)/),c=new Array(l.length),u=0,h=0,f=0;f<l.length;++f)c[f]=t(e,l[f]),u+=c[f].data.length,h+=c[f].shape,f>0&&(h+=.02);for(var p=new Float32Array(u),d=0,g=-.5*h,f=0;f<c.length;++f){for(var m=c[f].data,v=0;v<m.length;v+=2)p[d++]=m[v]+g,p[d++]=m[v+1];g+=c[f].shape+.02}s=o[r]={data:p,shape:h}}return s};var n=t("vectorize-text"),i=window||r.global||{},a=i.__TEXT_CACHE||{};i.__TEXT_CACHE={}}).call(this,t("_process"))},{_process:449,"vectorize-text":515}],499:[function(t,e,r){!function(t){var r=/^\s+/,n=/\s+$/,i=0,a=t.round,o=t.min,s=t.max,l=t.random;function c(e,l){if(l=l||{},(e=e||"")instanceof c)return e;if(!(this instanceof c))return new c(e,l);var u=function(e){var i={r:0,g:0,b:0},a=1,l=null,c=null,u=null,h=!1,f=!1;"string"==typeof e&&(e=function(t){t=t.replace(r,"").replace(n,"").toLowerCase();var e,i=!1;if(S[t])t=S[t],i=!0;else if("transparent"==t)return{r:0,g:0,b:0,a:0,format:"name"};if(e=j.rgb.exec(t))return{r:e[1],g:e[2],b:e[3]};if(e=j.rgba.exec(t))return{r:e[1],g:e[2],b:e[3],a:e[4]};if(e=j.hsl.exec(t))return{h:e[1],s:e[2],l:e[3]};if(e=j.hsla.exec(t))return{h:e[1],s:e[2],l:e[3],a:e[4]};if(e=j.hsv.exec(t))return{h:e[1],s:e[2],v:e[3]};if(e=j.hsva.exec(t))return{h:e[1],s:e[2],v:e[3],a:e[4]};if(e=j.hex8.exec(t))return{r:P(e[1]),g:P(e[2]),b:P(e[3]),a:R(e[4]),format:i?"name":"hex8"};if(e=j.hex6.exec(t))return{r:P(e[1]),g:P(e[2]),b:P(e[3]),format:i?"name":"hex"};if(e=j.hex4.exec(t))return{r:P(e[1]+""+e[1]),g:P(e[2]+""+e[2]),b:P(e[3]+""+e[3]),a:R(e[4]+""+e[4]),format:i?"name":"hex8"};if(e=j.hex3.exec(t))return{r:P(e[1]+""+e[1]),g:P(e[2]+""+e[2]),b:P(e[3]+""+e[3]),format:i?"name":"hex"};return!1}(e));"object"==typeof e&&(V(e.r)&&V(e.g)&&V(e.b)?(p=e.r,d=e.g,g=e.b,i={r:255*L(p,255),g:255*L(d,255),b:255*L(g,255)},h=!0,f="%"===String(e.r).substr(-1)?"prgb":"rgb"):V(e.h)&&V(e.s)&&V(e.v)?(l=O(e.s),c=O(e.v),i=function(e,r,n){e=6*L(e,360),r=L(r,100),n=L(n,100);var i=t.floor(e),a=e-i,o=n*(1-r),s=n*(1-a*r),l=n*(1-(1-a)*r),c=i%6;return{r:255*[n,s,o,o,l,n][c],g:255*[l,n,n,s,o,o][c],b:255*[o,o,l,n,n,s][c]}}(e.h,l,c),h=!0,f="hsv"):V(e.h)&&V(e.s)&&V(e.l)&&(l=O(e.s),u=O(e.l),i=function(t,e,r){var n,i,a;function o(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}if(t=L(t,360),e=L(e,100),r=L(r,100),0===e)n=i=a=r;else{var s=r<.5?r*(1+e):r+e-r*e,l=2*r-s;n=o(l,s,t+1/3),i=o(l,s,t),a=o(l,s,t-1/3)}return{r:255*n,g:255*i,b:255*a}}(e.h,l,u),h=!0,f="hsl"),e.hasOwnProperty("a")&&(a=e.a));var p,d,g;return a=C(a),{ok:h,format:e.format||f,r:o(255,s(i.r,0)),g:o(255,s(i.g,0)),b:o(255,s(i.b,0)),a:a}}(e);this._originalInput=e,this._r=u.r,this._g=u.g,this._b=u.b,this._a=u.a,this._roundA=a(100*this._a)/100,this._format=l.format||u.format,this._gradientType=l.gradientType,this._r<1&&(this._r=a(this._r)),this._g<1&&(this._g=a(this._g)),this._b<1&&(this._b=a(this._b)),this._ok=u.ok,this._tc_id=i++}function u(t,e,r){t=L(t,255),e=L(e,255),r=L(r,255);var n,i,a=s(t,e,r),l=o(t,e,r),c=(a+l)/2;if(a==l)n=i=0;else{var u=a-l;switch(i=c>.5?u/(2-a-l):u/(a+l),a){case t:n=(e-r)/u+(e<r?6:0);break;case e:n=(r-t)/u+2;break;case r:n=(t-e)/u+4}n/=6}return{h:n,s:i,l:c}}function h(t,e,r){t=L(t,255),e=L(e,255),r=L(r,255);var n,i,a=s(t,e,r),l=o(t,e,r),c=a,u=a-l;if(i=0===a?0:u/a,a==l)n=0;else{switch(a){case t:n=(e-r)/u+(e<r?6:0);break;case e:n=(r-t)/u+2;break;case r:n=(t-e)/u+4}n/=6}return{h:n,s:i,v:c}}function f(t,e,r,n){var i=[I(a(t).toString(16)),I(a(e).toString(16)),I(a(r).toString(16))];return n&&i[0].charAt(0)==i[0].charAt(1)&&i[1].charAt(0)==i[1].charAt(1)&&i[2].charAt(0)==i[2].charAt(1)?i[0].charAt(0)+i[1].charAt(0)+i[2].charAt(0):i.join("")}function p(t,e,r,n){return[I(D(n)),I(a(t).toString(16)),I(a(e).toString(16)),I(a(r).toString(16))].join("")}function d(t,e){e=0===e?0:e||10;var r=c(t).toHsl();return r.s-=e/100,r.s=z(r.s),c(r)}function g(t,e){e=0===e?0:e||10;var r=c(t).toHsl();return r.s+=e/100,r.s=z(r.s),c(r)}function m(t){return c(t).desaturate(100)}function v(t,e){e=0===e?0:e||10;var r=c(t).toHsl();return r.l+=e/100,r.l=z(r.l),c(r)}function y(t,e){e=0===e?0:e||10;var r=c(t).toRgb();return r.r=s(0,o(255,r.r-a(-e/100*255))),r.g=s(0,o(255,r.g-a(-e/100*255))),r.b=s(0,o(255,r.b-a(-e/100*255))),c(r)}function x(t,e){e=0===e?0:e||10;var r=c(t).toHsl();return r.l-=e/100,r.l=z(r.l),c(r)}function b(t,e){var r=c(t).toHsl(),n=(r.h+e)%360;return r.h=n<0?360+n:n,c(r)}function _(t){var e=c(t).toHsl();return e.h=(e.h+180)%360,c(e)}function w(t){var e=c(t).toHsl(),r=e.h;return[c(t),c({h:(r+120)%360,s:e.s,l:e.l}),c({h:(r+240)%360,s:e.s,l:e.l})]}function k(t){var e=c(t).toHsl(),r=e.h;return[c(t),c({h:(r+90)%360,s:e.s,l:e.l}),c({h:(r+180)%360,s:e.s,l:e.l}),c({h:(r+270)%360,s:e.s,l:e.l})]}function M(t){var e=c(t).toHsl(),r=e.h;return[c(t),c({h:(r+72)%360,s:e.s,l:e.l}),c({h:(r+216)%360,s:e.s,l:e.l})]}function A(t,e,r){e=e||6,r=r||30;var n=c(t).toHsl(),i=360/r,a=[c(t)];for(n.h=(n.h-(i*e>>1)+720)%360;--e;)n.h=(n.h+i)%360,a.push(c(n));return a}function T(t,e){e=e||6;for(var r=c(t).toHsv(),n=r.h,i=r.s,a=r.v,o=[],s=1/e;e--;)o.push(c({h:n,s:i,v:a})),a=(a+s)%1;return o}c.prototype={isDark:function(){return this.getBrightness()<128},isLight:function(){return!this.isDark()},isValid:function(){return this._ok},getOriginalInput:function(){return this._originalInput},getFormat:function(){return this._format},getAlpha:function(){return this._a},getBrightness:function(){var t=this.toRgb();return(299*t.r+587*t.g+114*t.b)/1e3},getLuminance:function(){var e,r,n,i=this.toRgb();return e=i.r/255,r=i.g/255,n=i.b/255,.2126*(e<=.03928?e/12.92:t.pow((e+.055)/1.055,2.4))+.7152*(r<=.03928?r/12.92:t.pow((r+.055)/1.055,2.4))+.0722*(n<=.03928?n/12.92:t.pow((n+.055)/1.055,2.4))},setAlpha:function(t){return this._a=C(t),this._roundA=a(100*this._a)/100,this},toHsv:function(){var t=h(this._r,this._g,this._b);return{h:360*t.h,s:t.s,v:t.v,a:this._a}},toHsvString:function(){var t=h(this._r,this._g,this._b),e=a(360*t.h),r=a(100*t.s),n=a(100*t.v);return 1==this._a?"hsv("+e+", "+r+"%, "+n+"%)":"hsva("+e+", "+r+"%, "+n+"%, "+this._roundA+")"},toHsl:function(){var t=u(this._r,this._g,this._b);return{h:360*t.h,s:t.s,l:t.l,a:this._a}},toHslString:function(){var t=u(this._r,this._g,this._b),e=a(360*t.h),r=a(100*t.s),n=a(100*t.l);return 1==this._a?"hsl("+e+", "+r+"%, "+n+"%)":"hsla("+e+", "+r+"%, "+n+"%, "+this._roundA+")"},toHex:function(t){return f(this._r,this._g,this._b,t)},toHexString:function(t){return"#"+this.toHex(t)},toHex8:function(t){return function(t,e,r,n,i){var o=[I(a(t).toString(16)),I(a(e).toString(16)),I(a(r).toString(16)),I(D(n))];if(i&&o[0].charAt(0)==o[0].charAt(1)&&o[1].charAt(0)==o[1].charAt(1)&&o[2].charAt(0)==o[2].charAt(1)&&o[3].charAt(0)==o[3].charAt(1))return o[0].charAt(0)+o[1].charAt(0)+o[2].charAt(0)+o[3].charAt(0);return o.join("")}(this._r,this._g,this._b,this._a,t)},toHex8String:function(t){return"#"+this.toHex8(t)},toRgb:function(){return{r:a(this._r),g:a(this._g),b:a(this._b),a:this._a}},toRgbString:function(){return 1==this._a?"rgb("+a(this._r)+", "+a(this._g)+", "+a(this._b)+")":"rgba("+a(this._r)+", "+a(this._g)+", "+a(this._b)+", "+this._roundA+")"},toPercentageRgb:function(){return{r:a(100*L(this._r,255))+"%",g:a(100*L(this._g,255))+"%",b:a(100*L(this._b,255))+"%",a:this._a}},toPercentageRgbString:function(){return 1==this._a?"rgb("+a(100*L(this._r,255))+"%, "+a(100*L(this._g,255))+"%, "+a(100*L(this._b,255))+"%)":"rgba("+a(100*L(this._r,255))+"%, "+a(100*L(this._g,255))+"%, "+a(100*L(this._b,255))+"%, "+this._roundA+")"},toName:function(){return 0===this._a?"transparent":!(this._a<1)&&(E[f(this._r,this._g,this._b,!0)]||!1)},toFilter:function(t){var e="#"+p(this._r,this._g,this._b,this._a),r=e,n=this._gradientType?"GradientType = 1, ":"";if(t){var i=c(t);r="#"+p(i._r,i._g,i._b,i._a)}return"progid:DXImageTransform.Microsoft.gradient("+n+"startColorstr="+e+",endColorstr="+r+")"},toString:function(t){var e=!!t;t=t||this._format;var r=!1,n=this._a<1&&this._a>=0;return e||!n||"hex"!==t&&"hex6"!==t&&"hex3"!==t&&"hex4"!==t&&"hex8"!==t&&"name"!==t?("rgb"===t&&(r=this.toRgbString()),"prgb"===t&&(r=this.toPercentageRgbString()),"hex"!==t&&"hex6"!==t||(r=this.toHexString()),"hex3"===t&&(r=this.toHexString(!0)),"hex4"===t&&(r=this.toHex8String(!0)),"hex8"===t&&(r=this.toHex8String()),"name"===t&&(r=this.toName()),"hsl"===t&&(r=this.toHslString()),"hsv"===t&&(r=this.toHsvString()),r||this.toHexString()):"name"===t&&0===this._a?this.toName():this.toRgbString()},clone:function(){return c(this.toString())},_applyModification:function(t,e){var r=t.apply(null,[this].concat([].slice.call(e)));return this._r=r._r,this._g=r._g,this._b=r._b,this.setAlpha(r._a),this},lighten:function(){return this._applyModification(v,arguments)},brighten:function(){return this._applyModification(y,arguments)},darken:function(){return this._applyModification(x,arguments)},desaturate:function(){return this._applyModification(d,arguments)},saturate:function(){return this._applyModification(g,arguments)},greyscale:function(){return this._applyModification(m,arguments)},spin:function(){return this._applyModification(b,arguments)},_applyCombination:function(t,e){return t.apply(null,[this].concat([].slice.call(e)))},analogous:function(){return this._applyCombination(A,arguments)},complement:function(){return this._applyCombination(_,arguments)},monochromatic:function(){return this._applyCombination(T,arguments)},splitcomplement:function(){return this._applyCombination(M,arguments)},triad:function(){return this._applyCombination(w,arguments)},tetrad:function(){return this._applyCombination(k,arguments)}},c.fromRatio=function(t,e){if("object"==typeof t){var r={};for(var n in t)t.hasOwnProperty(n)&&(r[n]="a"===n?t[n]:O(t[n]));t=r}return c(t,e)},c.equals=function(t,e){return!(!t||!e)&&c(t).toRgbString()==c(e).toRgbString()},c.random=function(){return c.fromRatio({r:l(),g:l(),b:l()})},c.mix=function(t,e,r){r=0===r?0:r||50;var n=c(t).toRgb(),i=c(e).toRgb(),a=r/100;return c({r:(i.r-n.r)*a+n.r,g:(i.g-n.g)*a+n.g,b:(i.b-n.b)*a+n.b,a:(i.a-n.a)*a+n.a})},c.readability=function(e,r){var n=c(e),i=c(r);return(t.max(n.getLuminance(),i.getLuminance())+.05)/(t.min(n.getLuminance(),i.getLuminance())+.05)},c.isReadable=function(t,e,r){var n,i,a=c.readability(t,e);switch(i=!1,(n=function(t){var e,r;e=((t=t||{level:"AA",size:"small"}).level||"AA").toUpperCase(),r=(t.size||"small").toLowerCase(),"AA"!==e&&"AAA"!==e&&(e="AA");"small"!==r&&"large"!==r&&(r="small");return{level:e,size:r}}(r)).level+n.size){case"AAsmall":case"AAAlarge":i=a>=4.5;break;case"AAlarge":i=a>=3;break;case"AAAsmall":i=a>=7}return i},c.mostReadable=function(t,e,r){var n,i,a,o,s=null,l=0;i=(r=r||{}).includeFallbackColors,a=r.level,o=r.size;for(var u=0;u<e.length;u++)(n=c.readability(t,e[u]))>l&&(l=n,s=c(e[u]));return c.isReadable(t,s,{level:a,size:o})||!i?s:(r.includeFallbackColors=!1,c.mostReadable(t,["#fff","#000"],r))};var S=c.names={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"0ff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000",blanchedalmond:"ffebcd",blue:"00f",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",burntsienna:"ea7e5d",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"0ff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkgrey:"a9a9a9",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkslategrey:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dimgrey:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"f0f",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",grey:"808080",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgray:"d3d3d3",lightgreen:"90ee90",lightgrey:"d3d3d3",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"789",lightslategrey:"789",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"0f0",limegreen:"32cd32",linen:"faf0e6",magenta:"f0f",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370db",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"db7093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",rebeccapurple:"663399",red:"f00",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",slategrey:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"fff",whitesmoke:"f5f5f5",yellow:"ff0",yellowgreen:"9acd32"},E=c.hexNames=function(t){var e={};for(var r in t)t.hasOwnProperty(r)&&(e[t[r]]=r);return e}(S);function C(t){return t=parseFloat(t),(isNaN(t)||t<0||t>1)&&(t=1),t}function L(e,r){(function(t){return"string"==typeof t&&-1!=t.indexOf(".")&&1===parseFloat(t)})(e)&&(e="100%");var n=function(t){return"string"==typeof t&&-1!=t.indexOf("%")}(e);return e=o(r,s(0,parseFloat(e))),n&&(e=parseInt(e*r,10)/100),t.abs(e-r)<1e-6?1:e%r/parseFloat(r)}function z(t){return o(1,s(0,t))}function P(t){return parseInt(t,16)}function I(t){return 1==t.length?"0"+t:""+t}function O(t){return t<=1&&(t=100*t+"%"),t}function D(e){return t.round(255*parseFloat(e)).toString(16)}function R(t){return P(t)/255}var B,F,N,j=(F="[\\s|\\(]+("+(B="(?:[-\\+]?\\d*\\.\\d+%?)|(?:[-\\+]?\\d+%?)")+")[,|\\s]+("+B+")[,|\\s]+("+B+")\\s*\\)?",N="[\\s|\\(]+("+B+")[,|\\s]+("+B+")[,|\\s]+("+B+")[,|\\s]+("+B+")\\s*\\)?",{CSS_UNIT:new RegExp(B),rgb:new RegExp("rgb"+F),rgba:new RegExp("rgba"+N),hsl:new RegExp("hsl"+F),hsla:new RegExp("hsla"+N),hsv:new RegExp("hsv"+F),hsva:new RegExp("hsva"+N),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/});function V(t){return!!j.CSS_UNIT.exec(t)}"undefined"!=typeof e&&e.exports?e.exports=c:window.tinycolor=c}(Math)},{}],500:[function(t,e,r){"use strict";function n(t){if(t instanceof Float32Array)return t;if("number"==typeof t)return new Float32Array([t])[0];var e=new Float32Array(t);return e.set(t),e}e.exports=n,e.exports.float32=e.exports.float=n,e.exports.fract32=e.exports.fract=function(t){if("number"==typeof t)return n(t-n(t));for(var e=n(t),r=0,i=e.length;r<i;r++)e[r]=t[r]-e[r];return e}},{}],501:[function(t,e,r){"use strict";var n=t("parse-unit");e.exports=o;var i=96;function a(t,e){var r=n(getComputedStyle(t).getPropertyValue(e));return r[0]*o(r[1],t)}function o(t,e){switch(e=e||document.body,t=(t||"px").trim().toLowerCase(),e!==window&&e!==document||(e=document.body),t){case"%":return e.clientHeight/100;case"ch":case"ex":return function(t,e){var r=document.createElement("div");r.style["font-size"]="128"+t,e.appendChild(r);var n=a(r,"font-size")/128;return e.removeChild(r),n}(t,e);case"em":return a(e,"font-size");case"rem":return a(document.body,"font-size");case"vw":return window.innerWidth/100;case"vh":return window.innerHeight/100;case"vmin":return Math.min(window.innerWidth,window.innerHeight)/100;case"vmax":return Math.max(window.innerWidth,window.innerHeight)/100;case"in":return i;case"cm":return i/2.54;case"mm":return i/25.4;case"pt":return i/72;case"pc":return i/6}return 1}},{"parse-unit":428}],502:[function(t,e,r){var n;n=this,function(t){"use strict";var e=function(t){return t},r=function(t){if(null==(r=t.transform))return e;var r,n,i,a=r.scale[0],o=r.scale[1],s=r.translate[0],l=r.translate[1];return function(t,e){return e||(n=i=0),t[0]=(n+=t[0])*a+s,t[1]=(i+=t[1])*o+l,t}},n=function(t){var e=t.bbox;function n(t){l[0]=t[0],l[1]=t[1],s(l),l[0]<c&&(c=l[0]),l[0]>h&&(h=l[0]),l[1]<u&&(u=l[1]),l[1]>f&&(f=l[1])}function i(t){switch(t.type){case"GeometryCollection":t.geometries.forEach(i);break;case"Point":n(t.coordinates);break;case"MultiPoint":t.coordinates.forEach(n)}}if(!e){var a,o,s=r(t),l=new Array(2),c=1/0,u=c,h=-c,f=-c;for(o in t.arcs.forEach(function(t){for(var e=-1,r=t.length;++e<r;)a=t[e],l[0]=a[0],l[1]=a[1],s(l,e),l[0]<c&&(c=l[0]),l[0]>h&&(h=l[0]),l[1]<u&&(u=l[1]),l[1]>f&&(f=l[1])}),t.objects)i(t.objects[o]);e=t.bbox=[c,u,h,f]}return e},i=function(t,e){for(var r,n=t.length,i=n-e;i<--n;)r=t[i],t[i++]=t[n],t[n]=r};function a(t,e){var r=e.id,n=e.bbox,i=null==e.properties?{}:e.properties,a=o(t,e);return null==r&&null==n?{type:"Feature",properties:i,geometry:a}:null==n?{type:"Feature",id:r,properties:i,geometry:a}:{type:"Feature",id:r,bbox:n,properties:i,geometry:a}}function o(t,e){var n=r(t),a=t.arcs;function o(t,e){e.length&&e.pop();for(var r=a[t<0?~t:t],o=0,s=r.length;o<s;++o)e.push(n(r[o].slice(),o));t<0&&i(e,s)}function s(t){return n(t.slice())}function l(t){for(var e=[],r=0,n=t.length;r<n;++r)o(t[r],e);return e.length<2&&e.push(e[0].slice()),e}function c(t){for(var e=l(t);e.length<4;)e.push(e[0].slice());return e}function u(t){return t.map(c)}return function t(e){var r,n=e.type;switch(n){case"GeometryCollection":return{type:n,geometries:e.geometries.map(t)};case"Point":r=s(e.coordinates);break;case"MultiPoint":r=e.coordinates.map(s);break;case"LineString":r=l(e.arcs);break;case"MultiLineString":r=e.arcs.map(l);break;case"Polygon":r=u(e.arcs);break;case"MultiPolygon":r=e.arcs.map(u);break;default:return null}return{type:n,coordinates:r}}(e)}var s=function(t,e){var r={},n={},i={},a=[],o=-1;function s(t,e){for(var n in t){var i=t[n];delete e[i.start],delete i.start,delete i.end,i.forEach(function(t){r[t<0?~t:t]=1}),a.push(i)}}return e.forEach(function(r,n){var i,a=t.arcs[r<0?~r:r];a.length<3&&!a[1][0]&&!a[1][1]&&(i=e[++o],e[o]=r,e[n]=i)}),e.forEach(function(e){var r,a,o=function(e){var r,n=t.arcs[e<0?~e:e],i=n[0];t.transform?(r=[0,0],n.forEach(function(t){r[0]+=t[0],r[1]+=t[1]})):r=n[n.length-1];return e<0?[r,i]:[i,r]}(e),s=o[0],l=o[1];if(r=i[s])if(delete i[r.end],r.push(e),r.end=l,a=n[l]){delete n[a.start];var c=a===r?r:r.concat(a);n[c.start=r.start]=i[c.end=a.end]=c}else n[r.start]=i[r.end]=r;else if(r=n[l])if(delete n[r.start],r.unshift(e),r.start=s,a=i[s]){delete i[a.end];var u=a===r?r:a.concat(r);n[u.start=a.start]=i[u.end=r.end]=u}else n[r.start]=i[r.end]=r;else n[(r=[e]).start=s]=i[r.end=l]=r}),s(i,n),s(n,i),e.forEach(function(t){r[t<0?~t:t]||a.push([t])}),a};function l(t,e,r){var n,i,a;if(arguments.length>1)n=function(t,e,r){var n,i=[],a=[];function o(t){var e=t<0?~t:t;(a[e]||(a[e]=[])).push({i:t,g:n})}function s(t){t.forEach(o)}function l(t){t.forEach(s)}return function t(e){switch(n=e,e.type){case"GeometryCollection":e.geometries.forEach(t);break;case"LineString":s(e.arcs);break;case"MultiLineString":case"Polygon":l(e.arcs);break;case"MultiPolygon":e.arcs.forEach(l)}}(e),a.forEach(null==r?function(t){i.push(t[0].i)}:function(t){r(t[0].g,t[t.length-1].g)&&i.push(t[0].i)}),i}(0,e,r);else for(i=0,n=new Array(a=t.arcs.length);i<a;++i)n[i]=i;return{type:"MultiLineString",arcs:s(t,n)}}function c(t,e){var r={},n=[],i=[];function a(t){t.forEach(function(e){e.forEach(function(e){(r[e=e<0?~e:e]||(r[e]=[])).push(t)})}),n.push(t)}function l(e){return function(t){for(var e,r=-1,n=t.length,i=t[n-1],a=0;++r<n;)e=i,i=t[r],a+=e[0]*i[1]-e[1]*i[0];return Math.abs(a)}(o(t,{type:"Polygon",arcs:[e]}).coordinates[0])}return e.forEach(function t(e){switch(e.type){case"GeometryCollection":e.geometries.forEach(t);break;case"Polygon":a(e.arcs);break;case"MultiPolygon":e.arcs.forEach(a)}}),n.forEach(function(t){if(!t._){var e=[],n=[t];for(t._=1,i.push(e);t=n.pop();)e.push(t),t.forEach(function(t){t.forEach(function(t){r[t<0?~t:t].forEach(function(t){t._||(t._=1,n.push(t))})})})}}),n.forEach(function(t){delete t._}),{type:"MultiPolygon",arcs:i.map(function(e){var n,i=[];if(e.forEach(function(t){t.forEach(function(t){t.forEach(function(t){r[t<0?~t:t].length<2&&i.push(t)})})}),(n=(i=s(t,i)).length)>1)for(var a,o,c=1,u=l(i[0]);c<n;++c)(a=l(i[c]))>u&&(o=i[0],i[0]=i[c],i[c]=o,u=a);return i})}}var u=function(t,e){for(var r=0,n=t.length;r<n;){var i=r+n>>>1;t[i]<e?r=i+1:n=i}return r};t.bbox=n,t.feature=function(t,e){return"GeometryCollection"===e.type?{type:"FeatureCollection",features:e.geometries.map(function(e){return a(t,e)})}:a(t,e)},t.mesh=function(t){return o(t,l.apply(this,arguments))},t.meshArcs=l,t.merge=function(t){return o(t,c.apply(this,arguments))},t.mergeArcs=c,t.neighbors=function(t){var e={},r=t.map(function(){return[]});function n(t,r){t.forEach(function(t){t<0&&(t=~t);var n=e[t];n?n.push(r):e[t]=[r]})}function i(t,e){t.forEach(function(t){n(t,e)})}var a={LineString:n,MultiLineString:i,Polygon:i,MultiPolygon:function(t,e){t.forEach(function(t){i(t,e)})}};for(var o in t.forEach(function t(e,r){"GeometryCollection"===e.type?e.geometries.forEach(function(e){t(e,r)}):e.type in a&&a[e.type](e.arcs,r)}),e)for(var s=e[o],l=s.length,c=0;c<l;++c)for(var h=c+1;h<l;++h){var f,p=s[c],d=s[h];(f=r[p])[o=u(f,d)]!==d&&f.splice(o,0,d),(f=r[d])[o=u(f,p)]!==p&&f.splice(o,0,p)}return r},t.quantize=function(t,e){if(!((e=Math.floor(e))>=2))throw new Error("n must be \u22652");if(t.transform)throw new Error("already quantized");var r,i=n(t),a=i[0],o=(i[2]-a)/(e-1)||1,s=i[1],l=(i[3]-s)/(e-1)||1;function c(t){t[0]=Math.round((t[0]-a)/o),t[1]=Math.round((t[1]-s)/l)}function u(t){switch(t.type){case"GeometryCollection":t.geometries.forEach(u);break;case"Point":c(t.coordinates);break;case"MultiPoint":t.coordinates.forEach(c)}}for(r in t.arcs.forEach(function(t){for(var e,r,n,i=1,c=1,u=t.length,h=t[0],f=h[0]=Math.round((h[0]-a)/o),p=h[1]=Math.round((h[1]-s)/l);i<u;++i)h=t[i],r=Math.round((h[0]-a)/o),n=Math.round((h[1]-s)/l),r===f&&n===p||((e=t[c++])[0]=r-f,f=r,e[1]=n-p,p=n);c<2&&((e=t[c++])[0]=0,e[1]=0),t.length=c}),t.objects)u(t.objects[r]);return t.transform={scale:[o,l],translate:[a,s]},t},t.transform=r,t.untransform=function(t){if(null==(r=t.transform))return e;var r,n,i,a=r.scale[0],o=r.scale[1],s=r.translate[0],l=r.translate[1];return function(t,e){e||(n=i=0);var r=Math.round((t[0]-s)/a),c=Math.round((t[1]-l)/o);return t[0]=r-n,n=r,t[1]=c-i,i=c,t}},Object.defineProperty(t,"__esModule",{value:!0})}("object"==typeof r&&"undefined"!=typeof e?r:n.topojson=n.topojson||{})},{}],503:[function(t,e,r){"use strict";e.exports=function(t){if(t<0)return[];if(0===t)return[[0]];for(var e=0|Math.round(a(t+1)),r=[],o=0;o<e;++o){for(var s=n.unrank(t,o),l=[0],c=0,u=0;u<s.length;++u)c+=1<<s[u],l.push(c);i(s)<1&&(l[0]=c,l[t]=0),r.push(l)}return r};var n=t("permutation-rank"),i=t("permutation-parity"),a=t("gamma")},{gamma:220,"permutation-parity":430,"permutation-rank":431}],504:[function(t,e,r){"use strict";e.exports=function(t){var e=(t=t||{}).center||[0,0,0],r=t.up||[0,1,0],n=t.right||h(r),i=t.radius||1,a=t.theta||0,u=t.phi||0;if(e=[].slice.call(e,0,3),r=[].slice.call(r,0,3),s(r,r),n=[].slice.call(n,0,3),s(n,n),"eye"in t){var p=t.eye,d=[p[0]-e[0],p[1]-e[1],p[2]-e[2]];o(n,d,r),c(n[0],n[1],n[2])<1e-6?n=h(r):s(n,n),i=c(d[0],d[1],d[2]);var g=l(r,d)/i,m=l(n,d)/i;u=Math.acos(g),a=Math.acos(m)}return i=Math.log(i),new f(t.zoomMin,t.zoomMax,e,r,n,i,a,u)};var n=t("filtered-vector"),i=t("gl-mat4/invert"),a=t("gl-mat4/rotate"),o=t("gl-vec3/cross"),s=t("gl-vec3/normalize"),l=t("gl-vec3/dot");function c(t,e,r){return Math.sqrt(Math.pow(t,2)+Math.pow(e,2)+Math.pow(r,2))}function u(t){return Math.min(1,Math.max(-1,t))}function h(t){var e=Math.abs(t[0]),r=Math.abs(t[1]),n=Math.abs(t[2]),i=[0,0,0];e>Math.max(r,n)?i[2]=1:r>Math.max(e,n)?i[0]=1:i[1]=1;for(var a=0,o=0,l=0;l<3;++l)a+=t[l]*t[l],o+=i[l]*t[l];for(l=0;l<3;++l)i[l]-=o/a*t[l];return s(i,i),i}function f(t,e,r,i,a,o,s,l){this.center=n(r),this.up=n(i),this.right=n(a),this.radius=n([o]),this.angle=n([s,l]),this.angle.bounds=[[-1/0,-Math.PI/2],[1/0,Math.PI/2]],this.setDistanceLimits(t,e),this.computedCenter=this.center.curve(0),this.computedUp=this.up.curve(0),this.computedRight=this.right.curve(0),this.computedRadius=this.radius.curve(0),this.computedAngle=this.angle.curve(0),this.computedToward=[0,0,0],this.computedEye=[0,0,0],this.computedMatrix=new Array(16);for(var c=0;c<16;++c)this.computedMatrix[c]=.5;this.recalcMatrix(0)}var p=f.prototype;p.setDistanceLimits=function(t,e){t=t>0?Math.log(t):-1/0,e=e>0?Math.log(e):1/0,e=Math.max(e,t),this.radius.bounds[0][0]=t,this.radius.bounds[1][0]=e},p.getDistanceLimits=function(t){var e=this.radius.bounds[0];return t?(t[0]=Math.exp(e[0][0]),t[1]=Math.exp(e[1][0]),t):[Math.exp(e[0][0]),Math.exp(e[1][0])]},p.recalcMatrix=function(t){this.center.curve(t),this.up.curve(t),this.right.curve(t),this.radius.curve(t),this.angle.curve(t);for(var e=this.computedUp,r=this.computedRight,n=0,i=0,a=0;a<3;++a)i+=e[a]*r[a],n+=e[a]*e[a];var l=Math.sqrt(n),u=0;for(a=0;a<3;++a)r[a]-=e[a]*i/n,u+=r[a]*r[a],e[a]/=l;var h=Math.sqrt(u);for(a=0;a<3;++a)r[a]/=h;var f=this.computedToward;o(f,e,r),s(f,f);var p=Math.exp(this.computedRadius[0]),d=this.computedAngle[0],g=this.computedAngle[1],m=Math.cos(d),v=Math.sin(d),y=Math.cos(g),x=Math.sin(g),b=this.computedCenter,_=m*y,w=v*y,k=x,M=-m*x,A=-v*x,T=y,S=this.computedEye,E=this.computedMatrix;for(a=0;a<3;++a){var C=_*r[a]+w*f[a]+k*e[a];E[4*a+1]=M*r[a]+A*f[a]+T*e[a],E[4*a+2]=C,E[4*a+3]=0}var L=E[1],z=E[5],P=E[9],I=E[2],O=E[6],D=E[10],R=z*D-P*O,B=P*I-L*D,F=L*O-z*I,N=c(R,B,F);R/=N,B/=N,F/=N,E[0]=R,E[4]=B,E[8]=F;for(a=0;a<3;++a)S[a]=b[a]+E[2+4*a]*p;for(a=0;a<3;++a){u=0;for(var j=0;j<3;++j)u+=E[a+4*j]*S[j];E[12+a]=-u}E[15]=1},p.getMatrix=function(t,e){this.recalcMatrix(t);var r=this.computedMatrix;if(e){for(var n=0;n<16;++n)e[n]=r[n];return e}return r};var d=[0,0,0];p.rotate=function(t,e,r,n){if(this.angle.move(t,e,r),n){this.recalcMatrix(t);var i=this.computedMatrix;d[0]=i[2],d[1]=i[6],d[2]=i[10];for(var o=this.computedUp,s=this.computedRight,l=this.computedToward,c=0;c<3;++c)i[4*c]=o[c],i[4*c+1]=s[c],i[4*c+2]=l[c];a(i,i,n,d);for(c=0;c<3;++c)o[c]=i[4*c],s[c]=i[4*c+1];this.up.set(t,o[0],o[1],o[2]),this.right.set(t,s[0],s[1],s[2])}},p.pan=function(t,e,r,n){e=e||0,r=r||0,n=n||0,this.recalcMatrix(t);var i=this.computedMatrix,a=(Math.exp(this.computedRadius[0]),i[1]),o=i[5],s=i[9],l=c(a,o,s);a/=l,o/=l,s/=l;var u=i[0],h=i[4],f=i[8],p=u*a+h*o+f*s,d=c(u-=a*p,h-=o*p,f-=s*p),g=(u/=d)*e+a*r,m=(h/=d)*e+o*r,v=(f/=d)*e+s*r;this.center.move(t,g,m,v);var y=Math.exp(this.computedRadius[0]);y=Math.max(1e-4,y+n),this.radius.set(t,Math.log(y))},p.translate=function(t,e,r,n){this.center.move(t,e||0,r||0,n||0)},p.setMatrix=function(t,e,r,n){var a=1;"number"==typeof r&&(a=0|r),(a<0||a>3)&&(a=1);var o=(a+2)%3;e||(this.recalcMatrix(t),e=this.computedMatrix);var s=e[a],l=e[a+4],h=e[a+8];if(n){var f=Math.abs(s),p=Math.abs(l),d=Math.abs(h),g=Math.max(f,p,d);f===g?(s=s<0?-1:1,l=h=0):d===g?(h=h<0?-1:1,s=l=0):(l=l<0?-1:1,s=h=0)}else{var m=c(s,l,h);s/=m,l/=m,h/=m}var v,y,x=e[o],b=e[o+4],_=e[o+8],w=x*s+b*l+_*h,k=c(x-=s*w,b-=l*w,_-=h*w),M=l*(_/=k)-h*(b/=k),A=h*(x/=k)-s*_,T=s*b-l*x,S=c(M,A,T);if(M/=S,A/=S,T/=S,this.center.jump(t,H,G,W),this.radius.idle(t),this.up.jump(t,s,l,h),this.right.jump(t,x,b,_),2===a){var E=e[1],C=e[5],L=e[9],z=E*x+C*b+L*_,P=E*M+C*A+L*T;v=R<0?-Math.PI/2:Math.PI/2,y=Math.atan2(P,z)}else{var I=e[2],O=e[6],D=e[10],R=I*s+O*l+D*h,B=I*x+O*b+D*_,F=I*M+O*A+D*T;v=Math.asin(u(R)),y=Math.atan2(F,B)}this.angle.jump(t,y,v),this.recalcMatrix(t);var N=e[2],j=e[6],V=e[10],U=this.computedMatrix;i(U,e);var q=U[15],H=U[12]/q,G=U[13]/q,W=U[14]/q,Y=Math.exp(this.computedRadius[0]);this.center.jump(t,H-N*Y,G-j*Y,W-V*Y)},p.lastT=function(){return Math.max(this.center.lastT(),this.up.lastT(),this.right.lastT(),this.radius.lastT(),this.angle.lastT())},p.idle=function(t){this.center.idle(t),this.up.idle(t),this.right.idle(t),this.radius.idle(t),this.angle.idle(t)},p.flush=function(t){this.center.flush(t),this.up.flush(t),this.right.flush(t),this.radius.flush(t),this.angle.flush(t)},p.setDistance=function(t,e){e>0&&this.radius.set(t,Math.log(e))},p.lookAt=function(t,e,r,n){this.recalcMatrix(t),e=e||this.computedEye,r=r||this.computedCenter;var i=(n=n||this.computedUp)[0],a=n[1],o=n[2],s=c(i,a,o);if(!(s<1e-6)){i/=s,a/=s,o/=s;var l=e[0]-r[0],h=e[1]-r[1],f=e[2]-r[2],p=c(l,h,f);if(!(p<1e-6)){l/=p,h/=p,f/=p;var d=this.computedRight,g=d[0],m=d[1],v=d[2],y=i*g+a*m+o*v,x=c(g-=y*i,m-=y*a,v-=y*o);if(!(x<.01&&(x=c(g=a*f-o*h,m=o*l-i*f,v=i*h-a*l))<1e-6)){g/=x,m/=x,v/=x,this.up.set(t,i,a,o),this.right.set(t,g,m,v),this.center.set(t,r[0],r[1],r[2]),this.radius.set(t,Math.log(p));var b=a*v-o*m,_=o*g-i*v,w=i*m-a*g,k=c(b,_,w),M=i*l+a*h+o*f,A=g*l+m*h+v*f,T=(b/=k)*l+(_/=k)*h+(w/=k)*f,S=Math.asin(u(M)),E=Math.atan2(T,A),C=this.angle._state,L=C[C.length-1],z=C[C.length-2];L%=2*Math.PI;var P=Math.abs(L+2*Math.PI-E),I=Math.abs(L-E),O=Math.abs(L-2*Math.PI-E);P<I&&(L+=2*Math.PI),O<I&&(L-=2*Math.PI),this.angle.jump(this.angle.lastT(),L,z),this.angle.set(t,E,S)}}}}},{"filtered-vector":215,"gl-mat4/invert":254,"gl-mat4/rotate":258,"gl-vec3/cross":314,"gl-vec3/dot":317,"gl-vec3/normalize":328}],505:[function(t,e,r){"use strict";e.exports=function(t,e,r){var i=t*e,a=n*t,o=a-(a-t),s=t-o,l=n*e,c=l-(l-e),u=e-c,h=s*u-(i-o*c-s*c-o*u);if(r)return r[0]=h,r[1]=i,r;return[h,i]};var n=+(Math.pow(2,27)+1)},{}],506:[function(t,e,r){"use strict";e.exports=function(t,e,r){var n=t+e,i=n-t,a=e-i,o=t-(n-i);if(r)return r[0]=o+a,r[1]=n,r;return[o+a,n]}},{}],507:[function(t,e,r){(function(e,n){"use strict";var i=t("bit-twiddle"),a=t("dup");e.__TYPEDARRAY_POOL||(e.__TYPEDARRAY_POOL={UINT8:a([32,0]),UINT16:a([32,0]),UINT32:a([32,0]),INT8:a([32,0]),INT16:a([32,0]),INT32:a([32,0]),FLOAT:a([32,0]),DOUBLE:a([32,0]),DATA:a([32,0]),UINT8C:a([32,0]),BUFFER:a([32,0])});var o="undefined"!=typeof Uint8ClampedArray,s=e.__TYPEDARRAY_POOL;s.UINT8C||(s.UINT8C=a([32,0])),s.BUFFER||(s.BUFFER=a([32,0]));var l=s.DATA,c=s.BUFFER;function u(t){if(t){var e=t.length||t.byteLength,r=i.log2(e);l[r].push(t)}}function h(t){t=i.nextPow2(t);var e=i.log2(t),r=l[e];return r.length>0?r.pop():new ArrayBuffer(t)}function f(t){return new Uint8Array(h(t),0,t)}function p(t){return new Uint16Array(h(2*t),0,t)}function d(t){return new Uint32Array(h(4*t),0,t)}function g(t){return new Int8Array(h(t),0,t)}function m(t){return new Int16Array(h(2*t),0,t)}function v(t){return new Int32Array(h(4*t),0,t)}function y(t){return new Float32Array(h(4*t),0,t)}function x(t){return new Float64Array(h(8*t),0,t)}function b(t){return o?new Uint8ClampedArray(h(t),0,t):f(t)}function _(t){return new DataView(h(t),0,t)}function w(t){t=i.nextPow2(t);var e=i.log2(t),r=c[e];return r.length>0?r.pop():new n(t)}r.free=function(t){if(n.isBuffer(t))c[i.log2(t.length)].push(t);else{if("[object ArrayBuffer]"!==Object.prototype.toString.call(t)&&(t=t.buffer),!t)return;var e=t.length||t.byteLength,r=0|i.log2(e);l[r].push(t)}},r.freeUint8=r.freeUint16=r.freeUint32=r.freeInt8=r.freeInt16=r.freeInt32=r.freeFloat32=r.freeFloat=r.freeFloat64=r.freeDouble=r.freeUint8Clamped=r.freeDataView=function(t){u(t.buffer)},r.freeArrayBuffer=u,r.freeBuffer=function(t){c[i.log2(t.length)].push(t)},r.malloc=function(t,e){if(void 0===e||"arraybuffer"===e)return h(t);switch(e){case"uint8":return f(t);case"uint16":return p(t);case"uint32":return d(t);case"int8":return g(t);case"int16":return m(t);case"int32":return v(t);case"float":case"float32":return y(t);case"double":case"float64":return x(t);case"uint8_clamped":return b(t);case"buffer":return w(t);case"data":case"dataview":return _(t);default:return null}return null},r.mallocArrayBuffer=h,r.mallocUint8=f,r.mallocUint16=p,r.mallocUint32=d,r.mallocInt8=g,r.mallocInt16=m,r.mallocInt32=v,r.mallocFloat32=r.mallocFloat=y,r.mallocFloat64=r.mallocDouble=x,r.mallocUint8Clamped=b,r.mallocDataView=_,r.mallocBuffer=w,r.clearCache=function(){for(var t=0;t<32;++t)s.UINT8[t].length=0,s.UINT16[t].length=0,s.UINT32[t].length=0,s.INT8[t].length=0,s.INT16[t].length=0,s.INT32[t].length=0,s.FLOAT[t].length=0,s.DOUBLE[t].length=0,s.UINT8C[t].length=0,l[t].length=0,c[t].length=0}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{},t("buffer").Buffer)},{"bit-twiddle":80,buffer:92,dup:154}],508:[function(t,e,r){"use strict";"use restrict";function n(t){this.roots=new Array(t),this.ranks=new Array(t);for(var e=0;e<t;++e)this.roots[e]=e,this.ranks[e]=0}e.exports=n;var i=n.prototype;Object.defineProperty(i,"length",{get:function(){return this.roots.length}}),i.makeSet=function(){var t=this.roots.length;return this.roots.push(t),this.ranks.push(0),t},i.find=function(t){for(var e=t,r=this.roots;r[t]!==t;)t=r[t];for(;r[e]!==t;){var n=r[e];r[e]=t,e=n}return t},i.link=function(t,e){var r=this.find(t),n=this.find(e);if(r!==n){var i=this.ranks,a=this.roots,o=i[r],s=i[n];o<s?a[r]=n:s<o?a[n]=r:(a[n]=r,++i[r])}}},{}],509:[function(t,e,r){"use strict";e.exports=function(t,e,r){return 0===t.length?t:e?(r||t.sort(e),function(t,e){for(var r=1,n=t.length,i=t[0],a=t[0],o=1;o<n;++o)if(a=i,e(i=t[o],a)){if(o===r){r++;continue}t[r++]=i}return t.length=r,t}(t,e)):(r||t.sort(),function(t){for(var e=1,r=t.length,n=t[0],i=t[0],a=1;a<r;++a,i=n)if(i=n,(n=t[a])!==i){if(a===e){e++;continue}t[e++]=n}return t.length=e,t}(t))}},{}],510:[function(t,e,r){var n=/[\'\"]/;e.exports=function(t){return t?(n.test(t.charAt(0))&&(t=t.substr(1)),n.test(t.charAt(t.length-1))&&(t=t.substr(0,t.length-1)),t):""}},{}],511:[function(t,e,r){"use strict";e.exports=function(t,e,r){Array.isArray(r)||(r=[].slice.call(arguments,2));for(var n=0,i=r.length;n<i;n++){var a=r[n];for(var o in a)if((void 0===e[o]||Array.isArray(e[o])||t[o]!==e[o])&&o in e){var s;if(!0===a[o])s=e[o];else{if(!1===a[o])continue;if("function"==typeof a[o]&&void 0===(s=a[o](e[o],t,e)))continue}t[o]=s}}return t}},{}],512:[function(t,e,r){"function"==typeof Object.create?e.exports=function(t,e){t.super_=e,t.prototype=Object.create(e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}})}:e.exports=function(t,e){t.super_=e;var r=function(){};r.prototype=e.prototype,t.prototype=new r,t.prototype.constructor=t}},{}],513:[function(t,e,r){e.exports=function(t){return t&&"object"==typeof t&&"function"==typeof t.copy&&"function"==typeof t.fill&&"function"==typeof t.readUInt8}},{}],514:[function(t,e,r){(function(e,n){var i=/%[sdj%]/g;r.format=function(t){if(!v(t)){for(var e=[],r=0;r<arguments.length;r++)e.push(s(arguments[r]));return e.join(" ")}r=1;for(var n=arguments,a=n.length,o=String(t).replace(i,function(t){if("%%"===t)return"%";if(r>=a)return t;switch(t){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(t){return"[Circular]"}default:return t}}),l=n[r];r<a;l=n[++r])g(l)||!b(l)?o+=" "+l:o+=" "+s(l);return o},r.deprecate=function(t,i){if(y(n.process))return function(){return r.deprecate(t,i).apply(this,arguments)};if(!0===e.noDeprecation)return t;var a=!1;return function(){if(!a){if(e.throwDeprecation)throw new Error(i);e.traceDeprecation?console.trace(i):console.error(i),a=!0}return t.apply(this,arguments)}};var a,o={};function s(t,e){var n={seen:[],stylize:c};return arguments.length>=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),d(e)?n.showHidden=e:e&&r._extend(n,e),y(n.showHidden)&&(n.showHidden=!1),y(n.depth)&&(n.depth=2),y(n.colors)&&(n.colors=!1),y(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=l),u(n,t,n.depth)}function l(t,e){var r=s.styles[e];return r?"\x1b["+s.colors[r][0]+"m"+t+"\x1b["+s.colors[r][1]+"m":t}function c(t,e){return t}function u(t,e,n){if(t.customInspect&&e&&k(e.inspect)&&e.inspect!==r.inspect&&(!e.constructor||e.constructor.prototype!==e)){var i=e.inspect(n,t);return v(i)||(i=u(t,i,n)),i}var a=function(t,e){if(y(e))return t.stylize("undefined","undefined");if(v(e)){var r="'"+JSON.stringify(e).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return t.stylize(r,"string")}if(m(e))return t.stylize(""+e,"number");if(d(e))return t.stylize(""+e,"boolean");if(g(e))return t.stylize("null","null")}(t,e);if(a)return a;var o=Object.keys(e),s=function(t){var e={};return t.forEach(function(t,r){e[t]=!0}),e}(o);if(t.showHidden&&(o=Object.getOwnPropertyNames(e)),w(e)&&(o.indexOf("message")>=0||o.indexOf("description")>=0))return h(e);if(0===o.length){if(k(e)){var l=e.name?": "+e.name:"";return t.stylize("[Function"+l+"]","special")}if(x(e))return t.stylize(RegExp.prototype.toString.call(e),"regexp");if(_(e))return t.stylize(Date.prototype.toString.call(e),"date");if(w(e))return h(e)}var c,b="",M=!1,A=["{","}"];(p(e)&&(M=!0,A=["[","]"]),k(e))&&(b=" [Function"+(e.name?": "+e.name:"")+"]");return x(e)&&(b=" "+RegExp.prototype.toString.call(e)),_(e)&&(b=" "+Date.prototype.toUTCString.call(e)),w(e)&&(b=" "+h(e)),0!==o.length||M&&0!=e.length?n<0?x(e)?t.stylize(RegExp.prototype.toString.call(e),"regexp"):t.stylize("[Object]","special"):(t.seen.push(e),c=M?function(t,e,r,n,i){for(var a=[],o=0,s=e.length;o<s;++o)S(e,String(o))?a.push(f(t,e,r,n,String(o),!0)):a.push("");return i.forEach(function(i){i.match(/^\d+$/)||a.push(f(t,e,r,n,i,!0))}),a}(t,e,n,s,o):o.map(function(r){return f(t,e,n,s,r,M)}),t.seen.pop(),function(t,e,r){if(t.reduce(function(t,e){return 0,e.indexOf("\n")>=0&&0,t+e.replace(/\u001b\[\d\d?m/g,"").length+1},0)>60)return r[0]+(""===e?"":e+"\n ")+" "+t.join(",\n  ")+" "+r[1];return r[0]+e+" "+t.join(", ")+" "+r[1]}(c,b,A)):A[0]+b+A[1]}function h(t){return"["+Error.prototype.toString.call(t)+"]"}function f(t,e,r,n,i,a){var o,s,l;if((l=Object.getOwnPropertyDescriptor(e,i)||{value:e[i]}).get?s=l.set?t.stylize("[Getter/Setter]","special"):t.stylize("[Getter]","special"):l.set&&(s=t.stylize("[Setter]","special")),S(n,i)||(o="["+i+"]"),s||(t.seen.indexOf(l.value)<0?(s=g(r)?u(t,l.value,null):u(t,l.value,r-1)).indexOf("\n")>-1&&(s=a?s.split("\n").map(function(t){return"  "+t}).join("\n").substr(2):"\n"+s.split("\n").map(function(t){return"   "+t}).join("\n")):s=t.stylize("[Circular]","special")),y(o)){if(a&&i.match(/^\d+$/))return s;(o=JSON.stringify(""+i)).match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(o=o.substr(1,o.length-2),o=t.stylize(o,"name")):(o=o.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),o=t.stylize(o,"string"))}return o+": "+s}function p(t){return Array.isArray(t)}function d(t){return"boolean"==typeof t}function g(t){return null===t}function m(t){return"number"==typeof t}function v(t){return"string"==typeof t}function y(t){return void 0===t}function x(t){return b(t)&&"[object RegExp]"===M(t)}function b(t){return"object"==typeof t&&null!==t}function _(t){return b(t)&&"[object Date]"===M(t)}function w(t){return b(t)&&("[object Error]"===M(t)||t instanceof Error)}function k(t){return"function"==typeof t}function M(t){return Object.prototype.toString.call(t)}function A(t){return t<10?"0"+t.toString(10):t.toString(10)}r.debuglog=function(t){if(y(a)&&(a=e.env.NODE_DEBUG||""),t=t.toUpperCase(),!o[t])if(new RegExp("\\b"+t+"\\b","i").test(a)){var n=e.pid;o[t]=function(){var e=r.format.apply(r,arguments);console.error("%s %d: %s",t,n,e)}}else o[t]=function(){};return o[t]},r.inspect=s,s.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},s.styles={special:"cyan",number:"yellow",boolean:"yellow",undefined:"grey",null:"bold",string:"green",date:"magenta",regexp:"red"},r.isArray=p,r.isBoolean=d,r.isNull=g,r.isNullOrUndefined=function(t){return null==t},r.isNumber=m,r.isString=v,r.isSymbol=function(t){return"symbol"==typeof t},r.isUndefined=y,r.isRegExp=x,r.isObject=b,r.isDate=_,r.isError=w,r.isFunction=k,r.isPrimitive=function(t){return null===t||"boolean"==typeof t||"number"==typeof t||"string"==typeof t||"symbol"==typeof t||"undefined"==typeof t},r.isBuffer=t("./support/isBuffer");var T=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];function S(t,e){return Object.prototype.hasOwnProperty.call(t,e)}r.log=function(){var t,e;console.log("%s - %s",(t=new Date,e=[A(t.getHours()),A(t.getMinutes()),A(t.getSeconds())].join(":"),[t.getDate(),T[t.getMonth()],e].join(" ")),r.format.apply(r,arguments))},r.inherits=t("inherits"),r._extend=function(t,e){if(!e||!b(e))return t;for(var r=Object.keys(e),n=r.length;n--;)t[r[n]]=e[r[n]];return t}}).call(this,t("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./support/isBuffer":513,_process:449,inherits:512}],515:[function(t,e,r){"use strict";e.exports=function(t,e){"object"==typeof e&&null!==e||(e={});return n(t,e.canvas||i,e.context||a,e)};var n=t("./lib/vtext"),i=null,a=null;"undefined"!=typeof document&&((i=document.createElement("canvas")).width=8192,i.height=1024,a=i.getContext("2d"))},{"./lib/vtext":516}],516:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){var a=n.size||64,o=n.font||"normal";return r.font=a+"px "+o,r.textAlign="start",r.textBaseline="alphabetic",r.direction="ltr",h(function(t,e,r,n){var a=0|Math.ceil(e.measureText(r).width+2*n);if(a>8192)throw new Error("vectorize-text: String too long (sorry, this will get fixed later)");var o=3*n;t.height<o&&(t.height=o),e.fillStyle="#000",e.fillRect(0,0,t.width,t.height),e.fillStyle="#fff",e.fillText(r,n,2*n);var s=e.getImageData(0,0,a,o);return i(s.data,[o,a,4]).pick(-1,-1,0).transpose(1,0)}(e,r,t,a),n,a)},e.exports.processPixels=h;var n=t("surface-nets"),i=t("ndarray"),a=t("simplify-planar-graph"),o=t("clean-pslg"),s=t("cdt2d"),l=t("planar-graph-to-polyline");function c(t,e){var r=n(t,128);return e?a(r.cells,r.positions,.25):{edges:r.cells,positions:r.positions}}function u(t,e,r,n){var i=c(t,n),a=function(t,e,r){for(var n=e.textAlign||"start",i=e.textBaseline||"alphabetic",a=[1<<30,1<<30],o=[0,0],s=t.length,l=0;l<s;++l)for(var c=t[l],u=0;u<2;++u)a[u]=0|Math.min(a[u],c[u]),o[u]=0|Math.max(o[u],c[u]);var h=0;switch(n){case"center":h=-.5*(a[0]+o[0]);break;case"right":case"end":h=-o[0];break;case"left":case"start":h=-a[0];break;default:throw new Error("vectorize-text: Unrecognized textAlign: '"+n+"'")}var f=0;switch(i){case"hanging":case"top":f=-a[1];break;case"middle":f=-.5*(a[1]+o[1]);break;case"alphabetic":case"ideographic":f=-3*r;break;case"bottom":f=-o[1];break;default:throw new Error("vectorize-text: Unrecoginized textBaseline: '"+i+"'")}var p=1/r;return"lineHeight"in e?p*=+e.lineHeight:"width"in e?p=e.width/(o[0]-a[0]):"height"in e&&(p=e.height/(o[1]-a[1])),t.map(function(t){return[p*(t[0]+h),p*(t[1]+f)]})}(i.positions,e,r),u=i.edges,h="ccw"===e.orientation;if(o(a,u),e.polygons||e.polygon||e.polyline){for(var f=l(u,a),p=new Array(f.length),d=0;d<f.length;++d){for(var g=f[d],m=new Array(g.length),v=0;v<g.length;++v){for(var y=g[v],x=new Array(y.length),b=0;b<y.length;++b)x[b]=a[y[b]].slice();h&&x.reverse(),m[v]=x}p[d]=m}return p}return e.triangles||e.triangulate||e.triangle?{cells:s(a,u,{delaunay:!1,exterior:!1,interior:!0}),positions:a}:{edges:u,positions:a}}function h(t,e,r){try{return u(t,e,r,!0)}catch(t){}try{return u(t,e,r,!1)}catch(t){}return e.polygons||e.polyline||e.polygon?[]:e.triangles||e.triangulate||e.triangle?{cells:[],positions:[]}:{edges:[],positions:[]}}},{cdt2d:93,"clean-pslg":103,ndarray:417,"planar-graph-to-polyline":435,"simplify-planar-graph":485,"surface-nets":493}],517:[function(t,e,r){!function(){"use strict";if("undefined"==typeof ses||!ses.ok||ses.ok()){"undefined"!=typeof ses&&(ses.weakMapPermitHostObjects=m);var t=!1;if("function"==typeof WeakMap){var r=WeakMap;if("undefined"!=typeof navigator&&/Firefox/.test(navigator.userAgent));else{var n=new r,i=Object.freeze({});if(n.set(i,1),1===n.get(i))return void(e.exports=WeakMap);t=!0}}Object.prototype.hasOwnProperty;var a=Object.getOwnPropertyNames,o=Object.defineProperty,s=Object.isExtensible,l="weakmap:",c=l+"ident:"+Math.random()+"___";if("undefined"!=typeof crypto&&"function"==typeof crypto.getRandomValues&&"function"==typeof ArrayBuffer&&"function"==typeof Uint8Array){var u=new ArrayBuffer(25),h=new Uint8Array(u);crypto.getRandomValues(h),c=l+"rand:"+Array.prototype.map.call(h,function(t){return(t%36).toString(36)}).join("")+"___"}if(o(Object,"getOwnPropertyNames",{value:function(t){return a(t).filter(v)}}),"getPropertyNames"in Object){var f=Object.getPropertyNames;o(Object,"getPropertyNames",{value:function(t){return f(t).filter(v)}})}!function(){var t=Object.freeze;o(Object,"freeze",{value:function(e){return y(e),t(e)}});var e=Object.seal;o(Object,"seal",{value:function(t){return y(t),e(t)}});var r=Object.preventExtensions;o(Object,"preventExtensions",{value:function(t){return y(t),r(t)}})}();var p=!1,d=0,g=function(){this instanceof g||b();var t=[],e=[],r=d++;return Object.create(g.prototype,{get___:{value:x(function(n,i){var a,o=y(n);return o?r in o?o[r]:i:(a=t.indexOf(n))>=0?e[a]:i})},has___:{value:x(function(e){var n=y(e);return n?r in n:t.indexOf(e)>=0})},set___:{value:x(function(n,i){var a,o=y(n);return o?o[r]=i:(a=t.indexOf(n))>=0?e[a]=i:(a=t.length,e[a]=i,t[a]=n),this})},delete___:{value:x(function(n){var i,a,o=y(n);return o?r in o&&delete o[r]:!((i=t.indexOf(n))<0||(a=t.length-1,t[i]=void 0,e[i]=e[a],t[i]=t[a],t.length=a,e.length=a,0))})}})};g.prototype=Object.create(Object.prototype,{get:{value:function(t,e){return this.get___(t,e)},writable:!0,configurable:!0},has:{value:function(t){return this.has___(t)},writable:!0,configurable:!0},set:{value:function(t,e){return this.set___(t,e)},writable:!0,configurable:!0},delete:{value:function(t){return this.delete___(t)},writable:!0,configurable:!0}}),"function"==typeof r?function(){function n(){this instanceof g||b();var e,n=new r,i=void 0,a=!1;return e=t?function(t,e){return n.set(t,e),n.has(t)||(i||(i=new g),i.set(t,e)),this}:function(t,e){if(a)try{n.set(t,e)}catch(r){i||(i=new g),i.set___(t,e)}else n.set(t,e);return this},Object.create(g.prototype,{get___:{value:x(function(t,e){return i?n.has(t)?n.get(t):i.get___(t,e):n.get(t,e)})},has___:{value:x(function(t){return n.has(t)||!!i&&i.has___(t)})},set___:{value:x(e)},delete___:{value:x(function(t){var e=!!n.delete(t);return i&&i.delete___(t)||e})},permitHostObjects___:{value:x(function(t){if(t!==m)throw new Error("bogus call to permitHostObjects___");a=!0})}})}t&&"undefined"!=typeof Proxy&&(Proxy=void 0),n.prototype=g.prototype,e.exports=n,Object.defineProperty(WeakMap.prototype,"constructor",{value:WeakMap,enumerable:!1,configurable:!0,writable:!0})}():("undefined"!=typeof Proxy&&(Proxy=void 0),e.exports=g)}function m(t){t.permitHostObjects___&&t.permitHostObjects___(m)}function v(t){return!(t.substr(0,l.length)==l&&"___"===t.substr(t.length-3))}function y(t){if(t!==Object(t))throw new TypeError("Not an object: "+t);var e=t[c];if(e&&e.key===t)return e;if(s(t)){e={key:t};try{return o(t,c,{value:e,writable:!1,enumerable:!1,configurable:!1}),e}catch(t){return}}}function x(t){return t.prototype=null,Object.freeze(t)}function b(){p||"undefined"==typeof console||(p=!0,console.warn("WeakMap should be invoked as new WeakMap(), not WeakMap(). This will be an error in the future."))}}()},{}],518:[function(t,e,r){var n=t("./hidden-store.js");e.exports=function(){var t={};return function(e){if(("object"!=typeof e||null===e)&&"function"!=typeof e)throw new Error("Weakmap-shim: Key must be object");var r=e.valueOf(t);return r&&r.identity===t?r:n(e,t)}}},{"./hidden-store.js":519}],519:[function(t,e,r){e.exports=function(t,e){var r={identity:e},n=t.valueOf;return Object.defineProperty(t,"valueOf",{value:function(t){return t!==e?n.apply(this,arguments):r},writable:!0}),r}},{}],520:[function(t,e,r){var n=t("./create-store.js");e.exports=function(){var t=n();return{get:function(e,r){var n=t(e);return n.hasOwnProperty("value")?n.value:r},set:function(e,r){return t(e).value=r,this},has:function(e){return"value"in t(e)},delete:function(e){return delete t(e).value}}}},{"./create-store.js":518}],521:[function(t,e,r){var n=t("get-canvas-context");e.exports=function(t){return n("webgl",t)}},{"get-canvas-context":221}],522:[function(t,e,r){var n=t("../main"),i=t("object-assign"),a=n.instance();function o(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}o.prototype=new n.baseCalendar,i(o.prototype,{name:"Chinese",jdEpoch:1721425.5,hasYearZero:!1,minMonth:0,firstMonth:0,minDay:1,regionalOptions:{"":{name:"Chinese",epochs:["BEC","EC"],monthNumbers:function(t,e){if("string"==typeof t){var r=t.match(l);return r?r[0]:""}var n=this._validateYear(t),i=t.month(),a=""+this.toChineseMonth(n,i);return e&&a.length<2&&(a="0"+a),this.isIntercalaryMonth(n,i)&&(a+="i"),a},monthNames:function(t){if("string"==typeof t){var e=t.match(c);return e?e[0]:""}var r=this._validateYear(t),n=t.month(),i=["\u4e00\u6708","\u4e8c\u6708","\u4e09\u6708","\u56db\u6708","\u4e94\u6708","\u516d\u6708","\u4e03\u6708","\u516b\u6708","\u4e5d\u6708","\u5341\u6708","\u5341\u4e00\u6708","\u5341\u4e8c\u6708"][this.toChineseMonth(r,n)-1];return this.isIntercalaryMonth(r,n)&&(i="\u95f0"+i),i},monthNamesShort:function(t){if("string"==typeof t){var e=t.match(u);return e?e[0]:""}var r=this._validateYear(t),n=t.month(),i=["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"][this.toChineseMonth(r,n)-1];return this.isIntercalaryMonth(r,n)&&(i="\u95f0"+i),i},parseMonth:function(t,e){t=this._validateYear(t);var r,n=parseInt(e);if(isNaN(n))"\u95f0"===e[0]&&(r=!0,e=e.substring(1)),"\u6708"===e[e.length-1]&&(e=e.substring(0,e.length-1)),n=1+["\u4e00","\u4e8c","\u4e09","\u56db","\u4e94","\u516d","\u4e03","\u516b","\u4e5d","\u5341","\u5341\u4e00","\u5341\u4e8c"].indexOf(e);else{var i=e[e.length-1];r="i"===i||"I"===i}return this.toMonthIndex(t,n,r)},dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],digits:null,dateFormat:"yyyy/mm/dd",firstDay:1,isRTL:!1}},_validateYear:function(t,e){if(t.year&&(t=t.year()),"number"!=typeof t||t<1888||t>2111)throw e.replace(/\{0\}/,this.local.name);return t},toMonthIndex:function(t,e,r){var i=this.intercalaryMonth(t);if(r&&e!==i||e<1||e>12)throw n.local.invalidMonth.replace(/\{0\}/,this.local.name);return i?!r&&e<=i?e-1:e:e-1},toChineseMonth:function(t,e){t.year&&(e=(t=t.year()).month());var r=this.intercalaryMonth(t);if(e<0||e>(r?12:11))throw n.local.invalidMonth.replace(/\{0\}/,this.local.name);return r?e<r?e+1:e:e+1},intercalaryMonth:function(t){return t=this._validateYear(t),h[t-h[0]]>>13},isIntercalaryMonth:function(t,e){t.year&&(e=(t=t.year()).month());var r=this.intercalaryMonth(t);return!!r&&r===e},leapYear:function(t){return 0!==this.intercalaryMonth(t)},weekOfYear:function(t,e,r){var i,o=this._validateYear(t,n.local.invalidyear),s=f[o-f[0]],l=s>>9&4095,c=s>>5&15,u=31&s;(i=a.newDate(l,c,u)).add(4-(i.dayOfWeek()||7),"d");var h=this.toJD(t,e,r)-i.toJD();return 1+Math.floor(h/7)},monthsInYear:function(t){return this.leapYear(t)?13:12},daysInMonth:function(t,e){t.year&&(e=t.month(),t=t.year()),t=this._validateYear(t);var r=h[t-h[0]];if(e>(r>>13?12:11))throw n.local.invalidMonth.replace(/\{0\}/,this.local.name);return r&1<<12-e?30:29},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,s,r,n.local.invalidDate);t=this._validateYear(i.year()),e=i.month(),r=i.day();var o=this.isIntercalaryMonth(t,e),s=this.toChineseMonth(t,e),l=function(t,e,r,n,i){var a,o,s;if("object"==typeof t)o=t,a=e||{};else{var l="number"==typeof t&&t>=1888&&t<=2111;if(!l)throw new Error("Lunar year outside range 1888-2111");var c="number"==typeof e&&e>=1&&e<=12;if(!c)throw new Error("Lunar month outside range 1 - 12");var u,p="number"==typeof r&&r>=1&&r<=30;if(!p)throw new Error("Lunar day outside range 1 - 30");"object"==typeof n?(u=!1,a=n):(u=!!n,a=i||{}),o={year:t,month:e,day:r,isIntercalary:u}}s=o.day-1;var d,g=h[o.year-h[0]],m=g>>13;d=m?o.month>m?o.month:o.isIntercalary?o.month:o.month-1:o.month-1;for(var v=0;v<d;v++){var y=g&1<<12-v?30:29;s+=y}var x=f[o.year-f[0]],b=new Date(x>>9&4095,(x>>5&15)-1,(31&x)+s);return a.year=b.getFullYear(),a.month=1+b.getMonth(),a.day=b.getDate(),a}(t,s,r,o);return a.toJD(l.year,l.month,l.day)},fromJD:function(t){var e=a.fromJD(t),r=function(t,e,r,n){var i,a;if("object"==typeof t)i=t,a=e||{};else{var o="number"==typeof t&&t>=1888&&t<=2111;if(!o)throw new Error("Solar year outside range 1888-2111");var s="number"==typeof e&&e>=1&&e<=12;if(!s)throw new Error("Solar month outside range 1 - 12");var l="number"==typeof r&&r>=1&&r<=31;if(!l)throw new Error("Solar day outside range 1 - 31");i={year:t,month:e,day:r},a=n||{}}var c=f[i.year-f[0]],u=i.year<<9|i.month<<5|i.day;a.year=u>=c?i.year:i.year-1,c=f[a.year-f[0]];var p,d=new Date(c>>9&4095,(c>>5&15)-1,31&c),g=new Date(i.year,i.month-1,i.day);p=Math.round((g-d)/864e5);var m,v=h[a.year-h[0]];for(m=0;m<13;m++){var y=v&1<<12-m?30:29;if(p<y)break;p-=y}var x=v>>13;!x||m<x?(a.isIntercalary=!1,a.month=1+m):m===x?(a.isIntercalary=!0,a.month=m):(a.isIntercalary=!1,a.month=m);return a.day=1+p,a}(e.year(),e.month(),e.day()),n=this.toMonthIndex(r.year,r.month,r.isIntercalary);return this.newDate(r.year,n,r.day)},fromString:function(t){var e=t.match(s),r=this._validateYear(+e[1]),n=+e[2],i=!!e[3],a=this.toMonthIndex(r,n,i),o=+e[4];return this.newDate(r,a,o)},add:function(t,e,r){var n=t.year(),i=t.month(),a=this.isIntercalaryMonth(n,i),s=this.toChineseMonth(n,i),l=Object.getPrototypeOf(o.prototype).add.call(this,t,e,r);if("y"===r){var c=l.year(),u=l.month(),h=this.isIntercalaryMonth(c,s),f=a&&h?this.toMonthIndex(c,s,!0):this.toMonthIndex(c,s,!1);f!==u&&l.month(f)}return l}});var s=/^\s*(-?\d\d\d\d|\d\d)[-/](\d?\d)([iI]?)[-/](\d?\d)/m,l=/^\d?\d[iI]?/m,c=/^\u95f0?\u5341?[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d]?\u6708/m,u=/^\u95f0?\u5341?[\u4e00\u4e8c\u4e09\u56db\u4e94\u516d\u4e03\u516b\u4e5d]?/m;n.calendars.chinese=o;var h=[1887,5780,5802,19157,2742,50359,1198,2646,46378,7466,3412,30122,5482,67949,2396,5294,43597,6732,6954,36181,2772,4954,18781,2396,54427,5274,6730,47781,5800,6868,21210,4790,59703,2350,5270,46667,3402,3496,38325,1388,4782,18735,2350,52374,6804,7498,44457,2906,1388,29294,4700,63789,6442,6804,56138,5802,2772,38235,1210,4698,22827,5418,63125,3476,5802,43701,2484,5302,27223,2646,70954,7466,3412,54698,5482,2412,38062,5294,2636,32038,6954,60245,2772,4826,43357,2394,5274,39501,6730,72357,5800,5844,53978,4790,2358,38039,5270,87627,3402,3496,54708,5484,4782,43311,2350,3222,27978,7498,68965,2904,5484,45677,4700,6444,39573,6804,6986,19285,2772,62811,1210,4698,47403,5418,5780,38570,5546,76469,2420,5302,51799,2646,5414,36501,3412,5546,18869,2412,54446,5276,6732,48422,6822,2900,28010,4826,92509,2394,5274,55883,6730,6820,47956,5812,2778,18779,2358,62615,5270,5450,46757,3492,5556,27318,4718,67887,2350,3222,52554,7498,3428,38252,5468,4700,31022,6444,64149,6804,6986,43861,2772,5338,35421,2650,70955,5418,5780,54954,5546,2740,38074,5302,2646,29991,3366,61011,3412,5546,43445,2412,5294,35406,6732,72998,6820,6996,52586,2778,2396,38045,5274,6698,23333,6820,64338,5812,2746,43355,2358,5270,39499,5450,79525,3492,5548],f=[1887,966732,967231,967733,968265,968766,969297,969798,970298,970829,971330,971830,972362,972863,973395,973896,974397,974928,975428,975929,976461,976962,977462,977994,978494,979026,979526,980026,980558,981059,981559,982091,982593,983124,983624,984124,984656,985157,985656,986189,986690,987191,987722,988222,988753,989254,989754,990286,990788,991288,991819,992319,992851,993352,993851,994383,994885,995385,995917,996418,996918,997450,997949,998481,998982,999483,1000014,1000515,1001016,1001548,1002047,1002578,1003080,1003580,1004111,1004613,1005113,1005645,1006146,1006645,1007177,1007678,1008209,1008710,1009211,1009743,1010243,1010743,1011275,1011775,1012306,1012807,1013308,1013840,1014341,1014841,1015373,1015874,1016404,1016905,1017405,1017937,1018438,1018939,1019471,1019972,1020471,1021002,1021503,1022035,1022535,1023036,1023568,1024069,1024568,1025100,1025601,1026102,1026633,1027133,1027666,1028167,1028666,1029198,1029699,1030199,1030730,1031231,1031763,1032264,1032764,1033296,1033797,1034297,1034828,1035329,1035830,1036362,1036861,1037393,1037894,1038394,1038925,1039427,1039927,1040459,1040959,1041491,1041992,1042492,1043023,1043524,1044024,1044556,1045057,1045558,1046090,1046590,1047121,1047622,1048122,1048654,1049154,1049655,1050187,1050689,1051219,1051720,1052220,1052751,1053252,1053752,1054284,1054786,1055285,1055817,1056317,1056849,1057349,1057850,1058382,1058883,1059383,1059915,1060415,1060947,1061447,1061947,1062479,1062981,1063480,1064012,1064514,1065014,1065545,1066045,1066577,1067078,1067578,1068110,1068611,1069112,1069642,1070142,1070674,1071175,1071675,1072207,1072709,1073209,1073740,1074241,1074741,1075273,1075773,1076305,1076807,1077308,1077839,1078340,1078840,1079372,1079871,1080403,1080904]},{"../main":536,"object-assign":421}],523:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Coptic",jdEpoch:1825029.5,daysPerMonth:[30,30,30,30,30,30,30,30,30,30,30,30,5],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Coptic",epochs:["BAM","AM"],monthNames:["Thout","Paopi","Hathor","Koiak","Tobi","Meshir","Paremhat","Paremoude","Pashons","Paoni","Epip","Mesori","Pi Kogi Enavot"],monthNamesShort:["Tho","Pao","Hath","Koi","Tob","Mesh","Pat","Pad","Pash","Pao","Epi","Meso","PiK"],dayNames:["Tkyriaka","Pesnau","Pshoment","Peftoou","Ptiou","Psoou","Psabbaton"],dayNamesShort:["Tky","Pes","Psh","Pef","Pti","Pso","Psa"],dayNamesMin:["Tk","Pes","Psh","Pef","Pt","Pso","Psa"],digits:null,dateFormat:"dd/mm/yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return(t=e.year()+(e.year()<0?1:0))%4==3||t%4==-1},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear||n.regionalOptions[""].invalidYear),13},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(13===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return(t=i.year())<0&&t++,i.day()+30*(i.month()-1)+365*(t-1)+Math.floor(t/4)+this.jdEpoch-1},fromJD:function(t){var e=Math.floor(t)+.5-this.jdEpoch,r=Math.floor((e-Math.floor((e+366)/1461))/365)+1;r<=0&&r--,e=Math.floor(t)+.5-this.newDate(r,1,1).toJD();var n=Math.floor(e/30)+1,i=e-30*(n-1)+1;return this.newDate(r,n,i)}}),n.calendars.coptic=a},{"../main":536,"object-assign":421}],524:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Discworld",jdEpoch:1721425.5,daysPerMonth:[16,32,32,32,32,32,32,32,32,32,32,32,32],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Discworld",epochs:["BUC","UC"],monthNames:["Ick","Offle","February","March","April","May","June","Grune","August","Spune","Sektober","Ember","December"],monthNamesShort:["Ick","Off","Feb","Mar","Apr","May","Jun","Gru","Aug","Spu","Sek","Emb","Dec"],dayNames:["Sunday","Octeday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Oct","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Oc","Mo","Tu","We","Th","Fr","Sa"],digits:null,dateFormat:"yyyy/mm/dd",firstDay:2,isRTL:!1}},leapYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),!1},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),13},daysInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),400},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/8)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]},daysInWeek:function(){return 8},dayOfWeek:function(t,e,r){return(this._validate(t,e,r,n.local.invalidDate).day()+1)%8},weekDay:function(t,e,r){var n=this.dayOfWeek(t,e,r);return n>=2&&n<=6},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return{century:o[Math.floor((i.year()-1)/100)+1]||""}},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year()+(i.year()<0?1:0),e=i.month(),(r=i.day())+(e>1?16:0)+(e>2?32*(e-2):0)+400*(t-1)+this.jdEpoch-1},fromJD:function(t){t=Math.floor(t+.5)-Math.floor(this.jdEpoch)-1;var e=Math.floor(t/400)+1;t-=400*(e-1),t+=t>15?16:0;var r=Math.floor(t/32)+1,n=t-32*(r-1)+1;return this.newDate(e<=0?e-1:e,r,n)}});var o={20:"Fruitbat",21:"Anchovy"};n.calendars.discworld=a},{"../main":536,"object-assign":421}],525:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Ethiopian",jdEpoch:1724220.5,daysPerMonth:[30,30,30,30,30,30,30,30,30,30,30,30,5],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Ethiopian",epochs:["BEE","EE"],monthNames:["Meskerem","Tikemet","Hidar","Tahesas","Tir","Yekatit","Megabit","Miazia","Genbot","Sene","Hamle","Nehase","Pagume"],monthNamesShort:["Mes","Tik","Hid","Tah","Tir","Yek","Meg","Mia","Gen","Sen","Ham","Neh","Pag"],dayNames:["Ehud","Segno","Maksegno","Irob","Hamus","Arb","Kidame"],dayNamesShort:["Ehu","Seg","Mak","Iro","Ham","Arb","Kid"],dayNamesMin:["Eh","Se","Ma","Ir","Ha","Ar","Ki"],digits:null,dateFormat:"dd/mm/yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return(t=e.year()+(e.year()<0?1:0))%4==3||t%4==-1},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear||n.regionalOptions[""].invalidYear),13},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(13===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return(t=i.year())<0&&t++,i.day()+30*(i.month()-1)+365*(t-1)+Math.floor(t/4)+this.jdEpoch-1},fromJD:function(t){var e=Math.floor(t)+.5-this.jdEpoch,r=Math.floor((e-Math.floor((e+366)/1461))/365)+1;r<=0&&r--,e=Math.floor(t)+.5-this.newDate(r,1,1).toJD();var n=Math.floor(e/30)+1,i=e-30*(n-1)+1;return this.newDate(r,n,i)}}),n.calendars.ethiopian=a},{"../main":536,"object-assign":421}],526:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}function o(t,e){return t-e*Math.floor(t/e)}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Hebrew",jdEpoch:347995.5,daysPerMonth:[30,29,30,29,30,29,30,29,30,29,30,29,29],hasYearZero:!1,minMonth:1,firstMonth:7,minDay:1,regionalOptions:{"":{name:"Hebrew",epochs:["BAM","AM"],monthNames:["Nisan","Iyar","Sivan","Tammuz","Av","Elul","Tishrei","Cheshvan","Kislev","Tevet","Shevat","Adar","Adar II"],monthNamesShort:["Nis","Iya","Siv","Tam","Av","Elu","Tis","Che","Kis","Tev","She","Ada","Ad2"],dayNames:["Yom Rishon","Yom Sheni","Yom Shlishi","Yom Revi'i","Yom Chamishi","Yom Shishi","Yom Shabbat"],dayNamesShort:["Ris","She","Shl","Rev","Cha","Shi","Sha"],dayNamesMin:["Ri","She","Shl","Re","Ch","Shi","Sha"],digits:null,dateFormat:"dd/mm/yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return this._leapYear(e.year())},_leapYear:function(t){return o(7*(t=t<0?t+1:t)+1,19)<7},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),this._leapYear(t.year?t.year():t)?13:12},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){return t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year(),this.toJD(-1===t?1:t+1,7,1)-this.toJD(t,7,1)},daysInMonth:function(t,e){return t.year&&(e=t.month(),t=t.year()),this._validate(t,e,this.minDay,n.local.invalidMonth),12===e&&this.leapYear(t)?30:8===e&&5===o(this.daysInYear(t),10)?30:9===e&&3===o(this.daysInYear(t),10)?29:this.daysPerMonth[e-1]},weekDay:function(t,e,r){return 6!==this.dayOfWeek(t,e,r)},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return{yearType:(this.leapYear(i)?"embolismic":"common")+" "+["deficient","regular","complete"][this.daysInYear(i)%10-3]}},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=t<=0?t+1:t,o=this.jdEpoch+this._delay1(a)+this._delay2(a)+r+1;if(e<7){for(var s=7;s<=this.monthsInYear(t);s++)o+=this.daysInMonth(t,s);for(s=1;s<e;s++)o+=this.daysInMonth(t,s)}else for(s=7;s<e;s++)o+=this.daysInMonth(t,s);return o},_delay1:function(t){var e=Math.floor((235*t-234)/19),r=12084+13753*e,n=29*e+Math.floor(r/25920);return o(3*(n+1),7)<3&&n++,n},_delay2:function(t){var e=this._delay1(t-1),r=this._delay1(t);return this._delay1(t+1)-r==356?2:r-e==382?1:0},fromJD:function(t){t=Math.floor(t)+.5;for(var e=Math.floor(98496*(t-this.jdEpoch)/35975351)-1;t>=this.toJD(-1===e?1:e+1,7,1);)e++;for(var r=t<this.toJD(e,1,1)?7:1;t>this.toJD(e,r,this.daysInMonth(e,r));)r++;var n=t-this.toJD(e,r,1)+1;return this.newDate(e,r,n)}}),n.calendars.hebrew=a},{"../main":536,"object-assign":421}],527:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Islamic",jdEpoch:1948439.5,daysPerMonth:[30,29,30,29,30,29,30,29,30,29,30,29],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Islamic",epochs:["BH","AH"],monthNames:["Muharram","Safar","Rabi' al-awwal","Rabi' al-thani","Jumada al-awwal","Jumada al-thani","Rajab","Sha'aban","Ramadan","Shawwal","Dhu al-Qi'dah","Dhu al-Hijjah"],monthNamesShort:["Muh","Saf","Rab1","Rab2","Jum1","Jum2","Raj","Sha'","Ram","Shaw","DhuQ","DhuH"],dayNames:["Yawm al-ahad","Yawm al-ithnayn","Yawm ath-thulaathaa'","Yawm al-arbi'aa'","Yawm al-kham\u012bs","Yawm al-jum'a","Yawm as-sabt"],dayNamesShort:["Aha","Ith","Thu","Arb","Kha","Jum","Sab"],dayNamesMin:["Ah","It","Th","Ar","Kh","Ju","Sa"],digits:null,dateFormat:"yyyy/mm/dd",firstDay:6,isRTL:!1}},leapYear:function(t){return(11*this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year()+14)%30<11},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){return this.leapYear(t)?355:354},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year(),e=i.month(),t=t<=0?t+1:t,(r=i.day())+Math.ceil(29.5*(e-1))+354*(t-1)+Math.floor((3+11*t)/30)+this.jdEpoch-1},fromJD:function(t){t=Math.floor(t)+.5;var e=Math.floor((30*(t-this.jdEpoch)+10646)/10631);e=e<=0?e-1:e;var r=Math.min(12,Math.ceil((t-29-this.toJD(e,1,1))/29.5)+1),n=t-this.toJD(e,r,1)+1;return this.newDate(e,r,n)}}),n.calendars.islamic=a},{"../main":536,"object-assign":421}],528:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Julian",jdEpoch:1721423.5,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Julian",epochs:["BC","AD"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],digits:null,dateFormat:"mm/dd/yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return(t=e.year()<0?e.year()+1:e.year())%4==0},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(4-(n.dayOfWeek()||7),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return t=i.year(),e=i.month(),r=i.day(),t<0&&t++,e<=2&&(t--,e+=12),Math.floor(365.25*(t+4716))+Math.floor(30.6001*(e+1))+r-1524.5},fromJD:function(t){var e=Math.floor(t+.5)+1524,r=Math.floor((e-122.1)/365.25),n=Math.floor(365.25*r),i=Math.floor((e-n)/30.6001),a=i-Math.floor(i<14?1:13),o=r-Math.floor(a>2?4716:4715),s=e-n-Math.floor(30.6001*i);return o<=0&&o--,this.newDate(o,a,s)}}),n.calendars.julian=a},{"../main":536,"object-assign":421}],529:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}function o(t,e){return t-e*Math.floor(t/e)}function s(t,e){return o(t-1,e)+1}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Mayan",jdEpoch:584282.5,hasYearZero:!0,minMonth:0,firstMonth:0,minDay:0,regionalOptions:{"":{name:"Mayan",epochs:["",""],monthNames:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17"],monthNamesShort:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17"],dayNames:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19"],dayNamesShort:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19"],dayNamesMin:["0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19"],digits:null,dateFormat:"YYYY.m.d",firstDay:0,isRTL:!1,haabMonths:["Pop","Uo","Zip","Zotz","Tzec","Xul","Yaxkin","Mol","Chen","Yax","Zac","Ceh","Mac","Kankin","Muan","Pax","Kayab","Cumku","Uayeb"],tzolkinMonths:["Imix","Ik","Akbal","Kan","Chicchan","Cimi","Manik","Lamat","Muluc","Oc","Chuen","Eb","Ben","Ix","Men","Cib","Caban","Etznab","Cauac","Ahau"]}},leapYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),!1},formatYear:function(t){t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year();var e=Math.floor(t/400);return t%=400,t+=t<0?400:0,e+"."+Math.floor(t/20)+"."+t%20},forYear:function(t){if((t=t.split(".")).length<3)throw"Invalid Mayan year";for(var e=0,r=0;r<t.length;r++){var n=parseInt(t[r],10);if(Math.abs(n)>19||r>0&&n<0)throw"Invalid Mayan year";e=20*e+n}return e},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),18},weekOfYear:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate),0},daysInYear:function(t){return this._validate(t,this.minMonth,this.minDay,n.local.invalidYear),360},daysInMonth:function(t,e){return this._validate(t,e,this.minDay,n.local.invalidMonth),20},daysInWeek:function(){return 5},dayOfWeek:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate).day()},weekDay:function(t,e,r){return this._validate(t,e,r,n.local.invalidDate),!0},extraInfo:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate).toJD(),a=this._toHaab(i),o=this._toTzolkin(i);return{haabMonthName:this.local.haabMonths[a[0]-1],haabMonth:a[0],haabDay:a[1],tzolkinDayName:this.local.tzolkinMonths[o[0]-1],tzolkinDay:o[0],tzolkinTrecena:o[1]}},_toHaab:function(t){var e=o((t-=this.jdEpoch)+8+340,365);return[Math.floor(e/20)+1,o(e,20)]},_toTzolkin:function(t){return[s((t-=this.jdEpoch)+20,20),s(t+4,13)]},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);return i.day()+20*i.month()+360*i.year()+this.jdEpoch},fromJD:function(t){t=Math.floor(t)+.5-this.jdEpoch;var e=Math.floor(t/360);t%=360,t+=t<0?360:0;var r=Math.floor(t/20),n=t%20;return this.newDate(e,r,n)}}),n.calendars.mayan=a},{"../main":536,"object-assign":421}],530:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar;var o=n.instance("gregorian");i(a.prototype,{name:"Nanakshahi",jdEpoch:2257673.5,daysPerMonth:[31,31,31,31,31,30,30,30,30,30,30,30],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Nanakshahi",epochs:["BN","AN"],monthNames:["Chet","Vaisakh","Jeth","Harh","Sawan","Bhadon","Assu","Katak","Maghar","Poh","Magh","Phagun"],monthNamesShort:["Che","Vai","Jet","Har","Saw","Bha","Ass","Kat","Mgr","Poh","Mgh","Pha"],dayNames:["Somvaar","Mangalvar","Budhvaar","Veervaar","Shukarvaar","Sanicharvaar","Etvaar"],dayNamesShort:["Som","Mangal","Budh","Veer","Shukar","Sanichar","Et"],dayNamesMin:["So","Ma","Bu","Ve","Sh","Sa","Et"],digits:null,dateFormat:"dd-mm-yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear||n.regionalOptions[""].invalidYear);return o.leapYear(e.year()+(e.year()<1?1:0)+1469)},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(1-(n.dayOfWeek()||7),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidMonth);(t=i.year())<0&&t++;for(var a=i.day(),s=1;s<i.month();s++)a+=this.daysPerMonth[s-1];return a+o.toJD(t+1468,3,13)},fromJD:function(t){t=Math.floor(t+.5);for(var e=Math.floor((t-(this.jdEpoch-1))/366);t>=this.toJD(e+1,1,1);)e++;for(var r=t-Math.floor(this.toJD(e,1,1)+.5)+1,n=1;r>this.daysInMonth(e,n);)r-=this.daysInMonth(e,n),n++;return this.newDate(e,n,r)}}),n.calendars.nanakshahi=a},{"../main":536,"object-assign":421}],531:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Nepali",jdEpoch:1700709.5,daysPerMonth:[31,31,32,32,31,30,30,29,30,29,30,30],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,daysPerYear:365,regionalOptions:{"":{name:"Nepali",epochs:["BBS","ABS"],monthNames:["Baisakh","Jestha","Ashadh","Shrawan","Bhadra","Ashwin","Kartik","Mangsir","Paush","Mangh","Falgun","Chaitra"],monthNamesShort:["Bai","Je","As","Shra","Bha","Ash","Kar","Mang","Pau","Ma","Fal","Chai"],dayNames:["Aaitabaar","Sombaar","Manglbaar","Budhabaar","Bihibaar","Shukrabaar","Shanibaar"],dayNamesShort:["Aaita","Som","Mangl","Budha","Bihi","Shukra","Shani"],dayNamesMin:["Aai","So","Man","Bu","Bi","Shu","Sha"],digits:null,dateFormat:"dd/mm/yyyy",firstDay:1,isRTL:!1}},leapYear:function(t){return this.daysInYear(t)!==this.daysPerYear},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){if(t=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear).year(),"undefined"==typeof this.NEPALI_CALENDAR_DATA[t])return this.daysPerYear;for(var e=0,r=this.minMonth;r<=12;r++)e+=this.NEPALI_CALENDAR_DATA[t][r];return e},daysInMonth:function(t,e){return t.year&&(e=t.month(),t=t.year()),this._validate(t,e,this.minDay,n.local.invalidMonth),"undefined"==typeof this.NEPALI_CALENDAR_DATA[t]?this.daysPerMonth[e-1]:this.NEPALI_CALENDAR_DATA[t][e]},weekDay:function(t,e,r){return 6!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=n.instance(),o=0,s=e,l=t;this._createMissingCalendarData(t);var c=t-(s>9||9===s&&r>=this.NEPALI_CALENDAR_DATA[l][0]?56:57);for(9!==e&&(o=r,s--);9!==s;)s<=0&&(s=12,l--),o+=this.NEPALI_CALENDAR_DATA[l][s],s--;return 9===e?(o+=r-this.NEPALI_CALENDAR_DATA[l][0])<0&&(o+=a.daysInYear(c)):o+=this.NEPALI_CALENDAR_DATA[l][9]-this.NEPALI_CALENDAR_DATA[l][0],a.newDate(c,1,1).add(o,"d").toJD()},fromJD:function(t){var e=n.instance().fromJD(t),r=e.year(),i=e.dayOfYear(),a=r+56;this._createMissingCalendarData(a);for(var o=9,s=this.NEPALI_CALENDAR_DATA[a][0],l=this.NEPALI_CALENDAR_DATA[a][o]-s+1;i>l;)++o>12&&(o=1,a++),l+=this.NEPALI_CALENDAR_DATA[a][o];var c=this.NEPALI_CALENDAR_DATA[a][o]-(l-i);return this.newDate(a,o,c)},_createMissingCalendarData:function(t){var e=this.daysPerMonth.slice(0);e.unshift(17);for(var r=t-1;r<t+2;r++)"undefined"==typeof this.NEPALI_CALENDAR_DATA[r]&&(this.NEPALI_CALENDAR_DATA[r]=e)},NEPALI_CALENDAR_DATA:{1970:[18,31,31,32,31,31,31,30,29,30,29,30,30],1971:[18,31,31,32,31,32,30,30,29,30,29,30,30],1972:[17,31,32,31,32,31,30,30,30,29,29,30,30],1973:[19,30,32,31,32,31,30,30,30,29,30,29,31],1974:[19,31,31,32,30,31,31,30,29,30,29,30,30],1975:[18,31,31,32,32,30,31,30,29,30,29,30,30],1976:[17,31,32,31,32,31,30,30,30,29,29,30,31],1977:[18,31,32,31,32,31,31,29,30,29,30,29,31],1978:[18,31,31,32,31,31,31,30,29,30,29,30,30],1979:[18,31,31,32,32,31,30,30,29,30,29,30,30],1980:[17,31,32,31,32,31,30,30,30,29,29,30,31],1981:[18,31,31,31,32,31,31,29,30,30,29,30,30],1982:[18,31,31,32,31,31,31,30,29,30,29,30,30],1983:[18,31,31,32,32,31,30,30,29,30,29,30,30],1984:[17,31,32,31,32,31,30,30,30,29,29,30,31],1985:[18,31,31,31,32,31,31,29,30,30,29,30,30],1986:[18,31,31,32,31,31,31,30,29,30,29,30,30],1987:[18,31,32,31,32,31,30,30,29,30,29,30,30],1988:[17,31,32,31,32,31,30,30,30,29,29,30,31],1989:[18,31,31,31,32,31,31,30,29,30,29,30,30],1990:[18,31,31,32,31,31,31,30,29,30,29,30,30],1991:[18,31,32,31,32,31,30,30,29,30,29,30,30],1992:[17,31,32,31,32,31,30,30,30,29,30,29,31],1993:[18,31,31,31,32,31,31,30,29,30,29,30,30],1994:[18,31,31,32,31,31,31,30,29,30,29,30,30],1995:[17,31,32,31,32,31,30,30,30,29,29,30,30],1996:[17,31,32,31,32,31,30,30,30,29,30,29,31],1997:[18,31,31,32,31,31,31,30,29,30,29,30,30],1998:[18,31,31,32,31,31,31,30,29,30,29,30,30],1999:[17,31,32,31,32,31,30,30,30,29,29,30,31],2000:[17,30,32,31,32,31,30,30,30,29,30,29,31],2001:[18,31,31,32,31,31,31,30,29,30,29,30,30],2002:[18,31,31,32,32,31,30,30,29,30,29,30,30],2003:[17,31,32,31,32,31,30,30,30,29,29,30,31],2004:[17,30,32,31,32,31,30,30,30,29,30,29,31],2005:[18,31,31,32,31,31,31,30,29,30,29,30,30],2006:[18,31,31,32,32,31,30,30,29,30,29,30,30],2007:[17,31,32,31,32,31,30,30,30,29,29,30,31],2008:[17,31,31,31,32,31,31,29,30,30,29,29,31],2009:[18,31,31,32,31,31,31,30,29,30,29,30,30],2010:[18,31,31,32,32,31,30,30,29,30,29,30,30],2011:[17,31,32,31,32,31,30,30,30,29,29,30,31],2012:[17,31,31,31,32,31,31,29,30,30,29,30,30],2013:[18,31,31,32,31,31,31,30,29,30,29,30,30],2014:[18,31,31,32,32,31,30,30,29,30,29,30,30],2015:[17,31,32,31,32,31,30,30,30,29,29,30,31],2016:[17,31,31,31,32,31,31,29,30,30,29,30,30],2017:[18,31,31,32,31,31,31,30,29,30,29,30,30],2018:[18,31,32,31,32,31,30,30,29,30,29,30,30],2019:[17,31,32,31,32,31,30,30,30,29,30,29,31],2020:[17,31,31,31,32,31,31,30,29,30,29,30,30],2021:[18,31,31,32,31,31,31,30,29,30,29,30,30],2022:[17,31,32,31,32,31,30,30,30,29,29,30,30],2023:[17,31,32,31,32,31,30,30,30,29,30,29,31],2024:[17,31,31,31,32,31,31,30,29,30,29,30,30],2025:[18,31,31,32,31,31,31,30,29,30,29,30,30],2026:[17,31,32,31,32,31,30,30,30,29,29,30,31],2027:[17,30,32,31,32,31,30,30,30,29,30,29,31],2028:[17,31,31,32,31,31,31,30,29,30,29,30,30],2029:[18,31,31,32,31,32,30,30,29,30,29,30,30],2030:[17,31,32,31,32,31,30,30,30,30,30,30,31],2031:[17,31,32,31,32,31,31,31,31,31,31,31,31],2032:[17,32,32,32,32,32,32,32,32,32,32,32,32],2033:[18,31,31,32,32,31,30,30,29,30,29,30,30],2034:[17,31,32,31,32,31,30,30,30,29,29,30,31],2035:[17,30,32,31,32,31,31,29,30,30,29,29,31],2036:[17,31,31,32,31,31,31,30,29,30,29,30,30],2037:[18,31,31,32,32,31,30,30,29,30,29,30,30],2038:[17,31,32,31,32,31,30,30,30,29,29,30,31],2039:[17,31,31,31,32,31,31,29,30,30,29,30,30],2040:[17,31,31,32,31,31,31,30,29,30,29,30,30],2041:[18,31,31,32,32,31,30,30,29,30,29,30,30],2042:[17,31,32,31,32,31,30,30,30,29,29,30,31],2043:[17,31,31,31,32,31,31,29,30,30,29,30,30],2044:[17,31,31,32,31,31,31,30,29,30,29,30,30],2045:[18,31,32,31,32,31,30,30,29,30,29,30,30],2046:[17,31,32,31,32,31,30,30,30,29,29,30,31],2047:[17,31,31,31,32,31,31,30,29,30,29,30,30],2048:[17,31,31,32,31,31,31,30,29,30,29,30,30],2049:[17,31,32,31,32,31,30,30,30,29,29,30,30],2050:[17,31,32,31,32,31,30,30,30,29,30,29,31],2051:[17,31,31,31,32,31,31,30,29,30,29,30,30],2052:[17,31,31,32,31,31,31,30,29,30,29,30,30],2053:[17,31,32,31,32,31,30,30,30,29,29,30,30],2054:[17,31,32,31,32,31,30,30,30,29,30,29,31],2055:[17,31,31,32,31,31,31,30,29,30,30,29,30],2056:[17,31,31,32,31,32,30,30,29,30,29,30,30],2057:[17,31,32,31,32,31,30,30,30,29,29,30,31],2058:[17,30,32,31,32,31,30,30,30,29,30,29,31],2059:[17,31,31,32,31,31,31,30,29,30,29,30,30],2060:[17,31,31,32,32,31,30,30,29,30,29,30,30],2061:[17,31,32,31,32,31,30,30,30,29,29,30,31],2062:[17,30,32,31,32,31,31,29,30,29,30,29,31],2063:[17,31,31,32,31,31,31,30,29,30,29,30,30],2064:[17,31,31,32,32,31,30,30,29,30,29,30,30],2065:[17,31,32,31,32,31,30,30,30,29,29,30,31],2066:[17,31,31,31,32,31,31,29,30,30,29,29,31],2067:[17,31,31,32,31,31,31,30,29,30,29,30,30],2068:[17,31,31,32,32,31,30,30,29,30,29,30,30],2069:[17,31,32,31,32,31,30,30,30,29,29,30,31],2070:[17,31,31,31,32,31,31,29,30,30,29,30,30],2071:[17,31,31,32,31,31,31,30,29,30,29,30,30],2072:[17,31,32,31,32,31,30,30,29,30,29,30,30],2073:[17,31,32,31,32,31,30,30,30,29,29,30,31],2074:[17,31,31,31,32,31,31,30,29,30,29,30,30],2075:[17,31,31,32,31,31,31,30,29,30,29,30,30],2076:[16,31,32,31,32,31,30,30,30,29,29,30,30],2077:[17,31,32,31,32,31,30,30,30,29,30,29,31],2078:[17,31,31,31,32,31,31,30,29,30,29,30,30],2079:[17,31,31,32,31,31,31,30,29,30,29,30,30],2080:[16,31,32,31,32,31,30,30,30,29,29,30,30],2081:[17,31,31,32,32,31,30,30,30,29,30,30,30],2082:[17,31,32,31,32,31,30,30,30,29,30,30,30],2083:[17,31,31,32,31,31,30,30,30,29,30,30,30],2084:[17,31,31,32,31,31,30,30,30,29,30,30,30],2085:[17,31,32,31,32,31,31,30,30,29,30,30,30],2086:[17,31,32,31,32,31,30,30,30,29,30,30,30],2087:[16,31,31,32,31,31,31,30,30,29,30,30,30],2088:[16,30,31,32,32,30,31,30,30,29,30,30,30],2089:[17,31,32,31,32,31,30,30,30,29,30,30,30],2090:[17,31,32,31,32,31,30,30,30,29,30,30,30],2091:[16,31,31,32,31,31,31,30,30,29,30,30,30],2092:[16,31,31,32,32,31,30,30,30,29,30,30,30],2093:[17,31,32,31,32,31,30,30,30,29,30,30,30],2094:[17,31,31,32,31,31,30,30,30,29,30,30,30],2095:[17,31,31,32,31,31,31,30,29,30,30,30,30],2096:[17,30,31,32,32,31,30,30,29,30,29,30,30],2097:[17,31,32,31,32,31,30,30,30,29,30,30,30],2098:[17,31,31,32,31,31,31,29,30,29,30,30,31],2099:[17,31,31,32,31,31,31,30,29,29,30,30,30],2100:[17,31,32,31,32,30,31,30,29,30,29,30,30]}}),n.calendars.nepali=a},{"../main":536,"object-assign":421}],532:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}function o(t,e){return t-e*Math.floor(t/e)}a.prototype=new n.baseCalendar,i(a.prototype,{name:"Persian",jdEpoch:1948320.5,daysPerMonth:[31,31,31,31,31,31,30,30,30,30,30,29],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Persian",epochs:["BP","AP"],monthNames:["Farvardin","Ordibehesht","Khordad","Tir","Mordad","Shahrivar","Mehr","Aban","Azar","Day","Bahman","Esfand"],monthNamesShort:["Far","Ord","Kho","Tir","Mor","Sha","Meh","Aba","Aza","Day","Bah","Esf"],dayNames:["Yekshambe","Doshambe","Seshambe","Ch\xe6harshambe","Panjshambe","Jom'e","Shambe"],dayNamesShort:["Yek","Do","Se","Ch\xe6","Panj","Jom","Sha"],dayNamesMin:["Ye","Do","Se","Ch","Pa","Jo","Sh"],digits:null,dateFormat:"yyyy/mm/dd",firstDay:6,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return 682*((e.year()-(e.year()>0?474:473))%2820+474+38)%2816<682},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-(n.dayOfWeek()+1)%7,"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(12===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=i.year(),e=i.month(),r=i.day();var a=t-(t>=0?474:473),s=474+o(a,2820);return r+(e<=7?31*(e-1):30*(e-1)+6)+Math.floor((682*s-110)/2816)+365*(s-1)+1029983*Math.floor(a/2820)+this.jdEpoch-1},fromJD:function(t){var e=(t=Math.floor(t)+.5)-this.toJD(475,1,1),r=Math.floor(e/1029983),n=o(e,1029983),i=2820;if(1029982!==n){var a=Math.floor(n/366),s=o(n,366);i=Math.floor((2134*a+2816*s+2815)/1028522)+a+1}var l=i+2820*r+474;l=l<=0?l-1:l;var c=t-this.toJD(l,1,1)+1,u=c<=186?Math.ceil(c/31):Math.ceil((c-6)/30),h=t-this.toJD(l,u,1)+1;return this.newDate(l,u,h)}}),n.calendars.persian=a,n.calendars.jalali=a},{"../main":536,"object-assign":421}],533:[function(t,e,r){var n=t("../main"),i=t("object-assign"),a=n.instance();function o(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}o.prototype=new n.baseCalendar,i(o.prototype,{name:"Taiwan",jdEpoch:2419402.5,yearsOffset:1911,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Taiwan",epochs:["BROC","ROC"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],digits:null,dateFormat:"yyyy/mm/dd",firstDay:1,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);t=this._t2gYear(e.year());return a.leapYear(t)},weekOfYear:function(t,e,r){var i=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);t=this._t2gYear(i.year());return a.weekOfYear(t,i.month(),i.day())},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=this._t2gYear(i.year());return a.toJD(t,i.month(),i.day())},fromJD:function(t){var e=a.fromJD(t),r=this._g2tYear(e.year());return this.newDate(r,e.month(),e.day())},_t2gYear:function(t){return t+this.yearsOffset+(t>=-this.yearsOffset&&t<=-1?1:0)},_g2tYear:function(t){return t-this.yearsOffset-(t>=1&&t<=this.yearsOffset?1:0)}}),n.calendars.taiwan=o},{"../main":536,"object-assign":421}],534:[function(t,e,r){var n=t("../main"),i=t("object-assign"),a=n.instance();function o(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}o.prototype=new n.baseCalendar,i(o.prototype,{name:"Thai",jdEpoch:1523098.5,yearsOffset:543,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Thai",epochs:["BBE","BE"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],digits:null,dateFormat:"dd/mm/yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);t=this._t2gYear(e.year());return a.leapYear(t)},weekOfYear:function(t,e,r){var i=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);t=this._t2gYear(i.year());return a.weekOfYear(t,i.month(),i.day())},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,n.local.invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate);t=this._t2gYear(i.year());return a.toJD(t,i.month(),i.day())},fromJD:function(t){var e=a.fromJD(t),r=this._g2tYear(e.year());return this.newDate(r,e.month(),e.day())},_t2gYear:function(t){return t-this.yearsOffset-(t>=1&&t<=this.yearsOffset?1:0)},_g2tYear:function(t){return t+this.yearsOffset+(t>=-this.yearsOffset&&t<=-1?1:0)}}),n.calendars.thai=o},{"../main":536,"object-assign":421}],535:[function(t,e,r){var n=t("../main"),i=t("object-assign");function a(t){this.local=this.regionalOptions[t||""]||this.regionalOptions[""]}a.prototype=new n.baseCalendar,i(a.prototype,{name:"UmmAlQura",hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Umm al-Qura",epochs:["BH","AH"],monthNames:["Al-Muharram","Safar","Rabi' al-awwal","Rabi' Al-Thani","Jumada Al-Awwal","Jumada Al-Thani","Rajab","Sha'aban","Ramadan","Shawwal","Dhu al-Qi'dah","Dhu al-Hijjah"],monthNamesShort:["Muh","Saf","Rab1","Rab2","Jum1","Jum2","Raj","Sha'","Ram","Shaw","DhuQ","DhuH"],dayNames:["Yawm al-Ahad","Yawm al-Ithnain","Yawm al-Thal\u0101th\u0101\u2019","Yawm al-Arba\u2018\u0101\u2019","Yawm al-Kham\u012bs","Yawm al-Jum\u2018a","Yawm al-Sabt"],dayNamesMin:["Ah","Ith","Th","Ar","Kh","Ju","Sa"],digits:null,dateFormat:"yyyy/mm/dd",firstDay:6,isRTL:!0}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,n.local.invalidYear);return 355===this.daysInYear(e.year())},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(-n.dayOfWeek(),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInYear:function(t){for(var e=0,r=1;r<=12;r++)e+=this.daysInMonth(t,r);return e},daysInMonth:function(t,e){for(var r=this._validate(t,e,this.minDay,n.local.invalidMonth).toJD()-24e5+.5,i=0,a=0;a<o.length;a++){if(o[a]>r)return o[i]-o[i-1];i++}return 30},weekDay:function(t,e,r){return 5!==this.dayOfWeek(t,e,r)},toJD:function(t,e,r){var i=this._validate(t,e,r,n.local.invalidDate),a=12*(i.year()-1)+i.month()-15292;return i.day()+o[a-1]-1+24e5-.5},fromJD:function(t){for(var e=t-24e5+.5,r=0,n=0;n<o.length&&!(o[n]>e);n++)r++;var i=r+15292,a=Math.floor((i-1)/12),s=a+1,l=i-12*a,c=e-o[r-1]+1;return this.newDate(s,l,c)},isValid:function(t,e,r){var i=n.baseCalendar.prototype.isValid.apply(this,arguments);return i&&(i=(t=null!=t.year?t.year:t)>=1276&&t<=1500),i},_validate:function(t,e,r,i){var a=n.baseCalendar.prototype._validate.apply(this,arguments);if(a.year<1276||a.year>1500)throw i.replace(/\{0\}/,this.local.name);return a}}),n.calendars.ummalqura=a;var o=[20,50,79,109,138,168,197,227,256,286,315,345,374,404,433,463,492,522,551,581,611,641,670,700,729,759,788,818,847,877,906,936,965,995,1024,1054,1083,1113,1142,1172,1201,1231,1260,1290,1320,1350,1379,1409,1438,1468,1497,1527,1556,1586,1615,1645,1674,1704,1733,1763,1792,1822,1851,1881,1910,1940,1969,1999,2028,2058,2087,2117,2146,2176,2205,2235,2264,2294,2323,2353,2383,2413,2442,2472,2501,2531,2560,2590,2619,2649,2678,2708,2737,2767,2796,2826,2855,2885,2914,2944,2973,3003,3032,3062,3091,3121,3150,3180,3209,3239,3268,3298,3327,3357,3386,3416,3446,3476,3505,3535,3564,3594,3623,3653,3682,3712,3741,3771,3800,3830,3859,3889,3918,3948,3977,4007,4036,4066,4095,4125,4155,4185,4214,4244,4273,4303,4332,4362,4391,4421,4450,4480,4509,4539,4568,4598,4627,4657,4686,4716,4745,4775,4804,4834,4863,4893,4922,4952,4981,5011,5040,5070,5099,5129,5158,5188,5218,5248,5277,5307,5336,5366,5395,5425,5454,5484,5513,5543,5572,5602,5631,5661,5690,5720,5749,5779,5808,5838,5867,5897,5926,5956,5985,6015,6044,6074,6103,6133,6162,6192,6221,6251,6281,6311,6340,6370,6399,6429,6458,6488,6517,6547,6576,6606,6635,6665,6694,6724,6753,6783,6812,6842,6871,6901,6930,6960,6989,7019,7048,7078,7107,7137,7166,7196,7225,7255,7284,7314,7344,7374,7403,7433,7462,7492,7521,7551,7580,7610,7639,7669,7698,7728,7757,7787,7816,7846,7875,7905,7934,7964,7993,8023,8053,8083,8112,8142,8171,8201,8230,8260,8289,8319,8348,8378,8407,8437,8466,8496,8525,8555,8584,8614,8643,8673,8702,8732,8761,8791,8821,8850,8880,8909,8938,8968,8997,9027,9056,9086,9115,9145,9175,9205,9234,9264,9293,9322,9352,9381,9410,9440,9470,9499,9529,9559,9589,9618,9648,9677,9706,9736,9765,9794,9824,9853,9883,9913,9943,9972,10002,10032,10061,10090,10120,10149,10178,10208,10237,10267,10297,10326,10356,10386,10415,10445,10474,10504,10533,10562,10592,10621,10651,10680,10710,10740,10770,10799,10829,10858,10888,10917,10947,10976,11005,11035,11064,11094,11124,11153,11183,11213,11242,11272,11301,11331,11360,11389,11419,11448,11478,11507,11537,11567,11596,11626,11655,11685,11715,11744,11774,11803,11832,11862,11891,11921,11950,11980,12010,12039,12069,12099,12128,12158,12187,12216,12246,12275,12304,12334,12364,12393,12423,12453,12483,12512,12542,12571,12600,12630,12659,12688,12718,12747,12777,12807,12837,12866,12896,12926,12955,12984,13014,13043,13072,13102,13131,13161,13191,13220,13250,13280,13310,13339,13368,13398,13427,13456,13486,13515,13545,13574,13604,13634,13664,13693,13723,13752,13782,13811,13840,13870,13899,13929,13958,13988,14018,14047,14077,14107,14136,14166,14195,14224,14254,14283,14313,14342,14372,14401,14431,14461,14490,14520,14550,14579,14609,14638,14667,14697,14726,14756,14785,14815,14844,14874,14904,14933,14963,14993,15021,15051,15081,15110,15140,15169,15199,15228,15258,15287,15317,15347,15377,15406,15436,15465,15494,15524,15553,15582,15612,15641,15671,15701,15731,15760,15790,15820,15849,15878,15908,15937,15966,15996,16025,16055,16085,16114,16144,16174,16204,16233,16262,16292,16321,16350,16380,16409,16439,16468,16498,16528,16558,16587,16617,16646,16676,16705,16734,16764,16793,16823,16852,16882,16912,16941,16971,17001,17030,17060,17089,17118,17148,17177,17207,17236,17266,17295,17325,17355,17384,17414,17444,17473,17502,17532,17561,17591,17620,17650,17679,17709,17738,17768,17798,17827,17857,17886,17916,17945,17975,18004,18034,18063,18093,18122,18152,18181,18211,18241,18270,18300,18330,18359,18388,18418,18447,18476,18506,18535,18565,18595,18625,18654,18684,18714,18743,18772,18802,18831,18860,18890,18919,18949,18979,19008,19038,19068,19098,19127,19156,19186,19215,19244,19274,19303,19333,19362,19392,19422,19452,19481,19511,19540,19570,19599,19628,19658,19687,19717,19746,19776,19806,19836,19865,19895,19924,19954,19983,20012,20042,20071,20101,20130,20160,20190,20219,20249,20279,20308,20338,20367,20396,20426,20455,20485,20514,20544,20573,20603,20633,20662,20692,20721,20751,20780,20810,20839,20869,20898,20928,20957,20987,21016,21046,21076,21105,21135,21164,21194,21223,21253,21282,21312,21341,21371,21400,21430,21459,21489,21519,21548,21578,21607,21637,21666,21696,21725,21754,21784,21813,21843,21873,21902,21932,21962,21991,22021,22050,22080,22109,22138,22168,22197,22227,22256,22286,22316,22346,22375,22405,22434,22464,22493,22522,22552,22581,22611,22640,22670,22700,22730,22759,22789,22818,22848,22877,22906,22936,22965,22994,23024,23054,23083,23113,23143,23173,23202,23232,23261,23290,23320,23349,23379,23408,23438,23467,23497,23527,23556,23586,23616,23645,23674,23704,23733,23763,23792,23822,23851,23881,23910,23940,23970,23999,24029,24058,24088,24117,24147,24176,24206,24235,24265,24294,24324,24353,24383,24413,24442,24472,24501,24531,24560,24590,24619,24648,24678,24707,24737,24767,24796,24826,24856,24885,24915,24944,24974,25003,25032,25062,25091,25121,25150,25180,25210,25240,25269,25299,25328,25358,25387,25416,25446,25475,25505,25534,25564,25594,25624,25653,25683,25712,25742,25771,25800,25830,25859,25888,25918,25948,25977,26007,26037,26067,26096,26126,26155,26184,26214,26243,26272,26302,26332,26361,26391,26421,26451,26480,26510,26539,26568,26598,26627,26656,26686,26715,26745,26775,26805,26834,26864,26893,26923,26952,26982,27011,27041,27070,27099,27129,27159,27188,27218,27248,27277,27307,27336,27366,27395,27425,27454,27484,27513,27542,27572,27602,27631,27661,27691,27720,27750,27779,27809,27838,27868,27897,27926,27956,27985,28015,28045,28074,28104,28134,28163,28193,28222,28252,28281,28310,28340,28369,28399,28428,28458,28488,28517,28547,28577,28607,28636,28665,28695,28724,28754,28783,28813,28843,28872,28901,28931,28960,28990,29019,29049,29078,29108,29137,29167,29196,29226,29255,29285,29315,29345,29375,29404,29434,29463,29492,29522,29551,29580,29610,29640,29669,29699,29729,29759,29788,29818,29847,29876,29906,29935,29964,29994,30023,30053,30082,30112,30141,30171,30200,30230,30259,30289,30318,30348,30378,30408,30437,30467,30496,30526,30555,30585,30614,30644,30673,30703,30732,30762,30791,30821,30850,30880,30909,30939,30968,30998,31027,31057,31086,31116,31145,31175,31204,31234,31263,31293,31322,31352,31381,31411,31441,31471,31500,31530,31559,31589,31618,31648,31676,31706,31736,31766,31795,31825,31854,31884,31913,31943,31972,32002,32031,32061,32090,32120,32150,32180,32209,32239,32268,32298,32327,32357,32386,32416,32445,32475,32504,32534,32563,32593,32622,32652,32681,32711,32740,32770,32799,32829,32858,32888,32917,32947,32976,33006,33035,33065,33094,33124,33153,33183,33213,33243,33272,33302,33331,33361,33390,33420,33450,33479,33509,33539,33568,33598,33627,33657,33686,33716,33745,33775,33804,33834,33863,33893,33922,33952,33981,34011,34040,34069,34099,34128,34158,34187,34217,34247,34277,34306,34336,34365,34395,34424,34454,34483,34512,34542,34571,34601,34631,34660,34690,34719,34749,34778,34808,34837,34867,34896,34926,34955,34985,35015,35044,35074,35103,35133,35162,35192,35222,35251,35280,35310,35340,35370,35399,35429,35458,35488,35517,35547,35576,35605,35635,35665,35694,35723,35753,35782,35811,35841,35871,35901,35930,35960,35989,36019,36048,36078,36107,36136,36166,36195,36225,36254,36284,36314,36343,36373,36403,36433,36462,36492,36521,36551,36580,36610,36639,36669,36698,36728,36757,36786,36816,36845,36875,36904,36934,36963,36993,37022,37052,37081,37111,37141,37170,37200,37229,37259,37288,37318,37347,37377,37406,37436,37465,37495,37524,37554,37584,37613,37643,37672,37701,37731,37760,37790,37819,37849,37878,37908,37938,37967,37997,38027,38056,38085,38115,38144,38174,38203,38233,38262,38292,38322,38351,38381,38410,38440,38469,38499,38528,38558,38587,38617,38646,38676,38705,38735,38764,38794,38823,38853,38882,38912,38941,38971,39001,39030,39059,39089,39118,39148,39178,39208,39237,39267,39297,39326,39355,39385,39414,39444,39473,39503,39532,39562,39592,39621,39650,39680,39709,39739,39768,39798,39827,39857,39886,39916,39946,39975,40005,40035,40064,40094,40123,40153,40182,40212,40241,40271,40300,40330,40359,40389,40418,40448,40477,40507,40536,40566,40595,40625,40655,40685,40714,40744,40773,40803,40832,40862,40892,40921,40951,40980,41009,41039,41068,41098,41127,41157,41186,41216,41245,41275,41304,41334,41364,41393,41422,41452,41481,41511,41540,41570,41599,41629,41658,41688,41718,41748,41777,41807,41836,41865,41894,41924,41953,41983,42012,42042,42072,42102,42131,42161,42190,42220,42249,42279,42308,42337,42367,42397,42426,42456,42485,42515,42545,42574,42604,42633,42662,42692,42721,42751,42780,42810,42839,42869,42899,42929,42958,42988,43017,43046,43076,43105,43135,43164,43194,43223,43253,43283,43312,43342,43371,43401,43430,43460,43489,43519,43548,43578,43607,43637,43666,43696,43726,43755,43785,43814,43844,43873,43903,43932,43962,43991,44021,44050,44080,44109,44139,44169,44198,44228,44258,44287,44317,44346,44375,44405,44434,44464,44493,44523,44553,44582,44612,44641,44671,44700,44730,44759,44788,44818,44847,44877,44906,44936,44966,44996,45025,45055,45084,45114,45143,45172,45202,45231,45261,45290,45320,45350,45380,45409,45439,45468,45498,45527,45556,45586,45615,45644,45674,45704,45733,45763,45793,45823,45852,45882,45911,45940,45970,45999,46028,46058,46088,46117,46147,46177,46206,46236,46265,46295,46324,46354,46383,46413,46442,46472,46501,46531,46560,46590,46620,46649,46679,46708,46738,46767,46797,46826,46856,46885,46915,46944,46974,47003,47033,47063,47092,47122,47151,47181,47210,47240,47269,47298,47328,47357,47387,47417,47446,47476,47506,47535,47565,47594,47624,47653,47682,47712,47741,47771,47800,47830,47860,47890,47919,47949,47978,48008,48037,48066,48096,48125,48155,48184,48214,48244,48273,48303,48333,48362,48392,48421,48450,48480,48509,48538,48568,48598,48627,48657,48687,48717,48746,48776,48805,48834,48864,48893,48922,48952,48982,49011,49041,49071,49100,49130,49160,49189,49218,49248,49277,49306,49336,49365,49395,49425,49455,49484,49514,49543,49573,49602,49632,49661,49690,49720,49749,49779,49809,49838,49868,49898,49927,49957,49986,50016,50045,50075,50104,50133,50163,50192,50222,50252,50281,50311,50340,50370,50400,50429,50459,50488,50518,50547,50576,50606,50635,50665,50694,50724,50754,50784,50813,50843,50872,50902,50931,50960,50990,51019,51049,51078,51108,51138,51167,51197,51227,51256,51286,51315,51345,51374,51403,51433,51462,51492,51522,51552,51582,51611,51641,51670,51699,51729,51758,51787,51816,51846,51876,51906,51936,51965,51995,52025,52054,52083,52113,52142,52171,52200,52230,52260,52290,52319,52349,52379,52408,52438,52467,52497,52526,52555,52585,52614,52644,52673,52703,52733,52762,52792,52822,52851,52881,52910,52939,52969,52998,53028,53057,53087,53116,53146,53176,53205,53235,53264,53294,53324,53353,53383,53412,53441,53471,53500,53530,53559,53589,53619,53648,53678,53708,53737,53767,53796,53825,53855,53884,53913,53943,53973,54003,54032,54062,54092,54121,54151,54180,54209,54239,54268,54297,54327,54357,54387,54416,54446,54476,54505,54535,54564,54593,54623,54652,54681,54711,54741,54770,54800,54830,54859,54889,54919,54948,54977,55007,55036,55066,55095,55125,55154,55184,55213,55243,55273,55302,55332,55361,55391,55420,55450,55479,55508,55538,55567,55597,55627,55657,55686,55716,55745,55775,55804,55834,55863,55892,55922,55951,55981,56011,56040,56070,56100,56129,56159,56188,56218,56247,56276,56306,56335,56365,56394,56424,56454,56483,56513,56543,56572,56601,56631,56660,56690,56719,56749,56778,56808,56837,56867,56897,56926,56956,56985,57015,57044,57074,57103,57133,57162,57192,57221,57251,57280,57310,57340,57369,57399,57429,57458,57487,57517,57546,57576,57605,57634,57664,57694,57723,57753,57783,57813,57842,57871,57901,57930,57959,57989,58018,58048,58077,58107,58137,58167,58196,58226,58255,58285,58314,58343,58373,58402,58432,58461,58491,58521,58551,58580,58610,58639,58669,58698,58727,58757,58786,58816,58845,58875,58905,58934,58964,58994,59023,59053,59082,59111,59141,59170,59200,59229,59259,59288,59318,59348,59377,59407,59436,59466,59495,59525,59554,59584,59613,59643,59672,59702,59731,59761,59791,59820,59850,59879,59909,59939,59968,59997,60027,60056,60086,60115,60145,60174,60204,60234,60264,60293,60323,60352,60381,60411,60440,60469,60499,60528,60558,60588,60618,60648,60677,60707,60736,60765,60795,60824,60853,60883,60912,60942,60972,61002,61031,61061,61090,61120,61149,61179,61208,61237,61267,61296,61326,61356,61385,61415,61445,61474,61504,61533,61563,61592,61621,61651,61680,61710,61739,61769,61799,61828,61858,61888,61917,61947,61976,62006,62035,62064,62094,62123,62153,62182,62212,62242,62271,62301,62331,62360,62390,62419,62448,62478,62507,62537,62566,62596,62625,62655,62685,62715,62744,62774,62803,62832,62862,62891,62921,62950,62980,63009,63039,63069,63099,63128,63157,63187,63216,63246,63275,63305,63334,63363,63393,63423,63453,63482,63512,63541,63571,63600,63630,63659,63689,63718,63747,63777,63807,63836,63866,63895,63925,63955,63984,64014,64043,64073,64102,64131,64161,64190,64220,64249,64279,64309,64339,64368,64398,64427,64457,64486,64515,64545,64574,64603,64633,64663,64692,64722,64752,64782,64811,64841,64870,64899,64929,64958,64987,65017,65047,65076,65106,65136,65166,65195,65225,65254,65283,65313,65342,65371,65401,65431,65460,65490,65520,65549,65579,65608,65638,65667,65697,65726,65755,65785,65815,65844,65874,65903,65933,65963,65992,66022,66051,66081,66110,66140,66169,66199,66228,66258,66287,66317,66346,66376,66405,66435,66465,66494,66524,66553,66583,66612,66641,66671,66700,66730,66760,66789,66819,66849,66878,66908,66937,66967,66996,67025,67055,67084,67114,67143,67173,67203,67233,67262,67292,67321,67351,67380,67409,67439,67468,67497,67527,67557,67587,67617,67646,67676,67705,67735,67764,67793,67823,67852,67882,67911,67941,67971,68e3,68030,68060,68089,68119,68148,68177,68207,68236,68266,68295,68325,68354,68384,68414,68443,68473,68502,68532,68561,68591,68620,68650,68679,68708,68738,68768,68797,68827,68857,68886,68916,68946,68975,69004,69034,69063,69092,69122,69152,69181,69211,69240,69270,69300,69330,69359,69388,69418,69447,69476,69506,69535,69565,69595,69624,69654,69684,69713,69743,69772,69802,69831,69861,69890,69919,69949,69978,70008,70038,70067,70097,70126,70156,70186,70215,70245,70274,70303,70333,70362,70392,70421,70451,70481,70510,70540,70570,70599,70629,70658,70687,70717,70746,70776,70805,70835,70864,70894,70924,70954,70983,71013,71042,71071,71101,71130,71159,71189,71218,71248,71278,71308,71337,71367,71397,71426,71455,71485,71514,71543,71573,71602,71632,71662,71691,71721,71751,71781,71810,71839,71869,71898,71927,71957,71986,72016,72046,72075,72105,72135,72164,72194,72223,72253,72282,72311,72341,72370,72400,72429,72459,72489,72518,72548,72577,72607,72637,72666,72695,72725,72754,72784,72813,72843,72872,72902,72931,72961,72991,73020,73050,73080,73109,73139,73168,73197,73227,73256,73286,73315,73345,73375,73404,73434,73464,73493,73523,73552,73581,73611,73640,73669,73699,73729,73758,73788,73818,73848,73877,73907,73936,73965,73995,74024,74053,74083,74113,74142,74172,74202,74231,74261,74291,74320,74349,74379,74408,74437,74467,74497,74526,74556,74586,74615,74645,74675,74704,74733,74763,74792,74822,74851,74881,74910,74940,74969,74999,75029,75058,75088,75117,75147,75176,75206,75235,75264,75294,75323,75353,75383,75412,75442,75472,75501,75531,75560,75590,75619,75648,75678,75707,75737,75766,75796,75826,75856,75885,75915,75944,75974,76003,76032,76062,76091,76121,76150,76180,76210,76239,76269,76299,76328,76358,76387,76416,76446,76475,76505,76534,76564,76593,76623,76653,76682,76712,76741,76771,76801,76830,76859,76889,76918,76948,76977,77007,77036,77066,77096,77125,77155,77185,77214,77243,77273,77302,77332,77361,77390,77420,77450,77479,77509,77539,77569,77598,77627,77657,77686,77715,77745,77774,77804,77833,77863,77893,77923,77952,77982,78011,78041,78070,78099,78129,78158,78188,78217,78247,78277,78307,78336,78366,78395,78425,78454,78483,78513,78542,78572,78601,78631,78661,78690,78720,78750,78779,78808,78838,78867,78897,78926,78956,78985,79015,79044,79074,79104,79133,79163,79192,79222,79251,79281,79310,79340,79369,79399,79428,79458,79487,79517,79546,79576,79606,79635,79665,79695,79724,79753,79783,79812,79841,79871,79900,79930,79960,79990]},{"../main":536,"object-assign":421}],536:[function(t,e,r){var n=t("object-assign");function i(){this.regionalOptions=[],this.regionalOptions[""]={invalidCalendar:"Calendar {0} not found",invalidDate:"Invalid {0} date",invalidMonth:"Invalid {0} month",invalidYear:"Invalid {0} year",differentCalendars:"Cannot mix {0} and {1} dates"},this.local=this.regionalOptions[""],this.calendars={},this._localCals={}}function a(t,e,r,n){if(this._calendar=t,this._year=e,this._month=r,this._day=n,0===this._calendar._validateLevel&&!this._calendar.isValid(this._year,this._month,this._day))throw(c.local.invalidDate||c.regionalOptions[""].invalidDate).replace(/\{0\}/,this._calendar.local.name)}function o(t,e){return"000000".substring(0,e-(t=""+t).length)+t}function s(){this.shortYearCutoff="+10"}function l(t){this.local=this.regionalOptions[t]||this.regionalOptions[""]}n(i.prototype,{instance:function(t,e){t=(t||"gregorian").toLowerCase(),e=e||"";var r=this._localCals[t+"-"+e];if(!r&&this.calendars[t]&&(r=new this.calendars[t](e),this._localCals[t+"-"+e]=r),!r)throw(this.local.invalidCalendar||this.regionalOptions[""].invalidCalendar).replace(/\{0\}/,t);return r},newDate:function(t,e,r,n,i){return(n=(null!=t&&t.year?t.calendar():"string"==typeof n?this.instance(n,i):n)||this.instance()).newDate(t,e,r)},substituteDigits:function(t){return function(e){return(e+"").replace(/[0-9]/g,function(e){return t[e]})}},substituteChineseDigits:function(t,e){return function(r){for(var n="",i=0;r>0;){var a=r%10;n=(0===a?"":t[a]+e[i])+n,i++,r=Math.floor(r/10)}return 0===n.indexOf(t[1]+e[1])&&(n=n.substr(1)),n||t[0]}}}),n(a.prototype,{newDate:function(t,e,r){return this._calendar.newDate(null==t?this:t,e,r)},year:function(t){return 0===arguments.length?this._year:this.set(t,"y")},month:function(t){return 0===arguments.length?this._month:this.set(t,"m")},day:function(t){return 0===arguments.length?this._day:this.set(t,"d")},date:function(t,e,r){if(!this._calendar.isValid(t,e,r))throw(c.local.invalidDate||c.regionalOptions[""].invalidDate).replace(/\{0\}/,this._calendar.local.name);return this._year=t,this._month=e,this._day=r,this},leapYear:function(){return this._calendar.leapYear(this)},epoch:function(){return this._calendar.epoch(this)},formatYear:function(){return this._calendar.formatYear(this)},monthOfYear:function(){return this._calendar.monthOfYear(this)},weekOfYear:function(){return this._calendar.weekOfYear(this)},daysInYear:function(){return this._calendar.daysInYear(this)},dayOfYear:function(){return this._calendar.dayOfYear(this)},daysInMonth:function(){return this._calendar.daysInMonth(this)},dayOfWeek:function(){return this._calendar.dayOfWeek(this)},weekDay:function(){return this._calendar.weekDay(this)},extraInfo:function(){return this._calendar.extraInfo(this)},add:function(t,e){return this._calendar.add(this,t,e)},set:function(t,e){return this._calendar.set(this,t,e)},compareTo:function(t){if(this._calendar.name!==t._calendar.name)throw(c.local.differentCalendars||c.regionalOptions[""].differentCalendars).replace(/\{0\}/,this._calendar.local.name).replace(/\{1\}/,t._calendar.local.name);var e=this._year!==t._year?this._year-t._year:this._month!==t._month?this.monthOfYear()-t.monthOfYear():this._day-t._day;return 0===e?0:e<0?-1:1},calendar:function(){return this._calendar},toJD:function(){return this._calendar.toJD(this)},fromJD:function(t){return this._calendar.fromJD(t)},toJSDate:function(){return this._calendar.toJSDate(this)},fromJSDate:function(t){return this._calendar.fromJSDate(t)},toString:function(){return(this.year()<0?"-":"")+o(Math.abs(this.year()),4)+"-"+o(this.month(),2)+"-"+o(this.day(),2)}}),n(s.prototype,{_validateLevel:0,newDate:function(t,e,r){return null==t?this.today():(t.year&&(this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[""].invalidDate),r=t.day(),e=t.month(),t=t.year()),new a(this,t,e,r))},today:function(){return this.fromJSDate(new Date)},epoch:function(t){return this._validate(t,this.minMonth,this.minDay,c.local.invalidYear||c.regionalOptions[""].invalidYear).year()<0?this.local.epochs[0]:this.local.epochs[1]},formatYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,c.local.invalidYear||c.regionalOptions[""].invalidYear);return(e.year()<0?"-":"")+o(Math.abs(e.year()),4)},monthsInYear:function(t){return this._validate(t,this.minMonth,this.minDay,c.local.invalidYear||c.regionalOptions[""].invalidYear),12},monthOfYear:function(t,e){var r=this._validate(t,e,this.minDay,c.local.invalidMonth||c.regionalOptions[""].invalidMonth);return(r.month()+this.monthsInYear(r)-this.firstMonth)%this.monthsInYear(r)+this.minMonth},fromMonthOfYear:function(t,e){var r=(e+this.firstMonth-2*this.minMonth)%this.monthsInYear(t)+this.minMonth;return this._validate(t,r,this.minDay,c.local.invalidMonth||c.regionalOptions[""].invalidMonth),r},daysInYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,c.local.invalidYear||c.regionalOptions[""].invalidYear);return this.leapYear(e)?366:365},dayOfYear:function(t,e,r){var n=this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[""].invalidDate);return n.toJD()-this.newDate(n.year(),this.fromMonthOfYear(n.year(),this.minMonth),this.minDay).toJD()+1},daysInWeek:function(){return 7},dayOfWeek:function(t,e,r){var n=this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[""].invalidDate);return(Math.floor(this.toJD(n))+2)%this.daysInWeek()},extraInfo:function(t,e,r){return this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[""].invalidDate),{}},add:function(t,e,r){return this._validate(t,this.minMonth,this.minDay,c.local.invalidDate||c.regionalOptions[""].invalidDate),this._correctAdd(t,this._add(t,e,r),e,r)},_add:function(t,e,r){if(this._validateLevel++,"d"===r||"w"===r){var n=t.toJD()+e*("w"===r?this.daysInWeek():1),i=t.calendar().fromJD(n);return this._validateLevel--,[i.year(),i.month(),i.day()]}try{var a=t.year()+("y"===r?e:0),o=t.monthOfYear()+("m"===r?e:0);i=t.day();"y"===r?(t.month()!==this.fromMonthOfYear(a,o)&&(o=this.newDate(a,t.month(),this.minDay).monthOfYear()),o=Math.min(o,this.monthsInYear(a)),i=Math.min(i,this.daysInMonth(a,this.fromMonthOfYear(a,o)))):"m"===r&&(!function(t){for(;o<t.minMonth;)a--,o+=t.monthsInYear(a);for(var e=t.monthsInYear(a);o>e-1+t.minMonth;)a++,o-=e,e=t.monthsInYear(a)}(this),i=Math.min(i,this.daysInMonth(a,this.fromMonthOfYear(a,o))));var s=[a,this.fromMonthOfYear(a,o),i];return this._validateLevel--,s}catch(t){throw this._validateLevel--,t}},_correctAdd:function(t,e,r,n){if(!(this.hasYearZero||"y"!==n&&"m"!==n||0!==e[0]&&t.year()>0==e[0]>0)){var i={y:[1,1,"y"],m:[1,this.monthsInYear(-1),"m"],w:[this.daysInWeek(),this.daysInYear(-1),"d"],d:[1,this.daysInYear(-1),"d"]}[n],a=r<0?-1:1;e=this._add(t,r*i[0]+a*i[1],i[2])}return t.date(e[0],e[1],e[2])},set:function(t,e,r){this._validate(t,this.minMonth,this.minDay,c.local.invalidDate||c.regionalOptions[""].invalidDate);var n="y"===r?e:t.year(),i="m"===r?e:t.month(),a="d"===r?e:t.day();return"y"!==r&&"m"!==r||(a=Math.min(a,this.daysInMonth(n,i))),t.date(n,i,a)},isValid:function(t,e,r){this._validateLevel++;var n=this.hasYearZero||0!==t;if(n){var i=this.newDate(t,e,this.minDay);n=e>=this.minMonth&&e-this.minMonth<this.monthsInYear(i)&&r>=this.minDay&&r-this.minDay<this.daysInMonth(i)}return this._validateLevel--,n},toJSDate:function(t,e,r){var n=this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[""].invalidDate);return c.instance().fromJD(this.toJD(n)).toJSDate()},fromJSDate:function(t){return this.fromJD(c.instance().fromJSDate(t).toJD())},_validate:function(t,e,r,n){if(t.year){if(0===this._validateLevel&&this.name!==t.calendar().name)throw(c.local.differentCalendars||c.regionalOptions[""].differentCalendars).replace(/\{0\}/,this.local.name).replace(/\{1\}/,t.calendar().local.name);return t}try{if(this._validateLevel++,1===this._validateLevel&&!this.isValid(t,e,r))throw n.replace(/\{0\}/,this.local.name);var i=this.newDate(t,e,r);return this._validateLevel--,i}catch(t){throw this._validateLevel--,t}}}),l.prototype=new s,n(l.prototype,{name:"Gregorian",jdEpoch:1721425.5,daysPerMonth:[31,28,31,30,31,30,31,31,30,31,30,31],hasYearZero:!1,minMonth:1,firstMonth:1,minDay:1,regionalOptions:{"":{name:"Gregorian",epochs:["BCE","CE"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],digits:null,dateFormat:"mm/dd/yyyy",firstDay:0,isRTL:!1}},leapYear:function(t){var e=this._validate(t,this.minMonth,this.minDay,c.local.invalidYear||c.regionalOptions[""].invalidYear);return(t=e.year()+(e.year()<0?1:0))%4==0&&(t%100!=0||t%400==0)},weekOfYear:function(t,e,r){var n=this.newDate(t,e,r);return n.add(4-(n.dayOfWeek()||7),"d"),Math.floor((n.dayOfYear()-1)/7)+1},daysInMonth:function(t,e){var r=this._validate(t,e,this.minDay,c.local.invalidMonth||c.regionalOptions[""].invalidMonth);return this.daysPerMonth[r.month()-1]+(2===r.month()&&this.leapYear(r.year())?1:0)},weekDay:function(t,e,r){return(this.dayOfWeek(t,e,r)||7)<6},toJD:function(t,e,r){var n=this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[""].invalidDate);t=n.year(),e=n.month(),r=n.day(),t<0&&t++,e<3&&(e+=12,t--);var i=Math.floor(t/100),a=2-i+Math.floor(i/4);return Math.floor(365.25*(t+4716))+Math.floor(30.6001*(e+1))+r+a-1524.5},fromJD:function(t){var e=Math.floor(t+.5),r=Math.floor((e-1867216.25)/36524.25),n=(r=e+1+r-Math.floor(r/4))+1524,i=Math.floor((n-122.1)/365.25),a=Math.floor(365.25*i),o=Math.floor((n-a)/30.6001),s=n-a-Math.floor(30.6001*o),l=o-(o>13.5?13:1),c=i-(l>2.5?4716:4715);return c<=0&&c--,this.newDate(c,l,s)},toJSDate:function(t,e,r){var n=this._validate(t,e,r,c.local.invalidDate||c.regionalOptions[""].invalidDate),i=new Date(n.year(),n.month()-1,n.day());return i.setHours(0),i.setMinutes(0),i.setSeconds(0),i.setMilliseconds(0),i.setHours(i.getHours()>12?i.getHours()+2:0),i},fromJSDate:function(t){return this.newDate(t.getFullYear(),t.getMonth()+1,t.getDate())}});var c=e.exports=new i;c.cdate=a,c.baseCalendar=s,c.calendars.gregorian=l},{"object-assign":421}],537:[function(t,e,r){var n=t("object-assign"),i=t("./main");n(i.regionalOptions[""],{invalidArguments:"Invalid arguments",invalidFormat:"Cannot format a date from another calendar",missingNumberAt:"Missing number at position {0}",unknownNameAt:"Unknown name at position {0}",unexpectedLiteralAt:"Unexpected literal at position {0}",unexpectedText:"Additional text found at end"}),i.local=i.regionalOptions[""],n(i.cdate.prototype,{formatDate:function(t,e){return"string"!=typeof t&&(e=t,t=""),this._calendar.formatDate(t||"",this,e)}}),n(i.baseCalendar.prototype,{UNIX_EPOCH:i.instance().newDate(1970,1,1).toJD(),SECS_PER_DAY:86400,TICKS_EPOCH:i.instance().jdEpoch,TICKS_PER_DAY:864e9,ATOM:"yyyy-mm-dd",COOKIE:"D, dd M yyyy",FULL:"DD, MM d, yyyy",ISO_8601:"yyyy-mm-dd",JULIAN:"J",RFC_822:"D, d M yy",RFC_850:"DD, dd-M-yy",RFC_1036:"D, d M yy",RFC_1123:"D, d M yyyy",RFC_2822:"D, d M yyyy",RSS:"D, d M yy",TICKS:"!",TIMESTAMP:"@",W3C:"yyyy-mm-dd",formatDate:function(t,e,r){if("string"!=typeof t&&(r=e,e=t,t=""),!e)return"";if(e.calendar()!==this)throw i.local.invalidFormat||i.regionalOptions[""].invalidFormat;t=t||this.local.dateFormat;for(var n,a,o,s,l=(r=r||{}).dayNamesShort||this.local.dayNamesShort,c=r.dayNames||this.local.dayNames,u=r.monthNumbers||this.local.monthNumbers,h=r.monthNamesShort||this.local.monthNamesShort,f=r.monthNames||this.local.monthNames,p=(r.calculateWeek||this.local.calculateWeek,function(e,r){for(var n=1;w+n<t.length&&t.charAt(w+n)===e;)n++;return w+=n-1,Math.floor(n/(r||1))>1}),d=function(t,e,r,n){var i=""+e;if(p(t,n))for(;i.length<r;)i="0"+i;return i},g=this,m=function(t){return"function"==typeof u?u.call(g,t,p("m")):x(d("m",t.month(),2))},v=function(t,e){return e?"function"==typeof f?f.call(g,t):f[t.month()-g.minMonth]:"function"==typeof h?h.call(g,t):h[t.month()-g.minMonth]},y=this.local.digits,x=function(t){return r.localNumbers&&y?y(t):t},b="",_=!1,w=0;w<t.length;w++)if(_)"'"!==t.charAt(w)||p("'")?b+=t.charAt(w):_=!1;else switch(t.charAt(w)){case"d":b+=x(d("d",e.day(),2));break;case"D":b+=(n="D",a=e.dayOfWeek(),o=l,s=c,p(n)?s[a]:o[a]);break;case"o":b+=d("o",e.dayOfYear(),3);break;case"w":b+=d("w",e.weekOfYear(),2);break;case"m":b+=m(e);break;case"M":b+=v(e,p("M"));break;case"y":b+=p("y",2)?e.year():(e.year()%100<10?"0":"")+e.year()%100;break;case"Y":p("Y",2),b+=e.formatYear();break;case"J":b+=e.toJD();break;case"@":b+=(e.toJD()-this.UNIX_EPOCH)*this.SECS_PER_DAY;break;case"!":b+=(e.toJD()-this.TICKS_EPOCH)*this.TICKS_PER_DAY;break;case"'":p("'")?b+="'":_=!0;break;default:b+=t.charAt(w)}return b},parseDate:function(t,e,r){if(null==e)throw i.local.invalidArguments||i.regionalOptions[""].invalidArguments;if(""===(e="object"==typeof e?e.toString():e+""))return null;t=t||this.local.dateFormat;var n=(r=r||{}).shortYearCutoff||this.shortYearCutoff;n="string"!=typeof n?n:this.today().year()%100+parseInt(n,10);for(var a=r.dayNamesShort||this.local.dayNamesShort,o=r.dayNames||this.local.dayNames,s=r.parseMonth||this.local.parseMonth,l=r.monthNumbers||this.local.monthNumbers,c=r.monthNamesShort||this.local.monthNamesShort,u=r.monthNames||this.local.monthNames,h=-1,f=-1,p=-1,d=-1,g=-1,m=!1,v=!1,y=function(e,r){for(var n=1;T+n<t.length&&t.charAt(T+n)===e;)n++;return T+=n-1,Math.floor(n/(r||1))>1},x=function(t,r){var n=y(t,r),a=[2,3,n?4:2,n?4:2,10,11,20]["oyYJ@!".indexOf(t)+1],o=new RegExp("^-?\\d{1,"+a+"}"),s=e.substring(A).match(o);if(!s)throw(i.local.missingNumberAt||i.regionalOptions[""].missingNumberAt).replace(/\{0\}/,A);return A+=s[0].length,parseInt(s[0],10)},b=this,_=function(){if("function"==typeof l){y("m");var t=l.call(b,e.substring(A));return A+=t.length,t}return x("m")},w=function(t,r,n,a){for(var o=y(t,a)?n:r,s=0;s<o.length;s++)if(e.substr(A,o[s].length).toLowerCase()===o[s].toLowerCase())return A+=o[s].length,s+b.minMonth;throw(i.local.unknownNameAt||i.regionalOptions[""].unknownNameAt).replace(/\{0\}/,A)},k=function(){if("function"==typeof u){var t=y("M")?u.call(b,e.substring(A)):c.call(b,e.substring(A));return A+=t.length,t}return w("M",c,u)},M=function(){if(e.charAt(A)!==t.charAt(T))throw(i.local.unexpectedLiteralAt||i.regionalOptions[""].unexpectedLiteralAt).replace(/\{0\}/,A);A++},A=0,T=0;T<t.length;T++)if(v)"'"!==t.charAt(T)||y("'")?M():v=!1;else switch(t.charAt(T)){case"d":d=x("d");break;case"D":w("D",a,o);break;case"o":g=x("o");break;case"w":x("w");break;case"m":p=_();break;case"M":p=k();break;case"y":var S=T;m=!y("y",2),T=S,f=x("y",2);break;case"Y":f=x("Y",2);break;case"J":h=x("J")+.5,"."===e.charAt(A)&&(A++,x("J"));break;case"@":h=x("@")/this.SECS_PER_DAY+this.UNIX_EPOCH;break;case"!":h=x("!")/this.TICKS_PER_DAY+this.TICKS_EPOCH;break;case"*":A=e.length;break;case"'":y("'")?M():v=!0;break;default:M()}if(A<e.length)throw i.local.unexpectedText||i.regionalOptions[""].unexpectedText;if(-1===f?f=this.today().year():f<100&&m&&(f+=-1===n?1900:this.today().year()-this.today().year()%100-(f<=n?0:100)),"string"==typeof p&&(p=s.call(this,f,p)),g>-1){p=1,d=g;for(var E=this.daysInMonth(f,p);d>E;E=this.daysInMonth(f,p))p++,d-=E}return h>-1?this.fromJD(h):this.newDate(f,p,d)},determineDate:function(t,e,r,n,i){r&&"object"!=typeof r&&(i=n,n=r,r=null),"string"!=typeof n&&(i=n,n="");var a=this;return e=e?e.newDate():null,t=null==t?e:"string"==typeof t?function(t){try{return a.parseDate(n,t,i)}catch(t){}for(var e=((t=t.toLowerCase()).match(/^c/)&&r?r.newDate():null)||a.today(),o=/([+-]?[0-9]+)\s*(d|w|m|y)?/g,s=o.exec(t);s;)e.add(parseInt(s[1],10),s[2]||"d"),s=o.exec(t);return e}(t):"number"==typeof t?isNaN(t)||t===1/0||t===-1/0?e:a.today().add(t,"d"):a.newDate(t)}})},{"./main":536,"object-assign":421}],538:[function(t,e,r){e.exports=t("cwise-compiler")({args:["array",{offset:[1],array:0},"scalar","scalar","index"],pre:{body:"{}",args:[],thisVars:[],localVars:[]},post:{body:"{}",args:[],thisVars:[],localVars:[]},body:{body:"{\n        var _inline_1_da = _inline_1_arg0_ - _inline_1_arg3_\n        var _inline_1_db = _inline_1_arg1_ - _inline_1_arg3_\n        if((_inline_1_da >= 0) !== (_inline_1_db >= 0)) {\n          _inline_1_arg2_.push(_inline_1_arg4_[0] + 0.5 + 0.5 * (_inline_1_da + _inline_1_db) / (_inline_1_da - _inline_1_db))\n        }\n      }",args:[{name:"_inline_1_arg0_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_1_arg1_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_1_arg2_",lvalue:!1,rvalue:!0,count:1},{name:"_inline_1_arg3_",lvalue:!1,rvalue:!0,count:2},{name:"_inline_1_arg4_",lvalue:!1,rvalue:!0,count:1}],thisVars:[],localVars:["_inline_1_da","_inline_1_db"]},funcName:"zeroCrossings"})},{"cwise-compiler":133}],539:[function(t,e,r){"use strict";e.exports=function(t,e){var r=[];return e=+e||0,n(t.hi(t.shape[0]-1),r,e),r};var n=t("./lib/zc-core")},{"./lib/zc-core":538}],540:[function(t,e,r){"use strict";e.exports=[{path:"",backoff:0},{path:"M-2.4,-3V3L0.6,0Z",backoff:.6},{path:"M-3.7,-2.5V2.5L1.3,0Z",backoff:1.3},{path:"M-4.45,-3L-1.65,-0.2V0.2L-4.45,3L1.55,0Z",backoff:1.55},{path:"M-2.2,-2.2L-0.2,-0.2V0.2L-2.2,2.2L-1.4,3L1.6,0L-1.4,-3Z",backoff:1.6},{path:"M-4.4,-2.1L-0.6,-0.2V0.2L-4.4,2.1L-4,3L2,0L-4,-3Z",backoff:2},{path:"M2,0A2,2 0 1,1 0,-2A2,2 0 0,1 2,0Z",backoff:0,noRotate:!0},{path:"M2,2V-2H-2V2Z",backoff:0,noRotate:!0}]},{}],541:[function(t,e,r){"use strict";var n=t("./arrow_paths"),i=t("../../plots/font_attributes"),a=t("../../plots/cartesian/constants"),o=t("../../plot_api/plot_template").templatedArray;e.exports=o("annotation",{visible:{valType:"boolean",dflt:!0,editType:"calcIfAutorange+arraydraw"},text:{valType:"string",editType:"calcIfAutorange+arraydraw"},textangle:{valType:"angle",dflt:0,editType:"calcIfAutorange+arraydraw"},font:i({editType:"calcIfAutorange+arraydraw",colorEditType:"arraydraw"}),width:{valType:"number",min:1,dflt:null,editType:"calcIfAutorange+arraydraw"},height:{valType:"number",min:1,dflt:null,editType:"calcIfAutorange+arraydraw"},opacity:{valType:"number",min:0,max:1,dflt:1,editType:"arraydraw"},align:{valType:"enumerated",values:["left","center","right"],dflt:"center",editType:"arraydraw"},valign:{valType:"enumerated",values:["top","middle","bottom"],dflt:"middle",editType:"arraydraw"},bgcolor:{valType:"color",dflt:"rgba(0,0,0,0)",editType:"arraydraw"},bordercolor:{valType:"color",dflt:"rgba(0,0,0,0)",editType:"arraydraw"},borderpad:{valType:"number",min:0,dflt:1,editType:"calcIfAutorange+arraydraw"},borderwidth:{valType:"number",min:0,dflt:1,editType:"calcIfAutorange+arraydraw"},showarrow:{valType:"boolean",dflt:!0,editType:"calcIfAutorange+arraydraw"},arrowcolor:{valType:"color",editType:"arraydraw"},arrowhead:{valType:"integer",min:0,max:n.length,dflt:1,editType:"arraydraw"},startarrowhead:{valType:"integer",min:0,max:n.length,dflt:1,editType:"arraydraw"},arrowside:{valType:"flaglist",flags:["end","start"],extras:["none"],dflt:"end",editType:"arraydraw"},arrowsize:{valType:"number",min:.3,dflt:1,editType:"calcIfAutorange+arraydraw"},startarrowsize:{valType:"number",min:.3,dflt:1,editType:"calcIfAutorange+arraydraw"},arrowwidth:{valType:"number",min:.1,editType:"calcIfAutorange+arraydraw"},standoff:{valType:"number",min:0,dflt:0,editType:"calcIfAutorange+arraydraw"},startstandoff:{valType:"number",min:0,dflt:0,editType:"calcIfAutorange+arraydraw"},ax:{valType:"any",editType:"calcIfAutorange+arraydraw"},ay:{valType:"any",editType:"calcIfAutorange+arraydraw"},axref:{valType:"enumerated",dflt:"pixel",values:["pixel",a.idRegex.x.toString()],editType:"calc"},ayref:{valType:"enumerated",dflt:"pixel",values:["pixel",a.idRegex.y.toString()],editType:"calc"},xref:{valType:"enumerated",values:["paper",a.idRegex.x.toString()],editType:"calc"},x:{valType:"any",editType:"calcIfAutorange+arraydraw"},xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"auto",editType:"calcIfAutorange+arraydraw"},xshift:{valType:"number",dflt:0,editType:"calcIfAutorange+arraydraw"},yref:{valType:"enumerated",values:["paper",a.idRegex.y.toString()],editType:"calc"},y:{valType:"any",editType:"calcIfAutorange+arraydraw"},yanchor:{valType:"enumerated",values:["auto","top","middle","bottom"],dflt:"auto",editType:"calcIfAutorange+arraydraw"},yshift:{valType:"number",dflt:0,editType:"calcIfAutorange+arraydraw"},clicktoshow:{valType:"enumerated",values:[!1,"onoff","onout"],dflt:!1,editType:"arraydraw"},xclick:{valType:"any",editType:"arraydraw"},yclick:{valType:"any",editType:"arraydraw"},hovertext:{valType:"string",editType:"arraydraw"},hoverlabel:{bgcolor:{valType:"color",editType:"arraydraw"},bordercolor:{valType:"color",editType:"arraydraw"},font:i({editType:"arraydraw"}),editType:"arraydraw"},captureevents:{valType:"boolean",editType:"arraydraw"},editType:"calc",_deprecated:{ref:{valType:"string",editType:"calc"}}})},{"../../plot_api/plot_template":722,"../../plots/cartesian/constants":737,"../../plots/font_attributes":758,"./arrow_paths":540}],542:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes"),a=t("./draw").draw;function o(t){var e=t._fullLayout;n.filterVisible(e.annotations).forEach(function(e){var r,n,a,o,s=i.getFromId(t,e.xref),l=i.getFromId(t,e.yref),c=3*e.arrowsize*e.arrowwidth||0,u=3*e.startarrowsize*e.arrowwidth||0;s&&s.autorange&&(r=c+e.xshift,n=c-e.xshift,a=u+e.xshift,o=u-e.xshift,e.axref===e.xref?(i.expand(s,[s.r2c(e.x)],{ppadplus:r,ppadminus:n}),i.expand(s,[s.r2c(e.ax)],{ppadplus:Math.max(e._xpadplus,a),ppadminus:Math.max(e._xpadminus,o)})):(a=e.ax?a+e.ax:a,o=e.ax?o-e.ax:o,i.expand(s,[s.r2c(e.x)],{ppadplus:Math.max(e._xpadplus,r,a),ppadminus:Math.max(e._xpadminus,n,o)}))),l&&l.autorange&&(r=c-e.yshift,n=c+e.yshift,a=u-e.yshift,o=u+e.yshift,e.ayref===e.yref?(i.expand(l,[l.r2c(e.y)],{ppadplus:r,ppadminus:n}),i.expand(l,[l.r2c(e.ay)],{ppadplus:Math.max(e._ypadplus,a),ppadminus:Math.max(e._ypadminus,o)})):(a=e.ay?a+e.ay:a,o=e.ay?o-e.ay:o,i.expand(l,[l.r2c(e.y)],{ppadplus:Math.max(e._ypadplus,r,a),ppadminus:Math.max(e._ypadminus,n,o)})))})}e.exports=function(t){var e=t._fullLayout,r=n.filterVisible(e.annotations);if(r.length&&t._fullData.length){var s={};for(var l in r.forEach(function(t){s[t.xref]=1,s[t.yref]=1}),s){var c=i.getFromId(t,l);if(c&&c.autorange)return n.syncOrAsync([a,o],t)}}}},{"../../lib":684,"../../plots/cartesian/axes":732,"./draw":547}],543:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../registry"),a=t("../../plot_api/plot_template").arrayEditor;function o(t,e){var r,n,i,a,o,l,c,u=t._fullLayout.annotations,h=[],f=[],p=[],d=(e||[]).length;for(r=0;r<u.length;r++)if(a=(i=u[r]).clicktoshow){for(n=0;n<d;n++)if(l=(o=e[n]).xaxis,c=o.yaxis,l._id===i.xref&&c._id===i.yref&&l.d2r(o.x)===s(i._xclick,l)&&c.d2r(o.y)===s(i._yclick,c)){(i.visible?"onout"===a?f:p:h).push(r);break}n===d&&i.visible&&"onout"===a&&f.push(r)}return{on:h,off:f,explicitOff:p}}function s(t,e){return"log"===e.type?e.l2r(t):e.d2r(t)}e.exports={hasClickToShow:function(t,e){var r=o(t,e);return r.on.length>0||r.explicitOff.length>0},onClick:function(t,e){var r,s,l=o(t,e),c=l.on,u=l.off.concat(l.explicitOff),h={},f=t._fullLayout.annotations;if(!c.length&&!u.length)return;for(r=0;r<c.length;r++)(s=a(t.layout,"annotations",f[c[r]])).modifyItem("visible",!0),n.extendFlat(h,s.getUpdateObj());for(r=0;r<u.length;r++)(s=a(t.layout,"annotations",f[u[r]])).modifyItem("visible",!1),n.extendFlat(h,s.getUpdateObj());return i.call("update",t,{},h)}}},{"../../lib":684,"../../plot_api/plot_template":722,"../../registry":817}],544:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../color");e.exports=function(t,e,r,a){a("opacity");var o=a("bgcolor"),s=a("bordercolor"),l=i.opacity(s);a("borderpad");var c=a("borderwidth"),u=a("showarrow");if(a("text",u?" ":r._dfltTitle.annotation),a("textangle"),n.coerceFont(a,"font",r.font),a("width"),a("align"),a("height")&&a("valign"),u){var h,f,p=a("arrowside");-1!==p.indexOf("end")&&(h=a("arrowhead"),f=a("arrowsize")),-1!==p.indexOf("start")&&(a("startarrowhead",h),a("startarrowsize",f)),a("arrowcolor",l?e.bordercolor:i.defaultLine),a("arrowwidth",2*(l&&c||1)),a("standoff"),a("startstandoff")}var d=a("hovertext"),g=r.hoverlabel||{};if(d){var m=a("hoverlabel.bgcolor",g.bgcolor||(i.opacity(o)?i.rgb(o):i.defaultLine)),v=a("hoverlabel.bordercolor",g.bordercolor||i.contrast(m));n.coerceFont(a,"hoverlabel.font",{family:g.font.family,size:g.font.size,color:g.font.color||v})}a("captureevents",!!d)}},{"../../lib":684,"../color":558}],545:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib/to_log_range");e.exports=function(t,e,r,a){e=e||{};var o="log"===r&&"linear"===e.type,s="linear"===r&&"log"===e.type;if(o||s)for(var l,c,u=t._fullLayout.annotations,h=e._id.charAt(0),f=0;f<u.length;f++)l=u[f],c="annotations["+f+"].",l[h+"ref"]===e._id&&p(h),l["a"+h+"ref"]===e._id&&p("a"+h);function p(t){var r=l[t],s=null;s=o?i(r,e.range):Math.pow(10,r),n(s)||(s=null),a(c+t,s)}}},{"../../lib/to_log_range":710,"fast-isnumeric":214}],546:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes"),a=t("../../plots/array_container_defaults"),o=t("./common_defaults"),s=t("./attributes");function l(t,e,r){function a(r,i){return n.coerce(t,e,s,r,i)}var l=a("visible"),c=a("clicktoshow");if(l||c){o(t,e,r,a);for(var u=e.showarrow,h=["x","y"],f=[-10,-30],p={_fullLayout:r},d=0;d<2;d++){var g=h[d],m=i.coerceRef(t,e,p,g,"","paper");if(i.coercePosition(e,p,a,m,g,.5),u){var v="a"+g,y=i.coerceRef(t,e,p,v,"pixel");"pixel"!==y&&y!==m&&(y=e[v]="pixel");var x="pixel"===y?f[d]:.4;i.coercePosition(e,p,a,y,v,x)}a(g+"anchor"),a(g+"shift")}if(n.noneOrAll(t,e,["x","y"]),u&&n.noneOrAll(t,e,["ax","ay"]),c){var b=a("xclick"),_=a("yclick");e._xclick=void 0===b?e.x:i.cleanPosition(b,p,e.xref),e._yclick=void 0===_?e.y:i.cleanPosition(_,p,e.yref)}}}e.exports=function(t,e){a(t,e,{name:"annotations",handleItemDefaults:l})}},{"../../lib":684,"../../plots/array_container_defaults":728,"../../plots/cartesian/axes":732,"./attributes":541,"./common_defaults":544}],547:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../registry"),a=t("../../plots/plots"),o=t("../../lib"),s=t("../../plots/cartesian/axes"),l=t("../color"),c=t("../drawing"),u=t("../fx"),h=t("../../lib/svg_text_utils"),f=t("../../lib/setcursor"),p=t("../dragelement"),d=t("../../plot_api/plot_template").arrayEditor,g=t("./draw_arrow_head");function m(t,e){var r=t._fullLayout.annotations[e]||{};v(t,r,e,!1,s.getFromId(t,r.xref),s.getFromId(t,r.yref))}function v(t,e,r,a,s,m){var v,y,x=t._fullLayout,b=t._fullLayout._size,_=t._context.edits;a?(v="annotation-"+a,y=a+".annotations"):(v="annotation",y="annotations");var w=d(t.layout,y,e),k=w.modifyBase,M=w.modifyItem,A=w.getUpdateObj;x._infolayer.selectAll("."+v+'[data-index="'+r+'"]').remove();var T="clip"+x._uid+"_ann"+r;if(e._input&&!1!==e.visible){var S={x:{},y:{}},E=+e.textangle||0,C=x._infolayer.append("g").classed(v,!0).attr("data-index",String(r)).style("opacity",e.opacity),L=C.append("g").classed("annotation-text-g",!0),z=_[e.showarrow?"annotationTail":"annotationPosition"],P=e.captureevents||_.annotationText||z,I=L.append("g").style("pointer-events",P?"all":null).call(f,"pointer").on("click",function(){t._dragging=!1;var i={index:r,annotation:e._input,fullAnnotation:e,event:n.event};a&&(i.subplotId=a),t.emit("plotly_clickannotation",i)});e.hovertext&&I.on("mouseover",function(){var r=e.hoverlabel,n=r.font,i=this.getBoundingClientRect(),a=t.getBoundingClientRect();u.loneHover({x0:i.left-a.left,x1:i.right-a.left,y:(i.top+i.bottom)/2-a.top,text:e.hovertext,color:r.bgcolor,borderColor:r.bordercolor,fontFamily:n.family,fontSize:n.size,fontColor:n.color},{container:x._hoverlayer.node(),outerContainer:x._paper.node(),gd:t})}).on("mouseout",function(){u.loneUnhover(x._hoverlayer.node())});var O=e.borderwidth,D=e.borderpad,R=O+D,B=I.append("rect").attr("class","bg").style("stroke-width",O+"px").call(l.stroke,e.bordercolor).call(l.fill,e.bgcolor),F=e.width||e.height,N=x._topclips.selectAll("#"+T).data(F?[0]:[]);N.enter().append("clipPath").classed("annclip",!0).attr("id",T).append("rect"),N.exit().remove();var j=e.font,V=I.append("text").classed("annotation-text",!0).text(e.text);_.annotationText?V.call(h.makeEditable,{delegate:I,gd:t}).call(U).on("edit",function(r){e.text=r,this.call(U),M("text",r),s&&s.autorange&&k(s._name+".autorange",!0),m&&m.autorange&&k(m._name+".autorange",!0),i.call("relayout",t,A())}):V.call(U)}else n.selectAll("#"+T).remove();function U(r){return r.call(c.font,j).attr({"text-anchor":{left:"start",right:"end"}[e.align]||"middle"}),h.convertToTspans(r,t,q),r}function q(){var r=V.selectAll("a");1===r.size()&&r.text()===V.text()&&I.insert("a",":first-child").attr({"xlink:xlink:href":r.attr("xlink:href"),"xlink:xlink:show":r.attr("xlink:show")}).style({cursor:"pointer"}).node().appendChild(B.node());var n=I.select(".annotation-text-math-group"),u=!n.empty(),d=c.bBox((u?n:V).node()),v=d.width,y=d.height,w=e.width||v,P=e.height||y,D=Math.round(w+2*R),j=Math.round(P+2*R);function U(t,e){return"auto"===e&&(e=t<1/3?"left":t>2/3?"right":"center"),{center:0,middle:0,left:.5,bottom:-.5,right:-.5,top:.5}[e]}e._w=w,e._h=P;for(var q=!1,H=["x","y"],G=0;G<H.length;G++){var W,Y,X,Z,$,J=H[G],K=e[J+"ref"]||J,Q=e["a"+J+"ref"],tt={x:s,y:m}[J],et=(E+("x"===J?0:-90))*Math.PI/180,rt=D*Math.cos(et),nt=j*Math.sin(et),it=Math.abs(rt)+Math.abs(nt),at=e[J+"anchor"],ot=e[J+"shift"]*("x"===J?1:-1),st=S[J];if(tt){var lt=tt.r2fraction(e[J]);if((t._dragging||!tt.autorange)&&(lt<0||lt>1)&&(Q===K?((lt=tt.r2fraction(e["a"+J]))<0||lt>1)&&(q=!0):q=!0,q))continue;W=tt._offset+tt.r2p(e[J]),Z=.5}else"x"===J?(X=e[J],W=b.l+b.w*X):(X=1-e[J],W=b.t+b.h*X),Z=e.showarrow?.5:X;if(e.showarrow){st.head=W;var ct=e["a"+J];$=rt*U(.5,e.xanchor)-nt*U(.5,e.yanchor),Q===K?(st.tail=tt._offset+tt.r2p(ct),Y=$):(st.tail=W+ct,Y=$+ct),st.text=st.tail+$;var ut=x["x"===J?"width":"height"];if("paper"===K&&(st.head=o.constrain(st.head,1,ut-1)),"pixel"===Q){var ht=-Math.max(st.tail-3,st.text),ft=Math.min(st.tail+3,st.text)-ut;ht>0?(st.tail+=ht,st.text+=ht):ft>0&&(st.tail-=ft,st.text-=ft)}st.tail+=ot,st.head+=ot}else Y=$=it*U(Z,at),st.text=W+$;st.text+=ot,$+=ot,Y+=ot,e["_"+J+"padplus"]=it/2+Y,e["_"+J+"padminus"]=it/2-Y,e["_"+J+"size"]=it,e["_"+J+"shift"]=$}if(q)I.remove();else{var pt=0,dt=0;if("left"!==e.align&&(pt=(w-v)*("center"===e.align?.5:1)),"top"!==e.valign&&(dt=(P-y)*("middle"===e.valign?.5:1)),u)n.select("svg").attr({x:R+pt-1,y:R+dt}).call(c.setClipUrl,F?T:null);else{var gt=R+dt-d.top,mt=R+pt-d.left;V.call(h.positionText,mt,gt).call(c.setClipUrl,F?T:null)}N.select("rect").call(c.setRect,R,R,w,P),B.call(c.setRect,O/2,O/2,D-O,j-O),I.call(c.setTranslate,Math.round(S.x.text-D/2),Math.round(S.y.text-j/2)),L.attr({transform:"rotate("+E+","+S.x.text+","+S.y.text+")"});var vt,yt=function(r,n){C.selectAll(".annotation-arrow-g").remove();var u=S.x.head,h=S.y.head,f=S.x.tail+r,d=S.y.tail+n,v=S.x.text+r,y=S.y.text+n,x=o.rotationXYMatrix(E,v,y),w=o.apply2DTransform(x),T=o.apply2DTransform2(x),z=+B.attr("width"),P=+B.attr("height"),O=v-.5*z,D=O+z,R=y-.5*P,F=R+P,N=[[O,R,O,F],[O,F,D,F],[D,F,D,R],[D,R,O,R]].map(T);if(!N.reduce(function(t,e){return t^!!o.segmentsIntersect(u,h,u+1e6,h+1e6,e[0],e[1],e[2],e[3])},!1)){N.forEach(function(t){var e=o.segmentsIntersect(f,d,u,h,t[0],t[1],t[2],t[3]);e&&(f=e.x,d=e.y)});var j=e.arrowwidth,V=e.arrowcolor,U=e.arrowside,q=C.append("g").style({opacity:l.opacity(V)}).classed("annotation-arrow-g",!0),H=q.append("path").attr("d","M"+f+","+d+"L"+u+","+h).style("stroke-width",j+"px").call(l.stroke,l.rgb(V));if(g(H,U,e),_.annotationPosition&&H.node().parentNode&&!a){var G=u,W=h;if(e.standoff){var Y=Math.sqrt(Math.pow(u-f,2)+Math.pow(h-d,2));G+=e.standoff*(f-u)/Y,W+=e.standoff*(d-h)/Y}var X,Z,$=q.append("path").classed("annotation-arrow",!0).classed("anndrag",!0).classed("cursor-move",!0).attr({d:"M3,3H-3V-3H3ZM0,0L"+(f-G)+","+(d-W),transform:"translate("+G+","+W+")"}).style("stroke-width",j+6+"px").call(l.stroke,"rgba(0,0,0,0)").call(l.fill,"rgba(0,0,0,0)");p.init({element:$.node(),gd:t,prepFn:function(){var t=c.getTranslate(I);X=t.x,Z=t.y,s&&s.autorange&&k(s._name+".autorange",!0),m&&m.autorange&&k(m._name+".autorange",!0)},moveFn:function(t,r){var n=w(X,Z),i=n[0]+t,a=n[1]+r;I.call(c.setTranslate,i,a),M("x",s?s.p2r(s.r2p(e.x)+t):e.x+t/b.w),M("y",m?m.p2r(m.r2p(e.y)+r):e.y-r/b.h),e.axref===e.xref&&M("ax",s.p2r(s.r2p(e.ax)+t)),e.ayref===e.yref&&M("ay",m.p2r(m.r2p(e.ay)+r)),q.attr("transform","translate("+t+","+r+")"),L.attr({transform:"rotate("+E+","+i+","+a+")"})},doneFn:function(){i.call("relayout",t,A());var e=document.querySelector(".js-notes-box-panel");e&&e.redraw(e.selectedObj)}})}}};if(e.showarrow&&yt(0,0),z)p.init({element:I.node(),gd:t,prepFn:function(){vt=L.attr("transform")},moveFn:function(t,r){var n="pointer";if(e.showarrow)e.axref===e.xref?M("ax",s.p2r(s.r2p(e.ax)+t)):M("ax",e.ax+t),e.ayref===e.yref?M("ay",m.p2r(m.r2p(e.ay)+r)):M("ay",e.ay+r),yt(t,r);else{if(a)return;var i,o;if(s)i=s.p2r(s.r2p(e.x)+t);else{var l=e._xsize/b.w,c=e.x+(e._xshift-e.xshift)/b.w-l/2;i=p.align(c+t/b.w,l,0,1,e.xanchor)}if(m)o=m.p2r(m.r2p(e.y)+r);else{var u=e._ysize/b.h,h=e.y-(e._yshift+e.yshift)/b.h-u/2;o=p.align(h-r/b.h,u,0,1,e.yanchor)}M("x",i),M("y",o),s&&m||(n=p.getCursor(s?.5:i,m?.5:o,e.xanchor,e.yanchor))}L.attr({transform:"translate("+t+","+r+")"+vt}),f(I,n)},doneFn:function(){f(I),i.call("relayout",t,A());var e=document.querySelector(".js-notes-box-panel");e&&e.redraw(e.selectedObj)}})}}}e.exports={draw:function(t){var e=t._fullLayout;e._infolayer.selectAll(".annotation").remove();for(var r=0;r<e.annotations.length;r++)e.annotations[r].visible&&m(t,r);return a.previousPromises(t)},drawOne:m,drawRaw:v}},{"../../lib":684,"../../lib/setcursor":704,"../../lib/svg_text_utils":708,"../../plot_api/plot_template":722,"../../plots/cartesian/axes":732,"../../plots/plots":795,"../../registry":817,"../color":558,"../dragelement":580,"../drawing":583,"../fx":600,"./draw_arrow_head":548,d3:147}],548:[function(t,e,r){"use strict";var n=t("d3"),i=t("../color"),a=t("./arrow_paths");e.exports=function(t,e,r){var o,s,l,c,u=t.node(),h=a[r.arrowhead||0],f=a[r.startarrowhead||0],p=(r.arrowwidth||1)*(r.arrowsize||1),d=(r.arrowwidth||1)*(r.startarrowsize||1),g=e.indexOf("start")>=0,m=e.indexOf("end")>=0,v=h.backoff*p+r.standoff,y=f.backoff*d+r.startstandoff;if("line"===u.nodeName){o={x:+t.attr("x1"),y:+t.attr("y1")},s={x:+t.attr("x2"),y:+t.attr("y2")};var x=o.x-s.x,b=o.y-s.y;if(c=(l=Math.atan2(b,x))+Math.PI,v&&y&&v+y>Math.sqrt(x*x+b*b))return void z();if(v){if(v*v>x*x+b*b)return void z();var _=v*Math.cos(l),w=v*Math.sin(l);s.x+=_,s.y+=w,t.attr({x2:s.x,y2:s.y})}if(y){if(y*y>x*x+b*b)return void z();var k=y*Math.cos(l),M=y*Math.sin(l);o.x-=k,o.y-=M,t.attr({x1:o.x,y1:o.y})}}else if("path"===u.nodeName){var A=u.getTotalLength(),T="";if(A<v+y)return void z();var S=u.getPointAtLength(0),E=u.getPointAtLength(.1);l=Math.atan2(S.y-E.y,S.x-E.x),o=u.getPointAtLength(Math.min(y,A)),T="0px,"+y+"px,";var C=u.getPointAtLength(A),L=u.getPointAtLength(A-.1);c=Math.atan2(C.y-L.y,C.x-L.x),s=u.getPointAtLength(Math.max(0,A-v)),T+=A-(T?y+v:v)+"px,"+A+"px",t.style("stroke-dasharray",T)}function z(){t.style("stroke-dasharray","0px,100px")}function P(e,a,o,s){e.path&&(e.noRotate&&(o=0),n.select(u.parentNode).append("path").attr({class:t.attr("class"),d:e.path,transform:"translate("+a.x+","+a.y+")"+(o?"rotate("+180*o/Math.PI+")":"")+"scale("+s+")"}).style({fill:i.rgb(r.arrowcolor),"stroke-width":0}))}g&&P(f,o,l,d),m&&P(h,s,c,p)}},{"../color":558,"./arrow_paths":540,d3:147}],549:[function(t,e,r){"use strict";var n=t("./draw"),i=t("./click");e.exports={moduleType:"component",name:"annotations",layoutAttributes:t("./attributes"),supplyLayoutDefaults:t("./defaults"),includeBasePlot:t("../../plots/cartesian/include_components")("annotations"),calcAutorange:t("./calc_autorange"),draw:n.draw,drawOne:n.drawOne,drawRaw:n.drawRaw,hasClickToShow:i.hasClickToShow,onClick:i.onClick,convertCoords:t("./convert_coords")}},{"../../plots/cartesian/include_components":742,"./attributes":541,"./calc_autorange":542,"./click":543,"./convert_coords":545,"./defaults":546,"./draw":547}],550:[function(t,e,r){"use strict";var n=t("../annotations/attributes"),i=t("../../plot_api/edit_types").overrideAll,a=t("../../plot_api/plot_template").templatedArray;e.exports=i(a("annotation",{visible:n.visible,x:{valType:"any"},y:{valType:"any"},z:{valType:"any"},ax:{valType:"number"},ay:{valType:"number"},xanchor:n.xanchor,xshift:n.xshift,yanchor:n.yanchor,yshift:n.yshift,text:n.text,textangle:n.textangle,font:n.font,width:n.width,height:n.height,opacity:n.opacity,align:n.align,valign:n.valign,bgcolor:n.bgcolor,bordercolor:n.bordercolor,borderpad:n.borderpad,borderwidth:n.borderwidth,showarrow:n.showarrow,arrowcolor:n.arrowcolor,arrowhead:n.arrowhead,startarrowhead:n.startarrowhead,arrowside:n.arrowside,arrowsize:n.arrowsize,startarrowsize:n.startarrowsize,arrowwidth:n.arrowwidth,standoff:n.standoff,startstandoff:n.startstandoff,hovertext:n.hovertext,hoverlabel:n.hoverlabel,captureevents:n.captureevents}),"calc","from-root")},{"../../plot_api/edit_types":715,"../../plot_api/plot_template":722,"../annotations/attributes":541}],551:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes");function a(t,e){var r=e.fullSceneLayout.domain,a=e.fullLayout._size,o={pdata:null,type:"linear",autorange:!1,range:[-1/0,1/0]};t._xa={},n.extendFlat(t._xa,o),i.setConvert(t._xa),t._xa._offset=a.l+r.x[0]*a.w,t._xa.l2p=function(){return.5*(1+t._pdata[0]/t._pdata[3])*a.w*(r.x[1]-r.x[0])},t._ya={},n.extendFlat(t._ya,o),i.setConvert(t._ya),t._ya._offset=a.t+(1-r.y[1])*a.h,t._ya.l2p=function(){return.5*(1-t._pdata[1]/t._pdata[3])*a.h*(r.y[1]-r.y[0])}}e.exports=function(t){for(var e=t.fullSceneLayout.annotations,r=0;r<e.length;r++)a(e[r],t);t.fullLayout._infolayer.selectAll(".annotation-"+t.id).remove()}},{"../../lib":684,"../../plots/cartesian/axes":732}],552:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes"),a=t("../../plots/array_container_defaults"),o=t("../annotations/common_defaults"),s=t("./attributes");function l(t,e,r,a){function l(r,i){return n.coerce(t,e,s,r,i)}function c(t){var n=t+"axis",a={_fullLayout:{}};return a._fullLayout[n]=r[n],i.coercePosition(e,a,l,t,t,.5)}l("visible")&&(o(t,e,a.fullLayout,l),c("x"),c("y"),c("z"),n.noneOrAll(t,e,["x","y","z"]),e.xref="x",e.yref="y",e.zref="z",l("xanchor"),l("yanchor"),l("xshift"),l("yshift"),e.showarrow&&(e.axref="pixel",e.ayref="pixel",l("ax",-10),l("ay",-30),n.noneOrAll(t,e,["ax","ay"])))}e.exports=function(t,e,r){a(t,e,{name:"annotations",handleItemDefaults:l,fullLayout:r.fullLayout})}},{"../../lib":684,"../../plots/array_container_defaults":728,"../../plots/cartesian/axes":732,"../annotations/common_defaults":544,"./attributes":550}],553:[function(t,e,r){"use strict";var n=t("../annotations/draw").drawRaw,i=t("../../plots/gl3d/project"),a=["x","y","z"];e.exports=function(t){for(var e=t.fullSceneLayout,r=t.dataScale,o=e.annotations,s=0;s<o.length;s++){for(var l=o[s],c=!1,u=0;u<3;u++){var h=a[u],f=l[h],p=e[h+"axis"].r2fraction(f);if(p<0||p>1){c=!0;break}}c?t.fullLayout._infolayer.select(".annotation-"+t.id+'[data-index="'+s+'"]').remove():(l._pdata=i(t.glplot.cameraParams,[e.xaxis.r2l(l.x)*r[0],e.yaxis.r2l(l.y)*r[1],e.zaxis.r2l(l.z)*r[2]]),n(t.graphDiv,l,s,t.id,l._xa,l._ya))}}},{"../../plots/gl3d/project":783,"../annotations/draw":547}],554:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib");e.exports={moduleType:"component",name:"annotations3d",schema:{subplots:{scene:{annotations:t("./attributes")}}},layoutAttributes:t("./attributes"),handleDefaults:t("./defaults"),includeBasePlot:function(t,e){var r=n.subplotsRegistry.gl3d;if(!r)return;for(var a=r.attrRegex,o=Object.keys(t),s=0;s<o.length;s++){var l=o[s];a.test(l)&&(t[l].annotations||[]).length&&(i.pushUnique(e._basePlotModules,r),i.pushUnique(e._subplots.gl3d,l))}},convert:t("./convert"),draw:t("./draw")}},{"../../lib":684,"../../registry":817,"./attributes":550,"./convert":551,"./defaults":552,"./draw":553}],555:[function(t,e,r){"use strict";e.exports=t("world-calendars/dist/main"),t("world-calendars/dist/plus"),t("world-calendars/dist/calendars/chinese"),t("world-calendars/dist/calendars/coptic"),t("world-calendars/dist/calendars/discworld"),t("world-calendars/dist/calendars/ethiopian"),t("world-calendars/dist/calendars/hebrew"),t("world-calendars/dist/calendars/islamic"),t("world-calendars/dist/calendars/julian"),t("world-calendars/dist/calendars/mayan"),t("world-calendars/dist/calendars/nanakshahi"),t("world-calendars/dist/calendars/nepali"),t("world-calendars/dist/calendars/persian"),t("world-calendars/dist/calendars/taiwan"),t("world-calendars/dist/calendars/thai"),t("world-calendars/dist/calendars/ummalqura")},{"world-calendars/dist/calendars/chinese":522,"world-calendars/dist/calendars/coptic":523,"world-calendars/dist/calendars/discworld":524,"world-calendars/dist/calendars/ethiopian":525,"world-calendars/dist/calendars/hebrew":526,"world-calendars/dist/calendars/islamic":527,"world-calendars/dist/calendars/julian":528,"world-calendars/dist/calendars/mayan":529,"world-calendars/dist/calendars/nanakshahi":530,"world-calendars/dist/calendars/nepali":531,"world-calendars/dist/calendars/persian":532,"world-calendars/dist/calendars/taiwan":533,"world-calendars/dist/calendars/thai":534,"world-calendars/dist/calendars/ummalqura":535,"world-calendars/dist/main":536,"world-calendars/dist/plus":537}],556:[function(t,e,r){"use strict";var n=t("./calendars"),i=t("../../lib"),a=t("../../constants/numerical"),o=a.EPOCHJD,s=a.ONEDAY,l={valType:"enumerated",values:Object.keys(n.calendars),editType:"calc",dflt:"gregorian"},c=function(t,e,r,n){var a={};return a[r]=l,i.coerce(t,e,a,r,n)},u="##",h={d:{0:"dd","-":"d"},e:{0:"d","-":"d"},a:{0:"D","-":"D"},A:{0:"DD","-":"DD"},j:{0:"oo","-":"o"},W:{0:"ww","-":"w"},m:{0:"mm","-":"m"},b:{0:"M","-":"M"},B:{0:"MM","-":"MM"},y:{0:"yy","-":"yy"},Y:{0:"yyyy","-":"yyyy"},U:u,w:u,c:{0:"D M d %X yyyy","-":"D M d %X yyyy"},x:{0:"mm/dd/yyyy","-":"mm/dd/yyyy"}};var f={};function p(t){var e=f[t];return e||(e=f[t]=n.instance(t))}function d(t){return i.extendFlat({},l,{description:t})}function g(t){return"Sets the calendar system to use with `"+t+"` date data."}var m={xcalendar:d(g("x"))},v=i.extendFlat({},m,{ycalendar:d(g("y"))}),y=i.extendFlat({},v,{zcalendar:d(g("z"))}),x=d(["Sets the calendar system to use for `range` and `tick0`","if this is a date axis. This does not set the calendar for","interpreting data on this axis, that's specified in the trace","or via the global `layout.calendar`"].join(" "));e.exports={moduleType:"component",name:"calendars",schema:{traces:{scatter:v,bar:v,box:v,heatmap:v,contour:v,histogram:v,histogram2d:v,histogram2dcontour:v,scatter3d:y,surface:y,mesh3d:y,scattergl:v,ohlc:m,candlestick:m},layout:{calendar:d(["Sets the default calendar system to use for interpreting and","displaying dates throughout the plot."].join(" "))},subplots:{xaxis:{calendar:x},yaxis:{calendar:x},scene:{xaxis:{calendar:x},yaxis:{calendar:x},zaxis:{calendar:x}},polar:{radialaxis:{calendar:x}}},transforms:{filter:{valuecalendar:d(["Sets the calendar system to use for `value`, if it is a date."].join(" ")),targetcalendar:d(["Sets the calendar system to use for `target`, if it is an","array of dates. If `target` is a string (eg *x*) we use the","corresponding trace attribute (eg `xcalendar`) if it exists,","even if `targetcalendar` is provided."].join(" "))}}},layoutAttributes:l,handleDefaults:c,handleTraceDefaults:function(t,e,r,n){for(var i=0;i<r.length;i++)c(t,e,r[i]+"calendar",n.calendar)},CANONICAL_SUNDAY:{chinese:"2000-01-02",coptic:"2000-01-03",discworld:"2000-01-03",ethiopian:"2000-01-05",hebrew:"5000-01-01",islamic:"1000-01-02",julian:"2000-01-03",mayan:"5000-01-01",nanakshahi:"1000-01-05",nepali:"2000-01-05",persian:"1000-01-01",jalali:"1000-01-01",taiwan:"1000-01-04",thai:"2000-01-04",ummalqura:"1400-01-06"},CANONICAL_TICK:{chinese:"2000-01-01",coptic:"2000-01-01",discworld:"2000-01-01",ethiopian:"2000-01-01",hebrew:"5000-01-01",islamic:"1000-01-01",julian:"2000-01-01",mayan:"5000-01-01",nanakshahi:"1000-01-01",nepali:"2000-01-01",persian:"1000-01-01",jalali:"1000-01-01",taiwan:"1000-01-01",thai:"2000-01-01",ummalqura:"1400-01-01"},DFLTRANGE:{chinese:["2000-01-01","2001-01-01"],coptic:["1700-01-01","1701-01-01"],discworld:["1800-01-01","1801-01-01"],ethiopian:["2000-01-01","2001-01-01"],hebrew:["5700-01-01","5701-01-01"],islamic:["1400-01-01","1401-01-01"],julian:["2000-01-01","2001-01-01"],mayan:["5200-01-01","5201-01-01"],nanakshahi:["0500-01-01","0501-01-01"],nepali:["2000-01-01","2001-01-01"],persian:["1400-01-01","1401-01-01"],jalali:["1400-01-01","1401-01-01"],taiwan:["0100-01-01","0101-01-01"],thai:["2500-01-01","2501-01-01"],ummalqura:["1400-01-01","1401-01-01"]},getCal:p,worldCalFmt:function(t,e,r){for(var n,i,a,l,c,f=Math.floor((e+.05)/s)+o,d=p(r).fromJD(f),g=0;-1!==(g=t.indexOf("%",g));)"0"===(n=t.charAt(g+1))||"-"===n||"_"===n?(a=3,i=t.charAt(g+2),"_"===n&&(n="-")):(i=n,n="0",a=2),(l=h[i])?(c=l===u?u:d.formatDate(l[n]),t=t.substr(0,g)+c+t.substr(g+a),g+=c.length):g+=a;return t}}},{"../../constants/numerical":661,"../../lib":684,"./calendars":555}],557:[function(t,e,r){"use strict";r.defaults=["#1f77b4","#ff7f0e","#2ca02c","#d62728","#9467bd","#8c564b","#e377c2","#7f7f7f","#bcbd22","#17becf"],r.defaultLine="#444",r.lightLine="#eee",r.background="#fff",r.borderLine="#BEC8D9",r.lightFraction=1e3/11},{}],558:[function(t,e,r){"use strict";var n=t("tinycolor2"),i=t("fast-isnumeric"),a=e.exports={},o=t("./attributes");a.defaults=o.defaults;var s=a.defaultLine=o.defaultLine;a.lightLine=o.lightLine;var l=a.background=o.background;function c(t){if(i(t)||"string"!=typeof t)return t;var e=t.trim();if("rgb"!==e.substr(0,3))return t;var r=e.match(/^rgba?\s*\(([^()]*)\)$/);if(!r)return t;var n=r[1].trim().split(/\s*[\s,]\s*/),a="a"===e.charAt(3)&&4===n.length;if(!a&&3!==n.length)return t;for(var o=0;o<n.length;o++){if(!n[o].length)return t;if(n[o]=Number(n[o]),!(n[o]>=0))return t;if(3===o)n[o]>1&&(n[o]=1);else if(n[o]>=1)return t}var s=Math.round(255*n[0])+", "+Math.round(255*n[1])+", "+Math.round(255*n[2]);return a?"rgba("+s+", "+n[3]+")":"rgb("+s+")"}a.tinyRGB=function(t){var e=t.toRgb();return"rgb("+Math.round(e.r)+", "+Math.round(e.g)+", "+Math.round(e.b)+")"},a.rgb=function(t){return a.tinyRGB(n(t))},a.opacity=function(t){return t?n(t).getAlpha():0},a.addOpacity=function(t,e){var r=n(t).toRgb();return"rgba("+Math.round(r.r)+", "+Math.round(r.g)+", "+Math.round(r.b)+", "+e+")"},a.combine=function(t,e){var r=n(t).toRgb();if(1===r.a)return n(t).toRgbString();var i=n(e||l).toRgb(),a=1===i.a?i:{r:255*(1-i.a)+i.r*i.a,g:255*(1-i.a)+i.g*i.a,b:255*(1-i.a)+i.b*i.a},o={r:a.r*(1-r.a)+r.r*r.a,g:a.g*(1-r.a)+r.g*r.a,b:a.b*(1-r.a)+r.b*r.a};return n(o).toRgbString()},a.contrast=function(t,e,r){var i=n(t);return 1!==i.getAlpha()&&(i=n(a.combine(t,l))),(i.isDark()?e?i.lighten(e):l:r?i.darken(r):s).toString()},a.stroke=function(t,e){var r=n(e);t.style({stroke:a.tinyRGB(r),"stroke-opacity":r.getAlpha()})},a.fill=function(t,e){var r=n(e);t.style({fill:a.tinyRGB(r),"fill-opacity":r.getAlpha()})},a.clean=function(t){if(t&&"object"==typeof t){var e,r,n,i,o=Object.keys(t);for(e=0;e<o.length;e++)if(i=t[n=o[e]],"color"===n.substr(n.length-5))if(Array.isArray(i))for(r=0;r<i.length;r++)i[r]=c(i[r]);else t[n]=c(i);else if("colorscale"===n.substr(n.length-10)&&Array.isArray(i))for(r=0;r<i.length;r++)Array.isArray(i[r])&&(i[r][1]=c(i[r][1]));else if(Array.isArray(i)){var s=i[0];if(!Array.isArray(s)&&s&&"object"==typeof s)for(r=0;r<i.length;r++)a.clean(i[r])}else i&&"object"==typeof i&&a.clean(i)}}},{"./attributes":557,"fast-isnumeric":214,tinycolor2:499}],559:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/layout_attributes"),i=t("../../plots/font_attributes"),a=t("../../lib/extend").extendFlat,o=t("../../plot_api/edit_types").overrideAll;e.exports=o({thicknessmode:{valType:"enumerated",values:["fraction","pixels"],dflt:"pixels"},thickness:{valType:"number",min:0,dflt:30},lenmode:{valType:"enumerated",values:["fraction","pixels"],dflt:"fraction"},len:{valType:"number",min:0,dflt:1},x:{valType:"number",dflt:1.02,min:-2,max:3},xanchor:{valType:"enumerated",values:["left","center","right"],dflt:"left"},xpad:{valType:"number",min:0,dflt:10},y:{valType:"number",dflt:.5,min:-2,max:3},yanchor:{valType:"enumerated",values:["top","middle","bottom"],dflt:"middle"},ypad:{valType:"number",min:0,dflt:10},outlinecolor:n.linecolor,outlinewidth:n.linewidth,bordercolor:n.linecolor,borderwidth:{valType:"number",min:0,dflt:0},bgcolor:{valType:"color",dflt:"rgba(0,0,0,0)"},tickmode:n.tickmode,nticks:n.nticks,tick0:n.tick0,dtick:n.dtick,tickvals:n.tickvals,ticktext:n.ticktext,ticks:a({},n.ticks,{dflt:""}),ticklen:n.ticklen,tickwidth:n.tickwidth,tickcolor:n.tickcolor,showticklabels:n.showticklabels,tickfont:i({}),tickangle:n.tickangle,tickformat:n.tickformat,tickformatstops:n.tickformatstops,tickprefix:n.tickprefix,showtickprefix:n.showtickprefix,ticksuffix:n.ticksuffix,showticksuffix:n.showticksuffix,separatethousands:n.separatethousands,exponentformat:n.exponentformat,showexponent:n.showexponent,title:{valType:"string"},titlefont:i({}),titleside:{valType:"enumerated",values:["right","top","bottom"],dflt:"top"}},"colorbars","from-root")},{"../../lib/extend":673,"../../plot_api/edit_types":715,"../../plots/cartesian/layout_attributes":744,"../../plots/font_attributes":758}],560:[function(t,e,r){"use strict";var n=t("../colorscale"),i=t("./draw");e.exports=function(t,e,r){if("function"==typeof r)return r(t,e);var a=e[0].trace,o="cb"+a.uid,s=r.container,l=s?a[s]:a;if(t._fullLayout._infolayer.selectAll("."+o).remove(),l&&l.showscale){var c=l[r.min],u=l[r.max],h=e[0].t.cb=i(t,o),f=n.makeColorScaleFunc(n.extractScale(l.colorscale,c,u),{noNumericCheck:!0});h.fillcolor(f).filllevels({start:c,end:u,size:(u-c)/254}).options(l.colorbar)()}}},{"../colorscale":573,"./draw":563}],561:[function(t,e,r){"use strict";e.exports={cn:{colorbar:"colorbar",cbbg:"cbbg",cbfill:"cbfill",cbfills:"cbfills",cbline:"cbline",cblines:"cblines",cbaxis:"cbaxis",cbtitleunshift:"cbtitleunshift",cbtitle:"cbtitle",cboutline:"cboutline",crisp:"crisp",jsPlaceholder:"js-placeholder"}}},{}],562:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plot_api/plot_template"),a=t("../../plots/cartesian/tick_value_defaults"),o=t("../../plots/cartesian/tick_mark_defaults"),s=t("../../plots/cartesian/tick_label_defaults"),l=t("./attributes");e.exports=function(t,e,r){var c=i.newContainer(e,"colorbar"),u=t.colorbar||{};function h(t,e){return n.coerce(u,c,l,t,e)}var f=h("thicknessmode");h("thickness","fraction"===f?30/(r.width-r.margin.l-r.margin.r):30);var p=h("lenmode");h("len","fraction"===p?1:r.height-r.margin.t-r.margin.b),h("x"),h("xanchor"),h("xpad"),h("y"),h("yanchor"),h("ypad"),n.noneOrAll(u,c,["x","y"]),h("outlinecolor"),h("outlinewidth"),h("bordercolor"),h("borderwidth"),h("bgcolor"),a(u,c,h,"linear");var d={outerTicks:!1,font:r.font};s(u,c,h,"linear",d),o(u,c,h,"linear",d),h("title",r._dfltTitle.colorbar),n.coerceFont(h,"titlefont",r.font),h("titleside")}},{"../../lib":684,"../../plot_api/plot_template":722,"../../plots/cartesian/tick_label_defaults":751,"../../plots/cartesian/tick_mark_defaults":752,"../../plots/cartesian/tick_value_defaults":753,"./attributes":559}],563:[function(t,e,r){"use strict";var n=t("d3"),i=t("tinycolor2"),a=t("../../plots/plots"),o=t("../../registry"),s=t("../../plots/cartesian/axes"),l=t("../dragelement"),c=t("../../lib"),u=t("../../lib/extend").extendFlat,h=t("../../lib/setcursor"),f=t("../drawing"),p=t("../color"),d=t("../titles"),g=t("../../lib/svg_text_utils"),m=t("../../constants/alignment"),v=m.LINE_SPACING,y=m.FROM_TL,x=m.FROM_BR,b=t("../../plots/cartesian/axis_defaults"),_=t("../../plots/cartesian/position_defaults"),w=t("../../plots/cartesian/layout_attributes"),k=t("./attributes"),M=t("./constants").cn;e.exports=function(t,e){var r={};function m(){var k=t._fullLayout,T=k._size;if("function"==typeof r.fillcolor||"function"==typeof r.line.color){var S,E,C=n.extent(("function"==typeof r.fillcolor?r.fillcolor:r.line.color).domain()),L=[],z=[],P="function"==typeof r.line.color?r.line.color:function(){return r.line.color},I="function"==typeof r.fillcolor?r.fillcolor:function(){return r.fillcolor},O=r.levels.end+r.levels.size/100,D=r.levels.size,R=1.001*C[0]-.001*C[1],B=1.001*C[1]-.001*C[0];for(E=0;E<1e5&&(S=r.levels.start+E*D,!(D>0?S>=O:S<=O));E++)S>R&&S<B&&L.push(S);if("function"==typeof r.fillcolor)if(r.filllevels)for(O=r.filllevels.end+r.filllevels.size/100,D=r.filllevels.size,E=0;E<1e5&&(S=r.filllevels.start+E*D,!(D>0?S>=O:S<=O));E++)S>C[0]&&S<C[1]&&z.push(S);else(z=L.map(function(t){return t-r.levels.size/2})).push(z[z.length-1]+r.levels.size);else r.fillcolor&&"string"==typeof r.fillcolor&&(z=[0]);r.levels.size<0&&(L.reverse(),z.reverse());var F,N=T.h,j=T.w,V=Math.round(r.thickness*("fraction"===r.thicknessmode?j:1)),U=V/T.w,q=Math.round(r.len*("fraction"===r.lenmode?N:1)),H=q/T.h,G=r.xpad/T.w,W=(r.borderwidth+r.outlinewidth)/2,Y=r.ypad/T.h,X=Math.round(r.x*T.w+r.xpad),Z=r.x-U*({middle:.5,right:1}[r.xanchor]||0),$=r.y+H*(({top:-.5,bottom:.5}[r.yanchor]||0)-.5),J=Math.round(T.h*(1-$)),K=J-q,Q={type:"linear",range:C,tickmode:r.tickmode,nticks:r.nticks,tick0:r.tick0,dtick:r.dtick,tickvals:r.tickvals,ticktext:r.ticktext,ticks:r.ticks,ticklen:r.ticklen,tickwidth:r.tickwidth,tickcolor:r.tickcolor,showticklabels:r.showticklabels,tickfont:r.tickfont,tickangle:r.tickangle,tickformat:r.tickformat,exponentformat:r.exponentformat,separatethousands:r.separatethousands,showexponent:r.showexponent,showtickprefix:r.showtickprefix,tickprefix:r.tickprefix,showticksuffix:r.showticksuffix,ticksuffix:r.ticksuffix,title:r.title,titlefont:r.titlefont,showline:!0,anchor:"free",position:1},tt={type:"linear",_id:"y"+e},et={letter:"y",font:k.font,noHover:!0,calendar:k.calendar};if(b(Q,tt,mt,et,k),_(Q,tt,mt,et),tt.position=r.x+G+U,m.axis=tt,-1!==["top","bottom"].indexOf(r.titleside)&&(tt.titleside=r.titleside,tt.titlex=r.x+G,tt.titley=$+("top"===r.titleside?H-Y:Y)),r.line.color&&"auto"===r.tickmode){tt.tickmode="linear",tt.tick0=r.levels.start;var rt=r.levels.size,nt=c.constrain((J-K)/50,4,15)+1,it=(C[1]-C[0])/((r.nticks||nt)*rt);if(it>1){var at=Math.pow(10,Math.floor(Math.log(it)/Math.LN10));rt*=at*c.roundUp(it/at,[2,5,10]),(Math.abs(r.levels.start)/r.levels.size+1e-6)%1<2e-6&&(tt.tick0=0)}tt.dtick=rt}tt.domain=[$+Y,$+H-Y],tt.setScale();var ot=c.ensureSingle(k._infolayer,"g",e,function(t){t.classed(M.colorbar,!0).each(function(){var t=n.select(this);t.append("rect").classed(M.cbbg,!0),t.append("g").classed(M.cbfills,!0),t.append("g").classed(M.cblines,!0),t.append("g").classed(M.cbaxis,!0).classed(M.crisp,!0),t.append("g").classed(M.cbtitleunshift,!0).append("g").classed(M.cbtitle,!0),t.append("rect").classed(M.cboutline,!0),t.select(".cbtitle").datum(0)})});ot.attr("transform","translate("+Math.round(T.l)+","+Math.round(T.t)+")");var st=ot.select(".cbtitleunshift").attr("transform","translate(-"+Math.round(T.l)+",-"+Math.round(T.t)+")");tt._axislayer=ot.select(".cbaxis");var lt=0;if(-1!==["top","bottom"].indexOf(r.titleside)){var ct,ut=T.l+(r.x+G)*T.w,ht=tt.titlefont.size;ct="top"===r.titleside?(1-($+H-Y))*T.h+T.t+3+.75*ht:(1-($+Y))*T.h+T.t-3-.25*ht,vt(tt._id+"title",{attributes:{x:ut,y:ct,"text-anchor":"start"}})}var ft,pt,dt,gt=c.syncOrAsync([a.previousPromises,function(){if(-1!==["top","bottom"].indexOf(r.titleside)){var e=ot.select(".cbtitle"),a=e.select("text"),o=[-r.outlinewidth/2,r.outlinewidth/2],l=e.select(".h"+tt._id+"title-math-group").node(),u=15.6;if(a.node()&&(u=parseInt(a.node().style.fontSize,10)*v),l?(lt=f.bBox(l).height)>u&&(o[1]-=(lt-u)/2):a.node()&&!a.classed(M.jsPlaceholder)&&(lt=f.bBox(a.node()).height),lt){if(lt+=5,"top"===r.titleside)tt.domain[1]-=lt/T.h,o[1]*=-1;else{tt.domain[0]+=lt/T.h;var h=g.lineCount(a);o[1]+=(1-h)*u}e.attr("transform","translate("+o+")"),tt.setScale()}}ot.selectAll(".cbfills,.cblines").attr("transform","translate(0,"+Math.round(T.h*(1-tt.domain[1]))+")"),tt._axislayer.attr("transform","translate(0,"+Math.round(-T.t)+")");var p=ot.select(".cbfills").selectAll("rect.cbfill").data(z);p.enter().append("rect").classed(M.cbfill,!0).style("stroke","none"),p.exit().remove(),p.each(function(t,e){var r=[0===e?C[0]:(z[e]+z[e-1])/2,e===z.length-1?C[1]:(z[e]+z[e+1])/2].map(tt.c2p).map(Math.round);e!==z.length-1&&(r[1]+=r[1]>r[0]?1:-1);var a=I(t).replace("e-",""),o=i(a).toHexString();n.select(this).attr({x:X,width:Math.max(V,2),y:n.min(r),height:Math.max(n.max(r)-n.min(r),2),fill:o})});var d=ot.select(".cblines").selectAll("path.cbline").data(r.line.color&&r.line.width?L:[]);return d.enter().append("path").classed(M.cbline,!0),d.exit().remove(),d.each(function(t){n.select(this).attr("d","M"+X+","+(Math.round(tt.c2p(t))+r.line.width/2%1)+"h"+V).call(f.lineGroupStyle,r.line.width,P(t),r.line.dash)}),tt._axislayer.selectAll("g."+tt._id+"tick,path").remove(),tt._pos=X+V+(r.outlinewidth||0)/2-("outside"===r.ticks?1:0),tt.side="right",c.syncOrAsync([function(){return s.doTicksSingle(t,tt,!0)},function(){if(-1===["top","bottom"].indexOf(r.titleside)){var e=tt.titlefont.size,i=tt._offset+tt._length/2,a=T.l+(tt.position||0)*T.w+("right"===tt.side?10+e*(tt.showticklabels?1:.5):-10-e*(tt.showticklabels?.5:0));vt("h"+tt._id+"title",{avoid:{selection:n.select(t).selectAll("g."+tt._id+"tick"),side:r.titleside,offsetLeft:T.l,offsetTop:0,maxShift:k.width},attributes:{x:a,y:i,"text-anchor":"middle"},transform:{rotate:"-90",offset:0}})}}])},a.previousPromises,function(){var n=V+r.outlinewidth/2+f.bBox(tt._axislayer.node()).width;if((F=st.select("text")).node()&&!F.classed(M.jsPlaceholder)){var i,o=st.select(".h"+tt._id+"title-math-group").node();i=o&&-1!==["top","bottom"].indexOf(r.titleside)?f.bBox(o).width:f.bBox(st.node()).right-X-T.l,n=Math.max(n,i)}var s=2*r.xpad+n+r.borderwidth+r.outlinewidth/2,l=J-K;ot.select(".cbbg").attr({x:X-r.xpad-(r.borderwidth+r.outlinewidth)/2,y:K-W,width:Math.max(s,2),height:Math.max(l+2*W,2)}).call(p.fill,r.bgcolor).call(p.stroke,r.bordercolor).style({"stroke-width":r.borderwidth}),ot.selectAll(".cboutline").attr({x:X,y:K+r.ypad+("top"===r.titleside?lt:0),width:Math.max(V,2),height:Math.max(l-2*r.ypad-lt,2)}).call(p.stroke,r.outlinecolor).style({fill:"None","stroke-width":r.outlinewidth});var c=({center:.5,right:1}[r.xanchor]||0)*s;ot.attr("transform","translate("+(T.l-c)+","+T.t+")");var u={},h=y[r.yanchor],d=x[r.yanchor];"pixels"===r.lenmode?(u.y=r.y,u.t=l*h,u.b=l*d):(u.t=u.b=0,u.yt=r.y+r.len*h,u.yb=r.y-r.len*d);var g=y[r.xanchor],m=x[r.xanchor];if("pixels"===r.thicknessmode)u.x=r.x,u.l=s*g,u.r=s*m;else{var v=s-V;u.l=v*g,u.r=v*m,u.xl=r.x-r.thickness*g,u.xr=r.x+r.thickness*m}a.autoMargin(t,e,u)}],t);if(gt&&gt.then&&(t._promises||[]).push(gt),t._context.edits.colorbarPosition)l.init({element:ot.node(),gd:t,prepFn:function(){ft=ot.attr("transform"),h(ot)},moveFn:function(t,e){ot.attr("transform",ft+" translate("+t+","+e+")"),pt=l.align(Z+t/T.w,U,0,1,r.xanchor),dt=l.align($-e/T.h,H,0,1,r.yanchor);var n=l.getCursor(pt,dt,r.xanchor,r.yanchor);h(ot,n)},doneFn:function(){h(ot),void 0!==pt&&void 0!==dt&&o.call("restyle",t,{"colorbar.x":pt,"colorbar.y":dt},A().index)}});return gt}function mt(t,e){return c.coerce(Q,tt,w,t,e)}function vt(e,r){var n=A(),i="colorbar.title",a=n._module.colorbar.container;a&&(i=a+"."+i);var o={propContainer:tt,propName:i,traceIndex:n.index,placeholder:k._dfltTitle.colorbar,containerGroup:ot.select(".cbtitle")},s="h"===e.charAt(0)?e.substr(1):"h"+e;ot.selectAll("."+s+",."+s+"-math-group").remove(),d.draw(t,e,u(o,r||{}))}k._infolayer.selectAll("g."+e).remove()}function A(){var r,n,i=e.substr(2);for(r=0;r<t._fullData.length;r++)if((n=t._fullData[r]).uid===i)return n}return Object.keys(k).forEach(function(t){r[t]=null}),r.fillcolor=null,r.line={color:null,width:null,dash:null},r.levels={start:null,end:null,size:null},r.filllevels=null,Object.keys(r).forEach(function(t){m[t]=function(e){return arguments.length?(r[t]=c.isPlainObject(r[t])?c.extendFlat(r[t],e):e,m):r[t]}}),m.options=function(t){return Object.keys(t).forEach(function(e){"function"==typeof m[e]&&m[e](t[e])}),m},m._opts=r,m}},{"../../constants/alignment":656,"../../lib":684,"../../lib/extend":673,"../../lib/setcursor":704,"../../lib/svg_text_utils":708,"../../plots/cartesian/axes":732,"../../plots/cartesian/axis_defaults":734,"../../plots/cartesian/layout_attributes":744,"../../plots/cartesian/position_defaults":747,"../../plots/plots":795,"../../registry":817,"../color":558,"../dragelement":580,"../drawing":583,"../titles":649,"./attributes":559,"./constants":561,d3:147,tinycolor2:499}],564:[function(t,e,r){"use strict";var n=t("../../lib");e.exports=function(t){return n.isPlainObject(t.colorbar)}},{"../../lib":684}],565:[function(t,e,r){"use strict";var n=t("./scales.js");Object.keys(n);function i(t){return"`"+t+"`"}e.exports=function(t,e){t=t||"";var r,a=(e=e||{}).cLetter||"c",o=("onlyIfNumerical"in e?e.onlyIfNumerical:Boolean(t),"noScale"in e?e.noScale:"marker.line"===t),s="showScaleDflt"in e?e.showScaleDflt:"z"===a,l="string"==typeof e.colorscaleDflt?n[e.colorscaleDflt]:null,c=e.editTypeOverride||"",u=t?t+".":"";"colorAttr"in e?(r=e.colorAttr,e.colorAttr):i(u+(r={z:"z",c:"color"}[a]));var h=a+"auto",f=a+"min",p=a+"max",d=(i(u+f),i(u+p),{});d[f]=d[p]=void 0;var g={};g[h]=!1;var m={};return"color"===r&&(m.color={valType:"color",arrayOk:!0,editType:c||"style"}),m[h]={valType:"boolean",dflt:!0,editType:"calc",impliedEdits:d},m[f]={valType:"number",dflt:null,editType:c||"plot",impliedEdits:g},m[p]={valType:"number",dflt:null,editType:c||"plot",impliedEdits:g},m.colorscale={valType:"colorscale",editType:"calc",dflt:l,impliedEdits:{autocolorscale:!1}},m.autocolorscale={valType:"boolean",dflt:!1!==e.autoColorDflt,editType:"calc",impliedEdits:{colorscale:void 0}},m.reversescale={valType:"boolean",dflt:!1,editType:"calc"},o||(m.showscale={valType:"boolean",dflt:s,editType:"calc"}),m}},{"./scales.js":577}],566:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./scales"),a=t("./flip_scale");e.exports=function(t,e,r,o){var s=t,l=t._input,c=t._fullInput,u=t.updateStyle;function h(e,n,i){void 0===i&&(i=n),u?u(t._input,r?r+"."+e:e,n):l[e]=n,s[e]=i,c&&t!==t._fullInput&&(u?u(t._fullInput,r?r+"."+e:e,i):c[e]=i)}r&&(s=n.nestedProperty(s,r).get(),l=n.nestedProperty(l,r).get(),c=n.nestedProperty(c,r).get()||{});var f=o+"auto",p=o+"min",d=o+"max",g=s[f],m=s[p],v=s[d],y=s.colorscale;!1===g&&void 0!==m||(m=n.aggNums(Math.min,null,e)),!1===g&&void 0!==v||(v=n.aggNums(Math.max,null,e)),m===v&&(m-=.5,v+=.5),h(p,m),h(d,v),h(f,!1!==g||void 0===m&&void 0===v),s.autocolorscale&&(h("colorscale",y=m*v<0?i.RdBu:m>=0?i.Reds:i.Blues,s.reversescale?a(y):y),l.autocolorscale||h("autocolorscale",!1))}},{"../../lib":684,"./flip_scale":570,"./scales":577}],567:[function(t,e,r){"use strict";var n=t("./scales");e.exports=n.RdBu},{"./scales":577}],568:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib"),a=t("../colorbar/has_colorbar"),o=t("../colorbar/defaults"),s=t("./is_valid_scale"),l=t("./flip_scale");e.exports=function(t,e,r,c,u){var h,f=u.prefix,p=u.cLetter,d=f.slice(0,f.length-1),g=f?i.nestedProperty(t,d).get()||{}:t,m=f?i.nestedProperty(e,d).get()||{}:e,v=g[p+"min"],y=g[p+"max"],x=g.colorscale;c(f+p+"auto",!(n(v)&&n(y)&&v<y)),c(f+p+"min"),c(f+p+"max"),void 0!==x&&(h=!s(x)),c(f+"autocolorscale",h);var b,_=c(f+"colorscale");(c(f+"reversescale")&&(m.colorscale=l(_)),"marker.line."!==f)&&(f&&(b=a(g)),c(f+"showscale",b)&&o(g,m,r))}},{"../../lib":684,"../colorbar/defaults":562,"../colorbar/has_colorbar":564,"./flip_scale":570,"./is_valid_scale":574,"fast-isnumeric":214}],569:[function(t,e,r){"use strict";e.exports=function(t,e,r){for(var n=t.length,i=new Array(n),a=new Array(n),o=0;o<n;o++){var s=t[o];i[o]=e+s[0]*(r-e),a[o]=s[1]}return{domain:i,range:a}}},{}],570:[function(t,e,r){"use strict";e.exports=function(t){for(var e,r=t.length,n=new Array(r),i=r-1,a=0;i>=0;i--,a++)e=t[i],n[a]=[1-e[0],e[1]];return n}},{}],571:[function(t,e,r){"use strict";var n=t("./scales"),i=t("./default_scale"),a=t("./is_valid_scale_array");e.exports=function(t,e){if(e||(e=i),!t)return e;function r(){try{t=n[t]||JSON.parse(t)}catch(r){t=e}}return"string"==typeof t&&(r(),"string"==typeof t&&r()),a(t)?t:e}},{"./default_scale":567,"./is_valid_scale_array":575,"./scales":577}],572:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib"),a=t("./is_valid_scale");e.exports=function(t,e){var r=e?i.nestedProperty(t,e).get()||{}:t,o=r.color,s=!1;if(i.isArrayOrTypedArray(o))for(var l=0;l<o.length;l++)if(n(o[l])){s=!0;break}return i.isPlainObject(r)&&(s||!0===r.showscale||n(r.cmin)&&n(r.cmax)||a(r.colorscale)||i.isPlainObject(r.colorbar))}},{"../../lib":684,"./is_valid_scale":574,"fast-isnumeric":214}],573:[function(t,e,r){"use strict";r.scales=t("./scales"),r.defaultScale=t("./default_scale"),r.attributes=t("./attributes"),r.handleDefaults=t("./defaults"),r.calc=t("./calc"),r.hasColorscale=t("./has_colorscale"),r.isValidScale=t("./is_valid_scale"),r.getScale=t("./get_scale"),r.flipScale=t("./flip_scale"),r.extractScale=t("./extract_scale"),r.makeColorScaleFunc=t("./make_color_scale_func")},{"./attributes":565,"./calc":566,"./default_scale":567,"./defaults":568,"./extract_scale":569,"./flip_scale":570,"./get_scale":571,"./has_colorscale":572,"./is_valid_scale":574,"./make_color_scale_func":576,"./scales":577}],574:[function(t,e,r){"use strict";var n=t("./scales"),i=t("./is_valid_scale_array");e.exports=function(t){return void 0!==n[t]||i(t)}},{"./is_valid_scale_array":575,"./scales":577}],575:[function(t,e,r){"use strict";var n=t("tinycolor2");e.exports=function(t){var e=0;if(!Array.isArray(t)||t.length<2)return!1;if(!t[0]||!t[t.length-1])return!1;if(0!=+t[0][0]||1!=+t[t.length-1][0])return!1;for(var r=0;r<t.length;r++){var i=t[r];if(2!==i.length||+i[0]<e||!n(i[1]).isValid())return!1;e=+i[0]}return!0}},{tinycolor2:499}],576:[function(t,e,r){"use strict";var n=t("d3"),i=t("tinycolor2"),a=t("fast-isnumeric"),o=t("../color");function s(t){var e={r:t[0],g:t[1],b:t[2],a:t[3]};return i(e).toRgbString()}e.exports=function(t,e){e=e||{};for(var r=t.domain,l=t.range,c=l.length,u=new Array(c),h=0;h<c;h++){var f=i(l[h]).toRgb();u[h]=[f.r,f.g,f.b,f.a]}var p,d=n.scale.linear().domain(r).range(u).clamp(!0),g=e.noNumericCheck,m=e.returnArray;return(p=g&&m?d:g?function(t){return s(d(t))}:m?function(t){return a(t)?d(t):i(t).isValid()?t:o.defaultLine}:function(t){return a(t)?s(d(t)):i(t).isValid()?t:o.defaultLine}).domain=d.domain,p.range=function(){return l},p}},{"../color":558,d3:147,"fast-isnumeric":214,tinycolor2:499}],577:[function(t,e,r){"use strict";e.exports={Greys:[[0,"rgb(0,0,0)"],[1,"rgb(255,255,255)"]],YlGnBu:[[0,"rgb(8,29,88)"],[.125,"rgb(37,52,148)"],[.25,"rgb(34,94,168)"],[.375,"rgb(29,145,192)"],[.5,"rgb(65,182,196)"],[.625,"rgb(127,205,187)"],[.75,"rgb(199,233,180)"],[.875,"rgb(237,248,217)"],[1,"rgb(255,255,217)"]],Greens:[[0,"rgb(0,68,27)"],[.125,"rgb(0,109,44)"],[.25,"rgb(35,139,69)"],[.375,"rgb(65,171,93)"],[.5,"rgb(116,196,118)"],[.625,"rgb(161,217,155)"],[.75,"rgb(199,233,192)"],[.875,"rgb(229,245,224)"],[1,"rgb(247,252,245)"]],YlOrRd:[[0,"rgb(128,0,38)"],[.125,"rgb(189,0,38)"],[.25,"rgb(227,26,28)"],[.375,"rgb(252,78,42)"],[.5,"rgb(253,141,60)"],[.625,"rgb(254,178,76)"],[.75,"rgb(254,217,118)"],[.875,"rgb(255,237,160)"],[1,"rgb(255,255,204)"]],Bluered:[[0,"rgb(0,0,255)"],[1,"rgb(255,0,0)"]],RdBu:[[0,"rgb(5,10,172)"],[.35,"rgb(106,137,247)"],[.5,"rgb(190,190,190)"],[.6,"rgb(220,170,132)"],[.7,"rgb(230,145,90)"],[1,"rgb(178,10,28)"]],Reds:[[0,"rgb(220,220,220)"],[.2,"rgb(245,195,157)"],[.4,"rgb(245,160,105)"],[1,"rgb(178,10,28)"]],Blues:[[0,"rgb(5,10,172)"],[.35,"rgb(40,60,190)"],[.5,"rgb(70,100,245)"],[.6,"rgb(90,120,245)"],[.7,"rgb(106,137,247)"],[1,"rgb(220,220,220)"]],Picnic:[[0,"rgb(0,0,255)"],[.1,"rgb(51,153,255)"],[.2,"rgb(102,204,255)"],[.3,"rgb(153,204,255)"],[.4,"rgb(204,204,255)"],[.5,"rgb(255,255,255)"],[.6,"rgb(255,204,255)"],[.7,"rgb(255,153,255)"],[.8,"rgb(255,102,204)"],[.9,"rgb(255,102,102)"],[1,"rgb(255,0,0)"]],Rainbow:[[0,"rgb(150,0,90)"],[.125,"rgb(0,0,200)"],[.25,"rgb(0,25,255)"],[.375,"rgb(0,152,255)"],[.5,"rgb(44,255,150)"],[.625,"rgb(151,255,0)"],[.75,"rgb(255,234,0)"],[.875,"rgb(255,111,0)"],[1,"rgb(255,0,0)"]],Portland:[[0,"rgb(12,51,131)"],[.25,"rgb(10,136,186)"],[.5,"rgb(242,211,56)"],[.75,"rgb(242,143,56)"],[1,"rgb(217,30,30)"]],Jet:[[0,"rgb(0,0,131)"],[.125,"rgb(0,60,170)"],[.375,"rgb(5,255,255)"],[.625,"rgb(255,255,0)"],[.875,"rgb(250,0,0)"],[1,"rgb(128,0,0)"]],Hot:[[0,"rgb(0,0,0)"],[.3,"rgb(230,0,0)"],[.6,"rgb(255,210,0)"],[1,"rgb(255,255,255)"]],Blackbody:[[0,"rgb(0,0,0)"],[.2,"rgb(230,0,0)"],[.4,"rgb(230,210,0)"],[.7,"rgb(255,255,255)"],[1,"rgb(160,200,255)"]],Earth:[[0,"rgb(0,0,130)"],[.1,"rgb(0,180,180)"],[.2,"rgb(40,210,40)"],[.4,"rgb(230,230,50)"],[.6,"rgb(120,70,20)"],[1,"rgb(255,255,255)"]],Electric:[[0,"rgb(0,0,0)"],[.15,"rgb(30,0,100)"],[.4,"rgb(120,0,100)"],[.6,"rgb(160,90,0)"],[.8,"rgb(230,200,0)"],[1,"rgb(255,250,220)"]],Viridis:[[0,"#440154"],[.06274509803921569,"#48186a"],[.12549019607843137,"#472d7b"],[.18823529411764706,"#424086"],[.25098039215686274,"#3b528b"],[.3137254901960784,"#33638d"],[.3764705882352941,"#2c728e"],[.4392156862745098,"#26828e"],[.5019607843137255,"#21918c"],[.5647058823529412,"#1fa088"],[.6274509803921569,"#28ae80"],[.6901960784313725,"#3fbc73"],[.7529411764705882,"#5ec962"],[.8156862745098039,"#84d44b"],[.8784313725490196,"#addc30"],[.9411764705882353,"#d8e219"],[1,"#fde725"]],Cividis:[[0,"rgb(0,32,76)"],[.058824,"rgb(0,42,102)"],[.117647,"rgb(0,52,110)"],[.176471,"rgb(39,63,108)"],[.235294,"rgb(60,74,107)"],[.294118,"rgb(76,85,107)"],[.352941,"rgb(91,95,109)"],[.411765,"rgb(104,106,112)"],[.470588,"rgb(117,117,117)"],[.529412,"rgb(131,129,120)"],[.588235,"rgb(146,140,120)"],[.647059,"rgb(161,152,118)"],[.705882,"rgb(176,165,114)"],[.764706,"rgb(192,177,109)"],[.823529,"rgb(209,191,102)"],[.882353,"rgb(225,204,92)"],[.941176,"rgb(243,219,79)"],[1,"rgb(255,233,69)"]]}},{}],578:[function(t,e,r){"use strict";e.exports=function(t,e,r,n,i){var a=(t-r)/(n-r),o=a+e/(n-r),s=(a+o)/2;return"left"===i||"bottom"===i?a:"center"===i||"middle"===i?s:"right"===i||"top"===i?o:a<2/3-s?a:o>4/3-s?o:s}},{}],579:[function(t,e,r){"use strict";var n=t("../../lib"),i=[["sw-resize","s-resize","se-resize"],["w-resize","move","e-resize"],["nw-resize","n-resize","ne-resize"]];e.exports=function(t,e,r,a){return t="left"===r?0:"center"===r?1:"right"===r?2:n.constrain(Math.floor(3*t),0,2),e="bottom"===a?0:"middle"===a?1:"top"===a?2:n.constrain(Math.floor(3*e),0,2),i[e][t]}},{"../../lib":684}],580:[function(t,e,r){"use strict";var n=t("mouse-event-offset"),i=t("has-hover"),a=t("has-passive-events"),o=t("../../registry"),s=t("../../lib"),l=t("../../plots/cartesian/constants"),c=t("../../constants/interactions"),u=e.exports={};u.align=t("./align"),u.getCursor=t("./cursor");var h=t("./unhover");function f(){var t=document.createElement("div");t.className="dragcover";var e=t.style;return e.position="fixed",e.left=0,e.right=0,e.top=0,e.bottom=0,e.zIndex=999999999,e.background="none",document.body.appendChild(t),t}function p(t){return n(t.changedTouches?t.changedTouches[0]:t,document.body)}u.unhover=h.wrapped,u.unhoverRaw=h.raw,u.init=function(t){var e,r,n,h,d,g,m,v,y=t.gd,x=1,b=c.DBLCLICKDELAY,_=t.element;y._mouseDownTime||(y._mouseDownTime=0),_.style.pointerEvents="all",_.onmousedown=k,a?(_._ontouchstart&&_.removeEventListener("touchstart",_._ontouchstart),_._ontouchstart=k,_.addEventListener("touchstart",k,{passive:!1})):_.ontouchstart=k;var w=t.clampFn||function(t,e,r){return Math.abs(t)<r&&(t=0),Math.abs(e)<r&&(e=0),[t,e]};function k(a){a.preventDefault(),y._dragged=!1,y._dragging=!0;var o=p(a);e=o[0],r=o[1],m=a.target,g=a,v=2===a.buttons||a.ctrlKey,(n=(new Date).getTime())-y._mouseDownTime<b?x+=1:(x=1,y._mouseDownTime=n),t.prepFn&&t.prepFn(a,e,r),i&&!v?(d=f()).style.cursor=window.getComputedStyle(_).cursor:i||(d=document,h=window.getComputedStyle(document.documentElement).cursor,document.documentElement.style.cursor=window.getComputedStyle(_).cursor),document.addEventListener("mousemove",M),document.addEventListener("mouseup",A),document.addEventListener("touchmove",M),document.addEventListener("touchend",A)}function M(n){n.preventDefault();var i=p(n),a=t.minDrag||l.MINDRAG,o=w(i[0]-e,i[1]-r,a),s=o[0],c=o[1];(s||c)&&(y._dragged=!0,u.unhover(y)),y._dragged&&t.moveFn&&!v&&t.moveFn(s,c)}function A(e){if(document.removeEventListener("mousemove",M),document.removeEventListener("mouseup",A),document.removeEventListener("touchmove",M),document.removeEventListener("touchend",A),e.preventDefault(),i?s.removeElement(d):h&&(d.documentElement.style.cursor=h,h=null),y._dragging){if(y._dragging=!1,(new Date).getTime()-y._mouseDownTime>b&&(x=Math.max(x-1,1)),y._dragged)t.doneFn&&t.doneFn();else if(t.clickFn&&t.clickFn(x,g),!v){var r;try{r=new MouseEvent("click",e)}catch(t){var n=p(e);(r=document.createEvent("MouseEvents")).initMouseEvent("click",e.bubbles,e.cancelable,e.view,e.detail,e.screenX,e.screenY,n[0],n[1],e.ctrlKey,e.altKey,e.shiftKey,e.metaKey,e.button,e.relatedTarget)}m.dispatchEvent(r)}!function(t){t._dragging=!1,t._replotPending&&o.call("plot",t)}(y),y._dragged=!1}else y._dragged=!1}},u.coverSlip=f},{"../../constants/interactions":660,"../../lib":684,"../../plots/cartesian/constants":737,"../../registry":817,"./align":578,"./cursor":579,"./unhover":581,"has-hover":378,"has-passive-events":379,"mouse-event-offset":403}],581:[function(t,e,r){"use strict";var n=t("../../lib/events"),i=t("../../lib/throttle"),a=t("../../lib/get_graph_div"),o=t("../fx/constants"),s=e.exports={};s.wrapped=function(t,e,r){(t=a(t))._fullLayout&&i.clear(t._fullLayout._uid+o.HOVERID),s.raw(t,e,r)},s.raw=function(t,e){var r=t._fullLayout,i=t._hoverdata;e||(e={}),e.target&&!1===n.triggerHandler(t,"plotly_beforehover",e)||(r._hoverlayer.selectAll("g").remove(),r._hoverlayer.selectAll("line").remove(),r._hoverlayer.selectAll("circle").remove(),t._hoverdata=void 0,e.target&&i&&t.emit("plotly_unhover",{event:e,points:i}))}},{"../../lib/events":672,"../../lib/get_graph_div":679,"../../lib/throttle":709,"../fx/constants":595}],582:[function(t,e,r){"use strict";r.dash={valType:"string",values:["solid","dot","dash","longdash","dashdot","longdashdot"],dflt:"solid",editType:"style"}},{}],583:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("tinycolor2"),o=t("../../registry"),s=t("../color"),l=t("../colorscale"),c=t("../../lib"),u=t("../../lib/svg_text_utils"),h=t("../../constants/xmlns_namespaces"),f=t("../../constants/alignment").LINE_SPACING,p=t("../../constants/interactions").DESELECTDIM,d=t("../../traces/scatter/subtypes"),g=t("../../traces/scatter/make_bubble_size_func"),m=e.exports={};m.font=function(t,e,r,n){c.isPlainObject(e)&&(n=e.color,r=e.size,e=e.family),e&&t.style("font-family",e),r+1&&t.style("font-size",r+"px"),n&&t.call(s.fill,n)},m.setPosition=function(t,e,r){t.attr("x",e).attr("y",r)},m.setSize=function(t,e,r){t.attr("width",e).attr("height",r)},m.setRect=function(t,e,r,n,i){t.call(m.setPosition,e,r).call(m.setSize,n,i)},m.translatePoint=function(t,e,r,n){var a=r.c2p(t.x),o=n.c2p(t.y);return!!(i(a)&&i(o)&&e.node())&&("text"===e.node().nodeName?e.attr("x",a).attr("y",o):e.attr("transform","translate("+a+","+o+")"),!0)},m.translatePoints=function(t,e,r){t.each(function(t){var i=n.select(this);m.translatePoint(t,i,e,r)})},m.hideOutsideRangePoint=function(t,e,r,n,i,a){e.attr("display",r.isPtWithinRange(t,i)&&n.isPtWithinRange(t,a)?null:"none")},m.hideOutsideRangePoints=function(t,e){if(e._hasClipOnAxisFalse){var r=e.xaxis,i=e.yaxis;t.each(function(e){var a=e[0].trace,o=a.xcalendar,s=a.ycalendar,l="bar"===a.type?".bartext":".point,.textpoint";t.selectAll(l).each(function(t){m.hideOutsideRangePoint(t,n.select(this),r,i,o,s)})})}},m.crispRound=function(t,e,r){return e&&i(e)?t._context.staticPlot?e:e<1?1:Math.round(e):r||0},m.singleLineStyle=function(t,e,r,n,i){e.style("fill","none");var a=(((t||[])[0]||{}).trace||{}).line||{},o=r||a.width||0,l=i||a.dash||"";s.stroke(e,n||a.color),m.dashLine(e,l,o)},m.lineGroupStyle=function(t,e,r,i){t.style("fill","none").each(function(t){var a=(((t||[])[0]||{}).trace||{}).line||{},o=e||a.width||0,l=i||a.dash||"";n.select(this).call(s.stroke,r||a.color).call(m.dashLine,l,o)})},m.dashLine=function(t,e,r){r=+r||0,e=m.dashStyle(e,r),t.style({"stroke-dasharray":e,"stroke-width":r+"px"})},m.dashStyle=function(t,e){e=+e||1;var r=Math.max(e,3);return"solid"===t?t="":"dot"===t?t=r+"px,"+r+"px":"dash"===t?t=3*r+"px,"+3*r+"px":"longdash"===t?t=5*r+"px,"+5*r+"px":"dashdot"===t?t=3*r+"px,"+r+"px,"+r+"px,"+r+"px":"longdashdot"===t&&(t=5*r+"px,"+2*r+"px,"+r+"px,"+2*r+"px"),t},m.singleFillStyle=function(t){var e=(((n.select(t.node()).data()[0]||[])[0]||{}).trace||{}).fillcolor;e&&t.call(s.fill,e)},m.fillGroupStyle=function(t){t.style("stroke-width",0).each(function(e){var r=n.select(this);try{r.call(s.fill,e[0].trace.fillcolor)}catch(e){c.error(e,t),r.remove()}})};var v=t("./symbol_defs");m.symbolNames=[],m.symbolFuncs=[],m.symbolNeedLines={},m.symbolNoDot={},m.symbolNoFill={},m.symbolList=[],Object.keys(v).forEach(function(t){var e=v[t];m.symbolList=m.symbolList.concat([e.n,t,e.n+100,t+"-open"]),m.symbolNames[e.n]=t,m.symbolFuncs[e.n]=e.f,e.needLine&&(m.symbolNeedLines[e.n]=!0),e.noDot?m.symbolNoDot[e.n]=!0:m.symbolList=m.symbolList.concat([e.n+200,t+"-dot",e.n+300,t+"-open-dot"]),e.noFill&&(m.symbolNoFill[e.n]=!0)});var y=m.symbolNames.length,x="M0,0.5L0.5,0L0,-0.5L-0.5,0Z";function b(t,e){var r=t%100;return m.symbolFuncs[r](e)+(t>=200?x:"")}m.symbolNumber=function(t){if("string"==typeof t){var e=0;t.indexOf("-open")>0&&(e=100,t=t.replace("-open","")),t.indexOf("-dot")>0&&(e+=200,t=t.replace("-dot","")),(t=m.symbolNames.indexOf(t))>=0&&(t+=e)}return t%100>=y||t>=400?0:Math.floor(Math.max(t,0))};var _={x1:1,x2:0,y1:0,y2:0},w={x1:0,x2:0,y1:1,y2:0};m.gradient=function(t,e,r,i,o,l){var u=e._fullLayout._defs.select(".gradients").selectAll("#"+r).data([i+o+l],c.identity);u.exit().remove(),u.enter().append("radial"===i?"radialGradient":"linearGradient").each(function(){var t=n.select(this);"horizontal"===i?t.attr(_):"vertical"===i&&t.attr(w),t.attr("id",r);var e=a(o),c=a(l);t.append("stop").attr({offset:"0%","stop-color":s.tinyRGB(c),"stop-opacity":c.getAlpha()}),t.append("stop").attr({offset:"100%","stop-color":s.tinyRGB(e),"stop-opacity":e.getAlpha()})}),t.style({fill:"url(#"+r+")","fill-opacity":null})},m.initGradients=function(t){c.ensureSingle(t._fullLayout._defs,"g","gradients").selectAll("linearGradient,radialGradient").remove()},m.pointStyle=function(t,e,r){if(t.size()){var i=m.makePointStyleFns(e);t.each(function(t){m.singlePointStyle(t,n.select(this),e,i,r)})}},m.singlePointStyle=function(t,e,r,n,i){var a=r.marker,o=a.line;if(e.style("opacity",n.selectedOpacityFn?n.selectedOpacityFn(t):void 0===t.mo?a.opacity:t.mo),n.ms2mrc){var l;l="various"===t.ms||"various"===a.size?3:n.ms2mrc(t.ms),t.mrc=l,n.selectedSizeFn&&(l=t.mrc=n.selectedSizeFn(t));var u=m.symbolNumber(t.mx||a.symbol)||0;t.om=u%200>=100,e.attr("d",b(u,l))}var h,f,p,d=!1;if(t.so)p=o.outlierwidth,f=o.outliercolor,h=a.outliercolor;else{var g=(o||{}).width;p=(t.mlw+1||g+1||(t.trace?(t.trace.marker.line||{}).width:0)+1)-1||0,f="mlc"in t?t.mlcc=n.lineScale(t.mlc):c.isArrayOrTypedArray(o.color)?s.defaultLine:o.color,c.isArrayOrTypedArray(a.color)&&(h=s.defaultLine,d=!0),h="mc"in t?t.mcc=n.markerScale(t.mc):a.color||"rgba(0,0,0,0)",n.selectedColorFn&&(h=n.selectedColorFn(t))}if(t.om)e.call(s.stroke,h).style({"stroke-width":(p||1)+"px",fill:"none"});else{e.style("stroke-width",p+"px");var v=a.gradient,y=t.mgt;if(y?d=!0:y=v&&v.type,y&&"none"!==y){var x=t.mgc;x?d=!0:x=v.color;var _="g"+i._fullLayout._uid+"-"+r.uid;d&&(_+="-"+t.i),e.call(m.gradient,i,_,y,h,x)}else e.call(s.fill,h);p&&e.call(s.stroke,f)}},m.makePointStyleFns=function(t){var e={},r=t.marker;return e.markerScale=m.tryColorscale(r,""),e.lineScale=m.tryColorscale(r,"line"),o.traceIs(t,"symbols")&&(e.ms2mrc=d.isBubble(t)?g(t):function(){return(r.size||6)/2}),t.selectedpoints&&c.extendFlat(e,m.makeSelectedPointStyleFns(t)),e},m.makeSelectedPointStyleFns=function(t){var e={},r=t.selected||{},n=t.unselected||{},i=t.marker||{},a=r.marker||{},s=n.marker||{},l=i.opacity,u=a.opacity,h=s.opacity,f=void 0!==u,d=void 0!==h;(c.isArrayOrTypedArray(l)||f||d)&&(e.selectedOpacityFn=function(t){var e=void 0===t.mo?i.opacity:t.mo;return t.selected?f?u:e:d?h:p*e});var g=i.color,m=a.color,v=s.color;(m||v)&&(e.selectedColorFn=function(t){var e=t.mcc||g;return t.selected?m||e:v||e});var y=i.size,x=a.size,b=s.size,_=void 0!==x,w=void 0!==b;return o.traceIs(t,"symbols")&&(_||w)&&(e.selectedSizeFn=function(t){var e=t.mrc||y/2;return t.selected?_?x/2:e:w?b/2:e}),e},m.makeSelectedTextStyleFns=function(t){var e={},r=t.selected||{},n=t.unselected||{},i=t.textfont||{},a=r.textfont||{},o=n.textfont||{},l=i.color,c=a.color,u=o.color;return e.selectedTextColorFn=function(t){var e=t.tc||l;return t.selected?c||e:u||(c?e:s.addOpacity(e,p))},e},m.selectedPointStyle=function(t,e){if(t.size()&&e.selectedpoints){var r=m.makeSelectedPointStyleFns(e),i=e.marker||{},a=[];r.selectedOpacityFn&&a.push(function(t,e){t.style("opacity",r.selectedOpacityFn(e))}),r.selectedColorFn&&a.push(function(t,e){s.fill(t,r.selectedColorFn(e))}),r.selectedSizeFn&&a.push(function(t,e){var n=e.mx||i.symbol||0,a=r.selectedSizeFn(e);t.attr("d",b(m.symbolNumber(n),a)),e.mrc2=a}),a.length&&t.each(function(t){for(var e=n.select(this),r=0;r<a.length;r++)a[r](e,t)})}},m.tryColorscale=function(t,e){var r=e?c.nestedProperty(t,e).get():t;if(r){var n=r.colorscale,i=r.color;if(n&&c.isArrayOrTypedArray(i))return l.makeColorScaleFunc(l.extractScale(n,r.cmin,r.cmax))}return c.identity};var k={start:1,end:-1,middle:0,bottom:1,top:-1};function M(t,e,r,i){var a=n.select(t.node().parentNode),o=-1!==e.indexOf("top")?"top":-1!==e.indexOf("bottom")?"bottom":"middle",s=-1!==e.indexOf("left")?"end":-1!==e.indexOf("right")?"start":"middle",l=i?i/.8+1:0,c=(u.lineCount(t)-1)*f+1,h=k[s]*l,p=.75*r+k[o]*l+(k[o]-1)*c*r/2;t.attr("text-anchor",s),a.attr("transform","translate("+h+","+p+")")}function A(t,e){var r=t.ts||e.textfont.size;return i(r)&&r>0?r:0}m.textPointStyle=function(t,e,r){if(t.size()){var i;if(e.selectedpoints){var a=m.makeSelectedTextStyleFns(e);i=a.selectedTextColorFn}t.each(function(t){var a=n.select(this),o=c.extractOption(t,e,"tx","text");if(o||0===o){var s=t.tp||e.textposition,l=A(t,e),h=i?i(t):t.tc||e.textfont.color;a.call(m.font,t.tf||e.textfont.family,l,h).text(o).call(u.convertToTspans,r).call(M,s,l,t.mrc)}else a.remove()})}},m.selectedTextStyle=function(t,e){if(t.size()&&e.selectedpoints){var r=m.makeSelectedTextStyleFns(e);t.each(function(t){var i=n.select(this),a=r.selectedTextColorFn(t),o=t.tp||e.textposition,l=A(t,e);s.fill(i,a),M(i,o,l,t.mrc2||t.mrc)})}};var T=.5;function S(t,e,r,i){var a=t[0]-e[0],o=t[1]-e[1],s=r[0]-e[0],l=r[1]-e[1],c=Math.pow(a*a+o*o,T/2),u=Math.pow(s*s+l*l,T/2),h=(u*u*a-c*c*s)*i,f=(u*u*o-c*c*l)*i,p=3*u*(c+u),d=3*c*(c+u);return[[n.round(e[0]+(p&&h/p),2),n.round(e[1]+(p&&f/p),2)],[n.round(e[0]-(d&&h/d),2),n.round(e[1]-(d&&f/d),2)]]}m.smoothopen=function(t,e){if(t.length<3)return"M"+t.join("L");var r,n="M"+t[0],i=[];for(r=1;r<t.length-1;r++)i.push(S(t[r-1],t[r],t[r+1],e));for(n+="Q"+i[0][0]+" "+t[1],r=2;r<t.length-1;r++)n+="C"+i[r-2][1]+" "+i[r-1][0]+" "+t[r];return n+="Q"+i[t.length-3][1]+" "+t[t.length-1]},m.smoothclosed=function(t,e){if(t.length<3)return"M"+t.join("L")+"Z";var r,n="M"+t[0],i=t.length-1,a=[S(t[i],t[0],t[1],e)];for(r=1;r<i;r++)a.push(S(t[r-1],t[r],t[r+1],e));for(a.push(S(t[i-1],t[i],t[0],e)),r=1;r<=i;r++)n+="C"+a[r-1][1]+" "+a[r][0]+" "+t[r];return n+="C"+a[i][1]+" "+a[0][0]+" "+t[0]+"Z"};var E={hv:function(t,e){return"H"+n.round(e[0],2)+"V"+n.round(e[1],2)},vh:function(t,e){return"V"+n.round(e[1],2)+"H"+n.round(e[0],2)},hvh:function(t,e){return"H"+n.round((t[0]+e[0])/2,2)+"V"+n.round(e[1],2)+"H"+n.round(e[0],2)},vhv:function(t,e){return"V"+n.round((t[1]+e[1])/2,2)+"H"+n.round(e[0],2)+"V"+n.round(e[1],2)}},C=function(t,e){return"L"+n.round(e[0],2)+","+n.round(e[1],2)};m.steps=function(t){var e=E[t]||C;return function(t){for(var r="M"+n.round(t[0][0],2)+","+n.round(t[0][1],2),i=1;i<t.length;i++)r+=e(t[i-1],t[i]);return r}},m.makeTester=function(){var t=c.ensureSingleById(n.select("body"),"svg","js-plotly-tester",function(t){t.attr(h.svgAttrs).style({position:"absolute",left:"-10000px",top:"-10000px",width:"9000px",height:"9000px","z-index":"1"})}),e=c.ensureSingle(t,"path","js-reference-point",function(t){t.attr("d","M0,0H1V1H0Z").style({"stroke-width":0,fill:"black"})});m.tester=t,m.testref=e},m.savedBBoxes={};var L=0;function z(t){var e=t.getAttribute("data-unformatted");if(null!==e)return e+t.getAttribute("data-math")+t.getAttribute("text-anchor")+t.getAttribute("style")}m.bBox=function(t,e,r){var i,a,o;if(r||(r=z(t)),r){if(i=m.savedBBoxes[r])return c.extendFlat({},i)}else if(1===t.childNodes.length){var s=t.childNodes[0];if(r=z(s)){var l=+s.getAttribute("x")||0,h=+s.getAttribute("y")||0,f=s.getAttribute("transform");if(!f){var p=m.bBox(s,!1,r);return l&&(p.left+=l,p.right+=l),h&&(p.top+=h,p.bottom+=h),p}if(r+="~"+l+"~"+h+"~"+f,i=m.savedBBoxes[r])return c.extendFlat({},i)}}e?a=t:(o=m.tester.node(),a=t.cloneNode(!0),o.appendChild(a)),n.select(a).attr("transform",null).call(u.positionText,0,0);var d=a.getBoundingClientRect(),g=m.testref.node().getBoundingClientRect();e||o.removeChild(a);var v={height:d.height,width:d.width,left:d.left-g.left,top:d.top-g.top,right:d.right-g.left,bottom:d.bottom-g.top};return L>=1e4&&(m.savedBBoxes={},L=0),r&&(m.savedBBoxes[r]=v),L++,c.extendFlat({},v)},m.setClipUrl=function(t,e){if(e){if(void 0===m.baseUrl){var r=n.select("base");r.size()&&r.attr("href")?m.baseUrl=window.location.href.split("#")[0]:m.baseUrl=""}t.attr("clip-path","url("+m.baseUrl+"#"+e+")")}else t.attr("clip-path",null)},m.getTranslate=function(t){var e=(t[t.attr?"attr":"getAttribute"]("transform")||"").replace(/.*\btranslate\((-?\d*\.?\d*)[^-\d]*(-?\d*\.?\d*)[^\d].*/,function(t,e,r){return[e,r].join(" ")}).split(" ");return{x:+e[0]||0,y:+e[1]||0}},m.setTranslate=function(t,e,r){var n=t.attr?"attr":"getAttribute",i=t.attr?"attr":"setAttribute",a=t[n]("transform")||"";return e=e||0,r=r||0,a=a.replace(/(\btranslate\(.*?\);?)/,"").trim(),a=(a+=" translate("+e+", "+r+")").trim(),t[i]("transform",a),a},m.getScale=function(t){var e=(t[t.attr?"attr":"getAttribute"]("transform")||"").replace(/.*\bscale\((\d*\.?\d*)[^\d]*(\d*\.?\d*)[^\d].*/,function(t,e,r){return[e,r].join(" ")}).split(" ");return{x:+e[0]||1,y:+e[1]||1}},m.setScale=function(t,e,r){var n=t.attr?"attr":"getAttribute",i=t.attr?"attr":"setAttribute",a=t[n]("transform")||"";return e=e||1,r=r||1,a=a.replace(/(\bscale\(.*?\);?)/,"").trim(),a=(a+=" scale("+e+", "+r+")").trim(),t[i]("transform",a),a};var P=/\s*sc.*/;m.setPointGroupScale=function(t,e,r){if(e=e||1,r=r||1,t){var n=1===e&&1===r?"":" scale("+e+","+r+")";t.each(function(){var t=(this.getAttribute("transform")||"").replace(P,"");t=(t+=n).trim(),this.setAttribute("transform",t)})}};var I=/translate\([^)]*\)\s*$/;m.setTextPointsScale=function(t,e,r){t&&t.each(function(){var t,i=n.select(this),a=i.select("text");if(a.node()){var o=parseFloat(a.attr("x")||0),s=parseFloat(a.attr("y")||0),l=(i.attr("transform")||"").match(I);t=1===e&&1===r?[]:["translate("+o+","+s+")","scale("+e+","+r+")","translate("+-o+","+-s+")"],l&&t.push(l),i.attr("transform",t.join(" "))}})}},{"../../constants/alignment":656,"../../constants/interactions":660,"../../constants/xmlns_namespaces":663,"../../lib":684,"../../lib/svg_text_utils":708,"../../registry":817,"../../traces/scatter/make_bubble_size_func":1031,"../../traces/scatter/subtypes":1037,"../color":558,"../colorscale":573,"./symbol_defs":584,d3:147,"fast-isnumeric":214,tinycolor2:499}],584:[function(t,e,r){"use strict";var n=t("d3");e.exports={circle:{n:0,f:function(t){var e=n.round(t,2);return"M"+e+",0A"+e+","+e+" 0 1,1 0,-"+e+"A"+e+","+e+" 0 0,1 "+e+",0Z"}},square:{n:1,f:function(t){var e=n.round(t,2);return"M"+e+","+e+"H-"+e+"V-"+e+"H"+e+"Z"}},diamond:{n:2,f:function(t){var e=n.round(1.3*t,2);return"M"+e+",0L0,"+e+"L-"+e+",0L0,-"+e+"Z"}},cross:{n:3,f:function(t){var e=n.round(.4*t,2),r=n.round(1.2*t,2);return"M"+r+","+e+"H"+e+"V"+r+"H-"+e+"V"+e+"H-"+r+"V-"+e+"H-"+e+"V-"+r+"H"+e+"V-"+e+"H"+r+"Z"}},x:{n:4,f:function(t){var e=n.round(.8*t/Math.sqrt(2),2),r="l"+e+","+e,i="l"+e+",-"+e,a="l-"+e+",-"+e,o="l-"+e+","+e;return"M0,"+e+r+i+a+i+a+o+a+o+r+o+r+"Z"}},"triangle-up":{n:5,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return"M-"+e+","+n.round(t/2,2)+"H"+e+"L0,-"+n.round(t,2)+"Z"}},"triangle-down":{n:6,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return"M-"+e+",-"+n.round(t/2,2)+"H"+e+"L0,"+n.round(t,2)+"Z"}},"triangle-left":{n:7,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return"M"+n.round(t/2,2)+",-"+e+"V"+e+"L-"+n.round(t,2)+",0Z"}},"triangle-right":{n:8,f:function(t){var e=n.round(2*t/Math.sqrt(3),2);return"M-"+n.round(t/2,2)+",-"+e+"V"+e+"L"+n.round(t,2)+",0Z"}},"triangle-ne":{n:9,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return"M-"+r+",-"+e+"H"+e+"V"+r+"Z"}},"triangle-se":{n:10,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return"M"+e+",-"+r+"V"+e+"H-"+r+"Z"}},"triangle-sw":{n:11,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return"M"+r+","+e+"H-"+e+"V-"+r+"Z"}},"triangle-nw":{n:12,f:function(t){var e=n.round(.6*t,2),r=n.round(1.2*t,2);return"M-"+e+","+r+"V-"+e+"H"+r+"Z"}},pentagon:{n:13,f:function(t){var e=n.round(.951*t,2),r=n.round(.588*t,2),i=n.round(-t,2),a=n.round(-.309*t,2);return"M"+e+","+a+"L"+r+","+n.round(.809*t,2)+"H-"+r+"L-"+e+","+a+"L0,"+i+"Z"}},hexagon:{n:14,f:function(t){var e=n.round(t,2),r=n.round(t/2,2),i=n.round(t*Math.sqrt(3)/2,2);return"M"+i+",-"+r+"V"+r+"L0,"+e+"L-"+i+","+r+"V-"+r+"L0,-"+e+"Z"}},hexagon2:{n:15,f:function(t){var e=n.round(t,2),r=n.round(t/2,2),i=n.round(t*Math.sqrt(3)/2,2);return"M-"+r+","+i+"H"+r+"L"+e+",0L"+r+",-"+i+"H-"+r+"L-"+e+",0Z"}},octagon:{n:16,f:function(t){var e=n.round(.924*t,2),r=n.round(.383*t,2);return"M-"+r+",-"+e+"H"+r+"L"+e+",-"+r+"V"+r+"L"+r+","+e+"H-"+r+"L-"+e+","+r+"V-"+r+"Z"}},star:{n:17,f:function(t){var e=1.4*t,r=n.round(.225*e,2),i=n.round(.951*e,2),a=n.round(.363*e,2),o=n.round(.588*e,2),s=n.round(-e,2),l=n.round(-.309*e,2),c=n.round(.118*e,2),u=n.round(.809*e,2);return"M"+r+","+l+"H"+i+"L"+a+","+c+"L"+o+","+u+"L0,"+n.round(.382*e,2)+"L-"+o+","+u+"L-"+a+","+c+"L-"+i+","+l+"H-"+r+"L0,"+s+"Z"}},hexagram:{n:18,f:function(t){var e=n.round(.66*t,2),r=n.round(.38*t,2),i=n.round(.76*t,2);return"M-"+i+",0l-"+r+",-"+e+"h"+i+"l"+r+",-"+e+"l"+r+","+e+"h"+i+"l-"+r+","+e+"l"+r+","+e+"h-"+i+"l-"+r+","+e+"l-"+r+",-"+e+"h-"+i+"Z"}},"star-triangle-up":{n:19,f:function(t){var e=n.round(t*Math.sqrt(3)*.8,2),r=n.round(.8*t,2),i=n.round(1.6*t,2),a=n.round(4*t,2),o="A "+a+","+a+" 0 0 1 ";return"M-"+e+","+r+o+e+","+r+o+"0,-"+i+o+"-"+e+","+r+"Z"}},"star-triangle-down":{n:20,f:function(t){var e=n.round(t*Math.sqrt(3)*.8,2),r=n.round(.8*t,2),i=n.round(1.6*t,2),a=n.round(4*t,2),o="A "+a+","+a+" 0 0 1 ";return"M"+e+",-"+r+o+"-"+e+",-"+r+o+"0,"+i+o+e+",-"+r+"Z"}},"star-square":{n:21,f:function(t){var e=n.round(1.1*t,2),r=n.round(2*t,2),i="A "+r+","+r+" 0 0 1 ";return"M-"+e+",-"+e+i+"-"+e+","+e+i+e+","+e+i+e+",-"+e+i+"-"+e+",-"+e+"Z"}},"star-diamond":{n:22,f:function(t){var e=n.round(1.4*t,2),r=n.round(1.9*t,2),i="A "+r+","+r+" 0 0 1 ";return"M-"+e+",0"+i+"0,"+e+i+e+",0"+i+"0,-"+e+i+"-"+e+",0Z"}},"diamond-tall":{n:23,f:function(t){var e=n.round(.7*t,2),r=n.round(1.4*t,2);return"M0,"+r+"L"+e+",0L0,-"+r+"L-"+e+",0Z"}},"diamond-wide":{n:24,f:function(t){var e=n.round(1.4*t,2),r=n.round(.7*t,2);return"M0,"+r+"L"+e+",0L0,-"+r+"L-"+e+",0Z"}},hourglass:{n:25,f:function(t){var e=n.round(t,2);return"M"+e+","+e+"H-"+e+"L"+e+",-"+e+"H-"+e+"Z"},noDot:!0},bowtie:{n:26,f:function(t){var e=n.round(t,2);return"M"+e+","+e+"V-"+e+"L-"+e+","+e+"V-"+e+"Z"},noDot:!0},"circle-cross":{n:27,f:function(t){var e=n.round(t,2);return"M0,"+e+"V-"+e+"M"+e+",0H-"+e+"M"+e+",0A"+e+","+e+" 0 1,1 0,-"+e+"A"+e+","+e+" 0 0,1 "+e+",0Z"},needLine:!0,noDot:!0},"circle-x":{n:28,f:function(t){var e=n.round(t,2),r=n.round(t/Math.sqrt(2),2);return"M"+r+","+r+"L-"+r+",-"+r+"M"+r+",-"+r+"L-"+r+","+r+"M"+e+",0A"+e+","+e+" 0 1,1 0,-"+e+"A"+e+","+e+" 0 0,1 "+e+",0Z"},needLine:!0,noDot:!0},"square-cross":{n:29,f:function(t){var e=n.round(t,2);return"M0,"+e+"V-"+e+"M"+e+",0H-"+e+"M"+e+","+e+"H-"+e+"V-"+e+"H"+e+"Z"},needLine:!0,noDot:!0},"square-x":{n:30,f:function(t){var e=n.round(t,2);return"M"+e+","+e+"L-"+e+",-"+e+"M"+e+",-"+e+"L-"+e+","+e+"M"+e+","+e+"H-"+e+"V-"+e+"H"+e+"Z"},needLine:!0,noDot:!0},"diamond-cross":{n:31,f:function(t){var e=n.round(1.3*t,2);return"M"+e+",0L0,"+e+"L-"+e+",0L0,-"+e+"ZM0,-"+e+"V"+e+"M-"+e+",0H"+e},needLine:!0,noDot:!0},"diamond-x":{n:32,f:function(t){var e=n.round(1.3*t,2),r=n.round(.65*t,2);return"M"+e+",0L0,"+e+"L-"+e+",0L0,-"+e+"ZM-"+r+",-"+r+"L"+r+","+r+"M-"+r+","+r+"L"+r+",-"+r},needLine:!0,noDot:!0},"cross-thin":{n:33,f:function(t){var e=n.round(1.4*t,2);return"M0,"+e+"V-"+e+"M"+e+",0H-"+e},needLine:!0,noDot:!0,noFill:!0},"x-thin":{n:34,f:function(t){var e=n.round(t,2);return"M"+e+","+e+"L-"+e+",-"+e+"M"+e+",-"+e+"L-"+e+","+e},needLine:!0,noDot:!0,noFill:!0},asterisk:{n:35,f:function(t){var e=n.round(1.2*t,2),r=n.round(.85*t,2);return"M0,"+e+"V-"+e+"M"+e+",0H-"+e+"M"+r+","+r+"L-"+r+",-"+r+"M"+r+",-"+r+"L-"+r+","+r},needLine:!0,noDot:!0,noFill:!0},hash:{n:36,f:function(t){var e=n.round(t/2,2),r=n.round(t,2);return"M"+e+","+r+"V-"+r+"m-"+r+",0V"+r+"M"+r+","+e+"H-"+r+"m0,-"+r+"H"+r},needLine:!0,noFill:!0},"y-up":{n:37,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),i=n.round(.8*t,2);return"M-"+e+","+i+"L0,0M"+e+","+i+"L0,0M0,-"+r+"L0,0"},needLine:!0,noDot:!0,noFill:!0},"y-down":{n:38,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),i=n.round(.8*t,2);return"M-"+e+",-"+i+"L0,0M"+e+",-"+i+"L0,0M0,"+r+"L0,0"},needLine:!0,noDot:!0,noFill:!0},"y-left":{n:39,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),i=n.round(.8*t,2);return"M"+i+","+e+"L0,0M"+i+",-"+e+"L0,0M-"+r+",0L0,0"},needLine:!0,noDot:!0,noFill:!0},"y-right":{n:40,f:function(t){var e=n.round(1.2*t,2),r=n.round(1.6*t,2),i=n.round(.8*t,2);return"M-"+i+","+e+"L0,0M-"+i+",-"+e+"L0,0M"+r+",0L0,0"},needLine:!0,noDot:!0,noFill:!0},"line-ew":{n:41,f:function(t){var e=n.round(1.4*t,2);return"M"+e+",0H-"+e},needLine:!0,noDot:!0,noFill:!0},"line-ns":{n:42,f:function(t){var e=n.round(1.4*t,2);return"M0,"+e+"V-"+e},needLine:!0,noDot:!0,noFill:!0},"line-ne":{n:43,f:function(t){var e=n.round(t,2);return"M"+e+",-"+e+"L-"+e+","+e},needLine:!0,noDot:!0,noFill:!0},"line-nw":{n:44,f:function(t){var e=n.round(t,2);return"M"+e+","+e+"L-"+e+",-"+e},needLine:!0,noDot:!0,noFill:!0}}},{d3:147}],585:[function(t,e,r){"use strict";e.exports={visible:{valType:"boolean",editType:"calc"},type:{valType:"enumerated",values:["percent","constant","sqrt","data"],editType:"calc"},symmetric:{valType:"boolean",editType:"calc"},array:{valType:"data_array",editType:"calc"},arrayminus:{valType:"data_array",editType:"calc"},value:{valType:"number",min:0,dflt:10,editType:"calc"},valueminus:{valType:"number",min:0,dflt:10,editType:"calc"},traceref:{valType:"integer",min:0,dflt:0,editType:"style"},tracerefminus:{valType:"integer",min:0,dflt:0,editType:"style"},copy_ystyle:{valType:"boolean",editType:"plot"},copy_zstyle:{valType:"boolean",editType:"style"},color:{valType:"color",editType:"style"},thickness:{valType:"number",min:0,dflt:2,editType:"style"},width:{valType:"number",min:0,editType:"plot"},editType:"calc",_deprecated:{opacity:{valType:"number",editType:"style"}}}},{}],586:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../registry"),a=t("../../plots/cartesian/axes"),o=t("./compute_error");function s(t,e,r,i){var s=e["error_"+i]||{},l=[];if(s.visible&&-1!==["linear","log"].indexOf(r.type)){for(var c=o(s),u=0;u<t.length;u++){var h=t[u],f=h[i];if(n(r.c2l(f))){var p=c(f,u);if(n(p[0])&&n(p[1])){var d=h[i+"s"]=f-p[0],g=h[i+"h"]=f+p[1];l.push(d,g)}}}a.expand(r,l,{padded:!0})}}e.exports=function(t){for(var e=t.calcdata,r=0;r<e.length;r++){var n=e[r],o=n[0].trace;if(i.traceIs(o,"errorBarsOK")){var l=a.getFromId(t,o.xaxis),c=a.getFromId(t,o.yaxis);s(n,o,l,"x"),s(n,o,c,"y")}}}},{"../../plots/cartesian/axes":732,"../../registry":817,"./compute_error":587,"fast-isnumeric":214}],587:[function(t,e,r){"use strict";function n(t,e){return"percent"===t?function(t){return Math.abs(t*e/100)}:"constant"===t?function(){return Math.abs(e)}:"sqrt"===t?function(t){return Math.sqrt(Math.abs(t))}:void 0}e.exports=function(t){var e=t.type,r=t.symmetric;if("data"===e){var i=t.array||[];if(r)return function(t,e){var r=+i[e];return[r,r]};var a=t.arrayminus||[];return function(t,e){var r=+i[e],n=+a[e];return isNaN(r)&&isNaN(n)?[NaN,NaN]:[n||0,r||0]}}var o=n(e,t.value),s=n(e,t.valueminus);return r||void 0===t.valueminus?function(t){var e=o(t);return[e,e]}:function(t){return[s(t),o(t)]}}},{}],588:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../registry"),a=t("../../lib"),o=t("../../plot_api/plot_template"),s=t("./attributes");e.exports=function(t,e,r,l){var c="error_"+l.axis,u=o.newContainer(e,c),h=t[c]||{};function f(t,e){return a.coerce(h,u,s,t,e)}if(!1!==f("visible",void 0!==h.array||void 0!==h.value||"sqrt"===h.type)){var p=f("type","array"in h?"data":"percent"),d=!0;"sqrt"!==p&&(d=f("symmetric",!(("data"===p?"arrayminus":"valueminus")in h))),"data"===p?(f("array"),f("traceref"),d||(f("arrayminus"),f("tracerefminus"))):"percent"!==p&&"constant"!==p||(f("value"),d||f("valueminus"));var g="copy_"+l.inherit+"style";if(l.inherit)(e["error_"+l.inherit]||{}).visible&&f(g,!(h.color||n(h.thickness)||n(h.width)));l.inherit&&u[g]||(f("color",r),f("thickness"),f("width",i.traceIs(e,"gl3d")?0:4))}}},{"../../lib":684,"../../plot_api/plot_template":722,"../../registry":817,"./attributes":585,"fast-isnumeric":214}],589:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plot_api/edit_types").overrideAll,a=t("./attributes"),o={error_x:n.extendFlat({},a),error_y:n.extendFlat({},a)};delete o.error_x.copy_zstyle,delete o.error_y.copy_zstyle,delete o.error_y.copy_ystyle;var s={error_x:n.extendFlat({},a),error_y:n.extendFlat({},a),error_z:n.extendFlat({},a)};delete s.error_x.copy_ystyle,delete s.error_y.copy_ystyle,delete s.error_z.copy_ystyle,delete s.error_z.copy_zstyle,e.exports={moduleType:"component",name:"errorbars",schema:{traces:{scatter:o,bar:o,histogram:o,scatter3d:i(s,"calc","nested"),scattergl:i(o,"calc","nested")}},supplyDefaults:t("./defaults"),calc:t("./calc"),makeComputeError:t("./compute_error"),plot:t("./plot"),style:t("./style"),hoverInfo:function(t,e,r){(e.error_y||{}).visible&&(r.yerr=t.yh-t.y,e.error_y.symmetric||(r.yerrneg=t.y-t.ys));(e.error_x||{}).visible&&(r.xerr=t.xh-t.x,e.error_x.symmetric||(r.xerrneg=t.x-t.xs))}}},{"../../lib":684,"../../plot_api/edit_types":715,"./attributes":585,"./calc":586,"./compute_error":587,"./defaults":588,"./plot":590,"./style":591}],590:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("../drawing"),o=t("../../traces/scatter/subtypes");e.exports=function(t,e,r){var s=e.xaxis,l=e.yaxis,c=r&&r.duration>0;t.each(function(t){var u,h=t[0].trace,f=h.error_x||{},p=h.error_y||{};h.ids&&(u=function(t){return t.id});var d=o.hasMarkers(h)&&h.marker.maxdisplayed>0;p.visible||f.visible||(t=[]);var g=n.select(this).selectAll("g.errorbar").data(t,u);if(g.exit().remove(),t.length){f.visible||g.selectAll("path.xerror").remove(),p.visible||g.selectAll("path.yerror").remove(),g.style("opacity",1);var m=g.enter().append("g").classed("errorbar",!0);c&&m.style("opacity",0).transition().duration(r.duration).style("opacity",1),a.setClipUrl(g,e.layerClipId),g.each(function(t){var e=n.select(this),a=function(t,e,r){var n={x:e.c2p(t.x),y:r.c2p(t.y)};void 0!==t.yh&&(n.yh=r.c2p(t.yh),n.ys=r.c2p(t.ys),i(n.ys)||(n.noYS=!0,n.ys=r.c2p(t.ys,!0)));void 0!==t.xh&&(n.xh=e.c2p(t.xh),n.xs=e.c2p(t.xs),i(n.xs)||(n.noXS=!0,n.xs=e.c2p(t.xs,!0)));return n}(t,s,l);if(!d||t.vis){var o,u=e.select("path.yerror");if(p.visible&&i(a.x)&&i(a.yh)&&i(a.ys)){var h=p.width;o="M"+(a.x-h)+","+a.yh+"h"+2*h+"m-"+h+",0V"+a.ys,a.noYS||(o+="m-"+h+",0h"+2*h),!u.size()?u=e.append("path").style("vector-effect","non-scaling-stroke").classed("yerror",!0):c&&(u=u.transition().duration(r.duration).ease(r.easing)),u.attr("d",o)}else u.remove();var g=e.select("path.xerror");if(f.visible&&i(a.y)&&i(a.xh)&&i(a.xs)){var m=(f.copy_ystyle?p:f).width;o="M"+a.xh+","+(a.y-m)+"v"+2*m+"m0,-"+m+"H"+a.xs,a.noXS||(o+="m0,-"+m+"v"+2*m),!g.size()?g=e.append("path").style("vector-effect","non-scaling-stroke").classed("xerror",!0):c&&(g=g.transition().duration(r.duration).ease(r.easing)),g.attr("d",o)}else g.remove()}})}})}},{"../../traces/scatter/subtypes":1037,"../drawing":583,d3:147,"fast-isnumeric":214}],591:[function(t,e,r){"use strict";var n=t("d3"),i=t("../color");e.exports=function(t){t.each(function(t){var e=t[0].trace,r=e.error_y||{},a=e.error_x||{},o=n.select(this);o.selectAll("path.yerror").style("stroke-width",r.thickness+"px").call(i.stroke,r.color),a.copy_ystyle&&(a=r),o.selectAll("path.xerror").style("stroke-width",a.thickness+"px").call(i.stroke,a.color)})}},{"../color":558,d3:147}],592:[function(t,e,r){"use strict";var n=t("../../plots/font_attributes");e.exports={hoverlabel:{bgcolor:{valType:"color",arrayOk:!0,editType:"none"},bordercolor:{valType:"color",arrayOk:!0,editType:"none"},font:n({arrayOk:!0,editType:"none"}),namelength:{valType:"integer",min:-1,arrayOk:!0,editType:"none"},editType:"calc"}}},{"../../plots/font_attributes":758}],593:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../registry");function a(t,e,r,i){i=i||n.identity,Array.isArray(t)&&(e[0][r]=i(t))}e.exports=function(t){var e=t.calcdata,r=t._fullLayout;function o(t){return function(e){return n.coerceHoverinfo({hoverinfo:e},{_module:t._module},r)}}for(var s=0;s<e.length;s++){var l=e[s],c=l[0].trace;if(!i.traceIs(c,"pie")){var u=i.traceIs(c,"2dMap")?a:n.fillArray;u(c.hoverinfo,l,"hi",o(c)),c.hoverlabel&&(u(c.hoverlabel.bgcolor,l,"hbg"),u(c.hoverlabel.bordercolor,l,"hbc"),u(c.hoverlabel.font.size,l,"hts"),u(c.hoverlabel.font.color,l,"htc"),u(c.hoverlabel.font.family,l,"htf"),u(c.hoverlabel.namelength,l,"hnl"))}}}},{"../../lib":684,"../../registry":817}],594:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("./hover").hover;e.exports=function(t,e,r){var a=n.getComponentMethod("annotations","onClick")(t,t._hoverdata);function o(){t.emit("plotly_click",{points:t._hoverdata,event:e})}void 0!==r&&i(t,e,r,!0),t._hoverdata&&e&&e.target&&(a&&a.then?a.then(o):o(),e.stopImmediatePropagation&&e.stopImmediatePropagation())}},{"../../registry":817,"./hover":598}],595:[function(t,e,r){"use strict";e.exports={YANGLE:60,HOVERARROWSIZE:6,HOVERTEXTPAD:3,HOVERFONTSIZE:13,HOVERFONT:"Arial, sans-serif",HOVERMINTIME:50,HOVERID:"-hover"}},{}],596:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./attributes"),a=t("./hoverlabel_defaults");e.exports=function(t,e,r,o){a(t,e,function(r,a){return n.coerce(t,e,i,r,a)},o.hoverlabel)}},{"../../lib":684,"./attributes":592,"./hoverlabel_defaults":599}],597:[function(t,e,r){"use strict";var n=t("../../lib");r.getSubplot=function(t){return t.subplot||t.xaxis+t.yaxis||t.geo},r.isTraceInSubplots=function(t,e){if("splom"===t.type){for(var n=t.xaxes||[],i=t.yaxes||[],a=0;a<n.length;a++)for(var o=0;o<i.length;o++)if(-1!==e.indexOf(n[a]+i[o]))return!0;return!1}return-1!==e.indexOf(r.getSubplot(t))},r.flat=function(t,e){for(var r=new Array(t.length),n=0;n<t.length;n++)r[n]=e;return r},r.p2c=function(t,e){for(var r=new Array(t.length),n=0;n<t.length;n++)r[n]=t[n].p2c(e);return r},r.getDistanceFunction=function(t,e,n,i){return"closest"===t?i||r.quadrature(e,n):"x"===t?e:n},r.getClosest=function(t,e,r){if(!1!==r.index)r.index>=0&&r.index<t.length?r.distance=0:r.index=!1;else for(var n=0;n<t.length;n++){var i=e(t[n]);i<=r.distance&&(r.index=n,r.distance=i)}return r},r.inbox=function(t,e,r){return t*e<0||0===t?r:1/0},r.quadrature=function(t,e){return function(r){var n=t(r),i=e(r);return Math.sqrt(n*n+i*i)}},r.makeEventData=function(t,e,n){var i="index"in t?t.index:t.pointNumber,a={data:e._input,fullData:e,curveNumber:e.index,pointNumber:i};if(e._indexToPoints){var o=e._indexToPoints[i];1===o.length?a.pointIndex=o[0]:a.pointIndices=o}else a.pointIndex=i;return e._module.eventData?a=e._module.eventData(a,t,e,n,i):("xVal"in t?a.x=t.xVal:"x"in t&&(a.x=t.x),"yVal"in t?a.y=t.yVal:"y"in t&&(a.y=t.y),t.xa&&(a.xaxis=t.xa),t.ya&&(a.yaxis=t.ya),void 0!==t.zLabelVal&&(a.z=t.zLabelVal)),r.appendArrayPointValue(a,e,i),a},r.appendArrayPointValue=function(t,e,r){var i=e._arrayAttrs;if(i)for(var s=0;s<i.length;s++){var l=i[s],c=a(l);if(void 0===t[c]){var u=o(n.nestedProperty(e,l).get(),r);void 0!==u&&(t[c]=u)}}},r.appendArrayMultiPointValues=function(t,e,r){var i=e._arrayAttrs;if(i)for(var s=0;s<i.length;s++){var l=i[s],c=a(l);if(void 0===t[c]){for(var u=n.nestedProperty(e,l).get(),h=new Array(r.length),f=0;f<r.length;f++)h[f]=o(u,r[f]);t[c]=h}}};var i={ids:"id",locations:"location",labels:"label",values:"value","marker.colors":"color"};function a(t){return i[t]||t}function o(t,e){return Array.isArray(e)?Array.isArray(t)&&Array.isArray(t[e[0]])?t[e[0]][e[1]]:void 0:t[e]}},{"../../lib":684}],598:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("tinycolor2"),o=t("../../lib"),s=t("../../lib/events"),l=t("../../lib/svg_text_utils"),c=t("../../lib/override_cursor"),u=t("../drawing"),h=t("../color"),f=t("../dragelement"),p=t("../../plots/cartesian/axes"),d=t("../../registry"),g=t("./helpers"),m=t("./constants"),v=m.YANGLE,y=Math.PI*v/180,x=1/Math.sin(y),b=Math.cos(y),_=Math.sin(y),w=m.HOVERARROWSIZE,k=m.HOVERTEXTPAD;function M(t,e,r){var i=e.hovermode,a=e.rotateLabels,s=e.bgColor,c=e.container,f=e.outerContainer,p=e.commonLabelOpts||{},d=e.fontFamily||m.HOVERFONT,g=e.fontSize||m.HOVERFONTSIZE,y=t[0],x=y.xa,b=y.ya,_="y"===i?"yLabel":"xLabel",M=y[_],A=(String(M)||"").split(" ")[0],T=f.node().getBoundingClientRect(),S=T.top,E=T.width,C=T.height,L=void 0!==M&&y.distance<=e.hoverdistance&&("x"===i||"y"===i);if(L){var z,P,I=!0;for(z=0;z<t.length;z++){I&&void 0===t[z].zLabel&&(I=!1),P=t[z].hoverinfo||t[z].trace.hoverinfo;var O=Array.isArray(P)?P:P.split("+");if(-1===O.indexOf("all")&&-1===O.indexOf(i)){L=!1;break}}I&&(L=!1)}var D=c.selectAll("g.axistext").data(L?[0]:[]);D.enter().append("g").classed("axistext",!0),D.exit().remove(),D.each(function(){var e=n.select(this),a=o.ensureSingle(e,"path","",function(t){t.style({"stroke-width":"1px"})}),s=o.ensureSingle(e,"text","",function(t){t.attr("data-notex",1)}),c=p.bgcolor||h.defaultLine,f=p.bordercolor||h.contrast(c);a.style({fill:c,stroke:f}),s.text(M).call(u.font,p.font.family||d,p.font.size||g,p.font.color||h.background).call(l.positionText,0,0).call(l.convertToTspans,r),e.attr("transform","");var m=s.node().getBoundingClientRect();if("x"===i){s.attr("text-anchor","middle").call(l.positionText,0,"top"===x.side?S-m.bottom-w-k:S-m.top+w+k);var v="top"===x.side?"-":"";a.attr("d","M0,0L"+w+","+v+w+"H"+(k+m.width/2)+"v"+v+(2*k+m.height)+"H-"+(k+m.width/2)+"V"+v+w+"H-"+w+"Z"),e.attr("transform","translate("+(x._offset+(y.x0+y.x1)/2)+","+(b._offset+("top"===x.side?0:b._length))+")")}else{s.attr("text-anchor","right"===b.side?"start":"end").call(l.positionText,("right"===b.side?1:-1)*(k+w),S-m.top-m.height/2);var T="right"===b.side?"":"-";a.attr("d","M0,0L"+T+w+","+w+"V"+(k+m.height/2)+"h"+T+(2*k+m.width)+"V-"+(k+m.height/2)+"H"+T+w+"V-"+w+"Z"),e.attr("transform","translate("+(x._offset+("right"===b.side?x._length:0))+","+(b._offset+(y.y0+y.y1)/2)+")")}t=t.filter(function(t){return void 0!==t.zLabelVal||(t[_]||"").split(" ")[0]===A})});var R=c.selectAll("g.hovertext").data(t,function(t){return[t.trace.index,t.index,t.x0,t.y0,t.name,t.attr,t.xa,t.ya||""].join(",")});return R.enter().append("g").classed("hovertext",!0).each(function(){var t=n.select(this);t.append("rect").call(h.fill,h.addOpacity(s,.8)),t.append("text").classed("name",!0),t.append("path").style("stroke-width","1px"),t.append("text").classed("nums",!0).call(u.font,d,g)}),R.exit().remove(),R.each(function(t){var e=n.select(this).attr("transform",""),o="",c="",f=h.opacity(t.color)?t.color:h.defaultLine,p=h.combine(f,s),m=t.borderColor||h.contrast(p);if(void 0!==t.nameOverride&&(t.name=t.nameOverride),t.name){o=l.plainText(t.name||"");var y=Math.round(t.nameLength);y>-1&&o.length>y&&(o=y>3?o.substr(0,y-3)+"...":o.substr(0,y))}void 0!==t.zLabel?(void 0!==t.xLabel&&(c+="x: "+t.xLabel+"<br>"),void 0!==t.yLabel&&(c+="y: "+t.yLabel+"<br>"),c+=(c?"z: ":"")+t.zLabel):L&&t[i+"Label"]===M?c=t[("x"===i?"y":"x")+"Label"]||"":void 0===t.xLabel?void 0!==t.yLabel&&(c=t.yLabel):c=void 0===t.yLabel?t.xLabel:"("+t.xLabel+", "+t.yLabel+")",!t.text&&0!==t.text||Array.isArray(t.text)||(c+=(c?"<br>":"")+t.text),void 0!==t.extraText&&(c+=(c?"<br>":"")+t.extraText),""===c&&(""===o&&e.remove(),c=o);var x=e.select("text.nums").call(u.font,t.fontFamily||d,t.fontSize||g,t.fontColor||m).text(c).attr("data-notex",1).call(l.positionText,0,0).call(l.convertToTspans,r),b=e.select("text.name"),_=0;o&&o!==c?(b.call(u.font,t.fontFamily||d,t.fontSize||g,p).text(o).attr("data-notex",1).call(l.positionText,0,0).call(l.convertToTspans,r),_=b.node().getBoundingClientRect().width+2*k):(b.remove(),e.select("rect").remove()),e.select("path").style({fill:p,stroke:m});var A,T,z=x.node().getBoundingClientRect(),P=t.xa._offset+(t.x0+t.x1)/2,I=t.ya._offset+(t.y0+t.y1)/2,O=Math.abs(t.x1-t.x0),D=Math.abs(t.y1-t.y0),R=z.width+w+k+_;t.ty0=S-z.top,t.bx=z.width+2*k,t.by=z.height+2*k,t.anchor="start",t.txwidth=z.width,t.tx2width=_,t.offset=0,a?(t.pos=P,A=I+D/2+R<=C,T=I-D/2-R>=0,"top"!==t.idealAlign&&A||!T?A?(I+=D/2,t.anchor="start"):t.anchor="middle":(I-=D/2,t.anchor="end")):(t.pos=I,A=P+O/2+R<=E,T=P-O/2-R>=0,"left"!==t.idealAlign&&A||!T?A?(P+=O/2,t.anchor="start"):t.anchor="middle":(P-=O/2,t.anchor="end")),x.attr("text-anchor",t.anchor),_&&b.attr("text-anchor",t.anchor),e.attr("transform","translate("+P+","+I+")"+(a?"rotate("+v+")":""))}),R}function A(t,e){t.each(function(t){var r=n.select(this);if(t.del)r.remove();else{var i="end"===t.anchor?-1:1,a=r.select("text.nums"),o={start:1,end:-1,middle:0}[t.anchor],s=o*(w+k),c=s+o*(t.txwidth+k),h=0,f=t.offset;"middle"===t.anchor&&(s-=t.tx2width/2,c+=t.txwidth/2+k),e&&(f*=-_,h=t.offset*b),r.select("path").attr("d","middle"===t.anchor?"M-"+(t.bx/2+t.tx2width/2)+","+(f-t.by/2)+"h"+t.bx+"v"+t.by+"h-"+t.bx+"Z":"M0,0L"+(i*w+h)+","+(w+f)+"v"+(t.by/2-w)+"h"+i*t.bx+"v-"+t.by+"H"+(i*w+h)+"V"+(f-w)+"Z"),a.call(l.positionText,s+h,f+t.ty0-t.by/2+k),t.tx2width&&(r.select("text.name").call(l.positionText,c+o*k+h,f+t.ty0-t.by/2+k),r.select("rect").call(u.setRect,c+(o-1)*t.tx2width/2+h,f-t.by/2-1,t.tx2width,t.by+2))}})}function T(t,e){var r=t.index,n=t.trace||{},i=t.cd[0],a=t.cd[r]||{},s=Array.isArray(r)?function(t,e){return o.castOption(i,r,t)||o.extractOption({},n,"",e)}:function(t,e){return o.extractOption(a,n,t,e)};function l(e,r,n){var i=s(r,n);i&&(t[e]=i)}if(l("hoverinfo","hi","hoverinfo"),l("color","hbg","hoverlabel.bgcolor"),l("borderColor","hbc","hoverlabel.bordercolor"),l("fontFamily","htf","hoverlabel.font.family"),l("fontSize","hts","hoverlabel.font.size"),l("fontColor","htc","hoverlabel.font.color"),l("nameLength","hnl","hoverlabel.namelength"),t.posref="y"===e?t.xa._offset+(t.x0+t.x1)/2:t.ya._offset+(t.y0+t.y1)/2,t.x0=o.constrain(t.x0,0,t.xa._length),t.x1=o.constrain(t.x1,0,t.xa._length),t.y0=o.constrain(t.y0,0,t.ya._length),t.y1=o.constrain(t.y1,0,t.ya._length),void 0!==t.xLabelVal&&(t.xLabel="xLabel"in t?t.xLabel:p.hoverLabelText(t.xa,t.xLabelVal),t.xVal=t.xa.c2d(t.xLabelVal)),void 0!==t.yLabelVal&&(t.yLabel="yLabel"in t?t.yLabel:p.hoverLabelText(t.ya,t.yLabelVal),t.yVal=t.ya.c2d(t.yLabelVal)),void 0!==t.zLabelVal&&void 0===t.zLabel&&(t.zLabel=String(t.zLabelVal)),!(isNaN(t.xerr)||"log"===t.xa.type&&t.xerr<=0)){var c=p.tickText(t.xa,t.xa.c2l(t.xerr),"hover").text;void 0!==t.xerrneg?t.xLabel+=" +"+c+" / -"+p.tickText(t.xa,t.xa.c2l(t.xerrneg),"hover").text:t.xLabel+=" \xb1 "+c,"x"===e&&(t.distance+=1)}if(!(isNaN(t.yerr)||"log"===t.ya.type&&t.yerr<=0)){var u=p.tickText(t.ya,t.ya.c2l(t.yerr),"hover").text;void 0!==t.yerrneg?t.yLabel+=" +"+u+" / -"+p.tickText(t.ya,t.ya.c2l(t.yerrneg),"hover").text:t.yLabel+=" \xb1 "+u,"y"===e&&(t.distance+=1)}var h=t.hoverinfo||t.trace.hoverinfo;return"all"!==h&&(-1===(h=Array.isArray(h)?h:h.split("+")).indexOf("x")&&(t.xLabel=void 0),-1===h.indexOf("y")&&(t.yLabel=void 0),-1===h.indexOf("z")&&(t.zLabel=void 0),-1===h.indexOf("text")&&(t.text=void 0),-1===h.indexOf("name")&&(t.name=void 0)),t}function S(t,e){var r,n,i=e.container,o=e.fullLayout,s=e.event,l=!!t.hLinePoint,c=!!t.vLinePoint;if(i.selectAll(".spikeline").remove(),c||l){var f=h.combine(o.plot_bgcolor,o.paper_bgcolor);if(l){var p,d,g=t.hLinePoint;r=g&&g.xa,"cursor"===(n=g&&g.ya).spikesnap?(p=s.pointerX,d=s.pointerY):(p=r._offset+g.x,d=n._offset+g.y);var m,v,y=a.readability(g.color,f)<1.5?h.contrast(f):g.color,x=n.spikemode,b=n.spikethickness,_=n.spikecolor||y,w=n._boundingBox,k=(w.left+w.right)/2<p?w.right:w.left;-1===x.indexOf("toaxis")&&-1===x.indexOf("across")||(-1!==x.indexOf("toaxis")&&(m=k,v=p),-1!==x.indexOf("across")&&(m=n._counterSpan[0],v=n._counterSpan[1]),i.insert("line",":first-child").attr({x1:m,x2:v,y1:d,y2:d,"stroke-width":b,stroke:_,"stroke-dasharray":u.dashStyle(n.spikedash,b)}).classed("spikeline",!0).classed("crisp",!0),i.insert("line",":first-child").attr({x1:m,x2:v,y1:d,y2:d,"stroke-width":b+2,stroke:f}).classed("spikeline",!0).classed("crisp",!0)),-1!==x.indexOf("marker")&&i.insert("circle",":first-child").attr({cx:k+("right"!==n.side?b:-b),cy:d,r:b,fill:_}).classed("spikeline",!0)}if(c){var M,A,T=t.vLinePoint;r=T&&T.xa,n=T&&T.ya,"cursor"===r.spikesnap?(M=s.pointerX,A=s.pointerY):(M=r._offset+T.x,A=n._offset+T.y);var S,E,C=a.readability(T.color,f)<1.5?h.contrast(f):T.color,L=r.spikemode,z=r.spikethickness,P=r.spikecolor||C,I=r._boundingBox,O=(I.top+I.bottom)/2<A?I.bottom:I.top;-1===L.indexOf("toaxis")&&-1===L.indexOf("across")||(-1!==L.indexOf("toaxis")&&(S=O,E=A),-1!==L.indexOf("across")&&(S=r._counterSpan[0],E=r._counterSpan[1]),i.insert("line",":first-child").attr({x1:M,x2:M,y1:S,y2:E,"stroke-width":z,stroke:P,"stroke-dasharray":u.dashStyle(r.spikedash,z)}).classed("spikeline",!0).classed("crisp",!0),i.insert("line",":first-child").attr({x1:M,x2:M,y1:S,y2:E,"stroke-width":z+2,stroke:f}).classed("spikeline",!0).classed("crisp",!0)),-1!==L.indexOf("marker")&&i.insert("circle",":first-child").attr({cx:M,cy:O-("top"!==r.side?z:-z),r:z,fill:P}).classed("spikeline",!0)}}}function E(t,e){return!e||(e.vLinePoint!==t._spikepoints.vLinePoint||e.hLinePoint!==t._spikepoints.hLinePoint)}r.hover=function(t,e,r,a){t=o.getGraphDiv(t),o.throttle(t._fullLayout._uid+m.HOVERID,m.HOVERMINTIME,function(){!function(t,e,r,a){r||(r="xy");var l=Array.isArray(r)?r:[r],u=t._fullLayout,m=u._plots||[],v=m[r],y=u._has("cartesian");if(v){var b=v.overlays.map(function(t){return t.id});l=l.concat(b)}for(var _=l.length,w=new Array(_),k=new Array(_),C=!1,L=0;L<_;L++){var z=l[L],P=m[z];if(P)C=!0,w[L]=p.getFromId(t,P.xaxis._id),k[L]=p.getFromId(t,P.yaxis._id);else{var I=u[z]._subplot;w[L]=I.xaxis,k[L]=I.yaxis}}var O=e.hovermode||u.hovermode;O&&!C&&(O="closest");if(-1===["x","y","closest"].indexOf(O)||!t.calcdata||t.querySelector(".zoombox")||t._dragging)return f.unhoverRaw(t,e);var D,R,B,F,N,j,V,U,q,H,G,W,Y,X=-1===u.hoverdistance?1/0:u.hoverdistance,Z=-1===u.spikedistance?1/0:u.spikedistance,$=[],J=[],K={hLinePoint:null,vLinePoint:null};if(Array.isArray(e))for(O="array",B=0;B<e.length;B++)"skip"!==(N=t.calcdata[e[B].curveNumber||0])[0].trace.hoverinfo&&J.push(N);else{for(F=0;F<t.calcdata.length;F++)N=t.calcdata[F],"skip"!==(j=N[0].trace).hoverinfo&&g.isTraceInSubplots(j,l)&&J.push(N);var Q,tt,et=!e.target;if(et)Q="xpx"in e?e.xpx:w[0]._length/2,tt="ypx"in e?e.ypx:k[0]._length/2;else{if(!1===s.triggerHandler(t,"plotly_beforehover",e))return;var rt=e.target.getBoundingClientRect();if(Q=e.clientX-rt.left,tt=e.clientY-rt.top,Q<0||Q>w[0]._length||tt<0||tt>k[0]._length)return f.unhoverRaw(t,e)}if(e.pointerX=Q+w[0]._offset,e.pointerY=tt+k[0]._offset,D="xval"in e?g.flat(l,e.xval):g.p2c(w,Q),R="yval"in e?g.flat(l,e.yval):g.p2c(k,tt),!i(D[0])||!i(R[0]))return o.warn("Fx.hover failed",e,t),f.unhoverRaw(t,e)}var nt=1/0;for(F=0;F<J.length;F++)if((N=J[F])&&N[0]&&N[0].trace&&!0===N[0].trace.visible&&(j=N[0].trace,-1===["carpet","contourcarpet"].indexOf(j._module.name))){if("splom"===j.type?V=l[U=0]:(V=g.getSubplot(j),U=l.indexOf(V)),q=O,W={cd:N,trace:j,xa:w[U],ya:k[U],maxHoverDistance:X,maxSpikeDistance:Z,index:!1,distance:Math.min(nt,X),spikeDistance:1/0,xSpike:void 0,ySpike:void 0,color:h.defaultLine,name:j.name,x0:void 0,x1:void 0,y0:void 0,y1:void 0,xLabelVal:void 0,yLabelVal:void 0,zLabelVal:void 0,text:void 0},u[V]&&(W.subplot=u[V]._subplot),Y=$.length,"array"===q){var it=e[F];"pointNumber"in it?(W.index=it.pointNumber,q="closest"):(q="","xval"in it&&(H=it.xval,q="x"),"yval"in it&&(G=it.yval,q=q?"closest":"y"))}else H=D[U],G=R[U];if(0!==X)if(j._module&&j._module.hoverPoints){var at=j._module.hoverPoints(W,H,G,q,u._hoverlayer);if(at)for(var ot,st=0;st<at.length;st++)ot=at[st],i(ot.x0)&&i(ot.y0)&&$.push(T(ot,O))}else o.log("Unrecognized trace type in hover:",j);if("closest"===O&&$.length>Y&&($.splice(0,Y),nt=$[0].distance),y&&0!==Z&&0===$.length){W.distance=Z,W.index=!1;var lt=j._module.hoverPoints(W,H,G,"closest",u._hoverlayer);if(lt&&(lt=lt.filter(function(t){return t.spikeDistance<=Z})),lt&&lt.length){var ct,ut=lt.filter(function(t){return t.xa.showspikes});if(ut.length){var ht=ut[0];i(ht.x0)&&i(ht.y0)&&(ct=gt(ht),(!K.vLinePoint||K.vLinePoint.spikeDistance>ct.spikeDistance)&&(K.vLinePoint=ct))}var ft=lt.filter(function(t){return t.ya.showspikes});if(ft.length){var pt=ft[0];i(pt.x0)&&i(pt.y0)&&(ct=gt(pt),(!K.hLinePoint||K.hLinePoint.spikeDistance>ct.spikeDistance)&&(K.hLinePoint=ct))}}}}function dt(t,e){for(var r,n=null,i=1/0,a=0;a<t.length;a++)(r=t[a].spikeDistance)<i&&r<=e&&(n=t[a],i=r);return n}function gt(t){return t?{xa:t.xa,ya:t.ya,x:void 0!==t.xSpike?t.xSpike:(t.x0+t.x1)/2,y:void 0!==t.ySpike?t.ySpike:(t.y0+t.y1)/2,distance:t.distance,spikeDistance:t.spikeDistance,curveNumber:t.trace.index,color:t.color,pointNumber:t.index}:null}var mt={fullLayout:u,container:u._hoverlayer,outerContainer:u._paperdiv,event:e},vt=t._spikepoints,yt={vLinePoint:K.vLinePoint,hLinePoint:K.hLinePoint};if(t._spikepoints=yt,y&&0!==Z&&0!==$.length){var xt=$.filter(function(t){return t.ya.showspikes}),bt=dt(xt,Z);K.hLinePoint=gt(bt);var _t=$.filter(function(t){return t.xa.showspikes}),wt=dt(_t,Z);K.vLinePoint=gt(wt)}if(0===$.length){var kt=f.unhoverRaw(t,e);return!y||null===K.hLinePoint&&null===K.vLinePoint||E(vt)&&S(K,mt),kt}y&&E(vt)&&S(K,mt);$.sort(function(t,e){return t.distance-e.distance});var Mt=t._hoverdata,At=[];for(B=0;B<$.length;B++){var Tt=$[B];At.push(g.makeEventData(Tt,Tt.trace,Tt.cd))}t._hoverdata=At;var St="y"===O&&J.length>1,Et=h.combine(u.plot_bgcolor||h.background,u.paper_bgcolor),Ct={hovermode:O,rotateLabels:St,bgColor:Et,container:u._hoverlayer,outerContainer:u._paperdiv,commonLabelOpts:u.hoverlabel,hoverdistance:u.hoverdistance},Lt=M($,Ct,t);if(function(t,e,r){var n,i,a,o,s,l,c,u=0,h=t.map(function(t,n){var i=t[e];return[{i:n,dp:0,pos:t.pos,posref:t.posref,size:t.by*("x"===i._id.charAt(0)?x:1)/2,pmin:0,pmax:"x"===i._id.charAt(0)?r.width:r.height}]}).sort(function(t,e){return t[0].posref-e[0].posref});function f(t){var e=t[0],r=t[t.length-1];if(i=e.pmin-e.pos-e.dp+e.size,a=r.pos+r.dp+r.size-e.pmax,i>.01){for(s=t.length-1;s>=0;s--)t[s].dp+=i;n=!1}if(!(a<.01)){if(i<-.01){for(s=t.length-1;s>=0;s--)t[s].dp-=a;n=!1}if(n){var c=0;for(o=0;o<t.length;o++)(l=t[o]).pos+l.dp+l.size>e.pmax&&c++;for(o=t.length-1;o>=0&&!(c<=0);o--)(l=t[o]).pos>e.pmax-1&&(l.del=!0,c--);for(o=0;o<t.length&&!(c<=0);o++)if((l=t[o]).pos<e.pmin+1)for(l.del=!0,c--,a=2*l.size,s=t.length-1;s>=0;s--)t[s].dp-=a;for(o=t.length-1;o>=0&&!(c<=0);o--)(l=t[o]).pos+l.dp+l.size>e.pmax&&(l.del=!0,c--)}}}for(;!n&&u<=t.length;){for(u++,n=!0,o=0;o<h.length-1;){var p=h[o],d=h[o+1],g=p[p.length-1],m=d[0];if((i=g.pos+g.dp+g.size-m.pos-m.dp+m.size)>.01&&g.pmin===m.pmin&&g.pmax===m.pmax){for(s=d.length-1;s>=0;s--)d[s].dp+=i;for(p.push.apply(p,d),h.splice(o+1,1),c=0,s=p.length-1;s>=0;s--)c+=p[s].dp;for(a=c/p.length,s=p.length-1;s>=0;s--)p[s].dp-=a;n=!1}else o++}h.forEach(f)}for(o=h.length-1;o>=0;o--){var v=h[o];for(s=v.length-1;s>=0;s--){var y=v[s],b=t[y.i];b.offset=y.dp,b.del=y.del}}}($,St?"xa":"ya",u),A(Lt,St),e.target&&e.target.tagName){var zt=d.getComponentMethod("annotations","hasClickToShow")(t,At);c(n.select(e.target),zt?"pointer":"")}if(!e.target||a||!function(t,e,r){if(!r||r.length!==t._hoverdata.length)return!0;for(var n=r.length-1;n>=0;n--){var i=r[n],a=t._hoverdata[n];if(i.curveNumber!==a.curveNumber||String(i.pointNumber)!==String(a.pointNumber))return!0}return!1}(t,0,Mt))return;Mt&&t.emit("plotly_unhover",{event:e,points:Mt});t.emit("plotly_hover",{event:e,points:t._hoverdata,xaxes:w,yaxes:k,xvals:D,yvals:R})}(t,e,r,a)})},r.loneHover=function(t,e){var r={color:t.color||h.defaultLine,x0:t.x0||t.x||0,x1:t.x1||t.x||0,y0:t.y0||t.y||0,y1:t.y1||t.y||0,xLabel:t.xLabel,yLabel:t.yLabel,zLabel:t.zLabel,text:t.text,name:t.name,idealAlign:t.idealAlign,borderColor:t.borderColor,fontFamily:t.fontFamily,fontSize:t.fontSize,fontColor:t.fontColor,trace:{index:0,hoverinfo:""},xa:{_offset:0},ya:{_offset:0},index:0},i=n.select(e.container),a=e.outerContainer?n.select(e.outerContainer):i,o={hovermode:"closest",rotateLabels:!1,bgColor:e.bgColor||h.background,container:i,outerContainer:a},s=M([r],o,e.gd);return A(s,o.rotateLabels),s.node()}},{"../../lib":684,"../../lib/events":672,"../../lib/override_cursor":695,"../../lib/svg_text_utils":708,"../../plots/cartesian/axes":732,"../../registry":817,"../color":558,"../dragelement":580,"../drawing":583,"./constants":595,"./helpers":597,d3:147,"fast-isnumeric":214,tinycolor2:499}],599:[function(t,e,r){"use strict";var n=t("../../lib");e.exports=function(t,e,r,i){r("hoverlabel.bgcolor",(i=i||{}).bgcolor),r("hoverlabel.bordercolor",i.bordercolor),r("hoverlabel.namelength",i.namelength),n.coerceFont(r,"hoverlabel.font",i.font)}},{"../../lib":684}],600:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../lib"),a=t("../dragelement"),o=t("./helpers"),s=t("./layout_attributes");e.exports={moduleType:"component",name:"fx",constants:t("./constants"),schema:{layout:s},attributes:t("./attributes"),layoutAttributes:s,supplyLayoutGlobalDefaults:t("./layout_global_defaults"),supplyDefaults:t("./defaults"),supplyLayoutDefaults:t("./layout_defaults"),calc:t("./calc"),getDistanceFunction:o.getDistanceFunction,getClosest:o.getClosest,inbox:o.inbox,quadrature:o.quadrature,appendArrayPointValue:o.appendArrayPointValue,castHoverOption:function(t,e,r){return i.castOption(t,e,"hoverlabel."+r)},castHoverinfo:function(t,e,r){return i.castOption(t,r,"hoverinfo",function(r){return i.coerceHoverinfo({hoverinfo:r},{_module:t._module},e)})},hover:t("./hover").hover,unhover:a.unhover,loneHover:t("./hover").loneHover,loneUnhover:function(t){var e=i.isD3Selection(t)?t:n.select(t);e.selectAll("g.hovertext").remove(),e.selectAll(".spikeline").remove()},click:t("./click")}},{"../../lib":684,"../dragelement":580,"./attributes":592,"./calc":593,"./click":594,"./constants":595,"./defaults":596,"./helpers":597,"./hover":598,"./layout_attributes":601,"./layout_defaults":602,"./layout_global_defaults":603,d3:147}],601:[function(t,e,r){"use strict";var n=t("./constants"),i=t("../../plots/font_attributes")({editType:"none"});i.family.dflt=n.HOVERFONT,i.size.dflt=n.HOVERFONTSIZE,e.exports={dragmode:{valType:"enumerated",values:["zoom","pan","select","lasso","orbit","turntable"],dflt:"zoom",editType:"modebar"},hovermode:{valType:"enumerated",values:["x","y","closest",!1],editType:"modebar"},hoverdistance:{valType:"integer",min:-1,dflt:20,editType:"none"},spikedistance:{valType:"integer",min:-1,dflt:20,editType:"none"},hoverlabel:{bgcolor:{valType:"color",editType:"none"},bordercolor:{valType:"color",editType:"none"},font:i,namelength:{valType:"integer",min:-1,dflt:15,editType:"none"},editType:"none"},selectdirection:{valType:"enumerated",values:["h","v","d","any"],dflt:"any",editType:"none"}}},{"../../plots/font_attributes":758,"./constants":595}],602:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./layout_attributes");e.exports=function(t,e,r){function a(r,a){return n.coerce(t,e,i,r,a)}var o;"select"===a("dragmode")&&a("selectdirection"),e._has("cartesian")?(e._isHoriz=function(t){for(var e=!0,r=0;r<t.length;r++){var n=t[r];if("h"!==n.orientation){e=!1;break}}return e}(r),o=e._isHoriz?"y":"x"):o="closest",a("hovermode",o)&&(a("hoverdistance"),a("spikedistance"));var s=e._has("mapbox"),l=e._has("geo"),c=e._basePlotModules.length;"zoom"===e.dragmode&&((s||l)&&1===c||s&&l&&2===c)&&(e.dragmode="pan")}},{"../../lib":684,"./layout_attributes":601}],603:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./hoverlabel_defaults"),a=t("./layout_attributes");e.exports=function(t,e){i(t,e,function(r,i){return n.coerce(t,e,a,r,i)})}},{"../../lib":684,"./hoverlabel_defaults":599,"./layout_attributes":601}],604:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../lib/regex").counter,a=t("../../plots/domain").attributes,o=t("../../plots/cartesian/constants").idRegex,s=t("../../plot_api/plot_template"),l={rows:{valType:"integer",min:1,editType:"plot"},roworder:{valType:"enumerated",values:["top to bottom","bottom to top"],dflt:"top to bottom",editType:"plot"},columns:{valType:"integer",min:1,editType:"plot"},subplots:{valType:"info_array",freeLength:!0,dimensions:2,items:{valType:"enumerated",values:[i("xy").toString(),""],editType:"plot"},editType:"plot"},xaxes:{valType:"info_array",freeLength:!0,items:{valType:"enumerated",values:[o.x.toString(),""],editType:"plot"},editType:"plot"},yaxes:{valType:"info_array",freeLength:!0,items:{valType:"enumerated",values:[o.y.toString(),""],editType:"plot"},editType:"plot"},pattern:{valType:"enumerated",values:["independent","coupled"],dflt:"coupled",editType:"plot"},xgap:{valType:"number",min:0,max:1,editType:"plot"},ygap:{valType:"number",min:0,max:1,editType:"plot"},domain:a({name:"grid",editType:"plot",noGridCell:!0},{}),xside:{valType:"enumerated",values:["bottom","bottom plot","top plot","top"],dflt:"bottom plot",editType:"plot"},yside:{valType:"enumerated",values:["left","left plot","right plot","right"],dflt:"left plot",editType:"plot"},editType:"plot"};function c(t,e,r){var n=e[r+"axes"],i=Object.keys((t._splomAxes||{})[r]||{});return Array.isArray(n)?n:i.length?i:void 0}function u(t,e,r,n,i,a){var o=e(t+"gap",r),s=e("domain."+t);e(t+"side",n);for(var l=new Array(i),c=s[0],u=(s[1]-c)/(i-o),h=u*(1-o),f=0;f<i;f++){var p=c+u*f;l[a?i-1-f:f]=[p,p+h]}return l}function h(t,e,r,n,i){var a,o=new Array(r);function s(t,r){-1!==e.indexOf(r)&&void 0===n[r]?(o[t]=r,n[r]=t):o[t]=""}if(Array.isArray(t))for(a=0;a<r;a++)s(a,t[a]);else for(s(0,i),a=1;a<r;a++)s(a,i+(a+1));return o}e.exports={moduleType:"component",name:"grid",schema:{layout:{grid:l}},layoutAttributes:l,sizeDefaults:function(t,e){var r=t.grid||{},i=c(e,r,"x"),a=c(e,r,"y");if(t.grid||i||a){var o,h,f=Array.isArray(r.subplots)&&Array.isArray(r.subplots[0]),p=Array.isArray(i),d=Array.isArray(a),g=p&&i!==r.xaxes&&d&&a!==r.yaxes;f?(o=r.subplots.length,h=r.subplots[0].length):(d&&(o=a.length),p&&(h=i.length));var m=s.newContainer(e,"grid"),v=M("rows",o),y=M("columns",h);if(v*y>1){f||p||d||"independent"===M("pattern")&&(f=!0),m._hasSubplotGrid=f;var x,b,_="top to bottom"===M("roworder"),w=f?.2:.1,k=f?.3:.1;g&&e._splomGridDflt&&(x=e._splomGridDflt.xside,b=e._splomGridDflt.yside),m._domains={x:u("x",M,w,x,y),y:u("y",M,k,b,v,_)}}else delete e.grid}function M(t,e){return n.coerce(r,m,l,t,e)}},contentDefaults:function(t,e){var r=e.grid;if(r&&r._domains){var n,i,a,o,s,l,u,f=t.grid||{},p=e._subplots,d=r._hasSubplotGrid,g=r.rows,m=r.columns,v="independent"===r.pattern,y=r._axisMap={};if(d){var x=f.subplots||[];l=r.subplots=new Array(g);var b=1;for(n=0;n<g;n++){var _=l[n]=new Array(m),w=x[n]||[];for(i=0;i<m;i++)if(v?(s=1===b?"xy":"x"+b+"y"+b,b++):s=w[i],_[i]="",-1!==p.cartesian.indexOf(s)){if(u=s.indexOf("y"),a=s.slice(0,u),o=s.slice(u),void 0!==y[a]&&y[a]!==i||void 0!==y[o]&&y[o]!==n)continue;_[i]=s,y[a]=i,y[o]=n}}}else{var k=c(e,f,"x"),M=c(e,f,"y");r.xaxes=h(k,p.xaxis,m,y,"x"),r.yaxes=h(M,p.yaxis,g,y,"y")}var A=r._anchors={},T="top to bottom"===r.roworder;for(var S in y){var E,C,L,z=S.charAt(0),P=r[z+"side"];if(P.length<8)A[S]="free";else if("x"===z){if("t"===P.charAt(0)===T?(E=0,C=1,L=g):(E=g-1,C=-1,L=-1),d){var I=y[S];for(n=E;n!==L;n+=C)if((s=l[n][I])&&(u=s.indexOf("y"),s.slice(0,u)===S)){A[S]=s.slice(u);break}}else for(n=E;n!==L;n+=C)if(o=r.yaxes[n],-1!==p.cartesian.indexOf(S+o)){A[S]=o;break}}else if("l"===P.charAt(0)?(E=0,C=1,L=m):(E=m-1,C=-1,L=-1),d){var O=y[S];for(n=E;n!==L;n+=C)if((s=l[O][n])&&(u=s.indexOf("y"),s.slice(u)===S)){A[S]=s.slice(0,u);break}}else for(n=E;n!==L;n+=C)if(a=r.xaxes[n],-1!==p.cartesian.indexOf(a+S)){A[S]=a;break}}}}}},{"../../lib":684,"../../lib/regex":700,"../../plot_api/plot_template":722,"../../plots/cartesian/constants":737,"../../plots/domain":757}],605:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/constants"),i=t("../../plot_api/plot_template").templatedArray;e.exports=i("image",{visible:{valType:"boolean",dflt:!0,editType:"arraydraw"},source:{valType:"string",editType:"arraydraw"},layer:{valType:"enumerated",values:["below","above"],dflt:"above",editType:"arraydraw"},sizex:{valType:"number",dflt:0,editType:"arraydraw"},sizey:{valType:"number",dflt:0,editType:"arraydraw"},sizing:{valType:"enumerated",values:["fill","contain","stretch"],dflt:"contain",editType:"arraydraw"},opacity:{valType:"number",min:0,max:1,dflt:1,editType:"arraydraw"},x:{valType:"any",dflt:0,editType:"arraydraw"},y:{valType:"any",dflt:0,editType:"arraydraw"},xanchor:{valType:"enumerated",values:["left","center","right"],dflt:"left",editType:"arraydraw"},yanchor:{valType:"enumerated",values:["top","middle","bottom"],dflt:"top",editType:"arraydraw"},xref:{valType:"enumerated",values:["paper",n.idRegex.x.toString()],dflt:"paper",editType:"arraydraw"},yref:{valType:"enumerated",values:["paper",n.idRegex.y.toString()],dflt:"paper",editType:"arraydraw"},editType:"arraydraw"})},{"../../plot_api/plot_template":722,"../../plots/cartesian/constants":737}],606:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib/to_log_range");e.exports=function(t,e,r,a){e=e||{};var o="log"===r&&"linear"===e.type,s="linear"===r&&"log"===e.type;if(o||s)for(var l,c,u=t._fullLayout.images,h=e._id.charAt(0),f=0;f<u.length;f++)if(c="images["+f+"].",(l=u[f])[h+"ref"]===e._id){var p=l[h],d=l["size"+h],g=null,m=null;if(o){g=i(p,e.range);var v=d/Math.pow(10,g)/2;m=2*Math.log(v+Math.sqrt(1+v*v))/Math.LN10}else m=(g=Math.pow(10,p))*(Math.pow(10,d/2)-Math.pow(10,-d/2));n(g)?n(m)||(m=null):(g=null,m=null),a(c+h,g),a(c+"size"+h,m)}}},{"../../lib/to_log_range":710,"fast-isnumeric":214}],607:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes"),a=t("../../plots/array_container_defaults"),o=t("./attributes");function s(t,e,r){function a(r,i){return n.coerce(t,e,o,r,i)}var s=a("source");if(!a("visible",!!s))return e;a("layer"),a("xanchor"),a("yanchor"),a("sizex"),a("sizey"),a("sizing"),a("opacity");for(var l={_fullLayout:r},c=["x","y"],u=0;u<2;u++){var h=c[u],f=i.coerceRef(t,e,l,h,"paper");i.coercePosition(e,l,a,f,h,0)}return e}e.exports=function(t,e){a(t,e,{name:"images",handleItemDefaults:s})}},{"../../lib":684,"../../plots/array_container_defaults":728,"../../plots/cartesian/axes":732,"./attributes":605}],608:[function(t,e,r){"use strict";var n=t("d3"),i=t("../drawing"),a=t("../../plots/cartesian/axes"),o=t("../../constants/xmlns_namespaces");e.exports=function(t){var e,r,s=t._fullLayout,l=[],c={},u=[];for(r=0;r<s.images.length;r++){var h=s.images[r];if(h.visible)if("below"===h.layer&&"paper"!==h.xref&&"paper"!==h.yref){e=h.xref+h.yref;var f=s._plots[e];if(!f){u.push(h);continue}f.mainplot&&(e=f.mainplot.id),c[e]||(c[e]=[]),c[e].push(h)}else"above"===h.layer?l.push(h):u.push(h)}var p={x:{left:{sizing:"xMin",offset:0},center:{sizing:"xMid",offset:-.5},right:{sizing:"xMax",offset:-1}},y:{top:{sizing:"YMin",offset:0},middle:{sizing:"YMid",offset:-.5},bottom:{sizing:"YMax",offset:-1}}};function d(e){var r=n.select(this);if(!this.img||this.img.src!==e.source){r.attr("xmlns",o.svg);var i=new Promise(function(t){var n=new Image;function i(){r.remove(),t()}this.img=n,n.setAttribute("crossOrigin","anonymous"),n.onerror=i,n.onload=function(){var e=document.createElement("canvas");e.width=this.width,e.height=this.height,e.getContext("2d").drawImage(this,0,0);var n=e.toDataURL("image/png");r.attr("xlink:href",n),t()},r.on("error",i),n.src=e.source}.bind(this));t._promises.push(i)}}function g(e){var r=n.select(this),o=a.getFromId(t,e.xref),l=a.getFromId(t,e.yref),c=s._size,u=o?Math.abs(o.l2p(e.sizex)-o.l2p(0)):e.sizex*c.w,h=l?Math.abs(l.l2p(e.sizey)-l.l2p(0)):e.sizey*c.h,f=u*p.x[e.xanchor].offset,d=h*p.y[e.yanchor].offset,g=p.x[e.xanchor].sizing+p.y[e.yanchor].sizing,m=(o?o.r2p(e.x)+o._offset:e.x*c.w+c.l)+f,v=(l?l.r2p(e.y)+l._offset:c.h-e.y*c.h+c.t)+d;switch(e.sizing){case"fill":g+=" slice";break;case"stretch":g="none"}r.attr({x:m,y:v,width:u,height:h,preserveAspectRatio:g,opacity:e.opacity});var y=(o?o._id:"")+(l?l._id:"");r.call(i.setClipUrl,y?"clip"+s._uid+y:null)}var m=s._imageLowerLayer.selectAll("image").data(u),v=s._imageUpperLayer.selectAll("image").data(l);m.enter().append("image"),v.enter().append("image"),m.exit().remove(),v.exit().remove(),m.each(function(t){d.bind(this)(t),g.bind(this)(t)}),v.each(function(t){d.bind(this)(t),g.bind(this)(t)});var y=Object.keys(s._plots);for(r=0;r<y.length;r++){e=y[r];var x=s._plots[e];if(x.imagelayer){var b=x.imagelayer.selectAll("image").data(c[e]||[]);b.enter().append("image"),b.exit().remove(),b.each(function(t){d.bind(this)(t),g.bind(this)(t)})}}}},{"../../constants/xmlns_namespaces":663,"../../plots/cartesian/axes":732,"../drawing":583,d3:147}],609:[function(t,e,r){"use strict";e.exports={moduleType:"component",name:"images",layoutAttributes:t("./attributes"),supplyLayoutDefaults:t("./defaults"),includeBasePlot:t("../../plots/cartesian/include_components")("images"),draw:t("./draw"),convertCoords:t("./convert_coords")}},{"../../plots/cartesian/include_components":742,"./attributes":605,"./convert_coords":606,"./defaults":607,"./draw":608}],610:[function(t,e,r){"use strict";r.isRightAnchor=function(t){return"right"===t.xanchor||"auto"===t.xanchor&&t.x>=2/3},r.isCenterAnchor=function(t){return"center"===t.xanchor||"auto"===t.xanchor&&t.x>1/3&&t.x<2/3},r.isBottomAnchor=function(t){return"bottom"===t.yanchor||"auto"===t.yanchor&&t.y<=1/3},r.isMiddleAnchor=function(t){return"middle"===t.yanchor||"auto"===t.yanchor&&t.y>1/3&&t.y<2/3}},{}],611:[function(t,e,r){"use strict";var n=t("../../plots/font_attributes"),i=t("../color/attributes");e.exports={bgcolor:{valType:"color",editType:"legend"},bordercolor:{valType:"color",dflt:i.defaultLine,editType:"legend"},borderwidth:{valType:"number",min:0,dflt:0,editType:"legend"},font:n({editType:"legend"}),orientation:{valType:"enumerated",values:["v","h"],dflt:"v",editType:"legend"},traceorder:{valType:"flaglist",flags:["reversed","grouped"],extras:["normal"],editType:"legend"},tracegroupgap:{valType:"number",min:0,dflt:10,editType:"legend"},x:{valType:"number",min:-2,max:3,dflt:1.02,editType:"legend"},xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"left",editType:"legend"},y:{valType:"number",min:-2,max:3,dflt:1,editType:"legend"},yanchor:{valType:"enumerated",values:["auto","top","middle","bottom"],dflt:"auto",editType:"legend"},editType:"legend"}},{"../../plots/font_attributes":758,"../color/attributes":557}],612:[function(t,e,r){"use strict";e.exports={scrollBarWidth:6,scrollBarMinHeight:20,scrollBarColor:"#808BA4",scrollBarMargin:4}},{}],613:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib"),a=t("../../plot_api/plot_template"),o=t("./attributes"),s=t("../../plots/layout_attributes"),l=t("./helpers");e.exports=function(t,e,r){for(var c,u,h,f,p=t.legend||{},d=0,g="normal",m=0;m<r.length;m++){var v=r[m];l.legendGetsTrace(v)&&(d++,n.traceIs(v,"pie")&&d++),(n.traceIs(v,"bar")&&"stack"===e.barmode||-1!==["tonextx","tonexty"].indexOf(v.fill))&&(g=l.isGrouped({traceorder:g})?"grouped+reversed":"reversed"),void 0!==v.legendgroup&&""!==v.legendgroup&&(g=l.isReversed({traceorder:g})?"reversed+grouped":"grouped")}if(!1!==i.coerce(t,e,s,"showlegend",d>1)){var y=a.newContainer(e,"legend");if(b("bgcolor",e.paper_bgcolor),b("bordercolor"),b("borderwidth"),i.coerceFont(b,"font",e.font),b("orientation"),"h"===y.orientation){var x=t.xaxis;x&&x.rangeslider&&x.rangeslider.visible?(c=0,h="left",u=1.1,f="bottom"):(c=0,h="left",u=-.1,f="top")}b("traceorder",g),l.isGrouped(e.legend)&&b("tracegroupgap"),b("x",c),b("xanchor",h),b("y",u),b("yanchor",f),i.noneOrAll(p,y,["x","y"])}function b(t,e){return i.coerce(p,y,o,t,e)}}},{"../../lib":684,"../../plot_api/plot_template":722,"../../plots/layout_attributes":786,"../../registry":817,"./attributes":611,"./helpers":617}],614:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../lib"),a=t("../../plots/plots"),o=t("../../registry"),s=t("../../lib/events"),l=t("../dragelement"),c=t("../drawing"),u=t("../color"),h=t("../../lib/svg_text_utils"),f=t("./handle_click"),p=t("./constants"),d=t("../../constants/interactions"),g=t("../../constants/alignment"),m=g.LINE_SPACING,v=g.FROM_TL,y=g.FROM_BR,x=t("./get_legend_data"),b=t("./style"),_=t("./helpers"),w=t("./anchor_utils"),k=d.DBLCLICKDELAY;function M(t,e,r,n,i){var a=r.data()[0][0].trace,o={event:i,node:r.node(),curveNumber:a.index,expandedIndex:a._expandedIndex,data:t.data,layout:t.layout,frames:t._transitionData._frames,config:t._context,fullData:t._fullData,fullLayout:t._fullLayout};if(a._group&&(o.group=a._group),"pie"===a.type&&(o.label=r.datum()[0].label),!1!==s.triggerHandler(t,"plotly_legendclick",o))if(1===n)e._clickTimeout=setTimeout(function(){f(r,t,n)},k);else if(2===n){e._clickTimeout&&clearTimeout(e._clickTimeout),t._legendMouseDownTime=0,!1!==s.triggerHandler(t,"plotly_legenddoubleclick",o)&&f(r,t,n)}}function A(t,e,r){var n=t.data()[0][0],a=e._fullLayout,s=n.trace,l=o.traceIs(s,"pie"),u=s.index,f=l?n.label:s.name,p=e._context.edits.legendText&&!l,d=i.ensureSingle(t,"text","legendtext");function g(r){h.convertToTspans(r,e,function(){!function(t,e){var r=t.data()[0][0];if(!r.trace.showlegend)return void t.remove();var n,i,a=t.select("g[class*=math-group]"),o=a.node(),s=e._fullLayout.legend.font.size*m;if(o){var l=c.bBox(o);n=l.height,i=l.width,c.setTranslate(a,0,n/4)}else{var u=t.select(".legendtext"),f=h.lineCount(u),p=u.node();n=s*f,i=p?c.bBox(p).width:0;var d=s*(.3+(1-f)/2);h.positionText(u,40,d)}n=Math.max(n,16)+3,r.height=n,r.width=i}(t,e)})}d.attr("text-anchor","start").classed("user-select-none",!0).call(c.font,a.legend.font).text(p?T(f,r):f),p?d.call(h.makeEditable,{gd:e,text:f}).call(g).on("edit",function(t){this.text(T(t,r)).call(g);var a=n.trace._fullInput||{},s={};if(o.hasTransform(a,"groupby")){var l=o.getTransformIndices(a,"groupby"),c=l[l.length-1],h=i.keyedContainer(a,"transforms["+c+"].styles","target","value.name");h.set(n.trace._group,t),s=h.constructUpdate()}else s.name=t;return o.call("restyle",e,s,u)}):g(d)}function T(t,e){var r=Math.max(4,e);if(t&&t.trim().length>=r/2)return t;for(var n=r-(t=t||"").length;n>0;n--)t+=" ";return t}function S(t,e){var r,a=1,o=i.ensureSingle(t,"rect","legendtoggle",function(t){t.style("cursor","pointer").attr("pointer-events","all").call(u.fill,"rgba(0,0,0,0)")});o.on("mousedown",function(){(r=(new Date).getTime())-e._legendMouseDownTime<k?a+=1:(a=1,e._legendMouseDownTime=r)}),o.on("mouseup",function(){if(!e._dragged&&!e._editing){var r=e._fullLayout.legend;(new Date).getTime()-e._legendMouseDownTime>k&&(a=Math.max(a-1,1)),M(e,r,t,a,n.event)}})}function E(t,e,r){var i=t._fullLayout,a=i.legend,o=a.borderwidth,s=_.isGrouped(a),l=0;if(a._width=0,a._height=0,_.isVertical(a))s&&e.each(function(t,e){c.setTranslate(this,0,e*a.tracegroupgap)}),r.each(function(t){var e=t[0],r=e.height,n=e.width;c.setTranslate(this,o,5+o+a._height+r/2),a._height+=r,a._width=Math.max(a._width,n)}),a._width+=45+2*o,a._height+=10+2*o,s&&(a._height+=(a._lgroupsLength-1)*a.tracegroupgap),l=40;else if(s){for(var u=[a._width],h=e.data(),f=0,p=h.length;f<p;f++){var d=h[f].map(function(t){return t[0].width}),g=40+Math.max.apply(null,d);a._width+=a.tracegroupgap+g,u.push(a._width)}e.each(function(t,e){c.setTranslate(this,u[e],0)}),e.each(function(){var t=n.select(this).selectAll("g.traces"),e=0;t.each(function(t){var r=t[0].height;c.setTranslate(this,0,5+o+e+r/2),e+=r}),a._height=Math.max(a._height,e)}),a._height+=10+2*o,a._width+=2*o}else{var m,v=0,y=0,x=0,b=0,w=0,k=a.tracegroupgap||5;r.each(function(t){x=Math.max(40+t[0].width,x),w+=40+t[0].width+k}),m=i.width-(i.margin.r+i.margin.l)>o+w-k,r.each(function(t){var e=t[0],r=m?40+t[0].width:x;o+b+k+r>i.width-(i.margin.r+i.margin.l)&&(b=0,v+=y,a._height=a._height+y,y=0),c.setTranslate(this,o+b,5+o+e.height/2+v),a._width+=k+r,a._height=Math.max(a._height,e.height),b+=k+r,y=Math.max(e.height,y)}),a._width+=2*o,a._height+=10+2*o}a._width=Math.ceil(a._width),a._height=Math.ceil(a._height);var M=t._context.edits.legendText||t._context.edits.legendPosition;r.each(function(t){var e=t[0],r=n.select(this).select(".legendtoggle");c.setRect(r,0,-e.height/2,(M?0:a._width)+l,e.height)})}function C(t){var e=t._fullLayout.legend,r="left";w.isRightAnchor(e)?r="right":w.isCenterAnchor(e)&&(r="center");var n="top";w.isBottomAnchor(e)?n="bottom":w.isMiddleAnchor(e)&&(n="middle"),a.autoMargin(t,"legend",{x:e.x,y:e.y,l:e._width*v[r],r:e._width*y[r],b:e._height*y[n],t:e._height*v[n]})}e.exports=function(t){var e=t._fullLayout,r="legend"+e._uid;if(e._infolayer&&t.calcdata){t._legendMouseDownTime||(t._legendMouseDownTime=0);var s=e.legend,h=e.showlegend&&x(t.calcdata,s),f=e.hiddenlabels||[];if(!e.showlegend||!h.length)return e._infolayer.selectAll(".legend").remove(),e._topdefs.select("#"+r).remove(),void a.autoMargin(t,"legend");for(var d=0,g=0;g<h.length;g++)for(var m=0;m<h[g].length;m++){var _=h[g][m][0],k=_.trace,T=o.traceIs(k,"pie")?_.label:k.name;d=Math.max(d,T&&T.length||0)}var L=!1,z=i.ensureSingle(e._infolayer,"g","legend",function(t){t.attr("pointer-events","all"),L=!0}),P=i.ensureSingleById(e._topdefs,"clipPath",r,function(t){t.append("rect")}),I=i.ensureSingle(z,"rect","bg",function(t){t.attr("shape-rendering","crispEdges")});I.call(u.stroke,s.bordercolor).call(u.fill,s.bgcolor).style("stroke-width",s.borderwidth+"px");var O=i.ensureSingle(z,"g","scrollbox"),D=i.ensureSingle(z,"rect","scrollbar",function(t){t.attr({rx:20,ry:3,width:0,height:0}).call(u.fill,"#808BA4")}),R=O.selectAll("g.groups").data(h);R.enter().append("g").attr("class","groups"),R.exit().remove();var B=R.selectAll("g.traces").data(i.identity);B.enter().append("g").attr("class","traces"),B.exit().remove(),B.call(b,t).style("opacity",function(t){var e=t[0].trace;return o.traceIs(e,"pie")?-1!==f.indexOf(t[0].label)?.5:1:"legendonly"===e.visible?.5:1}).each(function(){n.select(this).call(A,t,d).call(S,t)}),L&&(E(t,R,B),C(t));var F=e.width,N=e.height;E(t,R,B),s._height>N?function(t){var e=t._fullLayout.legend,r="left";w.isRightAnchor(e)?r="right":w.isCenterAnchor(e)&&(r="center");a.autoMargin(t,"legend",{x:e.x,y:.5,l:e._width*v[r],r:e._width*y[r],b:0,t:0})}(t):C(t);var j=e._size,V=j.l+j.w*s.x,U=j.t+j.h*(1-s.y);w.isRightAnchor(s)?V-=s._width:w.isCenterAnchor(s)&&(V-=s._width/2),w.isBottomAnchor(s)?U-=s._height:w.isMiddleAnchor(s)&&(U-=s._height/2);var q=s._width,H=j.w;q>H?(V=j.l,q=H):(V+q>F&&(V=F-q),V<0&&(V=0),q=Math.min(F-V,s._width));var G,W,Y,X,Z=s._height,$=j.h;if(Z>$?(U=j.t,Z=$):(U+Z>N&&(U=N-Z),U<0&&(U=0),Z=Math.min(N-U,s._height)),c.setTranslate(z,V,U),D.on(".drag",null),z.on("wheel",null),s._height<=Z||t._context.staticPlot)I.attr({width:q-s.borderwidth,height:Z-s.borderwidth,x:s.borderwidth/2,y:s.borderwidth/2}),c.setTranslate(O,0,0),P.select("rect").attr({width:q-2*s.borderwidth,height:Z-2*s.borderwidth,x:s.borderwidth,y:s.borderwidth}),c.setClipUrl(O,r),c.setRect(D,0,0,0,0),delete s._scrollY;else{var J,K,Q=Math.max(p.scrollBarMinHeight,Z*Z/s._height),tt=Z-Q-2*p.scrollBarMargin,et=s._height-Z,rt=tt/et,nt=Math.min(s._scrollY||0,et);I.attr({width:q-2*s.borderwidth+p.scrollBarWidth+p.scrollBarMargin,height:Z-s.borderwidth,x:s.borderwidth/2,y:s.borderwidth/2}),P.select("rect").attr({width:q-2*s.borderwidth+p.scrollBarWidth+p.scrollBarMargin,height:Z-2*s.borderwidth,x:s.borderwidth,y:s.borderwidth+nt}),c.setClipUrl(O,r),at(nt,Q,rt),z.on("wheel",function(){at(nt=i.constrain(s._scrollY+n.event.deltaY/tt*et,0,et),Q,rt),0!==nt&&nt!==et&&n.event.preventDefault()});var it=n.behavior.drag().on("dragstart",function(){J=n.event.sourceEvent.clientY,K=nt}).on("drag",function(){var t=n.event.sourceEvent;2===t.buttons||t.ctrlKey||at(nt=i.constrain((t.clientY-J)/rt+K,0,et),Q,rt)});D.call(it)}if(t._context.edits.legendPosition)z.classed("cursor-move",!0),l.init({element:z.node(),gd:t,prepFn:function(){var t=c.getTranslate(z);Y=t.x,X=t.y},moveFn:function(t,e){var r=Y+t,n=X+e;c.setTranslate(z,r,n),G=l.align(r,0,j.l,j.l+j.w,s.xanchor),W=l.align(n,0,j.t+j.h,j.t,s.yanchor)},doneFn:function(){void 0!==G&&void 0!==W&&o.call("relayout",t,{"legend.x":G,"legend.y":W})},clickFn:function(r,n){var i=e._infolayer.selectAll("g.traces").filter(function(){var t=this.getBoundingClientRect();return n.clientX>=t.left&&n.clientX<=t.right&&n.clientY>=t.top&&n.clientY<=t.bottom});i.size()>0&&M(t,z,i,r,n)}})}function at(e,r,n){s._scrollY=t._fullLayout.legend._scrollY=e,c.setTranslate(O,0,-e),c.setRect(D,q,p.scrollBarMargin+e*n,p.scrollBarWidth,r),P.select("rect").attr({y:s.borderwidth+e})}}},{"../../constants/alignment":656,"../../constants/interactions":660,"../../lib":684,"../../lib/events":672,"../../lib/svg_text_utils":708,"../../plots/plots":795,"../../registry":817,"../color":558,"../dragelement":580,"../drawing":583,"./anchor_utils":610,"./constants":612,"./get_legend_data":615,"./handle_click":616,"./helpers":617,"./style":619,d3:147}],615:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("./helpers");e.exports=function(t,e){var r,a,o={},s=[],l=!1,c={},u=0;function h(t,r){if(""!==t&&i.isGrouped(e))-1===s.indexOf(t)?(s.push(t),l=!0,o[t]=[[r]]):o[t].push([r]);else{var n="~~i"+u;s.push(n),o[n]=[[r]],u++}}for(r=0;r<t.length;r++){var f=t[r],p=f[0],d=p.trace,g=d.legendgroup;if(i.legendGetsTrace(d)&&d.showlegend)if(n.traceIs(d,"pie"))for(c[g]||(c[g]={}),a=0;a<f.length;a++){var m=f[a].label;c[g][m]||(h(g,{label:m,color:f[a].color,i:f[a].i,trace:d}),c[g][m]=!0)}else h(g,p)}if(!s.length)return[];var v,y,x=s.length;if(l&&i.isGrouped(e))for(y=new Array(x),r=0;r<x;r++)v=o[s[r]],y[r]=i.isReversed(e)?v.reverse():v;else{for(y=[new Array(x)],r=0;r<x;r++)v=o[s[r]][0],y[0][i.isReversed(e)?x-r-1:r]=v;x=1}return e._lgroupsLength=x,y}},{"../../registry":817,"./helpers":617}],616:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../registry"),a=!0;e.exports=function(t,e,r){if(!e._dragged&&!e._editing){var o,s,l,c,u,h=e._fullLayout.hiddenlabels?e._fullLayout.hiddenlabels.slice():[],f=t.data()[0][0],p=e._fullData,d=f.trace,g=d.legendgroup,m={},v=[],y=[],x=[];if(1===r&&a&&e.data&&e._context.showTips?(n.notifier(n._(e,"Double-click on legend to isolate one trace"),"long"),a=!1):a=!1,i.traceIs(d,"pie")){var b=f.label,_=h.indexOf(b);1===r?-1===_?h.push(b):h.splice(_,1):2===r&&(h=[],e.calcdata[0].forEach(function(t){b!==t.label&&h.push(t.label)}),e._fullLayout.hiddenlabels&&e._fullLayout.hiddenlabels.length===h.length&&-1===_&&(h=[])),i.call("relayout",e,"hiddenlabels",h)}else{var w,k=g&&g.length,M=[];if(k)for(o=0;o<p.length;o++)(w=p[o]).visible&&w.legendgroup===g&&M.push(o);if(1===r){var A;switch(d.visible){case!0:A="legendonly";break;case!1:A=!1;break;case"legendonly":A=!0}if(k)for(o=0;o<p.length;o++)!1!==p[o].visible&&p[o].legendgroup===g&&P(p[o],A);else P(d,A)}else if(2===r){var T,S,E=!0;for(o=0;o<p.length;o++)if(!(p[o]===d)&&!(T=k&&p[o].legendgroup===g)&&!0===p[o].visible&&!i.traceIs(p[o],"notLegendIsolatable")){E=!1;break}for(o=0;o<p.length;o++)if(!1!==p[o].visible&&!i.traceIs(p[o],"notLegendIsolatable"))switch(d.visible){case"legendonly":P(p[o],!0);break;case!0:S=!!E||"legendonly",T=p[o]===d||k&&p[o].legendgroup===g,P(p[o],!!T||S)}}for(o=0;o<y.length;o++)if(l=y[o]){var C=l.constructUpdate(),L=Object.keys(C);for(s=0;s<L.length;s++)c=L[s],(m[c]=m[c]||[])[x[o]]=C[c]}for(u=Object.keys(m),o=0;o<u.length;o++)for(c=u[o],s=0;s<v.length;s++)m[c].hasOwnProperty(s)||(m[c][s]=void 0);i.call("restyle",e,m,v)}}function z(t,e,r){var n=v.indexOf(t),i=m[e];return i||(i=m[e]=[]),-1===v.indexOf(t)&&(v.push(t),n=v.length-1),i[n]=r,n}function P(t,e){var r=t._fullInput;if(i.hasTransform(r,"groupby")){var a=y[r.index];if(!a){var o=i.getTransformIndices(r,"groupby"),s=o[o.length-1];a=n.keyedContainer(r,"transforms["+s+"].styles","target","value.visible"),y[r.index]=a}var l=a.get(t._group);void 0===l&&(l=!0),!1!==l&&a.set(t._group,e),x[r.index]=z(r.index,"visible",!1!==r.visible)}else{var c=!1!==r.visible&&e;z(r.index,"visible",c)}}}},{"../../lib":684,"../../registry":817}],617:[function(t,e,r){"use strict";r.legendGetsTrace=function(t){return t.visible&&void 0!==t.showlegend},r.isGrouped=function(t){return-1!==(t.traceorder||"").indexOf("grouped")},r.isVertical=function(t){return"h"!==t.orientation},r.isReversed=function(t){return-1!==(t.traceorder||"").indexOf("reversed")}},{}],618:[function(t,e,r){"use strict";e.exports={moduleType:"component",name:"legend",layoutAttributes:t("./attributes"),supplyLayoutDefaults:t("./defaults"),draw:t("./draw"),style:t("./style")}},{"./attributes":611,"./defaults":613,"./draw":614,"./style":619}],619:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../registry"),a=t("../../lib"),o=t("../drawing"),s=t("../color"),l=t("../../traces/scatter/subtypes"),c=t("../../traces/pie/style_one");e.exports=function(t,e){t.each(function(t){var e=n.select(this),r=a.ensureSingle(e,"g","layers");r.style("opacity",t[0].trace.opacity),r.selectAll("g.legendfill").data([t]).enter().append("g").classed("legendfill",!0),r.selectAll("g.legendlines").data([t]).enter().append("g").classed("legendlines",!0);var i=r.selectAll("g.legendsymbols").data([t]);i.enter().append("g").classed("legendsymbols",!0),i.selectAll("g.legendpoints").data([t]).enter().append("g").classed("legendpoints",!0)}).each(function(t){var e=t[0].trace,r=e.marker||{},a=r.line||{},o=n.select(this).select("g.legendpoints").selectAll("path.legendbar").data(i.traceIs(e,"bar")?[t]:[]);o.enter().append("path").classed("legendbar",!0).attr("d","M6,6H-6V-6H6Z").attr("transform","translate(20,0)"),o.exit().remove(),o.each(function(t){var e=n.select(this),i=t[0],o=(i.mlw+1||a.width+1)-1;e.style("stroke-width",o+"px").call(s.fill,i.mc||r.color),o&&e.call(s.stroke,i.mlc||a.color)})}).each(function(t){var e=t[0].trace,r=n.select(this).select("g.legendpoints").selectAll("path.legendbox").data(i.traceIs(e,"box-violin")&&e.visible?[t]:[]);r.enter().append("path").classed("legendbox",!0).attr("d","M6,6H-6V-6H6Z").attr("transform","translate(20,0)"),r.exit().remove(),r.each(function(){var t=e.line.width,r=n.select(this);r.style("stroke-width",t+"px").call(s.fill,e.fillcolor),t&&s.stroke(r,e.line.color)})}).each(function(t){var e=t[0].trace,r=n.select(this).select("g.legendpoints").selectAll("path.legendpie").data(i.traceIs(e,"pie")&&e.visible?[t]:[]);r.enter().append("path").classed("legendpie",!0).attr("d","M6,6H-6V-6H6Z").attr("transform","translate(20,0)"),r.exit().remove(),r.size()&&r.call(c,t[0],e)}).each(function(t){var e=t[0].trace,r=e.visible&&e.fill&&"none"!==e.fill,i=l.hasLines(e),a=e.contours;a&&"constraint"===a.type&&(i=a.showlines,r="="!==a._operation);var s=n.select(this).select(".legendfill").selectAll("path").data(r?[t]:[]);s.enter().append("path").classed("js-fill",!0),s.exit().remove(),s.attr("d","M5,0h30v6h-30z").call(o.fillGroupStyle);var c=n.select(this).select(".legendlines").selectAll("path").data(i?[t]:[]);c.enter().append("path").classed("js-line",!0).attr("d","M5,0h30"),c.exit().remove(),c.call(o.lineGroupStyle)}).each(function(t){var r,i,s=t[0],c=s.trace,u=l.hasMarkers(c),h=l.hasText(c),f=l.hasLines(c);function p(t,e,r){var n=a.nestedProperty(c,t).get(),i=Array.isArray(n)&&e?e(n):n;if(r){if(i<r[0])return r[0];if(i>r[1])return r[1]}return i}function d(t){return t[0]}if(u||h||f){var g={},m={};u&&(g.mc=p("marker.color",d),g.mx=p("marker.symbol",d),g.mo=p("marker.opacity",a.mean,[.2,1]),g.ms=p("marker.size",a.mean,[2,16]),g.mlc=p("marker.line.color",d),g.mlw=p("marker.line.width",a.mean,[0,5]),m.marker={sizeref:1,sizemin:1,sizemode:"diameter"}),f&&(m.line={width:p("line.width",d,[0,10])}),h&&(g.tx="Aa",g.tp=p("textposition",d),g.ts=10,g.tc=p("textfont.color",d),g.tf=p("textfont.family",d)),r=[a.minExtend(s,g)],(i=a.minExtend(c,m)).selectedpoints=null}var v=n.select(this).select("g.legendpoints"),y=v.selectAll("path.scatterpts").data(u?r:[]);y.enter().append("path").classed("scatterpts",!0).attr("transform","translate(20,0)"),y.exit().remove(),y.call(o.pointStyle,i,e),u&&(r[0].mrc=3);var x=v.selectAll("g.pointtext").data(h?r:[]);x.enter().append("g").classed("pointtext",!0).append("text").attr("transform","translate(20,0)"),x.exit().remove(),x.selectAll("text").call(o.textPointStyle,i,e)}).each(function(t){var e=t[0].trace,r=n.select(this).select("g.legendpoints").selectAll("path.legendcandle").data("candlestick"===e.type&&e.visible?[t,t]:[]);r.enter().append("path").classed("legendcandle",!0).attr("d",function(t,e){return e?"M-15,0H-8M-8,6V-6H8Z":"M15,0H8M8,-6V6H-8Z"}).attr("transform","translate(20,0)").style("stroke-miterlimit",1),r.exit().remove(),r.each(function(t,r){var i=e[r?"increasing":"decreasing"],a=i.line.width,o=n.select(this);o.style("stroke-width",a+"px").call(s.fill,i.fillcolor),a&&s.stroke(o,i.line.color)})}).each(function(t){var e=t[0].trace,r=n.select(this).select("g.legendpoints").selectAll("path.legendohlc").data("ohlc"===e.type&&e.visible?[t,t]:[]);r.enter().append("path").classed("legendohlc",!0).attr("d",function(t,e){return e?"M-15,0H0M-8,-6V0":"M15,0H0M8,6V0"}).attr("transform","translate(20,0)").style("stroke-miterlimit",1),r.exit().remove(),r.each(function(t,r){var i=e[r?"increasing":"decreasing"],a=i.line.width,l=n.select(this);l.style("fill","none").call(o.dashLine,i.line.dash,a),a&&s.stroke(l,i.line.color)})})}},{"../../lib":684,"../../registry":817,"../../traces/pie/style_one":1001,"../../traces/scatter/subtypes":1037,"../color":558,"../drawing":583,d3:147}],620:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../plots/plots"),a=t("../../plots/cartesian/axis_ids"),o=t("../../lib"),s=t("../../../build/ploticon"),l=o._,c=e.exports={};function u(t,e){var r,i,o=e.currentTarget,s=o.getAttribute("data-attr"),l=o.getAttribute("data-val")||!0,c=t._fullLayout,u={},h=a.list(t,null,!0),f="on";if("zoom"===s){var p,d="in"===l?.5:2,g=(1+d)/2,m=(1-d)/2;for(i=0;i<h.length;i++)if(!(r=h[i]).fixedrange)if(p=r._name,"auto"===l)u[p+".autorange"]=!0;else if("reset"===l){if(void 0===r._rangeInitial)u[p+".autorange"]=!0;else{var v=r._rangeInitial.slice();u[p+".range[0]"]=v[0],u[p+".range[1]"]=v[1]}void 0!==r._showSpikeInitial&&(u[p+".showspikes"]=r._showSpikeInitial,"on"!==f||r._showSpikeInitial||(f="off"))}else{var y=[r.r2l(r.range[0]),r.r2l(r.range[1])],x=[g*y[0]+m*y[1],g*y[1]+m*y[0]];u[p+".range[0]"]=r.l2r(x[0]),u[p+".range[1]"]=r.l2r(x[1])}c._cartesianSpikesEnabled=f}else{if("hovermode"!==s||"x"!==l&&"y"!==l){if("hovermode"===s&&"closest"===l){for(i=0;i<h.length;i++)r=h[i],"on"!==f||r.showspikes||(f="off");c._cartesianSpikesEnabled=f}}else l=c._isHoriz?"y":"x",o.setAttribute("data-val",l);u[s]=l}n.call("relayout",t,u)}function h(t,e){for(var r=e.currentTarget,i=r.getAttribute("data-attr"),a=r.getAttribute("data-val")||!0,o=t._fullLayout._subplots.gl3d,s={},l=i.split("."),c=0;c<o.length;c++)s[o[c]+"."+l[1]]=a;var u="pan"===a?a:"zoom";s.dragmode=u,n.call("relayout",t,s)}function f(t,e){for(var r=e.currentTarget.getAttribute("data-attr"),i=t._fullLayout,a=i._subplots.gl3d,s={},l=0;l<a.length;l++){var c=a[l],u=c+".camera",h=i[c]._scene;"resetDefault"===r?s[u]=null:"resetLastSave"===r&&(s[u]=o.extendDeep({},h.cameraInitial))}n.call("relayout",t,s)}function p(t,e){var r=e.currentTarget,i=r._previousVal||!1,a=t.layout,s=t._fullLayout,l=s._subplots.gl3d,c=["xaxis","yaxis","zaxis"],u=["showspikes","spikesides","spikethickness","spikecolor"],h={},f={},p={};if(i)p=o.extendDeep(a,i),r._previousVal=null;else{p={"allaxes.showspikes":!1};for(var d=0;d<l.length;d++){var g=l[d],m=s[g],v=h[g]={};v.hovermode=m.hovermode,p[g+".hovermode"]=!1;for(var y=0;y<3;y++){var x=c[y];f=v[x]={};for(var b=0;b<u.length;b++){var _=u[b];f[_]=m[x][_]}}}r._previousVal=o.extendDeep({},h)}n.call("relayout",t,p)}function d(t,e){for(var r=e.currentTarget,i=r.getAttribute("data-attr"),a=r.getAttribute("data-val")||!0,o=t._fullLayout,s=o._subplots.geo,l=0;l<s.length;l++){var c=s[l],u=o[c];if("zoom"===i){var h=u.projection.scale,f="in"===a?2*h:.5*h;n.call("relayout",t,c+".projection.scale",f)}else"reset"===i&&m(t,"geo")}}function g(t){var e,r=t._fullLayout;e=r._has("cartesian")?r._isHoriz?"y":"x":"closest";var i=!t._fullLayout.hovermode&&e;n.call("relayout",t,"hovermode",i)}function m(t,e){for(var r=t._fullLayout,i=r._subplots[e],a={},o=0;o<i.length;o++)for(var s=i[o],l=r[s]._subplot.viewInitial,c=Object.keys(l),u=0;u<c.length;u++){var h=c[u];a[s+"."+h]=l[h]}n.call("relayout",t,a)}c.toImage={name:"toImage",title:function(t){var e=(t._context.toImageButtonOptions||{}).format||"png";return l(t,"png"===e?"Download plot as a png":"Download plot")},icon:s.camera,click:function(t){var e=t._context.toImageButtonOptions,r={format:e.format||"png"};o.notifier(l(t,"Taking snapshot - this may take a few seconds"),"long"),"svg"!==r.format&&o.isIE()&&(o.notifier(l(t,"IE only supports svg.  Changing format to svg."),"long"),r.format="svg"),["filename","width","height","scale"].forEach(function(t){e[t]&&(r[t]=e[t])}),n.call("downloadImage",t,r).then(function(e){o.notifier(l(t,"Snapshot succeeded")+" - "+e,"long")}).catch(function(){o.notifier(l(t,"Sorry, there was a problem downloading your snapshot!"),"long")})}},c.sendDataToCloud={name:"sendDataToCloud",title:function(t){return l(t,"Edit in Chart Studio")},icon:s.disk,click:function(t){i.sendDataToCloud(t)}},c.zoom2d={name:"zoom2d",title:function(t){return l(t,"Zoom")},attr:"dragmode",val:"zoom",icon:s.zoombox,click:u},c.pan2d={name:"pan2d",title:function(t){return l(t,"Pan")},attr:"dragmode",val:"pan",icon:s.pan,click:u},c.select2d={name:"select2d",title:function(t){return l(t,"Box Select")},attr:"dragmode",val:"select",icon:s.selectbox,click:u},c.lasso2d={name:"lasso2d",title:function(t){return l(t,"Lasso Select")},attr:"dragmode",val:"lasso",icon:s.lasso,click:u},c.zoomIn2d={name:"zoomIn2d",title:function(t){return l(t,"Zoom in")},attr:"zoom",val:"in",icon:s.zoom_plus,click:u},c.zoomOut2d={name:"zoomOut2d",title:function(t){return l(t,"Zoom out")},attr:"zoom",val:"out",icon:s.zoom_minus,click:u},c.autoScale2d={name:"autoScale2d",title:function(t){return l(t,"Autoscale")},attr:"zoom",val:"auto",icon:s.autoscale,click:u},c.resetScale2d={name:"resetScale2d",title:function(t){return l(t,"Reset axes")},attr:"zoom",val:"reset",icon:s.home,click:u},c.hoverClosestCartesian={name:"hoverClosestCartesian",title:function(t){return l(t,"Show closest data on hover")},attr:"hovermode",val:"closest",icon:s.tooltip_basic,gravity:"ne",click:u},c.hoverCompareCartesian={name:"hoverCompareCartesian",title:function(t){return l(t,"Compare data on hover")},attr:"hovermode",val:function(t){return t._fullLayout._isHoriz?"y":"x"},icon:s.tooltip_compare,gravity:"ne",click:u},c.zoom3d={name:"zoom3d",title:function(t){return l(t,"Zoom")},attr:"scene.dragmode",val:"zoom",icon:s.zoombox,click:h},c.pan3d={name:"pan3d",title:function(t){return l(t,"Pan")},attr:"scene.dragmode",val:"pan",icon:s.pan,click:h},c.orbitRotation={name:"orbitRotation",title:function(t){return l(t,"Orbital rotation")},attr:"scene.dragmode",val:"orbit",icon:s["3d_rotate"],click:h},c.tableRotation={name:"tableRotation",title:function(t){return l(t,"Turntable rotation")},attr:"scene.dragmode",val:"turntable",icon:s["z-axis"],click:h},c.resetCameraDefault3d={name:"resetCameraDefault3d",title:function(t){return l(t,"Reset camera to default")},attr:"resetDefault",icon:s.home,click:f},c.resetCameraLastSave3d={name:"resetCameraLastSave3d",title:function(t){return l(t,"Reset camera to last save")},attr:"resetLastSave",icon:s.movie,click:f},c.hoverClosest3d={name:"hoverClosest3d",title:function(t){return l(t,"Toggle show closest data on hover")},attr:"hovermode",val:null,toggle:!0,icon:s.tooltip_basic,gravity:"ne",click:p},c.zoomInGeo={name:"zoomInGeo",title:function(t){return l(t,"Zoom in")},attr:"zoom",val:"in",icon:s.zoom_plus,click:d},c.zoomOutGeo={name:"zoomOutGeo",title:function(t){return l(t,"Zoom out")},attr:"zoom",val:"out",icon:s.zoom_minus,click:d},c.resetGeo={name:"resetGeo",title:function(t){return l(t,"Reset")},attr:"reset",val:null,icon:s.autoscale,click:d},c.hoverClosestGeo={name:"hoverClosestGeo",title:function(t){return l(t,"Toggle show closest data on hover")},attr:"hovermode",val:null,toggle:!0,icon:s.tooltip_basic,gravity:"ne",click:g},c.hoverClosestGl2d={name:"hoverClosestGl2d",title:function(t){return l(t,"Toggle show closest data on hover")},attr:"hovermode",val:null,toggle:!0,icon:s.tooltip_basic,gravity:"ne",click:g},c.hoverClosestPie={name:"hoverClosestPie",title:function(t){return l(t,"Toggle show closest data on hover")},attr:"hovermode",val:"closest",icon:s.tooltip_basic,gravity:"ne",click:g},c.toggleHover={name:"toggleHover",title:function(t){return l(t,"Toggle show closest data on hover")},attr:"hovermode",val:null,toggle:!0,icon:s.tooltip_basic,gravity:"ne",click:function(t,e){g(t),p(t,e)}},c.resetViews={name:"resetViews",title:function(t){return l(t,"Reset views")},icon:s.home,click:function(t,e){var r=e.currentTarget;r.setAttribute("data-attr","zoom"),r.setAttribute("data-val","reset"),u(t,e),r.setAttribute("data-attr","resetLastSave"),f(t,e),m(t,"geo"),m(t,"mapbox")}},c.toggleSpikelines={name:"toggleSpikelines",title:function(t){return l(t,"Toggle Spike Lines")},icon:s.spikeline,attr:"_cartesianSpikesEnabled",val:"on",click:function(t){var e=t._fullLayout;e._cartesianSpikesEnabled="on"===e._cartesianSpikesEnabled?"off":"on";var r=function(t){for(var e,r,n=t._fullLayout,i=a.list(t,null,!0),o={},s=0;s<i.length;s++)e=i[s],r=e._name,o[r+".showspikes"]="on"===n._cartesianSpikesEnabled||e._showSpikeInitial;return o}(t);n.call("relayout",t,r)}},c.resetViewMapbox={name:"resetViewMapbox",title:function(t){return l(t,"Reset view")},attr:"reset",icon:s.home,click:function(t){m(t,"mapbox")}}},{"../../../build/ploticon":2,"../../lib":684,"../../plots/cartesian/axis_ids":735,"../../plots/plots":795,"../../registry":817}],621:[function(t,e,r){"use strict";r.manage=t("./manage")},{"./manage":622}],622:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/axis_ids"),i=t("../../traces/scatter/subtypes"),a=t("../../registry"),o=t("./modebar"),s=t("./buttons");e.exports=function(t){var e=t._fullLayout,r=t._context,l=e._modeBar;if(r.displayModeBar){if(!Array.isArray(r.modeBarButtonsToRemove))throw new Error(["*modeBarButtonsToRemove* configuration options","must be an array."].join(" "));if(!Array.isArray(r.modeBarButtonsToAdd))throw new Error(["*modeBarButtonsToAdd* configuration options","must be an array."].join(" "));var c,u=r.modeBarButtons;c=Array.isArray(u)&&u.length?function(t){for(var e=0;e<t.length;e++)for(var r=t[e],n=0;n<r.length;n++){var i=r[n];if("string"==typeof i){if(void 0===s[i])throw new Error(["*modeBarButtons* configuration options","invalid button name"].join(" "));t[e][n]=s[i]}}return t}(u):function(t,e,r){var o=t._fullLayout,l=t._fullData,c=o._has("cartesian"),u=o._has("gl3d"),h=o._has("geo"),f=o._has("pie"),p=o._has("gl2d"),d=o._has("ternary"),g=o._has("mapbox"),m=o._has("polar"),v=function(t){for(var e=n.list({_fullLayout:t},null,!0),r=0;r<e.length;r++)if(!e[r].fixedrange)return!1;return!0}(o),y=[];function x(t){if(t.length){for(var r=[],n=0;n<t.length;n++){var i=t[n];-1===e.indexOf(i)&&r.push(s[i])}y.push(r)}}x(["toImage","sendDataToCloud"]);var b=[],_=[],w=[],k=[];(c||p||f||d)+h+u+g+m>1?(_=["toggleHover"],w=["resetViews"]):h?(b=["zoomInGeo","zoomOutGeo"],_=["hoverClosestGeo"],w=["resetGeo"]):u?(_=["hoverClosest3d"],w=["resetCameraDefault3d","resetCameraLastSave3d"]):g?(_=["toggleHover"],w=["resetViewMapbox"]):_=p?["hoverClosestGl2d"]:f?["hoverClosestPie"]:["toggleHover"];c&&(_=["toggleSpikelines","hoverClosestCartesian","hoverCompareCartesian"]);!c&&!p||v||(b=["zoomIn2d","zoomOut2d","autoScale2d"],"resetViews"!==w[0]&&(w=["resetScale2d"]));u?k=["zoom3d","pan3d","orbitRotation","tableRotation"]:(c||p)&&!v||d?k=["zoom2d","pan2d"]:g||h?k=["pan2d"]:m&&(k=["zoom2d"]);(function(t){for(var e=!1,r=0;r<t.length&&!e;r++){var n=t[r];n._module&&n._module.selectPoints&&(a.traceIs(n,"scatter-like")?(i.hasMarkers(n)||i.hasText(n))&&(e=!0):a.traceIs(n,"box-violin")&&"all"!==n.boxpoints&&"all"!==n.points||(e=!0))}return e})(l)&&k.push("select2d","lasso2d");return x(k),x(b.concat(w)),x(_),function(t,e){if(e.length)if(Array.isArray(e[0]))for(var r=0;r<e.length;r++)t.push(e[r]);else t.push(e);return t}(y,r)}(t,r.modeBarButtonsToRemove,r.modeBarButtonsToAdd),l?l.update(t,c):e._modeBar=o(t,c)}else l&&(l.destroy(),delete e._modeBar)}},{"../../plots/cartesian/axis_ids":735,"../../registry":817,"../../traces/scatter/subtypes":1037,"./buttons":620,"./modebar":623}],623:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("../../lib"),o=t("../../../build/ploticon");function s(t){this.container=t.container,this.element=document.createElement("div"),this.update(t.graphInfo,t.buttons),this.container.appendChild(this.element)}var l=s.prototype;l.update=function(t,e){this.graphInfo=t;var r=this.graphInfo._context;"hover"===r.displayModeBar?this.element.className="modebar modebar--hover":this.element.className="modebar";var n=!this.hasButtons(e),i=this.hasLogo!==r.displaylogo,a=this.locale!==r.locale;this.locale=r.locale,(n||i||a)&&(this.removeAllButtons(),this.updateButtons(e),r.displaylogo&&(this.element.appendChild(this.getLogo()),this.hasLogo=!0)),this.updateActiveButton()},l.updateButtons=function(t){var e=this;this.buttons=t,this.buttonElements=[],this.buttonsNames=[],this.buttons.forEach(function(t){var r=e.createGroup();t.forEach(function(t){var n=t.name;if(!n)throw new Error("must provide button 'name' in button config");if(-1!==e.buttonsNames.indexOf(n))throw new Error("button name '"+n+"' is taken");e.buttonsNames.push(n);var i=e.createButton(t);e.buttonElements.push(i),r.appendChild(i)}),e.element.appendChild(r)})},l.createGroup=function(){var t=document.createElement("div");return t.className="modebar-group",t},l.createButton=function(t){var e=this,r=document.createElement("a");r.setAttribute("rel","tooltip"),r.className="modebar-btn";var i=t.title;void 0===i?i=t.name:"function"==typeof i&&(i=i(this.graphInfo)),(i||0===i)&&r.setAttribute("data-title",i),void 0!==t.attr&&r.setAttribute("data-attr",t.attr);var a=t.val;if(void 0!==a&&("function"==typeof a&&(a=a(this.graphInfo)),r.setAttribute("data-val",a)),"function"!=typeof t.click)throw new Error("must provide button 'click' function in button config");r.addEventListener("click",function(r){t.click(e.graphInfo,r),e.updateActiveButton(r.currentTarget)}),r.setAttribute("data-toggle",t.toggle||!1),t.toggle&&n.select(r).classed("active",!0);var s=t.icon;return"function"==typeof s?r.appendChild(s()):r.appendChild(this.createIcon(s||o.question)),r.setAttribute("data-gravity",t.gravity||"n"),r},l.createIcon=function(t){var e=i(t.height)?Number(t.height):t.ascent-t.descent,r="http://www.w3.org/2000/svg",n=document.createElementNS(r,"svg"),a=document.createElementNS(r,"path");return n.setAttribute("height","1em"),n.setAttribute("width",t.width/e+"em"),n.setAttribute("viewBox",[0,0,t.width,e].join(" ")),a.setAttribute("d",t.path),t.transform?a.setAttribute("transform",t.transform):void 0!==t.ascent&&a.setAttribute("transform","matrix(1 0 0 -1 0 "+t.ascent+")"),n.appendChild(a),n},l.updateActiveButton=function(t){var e=this.graphInfo._fullLayout,r=void 0!==t?t.getAttribute("data-attr"):null;this.buttonElements.forEach(function(t){var i=t.getAttribute("data-val")||!0,o=t.getAttribute("data-attr"),s="true"===t.getAttribute("data-toggle"),l=n.select(t);if(s)o===r&&l.classed("active",!l.classed("active"));else{var c=null===o?o:a.nestedProperty(e,o).get();l.classed("active",c===i)}})},l.hasButtons=function(t){var e=this.buttons;if(!e)return!1;if(t.length!==e.length)return!1;for(var r=0;r<t.length;++r){if(t[r].length!==e[r].length)return!1;for(var n=0;n<t[r].length;n++)if(t[r][n].name!==e[r][n].name)return!1}return!0},l.getLogo=function(){var t=this.createGroup(),e=document.createElement("a");return e.href="https://plot.ly/",e.target="_blank",e.setAttribute("data-title",a._(this.graphInfo,"Produced with Plotly")),e.className="modebar-btn plotlyjsicon modebar-btn--logo",e.appendChild(this.createIcon(o.plotlylogo)),t.appendChild(e),t},l.removeAllButtons=function(){for(;this.element.firstChild;)this.element.removeChild(this.element.firstChild);this.hasLogo=!1},l.destroy=function(){a.removeElement(this.container.querySelector(".modebar"))},e.exports=function(t,e){var r=t._fullLayout,i=new s({graphInfo:t,container:r._paperdiv.node(),buttons:e});return r._privateplot&&n.select(i.element).append("span").classed("badge-private float--left",!0).text("PRIVATE"),i}},{"../../../build/ploticon":2,"../../lib":684,d3:147,"fast-isnumeric":214}],624:[function(t,e,r){"use strict";var n=t("../../plots/font_attributes"),i=t("../color/attributes"),a=(0,t("../../plot_api/plot_template").templatedArray)("button",{visible:{valType:"boolean",dflt:!0,editType:"plot"},step:{valType:"enumerated",values:["month","year","day","hour","minute","second","all"],dflt:"month",editType:"plot"},stepmode:{valType:"enumerated",values:["backward","todate"],dflt:"backward",editType:"plot"},count:{valType:"number",min:0,dflt:1,editType:"plot"},label:{valType:"string",editType:"plot"},editType:"plot"});e.exports={visible:{valType:"boolean",editType:"plot"},buttons:a,x:{valType:"number",min:-2,max:3,editType:"plot"},xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"left",editType:"plot"},y:{valType:"number",min:-2,max:3,editType:"plot"},yanchor:{valType:"enumerated",values:["auto","top","middle","bottom"],dflt:"bottom",editType:"plot"},font:n({editType:"plot"}),bgcolor:{valType:"color",dflt:i.lightLine,editType:"plot"},activecolor:{valType:"color",editType:"plot"},bordercolor:{valType:"color",dflt:i.defaultLine,editType:"plot"},borderwidth:{valType:"number",min:0,dflt:0,editType:"plot"},editType:"plot"}},{"../../plot_api/plot_template":722,"../../plots/font_attributes":758,"../color/attributes":557}],625:[function(t,e,r){"use strict";e.exports={yPad:.02,minButtonWidth:30,rx:3,ry:3,lightAmount:25,darkAmount:10}},{}],626:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../color"),a=t("../../plot_api/plot_template"),o=t("../../plots/array_container_defaults"),s=t("./attributes"),l=t("./constants");function c(t,e,r,i){var a=i.calendar;function o(r,i){return n.coerce(t,e,s.buttons,r,i)}if(o("visible")){var l=o("step");"all"!==l&&(!a||"gregorian"===a||"month"!==l&&"year"!==l?o("stepmode"):e.stepmode="backward",o("count")),o("label")}}e.exports=function(t,e,r,u,h){var f=t.rangeselector||{},p=a.newContainer(e,"rangeselector");function d(t,e){return n.coerce(f,p,s,t,e)}if(d("visible",o(f,p,{name:"buttons",handleItemDefaults:c,calendar:h}).length>0)){var g=function(t,e,r){for(var n=r.filter(function(r){return e[r].anchor===t._id}),i=0,a=0;a<n.length;a++){var o=e[n[a]].domain;o&&(i=Math.max(o[1],i))}return[t.domain[0],i+l.yPad]}(e,r,u);d("x",g[0]),d("y",g[1]),n.noneOrAll(t,e,["x","y"]),d("xanchor"),d("yanchor"),n.coerceFont(d,"font",r.font);var m=d("bgcolor");d("activecolor",i.contrast(m,l.lightAmount,l.darkAmount)),d("bordercolor"),d("borderwidth")}}},{"../../lib":684,"../../plot_api/plot_template":722,"../../plots/array_container_defaults":728,"../color":558,"./attributes":624,"./constants":625}],627:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../registry"),a=t("../../plots/plots"),o=t("../color"),s=t("../drawing"),l=t("../../lib"),c=t("../../lib/svg_text_utils"),u=t("../../plots/cartesian/axis_ids"),h=t("../legend/anchor_utils"),f=t("../../constants/alignment"),p=f.LINE_SPACING,d=f.FROM_TL,g=f.FROM_BR,m=t("./constants"),v=t("./get_update_object");function y(t){return t._id}function x(t,e,r){var n=l.ensureSingle(t,"rect","selector-rect",function(t){t.attr("shape-rendering","crispEdges")});n.attr({rx:m.rx,ry:m.ry}),n.call(o.stroke,e.bordercolor).call(o.fill,function(t,e){return e._isActive||e._isHovered?t.activecolor:t.bgcolor}(e,r)).style("stroke-width",e.borderwidth+"px")}function b(t,e,r,n){var i;l.ensureSingle(t,"text","selector-text",function(t){t.classed("user-select-none",!0).attr("text-anchor","middle")}).call(s.font,e.font).text((i=r,i.label?i.label:"all"===i.step?"all":i.count+i.step.charAt(0))).call(function(t){c.convertToTspans(t,n)})}e.exports=function(t){var e=t._fullLayout._infolayer.selectAll(".rangeselector").data(function(t){for(var e=u.list(t,"x",!0),r=[],n=0;n<e.length;n++){var i=e[n];i.rangeselector&&i.rangeselector.visible&&r.push(i)}return r}(t),y);e.enter().append("g").classed("rangeselector",!0),e.exit().remove(),e.style({cursor:"pointer","pointer-events":"all"}),e.each(function(e){var r=n.select(this),o=e,u=o.rangeselector,f=r.selectAll("g.button").data(l.filterVisible(u.buttons));f.enter().append("g").classed("button",!0),f.exit().remove(),f.each(function(e){var r=n.select(this),a=v(o,e);e._isActive=function(t,e,r){if("all"===e.step)return!0===t.autorange;var n=Object.keys(r);return t.range[0]===r[n[0]]&&t.range[1]===r[n[1]]}(o,e,a),r.call(x,u,e),r.call(b,u,e,t),r.on("click",function(){t._dragged||i.call("relayout",t,a)}),r.on("mouseover",function(){e._isHovered=!0,r.call(x,u,e)}),r.on("mouseout",function(){e._isHovered=!1,r.call(x,u,e)})}),function(t,e,r,i,o){var l=0,u=0,f=r.borderwidth;e.each(function(){var t=n.select(this),e=t.select(".selector-text"),i=r.font.size*p,a=Math.max(i*c.lineCount(e),16)+3;u=Math.max(u,a)}),e.each(function(){var t=n.select(this),e=t.select(".selector-rect"),i=t.select(".selector-text"),a=i.node()&&s.bBox(i.node()).width,o=r.font.size*p,h=c.lineCount(i),d=Math.max(a+10,m.minButtonWidth);t.attr("transform","translate("+(f+l)+","+f+")"),e.attr({x:0,y:0,width:d,height:u}),c.positionText(i,d/2,u/2-(h-1)*o/2+3),l+=d+5});var v=t._fullLayout._size,y=v.l+v.w*r.x,x=v.t+v.h*(1-r.y),b="left";h.isRightAnchor(r)&&(y-=l,b="right");h.isCenterAnchor(r)&&(y-=l/2,b="center");var _="top";h.isBottomAnchor(r)&&(x-=u,_="bottom");h.isMiddleAnchor(r)&&(x-=u/2,_="middle");l=Math.ceil(l),u=Math.ceil(u),y=Math.round(y),x=Math.round(x),a.autoMargin(t,i+"-range-selector",{x:r.x,y:r.y,l:l*d[b],r:l*g[b],b:u*g[_],t:u*d[_]}),o.attr("transform","translate("+y+","+x+")")}(t,f,u,o._name,r)})}},{"../../constants/alignment":656,"../../lib":684,"../../lib/svg_text_utils":708,"../../plots/cartesian/axis_ids":735,"../../plots/plots":795,"../../registry":817,"../color":558,"../drawing":583,"../legend/anchor_utils":610,"./constants":625,"./get_update_object":628,d3:147}],628:[function(t,e,r){"use strict";var n=t("d3");e.exports=function(t,e){var r=t._name,i={};if("all"===e.step)i[r+".autorange"]=!0;else{var a=function(t,e){var r,i=t.range,a=new Date(t.r2l(i[1])),o=e.step,s=e.count;switch(e.stepmode){case"backward":r=t.l2r(+n.time[o].utc.offset(a,-s));break;case"todate":var l=n.time[o].utc.offset(a,-s);r=t.l2r(+n.time[o].utc.ceil(l))}var c=i[1];return[r,c]}(t,e);i[r+".range[0]"]=a[0],i[r+".range[1]"]=a[1]}return i}},{d3:147}],629:[function(t,e,r){"use strict";e.exports={moduleType:"component",name:"rangeselector",schema:{subplots:{xaxis:{rangeselector:t("./attributes")}}},layoutAttributes:t("./attributes"),handleDefaults:t("./defaults"),draw:t("./draw")}},{"./attributes":624,"./defaults":626,"./draw":627}],630:[function(t,e,r){"use strict";var n=t("../color/attributes");e.exports={bgcolor:{valType:"color",dflt:n.background,editType:"plot"},bordercolor:{valType:"color",dflt:n.defaultLine,editType:"plot"},borderwidth:{valType:"integer",dflt:0,min:0,editType:"plot"},autorange:{valType:"boolean",dflt:!0,editType:"calc",impliedEdits:{"range[0]":void 0,"range[1]":void 0}},range:{valType:"info_array",items:[{valType:"any",editType:"calc",impliedEdits:{"^autorange":!1}},{valType:"any",editType:"calc",impliedEdits:{"^autorange":!1}}],editType:"calc",impliedEdits:{autorange:!1}},thickness:{valType:"number",dflt:.15,min:0,max:1,editType:"plot"},visible:{valType:"boolean",dflt:!0,editType:"calc"},editType:"calc"}},{"../color/attributes":557}],631:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/axis_ids").list,i=t("../../plots/cartesian/autorange").getAutoRange,a=t("./constants");e.exports=function(t){for(var e=n(t,"x",!0),r=0;r<e.length;r++){var o=e[r],s=o[a.name];s&&s.visible&&s.autorange&&o._min.length&&o._max.length&&(s._input.autorange=!0,s._input.range=s.range=i(o))}}},{"../../plots/cartesian/autorange":731,"../../plots/cartesian/axis_ids":735,"./constants":632}],632:[function(t,e,r){"use strict";e.exports={name:"rangeslider",containerClassName:"rangeslider-container",bgClassName:"rangeslider-bg",rangePlotClassName:"rangeslider-rangeplot",maskMinClassName:"rangeslider-mask-min",maskMaxClassName:"rangeslider-mask-max",slideBoxClassName:"rangeslider-slidebox",grabberMinClassName:"rangeslider-grabber-min",grabAreaMinClassName:"rangeslider-grabarea-min",handleMinClassName:"rangeslider-handle-min",grabberMaxClassName:"rangeslider-grabber-max",grabAreaMaxClassName:"rangeslider-grabarea-max",handleMaxClassName:"rangeslider-handle-max",maskMinOppAxisClassName:"rangeslider-mask-min-opp-axis",maskMaxOppAxisClassName:"rangeslider-mask-max-opp-axis",maskColor:"rgba(0,0,0,0.4)",maskOppAxisColor:"rgba(0,0,0,0.2)",slideBoxFill:"transparent",slideBoxCursor:"ew-resize",grabAreaFill:"transparent",grabAreaCursor:"col-resize",grabAreaWidth:10,handleWidth:4,handleRadius:1,handleStrokeWidth:1,extraPad:15}},{}],633:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plot_api/plot_template"),a=t("../../plots/cartesian/axis_ids"),o=t("./attributes"),s=t("./oppaxis_attributes");e.exports=function(t,e,r){var l=t[r],c=e[r];if(l.rangeslider||e._requestRangeslider[c._id]){n.isPlainObject(l.rangeslider)||(l.rangeslider={});var u,h,f=l.rangeslider,p=i.newContainer(c,"rangeslider");if(w("visible")){w("bgcolor",e.plot_bgcolor),w("bordercolor"),w("borderwidth"),w("thickness"),c._rangesliderAutorange=w("autorange",!c.isValidRange(f.range)),w("range");var d=e._subplots;if(d)for(var g=d.cartesian.filter(function(t){return t.substr(0,t.indexOf("y"))===a.name2id(r)}).map(function(t){return t.substr(t.indexOf("y"),t.length)}),m=n.simpleMap(g,a.id2name),v=0;v<m.length;v++){var y=m[v];u=f[y]||{},h=i.newContainer(p,y,"yaxis");var x,b=e[y];u.range&&b.isValidRange(u.range)&&(x="fixed");var _=k("rangemode",x);"match"!==_&&k("range",b.range.slice()),b._rangesliderAutorange="auto"===_}p._input=f}}function w(t,e){return n.coerce(f,p,o,t,e)}function k(t,e){return n.coerce(u,h,s,t,e)}}},{"../../lib":684,"../../plot_api/plot_template":722,"../../plots/cartesian/axis_ids":735,"./attributes":630,"./oppaxis_attributes":636}],634:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../registry"),a=t("../../plots/plots"),o=t("../../lib"),s=t("../drawing"),l=t("../color"),c=t("../titles"),u=t("../../plots/cartesian"),h=t("../../plots/cartesian/axes"),f=t("../dragelement"),p=t("../../lib/setcursor"),d=t("./constants");function g(t,e,r,n){var i=o.ensureSingle(t,"rect",d.bgClassName,function(t){t.attr({x:0,y:0,"shape-rendering":"crispEdges"})}),a=n.borderwidth%2==0?n.borderwidth:n.borderwidth-1,l=-n._offsetShift,c=s.crispRound(e,n.borderwidth);i.attr({width:n._width+a,height:n._height+a,transform:"translate("+l+","+l+")",fill:n.bgcolor,stroke:n.bordercolor,"stroke-width":c})}function m(t,e,r,n){var i=e._fullLayout;o.ensureSingleById(i._topdefs,"clipPath",n._clipId,function(t){t.append("rect").attr({x:0,y:0})}).select("rect").attr({width:n._width,height:n._height})}function v(t,e,r,i){var l,c=h.getSubplots(e,r),f=e.calcdata,p=t.selectAll("g."+d.rangePlotClassName).data(c,o.identity);p.enter().append("g").attr("class",function(t){return d.rangePlotClassName+" "+t}).call(s.setClipUrl,i._clipId),p.order(),p.exit().remove(),p.each(function(t,o){var s=n.select(this),c=0===o,p=h.getFromId(e,t,"y"),d=p._name,g=i[d],m={data:[],layout:{xaxis:{type:r.type,domain:[0,1],range:i.range.slice(),calendar:r.calendar},width:i._width,height:i._height,margin:{t:0,b:0,l:0,r:0}},_context:e._context};m.layout[d]={type:p.type,domain:[0,1],range:"match"!==g.rangemode?g.range.slice():p.range.slice(),calendar:p.calendar},a.supplyDefaults(m);var v={id:t,plotgroup:s,xaxis:m._fullLayout.xaxis,yaxis:m._fullLayout[d],isRangePlot:!0};c?l=v:(v.mainplot="xy",v.mainplotinfo=l),u.rangePlot(e,v,function(t,e){for(var r=[],n=0;n<t.length;n++){var i=t[n],a=i[0].trace;a.xaxis+a.yaxis===e&&r.push(i)}return r}(f,t))})}function y(t,e,r,n,i){(o.ensureSingle(t,"rect",d.maskMinClassName,function(t){t.attr({x:0,y:0,"shape-rendering":"crispEdges"})}).attr("height",n._height).call(l.fill,d.maskColor),o.ensureSingle(t,"rect",d.maskMaxClassName,function(t){t.attr({y:0,"shape-rendering":"crispEdges"})}).attr("height",n._height).call(l.fill,d.maskColor),"match"!==i.rangemode)&&(o.ensureSingle(t,"rect",d.maskMinOppAxisClassName,function(t){t.attr({y:0,"shape-rendering":"crispEdges"})}).attr("width",n._width).call(l.fill,d.maskOppAxisColor),o.ensureSingle(t,"rect",d.maskMaxOppAxisClassName,function(t){t.attr({y:0,"shape-rendering":"crispEdges"})}).attr("width",n._width).style("border-top",d.maskOppBorder).call(l.fill,d.maskOppAxisColor))}function x(t,e,r,n){e._context.staticPlot||o.ensureSingle(t,"rect",d.slideBoxClassName,function(t){t.attr({y:0,cursor:d.slideBoxCursor,"shape-rendering":"crispEdges"})}).attr({height:n._height,fill:d.slideBoxFill})}function b(t,e,r,n){var i=o.ensureSingle(t,"g",d.grabberMinClassName),a=o.ensureSingle(t,"g",d.grabberMaxClassName),s={x:0,width:d.handleWidth,rx:d.handleRadius,fill:l.background,stroke:l.defaultLine,"stroke-width":d.handleStrokeWidth,"shape-rendering":"crispEdges"},c={y:Math.round(n._height/4),height:Math.round(n._height/2)};if(o.ensureSingle(i,"rect",d.handleMinClassName,function(t){t.attr(s)}).attr(c),o.ensureSingle(a,"rect",d.handleMaxClassName,function(t){t.attr(s)}).attr(c),!e._context.staticPlot){var u={width:d.grabAreaWidth,x:0,y:0,fill:d.grabAreaFill,cursor:d.grabAreaCursor};o.ensureSingle(i,"rect",d.grabAreaMinClassName,function(t){t.attr(u)}).attr("height",n._height),o.ensureSingle(a,"rect",d.grabAreaMaxClassName,function(t){t.attr(u)}).attr("height",n._height)}}e.exports=function(t){var e=t._fullLayout,r=function(t){var e=h.list({_fullLayout:t},"x",!0),r=d.name,n=[];if(t._has("gl2d"))return n;for(var i=0;i<e.length;i++){var a=e[i];a[r]&&a[r].visible&&n.push(a)}return n}(e);var s=e._infolayer.selectAll("g."+d.containerClassName).data(r,function(t){return t._name});s.enter().append("g").classed(d.containerClassName,!0).attr("pointer-events","all"),s.exit().each(function(t){var r=t[d.name];e._topdefs.select("#"+r._clipId).remove()}).remove(),0!==r.length&&s.each(function(r){var s=n.select(this),l=r[d.name],u=e[h.id2name(r.anchor)],_=l[h.id2name(r.anchor)];if(l.range){var w=l.range,k=r.range;w[0]=r.l2r(Math.min(r.r2l(w[0]),r.r2l(k[0]))),w[1]=r.l2r(Math.max(r.r2l(w[1]),r.r2l(k[1]))),l._input.range=w.slice()}r.cleanRange("rangeslider.range");for(var M=e.margin,A=e._size,T=r.domain,S=(r._boundingBox||{}).height||0,E=1/0,C=h.getSubplots(t,r),L=0;L<C.length;L++){var z=h.getFromId(t,C[L].substr(C[L].indexOf("y")));E=Math.min(E,z.domain[0])}l._id=d.name+r._id,l._clipId=l._id+"-"+e._uid,l._width=A.w*(T[1]-T[0]),l._height=(e.height-M.b-M.t)*l.thickness,l._offsetShift=Math.floor(l.borderwidth/2);var P=Math.round(M.l+A.w*T[0]),I=Math.round(A.t+A.h*(1-E)+S+l._offsetShift+d.extraPad);s.attr("transform","translate("+P+","+I+")");var O=r.r2l(l.range[0]),D=r.r2l(l.range[1]),R=D-O;if(l.p2d=function(t){return t/l._width*R+O},l.d2p=function(t){return(t-O)/R*l._width},l._rl=[O,D],"match"!==_.rangemode){var B=u.r2l(_.range[0]),F=u.r2l(_.range[1])-B;l.d2pOppAxis=function(t){return(t-B)/F*l._height}}s.call(g,t,r,l).call(m,t,r,l).call(v,t,r,l).call(y,t,r,l,_).call(x,t,r,l).call(b,t,r,l),function(t,e,r,a){var s=t.select("rect."+d.slideBoxClassName).node(),l=t.select("rect."+d.grabAreaMinClassName).node(),c=t.select("rect."+d.grabAreaMaxClassName).node();t.on("mousedown",function(){var u=n.event,h=u.target,d=u.clientX,g=d-t.node().getBoundingClientRect().left,m=a.d2p(r._rl[0]),v=a.d2p(r._rl[1]),y=f.coverSlip();function x(t){var u,f,x,b=+t.clientX-d;switch(h){case s:x="ew-resize",u=m+b,f=v+b;break;case l:x="col-resize",u=m+b,f=v;break;case c:x="col-resize",u=m,f=v+b;break;default:x="ew-resize",u=g,f=g+b}if(f<u){var _=f;f=u,u=_}a._pixelMin=u,a._pixelMax=f,p(n.select(y),x),function(t,e,r,n){function a(t){return r.l2r(o.constrain(t,n._rl[0],n._rl[1]))}var s=a(n.p2d(n._pixelMin)),l=a(n.p2d(n._pixelMax));window.requestAnimationFrame(function(){i.call("relayout",e,r._name+".range",[s,l])})}(0,e,r,a)}y.addEventListener("mousemove",x),y.addEventListener("mouseup",function t(){y.removeEventListener("mousemove",x);y.removeEventListener("mouseup",t);o.removeElement(y)})})}(s,t,r,l),function(t,e,r,n,i,a){var s=d.handleWidth/2;function l(t){return o.constrain(t,0,n._width)}function c(t){return o.constrain(t,0,n._height)}function u(t){return o.constrain(t,-s,n._width+s)}var h=l(n.d2p(r._rl[0])),f=l(n.d2p(r._rl[1]));if(t.select("rect."+d.slideBoxClassName).attr("x",h).attr("width",f-h),t.select("rect."+d.maskMinClassName).attr("width",h),t.select("rect."+d.maskMaxClassName).attr("x",f).attr("width",n._width-f),"match"!==a.rangemode){var p=n._height-c(n.d2pOppAxis(i._rl[1])),g=n._height-c(n.d2pOppAxis(i._rl[0]));t.select("rect."+d.maskMinOppAxisClassName).attr("x",h).attr("height",p).attr("width",f-h),t.select("rect."+d.maskMaxOppAxisClassName).attr("x",h).attr("y",g).attr("height",n._height-g).attr("width",f-h),t.select("rect."+d.slideBoxClassName).attr("y",p).attr("height",g-p)}var m=Math.round(u(h-s))-.5,v=Math.round(u(f-s))+.5;t.select("g."+d.grabberMinClassName).attr("transform","translate("+m+",0.5)"),t.select("g."+d.grabberMaxClassName).attr("transform","translate("+v+",0.5)")}(s,0,r,l,u,_),"bottom"===r.side&&c.draw(t,r._id+"title",{propContainer:r,propName:r._name+".title",placeholder:e._dfltTitle.x,attributes:{x:r._offset+r._length/2,y:I+l._height+l._offsetShift+10+1.5*r.titlefont.size,"text-anchor":"middle"}}),a.autoMargin(t,l._id,{x:T[0],y:E,l:0,r:0,t:0,b:l._height+M.b+S,pad:d.extraPad+2*l._offsetShift})})}},{"../../lib":684,"../../lib/setcursor":704,"../../plots/cartesian":743,"../../plots/cartesian/axes":732,"../../plots/plots":795,"../../registry":817,"../color":558,"../dragelement":580,"../drawing":583,"../titles":649,"./constants":632,d3:147}],635:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./attributes"),a=t("./oppaxis_attributes");e.exports={moduleType:"component",name:"rangeslider",schema:{subplots:{xaxis:{rangeslider:n.extendFlat({},i,{yaxis:a})}}},layoutAttributes:t("./attributes"),handleDefaults:t("./defaults"),calcAutorange:t("./calc_autorange"),draw:t("./draw")}},{"../../lib":684,"./attributes":630,"./calc_autorange":631,"./defaults":633,"./draw":634,"./oppaxis_attributes":636}],636:[function(t,e,r){"use strict";e.exports={_isSubplotObj:!0,rangemode:{valType:"enumerated",values:["auto","fixed","match"],dflt:"match",editType:"calc"},range:{valType:"info_array",items:[{valType:"any",editType:"plot"},{valType:"any",editType:"plot"}],editType:"plot"},editType:"calc"}},{}],637:[function(t,e,r){"use strict";var n=t("../annotations/attributes"),i=t("../../traces/scatter/attributes").line,a=t("../drawing/attributes").dash,o=t("../../lib/extend").extendFlat,s=t("../../plot_api/plot_template").templatedArray;e.exports=s("shape",{visible:{valType:"boolean",dflt:!0,editType:"calcIfAutorange+arraydraw"},type:{valType:"enumerated",values:["circle","rect","path","line"],editType:"calcIfAutorange+arraydraw"},layer:{valType:"enumerated",values:["below","above"],dflt:"above",editType:"arraydraw"},xref:o({},n.xref,{}),xsizemode:{valType:"enumerated",values:["scaled","pixel"],dflt:"scaled",editType:"calcIfAutorange+arraydraw"},xanchor:{valType:"any",editType:"calcIfAutorange+arraydraw"},x0:{valType:"any",editType:"calcIfAutorange+arraydraw"},x1:{valType:"any",editType:"calcIfAutorange+arraydraw"},yref:o({},n.yref,{}),ysizemode:{valType:"enumerated",values:["scaled","pixel"],dflt:"scaled",editType:"calcIfAutorange+arraydraw"},yanchor:{valType:"any",editType:"calcIfAutorange+arraydraw"},y0:{valType:"any",editType:"calcIfAutorange+arraydraw"},y1:{valType:"any",editType:"calcIfAutorange+arraydraw"},path:{valType:"string",editType:"calcIfAutorange+arraydraw"},opacity:{valType:"number",min:0,max:1,dflt:1,editType:"arraydraw"},line:{color:o({},i.color,{editType:"arraydraw"}),width:o({},i.width,{editType:"calcIfAutorange+arraydraw"}),dash:o({},a,{editType:"arraydraw"}),editType:"calcIfAutorange+arraydraw"},fillcolor:{valType:"color",dflt:"rgba(0,0,0,0)",editType:"arraydraw"},editType:"arraydraw"})},{"../../lib/extend":673,"../../plot_api/plot_template":722,"../../traces/scatter/attributes":1015,"../annotations/attributes":541,"../drawing/attributes":582}],638:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes"),a=t("./constants"),o=t("./helpers");function s(t){return c(t.line.width,t.xsizemode,t.x0,t.x1,t.path,!1)}function l(t){return c(t.line.width,t.ysizemode,t.y0,t.y1,t.path,!0)}function c(t,e,r,i,s,l){var c=t/2,u=l;if("pixel"===e){var h=s?o.extractPathCoords(s,l?a.paramIsY:a.paramIsX):[r,i],f=n.aggNums(Math.max,null,h),p=n.aggNums(Math.min,null,h),d=p<0?Math.abs(p)+c:c,g=f>0?f+c:c;return{ppad:c,ppadplus:u?d:g,ppadminus:u?g:d}}return{ppad:c}}function u(t,e,r,n,i){var s="category"===t.type?t.r2c:t.d2c;if(void 0!==e)return[s(e),s(r)];if(n){var l,c,u,h,f=1/0,p=-1/0,d=n.match(a.segmentRE);for("date"===t.type&&(s=o.decodeDate(s)),l=0;l<d.length;l++)void 0!==(c=i[d[l].charAt(0)].drawn)&&(!(u=d[l].substr(1).match(a.paramRE))||u.length<c||((h=s(u[c]))<f&&(f=h),h>p&&(p=h)));return p>=f?[f,p]:void 0}}e.exports=function(t){var e=t._fullLayout,r=n.filterVisible(e.shapes);if(r.length&&t._fullData.length)for(var o=0;o<r.length;o++){var c,h,f=r[o];if("paper"!==f.xref){var p="pixel"===f.xsizemode?f.xanchor:f.x0,d="pixel"===f.xsizemode?f.xanchor:f.x1;(h=u(c=i.getFromId(t,f.xref),p,d,f.path,a.paramIsX))&&i.expand(c,h,s(f))}if("paper"!==f.yref){var g="pixel"===f.ysizemode?f.yanchor:f.y0,m="pixel"===f.ysizemode?f.yanchor:f.y1;(h=u(c=i.getFromId(t,f.yref),g,m,f.path,a.paramIsY))&&i.expand(c,h,l(f))}}}},{"../../lib":684,"../../plots/cartesian/axes":732,"./constants":639,"./helpers":642}],639:[function(t,e,r){"use strict";e.exports={segmentRE:/[MLHVQCTSZ][^MLHVQCTSZ]*/g,paramRE:/[^\s,]+/g,paramIsX:{M:{0:!0,drawn:0},L:{0:!0,drawn:0},H:{0:!0,drawn:0},V:{},Q:{0:!0,2:!0,drawn:2},C:{0:!0,2:!0,4:!0,drawn:4},T:{0:!0,drawn:0},S:{0:!0,2:!0,drawn:2},Z:{}},paramIsY:{M:{1:!0,drawn:1},L:{1:!0,drawn:1},H:{},V:{0:!0,drawn:0},Q:{1:!0,3:!0,drawn:3},C:{1:!0,3:!0,5:!0,drawn:5},T:{1:!0,drawn:1},S:{1:!0,3:!0,drawn:5},Z:{}},numParams:{M:2,L:2,H:1,V:1,Q:4,C:6,T:2,S:4,Z:0}}},{}],640:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes"),a=t("../../plots/array_container_defaults"),o=t("./attributes"),s=t("./helpers");function l(t,e,r){function a(r,i){return n.coerce(t,e,o,r,i)}if(a("visible")){a("layer"),a("opacity"),a("fillcolor"),a("line.color"),a("line.width"),a("line.dash");for(var l=a("type",t.path?"path":"rect"),c=a("xsizemode"),u=a("ysizemode"),h=["x","y"],f=0;f<2;f++){var p,d,g,m=h[f],v=m+"anchor",y="x"===m?c:u,x={_fullLayout:r},b=i.coerceRef(t,e,x,m,"","paper");if("paper"!==b?(p=i.getFromId(x,b),g=s.rangeToShapePosition(p),d=s.shapePositionToRange(p)):d=g=n.identity,"path"!==l){var _=m+"0",w=m+"1",k=t[_],M=t[w];t[_]=d(t[_],!0),t[w]=d(t[w],!0),"pixel"===y?(a(_,0),a(w,10)):(i.coercePosition(e,x,a,b,_,.25),i.coercePosition(e,x,a,b,w,.75)),e[_]=g(e[_]),e[w]=g(e[w]),t[_]=k,t[w]=M}if("pixel"===y){var A=t[v];t[v]=d(t[v],!0),i.coercePosition(e,x,a,b,v,.25),e[v]=g(e[v]),t[v]=A}}"path"===l?a("path"):n.noneOrAll(t,e,["x0","x1","y0","y1"])}}e.exports=function(t,e){a(t,e,{name:"shapes",handleItemDefaults:l})}},{"../../lib":684,"../../plots/array_container_defaults":728,"../../plots/cartesian/axes":732,"./attributes":637,"./helpers":642}],641:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib"),a=t("../../plots/cartesian/axes"),o=t("../color"),s=t("../drawing"),l=t("../../plot_api/plot_template").arrayEditor,c=t("../dragelement"),u=t("../../lib/setcursor"),h=t("./constants"),f=t("./helpers");function p(t,e){t._fullLayout._paperdiv.selectAll('.shapelayer [data-index="'+e+'"]').remove();var r=t._fullLayout.shapes[e]||{};if(r._input&&!1!==r.visible)if("below"!==r.layer)v(t._fullLayout._shapeUpperLayer);else if("paper"===r.xref||"paper"===r.yref)v(t._fullLayout._shapeLowerLayer);else{var p=t._fullLayout._plots[r.xref+r.yref];if(p)v((p.mainplotinfo||p).shapelayer);else v(t._fullLayout._shapeLowerLayer)}function v(p){var v={"data-index":e,"fill-rule":"evenodd",d:g(t,r)},y=r.line.width?r.line.color:"rgba(0,0,0,0)",x=p.append("path").attr(v).style("opacity",r.opacity).call(o.stroke,y).call(o.fill,r.fillcolor).call(s.dashLine,r.line.dash,r.line.width);d(x,t,r),t._context.edits.shapePosition&&function(t,e,r,o,p){var v,y,x,b,_,w,k,M,A,T,S,E,C,L,z,P,I=10,O=10,D="pixel"===r.xsizemode,R="pixel"===r.ysizemode,B="line"===r.type,F="path"===r.type,N=l(t.layout,"shapes",r),j=N.modifyItem,V=a.getFromId(t,r.xref),U=a.getFromId(t,r.yref),q=f.getDataToPixel(t,V),H=f.getDataToPixel(t,U,!0),G=f.getPixelToData(t,V),W=f.getPixelToData(t,U,!0),Y=B?function(){var t=Math.max(r.line.width,10),n=p.append("g").attr("data-index",o);n.append("path").attr("d",e.attr("d")).style({cursor:"move","stroke-width":t,"stroke-opacity":"0"});var i={"fill-opacity":"0"},a=t/2>10?t/2:10;return n.append("circle").attr({"data-line-point":"start-point",cx:D?q(r.xanchor)+r.x0:q(r.x0),cy:R?H(r.yanchor)-r.y0:H(r.y0),r:a}).style(i).classed("cursor-grab",!0),n.append("circle").attr({"data-line-point":"end-point",cx:D?q(r.xanchor)+r.x1:q(r.x1),cy:R?H(r.yanchor)-r.y1:H(r.y1),r:a}).style(i).classed("cursor-grab",!0),n}():e,X={element:Y.node(),gd:t,prepFn:function(n){D&&(_=q(r.xanchor));R&&(w=H(r.yanchor));"path"===r.type?z=r.path:(v=D?r.x0:q(r.x0),y=R?r.y0:H(r.y0),x=D?r.x1:q(r.x1),b=R?r.y1:H(r.y1));v<x?(A=v,C="x0",T=x,L="x1"):(A=x,C="x1",T=v,L="x0");!R&&y<b||R&&y>b?(k=y,S="y0",M=b,E="y1"):(k=b,S="y1",M=y,E="y0");Z(n),K(p,r),function(t,e,r){var n=e.xref,i=e.yref,o=a.getFromId(r,n),l=a.getFromId(r,i),c="";"paper"===n||o.autorange||(c+=n);"paper"===i||l.autorange||(c+=i);t.call(s.setClipUrl,c?"clip"+r._fullLayout._uid+c:null)}(e,r,t),X.moveFn="move"===P?$:J},doneFn:function(){u(e),Q(p),d(e,t,r),n.call("relayout",t,N.getUpdateObj())},clickFn:function(){Q(p)}};function Z(t){if(B)P="path"===t.target.tagName?"move":"start-point"===t.target.attributes["data-line-point"].value?"resize-over-start-point":"resize-over-end-point";else{var r=X.element.getBoundingClientRect(),n=r.right-r.left,i=r.bottom-r.top,a=t.clientX-r.left,o=t.clientY-r.top,s=!F&&n>I&&i>O&&!t.shiftKey?c.getCursor(a/n,1-o/i):"move";u(e,s),P=s.split("-")[0]}}function $(n,i){if("path"===r.type){var a=function(t){return t},o=a,s=a;D?j("xanchor",r.xanchor=G(_+n)):(o=function(t){return G(q(t)+n)},V&&"date"===V.type&&(o=f.encodeDate(o))),R?j("yanchor",r.yanchor=W(w+i)):(s=function(t){return W(H(t)+i)},U&&"date"===U.type&&(s=f.encodeDate(s))),j("path",r.path=m(z,o,s))}else D?j("xanchor",r.xanchor=G(_+n)):(j("x0",r.x0=G(v+n)),j("x1",r.x1=G(x+n))),R?j("yanchor",r.yanchor=W(w+i)):(j("y0",r.y0=W(y+i)),j("y1",r.y1=W(b+i)));e.attr("d",g(t,r)),K(p,r)}function J(n,i){if(F){var a=function(t){return t},o=a,s=a;D?j("xanchor",r.xanchor=G(_+n)):(o=function(t){return G(q(t)+n)},V&&"date"===V.type&&(o=f.encodeDate(o))),R?j("yanchor",r.yanchor=W(w+i)):(s=function(t){return W(H(t)+i)},U&&"date"===U.type&&(s=f.encodeDate(s))),j("path",r.path=m(z,o,s))}else if(B){if("resize-over-start-point"===P){var l=v+n,c=R?y-i:y+i;j("x0",r.x0=D?l:G(l)),j("y0",r.y0=R?c:W(c))}else if("resize-over-end-point"===P){var u=x+n,h=R?b-i:b+i;j("x1",r.x1=D?u:G(u)),j("y1",r.y1=R?h:W(h))}}else{var d=~P.indexOf("n")?k+i:k,N=~P.indexOf("s")?M+i:M,Y=~P.indexOf("w")?A+n:A,X=~P.indexOf("e")?T+n:T;~P.indexOf("n")&&R&&(d=k-i),~P.indexOf("s")&&R&&(N=M-i),(!R&&N-d>O||R&&d-N>O)&&(j(S,r[S]=R?d:W(d)),j(E,r[E]=R?N:W(N))),X-Y>I&&(j(C,r[C]=D?Y:G(Y)),j(L,r[L]=D?X:G(X)))}e.attr("d",g(t,r)),K(p,r)}function K(t,e){(D||R)&&function(){var r="path"!==e.type,n=t.selectAll(".visual-cue").data([0]);n.enter().append("path").attr({fill:"#fff","fill-rule":"evenodd",stroke:"#000","stroke-width":1}).classed("visual-cue",!0);var a=q(D?e.xanchor:i.midRange(r?[e.x0,e.x1]:f.extractPathCoords(e.path,h.paramIsX))),o=H(R?e.yanchor:i.midRange(r?[e.y0,e.y1]:f.extractPathCoords(e.path,h.paramIsY)));if(a=f.roundPositionForSharpStrokeRendering(a,1),o=f.roundPositionForSharpStrokeRendering(o,1),D&&R){var s="M"+(a-1-1)+","+(o-1-1)+"h-8v2h8 v8h2v-8 h8v-2h-8 v-8h-2 Z";n.attr("d",s)}else if(D){var l="M"+(a-1-1)+","+(o-9-1)+"v18 h2 v-18 Z";n.attr("d",l)}else{var c="M"+(a-9-1)+","+(o-1-1)+"h18 v2 h-18 Z";n.attr("d",c)}}()}function Q(t){t.selectAll(".visual-cue").remove()}c.init(X),Y.node().onmousemove=Z}(t,x,r,e,p)}}function d(t,e,r){var n=(r.xref+r.yref).replace(/paper/g,"");t.call(s.setClipUrl,n?"clip"+e._fullLayout._uid+n:null)}function g(t,e){var r,n,o,s,l,c,u,p,d=e.type,g=a.getFromId(t,e.xref),m=a.getFromId(t,e.yref),v=t._fullLayout._size;if(g?(r=f.shapePositionToRange(g),n=function(t){return g._offset+g.r2p(r(t,!0))}):n=function(t){return v.l+v.w*t},m?(o=f.shapePositionToRange(m),s=function(t){return m._offset+m.r2p(o(t,!0))}):s=function(t){return v.t+v.h*(1-t)},"path"===d)return g&&"date"===g.type&&(n=f.decodeDate(n)),m&&"date"===m.type&&(s=f.decodeDate(s)),function(t,e,r){var n=t.path,a=t.xsizemode,o=t.ysizemode,s=t.xanchor,l=t.yanchor;return n.replace(h.segmentRE,function(t){var n=0,c=t.charAt(0),u=h.paramIsX[c],f=h.paramIsY[c],p=h.numParams[c],d=t.substr(1).replace(h.paramRE,function(t){return u[n]?t="pixel"===a?e(s)+Number(t):e(t):f[n]&&(t="pixel"===o?r(l)-Number(t):r(t)),++n>p&&(t="X"),t});return n>p&&(d=d.replace(/[\s,]*X.*/,""),i.log("Ignoring extra params in segment "+t)),c+d})}(e,n,s);if("pixel"===e.xsizemode){var y=n(e.xanchor);l=y+e.x0,c=y+e.x1}else l=n(e.x0),c=n(e.x1);if("pixel"===e.ysizemode){var x=s(e.yanchor);u=x-e.y0,p=x-e.y1}else u=s(e.y0),p=s(e.y1);if("line"===d)return"M"+l+","+u+"L"+c+","+p;if("rect"===d)return"M"+l+","+u+"H"+c+"V"+p+"H"+l+"Z";var b=(l+c)/2,_=(u+p)/2,w=Math.abs(b-l),k=Math.abs(_-u),M="A"+w+","+k,A=b+w+","+_;return"M"+A+M+" 0 1,1 "+(b+","+(_-k))+M+" 0 0,1 "+A+"Z"}function m(t,e,r){return t.replace(h.segmentRE,function(t){var n=0,i=t.charAt(0),a=h.paramIsX[i],o=h.paramIsY[i],s=h.numParams[i];return i+t.substr(1).replace(h.paramRE,function(t){return n>=s?t:(a[n]?t=e(t):o[n]&&(t=r(t)),n++,t)})})}e.exports={draw:function(t){var e=t._fullLayout;for(var r in e._shapeUpperLayer.selectAll("path").remove(),e._shapeLowerLayer.selectAll("path").remove(),e._plots){var n=e._plots[r].shapelayer;n&&n.selectAll("path").remove()}for(var i=0;i<e.shapes.length;i++)e.shapes[i].visible&&p(t,i)},drawOne:p}},{"../../lib":684,"../../lib/setcursor":704,"../../plot_api/plot_template":722,"../../plots/cartesian/axes":732,"../../registry":817,"../color":558,"../dragelement":580,"../drawing":583,"./constants":639,"./helpers":642}],642:[function(t,e,r){"use strict";var n=t("./constants"),i=t("../../lib");r.rangeToShapePosition=function(t){return"log"===t.type?t.r2d:function(t){return t}},r.shapePositionToRange=function(t){return"log"===t.type?t.d2r:function(t){return t}},r.decodeDate=function(t){return function(e){return e.replace&&(e=e.replace("_"," ")),t(e)}},r.encodeDate=function(t){return function(e){return t(e).replace(" ","_")}},r.extractPathCoords=function(t,e){var r=[];return t.match(n.segmentRE).forEach(function(t){var a=e[t.charAt(0)].drawn;if(void 0!==a){var o=t.substr(1).match(n.paramRE);!o||o.length<a||r.push(i.cleanNumber(o[a]))}}),r},r.getDataToPixel=function(t,e,n){var i,a=t._fullLayout._size;if(e){var o=r.shapePositionToRange(e);i=function(t){return e._offset+e.r2p(o(t,!0))},"date"===e.type&&(i=r.decodeDate(i))}else i=n?function(t){return a.t+a.h*(1-t)}:function(t){return a.l+a.w*t};return i},r.getPixelToData=function(t,e,n){var i,a=t._fullLayout._size;if(e){var o=r.rangeToShapePosition(e);i=function(t){return o(e.p2r(t-e._offset))}}else i=n?function(t){return 1-(t-a.t)/a.h}:function(t){return(t-a.l)/a.w};return i},r.roundPositionForSharpStrokeRendering=function(t,e){var r=1===Math.round(e%2),n=Math.round(t);return r?n+.5:n}},{"../../lib":684,"./constants":639}],643:[function(t,e,r){"use strict";var n=t("./draw");e.exports={moduleType:"component",name:"shapes",layoutAttributes:t("./attributes"),supplyLayoutDefaults:t("./defaults"),includeBasePlot:t("../../plots/cartesian/include_components")("shapes"),calcAutorange:t("./calc_autorange"),draw:n.draw,drawOne:n.drawOne}},{"../../plots/cartesian/include_components":742,"./attributes":637,"./calc_autorange":638,"./defaults":640,"./draw":641}],644:[function(t,e,r){"use strict";var n=t("../../plots/font_attributes"),i=t("../../plots/pad_attributes"),a=t("../../lib/extend").extendDeepAll,o=t("../../plot_api/edit_types").overrideAll,s=t("../../plots/animation_attributes"),l=t("../../plot_api/plot_template").templatedArray,c=t("./constants"),u=l("step",{visible:{valType:"boolean",dflt:!0},method:{valType:"enumerated",values:["restyle","relayout","animate","update","skip"],dflt:"restyle"},args:{valType:"info_array",freeLength:!0,items:[{valType:"any"},{valType:"any"},{valType:"any"}]},label:{valType:"string"},value:{valType:"string"},execute:{valType:"boolean",dflt:!0}});e.exports=o(l("slider",{visible:{valType:"boolean",dflt:!0},active:{valType:"number",min:0,dflt:0},steps:u,lenmode:{valType:"enumerated",values:["fraction","pixels"],dflt:"fraction"},len:{valType:"number",min:0,dflt:1},x:{valType:"number",min:-2,max:3,dflt:0},pad:a({},i,{},{t:{dflt:20}}),xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"left"},y:{valType:"number",min:-2,max:3,dflt:0},yanchor:{valType:"enumerated",values:["auto","top","middle","bottom"],dflt:"top"},transition:{duration:{valType:"number",min:0,dflt:150},easing:{valType:"enumerated",values:s.transition.easing.values,dflt:"cubic-in-out"}},currentvalue:{visible:{valType:"boolean",dflt:!0},xanchor:{valType:"enumerated",values:["left","center","right"],dflt:"left"},offset:{valType:"number",dflt:10},prefix:{valType:"string"},suffix:{valType:"string"},font:n({})},font:n({}),activebgcolor:{valType:"color",dflt:c.gripBgActiveColor},bgcolor:{valType:"color",dflt:c.railBgColor},bordercolor:{valType:"color",dflt:c.railBorderColor},borderwidth:{valType:"number",min:0,dflt:c.railBorderWidth},ticklen:{valType:"number",min:0,dflt:c.tickLength},tickcolor:{valType:"color",dflt:c.tickColor},tickwidth:{valType:"number",min:0,dflt:1},minorticklen:{valType:"number",min:0,dflt:c.minorTickLength}}),"arraydraw","from-root")},{"../../lib/extend":673,"../../plot_api/edit_types":715,"../../plot_api/plot_template":722,"../../plots/animation_attributes":727,"../../plots/font_attributes":758,"../../plots/pad_attributes":794,"./constants":645}],645:[function(t,e,r){"use strict";e.exports={name:"sliders",containerClassName:"slider-container",groupClassName:"slider-group",inputAreaClass:"slider-input-area",railRectClass:"slider-rail-rect",railTouchRectClass:"slider-rail-touch-rect",gripRectClass:"slider-grip-rect",tickRectClass:"slider-tick-rect",inputProxyClass:"slider-input-proxy",labelsClass:"slider-labels",labelGroupClass:"slider-label-group",labelClass:"slider-label",currentValueClass:"slider-current-value",railHeight:5,menuIndexAttrName:"slider-active-index",autoMarginIdRoot:"slider-",minWidth:30,minHeight:30,textPadX:40,arrowOffsetX:4,railRadius:2,railWidth:5,railBorder:4,railBorderWidth:1,railBorderColor:"#bec8d9",railBgColor:"#f8fafc",railInset:8,stepInset:10,gripRadius:10,gripWidth:20,gripHeight:20,gripBorder:20,gripBorderWidth:1,gripBorderColor:"#bec8d9",gripBgColor:"#f6f8fa",gripBgActiveColor:"#dbdde0",labelPadding:8,labelOffset:0,tickWidth:1,tickColor:"#333",tickOffset:25,tickLength:7,minorTickOffset:25,minorTickColor:"#333",minorTickLength:4,currentValuePadding:8,currentValueInset:0}},{}],646:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/array_container_defaults"),a=t("./attributes"),o=t("./constants").name,s=a.steps;function l(t,e,r){function o(r,i){return n.coerce(t,e,a,r,i)}for(var s=i(t,e,{name:"steps",handleItemDefaults:c}),l=0,u=0;u<s.length;u++)s[u].visible&&l++;if(l<2?e.visible=!1:o("visible")){e._stepCount=l;var h=e._visibleSteps=n.filterVisible(s);(s[o("active")]||{}).visible||(e.active=h[0]._index),o("x"),o("y"),n.noneOrAll(t,e,["x","y"]),o("xanchor"),o("yanchor"),o("len"),o("lenmode"),o("pad.t"),o("pad.r"),o("pad.b"),o("pad.l"),n.coerceFont(o,"font",r.font),o("currentvalue.visible")&&(o("currentvalue.xanchor"),o("currentvalue.prefix"),o("currentvalue.suffix"),o("currentvalue.offset"),n.coerceFont(o,"currentvalue.font",e.font)),o("transition.duration"),o("transition.easing"),o("bgcolor"),o("activebgcolor"),o("bordercolor"),o("borderwidth"),o("ticklen"),o("tickwidth"),o("tickcolor"),o("minorticklen")}}function c(t,e){function r(r,i){return n.coerce(t,e,s,r,i)}if("skip"===t.method||Array.isArray(t.args)?r("visible"):e.visible=!1){r("method"),r("args");var i=r("label","step-"+e._index);r("value",i),r("execute")}}e.exports=function(t,e){i(t,e,{name:o,handleItemDefaults:l})}},{"../../lib":684,"../../plots/array_container_defaults":728,"./attributes":644,"./constants":645}],647:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../plots/plots"),a=t("../color"),o=t("../drawing"),s=t("../../lib"),l=t("../../lib/svg_text_utils"),c=t("../legend/anchor_utils"),u=t("../../plot_api/plot_template").arrayEditor,h=t("./constants"),f=t("../../constants/alignment"),p=f.LINE_SPACING,d=f.FROM_TL,g=f.FROM_BR;function m(t){return h.autoMarginIdRoot+t._index}function v(t){return t._index}function y(t,e){var r=o.tester.selectAll("g."+h.labelGroupClass).data(e._visibleSteps);r.enter().append("g").classed(h.labelGroupClass,!0);var a=0,s=0;r.each(function(t){var r=_(n.select(this),{step:t},e).node();if(r){var i=o.bBox(r);s=Math.max(s,i.height),a=Math.max(a,i.width)}}),r.remove();var u=e._dims={};u.inputAreaWidth=Math.max(h.railWidth,h.gripHeight);var f=t._fullLayout._size;u.lx=f.l+f.w*e.x,u.ly=f.t+f.h*(1-e.y),"fraction"===e.lenmode?u.outerLength=Math.round(f.w*e.len):u.outerLength=e.len,u.inputAreaStart=0,u.inputAreaLength=Math.round(u.outerLength-e.pad.l-e.pad.r);var p=(u.inputAreaLength-2*h.stepInset)/(e._stepCount-1),v=a+h.labelPadding;if(u.labelStride=Math.max(1,Math.ceil(v/p)),u.labelHeight=s,u.currentValueMaxWidth=0,u.currentValueHeight=0,u.currentValueTotalHeight=0,u.currentValueMaxLines=1,e.currentvalue.visible){var y=o.tester.append("g");r.each(function(t){var r=x(y,e,t.label),n=r.node()&&o.bBox(r.node())||{width:0,height:0},i=l.lineCount(r);u.currentValueMaxWidth=Math.max(u.currentValueMaxWidth,Math.ceil(n.width)),u.currentValueHeight=Math.max(u.currentValueHeight,Math.ceil(n.height)),u.currentValueMaxLines=Math.max(u.currentValueMaxLines,i)}),u.currentValueTotalHeight=u.currentValueHeight+e.currentvalue.offset,y.remove()}u.height=u.currentValueTotalHeight+h.tickOffset+e.ticklen+h.labelOffset+u.labelHeight+e.pad.t+e.pad.b;var b="left";c.isRightAnchor(e)&&(u.lx-=u.outerLength,b="right"),c.isCenterAnchor(e)&&(u.lx-=u.outerLength/2,b="center");var w="top";c.isBottomAnchor(e)&&(u.ly-=u.height,w="bottom"),c.isMiddleAnchor(e)&&(u.ly-=u.height/2,w="middle"),u.outerLength=Math.ceil(u.outerLength),u.height=Math.ceil(u.height),u.lx=Math.round(u.lx),u.ly=Math.round(u.ly);var k={y:e.y,b:u.height*g[w],t:u.height*d[w]};"fraction"===e.lenmode?(k.l=0,k.xl=e.x-e.len*d[b],k.r=0,k.xr=e.x+e.len*g[b]):(k.x=e.x,k.l=u.outerLength*d[b],k.r=u.outerLength*g[b]),i.autoMargin(t,m(e),k)}function x(t,e,r){if(e.currentvalue.visible){var n,i,a=e._dims;switch(e.currentvalue.xanchor){case"right":n=a.inputAreaLength-h.currentValueInset-a.currentValueMaxWidth,i="left";break;case"center":n=.5*a.inputAreaLength,i="middle";break;default:n=h.currentValueInset,i="left"}var c=s.ensureSingle(t,"text",h.labelClass,function(t){t.classed("user-select-none",!0).attr({"text-anchor":i,"data-notex":1})}),u=e.currentvalue.prefix?e.currentvalue.prefix:"";if("string"==typeof r)u+=r;else u+=e.steps[e.active].label;e.currentvalue.suffix&&(u+=e.currentvalue.suffix),c.call(o.font,e.currentvalue.font).text(u).call(l.convertToTspans,e._gd);var f=l.lineCount(c),d=(a.currentValueMaxLines+1-f)*e.currentvalue.font.size*p;return l.positionText(c,n,d),c}}function b(t,e,r){s.ensureSingle(t,"rect",h.gripRectClass,function(n){n.call(A,e,t,r).style("pointer-events","all")}).attr({width:h.gripWidth,height:h.gripHeight,rx:h.gripRadius,ry:h.gripRadius}).call(a.stroke,r.bordercolor).call(a.fill,r.bgcolor).style("stroke-width",r.borderwidth+"px")}function _(t,e,r){var n=s.ensureSingle(t,"text",h.labelClass,function(t){t.classed("user-select-none",!0).attr({"text-anchor":"middle","data-notex":1})});return n.call(o.font,r.font).text(e.step.label).call(l.convertToTspans,r._gd),n}function w(t,e){var r=s.ensureSingle(t,"g",h.labelsClass),i=e._dims,a=r.selectAll("g."+h.labelGroupClass).data(i.labelSteps);a.enter().append("g").classed(h.labelGroupClass,!0),a.exit().remove(),a.each(function(t){var r=n.select(this);r.call(_,t,e),o.setTranslate(r,E(e,t.fraction),h.tickOffset+e.ticklen+e.font.size*p+h.labelOffset+i.currentValueTotalHeight)})}function k(t,e,r,n,i){var a=Math.round(n*(r._stepCount-1)),o=r._visibleSteps[a]._index;o!==r.active&&M(t,e,r,o,!0,i)}function M(t,e,r,n,a,o){var s=r.active;r.active=n,u(t.layout,h.name,r).applyUpdate("active",n);var l=r.steps[r.active];e.call(S,r,o),e.call(x,r),t.emit("plotly_sliderchange",{slider:r,step:r.steps[r.active],interaction:a,previousActive:s}),l&&l.method&&a&&(e._nextMethod?(e._nextMethod.step=l,e._nextMethod.doCallback=a,e._nextMethod.doTransition=o):(e._nextMethod={step:l,doCallback:a,doTransition:o},e._nextMethodRaf=window.requestAnimationFrame(function(){var r=e._nextMethod.step;r.method&&(r.execute&&i.executeAPICommand(t,r.method,r.args),e._nextMethod=null,e._nextMethodRaf=null)})))}function A(t,e,r){var i=r.node(),o=n.select(e);function s(){return r.data()[0]}t.on("mousedown",function(){var t=s();e.emit("plotly_sliderstart",{slider:t});var l=r.select("."+h.gripRectClass);n.event.stopPropagation(),n.event.preventDefault(),l.call(a.fill,t.activebgcolor);var c=C(t,n.mouse(i)[0]);k(e,r,t,c,!0),t._dragging=!0,o.on("mousemove",function(){var t=s(),a=C(t,n.mouse(i)[0]);k(e,r,t,a,!1)}),o.on("mouseup",function(){var t=s();t._dragging=!1,l.call(a.fill,t.bgcolor),o.on("mouseup",null),o.on("mousemove",null),e.emit("plotly_sliderend",{slider:t,step:t.steps[t.active]})})})}function T(t,e){var r=t.selectAll("rect."+h.tickRectClass).data(e._visibleSteps),i=e._dims;r.enter().append("rect").classed(h.tickRectClass,!0),r.exit().remove(),r.attr({width:e.tickwidth+"px","shape-rendering":"crispEdges"}),r.each(function(t,r){var s=r%i.labelStride==0,l=n.select(this);l.attr({height:s?e.ticklen:e.minorticklen}).call(a.fill,e.tickcolor),o.setTranslate(l,E(e,r/(e._stepCount-1))-.5*e.tickwidth,(s?h.tickOffset:h.minorTickOffset)+i.currentValueTotalHeight)})}function S(t,e,r){for(var n=t.select("rect."+h.gripRectClass),i=0,a=0;a<e._stepCount;a++)if(e._visibleSteps[a]._index===e.active){i=a;break}var o=E(e,i/(e._stepCount-1));if(!e._invokingCommand){var s=n;r&&e.transition.duration>0&&(s=s.transition().duration(e.transition.duration).ease(e.transition.easing)),s.attr("transform","translate("+(o-.5*h.gripWidth)+","+e._dims.currentValueTotalHeight+")")}}function E(t,e){var r=t._dims;return r.inputAreaStart+h.stepInset+(r.inputAreaLength-2*h.stepInset)*Math.min(1,Math.max(0,e))}function C(t,e){var r=t._dims;return Math.min(1,Math.max(0,(e-h.stepInset-r.inputAreaStart)/(r.inputAreaLength-2*h.stepInset-2*r.inputAreaStart)))}function L(t,e,r){var n=r._dims,i=s.ensureSingle(t,"rect",h.railTouchRectClass,function(n){n.call(A,e,t,r).style("pointer-events","all")});i.attr({width:n.inputAreaLength,height:Math.max(n.inputAreaWidth,h.tickOffset+r.ticklen+n.labelHeight)}).call(a.fill,r.bgcolor).attr("opacity",0),o.setTranslate(i,0,n.currentValueTotalHeight)}function z(t,e){var r=e._dims,n=r.inputAreaLength-2*h.railInset,i=s.ensureSingle(t,"rect",h.railRectClass);i.attr({width:n,height:h.railWidth,rx:h.railRadius,ry:h.railRadius,"shape-rendering":"crispEdges"}).call(a.stroke,e.bordercolor).call(a.fill,e.bgcolor).style("stroke-width",e.borderwidth+"px"),o.setTranslate(i,h.railInset,.5*(r.inputAreaWidth-h.railWidth)+r.currentValueTotalHeight)}e.exports=function(t){var e=t._fullLayout,r=function(t,e){for(var r=t[h.name],n=[],i=0;i<r.length;i++){var a=r[i];a.visible&&(a._gd=e,n.push(a))}return n}(e,t),a=e._infolayer.selectAll("g."+h.containerClassName).data(r.length>0?[0]:[]);function s(e){e._commandObserver&&(e._commandObserver.remove(),delete e._commandObserver),i.autoMargin(t,m(e))}if(a.enter().append("g").classed(h.containerClassName,!0).style("cursor","ew-resize"),a.exit().each(function(){n.select(this).selectAll("g."+h.groupClassName).each(s)}).remove(),0!==r.length){var l=a.selectAll("g."+h.groupClassName).data(r,v);l.enter().append("g").classed(h.groupClassName,!0),l.exit().each(s).remove();for(var c=0;c<r.length;c++){var u=r[c];y(t,u)}l.each(function(e){var r=n.select(this);!function(t){var e=t._dims;e.labelSteps=[];for(var r=t._stepCount,n=0;n<r;n+=e.labelStride)e.labelSteps.push({fraction:n/(r-1),step:t._visibleSteps[n]})}(e),i.manageCommandObserver(t,e,e._visibleSteps,function(e){var n=r.data()[0];n.active!==e.index&&(n._dragging||M(t,r,n,e.index,!1,!0))}),function(t,e,r){(r.steps[r.active]||{}).visible||(r.active=r._visibleSteps[0]._index);e.call(x,r).call(z,r).call(w,r).call(T,r).call(L,t,r).call(b,t,r);var n=r._dims;o.setTranslate(e,n.lx+r.pad.l,n.ly+r.pad.t),e.call(S,r,!1),e.call(x,r)}(t,n.select(this),e)})}}},{"../../constants/alignment":656,"../../lib":684,"../../lib/svg_text_utils":708,"../../plot_api/plot_template":722,"../../plots/plots":795,"../color":558,"../drawing":583,"../legend/anchor_utils":610,"./constants":645,d3:147}],648:[function(t,e,r){"use strict";var n=t("./constants");e.exports={moduleType:"component",name:n.name,layoutAttributes:t("./attributes"),supplyLayoutDefaults:t("./defaults"),draw:t("./draw")}},{"./attributes":644,"./constants":645,"./defaults":646,"./draw":647}],649:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("../../plots/plots"),o=t("../../registry"),s=t("../../lib"),l=t("../drawing"),c=t("../color"),u=t("../../lib/svg_text_utils"),h=t("../../constants/interactions");e.exports={draw:function(t,e,r){var p,d=r.propContainer,g=r.propName,m=r.placeholder,v=r.traceIndex,y=r.avoid||{},x=r.attributes,b=r.transform,_=r.containerGroup,w=t._fullLayout,k=d.titlefont||{},M=k.family,A=k.size,T=k.color,S=1,E=!1,C=(d.title||"").trim();"title"===g?p="titleText":-1!==g.indexOf("axis")?p="axisTitleText":g.indexOf(!0)&&(p="colorbarTitleText");var L=t._context.edits[p];""===C?S=0:C.replace(f," % ")===m.replace(f," % ")&&(S=.2,E=!0,L||(C=""));var z=C||L;_||(_=s.ensureSingle(w._infolayer,"g","g-"+e));var P=_.selectAll("text").data(z?[0]:[]);if(P.enter().append("text"),P.text(C).attr("class",e),P.exit().remove(),!z)return _;function I(t){s.syncOrAsync([O,D],t)}function O(e){var r;return b?(r="",b.rotate&&(r+="rotate("+[b.rotate,x.x,x.y]+")"),b.offset&&(r+="translate(0, "+b.offset+")")):r=null,e.attr("transform",r),e.style({"font-family":M,"font-size":n.round(A,2)+"px",fill:c.rgb(T),opacity:S*c.opacity(T),"font-weight":a.fontWeight}).attr(x).call(u.convertToTspans,t),a.previousPromises(t)}function D(t){var e=n.select(t.node().parentNode);if(y&&y.selection&&y.side&&C){e.attr("transform",null);var r=0,a={left:"right",right:"left",top:"bottom",bottom:"top"}[y.side],o=-1!==["left","top"].indexOf(y.side)?-1:1,c=i(y.pad)?y.pad:2,u=l.bBox(e.node()),h={left:0,top:0,right:w.width,bottom:w.height},f=y.maxShift||(h[y.side]-u[y.side])*("left"===y.side||"top"===y.side?-1:1);if(f<0)r=f;else{var p=y.offsetLeft||0,d=y.offsetTop||0;u.left-=p,u.right-=p,u.top-=d,u.bottom-=d,y.selection.each(function(){var t=l.bBox(this);s.bBoxIntersect(u,t,c)&&(r=Math.max(r,o*(t[y.side]-u[a])+c))}),r=Math.min(f,r)}if(r>0||f<0){var g={left:[-r,0],right:[r,0],top:[0,-r],bottom:[0,r]}[y.side];e.attr("transform","translate("+g+")")}}}P.call(I),L&&(C?P.on(".opacity",null):(S=0,E=!0,P.text(m).on("mouseover.opacity",function(){n.select(this).transition().duration(h.SHOW_PLACEHOLDER).style("opacity",1)}).on("mouseout.opacity",function(){n.select(this).transition().duration(h.HIDE_PLACEHOLDER).style("opacity",0)})),P.call(u.makeEditable,{gd:t}).on("edit",function(e){void 0!==v?o.call("restyle",t,g,e,v):o.call("relayout",t,g,e)}).on("cancel",function(){this.text(this.attr("data-unformatted")).call(I)}).on("input",function(t){this.text(t||" ").call(u.positionText,x.x,x.y)}));return P.classed("js-placeholder",E),_}};var f=/ [XY][0-9]* /},{"../../constants/interactions":660,"../../lib":684,"../../lib/svg_text_utils":708,"../../plots/plots":795,"../../registry":817,"../color":558,"../drawing":583,d3:147,"fast-isnumeric":214}],650:[function(t,e,r){"use strict";var n=t("../../plots/font_attributes"),i=t("../color/attributes"),a=t("../../lib/extend").extendFlat,o=t("../../plot_api/edit_types").overrideAll,s=t("../../plots/pad_attributes"),l=t("../../plot_api/plot_template").templatedArray,c=l("button",{visible:{valType:"boolean"},method:{valType:"enumerated",values:["restyle","relayout","animate","update","skip"],dflt:"restyle"},args:{valType:"info_array",freeLength:!0,items:[{valType:"any"},{valType:"any"},{valType:"any"}]},label:{valType:"string",dflt:""},execute:{valType:"boolean",dflt:!0}});e.exports=o(l("updatemenu",{_arrayAttrRegexps:[/^updatemenus\[(0|[1-9][0-9]+)\]\.buttons/],visible:{valType:"boolean"},type:{valType:"enumerated",values:["dropdown","buttons"],dflt:"dropdown"},direction:{valType:"enumerated",values:["left","right","up","down"],dflt:"down"},active:{valType:"integer",min:-1,dflt:0},showactive:{valType:"boolean",dflt:!0},buttons:c,x:{valType:"number",min:-2,max:3,dflt:-.05},xanchor:{valType:"enumerated",values:["auto","left","center","right"],dflt:"right"},y:{valType:"number",min:-2,max:3,dflt:1},yanchor:{valType:"enumerated",values:["auto","top","middle","bottom"],dflt:"top"},pad:a({},s,{}),font:n({}),bgcolor:{valType:"color"},bordercolor:{valType:"color",dflt:i.borderLine},borderwidth:{valType:"number",min:0,dflt:1,editType:"arraydraw"}}),"arraydraw","from-root")},{"../../lib/extend":673,"../../plot_api/edit_types":715,"../../plot_api/plot_template":722,"../../plots/font_attributes":758,"../../plots/pad_attributes":794,"../color/attributes":557}],651:[function(t,e,r){"use strict";e.exports={name:"updatemenus",containerClassName:"updatemenu-container",headerGroupClassName:"updatemenu-header-group",headerClassName:"updatemenu-header",headerArrowClassName:"updatemenu-header-arrow",dropdownButtonGroupClassName:"updatemenu-dropdown-button-group",dropdownButtonClassName:"updatemenu-dropdown-button",buttonClassName:"updatemenu-button",itemRectClassName:"updatemenu-item-rect",itemTextClassName:"updatemenu-item-text",menuIndexAttrName:"updatemenu-active-index",autoMarginIdRoot:"updatemenu-",blankHeaderOpts:{label:"  "},minWidth:30,minHeight:30,textPadX:24,arrowPadX:16,rx:2,ry:2,textOffsetX:12,textOffsetY:3,arrowOffsetX:4,gapButtonHeader:5,gapButton:2,activeColor:"#F4FAFF",hoverColor:"#F4FAFF",arrowSymbol:{left:"\u25c4",right:"\u25ba",up:"\u25b2",down:"\u25bc"}}},{}],652:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/array_container_defaults"),a=t("./attributes"),o=t("./constants").name,s=a.buttons;function l(t,e,r){function o(r,i){return n.coerce(t,e,a,r,i)}o("visible",i(t,e,{name:"buttons",handleItemDefaults:c}).length>0)&&(o("active"),o("direction"),o("type"),o("showactive"),o("x"),o("y"),n.noneOrAll(t,e,["x","y"]),o("xanchor"),o("yanchor"),o("pad.t"),o("pad.r"),o("pad.b"),o("pad.l"),n.coerceFont(o,"font",r.font),o("bgcolor",r.paper_bgcolor),o("bordercolor"),o("borderwidth"))}function c(t,e){function r(r,i){return n.coerce(t,e,s,r,i)}r("visible","skip"===t.method||Array.isArray(t.args))&&(r("method"),r("args"),r("label"),r("execute"))}e.exports=function(t,e){i(t,e,{name:o,handleItemDefaults:l})}},{"../../lib":684,"../../plots/array_container_defaults":728,"./attributes":650,"./constants":651}],653:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../plots/plots"),a=t("../color"),o=t("../drawing"),s=t("../../lib"),l=t("../../lib/svg_text_utils"),c=t("../legend/anchor_utils"),u=t("../../plot_api/plot_template").arrayEditor,h=t("../../constants/alignment").LINE_SPACING,f=t("./constants"),p=t("./scrollbox");function d(t){return t._index}function g(t,e){return+t.attr(f.menuIndexAttrName)===e._index}function m(t,e,r,n,i,a,o,s){e.active=o,u(t.layout,f.name,e).applyUpdate("active",o),"buttons"===e.type?y(t,n,null,null,e):"dropdown"===e.type&&(i.attr(f.menuIndexAttrName,"-1"),v(t,n,i,a,e),s||y(t,n,i,a,e))}function v(t,e,r,n,i){var a=s.ensureSingle(e,"g",f.headerClassName,function(t){t.style("pointer-events","all")}),l=i._dims,c=i.active,u=i.buttons[c]||f.blankHeaderOpts,h={y:i.pad.t,yPad:0,x:i.pad.l,xPad:0,index:0},p={width:l.headerWidth,height:l.headerHeight};a.call(x,i,u,t).call(S,i,h,p),s.ensureSingle(e,"text",f.headerArrowClassName,function(t){t.classed("user-select-none",!0).attr("text-anchor","end").call(o.font,i.font).text(f.arrowSymbol[i.direction])}).attr({x:l.headerWidth-f.arrowOffsetX+i.pad.l,y:l.headerHeight/2+f.textOffsetY+i.pad.t}),a.on("click",function(){r.call(E,String(g(r,i)?-1:i._index)),y(t,e,r,n,i)}),a.on("mouseover",function(){a.call(k)}),a.on("mouseout",function(){a.call(M,i)}),o.setTranslate(e,l.lx,l.ly)}function y(t,e,r,a,o){r||(r=e).attr("pointer-events","all");var l=function(t){return-1==+t.attr(f.menuIndexAttrName)}(r)&&"buttons"!==o.type?[]:o.buttons,c="dropdown"===o.type?f.dropdownButtonClassName:f.buttonClassName,u=r.selectAll("g."+c).data(s.filterVisible(l)),h=u.enter().append("g").classed(c,!0),p=u.exit();"dropdown"===o.type?(h.attr("opacity","0").transition().attr("opacity","1"),p.transition().attr("opacity","0").remove()):p.remove();var d=0,g=0,v=o._dims,y=-1!==["up","down"].indexOf(o.direction);"dropdown"===o.type&&(y?g=v.headerHeight+f.gapButtonHeader:d=v.headerWidth+f.gapButtonHeader),"dropdown"===o.type&&"up"===o.direction&&(g=-f.gapButtonHeader+f.gapButton-v.openHeight),"dropdown"===o.type&&"left"===o.direction&&(d=-f.gapButtonHeader+f.gapButton-v.openWidth);var b={x:v.lx+d+o.pad.l,y:v.ly+g+o.pad.t,yPad:f.gapButton,xPad:f.gapButton,index:0},_={l:b.x+o.borderwidth,t:b.y+o.borderwidth};u.each(function(s,l){var c=n.select(this);c.call(x,o,s,t).call(S,o,b),c.on("click",function(){n.event.defaultPrevented||(m(t,o,0,e,r,a,l),s.execute&&i.executeAPICommand(t,s.method,s.args),t.emit("plotly_buttonclicked",{menu:o,button:s,active:o.active}))}),c.on("mouseover",function(){c.call(k)}),c.on("mouseout",function(){c.call(M,o),u.call(w,o)})}),u.call(w,o),y?(_.w=Math.max(v.openWidth,v.headerWidth),_.h=b.y-_.t):(_.w=b.x-_.l,_.h=Math.max(v.openHeight,v.headerHeight)),_.direction=o.direction,a&&(u.size()?function(t,e,r,n,i,a){var o,s,l,c=i.direction,u="up"===c||"down"===c,h=i._dims,p=i.active;if(u)for(s=0,l=0;l<p;l++)s+=h.heights[l]+f.gapButton;else for(o=0,l=0;l<p;l++)o+=h.widths[l]+f.gapButton;n.enable(a,o,s),n.hbar&&n.hbar.attr("opacity","0").transition().attr("opacity","1");n.vbar&&n.vbar.attr("opacity","0").transition().attr("opacity","1")}(0,0,0,a,o,_):function(t){var e=!!t.hbar,r=!!t.vbar;e&&t.hbar.transition().attr("opacity","0").each("end",function(){e=!1,r||t.disable()});r&&t.vbar.transition().attr("opacity","0").each("end",function(){r=!1,e||t.disable()})}(a))}function x(t,e,r,n){t.call(b,e).call(_,e,r,n)}function b(t,e){s.ensureSingle(t,"rect",f.itemRectClassName,function(t){t.attr({rx:f.rx,ry:f.ry,"shape-rendering":"crispEdges"})}).call(a.stroke,e.bordercolor).call(a.fill,e.bgcolor).style("stroke-width",e.borderwidth+"px")}function _(t,e,r,n){s.ensureSingle(t,"text",f.itemTextClassName,function(t){t.classed("user-select-none",!0).attr({"text-anchor":"start","data-notex":1})}).call(o.font,e.font).text(r.label).call(l.convertToTspans,n)}function w(t,e){var r=e.active;t.each(function(t,i){var o=n.select(this);i===r&&e.showactive&&o.select("rect."+f.itemRectClassName).call(a.fill,f.activeColor)})}function k(t){t.select("rect."+f.itemRectClassName).call(a.fill,f.hoverColor)}function M(t,e){t.select("rect."+f.itemRectClassName).call(a.fill,e.bgcolor)}function A(t,e){var r=e._dims={width1:0,height1:0,heights:[],widths:[],totalWidth:0,totalHeight:0,openWidth:0,openHeight:0,lx:0,ly:0},a=o.tester.selectAll("g."+f.dropdownButtonClassName).data(s.filterVisible(e.buttons));a.enter().append("g").classed(f.dropdownButtonClassName,!0);var u=-1!==["up","down"].indexOf(e.direction);a.each(function(i,a){var s=n.select(this);s.call(x,e,i,t);var c=s.select("."+f.itemTextClassName),p=c.node()&&o.bBox(c.node()).width,d=Math.max(p+f.textPadX,f.minWidth),g=e.font.size*h,m=l.lineCount(c),v=Math.max(g*m,f.minHeight)+f.textOffsetY;v=Math.ceil(v),d=Math.ceil(d),r.widths[a]=d,r.heights[a]=v,r.height1=Math.max(r.height1,v),r.width1=Math.max(r.width1,d),u?(r.totalWidth=Math.max(r.totalWidth,d),r.openWidth=r.totalWidth,r.totalHeight+=v+f.gapButton,r.openHeight+=v+f.gapButton):(r.totalWidth+=d+f.gapButton,r.openWidth+=d+f.gapButton,r.totalHeight=Math.max(r.totalHeight,v),r.openHeight=r.totalHeight)}),u?r.totalHeight-=f.gapButton:r.totalWidth-=f.gapButton,r.headerWidth=r.width1+f.arrowPadX,r.headerHeight=r.height1,"dropdown"===e.type&&(u?(r.width1+=f.arrowPadX,r.totalHeight=r.height1):r.totalWidth=r.width1,r.totalWidth+=f.arrowPadX),a.remove();var p=r.totalWidth+e.pad.l+e.pad.r,d=r.totalHeight+e.pad.t+e.pad.b,g=t._fullLayout._size;r.lx=g.l+g.w*e.x,r.ly=g.t+g.h*(1-e.y);var m="left";c.isRightAnchor(e)&&(r.lx-=p,m="right"),c.isCenterAnchor(e)&&(r.lx-=p/2,m="center");var v="top";c.isBottomAnchor(e)&&(r.ly-=d,v="bottom"),c.isMiddleAnchor(e)&&(r.ly-=d/2,v="middle"),r.totalWidth=Math.ceil(r.totalWidth),r.totalHeight=Math.ceil(r.totalHeight),r.lx=Math.round(r.lx),r.ly=Math.round(r.ly),i.autoMargin(t,T(e),{x:e.x,y:e.y,l:p*({right:1,center:.5}[m]||0),r:p*({left:1,center:.5}[m]||0),b:d*({top:1,middle:.5}[v]||0),t:d*({bottom:1,middle:.5}[v]||0)})}function T(t){return f.autoMarginIdRoot+t._index}function S(t,e,r,n){n=n||{};var i=t.select("."+f.itemRectClassName),a=t.select("."+f.itemTextClassName),s=e.borderwidth,c=r.index,u=e._dims;o.setTranslate(t,s+r.x,s+r.y);var p=-1!==["up","down"].indexOf(e.direction),d=n.height||(p?u.heights[c]:u.height1);i.attr({x:0,y:0,width:n.width||(p?u.width1:u.widths[c]),height:d});var g=e.font.size*h,m=(l.lineCount(a)-1)*g/2;l.positionText(a,f.textOffsetX,d/2-m+f.textOffsetY),p?r.y+=u.heights[c]+r.yPad:r.x+=u.widths[c]+r.xPad,r.index++}function E(t,e){t.attr(f.menuIndexAttrName,e||"-1").selectAll("g."+f.dropdownButtonClassName).remove()}e.exports=function(t){var e=t._fullLayout,r=s.filterVisible(e[f.name]);function a(e){i.autoMargin(t,T(e))}var o=e._menulayer.selectAll("g."+f.containerClassName).data(r.length>0?[0]:[]);if(o.enter().append("g").classed(f.containerClassName,!0).style("cursor","pointer"),o.exit().each(function(){n.select(this).selectAll("g."+f.headerGroupClassName).each(a)}).remove(),0!==r.length){var l=o.selectAll("g."+f.headerGroupClassName).data(r,d);l.enter().append("g").classed(f.headerGroupClassName,!0);for(var c=s.ensureSingle(o,"g",f.dropdownButtonGroupClassName,function(t){t.style("pointer-events","all")}),u=0;u<r.length;u++){var h=r[u];A(t,h)}var x="updatemenus"+e._uid,b=new p(t,c,x);l.enter().size()&&(c.node().parentNode.appendChild(c.node()),c.call(E)),l.exit().each(function(t){c.call(E),a(t)}).remove(),l.each(function(e){var r=n.select(this),a="dropdown"===e.type?c:null;i.manageCommandObserver(t,e,e.buttons,function(n){m(t,e,e.buttons[n.index],r,a,b,n.index,!0)}),"dropdown"===e.type?(v(t,r,c,b,e),g(c,e)&&y(t,r,c,b,e)):y(t,r,null,null,e)})}}},{"../../constants/alignment":656,"../../lib":684,"../../lib/svg_text_utils":708,"../../plot_api/plot_template":722,"../../plots/plots":795,"../color":558,"../drawing":583,"../legend/anchor_utils":610,"./constants":651,"./scrollbox":655,d3:147}],654:[function(t,e,r){arguments[4][648][0].apply(r,arguments)},{"./attributes":650,"./constants":651,"./defaults":652,"./draw":653,dup:648}],655:[function(t,e,r){"use strict";e.exports=s;var n=t("d3"),i=t("../color"),a=t("../drawing"),o=t("../../lib");function s(t,e,r){this.gd=t,this.container=e,this.id=r,this.position=null,this.translateX=null,this.translateY=null,this.hbar=null,this.vbar=null,this.bg=this.container.selectAll("rect.scrollbox-bg").data([0]),this.bg.exit().on(".drag",null).on("wheel",null).remove(),this.bg.enter().append("rect").classed("scrollbox-bg",!0).style("pointer-events","all").attr({opacity:0,x:0,y:0,width:0,height:0})}s.barWidth=2,s.barLength=20,s.barRadius=2,s.barPad=1,s.barColor="#808BA4",s.prototype.enable=function(t,e,r){var o=this.gd._fullLayout,l=o.width,c=o.height;this.position=t;var u,h,f,p,d=this.position.l,g=this.position.w,m=this.position.t,v=this.position.h,y=this.position.direction,x="down"===y,b="left"===y,_="up"===y,w=g,k=v;x||b||"right"===y||_||(this.position.direction="down",x=!0),x||_?(h=(u=d)+w,x?(f=m,k=(p=Math.min(f+k,c))-f):k=(p=m+k)-(f=Math.max(p-k,0))):(p=(f=m)+k,b?w=(h=d+w)-(u=Math.max(h-w,0)):(u=d,w=(h=Math.min(u+w,l))-u)),this._box={l:u,t:f,w:w,h:k};var M=g>w,A=s.barLength+2*s.barPad,T=s.barWidth+2*s.barPad,S=d,E=m+v;E+T>c&&(E=c-T);var C=this.container.selectAll("rect.scrollbar-horizontal").data(M?[0]:[]);C.exit().on(".drag",null).remove(),C.enter().append("rect").classed("scrollbar-horizontal",!0).call(i.fill,s.barColor),M?(this.hbar=C.attr({rx:s.barRadius,ry:s.barRadius,x:S,y:E,width:A,height:T}),this._hbarXMin=S+A/2,this._hbarTranslateMax=w-A):(delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax);var L=v>k,z=s.barWidth+2*s.barPad,P=s.barLength+2*s.barPad,I=d+g,O=m;I+z>l&&(I=l-z);var D=this.container.selectAll("rect.scrollbar-vertical").data(L?[0]:[]);D.exit().on(".drag",null).remove(),D.enter().append("rect").classed("scrollbar-vertical",!0).call(i.fill,s.barColor),L?(this.vbar=D.attr({rx:s.barRadius,ry:s.barRadius,x:I,y:O,width:z,height:P}),this._vbarYMin=O+P/2,this._vbarTranslateMax=k-P):(delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax);var R=this.id,B=u-.5,F=L?h+z+.5:h+.5,N=f-.5,j=M?p+T+.5:p+.5,V=o._topdefs.selectAll("#"+R).data(M||L?[0]:[]);if(V.exit().remove(),V.enter().append("clipPath").attr("id",R).append("rect"),M||L?(this._clipRect=V.select("rect").attr({x:Math.floor(B),y:Math.floor(N),width:Math.ceil(F)-Math.floor(B),height:Math.ceil(j)-Math.floor(N)}),this.container.call(a.setClipUrl,R),this.bg.attr({x:d,y:m,width:g,height:v})):(this.bg.attr({width:0,height:0}),this.container.on("wheel",null).on(".drag",null).call(a.setClipUrl,null),delete this._clipRect),M||L){var U=n.behavior.drag().on("dragstart",function(){n.event.sourceEvent.preventDefault()}).on("drag",this._onBoxDrag.bind(this));this.container.on("wheel",null).on("wheel",this._onBoxWheel.bind(this)).on(".drag",null).call(U);var q=n.behavior.drag().on("dragstart",function(){n.event.sourceEvent.preventDefault(),n.event.sourceEvent.stopPropagation()}).on("drag",this._onBarDrag.bind(this));M&&this.hbar.on(".drag",null).call(q),L&&this.vbar.on(".drag",null).call(q)}this.setTranslate(e,r)},s.prototype.disable=function(){(this.hbar||this.vbar)&&(this.bg.attr({width:0,height:0}),this.container.on("wheel",null).on(".drag",null).call(a.setClipUrl,null),delete this._clipRect),this.hbar&&(this.hbar.on(".drag",null),this.hbar.remove(),delete this.hbar,delete this._hbarXMin,delete this._hbarTranslateMax),this.vbar&&(this.vbar.on(".drag",null),this.vbar.remove(),delete this.vbar,delete this._vbarYMin,delete this._vbarTranslateMax)},s.prototype._onBoxDrag=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t-=n.event.dx),this.vbar&&(e-=n.event.dy),this.setTranslate(t,e)},s.prototype._onBoxWheel=function(){var t=this.translateX,e=this.translateY;this.hbar&&(t+=n.event.deltaY),this.vbar&&(e+=n.event.deltaY),this.setTranslate(t,e)},s.prototype._onBarDrag=function(){var t=this.translateX,e=this.translateY;if(this.hbar){var r=t+this._hbarXMin,i=r+this._hbarTranslateMax;t=(o.constrain(n.event.x,r,i)-r)/(i-r)*(this.position.w-this._box.w)}if(this.vbar){var a=e+this._vbarYMin,s=a+this._vbarTranslateMax;e=(o.constrain(n.event.y,a,s)-a)/(s-a)*(this.position.h-this._box.h)}this.setTranslate(t,e)},s.prototype.setTranslate=function(t,e){var r=this.position.w-this._box.w,n=this.position.h-this._box.h;if(t=o.constrain(t||0,0,r),e=o.constrain(e||0,0,n),this.translateX=t,this.translateY=e,this.container.call(a.setTranslate,this._box.l-this.position.l-t,this._box.t-this.position.t-e),this._clipRect&&this._clipRect.attr({x:Math.floor(this.position.l+t-.5),y:Math.floor(this.position.t+e-.5)}),this.hbar){var i=t/r;this.hbar.call(a.setTranslate,t+i*this._hbarTranslateMax,e)}if(this.vbar){var s=e/n;this.vbar.call(a.setTranslate,t,e+s*this._vbarTranslateMax)}}},{"../../lib":684,"../color":558,"../drawing":583,d3:147}],656:[function(t,e,r){"use strict";e.exports={FROM_BL:{left:0,center:.5,right:1,bottom:0,middle:.5,top:1},FROM_TL:{left:0,center:.5,right:1,bottom:1,middle:.5,top:0},FROM_BR:{left:1,center:.5,right:0,bottom:0,middle:.5,top:1},LINE_SPACING:1.3,MID_SHIFT:.35,OPPOSITE_SIDE:{left:"right",right:"left",top:"bottom",bottom:"top"}}},{}],657:[function(t,e,r){"use strict";e.exports={COMPARISON_OPS:["=","!=","<",">=",">","<="],COMPARISON_OPS2:["=","<",">=",">","<="],INTERVAL_OPS:["[]","()","[)","(]","][",")(","](",")["],SET_OPS:["{}","}{"],CONSTRAINT_REDUCTION:{"=":"=","<":"<","<=":"<",">":">",">=":">","[]":"[]","()":"[]","[)":"[]","(]":"[]","][":"][",")(":"][","](":"][",")[":"]["}}},{}],658:[function(t,e,r){"use strict";e.exports={solid:[[],0],dot:[[.5,1],200],dash:[[.5,1],50],longdash:[[.5,1],10],dashdot:[[.5,.625,.875,1],50],longdashdot:[[.5,.7,.8,1],10]}},{}],659:[function(t,e,r){"use strict";e.exports={circle:"\u25cf","circle-open":"\u25cb",square:"\u25a0","square-open":"\u25a1",diamond:"\u25c6","diamond-open":"\u25c7",cross:"+",x:"\u274c"}},{}],660:[function(t,e,r){"use strict";e.exports={SHOW_PLACEHOLDER:100,HIDE_PLACEHOLDER:1e3,DBLCLICKDELAY:300,DESELECTDIM:.2}},{}],661:[function(t,e,r){"use strict";e.exports={BADNUM:void 0,FP_SAFE:Number.MAX_VALUE/1e4,ONEAVGYEAR:315576e5,ONEAVGMONTH:26298e5,ONEDAY:864e5,ONEHOUR:36e5,ONEMIN:6e4,ONESEC:1e3,EPOCHJD:2440587.5,ALMOST_EQUAL:1-1e-6,MINUS_SIGN:"\u2212"}},{}],662:[function(t,e,r){"use strict";e.exports={entityToUnicode:{mu:"\u03bc","#956":"\u03bc",amp:"&","#28":"&",lt:"<","#60":"<",gt:">","#62":">",nbsp:"\xa0","#160":"\xa0",times:"\xd7","#215":"\xd7",plusmn:"\xb1","#177":"\xb1",deg:"\xb0","#176":"\xb0"}}},{}],663:[function(t,e,r){"use strict";r.xmlns="http://www.w3.org/2000/xmlns/",r.svg="http://www.w3.org/2000/svg",r.xlink="http://www.w3.org/1999/xlink",r.svgAttrs={xmlns:r.svg,"xmlns:xlink":r.xlink}},{}],664:[function(t,e,r){"use strict";r.version="1.39.4",t("es6-promise").polyfill(),t("../build/plotcss"),t("./fonts/mathjax_config");for(var n=t("./registry"),i=r.register=n.register,a=t("./plot_api"),o=Object.keys(a),s=0;s<o.length;s++){var l=o[s];r[l]=a[l],i({moduleType:"apiMethod",name:l,fn:a[l]})}i(t("./traces/scatter")),i([t("./components/fx"),t("./components/legend"),t("./components/annotations"),t("./components/annotations3d"),t("./components/shapes"),t("./components/images"),t("./components/updatemenus"),t("./components/sliders"),t("./components/rangeslider"),t("./components/rangeselector"),t("./components/grid"),t("./components/errorbars")]),i([t("./locale-en"),t("./locale-en-us")]),r.Icons=t("../build/ploticon"),r.Plots=t("./plots/plots"),r.Fx=t("./components/fx"),r.Snapshot=t("./snapshot"),r.PlotSchema=t("./plot_api/plot_schema"),r.Queue=t("./lib/queue"),r.d3=t("d3")},{"../build/plotcss":1,"../build/ploticon":2,"./components/annotations":549,"./components/annotations3d":554,"./components/errorbars":589,"./components/fx":600,"./components/grid":604,"./components/images":609,"./components/legend":618,"./components/rangeselector":629,"./components/rangeslider":635,"./components/shapes":643,"./components/sliders":648,"./components/updatemenus":654,"./fonts/mathjax_config":665,"./lib/queue":699,"./locale-en":713,"./locale-en-us":712,"./plot_api":717,"./plot_api/plot_schema":721,"./plots/plots":795,"./registry":817,"./snapshot":822,"./traces/scatter":1026,d3:147,"es6-promise":202}],665:[function(t,e,r){"use strict";"undefined"!=typeof MathJax?(r.MathJax=!0,MathJax.Hub.Config({messageStyle:"none",skipStartupTypeset:!0,displayAlign:"left",tex2jax:{inlineMath:[["$","$"],["\\(","\\)"]]}}),MathJax.Hub.Configured()):r.MathJax=!1},{}],666:[function(t,e,r){"use strict";var n=Math.PI;r.deg2rad=function(t){return t/180*n},r.rad2deg=function(t){return t/n*180},r.wrap360=function(t){var e=t%360;return e<0?e+360:e},r.wrap180=function(t){return Math.abs(t)>180&&(t-=360*Math.round(t/360)),t}},{}],667:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../constants/numerical").BADNUM,a=/^['"%,$#\s']+|[, ]|['"%,$#\s']+$/g;e.exports=function(t){return"string"==typeof t&&(t=t.replace(a,"")),n(t)?Number(t):i}},{"../constants/numerical":661,"fast-isnumeric":214}],668:[function(t,e,r){"use strict";e.exports=function(t){var e=t._fullLayout;e._glcanvas&&e._glcanvas.size()&&e._glcanvas.each(function(t){t.regl&&t.regl.clear({color:!0,depth:!0})})}},{}],669:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("tinycolor2"),a=t("../plots/attributes"),o=t("../components/colorscale/get_scale"),s=(Object.keys(t("../components/colorscale/scales")),t("./nested_property")),l=t("./regex").counter,c=t("../constants/interactions").DESELECTDIM,u=t("./angles").wrap180,h=t("./is_array").isArrayOrTypedArray;function f(t,e){var n=r.valObjectMeta[e.valType];if(e.arrayOk&&h(t))return!0;if(n.validateFunction)return n.validateFunction(t,e);var i={},a=i,o={set:function(t){a=t}};return n.coerceFunction(t,o,i,e),a!==i}r.valObjectMeta={data_array:{coerceFunction:function(t,e,r){h(t)?e.set(t):void 0!==r&&e.set(r)}},enumerated:{coerceFunction:function(t,e,r,n){n.coerceNumber&&(t=+t),-1===n.values.indexOf(t)?e.set(r):e.set(t)},validateFunction:function(t,e){e.coerceNumber&&(t=+t);for(var r=e.values,n=0;n<r.length;n++){var i=String(r[n]);if("/"===i.charAt(0)&&"/"===i.charAt(i.length-1)){if(new RegExp(i.substr(1,i.length-2)).test(t))return!0}else if(t===r[n])return!0}return!1}},boolean:{coerceFunction:function(t,e,r){!0===t||!1===t?e.set(t):e.set(r)}},number:{coerceFunction:function(t,e,r,i){!n(t)||void 0!==i.min&&t<i.min||void 0!==i.max&&t>i.max?e.set(r):e.set(+t)}},integer:{coerceFunction:function(t,e,r,i){t%1||!n(t)||void 0!==i.min&&t<i.min||void 0!==i.max&&t>i.max?e.set(r):e.set(+t)}},string:{coerceFunction:function(t,e,r,n){if("string"!=typeof t){var i="number"==typeof t;!0!==n.strict&&i?e.set(String(t)):e.set(r)}else n.noBlank&&!t?e.set(r):e.set(t)}},color:{coerceFunction:function(t,e,r){i(t).isValid()?e.set(t):e.set(r)}},colorlist:{coerceFunction:function(t,e,r){Array.isArray(t)&&t.length&&t.every(function(t){return i(t).isValid()})?e.set(t):e.set(r)}},colorscale:{coerceFunction:function(t,e,r){e.set(o(t,r))}},angle:{coerceFunction:function(t,e,r){"auto"===t?e.set("auto"):n(t)?e.set(u(+t)):e.set(r)}},subplotid:{coerceFunction:function(t,e,r,n){var i=n.regex||l(r);"string"==typeof t&&i.test(t)?e.set(t):e.set(r)},validateFunction:function(t,e){var r=e.dflt;return t===r||"string"==typeof t&&!!l(r).test(t)}},flaglist:{coerceFunction:function(t,e,r,n){if("string"==typeof t)if(-1===(n.extras||[]).indexOf(t)){for(var i=t.split("+"),a=0;a<i.length;){var o=i[a];-1===n.flags.indexOf(o)||i.indexOf(o)<a?i.splice(a,1):a++}i.length?e.set(i.join("+")):e.set(r)}else e.set(t);else e.set(r)}},any:{coerceFunction:function(t,e,r){void 0===t?e.set(r):e.set(t)}},info_array:{coerceFunction:function(t,e,n,i){function a(t,e,n){var i,a={set:function(t){i=t}};return void 0===n&&(n=e.dflt),r.valObjectMeta[e.valType].coerceFunction(t,a,n,e),i}var o=2===i.dimensions||"1-2"===i.dimensions&&Array.isArray(t)&&Array.isArray(t[0]);if(Array.isArray(t)){var s,l,c,u,h,f,p=i.items,d=[],g=Array.isArray(p),m=g&&o&&Array.isArray(p[0]),v=o&&g&&!m,y=g&&!v?p.length:t.length;if(n=Array.isArray(n)?n:[],o)for(s=0;s<y;s++)for(d[s]=[],c=Array.isArray(t[s])?t[s]:[],h=v?p.length:g?p[s].length:c.length,l=0;l<h;l++)u=v?p[l]:g?p[s][l]:p,void 0!==(f=a(c[l],u,(n[s]||[])[l]))&&(d[s][l]=f);else for(s=0;s<y;s++)void 0!==(f=a(t[s],g?p[s]:p,n[s]))&&(d[s]=f);e.set(d)}else e.set(n)},validateFunction:function(t,e){if(!Array.isArray(t))return!1;var r=e.items,n=Array.isArray(r),i=2===e.dimensions;if(!e.freeLength&&t.length!==r.length)return!1;for(var a=0;a<t.length;a++)if(i){if(!Array.isArray(t[a])||!e.freeLength&&t[a].length!==r[a].length)return!1;for(var o=0;o<t[a].length;o++)if(!f(t[a][o],n?r[a][o]:r))return!1}else if(!f(t[a],n?r[a]:r))return!1;return!0}}},r.coerce=function(t,e,n,i,a){var o=s(n,i).get(),l=s(t,i),c=s(e,i),u=l.get(),p=e._template;if(void 0===u&&p&&(u=s(p,i).get(),p=0),void 0===a&&(a=o.dflt),o.arrayOk&&h(u))return c.set(u),u;var d=r.valObjectMeta[o.valType].coerceFunction;d(u,c,a,o);var g=c.get();return p&&g===a&&!f(u,o)&&(d(u=s(p,i).get(),c,a,o),g=c.get()),g},r.coerce2=function(t,e,n,i,a){var o=s(t,i),l=r.coerce(t,e,n,i,a),c=o.get();return null!=c&&l},r.coerceFont=function(t,e,r){var n={};return r=r||{},n.family=t(e+".family",r.family),n.size=t(e+".size",r.size),n.color=t(e+".color",r.color),n},r.coerceHoverinfo=function(t,e,n){var i,o=e._module.attributes,s=o.hoverinfo?o:a,l=s.hoverinfo;if(1===n._dataLength){var c="all"===l.dflt?l.flags.slice():l.dflt.split("+");c.splice(c.indexOf("name"),1),i=c.join("+")}return r.coerce(t,e,s,"hoverinfo",i)},r.coerceSelectionMarkerOpacity=function(t,e){if(t.marker){var r,n,i=t.marker.opacity;if(void 0!==i)h(i)||t.selected||t.unselected||(r=i,n=c*i),e("selected.marker.opacity",r),e("unselected.marker.opacity",n)}},r.validate=f},{"../components/colorscale/get_scale":571,"../components/colorscale/scales":577,"../constants/interactions":660,"../plots/attributes":729,"./angles":666,"./is_array":685,"./nested_property":692,"./regex":700,"fast-isnumeric":214,tinycolor2:499}],670:[function(t,e,r){"use strict";var n,i,a=t("d3"),o=t("fast-isnumeric"),s=t("./loggers"),l=t("./mod"),c=t("../constants/numerical"),u=c.BADNUM,h=c.ONEDAY,f=c.ONEHOUR,p=c.ONEMIN,d=c.ONESEC,g=c.EPOCHJD,m=t("../registry"),v=a.time.format.utc,y=/^\s*(-?\d\d\d\d|\d\d)(-(\d?\d)(-(\d?\d)([ Tt]([01]?\d|2[0-3])(:([0-5]\d)(:([0-5]\d(\.\d+)?))?(Z|z|[+\-]\d\d:?\d\d)?)?)?)?)?\s*$/m,x=/^\s*(-?\d\d\d\d|\d\d)(-(\d?\di?)(-(\d?\d)([ Tt]([01]?\d|2[0-3])(:([0-5]\d)(:([0-5]\d(\.\d+)?))?(Z|z|[+\-]\d\d:?\d\d)?)?)?)?)?\s*$/m,b=(new Date).getFullYear()-70;function _(t){return t&&m.componentsRegistry.calendars&&"string"==typeof t&&"gregorian"!==t}function w(t,e){return String(t+Math.pow(10,e)).substr(1)}r.dateTick0=function(t,e){return _(t)?e?m.getComponentMethod("calendars","CANONICAL_SUNDAY")[t]:m.getComponentMethod("calendars","CANONICAL_TICK")[t]:e?"2000-01-02":"2000-01-01"},r.dfltRange=function(t){return _(t)?m.getComponentMethod("calendars","DFLTRANGE")[t]:["2000-01-01","2001-01-01"]},r.isJSDate=function(t){return"object"==typeof t&&null!==t&&"function"==typeof t.getTime},r.dateTime2ms=function(t,e){if(r.isJSDate(t)){var a=t.getTimezoneOffset()*p,o=(t.getUTCMinutes()-t.getMinutes())*p+(t.getUTCSeconds()-t.getSeconds())*d+(t.getUTCMilliseconds()-t.getMilliseconds());if(o){var s=3*p;a=a-s/2+l(o-a+s/2,s)}return(t=Number(t)-a)>=n&&t<=i?t:u}if("string"!=typeof t&&"number"!=typeof t)return u;t=String(t);var c=_(e),v=t.charAt(0);!c||"G"!==v&&"g"!==v||(t=t.substr(1),e="");var w=c&&"chinese"===e.substr(0,7),k=t.match(w?x:y);if(!k)return u;var M=k[1],A=k[3]||"1",T=Number(k[5]||1),S=Number(k[7]||0),E=Number(k[9]||0),C=Number(k[11]||0);if(c){if(2===M.length)return u;var L;M=Number(M);try{var z=m.getComponentMethod("calendars","getCal")(e);if(w){var P="i"===A.charAt(A.length-1);A=parseInt(A,10),L=z.newDate(M,z.toMonthIndex(M,A,P),T)}else L=z.newDate(M,Number(A),T)}catch(t){return u}return L?(L.toJD()-g)*h+S*f+E*p+C*d:u}M=2===M.length?(Number(M)+2e3-b)%100+b:Number(M),A-=1;var I=new Date(Date.UTC(2e3,A,T,S,E));return I.setUTCFullYear(M),I.getUTCMonth()!==A?u:I.getUTCDate()!==T?u:I.getTime()+C*d},n=r.MIN_MS=r.dateTime2ms("-9999"),i=r.MAX_MS=r.dateTime2ms("9999-12-31 23:59:59.9999"),r.isDateTime=function(t,e){return r.dateTime2ms(t,e)!==u};var k=90*h,M=3*f,A=5*p;function T(t,e,r,n,i){if((e||r||n||i)&&(t+=" "+w(e,2)+":"+w(r,2),(n||i)&&(t+=":"+w(n,2),i))){for(var a=4;i%10==0;)a-=1,i/=10;t+="."+w(i,a)}return t}r.ms2DateTime=function(t,e,r){if("number"!=typeof t||!(t>=n&&t<=i))return u;e||(e=0);var a,o,s,c,y,x,b=Math.floor(10*l(t+.05,1)),w=Math.round(t-b/10);if(_(r)){var S=Math.floor(w/h)+g,E=Math.floor(l(t,h));try{a=m.getComponentMethod("calendars","getCal")(r).fromJD(S).formatDate("yyyy-mm-dd")}catch(t){a=v("G%Y-%m-%d")(new Date(w))}if("-"===a.charAt(0))for(;a.length<11;)a="-0"+a.substr(1);else for(;a.length<10;)a="0"+a;o=e<k?Math.floor(E/f):0,s=e<k?Math.floor(E%f/p):0,c=e<M?Math.floor(E%p/d):0,y=e<A?E%d*10+b:0}else x=new Date(w),a=v("%Y-%m-%d")(x),o=e<k?x.getUTCHours():0,s=e<k?x.getUTCMinutes():0,c=e<M?x.getUTCSeconds():0,y=e<A?10*x.getUTCMilliseconds()+b:0;return T(a,o,s,c,y)},r.ms2DateTimeLocal=function(t){if(!(t>=n+h&&t<=i-h))return u;var e=Math.floor(10*l(t+.05,1)),r=new Date(Math.round(t-e/10));return T(a.time.format("%Y-%m-%d")(r),r.getHours(),r.getMinutes(),r.getSeconds(),10*r.getUTCMilliseconds()+e)},r.cleanDate=function(t,e,n){if(r.isJSDate(t)||"number"==typeof t){if(_(n))return s.error("JS Dates and milliseconds are incompatible with world calendars",t),e;if(!(t=r.ms2DateTimeLocal(+t))&&void 0!==e)return e}else if(!r.isDateTime(t,n))return s.error("unrecognized date",t),e;return t};var S=/%\d?f/g;function E(t,e,r,n){t=t.replace(S,function(t){var r=Math.min(+t.charAt(1)||6,6);return(e/1e3%1+2).toFixed(r).substr(2).replace(/0+$/,"")||"0"});var i=new Date(Math.floor(e+.05));if(_(n))try{t=m.getComponentMethod("calendars","worldCalFmt")(t,e,n)}catch(t){return"Invalid"}return r(t)(i)}var C=[59,59.9,59.99,59.999,59.9999];r.formatDate=function(t,e,r,n,i,a){if(i=_(i)&&i,!e)if("y"===r)e=a.year;else if("m"===r)e=a.month;else{if("d"!==r)return function(t,e){var r=l(t+.05,h),n=w(Math.floor(r/f),2)+":"+w(l(Math.floor(r/p),60),2);if("M"!==e){o(e)||(e=0);var i=(100+Math.min(l(t/d,60),C[e])).toFixed(e).substr(1);e>0&&(i=i.replace(/0+$/,"").replace(/[\.]$/,"")),n+=":"+i}return n}(t,r)+"\n"+E(a.dayMonthYear,t,n,i);e=a.dayMonth+"\n"+a.year}return E(e,t,n,i)};var L=3*h;r.incrementMonth=function(t,e,r){r=_(r)&&r;var n=l(t,h);if(t=Math.round(t-n),r)try{var i=Math.round(t/h)+g,a=m.getComponentMethod("calendars","getCal")(r),o=a.fromJD(i);return e%12?a.add(o,e,"m"):a.add(o,e/12,"y"),(o.toJD()-g)*h+n}catch(e){s.error("invalid ms "+t+" in calendar "+r)}var c=new Date(t+L);return c.setUTCMonth(c.getUTCMonth()+e)+n-L},r.findExactDates=function(t,e){for(var r,n,i=0,a=0,s=0,l=0,c=_(e)&&m.getComponentMethod("calendars","getCal")(e),u=0;u<t.length;u++)if(n=t[u],o(n)){if(!(n%h))if(c)try{1===(r=c.fromJD(n/h+g)).day()?1===r.month()?i++:a++:s++}catch(t){}else 1===(r=new Date(n)).getUTCDate()?0===r.getUTCMonth()?i++:a++:s++}else l++;s+=a+=i;var f=t.length-l;return{exactYears:i/f,exactMonths:a/f,exactDays:s/f}}},{"../constants/numerical":661,"../registry":817,"./loggers":689,"./mod":691,d3:147,"fast-isnumeric":214}],671:[function(t,e,r){"use strict";e.exports=function(t,e){return Array.isArray(t)||(t=[]),t.length=e,t}},{}],672:[function(t,e,r){"use strict";var n=t("events").EventEmitter,i={init:function(t){if(t._ev instanceof n)return t;var e=new n,r=new n;return t._ev=e,t._internalEv=r,t.on=e.on.bind(e),t.once=e.once.bind(e),t.removeListener=e.removeListener.bind(e),t.removeAllListeners=e.removeAllListeners.bind(e),t._internalOn=r.on.bind(r),t._internalOnce=r.once.bind(r),t._removeInternalListener=r.removeListener.bind(r),t._removeAllInternalListeners=r.removeAllListeners.bind(r),t.emit=function(n,i){"undefined"!=typeof jQuery&&jQuery(t).trigger(n,i),e.emit(n,i),r.emit(n,i)},t},triggerHandler:function(t,e,r){var n,i;"undefined"!=typeof jQuery&&(n=jQuery(t).triggerHandler(e,r));var a=t._ev;if(!a)return n;var o,s=a._events[e];if(!s)return n;function l(t){return t.listener?(a.removeListener(e,t.listener),t.fired?void 0:(t.fired=!0,t.listener.apply(a,[r]))):t.apply(a,[r])}for(s=Array.isArray(s)?s:[s],o=0;o<s.length-1;o++)l(s[o]);return i=l(s[o]),void 0!==n?n:i},purge:function(t){return delete t._ev,delete t.on,delete t.once,delete t.removeListener,delete t.removeAllListeners,delete t.emit,delete t._ev,delete t._internalEv,delete t._internalOn,delete t._internalOnce,delete t._removeInternalListener,delete t._removeAllInternalListeners,t}};e.exports=i},{events:212}],673:[function(t,e,r){"use strict";var n=t("./is_plain_object.js"),i=Array.isArray;function a(t,e,r,o){var s,l,c,u,h,f,p=t[0],d=t.length;if(2===d&&i(p)&&i(t[1])&&0===p.length){if(function(t,e){var r,n;for(r=0;r<t.length;r++){if(null!==(n=t[r])&&"object"==typeof n)return!1;void 0!==n&&(e[r]=n)}return!0}(t[1],p))return p;p.splice(0,p.length)}for(var g=1;g<d;g++)for(l in s=t[g])c=p[l],u=s[l],o&&i(u)?p[l]=u:e&&u&&(n(u)||(h=i(u)))?(h?(h=!1,f=c&&i(c)?c:[]):f=c&&n(c)?c:{},p[l]=a([f,u],e,r,o)):("undefined"!=typeof u||r)&&(p[l]=u);return p}r.extendFlat=function(){return a(arguments,!1,!1,!1)},r.extendDeep=function(){return a(arguments,!0,!1,!1)},r.extendDeepAll=function(){return a(arguments,!0,!0,!1)},r.extendDeepNoArrays=function(){return a(arguments,!0,!1,!0)}},{"./is_plain_object.js":686}],674:[function(t,e,r){"use strict";e.exports=function(t){for(var e={},r=[],n=0,i=0;i<t.length;i++){var a=t[i];1!==e[a]&&(e[a]=1,r[n++]=a)}return r}},{}],675:[function(t,e,r){"use strict";function n(t){return!0===t.visible}function i(t){return!0===t[0].trace.visible}e.exports=function(t){for(var e,r=(e=t,Array.isArray(e)&&Array.isArray(e[0])&&e[0][0]&&e[0][0].trace?i:n),a=[],o=0;o<t.length;o++){var s=t[o];r(s)&&a.push(s)}return a}},{}],676:[function(t,e,r){"use strict";var n=t("country-regex"),i=t("../lib"),a=Object.keys(n),o={"ISO-3":i.identity,"USA-states":i.identity,"country names":function(t){for(var e=0;e<a.length;e++){var r=a[e],o=new RegExp(n[r]);if(o.test(t.trim().toLowerCase()))return r}return i.log("Unrecognized country name: "+t+"."),!1}};r.locationToFeature=function(t,e,r){if(!e||"string"!=typeof e)return!1;var n=function(t,e){return(0,o[t])(e)}(t,e);if(n){for(var a=0;a<r.length;a++){var s=r[a];if(s.id===n)return s}i.log(["Location with id",n,"does not have a matching topojson feature at this resolution."].join(" "))}return!1}},{"../lib":684,"country-regex":121}],677:[function(t,e,r){"use strict";var n=t("../constants/numerical").BADNUM;r.calcTraceToLineCoords=function(t){for(var e=t[0].trace.connectgaps,r=[],i=[],a=0;a<t.length;a++){var o=t[a].lonlat;o[0]!==n?i.push(o):!e&&i.length>0&&(r.push(i),i=[])}return i.length>0&&r.push(i),r},r.makeLine=function(t){return 1===t.length?{type:"LineString",coordinates:t[0]}:{type:"MultiLineString",coordinates:t}},r.makePolygon=function(t){if(1===t.length)return{type:"Polygon",coordinates:t};for(var e=new Array(t.length),r=0;r<t.length;r++)e[r]=[t[r]];return{type:"MultiPolygon",coordinates:e}},r.makeBlank=function(){return{type:"Point",coordinates:[]}}},{"../constants/numerical":661}],678:[function(t,e,r){"use strict";var n,i,a,o=t("./mod");function s(t,e,r,n,i,a,o,s){var l=r-t,c=i-t,u=o-i,h=n-e,f=a-e,p=s-a,d=l*p-u*h;if(0===d)return null;var g=(c*p-u*f)/d,m=(c*h-l*f)/d;return m<0||m>1||g<0||g>1?null:{x:t+l*g,y:e+h*g}}function l(t,e,r,n,i){var a=n*t+i*e;if(a<0)return n*n+i*i;if(a>r){var o=n-t,s=i-e;return o*o+s*s}var l=n*e-i*t;return l*l/r}r.segmentsIntersect=s,r.segmentDistance=function(t,e,r,n,i,a,o,c){if(s(t,e,r,n,i,a,o,c))return 0;var u=r-t,h=n-e,f=o-i,p=c-a,d=u*u+h*h,g=f*f+p*p,m=Math.min(l(u,h,d,i-t,a-e),l(u,h,d,o-t,c-e),l(f,p,g,t-i,e-a),l(f,p,g,r-i,n-a));return Math.sqrt(m)},r.getTextLocation=function(t,e,r,s){if(t===i&&s===a||(n={},i=t,a=s),n[r])return n[r];var l=t.getPointAtLength(o(r-s/2,e)),c=t.getPointAtLength(o(r+s/2,e)),u=Math.atan((c.y-l.y)/(c.x-l.x)),h=t.getPointAtLength(o(r,e)),f={x:(4*h.x+l.x+c.x)/6,y:(4*h.y+l.y+c.y)/6,theta:u};return n[r]=f,f},r.clearLocationCache=function(){i=null},r.getVisibleSegment=function(t,e,r){var n,i,a=e.left,o=e.right,s=e.top,l=e.bottom,c=0,u=t.getTotalLength(),h=u;function f(e){var r=t.getPointAtLength(e);0===e?n=r:e===u&&(i=r);var c=r.x<a?a-r.x:r.x>o?r.x-o:0,h=r.y<s?s-r.y:r.y>l?r.y-l:0;return Math.sqrt(c*c+h*h)}for(var p=f(c);p;){if((c+=p+r)>h)return;p=f(c)}for(p=f(h);p;){if(c>(h-=p+r))return;p=f(h)}return{min:c,max:h,len:h-c,total:u,isClosed:0===c&&h===u&&Math.abs(n.x-i.x)<.1&&Math.abs(n.y-i.y)<.1}},r.findPointOnPath=function(t,e,r,n){for(var i,a,o,s=(n=n||{}).pathLength||t.getTotalLength(),l=n.tolerance||.001,c=n.iterationLimit||30,u=t.getPointAtLength(0)[r]>t.getPointAtLength(s)[r]?-1:1,h=0,f=0,p=s;h<c;){if(i=(f+p)/2,o=(a=t.getPointAtLength(i))[r]-e,Math.abs(o)<l)return a;u*o>0?p=i:f=i,h++}return a}},{"./mod":691}],679:[function(t,e,r){"use strict";e.exports=function(t){var e;if("string"==typeof t){if(null===(e=document.getElementById(t)))throw new Error("No DOM element with id '"+t+"' exists on the page.");return e}if(null==t)throw new Error("DOM element provided is null or undefined");return t}},{}],680:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("tinycolor2"),a=t("color-normalize"),o=t("../components/colorscale"),s=t("../components/color/attributes").defaultLine,l=t("./is_array").isArrayOrTypedArray,c=a(s),u=1;function h(t,e){var r=t;return r[3]*=e,r}function f(t){if(n(t))return c;var e=a(t);return e.length?e:c}function p(t){return n(t)?t:u}e.exports={formatColor:function(t,e,r){var n,i,s,d,g,m=t.color,v=l(m),y=l(e),x=[];if(n=void 0!==t.colorscale?o.makeColorScaleFunc(o.extractScale(t.colorscale,t.cmin,t.cmax)):f,i=v?function(t,e){return void 0===t[e]?c:a(n(t[e]))}:f,s=y?function(t,e){return void 0===t[e]?u:p(t[e])}:p,v||y)for(var b=0;b<r;b++)d=i(m,b),g=s(e,b),x[b]=h(d,g);else x=h(a(m),e);return x},parseColorScale:function(t,e){return void 0===e&&(e=1),t.map(function(t){var r=t[0],n=i(t[1]).toRgb();return{index:r,rgb:[n.r,n.g,n.b,e]}})}}},{"../components/color/attributes":557,"../components/colorscale":573,"./is_array":685,"color-normalize":107,"fast-isnumeric":214,tinycolor2:499}],681:[function(t,e,r){"use strict";var n=t("./identity");function i(t){return[t]}e.exports={keyFun:function(t){return t.key},repeat:i,descend:n,wrap:i,unwrap:function(t){return t[0]}}},{"./identity":683}],682:[function(t,e,r){"use strict";var n=t("superscript-text"),i=t("../constants/string_mappings");e.exports=function(t){return""+function(t){for(var e=i.entityToUnicode,r=0;(r=t.indexOf("&",r))>=0;){var n=t.indexOf(";",r);if(n<r)r+=1;else{var a=e[t.slice(r+1,n)];t=a?t.slice(0,r)+a+t.slice(n+1):t.slice(0,r)+t.slice(n+1)}}return t}(function(t){return t.replace(/\<.*\>/g,"")}(function(t){for(var e=0;(e=t.indexOf("<sup>",e))>=0;){var r=t.indexOf("</sup>",e);if(r<e)break;t=t.slice(0,e)+n(t.slice(e+5,r))+t.slice(r+6)}return t}(t.replace(/\<br\>/g,"\n"))))}},{"../constants/string_mappings":662,"superscript-text":492}],683:[function(t,e,r){"use strict";e.exports=function(t){return t}},{}],684:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("../constants/numerical"),o=a.FP_SAFE,s=a.BADNUM,l=e.exports={};l.nestedProperty=t("./nested_property"),l.keyedContainer=t("./keyed_container"),l.relativeAttr=t("./relative_attr"),l.isPlainObject=t("./is_plain_object"),l.mod=t("./mod"),l.toLogRange=t("./to_log_range"),l.relinkPrivateKeys=t("./relink_private"),l.ensureArray=t("./ensure_array");var c=t("./is_array");l.isTypedArray=c.isTypedArray,l.isArrayOrTypedArray=c.isArrayOrTypedArray,l.isArray1D=c.isArray1D;var u=t("./coerce");l.valObjectMeta=u.valObjectMeta,l.coerce=u.coerce,l.coerce2=u.coerce2,l.coerceFont=u.coerceFont,l.coerceHoverinfo=u.coerceHoverinfo,l.coerceSelectionMarkerOpacity=u.coerceSelectionMarkerOpacity,l.validate=u.validate;var h=t("./dates");l.dateTime2ms=h.dateTime2ms,l.isDateTime=h.isDateTime,l.ms2DateTime=h.ms2DateTime,l.ms2DateTimeLocal=h.ms2DateTimeLocal,l.cleanDate=h.cleanDate,l.isJSDate=h.isJSDate,l.formatDate=h.formatDate,l.incrementMonth=h.incrementMonth,l.dateTick0=h.dateTick0,l.dfltRange=h.dfltRange,l.findExactDates=h.findExactDates,l.MIN_MS=h.MIN_MS,l.MAX_MS=h.MAX_MS;var f=t("./search");l.findBin=f.findBin,l.sorterAsc=f.sorterAsc,l.sorterDes=f.sorterDes,l.distinctVals=f.distinctVals,l.roundUp=f.roundUp;var p=t("./stats");l.aggNums=p.aggNums,l.len=p.len,l.mean=p.mean,l.midRange=p.midRange,l.variance=p.variance,l.stdev=p.stdev,l.interp=p.interp;var d=t("./matrix");l.init2dArray=d.init2dArray,l.transposeRagged=d.transposeRagged,l.dot=d.dot,l.translationMatrix=d.translationMatrix,l.rotationMatrix=d.rotationMatrix,l.rotationXYMatrix=d.rotationXYMatrix,l.apply2DTransform=d.apply2DTransform,l.apply2DTransform2=d.apply2DTransform2;var g=t("./angles");l.deg2rad=g.deg2rad,l.rad2deg=g.rad2deg,l.wrap360=g.wrap360,l.wrap180=g.wrap180;var m=t("./geometry2d");l.segmentsIntersect=m.segmentsIntersect,l.segmentDistance=m.segmentDistance,l.getTextLocation=m.getTextLocation,l.clearLocationCache=m.clearLocationCache,l.getVisibleSegment=m.getVisibleSegment,l.findPointOnPath=m.findPointOnPath;var v=t("./extend");l.extendFlat=v.extendFlat,l.extendDeep=v.extendDeep,l.extendDeepAll=v.extendDeepAll,l.extendDeepNoArrays=v.extendDeepNoArrays;var y=t("./loggers");l.log=y.log,l.warn=y.warn,l.error=y.error;var x=t("./regex");l.counterRegex=x.counter;var b=t("./throttle");function _(t){var e={};for(var r in t)for(var n=t[r],i=0;i<n.length;i++)e[n[i]]=+r;return e}l.throttle=b.throttle,l.throttleDone=b.done,l.clearThrottle=b.clear,l.getGraphDiv=t("./get_graph_div"),l._=t("./localize"),l.notifier=t("./notifier"),l.filterUnique=t("./filter_unique"),l.filterVisible=t("./filter_visible"),l.pushUnique=t("./push_unique"),l.cleanNumber=t("./clean_number"),l.ensureNumber=function(t){return i(t)?(t=Number(t))<-o||t>o?s:i(t)?Number(t):s:s},l.isIndex=function(t,e){return!(void 0!==e&&t>=e)&&(i(t)&&t>=0&&t%1==0)},l.noop=t("./noop"),l.identity=t("./identity"),l.swapAttrs=function(t,e,r,n){r||(r="x"),n||(n="y");for(var i=0;i<e.length;i++){var a=e[i],o=l.nestedProperty(t,a.replace("?",r)),s=l.nestedProperty(t,a.replace("?",n)),c=o.get();o.set(s.get()),s.set(c)}},l.raiseToTop=function(t){t.parentNode.appendChild(t)},l.cancelTransition=function(t){return t.transition().duration(0)},l.constrain=function(t,e,r){return e>r?Math.max(r,Math.min(e,t)):Math.max(e,Math.min(r,t))},l.bBoxIntersect=function(t,e,r){return r=r||0,t.left<=e.right+r&&e.left<=t.right+r&&t.top<=e.bottom+r&&e.top<=t.bottom+r},l.simpleMap=function(t,e,r,n){for(var i=t.length,a=new Array(i),o=0;o<i;o++)a[o]=e(t[o],r,n);return a},l.randstr=function t(e,r,n,i){if(n||(n=16),void 0===r&&(r=24),r<=0)return"0";var a,o,s=Math.log(Math.pow(2,r))/Math.log(n),c="";for(a=2;s===1/0;a*=2)s=Math.log(Math.pow(2,r/a))/Math.log(n)*a;var u=s-Math.floor(s);for(a=0;a<Math.floor(s);a++)c=Math.floor(Math.random()*n).toString(n)+c;u&&(o=Math.pow(n,u),c=Math.floor(Math.random()*o).toString(n)+c);var h=parseInt(c,n);return e&&e[c]||h!==1/0&&h>=Math.pow(2,r)?i>10?(l.warn("randstr failed uniqueness"),c):t(e,r,n,(i||0)+1):c},l.OptionControl=function(t,e){t||(t={}),e||(e="opt");var r={optionList:[],_newoption:function(n){n[e]=t,r[n.name]=n,r.optionList.push(n)}};return r["_"+e]=t,r},l.smooth=function(t,e){if((e=Math.round(e)||0)<2)return t;var r,n,i,a,o=t.length,s=2*o,l=2*e-1,c=new Array(l),u=new Array(o);for(r=0;r<l;r++)c[r]=(1-Math.cos(Math.PI*(r+1)/e))/(2*e);for(r=0;r<o;r++){for(a=0,n=0;n<l;n++)(i=r+n+1-e)<-o?i-=s*Math.round(i/s):i>=s&&(i-=s*Math.floor(i/s)),i<0?i=-1-i:i>=o&&(i=s-1-i),a+=t[i]*c[n];u[r]=a}return u},l.syncOrAsync=function(t,e,r){var n;function i(){return l.syncOrAsync(t,e,r)}for(;t.length;)if((n=(0,t.splice(0,1)[0])(e))&&n.then)return n.then(i).then(void 0,l.promiseError);return r&&r(e)},l.stripTrailingSlash=function(t){return"/"===t.substr(-1)?t.substr(0,t.length-1):t},l.noneOrAll=function(t,e,r){if(t){var n,i=!1,a=!0;for(n=0;n<r.length;n++)null!=t[r[n]]?i=!0:a=!1;if(i&&!a)for(n=0;n<r.length;n++)t[r[n]]=e[r[n]]}},l.mergeArray=function(t,e,r){if(l.isArrayOrTypedArray(t))for(var n=Math.min(t.length,e.length),i=0;i<n;i++)e[i][r]=t[i]},l.fillArray=function(t,e,r,n){if(n=n||l.identity,l.isArrayOrTypedArray(t))for(var i=0;i<e.length;i++)e[i][r]=n(t[i])},l.castOption=function(t,e,r,n){n=n||l.identity;var i=l.nestedProperty(t,r).get();return l.isArrayOrTypedArray(i)?Array.isArray(e)&&l.isArrayOrTypedArray(i[e[0]])?n(i[e[0]][e[1]]):n(i[e]):i},l.extractOption=function(t,e,r,n){if(r in t)return t[r];var i=l.nestedProperty(e,n).get();return Array.isArray(i)?void 0:i},l.tagSelected=function(t,e,r){var n,i,a=e.selectedpoints,o=e._indexToPoints;o&&(n=_(o));for(var s=0;s<a.length;s++){var c=a[s];if(l.isIndex(c)){var u=n?n[c]:c,h=r?r[u]:u;void 0!==(i=h)&&i<t.length&&(t[h].selected=1)}}},l.selIndices2selPoints=function(t){var e=t.selectedpoints,r=t._indexToPoints;if(r){for(var n=_(r),i=[],a=0;a<e.length;a++){var o=e[a];if(l.isIndex(o)){var s=n[o];l.isIndex(s)&&i.push(s)}}return i}return e},l.getTargetArray=function(t,e){var r=e.target;if("string"==typeof r&&r){var n=l.nestedProperty(t,r).get();return!!Array.isArray(n)&&n}return!!Array.isArray(r)&&r},l.minExtend=function(t,e){var r={};"object"!=typeof e&&(e={});var n,i,a,o=Object.keys(t);for(n=0;n<o.length;n++)a=t[i=o[n]],"_"!==i.charAt(0)&&"function"!=typeof a&&("module"===i?r[i]=a:Array.isArray(a)?r[i]=a.slice(0,3):r[i]=a&&"object"==typeof a?l.minExtend(t[i],e[i]):a);for(o=Object.keys(e),n=0;n<o.length;n++)"object"==typeof(a=e[i=o[n]])&&i in r&&"object"==typeof r[i]||(r[i]=a);return r},l.titleCase=function(t){return t.charAt(0).toUpperCase()+t.substr(1)},l.containsAny=function(t,e){for(var r=0;r<e.length;r++)if(-1!==t.indexOf(e[r]))return!0;return!1},l.isPlotDiv=function(t){var e=n.select(t);return e.node()instanceof HTMLElement&&e.size()&&e.classed("js-plotly-plot")},l.removeElement=function(t){var e=t&&t.parentNode;e&&e.removeChild(t)},l.addStyleRule=function(t,e){if(!l.styleSheet){var r=document.createElement("style");r.appendChild(document.createTextNode("")),document.head.appendChild(r),l.styleSheet=r.sheet}var n=l.styleSheet;n.insertRule?n.insertRule(t+"{"+e+"}",0):n.addRule?n.addRule(t,e,0):l.warn("addStyleRule failed")},l.isIE=function(){return"undefined"!=typeof window.navigator.msSaveBlob},l.isD3Selection=function(t){return t&&"function"==typeof t.classed},l.ensureSingle=function(t,e,r,n){var i=t.select(e+(r?"."+r:""));if(i.size())return i;var a=t.append(e).classed(r,!0);return n&&a.call(n),a},l.ensureSingleById=function(t,e,r,n){var i=t.select(e+"#"+r);if(i.size())return i;var a=t.append(e).attr("id",r);return n&&a.call(n),a},l.objectFromPath=function(t,e){for(var r,n=t.split("."),i=r={},a=0;a<n.length;a++){var o=n[a],s=null,l=n[a].match(/(.*)\[([0-9]+)\]/);l?(o=l[1],s=l[2],r=r[o]=[],a===n.length-1?r[s]=e:r[s]={},r=r[s]):(a===n.length-1?r[o]=e:r[o]={},r=r[o])}return i};var w=/^([^\[\.]+)\.(.+)?/,k=/^([^\.]+)\[([0-9]+)\](\.)?(.+)?/;l.expandObjectPaths=function(t){var e,r,n,i,a,o,s;if("object"==typeof t&&!Array.isArray(t))for(r in t)t.hasOwnProperty(r)&&((e=r.match(w))?(i=t[r],n=e[1],delete t[r],t[n]=l.extendDeepNoArrays(t[n]||{},l.objectFromPath(r,l.expandObjectPaths(i))[n])):(e=r.match(k))?(i=t[r],n=e[1],a=parseInt(e[2]),delete t[r],t[n]=t[n]||[],"."===e[3]?(s=e[4],o=t[n][a]=t[n][a]||{},l.extendDeepNoArrays(o,l.objectFromPath(s,l.expandObjectPaths(i)))):t[n][a]=l.expandObjectPaths(i)):t[r]=l.expandObjectPaths(t[r]));return t},l.numSeparate=function(t,e,r){if(r||(r=!1),"string"!=typeof e||0===e.length)throw new Error("Separator string required for formatting!");"number"==typeof t&&(t=String(t));var n=/(\d+)(\d{3})/,i=e.charAt(0),a=e.charAt(1),o=t.split("."),s=o[0],l=o.length>1?i+o[1]:"";if(a&&(o.length>1||s.length>4||r))for(;n.test(s);)s=s.replace(n,"$1"+a+"$2");return s+l};var M=/%{([^\s%{}]*)}/g,A=/^\w*$/;l.templateString=function(t,e){var r={};return t.replace(M,function(t,n){return A.test(n)?e[n]||"":(r[n]=r[n]||l.nestedProperty(e,n).get,r[n]()||"")})};l.subplotSort=function(t,e){for(var r=Math.min(t.length,e.length)+1,n=0,i=0,a=0;a<r;a++){var o=t.charCodeAt(a)||0,s=e.charCodeAt(a)||0,l=o>=48&&o<=57,c=s>=48&&s<=57;if(l&&(n=10*n+o-48),c&&(i=10*i+s-48),!l||!c){if(n!==i)return n-i;if(o!==s)return o-s}}return i-n};var T=2e9;l.seedPseudoRandom=function(){T=2e9},l.pseudoRandom=function(){var t=T;return T=(69069*T+1)%4294967296,Math.abs(T-t)<429496729?l.pseudoRandom():T/4294967296}},{"../constants/numerical":661,"./angles":666,"./clean_number":667,"./coerce":669,"./dates":670,"./ensure_array":671,"./extend":673,"./filter_unique":674,"./filter_visible":675,"./geometry2d":678,"./get_graph_div":679,"./identity":683,"./is_array":685,"./is_plain_object":686,"./keyed_container":687,"./localize":688,"./loggers":689,"./matrix":690,"./mod":691,"./nested_property":692,"./noop":693,"./notifier":694,"./push_unique":698,"./regex":700,"./relative_attr":701,"./relink_private":702,"./search":703,"./stats":706,"./throttle":709,"./to_log_range":710,d3:147,"fast-isnumeric":214}],685:[function(t,e,r){"use strict";var n="undefined"!=typeof ArrayBuffer&&ArrayBuffer.isView?ArrayBuffer:{isView:function(){return!1}},i="undefined"==typeof DataView?function(){}:DataView;function a(t){return n.isView(t)&&!(t instanceof i)}function o(t){return Array.isArray(t)||a(t)}e.exports={isTypedArray:a,isArrayOrTypedArray:o,isArray1D:function(t){return!o(t[0])}}},{}],686:[function(t,e,r){"use strict";e.exports=function(t){return window&&window.process&&window.process.versions?"[object Object]"===Object.prototype.toString.call(t):"[object Object]"===Object.prototype.toString.call(t)&&Object.getPrototypeOf(t)===Object.prototype}},{}],687:[function(t,e,r){"use strict";var n=t("./nested_property"),i=/^\w*$/;e.exports=function(t,e,r,a){var o,s,l;r=r||"name",a=a||"value";var c={};e&&e.length?(l=n(t,e),s=l.get()):s=t,e=e||"";var u={};if(s)for(o=0;o<s.length;o++)u[s[o][r]]=o;var h=i.test(a),f={set:function(t,e){var i=null===e?4:0;if(!s){if(!l||4===i)return;s=[],l.set(s)}var o=u[t];if(void 0===o){if(4===i)return;i|=3,o=s.length,u[t]=o}else e!==(h?s[o][a]:n(s[o],a).get())&&(i|=2);var p=s[o]=s[o]||{};return p[r]=t,h?p[a]=e:n(p,a).set(e),null!==e&&(i&=-5),c[o]=c[o]|i,f},get:function(t){if(s){var e=u[t];return void 0===e?void 0:h?s[e][a]:n(s[e],a).get()}},rename:function(t,e){var n=u[t];return void 0===n?f:(c[n]=1|c[n],u[e]=n,delete u[t],s[n][r]=e,f)},remove:function(t){var e=u[t];if(void 0===e)return f;var i=s[e];if(Object.keys(i).length>2)return c[e]=2|c[e],f.set(t,null);if(h){for(o=e;o<s.length;o++)c[o]=3|c[o];for(o=e;o<s.length;o++)u[s[o][r]]--;s.splice(e,1),delete u[t]}else n(i,a).set(null),c[e]=6|c[e];return f},constructUpdate:function(){for(var t,i,o={},l=Object.keys(c),u=0;u<l.length;u++)i=l[u],t=e+"["+i+"]",s[i]?(1&c[i]&&(o[t+"."+r]=s[i][r]),2&c[i]&&(o[t+"."+a]=h?4&c[i]?null:s[i][a]:4&c[i]?null:n(s[i],a).get())):o[t]=null;return o}};return f}},{"./nested_property":692}],688:[function(t,e,r){"use strict";var n=t("../registry");e.exports=function(t,e){for(var r=t._context.locale,i=0;i<2;i++){for(var a=t._context.locales,o=0;o<2;o++){var s=(a[r]||{}).dictionary;if(s){var l=s[e];if(l)return l}a=n.localeRegistry}var c=r.split("-")[0];if(c===r)break;r=c}return e}},{"../registry":817}],689:[function(t,e,r){"use strict";var n=t("../plot_api/plot_config"),i=e.exports={};function a(t,e){if(t.apply)t.apply(t,e);else for(var r=0;r<e.length;r++)t(e[r])}i.log=function(){if(n.logging>1){for(var t=["LOG:"],e=0;e<arguments.length;e++)t.push(arguments[e]);a(console.trace||console.log,t)}},i.warn=function(){if(n.logging>0){for(var t=["WARN:"],e=0;e<arguments.length;e++)t.push(arguments[e]);a(console.trace||console.log,t)}},i.error=function(){if(n.logging>0){for(var t=["ERROR:"],e=0;e<arguments.length;e++)t.push(arguments[e]);a(console.error,t)}}},{"../plot_api/plot_config":720}],690:[function(t,e,r){"use strict";r.init2dArray=function(t,e){for(var r=new Array(t),n=0;n<t;n++)r[n]=new Array(e);return r},r.transposeRagged=function(t){var e,r,n=0,i=t.length;for(e=0;e<i;e++)n=Math.max(n,t[e].length);var a=new Array(n);for(e=0;e<n;e++)for(a[e]=new Array(i),r=0;r<i;r++)a[e][r]=t[r][e];return a},r.dot=function(t,e){if(!t.length||!e.length||t.length!==e.length)return null;var n,i,a=t.length;if(t[0].length)for(n=new Array(a),i=0;i<a;i++)n[i]=r.dot(t[i],e);else if(e[0].length){var o=r.transposeRagged(e);for(n=new Array(o.length),i=0;i<o.length;i++)n[i]=r.dot(t,o[i])}else for(n=0,i=0;i<a;i++)n+=t[i]*e[i];return n},r.translationMatrix=function(t,e){return[[1,0,t],[0,1,e],[0,0,1]]},r.rotationMatrix=function(t){var e=t*Math.PI/180;return[[Math.cos(e),-Math.sin(e),0],[Math.sin(e),Math.cos(e),0],[0,0,1]]},r.rotationXYMatrix=function(t,e,n){return r.dot(r.dot(r.translationMatrix(e,n),r.rotationMatrix(t)),r.translationMatrix(-e,-n))},r.apply2DTransform=function(t){return function(){var e=arguments;3===e.length&&(e=e[0]);var n=1===arguments.length?e[0]:[e[0],e[1]];return r.dot(t,[n[0],n[1],1]).slice(0,2)}},r.apply2DTransform2=function(t){var e=r.apply2DTransform(t);return function(t){return e(t.slice(0,2)).concat(e(t.slice(2,4)))}}},{}],691:[function(t,e,r){"use strict";e.exports=function(t,e){var r=t%e;return r<0?r+e:r}},{}],692:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("./is_array").isArrayOrTypedArray;e.exports=function(t,e){if(n(e))e=String(e);else if("string"!=typeof e||"[-1]"===e.substr(e.length-4))throw"bad property string";for(var r,a,o,l=0,c=e.split(".");l<c.length;){if(r=String(c[l]).match(/^([^\[\]]*)((\[\-?[0-9]*\])+)$/)){if(r[1])c[l]=r[1];else{if(0!==l)throw"bad property string";c.splice(0,1)}for(a=r[2].substr(1,r[2].length-2).split("]["),o=0;o<a.length;o++)l++,c.splice(l,0,Number(a[o]))}l++}return"object"!=typeof t?function(t,e,r){return{set:function(){throw"bad container"},get:function(){},astr:e,parts:r,obj:t}}(t,e,c):{set:s(t,c,e),get:function t(e,r){return function(){var n,a,o,s,l,c=e;for(s=0;s<r.length-1;s++){if(-1===(n=r[s])){for(a=!0,o=[],l=0;l<c.length;l++)o[l]=t(c[l],r.slice(s+1))(),o[l]!==o[0]&&(a=!1);return a?o[0]:o}if("number"==typeof n&&!i(c))return;if("object"!=typeof(c=c[n])||null===c)return}if("object"==typeof c&&null!==c&&null!==(o=c[r[s]]))return o}}(t,c),astr:e,parts:c,obj:t}};var a=/(^|\.)args\[/;function o(t,e){return void 0===t||null===t&&!e.match(a)}function s(t,e,r){return function(n){var a,s,h=t,f="",p=[[t,f]],d=o(n,r);for(s=0;s<e.length-1;s++){if("number"==typeof(a=e[s])&&!i(h))throw"array index but container is not an array";if(-1===a){if(d=!c(h,e.slice(s+1),n,r))break;return}if(!u(h,a,e[s+1],d))break;if("object"!=typeof(h=h[a])||null===h)throw"container is not an object";f=l(f,a),p.push([h,f])}if(d){if(s===e.length-1&&(delete h[e[s]],Array.isArray(h)&&+e[s]==h.length-1))for(;h.length&&void 0===h[h.length-1];)h.pop()}else h[e[s]]=n}}function l(t,e){var r=e;return n(e)?r="["+e+"]":t&&(r="."+e),t+r}function c(t,e,r,n){var a,l=i(r),c=!0,h=r,f=n.replace("-1",0),p=!l&&o(r,f),d=e[0];for(a=0;a<t.length;a++)f=n.replace("-1",a),l&&(p=o(h=r[a%r.length],f)),p&&(c=!1),u(t,a,d,p)&&s(t[a],e,n.replace("-1",a))(h);return c}function u(t,e,r,n){if(void 0===t[e]){if(n)return!1;t[e]="number"==typeof r?[]:{}}return!0}},{"./is_array":685,"fast-isnumeric":214}],693:[function(t,e,r){"use strict";e.exports=function(){}},{}],694:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=[];e.exports=function(t,e){if(-1===a.indexOf(t)){a.push(t);var r=1e3;i(e)?r=e:"long"===e&&(r=3e3);var o=n.select("body").selectAll(".plotly-notifier").data([0]);o.enter().append("div").classed("plotly-notifier",!0),o.selectAll(".notifier-note").data(a).enter().append("div").classed("notifier-note",!0).style("opacity",0).each(function(t){var e=n.select(this);e.append("button").classed("notifier-close",!0).html("&times;").on("click",function(){e.transition().call(s)});for(var i=e.append("p"),a=t.split(/<br\s*\/?>/g),o=0;o<a.length;o++)o&&i.append("br"),i.append("span").text(a[o]);e.transition().duration(700).style("opacity",1).transition().delay(r).call(s)})}function s(t){t.duration(700).style("opacity",0).each("end",function(t){var e=a.indexOf(t);-1!==e&&a.splice(e,1),n.select(this).remove()})}}},{d3:147,"fast-isnumeric":214}],695:[function(t,e,r){"use strict";var n=t("./setcursor"),i="data-savedcursor";e.exports=function(t,e){var r=t.attr(i);if(e){if(!r){for(var a=(t.attr("class")||"").split(" "),o=0;o<a.length;o++){var s=a[o];0===s.indexOf("cursor-")&&t.attr(i,s.substr(7)).classed(s,!1)}t.attr(i)||t.attr(i,"!!")}n(t,e)}else r&&(t.attr(i,null),"!!"===r?n(t):n(t,r))}},{"./setcursor":704}],696:[function(t,e,r){"use strict";var n=t("./matrix").dot,i=t("../constants/numerical").BADNUM,a=e.exports={};a.tester=function(t){if(Array.isArray(t[0][0]))return a.multitester(t);var e,r=t.slice(),n=r[0][0],o=n,s=r[0][1],l=s;for(r.push(r[0]),e=1;e<r.length;e++)n=Math.min(n,r[e][0]),o=Math.max(o,r[e][0]),s=Math.min(s,r[e][1]),l=Math.max(l,r[e][1]);var c,u=!1;5===r.length&&(r[0][0]===r[1][0]?r[2][0]===r[3][0]&&r[0][1]===r[3][1]&&r[1][1]===r[2][1]&&(u=!0,c=function(t){return t[0]===r[0][0]}):r[0][1]===r[1][1]&&r[2][1]===r[3][1]&&r[0][0]===r[3][0]&&r[1][0]===r[2][0]&&(u=!0,c=function(t){return t[1]===r[0][1]}));var h=!0,f=r[0];for(e=1;e<r.length;e++)if(f[0]!==r[e][0]||f[1]!==r[e][1]){h=!1;break}return{xmin:n,xmax:o,ymin:s,ymax:l,pts:r,contains:u?function(t,e){var r=t[0],a=t[1];return!(r===i||r<n||r>o||a===i||a<s||a>l||e&&c(t))}:function(t,e){var a=t[0],c=t[1];if(a===i||a<n||a>o||c===i||c<s||c>l)return!1;var u,h,f,p,d,g=r.length,m=r[0][0],v=r[0][1],y=0;for(u=1;u<g;u++)if(h=m,f=v,m=r[u][0],v=r[u][1],!(a<(p=Math.min(h,m))||a>Math.max(h,m)||c>Math.max(f,v)))if(c<Math.min(f,v))a!==p&&y++;else{if(c===(d=m===h?c:f+(a-h)*(v-f)/(m-h)))return 1!==u||!e;c<=d&&a!==p&&y++}return y%2==1},isRect:u,degenerate:h}},a.multitester=function(t){for(var e=[],r=t[0][0][0],n=r,i=t[0][0][1],o=i,s=0;s<t.length;s++){var l=a.tester(t[s]);l.subtract=t[s].subtract,e.push(l),r=Math.min(r,l.xmin),n=Math.max(n,l.xmax),i=Math.min(i,l.ymin),o=Math.max(o,l.ymax)}return{xmin:r,xmax:n,ymin:i,ymax:o,pts:[],contains:function(t,r){for(var n=!1,i=0;i<e.length;i++)e[i].contains(t,r)&&(n=!1===e[i].subtract);return n},isRect:!1,degenerate:!1}};var o=a.isSegmentBent=function(t,e,r,i){var a,o,s,l=t[e],c=[t[r][0]-l[0],t[r][1]-l[1]],u=n(c,c),h=Math.sqrt(u),f=[-c[1]/h,c[0]/h];for(a=e+1;a<r;a++)if(o=[t[a][0]-l[0],t[a][1]-l[1]],(s=n(o,c))<0||s>u||Math.abs(n(o,f))>i)return!0;return!1};a.filter=function(t,e){var r=[t[0]],n=0,i=0;function a(a){t.push(a);var s=r.length,l=n;r.splice(i+1);for(var c=l+1;c<t.length;c++)(c===t.length-1||o(t,l,c+1,e))&&(r.push(t[c]),r.length<s-2&&(n=c,i=r.length-1),l=c)}t.length>1&&a(t.pop());return{addPt:a,raw:t,filtered:r}}},{"../constants/numerical":661,"./matrix":690}],697:[function(t,e,r){(function(r){"use strict";var n=t("./show_no_webgl_msg"),i=t("regl");e.exports=function(t,e){var a=t._fullLayout,o=!0;return a._glcanvas.each(function(n){if(!n.regl&&(!n.pick||a._has("parcoords")))try{n.regl=i({canvas:this,attributes:{antialias:!n.pick,preserveDrawingBuffer:!0},pixelRatio:t._context.plotGlPixelRatio||r.devicePixelRatio,extensions:e||[]})}catch(t){o=!1}}),o||n({container:a._glcontainer.node()}),o}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./show_no_webgl_msg":705,regl:463}],698:[function(t,e,r){"use strict";e.exports=function(t,e){if(e instanceof RegExp){var r,n=e.toString();for(r=0;r<t.length;r++)if(t[r]instanceof RegExp&&t[r].toString()===n)return t;t.push(e)}else!e&&0!==e||-1!==t.indexOf(e)||t.push(e);return t}},{}],699:[function(t,e,r){"use strict";var n=t("../lib"),i=t("../plot_api/plot_config");var a={add:function(t,e,r,n,a){var o,s;t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},s=t.undoQueue.index,t.autoplay?t.undoQueue.inSequence||(t.autoplay=!1):(!t.undoQueue.sequence||t.undoQueue.beginSequence?(o={undo:{calls:[],args:[]},redo:{calls:[],args:[]}},t.undoQueue.queue.splice(s,t.undoQueue.queue.length-s,o),t.undoQueue.index+=1):o=t.undoQueue.queue[s-1],t.undoQueue.beginSequence=!1,o&&(o.undo.calls.unshift(e),o.undo.args.unshift(r),o.redo.calls.push(n),o.redo.args.push(a)),t.undoQueue.queue.length>i.queueLength&&(t.undoQueue.queue.shift(),t.undoQueue.index--))},startSequence:function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!0,t.undoQueue.beginSequence=!0},stopSequence:function(t){t.undoQueue=t.undoQueue||{index:0,queue:[],sequence:!1},t.undoQueue.sequence=!1,t.undoQueue.beginSequence=!1},undo:function(t){var e,r;if(t.framework&&t.framework.isPolar)t.framework.undo();else if(!(void 0===t.undoQueue||isNaN(t.undoQueue.index)||t.undoQueue.index<=0)){for(t.undoQueue.index--,e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;r<e.undo.calls.length;r++)a.plotDo(t,e.undo.calls[r],e.undo.args[r]);t.undoQueue.inSequence=!1,t.autoplay=!1}},redo:function(t){var e,r;if(t.framework&&t.framework.isPolar)t.framework.redo();else if(!(void 0===t.undoQueue||isNaN(t.undoQueue.index)||t.undoQueue.index>=t.undoQueue.queue.length)){for(e=t.undoQueue.queue[t.undoQueue.index],t.undoQueue.inSequence=!0,r=0;r<e.redo.calls.length;r++)a.plotDo(t,e.redo.calls[r],e.redo.args[r]);t.undoQueue.inSequence=!1,t.autoplay=!1,t.undoQueue.index++}}};a.plotDo=function(t,e,r){t.autoplay=!0,r=function(t,e){for(var r,i=[],a=0;a<e.length;a++)r=e[a],i[a]=r===t?r:"object"==typeof r?Array.isArray(r)?n.extendDeep([],r):n.extendDeepAll({},r):r;return i}(t,r),e.apply(null,r)},e.exports=a},{"../lib":684,"../plot_api/plot_config":720}],700:[function(t,e,r){"use strict";r.counter=function(t,e,r){var n=(e||"")+(r?"":"$");return"xy"===t?new RegExp("^x([2-9]|[1-9][0-9]+)?y([2-9]|[1-9][0-9]+)?"+n):new RegExp("^"+t+"([2-9]|[1-9][0-9]+)?"+n)}},{}],701:[function(t,e,r){"use strict";var n=/^(.*)(\.[^\.\[\]]+|\[\d\])$/,i=/^[^\.\[\]]+$/;e.exports=function(t,e){for(;e;){var r=t.match(n);if(r)t=r[1];else{if(!t.match(i))throw new Error("bad relativeAttr call:"+[t,e]);t=""}if("^"!==e.charAt(0))break;e=e.slice(1)}return t&&"["!==e.charAt(0)?t+"."+e:t+e}},{}],702:[function(t,e,r){"use strict";var n=t("./is_array").isArrayOrTypedArray,i=t("./is_plain_object");e.exports=function t(e,r){for(var a in r){var o=r[a],s=e[a];if(s!==o)if("_"===a.charAt(0)||"function"==typeof o){if(a in e)continue;e[a]=o}else if(n(o)&&n(s)&&i(o[0])){if("customdata"===a||"ids"===a)continue;for(var l=Math.min(o.length,s.length),c=0;c<l;c++)s[c]!==o[c]&&i(o[c])&&i(s[c])&&t(s[c],o[c])}else i(o)&&i(s)&&(t(s,o),Object.keys(s).length||delete e[a])}}},{"./is_array":685,"./is_plain_object":686}],703:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("./loggers");function a(t,e){return t<e}function o(t,e){return t<=e}function s(t,e){return t>e}function l(t,e){return t>=e}r.findBin=function(t,e,r){if(n(e.start))return r?Math.ceil((t-e.start)/e.size-1e-9)-1:Math.floor((t-e.start)/e.size+1e-9);var c,u,h=0,f=e.length,p=0,d=f>1?(e[f-1]-e[0])/(f-1):1;for(u=d>=0?r?a:o:r?l:s,t+=1e-9*d*(r?-1:1)*(d>=0?1:-1);h<f&&p++<100;)u(e[c=Math.floor((h+f)/2)],t)?h=c+1:f=c;return p>90&&i.log("Long binary search..."),h-1},r.sorterAsc=function(t,e){return t-e},r.sorterDes=function(t,e){return e-t},r.distinctVals=function(t){var e=t.slice();e.sort(r.sorterAsc);for(var n=e.length-1,i=e[n]-e[0]||1,a=i/(n||1)/1e4,o=[e[0]],s=0;s<n;s++)e[s+1]>e[s]+a&&(i=Math.min(i,e[s+1]-e[s]),o.push(e[s+1]));return{vals:o,minDiff:i}},r.roundUp=function(t,e,r){for(var n,i=0,a=e.length-1,o=0,s=r?0:1,l=r?1:0,c=r?Math.ceil:Math.floor;i<a&&o++<100;)e[n=c((i+a)/2)]<=t?i=n+s:a=n-l;return e[i]}},{"./loggers":689,"fast-isnumeric":214}],704:[function(t,e,r){"use strict";e.exports=function(t,e){(t.attr("class")||"").split(" ").forEach(function(e){0===e.indexOf("cursor-")&&t.classed(e,!1)}),e&&t.classed("cursor-"+e,!0)}},{}],705:[function(t,e,r){"use strict";var n=t("../components/color"),i=function(){};e.exports=function(t){for(var e in t)"function"==typeof t[e]&&(t[e]=i);t.destroy=function(){t.container.parentNode.removeChild(t.container)};var r=document.createElement("div");r.className="no-webgl",r.style.cursor="pointer",r.style.fontSize="24px",r.style.color=n.defaults[0],r.style.position="absolute",r.style.left=r.style.top="0px",r.style.width=r.style.height="100%",r.style["background-color"]=n.lightLine,r.style["z-index"]=30;var a=document.createElement("p");return a.textContent="WebGL is not supported by your browser - visit https://get.webgl.org for more info",a.style.position="relative",a.style.top="50%",a.style.left="50%",a.style.height="30%",a.style.width="50%",a.style.margin="-15% 0 0 -25%",r.appendChild(a),t.container.appendChild(r),t.container.style.background="#FFFFFF",t.container.onclick=function(){window.open("https://get.webgl.org")},!1}},{"../components/color":558}],706:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("./is_array").isArrayOrTypedArray;r.aggNums=function(t,e,a,o){var s,l;if((!o||o>a.length)&&(o=a.length),n(e)||(e=!1),i(a[0])){for(l=new Array(o),s=0;s<o;s++)l[s]=r.aggNums(t,e,a[s]);a=l}for(s=0;s<o;s++)n(e)?n(a[s])&&(e=t(+e,+a[s])):e=a[s];return e},r.len=function(t){return r.aggNums(function(t){return t+1},0,t)},r.mean=function(t,e){return e||(e=r.len(t)),r.aggNums(function(t,e){return t+e},0,t)/e},r.midRange=function(t){if(void 0!==t&&0!==t.length)return(r.aggNums(Math.max,null,t)+r.aggNums(Math.min,null,t))/2},r.variance=function(t,e,i){return e||(e=r.len(t)),n(i)||(i=r.mean(t,e)),r.aggNums(function(t,e){return t+Math.pow(e-i,2)},0,t)/e},r.stdev=function(t,e,n){return Math.sqrt(r.variance(t,e,n))},r.interp=function(t,e){if(!n(e))throw"n should be a finite number";if((e=e*t.length-.5)<0)return t[0];if(e>t.length-1)return t[t.length-1];var r=e%1;return r*t[Math.ceil(e)]+(1-r)*t[Math.floor(e)]}},{"./is_array":685,"fast-isnumeric":214}],707:[function(t,e,r){"use strict";var n=t("color-normalize");e.exports=function(t){return t?n(t):[0,0,0,1]}},{"color-normalize":107}],708:[function(t,e,r){"use strict";var n=t("d3"),i=t("../lib"),a=t("../constants/xmlns_namespaces"),o=t("../constants/string_mappings"),s=t("../constants/alignment").LINE_SPACING;function l(t,e){return t.node().getBoundingClientRect()[e]}var c=/([^$]*)([$]+[^$]*[$]+)([^$]*)/;r.convertToTspans=function(t,e,o){var v=t.text(),C=!t.attr("data-notex")&&"undefined"!=typeof MathJax&&v.match(c),L=n.select(t.node().parentNode);if(!L.empty()){var z=t.attr("class")?t.attr("class").split(" ")[0]:"text";return z+="-math",L.selectAll("svg."+z).remove(),L.selectAll("g."+z+"-group").remove(),t.style("display",null).attr({"data-unformatted":v,"data-math":"N"}),C?(e&&e._promises||[]).push(new Promise(function(e){t.style("display","none");var r=parseInt(t.node().style.fontSize,10),a={fontSize:r};!function(t,e,r){var a="math-output-"+i.randstr({},64),o=n.select("body").append("div").attr({id:a}).style({visibility:"hidden",position:"absolute"}).style({"font-size":e.fontSize+"px"}).text((s=t,s.replace(u,"\\lt ").replace(h,"\\gt ")));var s;MathJax.Hub.Queue(["Typeset",MathJax.Hub,o.node()],function(){var e=n.select("body").select("#MathJax_SVG_glyphs");if(o.select(".MathJax_SVG").empty()||!o.select("svg").node())i.log("There was an error in the tex syntax.",t),r();else{var a=o.select("svg").node().getBoundingClientRect();r(o.select(".MathJax_SVG"),e,a)}o.remove()})}(C[2],a,function(n,i,a){L.selectAll("svg."+z).remove(),L.selectAll("g."+z+"-group").remove();var s=n&&n.select("svg");if(!s||!s.node())return P(),void e();var c=L.append("g").classed(z+"-group",!0).attr({"pointer-events":"none","data-unformatted":v,"data-math":"Y"});c.node().appendChild(s.node()),i&&i.node()&&s.node().insertBefore(i.node().cloneNode(!0),s.node().firstChild),s.attr({class:z,height:a.height,preserveAspectRatio:"xMinYMin meet"}).style({overflow:"visible","pointer-events":"none"});var u=t.node().style.fill||"black";s.select("g").attr({fill:u,stroke:u});var h=l(s,"width"),f=l(s,"height"),p=+t.attr("x")-h*{start:0,middle:.5,end:1}[t.attr("text-anchor")||"start"],d=-(r||l(t,"height"))/4;"y"===z[0]?(c.attr({transform:"rotate("+[-90,+t.attr("x"),+t.attr("y")]+") translate("+[-h/2,d-f/2]+")"}),s.attr({x:+t.attr("x"),y:+t.attr("y")})):"l"===z[0]?s.attr({x:t.attr("x"),y:d-f/2}):"a"===z[0]?s.attr({x:0,y:d}):s.attr({x:p,y:+t.attr("y")+d-f/2}),o&&o.call(t,c),e(c)})})):P(),t}function P(){L.empty()||(z=t.attr("class")+"-math",L.select("svg."+z).remove()),t.text("").style("white-space","pre"),function(t,e){e=(r=e,function(t,e){if(!t)return"";for(var r=0;r<e.length;r++){var n=e[r];t=t.replace(n.regExp,n.sub)}return t}(r,y)).replace(x," ");var r;var o,l=!1,c=[],u=-1;function h(){u++;var e=document.createElementNS(a.svg,"tspan");n.select(e).attr({class:"line",dy:u*s+"em"}),t.appendChild(e),o=e;var r=c;if(c=[{node:e}],r.length>1)for(var i=1;i<r.length;i++)v(r[i])}function v(t){var e,r=t.type,i={};if("a"===r){e="a";var s=t.target,l=t.href,u=t.popup;l&&(i={"xlink:xlink:show":"_blank"===s||"_"!==s.charAt(0)?"new":"replace",target:s,"xlink:xlink:href":l},u&&(i.onclick='window.open(this.href.baseVal,this.target.baseVal,"'+u+'");return false;'))}else e="tspan";t.style&&(i.style=t.style);var h=document.createElementNS(a.svg,e);if("sup"===r||"sub"===r){C(o,g),o.appendChild(h);var f=document.createElementNS(a.svg,"tspan");C(f,g),n.select(f).attr("dy",d[r]),i.dy=p[r],o.appendChild(h),o.appendChild(f)}else o.appendChild(h);n.select(h).attr(i),o=t.node=h,c.push(t)}function C(t,e){t.appendChild(document.createTextNode(e))}function L(t){if(1!==c.length){var r=c.pop();t!==r.type&&i.log("Start tag <"+r.type+"> doesnt match end tag <"+t+">. Pretending it did match.",e),o=c[c.length-1].node}else i.log("Ignoring unexpected end tag </"+t+">.",e)}w.test(e)?h():(o=t,c=[{node:t}]);for(var z=e.split(b),P=0;P<z.length;P++){var I=z[P],O=I.match(_),D=O&&O[2].toLowerCase(),R=f[D];if("br"===D)h();else if(void 0===R)C(o,I);else if(O[1])L(D);else{var B=O[4],F={type:D},N=S(B,k);if(N?(N=N.replace(E,"$1 fill:"),R&&(N+=";"+R)):R&&(N=R),N&&(F.style=N),"a"===D){l=!0;var j=S(B,M);if(j){var V=document.createElement("a");V.href=j,-1!==m.indexOf(V.protocol)&&(F.href=encodeURI(decodeURI(j)),F.target=S(B,A)||"_blank",F.popup=S(B,T))}}v(F)}}return l}(t.node(),v)&&t.style("pointer-events","all"),r.positionText(t),o&&o.call(t)}};var u=/(<|&lt;|&#60;)/g,h=/(>|&gt;|&#62;)/g;var f={sup:"font-size:70%",sub:"font-size:70%",b:"font-weight:bold",i:"font-style:italic",a:"cursor:pointer",span:"",em:"font-style:italic;font-weight:bold"},p={sub:"0.3em",sup:"-0.6em"},d={sub:"-0.21em",sup:"0.42em"},g="\u200b",m=["http:","https:","mailto:","",void 0,":"],v=new RegExp("</?("+Object.keys(f).join("|")+")( [^>]*)?/?>","g"),y=Object.keys(o.entityToUnicode).map(function(t){return{regExp:new RegExp("&"+t+";","g"),sub:o.entityToUnicode[t]}}),x=/(\r\n?|\n)/g,b=/(<[^<>]*>)/,_=/<(\/?)([^ >]*)(\s+(.*))?>/i,w=/<br(\s+.*)?>/i,k=/(^|[\s"'])style\s*=\s*("([^"]*);?"|'([^']*);?')/i,M=/(^|[\s"'])href\s*=\s*("([^"]*)"|'([^']*)')/i,A=/(^|[\s"'])target\s*=\s*("([^"\s]*)"|'([^'\s]*)')/i,T=/(^|[\s"'])popup\s*=\s*("([\w=,]*)"|'([\w=,]*)')/i;function S(t,e){if(!t)return null;var r=t.match(e);return r&&(r[3]||r[4])}var E=/(^|;)\s*color:/;function C(t,e,r){var n,i,a,o=r.horizontalAlign,s=r.verticalAlign||"top",l=t.node().getBoundingClientRect(),c=e.node().getBoundingClientRect();return i="bottom"===s?function(){return l.bottom-n.height}:"middle"===s?function(){return l.top+(l.height-n.height)/2}:function(){return l.top},a="right"===o?function(){return l.right-n.width}:"center"===o?function(){return l.left+(l.width-n.width)/2}:function(){return l.left},function(){return n=this.node().getBoundingClientRect(),this.style({top:i()-c.top+"px",left:a()-c.left+"px","z-index":1e3}),this}}r.plainText=function(t){return(t||"").replace(v," ")},r.lineCount=function(t){return t.selectAll("tspan.line").size()||1},r.positionText=function(t,e,r){return t.each(function(){var t=n.select(this);function i(e,r){return void 0===r?null===(r=t.attr(e))&&(t.attr(e,0),r=0):t.attr(e,r),r}var a=i("x",e),o=i("y",r);"text"===this.nodeName&&t.selectAll("tspan.line").attr({x:a,y:o})})},r.makeEditable=function(t,e){var r=e.gd,i=e.delegate,a=n.dispatch("edit","input","cancel"),o=i||t;if(t.style({"pointer-events":i?"none":"all"}),1!==t.size())throw new Error("boo");function s(){!function(){var i=n.select(r).select(".svg-container"),o=i.append("div"),s=t.node().style,c=parseFloat(s.fontSize||12),u=e.text;void 0===u&&(u=t.attr("data-unformatted"));o.classed("plugin-editable editable",!0).style({position:"absolute","font-family":s.fontFamily||"Arial","font-size":c,color:e.fill||s.fill||"black",opacity:1,"background-color":e.background||"transparent",outline:"#ffffff33 1px solid",margin:[-c/8+1,0,0,-1].join("px ")+"px",padding:"0","box-sizing":"border-box"}).attr({contenteditable:!0}).text(u).call(C(t,i,e)).on("blur",function(){r._editing=!1,t.text(this.textContent).style({opacity:1});var e,i=n.select(this).attr("class");(e=i?"."+i.split(" ")[0]+"-math-group":"[class*=-math-group]")&&n.select(t.node().parentNode).select(e).style({opacity:0});var o=this.textContent;n.select(this).transition().duration(0).remove(),n.select(document).on("mouseup",null),a.edit.call(t,o)}).on("focus",function(){var t=this;r._editing=!0,n.select(document).on("mouseup",function(){if(n.event.target===t)return!1;document.activeElement===o.node()&&o.node().blur()})}).on("keyup",function(){27===n.event.which?(r._editing=!1,t.style({opacity:1}),n.select(this).style({opacity:0}).on("blur",function(){return!1}).transition().remove(),a.cancel.call(t,this.textContent)):(a.input.call(t,this.textContent),n.select(this).call(C(t,i,e)))}).on("keydown",function(){13===n.event.which&&this.blur()}).call(l)}(),t.style({opacity:0});var i,s=o.attr("class");(i=s?"."+s.split(" ")[0]+"-math-group":"[class*=-math-group]")&&n.select(t.node().parentNode).select(i).style({opacity:0})}function l(t){var e=t.node(),r=document.createRange();r.selectNodeContents(e);var n=window.getSelection();n.removeAllRanges(),n.addRange(r),e.focus()}return e.immediate?s():o.on("click",s),n.rebind(t,a,"on")}},{"../constants/alignment":656,"../constants/string_mappings":662,"../constants/xmlns_namespaces":663,"../lib":684,d3:147}],709:[function(t,e,r){"use strict";var n={};function i(t){t&&null!==t.timer&&(clearTimeout(t.timer),t.timer=null)}r.throttle=function(t,e,r){var a=n[t],o=Date.now();if(!a){for(var s in n)n[s].ts<o-6e4&&delete n[s];a=n[t]={ts:0,timer:null}}function l(){r(),a.ts=Date.now(),a.onDone&&(a.onDone(),a.onDone=null)}i(a),o>a.ts+e?l():a.timer=setTimeout(function(){l(),a.timer=null},e)},r.done=function(t){var e=n[t];return e&&e.timer?new Promise(function(t){var r=e.onDone;e.onDone=function(){r&&r(),t(),e.onDone=null}}):Promise.resolve()},r.clear=function(t){if(t)i(n[t]),delete n[t];else for(var e in n)r.clear(e)}},{}],710:[function(t,e,r){"use strict";var n=t("fast-isnumeric");e.exports=function(t,e){if(t>0)return Math.log(t)/Math.LN10;var r=Math.log(Math.min(e[0],e[1]))/Math.LN10;return n(r)||(r=Math.log(Math.max(e[0],e[1]))/Math.LN10-6),r}},{"fast-isnumeric":214}],711:[function(t,e,r){"use strict";var n=e.exports={},i=t("../plots/geo/constants").locationmodeToLayer,a=t("topojson-client").feature;n.getTopojsonName=function(t){return[t.scope.replace(/ /g,"-"),"_",t.resolution.toString(),"m"].join("")},n.getTopojsonPath=function(t,e){return t+e+".json"},n.getTopojsonFeatures=function(t,e){var r=i[t.locationmode],n=e.objects[r];return a(e,n).features}},{"../plots/geo/constants":760,"topojson-client":502}],712:[function(t,e,r){"use strict";e.exports={moduleType:"locale",name:"en-US",dictionary:{"Click to enter Colorscale title":"Click to enter Colorscale title"},format:{date:"%m/%d/%Y"}}},{}],713:[function(t,e,r){"use strict";e.exports={moduleType:"locale",name:"en",dictionary:{"Click to enter Colorscale title":"Click to enter Colourscale title"},format:{days:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],shortDays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],months:["January","February","March","April","May","June","July","August","September","October","November","December"],shortMonths:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],periods:["AM","PM"],dateTime:"%a %b %e %X %Y",date:"%d/%m/%Y",time:"%H:%M:%S",decimal:".",thousands:",",grouping:[3],currency:["$",""],year:"%Y",month:"%b %Y",dayMonth:"%b %-d",dayMonthYear:"%b %-d, %Y"}}},{}],714:[function(t,e,r){"use strict";var n=t("../registry");e.exports=function(t){for(var e,r,i=n.layoutArrayContainers,a=n.layoutArrayRegexes,o=t.split("[")[0],s=0;s<a.length;s++)if((r=t.match(a[s]))&&0===r.index){e=r[0];break}if(e||(e=i[i.indexOf(o)]),!e)return!1;var l=t.substr(e.length);return l?!!(r=l.match(/^\[(0|[1-9][0-9]*)\](\.(.+))?$/))&&{array:e,index:Number(r[1]),property:r[3]||""}:{array:e,index:"",property:""}}},{"../registry":817}],715:[function(t,e,r){"use strict";var n=t("../lib"),i=n.extendFlat,a=n.isPlainObject,o={valType:"flaglist",extras:["none"],flags:["calc","calcIfAutorange","clearAxisTypes","plot","style","colorbars"]},s={valType:"flaglist",extras:["none"],flags:["calc","calcIfAutorange","plot","legend","ticks","axrange","layoutstyle","modebar","camera","arraydraw"]},l=o.flags.slice().concat(["clearCalc","fullReplot"]),c=s.flags.slice().concat("layoutReplot");function u(t){for(var e={},r=0;r<t.length;r++)e[t[r]]=!1;return e}function h(t,e,r){var n=i({},t);for(var o in n){var s=n[o];a(s)&&(n[o]=f(s,e,r,o))}return"from-root"===r&&(n.editType=e),n}function f(t,e,r,n){if(t.valType){var a=i({},t);if(a.editType=e,Array.isArray(t.items)){a.items=new Array(t.items.length);for(var o=0;o<t.items.length;o++)a.items[o]=f(t.items[o],e,"from-root")}return a}return h(t,e,"_"===n.charAt(0)?"nested":"from-root")}e.exports={traces:o,layout:s,traceFlags:function(){return u(l)},layoutFlags:function(){return u(c)},update:function(t,e){var r=e.editType;if(r&&"none"!==r)for(var n=r.split("+"),i=0;i<n.length;i++)t[n[i]]=!0},overrideAll:h}},{"../lib":684}],716:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("gl-mat4/fromQuat"),a=t("../registry"),o=t("../lib"),s=t("../plots/plots"),l=t("../plots/cartesian/axis_ids"),c=l.cleanId,u=l.getFromTrace,h=t("../components/color");function f(t,e){var r=t[e],n=e.charAt(0);r&&"paper"!==r&&(t[e]=c(r,n))}function p(t){if(!o.isPlainObject(t))return!1;var e=t.name;return delete t.name,delete t.showlegend,("string"==typeof e||"number"==typeof e)&&String(e)}function d(t,e,r,n){if(r&&!n)return t;if(n&&!r)return e;if(!t.trim())return e;if(!e.trim())return t;var i,a=Math.min(t.length,e.length);for(i=0;i<a&&t.charAt(i)===e.charAt(i);i++);return t.substr(0,i).trim()}function g(t){var e="middle",r="center";return-1!==t.indexOf("top")?e="top":-1!==t.indexOf("bottom")&&(e="bottom"),-1!==t.indexOf("left")?r="left":-1!==t.indexOf("right")&&(r="right"),e+" "+r}function m(t,e){return e in t&&"object"==typeof t[e]&&0===Object.keys(t[e]).length}r.clearPromiseQueue=function(t){Array.isArray(t._promises)&&t._promises.length>0&&o.log("Clearing previous rejected promises from queue."),t._promises=[]},r.cleanLayout=function(t){var e,r;t||(t={}),t.xaxis1&&(t.xaxis||(t.xaxis=t.xaxis1),delete t.xaxis1),t.yaxis1&&(t.yaxis||(t.yaxis=t.yaxis1),delete t.yaxis1),t.scene1&&(t.scene||(t.scene=t.scene1),delete t.scene1);var n=(s.subplotsRegistry.cartesian||{}).attrRegex,a=(s.subplotsRegistry.gl3d||{}).attrRegex,l=Object.keys(t);for(e=0;e<l.length;e++){var u=l[e];if(n&&n.test(u)){var p=t[u];p.anchor&&"free"!==p.anchor&&(p.anchor=c(p.anchor)),p.overlaying&&(p.overlaying=c(p.overlaying)),p.type||(p.isdate?p.type="date":p.islog?p.type="log":!1===p.isdate&&!1===p.islog&&(p.type="linear")),"withzero"!==p.autorange&&"tozero"!==p.autorange||(p.autorange=!0,p.rangemode="tozero"),delete p.islog,delete p.isdate,delete p.categories,m(p,"domain")&&delete p.domain,void 0!==p.autotick&&(void 0===p.tickmode&&(p.tickmode=p.autotick?"auto":"linear"),delete p.autotick)}else if(a&&a.test(u)){var d=t[u],g=d.cameraposition;if(Array.isArray(g)&&4===g[0].length){var v=g[0],y=g[1],x=g[2],b=i([],v),_=[];for(r=0;r<3;++r)_[r]=y[r]+x*b[2+4*r];d.camera={eye:{x:_[0],y:_[1],z:_[2]},center:{x:y[0],y:y[1],z:y[2]},up:{x:b[1],y:b[5],z:b[9]}},delete d.cameraposition}}}var w=Array.isArray(t.annotations)?t.annotations.length:0;for(e=0;e<w;e++){var k=t.annotations[e];o.isPlainObject(k)&&(k.ref&&("paper"===k.ref?(k.xref="paper",k.yref="paper"):"data"===k.ref&&(k.xref="x",k.yref="y"),delete k.ref),f(k,"xref"),f(k,"yref"))}var M=Array.isArray(t.shapes)?t.shapes.length:0;for(e=0;e<M;e++){var A=t.shapes[e];o.isPlainObject(A)&&(f(A,"xref"),f(A,"yref"))}var T=t.legend;return T&&(T.x>3?(T.x=1.02,T.xanchor="left"):T.x<-2&&(T.x=-.02,T.xanchor="right"),T.y>3?(T.y=1.02,T.yanchor="bottom"):T.y<-2&&(T.y=-.02,T.yanchor="top")),"rotate"===t.dragmode&&(t.dragmode="orbit"),h.clean(t),t},r.cleanData=function(t){for(var e=0;e<t.length;e++){var n,i=t[e];if("histogramy"===i.type&&"xbins"in i&&!("ybins"in i)&&(i.ybins=i.xbins,delete i.xbins),i.error_y&&"opacity"in i.error_y){var l=h.defaults,u=i.error_y.color||(a.traceIs(i,"bar")?h.defaultLine:l[e%l.length]);i.error_y.color=h.addOpacity(h.rgb(u),h.opacity(u)*i.error_y.opacity),delete i.error_y.opacity}if("bardir"in i&&("h"!==i.bardir||!a.traceIs(i,"bar")&&"histogram"!==i.type.substr(0,9)||(i.orientation="h",r.swapXYData(i)),delete i.bardir),"histogramy"===i.type&&r.swapXYData(i),"histogramx"!==i.type&&"histogramy"!==i.type||(i.type="histogram"),"scl"in i&&(i.colorscale=i.scl,delete i.scl),"reversescl"in i&&(i.reversescale=i.reversescl,delete i.reversescl),i.xaxis&&(i.xaxis=c(i.xaxis,"x")),i.yaxis&&(i.yaxis=c(i.yaxis,"y")),a.traceIs(i,"gl3d")&&i.scene&&(i.scene=s.subplotsRegistry.gl3d.cleanId(i.scene)),!a.traceIs(i,"pie")&&!a.traceIs(i,"bar"))if(Array.isArray(i.textposition))for(n=0;n<i.textposition.length;n++)i.textposition[n]=g(i.textposition[n]);else i.textposition&&(i.textposition=g(i.textposition));var f=a.getModule(i);if(f&&f.colorbar){var v=f.colorbar.container,y=v?i[v]:i;y&&y.colorscale&&("YIGnBu"===y.colorscale&&(y.colorscale="YlGnBu"),"YIOrRd"===y.colorscale&&(y.colorscale="YlOrRd"))}if("surface"===i.type&&o.isPlainObject(i.contours)){var x=["x","y","z"];for(n=0;n<x.length;n++){var b=i.contours[x[n]];o.isPlainObject(b)&&(b.highlightColor&&(b.highlightcolor=b.highlightColor,delete b.highlightColor),b.highlightWidth&&(b.highlightwidth=b.highlightWidth,delete b.highlightWidth))}}if("candlestick"===i.type||"ohlc"===i.type){var _=!1!==(i.increasing||{}).showlegend,w=!1!==(i.decreasing||{}).showlegend,k=p(i.increasing),M=p(i.decreasing);if(!1!==k&&!1!==M){var A=d(k,M,_,w);A&&(i.name=A)}else!k&&!M||i.name||(i.name=k||M)}if(Array.isArray(i.transforms)){var T=i.transforms;for(n=0;n<T.length;n++){var S=T[n];if(o.isPlainObject(S))switch(S.type){case"filter":S.filtersrc&&(S.target=S.filtersrc,delete S.filtersrc),S.calendar&&(S.valuecalendar||(S.valuecalendar=S.calendar),delete S.calendar);break;case"groupby":if(S.styles=S.styles||S.style,S.styles&&!Array.isArray(S.styles)){var E=S.styles,C=Object.keys(E);S.styles=[];for(var L=0;L<C.length;L++)S.styles.push({target:C[L],value:E[C[L]]})}}}}m(i,"line")&&delete i.line,"marker"in i&&(m(i.marker,"line")&&delete i.marker.line,m(i,"marker")&&delete i.marker),h.clean(i)}},r.swapXYData=function(t){var e;if(o.swapAttrs(t,["?","?0","d?","?bins","nbins?","autobin?","?src","error_?"]),Array.isArray(t.z)&&Array.isArray(t.z[0])&&(t.transpose?delete t.transpose:t.transpose=!0),t.error_x&&t.error_y){var r=t.error_y,n="copy_ystyle"in r?r.copy_ystyle:!(r.color||r.thickness||r.width);o.swapAttrs(t,["error_?.copy_ystyle"]),n&&o.swapAttrs(t,["error_?.color","error_?.thickness","error_?.width"])}if("string"==typeof t.hoverinfo){var i=t.hoverinfo.split("+");for(e=0;e<i.length;e++)"x"===i[e]?i[e]="y":"y"===i[e]&&(i[e]="x");t.hoverinfo=i.join("+")}},r.coerceTraceIndices=function(t,e){return n(e)?[e]:Array.isArray(e)&&e.length?e:t.data.map(function(t,e){return e})},r.manageArrayContainers=function(t,e,r){var i=t.obj,a=t.parts,s=a.length,l=a[s-1],c=n(l);if(c&&null===e){var u=a.slice(0,s-1).join(".");o.nestedProperty(i,u).get().splice(l,1)}else c&&void 0===t.get()?(void 0===t.get()&&(r[t.astr]=null),t.set(e)):t.set(e)};var v=/(\.[^\[\]\.]+|\[[^\[\]\.]+\])$/;function y(t){var e=t.search(v);if(e>0)return t.substr(0,e)}r.hasParent=function(t,e){for(var r=y(e);r;){if(r in t)return!0;r=y(r)}return!1};var x=["x","y","z"];r.clearAxisTypes=function(t,e,r){for(var n=0;n<e.length;n++)for(var i=t._fullData[n],a=0;a<3;a++){var s=u(t,i,x[a]);if(s&&"log"!==s.type){var l=s._name,c=s._id.substr(1);if("scene"===c.substr(0,5)){if(void 0!==r[c])continue;l=c+"."+l}var h=l+".type";void 0===r[l]&&void 0===r[h]&&o.nestedProperty(t.layout,h).set(null)}}}},{"../components/color":558,"../lib":684,"../plots/cartesian/axis_ids":735,"../plots/plots":795,"../registry":817,"fast-isnumeric":214,"gl-mat4/fromQuat":251}],717:[function(t,e,r){"use strict";var n=t("./plot_api");r.plot=n.plot,r.newPlot=n.newPlot,r.restyle=n.restyle,r.relayout=n.relayout,r.redraw=n.redraw,r.update=n.update,r.react=n.react,r.extendTraces=n.extendTraces,r.prependTraces=n.prependTraces,r.addTraces=n.addTraces,r.deleteTraces=n.deleteTraces,r.moveTraces=n.moveTraces,r.purge=n.purge,r.addFrames=n.addFrames,r.deleteFrames=n.deleteFrames,r.animate=n.animate,r.setPlotConfig=n.setPlotConfig,r.toImage=t("./to_image"),r.validate=t("./validate"),r.downloadImage=t("../snapshot/download");var i=t("./template_api");r.makeTemplate=i.makeTemplate,r.validateTemplate=i.validateTemplate},{"../snapshot/download":819,"./plot_api":719,"./template_api":724,"./to_image":725,"./validate":726}],718:[function(t,e,r){"use strict";var n=t("../lib/nested_property"),i=t("../lib/is_plain_object"),a=t("../lib/noop"),o=t("../lib/loggers"),s=t("../lib/search").sorterAsc,l=t("../registry");r.containerArrayMatch=t("./container_array_match");var c=r.isAddVal=function(t){return"add"===t||i(t)},u=r.isRemoveVal=function(t){return null===t||"remove"===t};r.applyContainerArrayChanges=function(t,e,r,i){var h=e.astr,f=l.getComponentMethod(h,"supplyLayoutDefaults"),p=l.getComponentMethod(h,"draw"),d=l.getComponentMethod(h,"drawOne"),g=i.replot||i.recalc||f===a||p===a,m=t.layout,v=t._fullLayout;if(r[""]){Object.keys(r).length>1&&o.warn("Full array edits are incompatible with other edits",h);var y=r[""][""];if(u(y))e.set(null);else{if(!Array.isArray(y))return o.warn("Unrecognized full array edit value",h,y),!0;e.set(y)}return!g&&(f(m,v),p(t),!0)}var x,b,_,w,k,M,A,T=Object.keys(r).map(Number).sort(s),S=e.get(),E=S||[],C=n(v,h).get(),L=[],z=-1,P=E.length;for(x=0;x<T.length;x++)if(w=r[_=T[x]],k=Object.keys(w),M=w[""],A=c(M),_<0||_>E.length-(A?0:1))o.warn("index out of range",h,_);else if(void 0!==M)k.length>1&&o.warn("Insertion & removal are incompatible with edits to the same index.",h,_),u(M)?L.push(_):A?("add"===M&&(M={}),E.splice(_,0,M),C&&C.splice(_,0,{})):o.warn("Unrecognized full object edit value",h,_,M),-1===z&&(z=_);else for(b=0;b<k.length;b++)n(E[_],k[b]).set(w[k[b]]);for(x=L.length-1;x>=0;x--)E.splice(L[x],1),C&&C.splice(L[x],1);if(E.length?S||e.set(E):e.set(null),g)return!1;if(f(m,v),d!==a){var I;if(-1===z)I=T;else{for(P=Math.max(E.length,P),I=[],x=0;x<T.length&&!((_=T[x])>=z);x++)I.push(_);for(x=z;x<P;x++)I.push(x)}for(x=0;x<I.length;x++)d(t,I[x])}else p(t);return!0}},{"../lib/is_plain_object":686,"../lib/loggers":689,"../lib/nested_property":692,"../lib/noop":693,"../lib/search":703,"../registry":817,"./container_array_match":714}],719:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("has-hover"),o=t("../lib"),s=t("../lib/events"),l=t("../lib/queue"),c=t("../registry"),u=t("./plot_schema"),h=t("../plots/plots"),f=t("../plots/polar/legacy"),p=t("../plots/cartesian/axes"),d=t("../components/drawing"),g=t("../components/color"),m=t("../components/colorbar/connect"),v=t("../plots/cartesian/graph_interact").initInteractions,y=t("../constants/xmlns_namespaces"),x=t("../lib/svg_text_utils"),b=t("./plot_config"),_=t("./manage_arrays"),w=t("./helpers"),k=t("./subroutines"),M=t("./edit_types"),A=t("../plots/cartesian/constants").AX_NAME_PATTERN,T=0;function S(t){var e=t._fullLayout;e._redrawFromAutoMarginCount?e._redrawFromAutoMarginCount--:t.emit("plotly_afterplot")}function E(t,e){try{t._fullLayout._paper.style("background",e)}catch(t){o.error(t)}}function C(t,e){E(t,g.combine(e,"white"))}function L(t,e){t._context||(t._context=o.extendDeep({},b));var r,n,i,s=t._context;if(e){for(n=Object.keys(e),r=0;r<n.length;r++)"editable"!==(i=n[r])&&"edits"!==i&&i in s&&("setBackground"===i&&"opaque"===e[i]?s[i]=C:s[i]=e[i]);e.plot3dPixelRatio&&!s.plotGlPixelRatio&&(s.plotGlPixelRatio=s.plot3dPixelRatio);var l=e.editable;if(void 0!==l)for(s.editable=l,n=Object.keys(s.edits),r=0;r<n.length;r++)s.edits[n[r]]=l;if(e.edits)for(n=Object.keys(e.edits),r=0;r<n.length;r++)(i=n[r])in s.edits&&(s.edits[i]=e.edits[i])}s.staticPlot&&(s.editable=!1,s.edits={},s.autosizable=!1,s.scrollZoom=!1,s.doubleClick=!1,s.showTips=!1,s.showLink=!1,s.displayModeBar=!1),"hover"!==s.displayModeBar||a||(s.displayModeBar=!0),"transparent"!==s.setBackground&&"function"==typeof s.setBackground||(s.setBackground=E)}function z(t,e){var r,n,i=e+1,a=[];for(r=0;r<t.length;r++)(n=t[r])<0?a.push(i+n):a.push(n);return a}function P(t,e,r){var n,i;for(n=0;n<e.length;n++){if((i=e[n])!==parseInt(i,10))throw new Error("all values in "+r+" must be integers");if(i>=t.data.length||i<-t.data.length)throw new Error(r+" must be valid indices for gd.data.");if(e.indexOf(i,n+1)>-1||i>=0&&e.indexOf(-t.data.length+i)>-1||i<0&&e.indexOf(t.data.length+i)>-1)throw new Error("each index in "+r+" must be unique.")}}function I(t,e,r){if(!Array.isArray(t.data))throw new Error("gd.data must be an array.");if("undefined"==typeof e)throw new Error("currentIndices is a required argument.");if(Array.isArray(e)||(e=[e]),P(t,e,"currentIndices"),"undefined"==typeof r||Array.isArray(r)||(r=[r]),"undefined"!=typeof r&&P(t,r,"newIndices"),"undefined"!=typeof r&&e.length!==r.length)throw new Error("current and new indices must be of equal length.")}function O(t,e,r,n,a){!function(t,e,r,n){var i=o.isPlainObject(n);if(!Array.isArray(t.data))throw new Error("gd.data must be an array");if(!o.isPlainObject(e))throw new Error("update must be a key:value object");if("undefined"==typeof r)throw new Error("indices must be an integer or array of integers");for(var a in P(t,r,"indices"),e){if(!Array.isArray(e[a])||e[a].length!==r.length)throw new Error("attribute "+a+" must be an array of length equal to indices array length");if(i&&(!(a in n)||!Array.isArray(n[a])||n[a].length!==e[a].length))throw new Error("when maxPoints is set as a key:value object it must contain a 1:1 corrispondence with the keys and number of traces in the update object")}}(t,e,r,n);for(var s=function(t,e,r,n){var a,s,l,c,u,h=o.isPlainObject(n),f=[];for(var p in Array.isArray(r)||(r=[r]),r=z(r,t.data.length-1),e)for(var d=0;d<r.length;d++){if(a=t.data[r[d]],s=(l=o.nestedProperty(a,p)).get(),c=e[p][d],!o.isArrayOrTypedArray(c))throw new Error("attribute: "+p+" index: "+d+" must be an array");if(!o.isArrayOrTypedArray(s))throw new Error("cannot extend missing or non-array attribute: "+p);if(s.constructor!==c.constructor)throw new Error("cannot extend array with an array of a different type: "+p);u=h?n[p][d]:n,i(u)||(u=-1),f.push({prop:l,target:s,insert:c,maxp:Math.floor(u)})}return f}(t,e,r,n),l={},c={},u=0;u<s.length;u++){var h=s[u].prop,f=s[u].maxp,p=a(s[u].target,s[u].insert,f);h.set(p[0]),Array.isArray(l[h.astr])||(l[h.astr]=[]),l[h.astr].push(p[1]),Array.isArray(c[h.astr])||(c[h.astr]=[]),c[h.astr].push(s[u].target.length)}return{update:l,maxPoints:c}}function D(t,e){var r=new t.constructor(t.length+e.length);return r.set(t),r.set(e,t.length),r}function R(t){return void 0===t?null:t}function B(t,e,r){var n,i,a=t._fullLayout,s=t._fullData,l=t.data,f=M.traceFlags(),d={},g={};function m(){return r.map(function(){})}function v(t){var e=p.id2name(t);-1===i.indexOf(e)&&i.push(e)}function y(t){return"LAYOUT"+t+".autorange"}function x(t){return"LAYOUT"+t+".range"}function b(n,i,a){var s;Array.isArray(n)?n.forEach(function(t){b(t,i,a)}):n in e||w.hasParent(e,n)||(s="LAYOUT"===n.substr(0,6)?o.nestedProperty(t.layout,n.replace("LAYOUT","")):o.nestedProperty(l[r[a]],n),n in g||(g[n]=m()),void 0===g[n][a]&&(g[n][a]=R(s.get())),void 0!==i&&s.set(i))}for(var _ in e){if(w.hasParent(e,_))throw new Error("cannot set "+_+"and a parent attribute simultaneously");var k,A,T,S,E,C,L=e[_];if(d[_]=L,"LAYOUT"!==_.substr(0,6)){for(g[_]=m(),n=0;n<r.length;n++)if(k=l[r[n]],A=s[r[n]],S=(T=o.nestedProperty(k,_)).get(),void 0!==(E=Array.isArray(L)?L[n%L.length]:L)){var z=T.parts[T.parts.length-1],P=_.substr(0,_.length-z.length-1),I=P?P+".":"",O=P?o.nestedProperty(A,P).get():A;if((C=u.getTraceValObject(A,T.parts))&&C.impliedEdits&&null!==E)for(var D in C.impliedEdits)b(o.relativeAttr(_,D),C.impliedEdits[D],n);else if("thicknessmode"!==z&&"lenmode"!==z||S===E||"fraction"!==E&&"pixels"!==E||!O){if("type"===_&&"pie"===E!=("pie"===S)){var B="x",F="y";"bar"!==E&&"bar"!==S||"h"!==k.orientation||(B="y",F="x"),o.swapAttrs(k,["?","?src"],"labels",B),o.swapAttrs(k,["d?","?0"],"label",B),o.swapAttrs(k,["?","?src"],"values",F),"pie"===S?(o.nestedProperty(k,"marker.color").set(o.nestedProperty(k,"marker.colors").get()),a._pielayer.selectAll("g.trace").remove()):c.traceIs(k,"cartesian")&&o.nestedProperty(k,"marker.colors").set(o.nestedProperty(k,"marker.color").get())}}else{var N=a._size,j=O.orient,V="top"===j||"bottom"===j;if("thicknessmode"===z){var U=V?N.h:N.w;b(I+"thickness",O.thickness*("fraction"===E?1/U:U),n)}else{var q=V?N.w:N.h;b(I+"len",O.len*("fraction"===E?1/q:q),n)}}g[_][n]=R(S);if(-1!==["swapxy","swapxyaxes","orientation","orientationaxes"].indexOf(_)){if("orientation"===_){T.set(E);var H=k.x&&!k.y?"h":"v";if((T.get()||H)===A.orientation)continue}else"orientationaxes"===_&&(k.orientation={v:"h",h:"v"}[A.orientation]);w.swapXYData(k),f.calc=f.clearAxisTypes=!0}else-1!==h.dataArrayContainers.indexOf(T.parts[0])?(w.manageArrayContainers(T,E,g),f.calc=!0):(C?C.arrayOk&&(o.isArrayOrTypedArray(E)||o.isArrayOrTypedArray(S))?f.calc=!0:M.update(f,C):f.calc=!0,T.set(E))}if(-1!==["swapxyaxes","orientationaxes"].indexOf(_)&&p.swap(t,r),"orientationaxes"===_){var G=o.nestedProperty(t.layout,"hovermode");"x"===G.get()?G.set("y"):"y"===G.get()&&G.set("x")}if(-1!==["orientation","type"].indexOf(_)){for(i=[],n=0;n<r.length;n++){var W=l[r[n]];c.traceIs(W,"cartesian")&&(v(W.xaxis||"x"),v(W.yaxis||"y"),"type"===_&&b(["autobinx","autobiny"],!0,n))}b(i.map(y),!0,0),b(i.map(x),[0,1],0)}}else T=o.nestedProperty(t.layout,_.replace("LAYOUT","")),g[_]=[R(T.get())],T.set(Array.isArray(L)?L[0]:L),f.calc=!0}var Y=!1,X=p.list(t);for(n=0;n<X.length;n++)if(X[n].autorange){Y=!0;break}return(f.calc||f.calcIfAutorange&&Y)&&(f.clearCalc=!0),(f.calc||f.plot||f.calcIfAutorange)&&(f.fullReplot=!0),{flags:f,undoit:g,redoit:d,traces:r,eventData:o.extendDeepNoArrays([],[d,r])}}function F(t,e){var r=e?function(t){return k.doTicksRelayout(t,e)}:k.doTicksRelayout;t.push(r,k.drawData,k.finalDraw)}r.plot=function(t,e,i,a){var l;if(t=o.getGraphDiv(t),s.init(t),o.isPlainObject(e)){var u=e;e=u.data,i=u.layout,a=u.config,l=u.frames}if(!1===s.triggerHandler(t,"plotly_beforeplot",[e,i,a]))return Promise.reject();e||i||o.isPlotDiv(t)||o.warn("Calling Plotly.plot as if redrawing but this container doesn't yet have a plot.",t),L(t,a),i||(i={}),n.select(t).classed("js-plotly-plot",!0),d.makeTester(),delete d.baseUrl,Array.isArray(t._promises)||(t._promises=[]);var g=0===(t.data||[]).length&&Array.isArray(e);if(Array.isArray(e)&&(w.cleanData(e),g?t.data=e:t.data.push.apply(t.data,e),t.empty=!1),t.layout&&!g||(t.layout=w.cleanLayout(i)),t._dragging&&!t._transitioning)return t._replotPending=!0,Promise.reject();t._replotPending=!1,h.supplyDefaults(t);var y=t._fullLayout,b=y._has("cartesian");if(!y._has("polar")&&e&&e[0]&&e[0].r)return o.log("Legacy polar charts are deprecated!"),function(t,e,r){var i=n.select(t).selectAll(".plot-container").data([0]);i.enter().insert("div",":first-child").classed("plot-container plotly",!0);var a=i.selectAll(".svg-container").data([0]);a.enter().append("div").classed("svg-container",!0).style("position","relative"),a.html(""),e&&(t.data=e);r&&(t.layout=r);f.manager.fillLayout(t),a.style({width:t._fullLayout.width+"px",height:t._fullLayout.height+"px"}),t.framework=f.manager.framework(t),t.framework({data:t.data,layout:t.layout},a.node()),t.framework.setUndoPoint();var s=t.framework.svg(),l=1,c=t._fullLayout.title;""!==c&&c||(l=0);var u=function(){this.call(x.convertToTspans,t)},p=s.select(".title-group text").call(u);if(t._context.edits.titleText){var d=o._(t,"Click to enter Plot title");c&&c!==d||(l=.2,p.attr({"data-unformatted":d}).text(d).style({opacity:l}).on("mouseover.opacity",function(){n.select(this).transition().duration(100).style("opacity",1)}).on("mouseout.opacity",function(){n.select(this).transition().duration(1e3).style("opacity",0)}));var g=function(){this.call(x.makeEditable,{gd:t}).on("edit",function(e){t.framework({layout:{title:e}}),this.text(e).call(u),this.call(g)}).on("cancel",function(){var t=this.attr("data-unformatted");this.text(t).call(u)})};p.call(g)}return t._context.setBackground(t,t._fullLayout.paper_bgcolor),h.addLinks(t),Promise.resolve()}(t,e,i);y._replotting=!0,g&&W(t),t.framework!==W&&(t.framework=W,W(t)),d.initGradients(t),g&&p.saveShowSpikeInitial(t);var _=!t.calcdata||t.calcdata.length!==(t._fullData||[]).length;_&&h.doCalcdata(t);for(var M=0;M<t.calcdata.length;M++)t.calcdata[M][0].trace=t._fullData[M];var A=JSON.stringify(y._size);function T(){var e,r,n,i=t.calcdata;for(h.clearAutoMarginIds(t),k.drawMarginPushers(t),p.allowAutoMargin(t),e=0;e<i.length;e++){var a=(n=(r=i[e])[0].trace)._module.colorbar;!0===n.visible&&a?m(t,r,a):h.autoMargin(t,"cb"+n.uid)}return h.doAutoMargin(t),h.previousPromises(t)}function E(){t._transitioning||(k.doAutoRangeAndConstraints(t),g&&p.saveRangeInitial(t))}var C=[h.previousPromises,function(){if(l)return r.addFrames(t,l)},function(){for(var e=y._basePlotModules,r=0;r<e.length;r++)e[r].drawFramework&&e[r].drawFramework(t);return!y._glcanvas&&y._has("gl")&&(y._glcanvas=y._glcontainer.selectAll(".gl-canvas").data([{key:"contextLayer",context:!0,pick:!1},{key:"focusLayer",context:!1,pick:!1},{key:"pickLayer",context:!1,pick:!0}],function(t){return t.key}),y._glcanvas.enter().append("canvas").attr("class",function(t){return"gl-canvas gl-canvas-"+t.key.replace("Layer","")}).style({position:"absolute",top:0,left:0,width:"100%",height:"100%",overflow:"visible","pointer-events":"none"})),y._glcanvas&&y._glcanvas.attr("width",y.width).attr("height",y.height),h.previousPromises(t)},T,function(){if(JSON.stringify(y._size)!==A)return o.syncOrAsync([T,k.layoutStyles],t)}];b&&C.push(function(){if(_)return h.doSetPositions(t),c.getComponentMethod("errorbars","calc")(t),o.syncOrAsync([c.getComponentMethod("shapes","calcAutorange"),c.getComponentMethod("annotations","calcAutorange"),E,c.getComponentMethod("rangeslider","calcAutorange")],t);E()}),C.push(k.layoutStyles),b&&C.push(function(){return p.doTicks(t,g?"":"redraw")}),C.push(k.drawData,k.finalDraw,v,h.addLinks,h.rehover,h.doAutoMargin,h.previousPromises);var z=o.syncOrAsync(C,t);return z&&z.then||(z=Promise.resolve()),z.then(function(){return S(t),t})},r.setPlotConfig=function(t){return o.extendFlat(b,t)},r.redraw=function(t){if(t=o.getGraphDiv(t),!o.isPlotDiv(t))throw new Error("This element is not a Plotly plot: "+t);return w.cleanData(t.data),w.cleanLayout(t.layout),t.calcdata=void 0,r.plot(t).then(function(){return t.emit("plotly_redraw"),t})},r.newPlot=function(t,e,n,i){return t=o.getGraphDiv(t),h.cleanPlot([],{},t._fullData||[],t._fullLayout||{},t.calcdata||[]),h.purge(t),r.plot(t,e,n,i)},r.extendTraces=function t(e,n,i,a){var s=O(e=o.getGraphDiv(e),n,i,a,function(t,e,r){var n,i;if(o.isTypedArray(t))if(r<0){var a=new t.constructor(0),s=D(t,e);r<0?(n=s,i=a):(n=a,i=s)}else if(n=new t.constructor(r),i=new t.constructor(t.length+e.length-r),r===e.length)n.set(e),i.set(t);else if(r<e.length){var l=e.length-r;n.set(e.subarray(l)),i.set(t),i.set(e.subarray(0,l),t.length)}else{var c=r-e.length,u=t.length-c;n.set(t.subarray(u)),n.set(e,c),i.set(t.subarray(0,u))}else n=t.concat(e),i=r>=0&&r<n.length?n.splice(0,n.length-r):[];return[n,i]}),c=r.redraw(e),u=[e,s.update,i,s.maxPoints];return l.add(e,r.prependTraces,u,t,arguments),c},r.prependTraces=function t(e,n,i,a){var s=O(e=o.getGraphDiv(e),n,i,a,function(t,e,r){var n,i;if(o.isTypedArray(t))if(r<=0){var a=new t.constructor(0),s=D(e,t);r<0?(n=s,i=a):(n=a,i=s)}else if(n=new t.constructor(r),i=new t.constructor(t.length+e.length-r),r===e.length)n.set(e),i.set(t);else if(r<e.length){var l=e.length-r;n.set(e.subarray(0,l)),i.set(e.subarray(l)),i.set(t,l)}else{var c=r-e.length;n.set(e),n.set(t.subarray(0,c),e.length),i.set(t.subarray(c))}else n=e.concat(t),i=r>=0&&r<n.length?n.splice(r,n.length):[];return[n,i]}),c=r.redraw(e),u=[e,s.update,i,s.maxPoints];return l.add(e,r.extendTraces,u,t,arguments),c},r.addTraces=function t(e,n,i){e=o.getGraphDiv(e);var a,s,c=[],u=r.deleteTraces,h=t,f=[e,c],p=[e,n];for(function(t,e,r){var n,i;if(!Array.isArray(t.data))throw new Error("gd.data must be an array.");if("undefined"==typeof e)throw new Error("traces must be defined.");for(Array.isArray(e)||(e=[e]),n=0;n<e.length;n++)if("object"!=typeof(i=e[n])||Array.isArray(i)||null===i)throw new Error("all values in traces array must be non-array objects");if("undefined"==typeof r||Array.isArray(r)||(r=[r]),"undefined"!=typeof r&&r.length!==e.length)throw new Error("if indices is specified, traces.length must equal indices.length")}(e,n,i),Array.isArray(n)||(n=[n]),n=n.map(function(t){return o.extendFlat({},t)}),w.cleanData(n),a=0;a<n.length;a++)e.data.push(n[a]);for(a=0;a<n.length;a++)c.push(-n.length+a);if("undefined"==typeof i)return s=r.redraw(e),l.add(e,u,f,h,p),s;Array.isArray(i)||(i=[i]);try{I(e,c,i)}catch(t){throw e.data.splice(e.data.length-n.length,n.length),t}return l.startSequence(e),l.add(e,u,f,h,p),s=r.moveTraces(e,c,i),l.stopSequence(e),s},r.deleteTraces=function t(e,n){e=o.getGraphDiv(e);var i,a,s=[],c=r.addTraces,u=t,h=[e,s,n],f=[e,n];if("undefined"==typeof n)throw new Error("indices must be an integer or array of integers.");for(Array.isArray(n)||(n=[n]),P(e,n,"indices"),(n=z(n,e.data.length-1)).sort(o.sorterDes),i=0;i<n.length;i+=1)a=e.data.splice(n[i],1)[0],s.push(a);var p=r.redraw(e);return l.add(e,c,h,u,f),p},r.moveTraces=function t(e,n,i){var a,s=[],c=[],u=t,h=t,f=[e=o.getGraphDiv(e),i,n],p=[e,n,i];if(I(e,n,i),n=Array.isArray(n)?n:[n],"undefined"==typeof i)for(i=[],a=0;a<n.length;a++)i.push(-n.length+a);for(i=Array.isArray(i)?i:[i],n=z(n,e.data.length-1),i=z(i,e.data.length-1),a=0;a<e.data.length;a++)-1===n.indexOf(a)&&s.push(e.data[a]);for(a=0;a<n.length;a++)c.push({newIndex:i[a],trace:e.data[n[a]]});for(c.sort(function(t,e){return t.newIndex-e.newIndex}),a=0;a<c.length;a+=1)s.splice(c[a].newIndex,0,c[a].trace);e.data=s;var d=r.redraw(e);return l.add(e,u,f,h,p),d},r.restyle=function t(e,n,i,a){e=o.getGraphDiv(e),w.clearPromiseQueue(e);var s={};if("string"==typeof n)s[n]=i;else{if(!o.isPlainObject(n))return o.warn("Restyle fail.",n,i,a),Promise.reject();s=o.extendFlat({},n),void 0===a&&(a=i)}Object.keys(s).length&&(e.changed=!0);var c=w.coerceTraceIndices(e,a),u=B(e,s,c),f=u.flags;f.clearCalc&&(e.calcdata=void 0),f.clearAxisTypes&&w.clearAxisTypes(e,c,{});var p=[];f.fullReplot?p.push(r.plot):(p.push(h.previousPromises),h.supplyDefaults(e),f.style&&p.push(k.doTraceStyle),f.colorbars&&p.push(k.doColorBars),p.push(S)),p.push(h.rehover),l.add(e,t,[e,u.undoit,u.traces],t,[e,u.redoit,u.traces]);var d=o.syncOrAsync(p,e);return d&&d.then||(d=Promise.resolve()),d.then(function(){return e.emit("plotly_restyle",u.eventData),e})},r.relayout=function t(e,r,n){if(e=o.getGraphDiv(e),w.clearPromiseQueue(e),e.framework&&e.framework.isPolar)return Promise.resolve(e);var i={};if("string"==typeof r)i[r]=n;else{if(!o.isPlainObject(r))return o.warn("Relayout fail.",r,n),Promise.reject();i=o.extendFlat({},r)}Object.keys(i).length&&(e.changed=!0);var a=U(e,i),s=a.flags;s.calc&&(e.calcdata=void 0);var c=[h.previousPromises];s.layoutReplot?c.push(k.layoutReplot):Object.keys(i).length&&(h.supplyDefaults(e),s.legend&&c.push(k.doLegend),s.layoutstyle&&c.push(k.layoutStyles),s.axrange&&F(c,a.rangesAltered),s.ticks&&c.push(k.doTicksRelayout),s.modebar&&c.push(k.doModeBar),s.camera&&c.push(k.doCamera),c.push(S)),c.push(h.rehover),l.add(e,t,[e,a.undoit],t,[e,a.redoit]);var u=o.syncOrAsync(c,e);return u&&u.then||(u=Promise.resolve(e)),u.then(function(){return e.emit("plotly_relayout",a.eventData),e})};var N=/^[xyz]axis[0-9]*\.range(\[[0|1]\])?$/,j=/^[xyz]axis[0-9]*\.autorange$/,V=/^[xyz]axis[0-9]*\.domain(\[[0|1]\])?$/;function U(t,e){var r,n,i,a=t.layout,s=t._fullLayout,l=Object.keys(e),h=p.list(t),f={};for(n=0;n<l.length;n++)if(0===l[n].indexOf("allaxes")){for(i=0;i<h.length;i++){var d=h[i]._id.substr(1),g=-1!==d.indexOf("scene")?d+".":"",m=l[n].replace("allaxes",g+h[i]._name);e[m]||(e[m]=e[l[n]])}delete e[l[n]]}var v=M.layoutFlags(),y={},x={};function b(t,r){if(Array.isArray(t))t.forEach(function(t){b(t,r)});else if(!(t in e||w.hasParent(e,t))){var n=o.nestedProperty(a,t);t in x||(x[t]=R(n.get())),void 0!==r&&n.set(r)}}var k,T={};function S(t){var e=p.name2id(t.split(".")[0]);return T[e]=1,e}for(var E in e){if(w.hasParent(e,E))throw new Error("cannot set "+E+"and a parent attribute simultaneously");for(var C=o.nestedProperty(a,E),L=e[E],z=C.parts.length-1;z>0&&"string"!=typeof C.parts[z];)z--;var P=C.parts[z],I=C.parts[z-1]+"."+P,O=C.parts.slice(0,z).join("."),D=o.nestedProperty(t.layout,O).get(),B=o.nestedProperty(s,O).get(),F=C.get();if(void 0!==L){y[E]=L,x[E]="reverse"===P?L:R(F);var U=u.getLayoutValObject(s,C.parts);if(U&&U.impliedEdits&&null!==L)for(var G in U.impliedEdits)b(o.relativeAttr(E,G),U.impliedEdits[G]);if(-1!==["width","height"].indexOf(E)&&null===L)s[E]=t._initialAutoSize[E];else if(I.match(N))S(I),o.nestedProperty(s,O+"._inputRange").set(null);else if(I.match(j)){S(I),o.nestedProperty(s,O+"._inputRange").set(null);var W=o.nestedProperty(s,O).get();W._inputDomain&&(W._input.domain=W._inputDomain.slice())}else I.match(V)&&o.nestedProperty(s,O+"._inputDomain").set(null);if("type"===P){var Y=D,X="linear"===B.type&&"log"===L,Z="log"===B.type&&"linear"===L;if(X||Z){if(Y&&Y.range)if(B.autorange)X&&(Y.range=Y.range[1]>Y.range[0]?[1,2]:[2,1]);else{var $=Y.range[0],J=Y.range[1];X?($<=0&&J<=0&&b(O+".autorange",!0),$<=0?$=J/1e6:J<=0&&(J=$/1e6),b(O+".range[0]",Math.log($)/Math.LN10),b(O+".range[1]",Math.log(J)/Math.LN10)):(b(O+".range[0]",Math.pow(10,$)),b(O+".range[1]",Math.pow(10,J)))}else b(O+".autorange",!0);Array.isArray(s._subplots.polar)&&s._subplots.polar.length&&s[C.parts[0]]&&"radialaxis"===C.parts[1]&&delete s[C.parts[0]]._subplot.viewInitial["radialaxis.range"],c.getComponentMethod("annotations","convertCoords")(t,B,L,b),c.getComponentMethod("images","convertCoords")(t,B,L,b)}else b(O+".autorange",!0),b(O+".range",null);o.nestedProperty(s,O+"._inputRange").set(null)}else if(P.match(A)){var K=o.nestedProperty(s,E).get(),Q=(L||{}).type;Q&&"-"!==Q||(Q="linear"),c.getComponentMethod("annotations","convertCoords")(t,K,Q,b),c.getComponentMethod("images","convertCoords")(t,K,Q,b)}var tt=_.containerArrayMatch(E);if(tt){r=tt.array,n=tt.index;var et=tt.property,rt=(o.nestedProperty(a,r)||[])[n]||{},nt=rt,it=U||{editType:"calc"},at=-1!==it.editType.indexOf("calcIfAutorange");""===n?(at?v.calc=!0:M.update(v,it),at=!1):""===et&&(nt=L,_.isAddVal(L)?x[E]=null:_.isRemoveVal(L)?(x[E]=rt,nt=rt):o.warn("unrecognized full object value",e)),at&&(H(t,nt,"x")||H(t,nt,"y"))?v.calc=!0:M.update(v,it),f[r]||(f[r]={});var ot=f[r][n];ot||(ot=f[r][n]={}),ot[et]=L,delete e[E]}else"reverse"===P?(D.range?D.range.reverse():(b(O+".autorange",!0),D.range=[1,0]),B.autorange?v.calc=!0:v.plot=!0):(s._has("scatter-like")&&s._has("regl")&&"dragmode"===E&&("lasso"===L||"select"===L)&&"lasso"!==F&&"select"!==F?v.plot=!0:U?M.update(v,U):v.calc=!0,C.set(L))}}for(r in f){_.applyContainerArrayChanges(t,o.nestedProperty(a,r),f[r],v)||(v.plot=!0)}var st=s._axisConstraintGroups||[];for(k in T)for(n=0;n<st.length;n++){var lt=st[n];if(lt[k])for(var ct in v.calc=!0,lt)T[ct]||(p.getFromId(t,ct)._constraintShrinkable=!0)}return(q(t)||e.height||e.width)&&(v.plot=!0),(v.plot||v.calc)&&(v.layoutReplot=!0),{flags:v,rangesAltered:T,undoit:x,redoit:y,eventData:o.extendDeep({},y)}}function q(t){var e=t._fullLayout,r=e.width,n=e.height;return t.layout.autosize&&h.plotAutoSize(t,t.layout,e),e.width!==r||e.height!==n}function H(t,e,r){if(!o.isPlainObject(e))return!1;var n=e[r+"ref"]||r,i=p.getFromId(t,n);return i||n.charAt(0)!==r||(i=p.getFromId(t,r)),(i||{}).autorange}function G(t,e,r,n){var i,a,s=n.getValObject,l=n.flags,c=n.immutable,u=n.inArray,h=n.arrayIndex,f=n.gd,p=n.autoranged;function d(){var t=i.editType;-1!==t.indexOf("calcIfAutorange")&&(p||void 0===p&&(H(f,e,"x")||H(f,e,"y")))?l.calc=!0:u&&-1!==t.indexOf("arraydraw")?o.pushUnique(l.arrays[u],h):M.update(l,i)}function g(t){return"data_array"===t.valType||t.arrayOk}for(a in t){if(l.calc)return;var m=t[a],v=e[a];if("_"!==a.charAt(0)&&"function"!=typeof m&&m!==v){if("tick0"===a||"dtick"===a){var y=e.tickmode;if("auto"===y||"array"===y||!y)continue}if(("range"!==a||!e.autorange)&&("zmin"!==a&&"zmax"!==a||"contourcarpet"!==e.type)){var x=r.concat(a);if((i=s(x))&&(!i._compareAsJSON||JSON.stringify(m)!==JSON.stringify(v))){var b,_=i.valType,w=g(i),k=Array.isArray(m),A=Array.isArray(v);if(k&&A){var T="_input_"+a,S=t[T],E=e[T];if(Array.isArray(S)&&S===E)continue}if(void 0===v)w&&k?l.calc=!0:d();else if(i._isLinkedToArray){var C=[],L=!1;u||(l.arrays[a]=C);var z=Math.min(m.length,v.length),P=Math.max(m.length,v.length);if(z!==P){if("arraydraw"!==i.editType){d();continue}L=!0}for(b=0;b<z;b++)G(m[b],v[b],x.concat(b),o.extendFlat({inArray:a,arrayIndex:b},n));if(L)for(b=z;b<P;b++)C.push(b)}else!_&&o.isPlainObject(m)?G(m,v,x,n):w?k&&A?c&&(l.calc=!0):k!==A?l.calc=!0:d():k&&A&&m.length===v.length&&String(m)===String(v)||d()}}}}for(a in e)if(!(a in t||"_"===a.charAt(0)||"function"==typeof e[a])){if(g(i=s(r.concat(a)))&&Array.isArray(e[a]))return void(l.calc=!0);d()}}function W(t){var e=n.select(t),r=t._fullLayout;if(r._container=e.selectAll(".plot-container").data([0]),r._container.enter().insert("div",":first-child").classed("plot-container",!0).classed("plotly",!0),r._paperdiv=r._container.selectAll(".svg-container").data([0]),r._paperdiv.enter().append("div").classed("svg-container",!0).style("position","relative"),r._glcontainer=r._paperdiv.selectAll(".gl-container").data([{}]),r._glcontainer.enter().append("div").classed("gl-container",!0),r._paperdiv.selectAll(".main-svg").remove(),r._paper=r._paperdiv.insert("svg",":first-child").classed("main-svg",!0),r._toppaper=r._paperdiv.append("svg").classed("main-svg",!0),!r._uid){var i={};n.selectAll("defs").each(function(){this.id&&(i[this.id.split("-")[1]]=1)}),r._uid=o.randstr(i)}r._paperdiv.selectAll(".main-svg").attr(y.svgAttrs),r._defs=r._paper.append("defs").attr("id","defs-"+r._uid),r._clips=r._defs.append("g").classed("clips",!0),r._topdefs=r._toppaper.append("defs").attr("id","topdefs-"+r._uid),r._topclips=r._topdefs.append("g").classed("clips",!0),r._bgLayer=r._paper.append("g").classed("bglayer",!0),r._draggers=r._paper.append("g").classed("draglayer",!0);var a=r._paper.append("g").classed("layer-below",!0);r._imageLowerLayer=a.append("g").classed("imagelayer",!0),r._shapeLowerLayer=a.append("g").classed("shapelayer",!0),r._cartesianlayer=r._paper.append("g").classed("cartesianlayer",!0),r._polarlayer=r._paper.append("g").classed("polarlayer",!0),r._ternarylayer=r._paper.append("g").classed("ternarylayer",!0),r._geolayer=r._paper.append("g").classed("geolayer",!0),r._pielayer=r._paper.append("g").classed("pielayer",!0),r._glimages=r._paper.append("g").classed("glimages",!0);var s=r._toppaper.append("g").classed("layer-above",!0);r._imageUpperLayer=s.append("g").classed("imagelayer",!0),r._shapeUpperLayer=s.append("g").classed("shapelayer",!0),r._infolayer=r._toppaper.append("g").classed("infolayer",!0),r._menulayer=r._toppaper.append("g").classed("menulayer",!0),r._zoomlayer=r._toppaper.append("g").classed("zoomlayer",!0),r._hoverlayer=r._toppaper.append("g").classed("hoverlayer",!0),t.emit("plotly_framework")}r.update=function t(e,n,i,a){if(e=o.getGraphDiv(e),w.clearPromiseQueue(e),e.framework&&e.framework.isPolar)return Promise.resolve(e);o.isPlainObject(n)||(n={}),o.isPlainObject(i)||(i={}),Object.keys(n).length&&(e.changed=!0),Object.keys(i).length&&(e.changed=!0);var s=w.coerceTraceIndices(e,a),c=B(e,o.extendFlat({},n),s),u=c.flags,f=U(e,o.extendFlat({},i)),p=f.flags;(u.clearCalc||p.calc)&&(e.calcdata=void 0),u.clearAxisTypes&&w.clearAxisTypes(e,s,i);var d=[];if(u.fullReplot&&p.layoutReplot){var g=e.data,m=e.layout;e.data=void 0,e.layout=void 0,d.push(function(){return r.plot(e,g,m)})}else u.fullReplot?d.push(r.plot):p.layoutReplot?d.push(k.layoutReplot):(d.push(h.previousPromises),h.supplyDefaults(e),u.style&&d.push(k.doTraceStyle),u.colorbars&&d.push(k.doColorBars),p.legend&&d.push(k.doLegend),p.layoutstyle&&d.push(k.layoutStyles),p.axrange&&F(d,f.rangesAltered),p.ticks&&d.push(k.doTicksRelayout),p.modebar&&d.push(k.doModeBar),p.camera&&d.push(k.doCamera),d.push(S));d.push(h.rehover),l.add(e,t,[e,c.undoit,f.undoit,c.traces],t,[e,c.redoit,f.redoit,c.traces]);var v=o.syncOrAsync(d,e);return v&&v.then||(v=Promise.resolve(e)),v.then(function(){return e.emit("plotly_update",{data:c.eventData,layout:f.eventData}),e})},r.react=function(t,e,n,i){var a,s;var l=(t=o.getGraphDiv(t))._fullData,f=t._fullLayout;if(o.isPlotDiv(t)&&l&&f){if(o.isPlainObject(e)){var d=e;e=d.data,n=d.layout,i=d.config,a=d.frames}var g=!1;if(i){var m=o.extendDeep({},t._context);t._context=void 0,L(t,i),g=function t(e,r){var n;for(n in e){var i=e[n],a=r[n];if(i!==a)if(o.isPlainObject(i)&&o.isPlainObject(a)){if(t(i,a))return!0}else{if(!Array.isArray(i)||!Array.isArray(a))return!0;if(i.length!==a.length)return!0;for(var s=0;s<i.length;s++)if(i[s]!==a[s]){if(!o.isPlainObject(i[s])||!o.isPlainObject(a[s]))return!0;if(t(i[s],a[s]))return!0}}}}(m,t._context)}t.data=e||[],w.cleanData(t.data),t.layout=n||{},w.cleanLayout(t.layout),h.supplyDefaults(t,{skipUpdateCalc:!0});var v=t._fullData,y=t._fullLayout,x=void 0===y.datarevision,b=function(t,e,r,n){if(e.length!==r.length)return{fullReplot:!0,calc:!0};var i,a,o=M.traceFlags();o.arrays={};var s={getValObject:function(t){return u.getTraceValObject(a,t)},flags:o,immutable:n,gd:t},l={};for(i=0;i<e.length;i++)a=r[i]._fullInput,l[a.uid]||(l[a.uid]=1,s.autoranged=!!a.xaxis&&(p.getFromId(t,a.xaxis).autorange||p.getFromId(t,a.yaxis).autorange),G(e[i]._fullInput,a,[],s));(o.calc||o.plot||o.calcIfAutorange)&&(o.fullReplot=!0);return o}(t,l,v,x),_=function(t,e,r,n){var i=M.layoutFlags();i.arrays={},G(e,r,[],{getValObject:function(t){return u.getLayoutValObject(r,t)},flags:i,immutable:n,gd:t}),(i.plot||i.calc)&&(i.layoutReplot=!0);return i}(t,f,y,x);q(t)&&(_.layoutReplot=!0),b.calc||_.calc?t.calcdata=void 0:h.supplyDefaultsUpdateCalc(t.calcdata,v);var A=[];if(a&&(t._transitionData={},h.createTransitionData(t),A.push(function(){return r.addFrames(t,a)})),b.fullReplot||_.layoutReplot||g)t._fullLayout._skipDefaults=!0,A.push(r.plot);else{for(var T in _.arrays){var E=_.arrays[T];if(E.length){var C=c.getComponentMethod(T,"drawOne");if(C!==o.noop)for(var z=0;z<E.length;z++)C(t,E[z]);else{var P=c.getComponentMethod(T,"draw");if(P===o.noop)throw new Error("cannot draw components: "+T);P(t)}}}A.push(h.previousPromises),b.style&&A.push(k.doTraceStyle),b.colorbars&&A.push(k.doColorBars),_.legend&&A.push(k.doLegend),_.layoutstyle&&A.push(k.layoutStyles),_.axrange&&F(A),_.ticks&&A.push(k.doTicksRelayout),_.modebar&&A.push(k.doModeBar),_.camera&&A.push(k.doCamera),A.push(S)}A.push(h.rehover),(s=o.syncOrAsync(A,t))&&s.then||(s=Promise.resolve(t))}else s=r.newPlot(t,e,n,i);return s.then(function(){return t.emit("plotly_react",{data:e,layout:n}),t})},r.animate=function(t,e,r){if(t=o.getGraphDiv(t),!o.isPlotDiv(t))throw new Error("This element is not a Plotly plot: "+t+". It's likely that you've failed to create a plot before animating it. For more details, see https://plot.ly/javascript/animations/");var n=t._transitionData;n._frameQueue||(n._frameQueue=[]);var i=(r=h.supplyAnimationDefaults(r)).transition,a=r.frame;function s(t){return Array.isArray(i)?t>=i.length?i[0]:i[t]:i}function l(t){return Array.isArray(a)?t>=a.length?a[0]:a[t]:a}function c(t,e){var r=0;return function(){if(t&&++r===e)return t()}}return void 0===n._frameWaitingCnt&&(n._frameWaitingCnt=0),new Promise(function(a,u){function f(){n._currentFrame&&n._currentFrame.onComplete&&n._currentFrame.onComplete();var e=n._currentFrame=n._frameQueue.shift();if(e){var r=e.name?e.name.toString():null;t._fullLayout._currentFrame=r,n._lastFrameAt=Date.now(),n._timeToNext=e.frameOpts.duration,h.transition(t,e.frame.data,e.frame.layout,w.coerceTraceIndices(t,e.frame.traces),e.frameOpts,e.transitionOpts).then(function(){e.onComplete&&e.onComplete()}),t.emit("plotly_animatingframe",{name:r,frame:e.frame,animation:{frame:e.frameOpts,transition:e.transitionOpts}})}else t.emit("plotly_animated"),window.cancelAnimationFrame(n._animationRaf),n._animationRaf=null}function p(){t.emit("plotly_animating"),n._lastFrameAt=-1/0,n._timeToNext=0,n._runningTransitions=0,n._currentFrame=null;var e=function(){n._animationRaf=window.requestAnimationFrame(e),Date.now()-n._lastFrameAt>n._timeToNext&&f()};e()}var d,g,m=0;function v(t){return Array.isArray(i)?m>=i.length?t.transitionOpts=i[m]:t.transitionOpts=i[0]:t.transitionOpts=i,m++,t}var y=[],x=null==e,b=Array.isArray(e);if(!x&&!b&&o.isPlainObject(e))y.push({type:"object",data:v(o.extendFlat({},e))});else if(x||-1!==["string","number"].indexOf(typeof e))for(d=0;d<n._frames.length;d++)(g=n._frames[d])&&(x||String(g.group)===String(e))&&y.push({type:"byname",name:String(g.name),data:v({name:g.name})});else if(b)for(d=0;d<e.length;d++){var _=e[d];-1!==["number","string"].indexOf(typeof _)?(_=String(_),y.push({type:"byname",name:_,data:v({name:_})})):o.isPlainObject(_)&&y.push({type:"object",data:v(o.extendFlat({},_))})}for(d=0;d<y.length;d++)if("byname"===(g=y[d]).type&&!n._frameHash[g.data.name])return o.warn('animate failure: frame not found: "'+g.data.name+'"'),void u();-1!==["next","immediate"].indexOf(r.mode)&&function(){if(0!==n._frameQueue.length){for(;n._frameQueue.length;){var e=n._frameQueue.pop();e.onInterrupt&&e.onInterrupt()}t.emit("plotly_animationinterrupted",[])}}(),"reverse"===r.direction&&y.reverse();var k=t._fullLayout._currentFrame;if(k&&r.fromcurrent){var M=-1;for(d=0;d<y.length;d++)if("byname"===(g=y[d]).type&&g.name===k){M=d;break}if(M>0&&M<y.length-1){var A=[];for(d=0;d<y.length;d++)g=y[d],("byname"!==y[d].type||d>M)&&A.push(g);y=A}}y.length>0?function(e){if(0!==e.length){for(var i=0;i<e.length;i++){var o;o="byname"===e[i].type?h.computeFrame(t,e[i].name):e[i].data;var f=l(i),d=s(i);d.duration=Math.min(d.duration,f.duration);var g={frame:o,name:e[i].name,frameOpts:f,transitionOpts:d};i===e.length-1&&(g.onComplete=c(a,2),g.onInterrupt=u),n._frameQueue.push(g)}"immediate"===r.mode&&(n._lastFrameAt=-1/0),n._animationRaf||p()}}(y):(t.emit("plotly_animated"),a())})},r.addFrames=function(t,e,r){if(t=o.getGraphDiv(t),null==e)return Promise.resolve();if(!o.isPlotDiv(t))throw new Error("This element is not a Plotly plot: "+t+". It's likely that you've failed to create a plot before adding frames. For more details, see https://plot.ly/javascript/animations/");var n,i,a,s,c=t._transitionData._frames,u=t._transitionData._frameHash;if(!Array.isArray(e))throw new Error("addFrames failure: frameList must be an Array of frame definitions"+e);var f=c.length+2*e.length,p=[],d={};for(n=e.length-1;n>=0;n--)if(o.isPlainObject(e[n])){var g=e[n].name,m=(u[g]||d[g]||{}).name,v=e[n].name,y=u[m]||d[m];m&&v&&"number"==typeof v&&y&&T<5&&(T++,o.warn('addFrames: overwriting frame "'+(u[m]||d[m]).name+'" with a frame whose name of type "number" also equates to "'+m+'". This is valid but may potentially lead to unexpected behavior since all plotly.js frame names are stored internally as strings.'),5===T&&o.warn("addFrames: This API call has yielded too many of these warnings. For the rest of this call, further warnings about numeric frame names will be suppressed.")),d[g]={name:g},p.push({frame:h.supplyFrameDefaults(e[n]),index:r&&void 0!==r[n]&&null!==r[n]?r[n]:f+n})}p.sort(function(t,e){return t.index>e.index?-1:t.index<e.index?1:0});var x=[],b=[],_=c.length;for(n=p.length-1;n>=0;n--){if("number"==typeof(i=p[n].frame).name&&o.warn("Warning: addFrames accepts frames with numeric names, but the numbers areimplicitly cast to strings"),!i.name)for(;u[i.name="frame "+t._transitionData._counter++];);if(u[i.name]){for(a=0;a<c.length&&(c[a]||{}).name!==i.name;a++);x.push({type:"replace",index:a,value:i}),b.unshift({type:"replace",index:a,value:c[a]})}else s=Math.max(0,Math.min(p[n].index,_)),x.push({type:"insert",index:s,value:i}),b.unshift({type:"delete",index:s}),_++}var w=h.modifyFrames,k=h.modifyFrames,M=[t,b],A=[t,x];return l&&l.add(t,w,M,k,A),h.modifyFrames(t,x)},r.deleteFrames=function(t,e){if(t=o.getGraphDiv(t),!o.isPlotDiv(t))throw new Error("This element is not a Plotly plot: "+t);var r,n,i=t._transitionData._frames,a=[],s=[];if(!e)for(e=[],r=0;r<i.length;r++)e.push(r);for((e=e.slice(0)).sort(),r=e.length-1;r>=0;r--)n=e[r],a.push({type:"delete",index:n}),s.unshift({type:"insert",index:n,value:i[n]});var c=h.modifyFrames,u=h.modifyFrames,f=[t,s],p=[t,a];return l&&l.add(t,c,f,u,p),h.modifyFrames(t,a)},r.purge=function(t){var e=(t=o.getGraphDiv(t))._fullLayout||{},r=t._fullData||[],n=t.calcdata||[];return h.cleanPlot([],{},r,e,n),h.purge(t),s.purge(t),e._container&&e._container.remove(),delete t._context,t}},{"../components/color":558,"../components/colorbar/connect":560,"../components/drawing":583,"../constants/xmlns_namespaces":663,"../lib":684,"../lib/events":672,"../lib/queue":699,"../lib/svg_text_utils":708,"../plots/cartesian/axes":732,"../plots/cartesian/constants":737,"../plots/cartesian/graph_interact":741,"../plots/plots":795,"../plots/polar/legacy":803,"../registry":817,"./edit_types":715,"./helpers":716,"./manage_arrays":718,"./plot_config":720,"./plot_schema":721,"./subroutines":723,d3:147,"fast-isnumeric":214,"has-hover":378}],720:[function(t,e,r){"use strict";e.exports={staticPlot:!1,plotlyServerURL:"https://plot.ly",editable:!1,edits:{annotationPosition:!1,annotationTail:!1,annotationText:!1,axisTitleText:!1,colorbarPosition:!1,colorbarTitleText:!1,legendPosition:!1,legendText:!1,shapePosition:!1,titleText:!1},autosizable:!1,queueLength:0,fillFrame:!1,frameMargins:0,scrollZoom:!1,doubleClick:"reset+autosize",showTips:!0,showAxisDragHandles:!0,showAxisRangeEntryBoxes:!0,showLink:!1,sendData:!0,linkText:"Edit chart",showSources:!1,displayModeBar:"hover",modeBarButtonsToRemove:[],modeBarButtonsToAdd:[],modeBarButtons:!1,toImageButtonOptions:{},displaylogo:!0,plotGlPixelRatio:2,setBackground:"transparent",topojsonURL:"https://cdn.plot.ly/",mapboxAccessToken:null,logging:1,globalTransforms:[],locale:"en-US",locales:{}}},{}],721:[function(t,e,r){"use strict";var n=t("../registry"),i=t("../lib"),a=t("../plots/attributes"),o=t("../plots/layout_attributes"),s=t("../plots/frame_attributes"),l=t("../plots/animation_attributes"),c=t("../plots/polar/legacy/area_attributes"),u=t("../plots/polar/legacy/axis_attributes"),h=t("./edit_types"),f=i.extendFlat,p=i.extendDeepAll,d=i.isPlainObject,g="_isSubplotObj",m="_isLinkedToArray",v=[g,m,"_arrayAttrRegexps","_deprecated"];function y(t,e,r){if(!t)return!1;if(t._isLinkedToArray)if(x(e[r]))r++;else if(r<e.length)return!1;for(;r<e.length;r++){var n=t[e[r]];if(!d(n))break;if(t=n,r===e.length-1)break;if(t._isLinkedToArray){if(!x(e[++r]))return!1}else if("info_array"===t.valType){var i=e[++r];if(!x(i))return!1;var a=t.items;if(Array.isArray(a)){if(i>=a.length)return!1;if(2===t.dimensions){if(r++,e.length===r)return t;var o=e[r];if(!x(o))return!1;t=a[i][o]}else t=a[i]}else t=a}}return t}function x(t){return t===Math.round(t)&&t>=0}function b(t){return function(t){r.crawl(t,function(t,e,n){r.isValObject(t)?"data_array"===t.valType?(t.role="data",n[e+"src"]={valType:"string",editType:"none"}):!0===t.arrayOk&&(n[e+"src"]={valType:"string",editType:"none"}):d(t)&&(t.role="object")})}(t),function(t){r.crawl(t,function(t,e,r){if(!t)return;var n=t[m];if(!n)return;delete t[m],r[e]={items:{}},r[e].items[n]=t,r[e].role="object"})}(t),function(t){!function t(e){for(var r in e)if(d(e[r]))t(e[r]);else if(Array.isArray(e[r]))for(var n=0;n<e[r].length;n++)t(e[r][n]);else e[r]instanceof RegExp&&(e[r]=e[r].toString())}(t)}(t),t}function _(t,e,r){var n=i.nestedProperty(t,r),a=p({},e.layoutAttributes);a[g]=!0,n.set(a)}function w(t,e,r){var n=i.nestedProperty(t,r);n.set(p(n.get()||{},e))}r.IS_SUBPLOT_OBJ=g,r.IS_LINKED_TO_ARRAY=m,r.DEPRECATED="_deprecated",r.UNDERSCORE_ATTRS=v,r.get=function(){var t={};n.allTypes.concat("area").forEach(function(e){t[e]=function(t){var e,r;"area"===t?(e={attributes:c},r={}):(e=n.modules[t]._module,r=e.basePlotModule);var i={type:null};p(i,a),p(i,e.attributes),r.attributes&&p(i,r.attributes);i.type=t;var o={meta:e.meta||{},attributes:b(i)};if(e.layoutAttributes){var s={};p(s,e.layoutAttributes),o.layoutAttributes=b(s)}return o}(e)});var e,r={};return Object.keys(n.transformsRegistry).forEach(function(t){r[t]=function(t){var e=n.transformsRegistry[t],r=p({},e.attributes);return Object.keys(n.componentsRegistry).forEach(function(e){var i=n.componentsRegistry[e];i.schema&&i.schema.transforms&&i.schema.transforms[t]&&Object.keys(i.schema.transforms[t]).forEach(function(e){w(r,i.schema.transforms[t][e],e)})}),{attributes:b(r)}}(t)}),{defs:{valObjects:i.valObjectMeta,metaKeys:v.concat(["description","role","editType","impliedEdits"]),editType:{traces:h.traces,layout:h.layout},impliedEdits:{}},traces:t,layout:function(){var t,e,r={};for(t in p(r,o),n.subplotsRegistry)if((e=n.subplotsRegistry[t]).layoutAttributes)if(Array.isArray(e.attr))for(var i=0;i<e.attr.length;i++)_(r,e,e.attr[i]);else{var a="subplot"===e.attr?e.name:e.attr;_(r,e,a)}for(t in r=function(t){return f(t,{radialaxis:u.radialaxis,angularaxis:u.angularaxis}),f(t,u.layout),t}(r),n.componentsRegistry){var s=(e=n.componentsRegistry[t]).schema;if(s&&(s.subplots||s.layout)){var l=s.subplots;if(l&&l.xaxis&&!l.yaxis)for(var c in l.xaxis)delete r.yaxis[c]}else e.layoutAttributes&&w(r,e.layoutAttributes,e.name)}return{layoutAttributes:b(r)}}(),transforms:r,frames:(e={frames:i.extendDeepAll({},s)},b(e),e.frames),animation:b(l)}},r.crawl=function(t,e,n,i){var a=n||0;i=i||"",Object.keys(t).forEach(function(n){var o=t[n];if(-1===v.indexOf(n)){var s=(i?i+".":"")+n;e(o,n,t,a,s),r.isValObject(o)||d(o)&&"impliedEdits"!==n&&r.crawl(o,e,a+1,s)}})},r.isValObject=function(t){return t&&void 0!==t.valType},r.findArrayAttributes=function(t){var e,n,o=[],s=[],l=[];function c(t,r,a,c){s=s.slice(0,c).concat([r]),l=l.slice(0,c).concat([t&&t._isLinkedToArray]),t&&("data_array"===t.valType||!0===t.arrayOk)&&!("colorbar"===s[c-1]&&("ticktext"===r||"tickvals"===r))&&function t(e,r,a){var c=e[s[r]];var u=a+s[r];if(r===s.length-1)i.isArrayOrTypedArray(c)&&o.push(n+u);else if(l[r]){if(Array.isArray(c))for(var h=0;h<c.length;h++)i.isPlainObject(c[h])&&t(c[h],r+1,u+"["+h+"].")}else i.isPlainObject(c)&&t(c,r+1,u+".")}(e,0,"")}e=t,n="",r.crawl(a,c),t._module&&t._module.attributes&&r.crawl(t._module.attributes,c);var u=t.transforms;if(u)for(var h=0;h<u.length;h++){var f=u[h],p=f._module;p&&(n="transforms["+h+"].",e=f,r.crawl(p.attributes,c))}return o},r.getTraceValObject=function(t,e){var r,i,o=e[0],s=1;if("transforms"===o){if(1===e.length)return a.transforms;var l=t.transforms;if(!Array.isArray(l)||!l.length)return!1;var u=e[1];if(!x(u)||u>=l.length)return!1;i=(r=(n.transformsRegistry[l[u].type]||{}).attributes)&&r[e[2]],s=3}else if("area"===t.type)i=c[o];else{var h=t._module;if(h||(h=(n.modules[t.type||a.type.dflt]||{})._module),!h)return!1;if(!(i=(r=h.attributes)&&r[o])){var f=h.basePlotModule;f&&f.attributes&&(i=f.attributes[o])}i||(i=a[o])}return y(i,e,s)},r.getLayoutValObject=function(t,e){return y(function(t,e){var r,i,a,s,l=t._basePlotModules;if(l){var c;for(r=0;r<l.length;r++){if((a=l[r]).attrRegex&&a.attrRegex.test(e)){if(a.layoutAttrOverrides)return a.layoutAttrOverrides;!c&&a.layoutAttributes&&(c=a.layoutAttributes)}var h=a.baseLayoutAttrOverrides;if(h&&e in h)return h[e]}if(c)return c}var f=t._modules;if(f)for(r=0;r<f.length;r++)if((s=f[r].layoutAttributes)&&e in s)return s[e];for(i in n.componentsRegistry)if(!(a=n.componentsRegistry[i]).schema&&e===a.name)return a.layoutAttributes;if(e in o)return o[e];if("radialaxis"===e||"angularaxis"===e)return u[e];return u.layout[e]||!1}(t,e[0]),e,1)}},{"../lib":684,"../plots/animation_attributes":727,"../plots/attributes":729,"../plots/frame_attributes":759,"../plots/layout_attributes":786,"../plots/polar/legacy/area_attributes":801,"../plots/polar/legacy/axis_attributes":802,"../registry":817,"./edit_types":715}],722:[function(t,e,r){"use strict";var n=t("../lib"),i=t("../plots/attributes"),a="templateitemname",o={name:{valType:"string",editType:"none"}};function s(t){return t&&"string"==typeof t}function l(t){var e=t.length-1;return"s"!==t.charAt(e)&&n.warn("bad argument to arrayDefaultKey: "+t),t.substr(0,t.length-1)+"defaults"}o[a]={valType:"string",editType:"calc"},r.templatedArray=function(t,e){return e._isLinkedToArray=t,e.name=o.name,e[a]=o[a],e},r.traceTemplater=function(t){var e,r,a={};for(e in t)r=t[e],Array.isArray(r)&&r.length&&(a[e]=0);return{newTrace:function(o){var s={type:e=n.coerce(o,{},i,"type"),_template:null};if(e in a){r=t[e];var l=a[e]%r.length;a[e]++,s._template=r[l]}return s}}},r.newContainer=function(t,e,r){var i=t._template,a=i&&(i[e]||r&&i[r]);return n.isPlainObject(a)||(a=null),t[e]={_template:a}},r.arrayTemplater=function(t,e,r){var n=t._template,i=n&&n[l(e)],o=n&&n[e];Array.isArray(o)&&o.length||(o=[]);var c={};return{newItem:function(t){var e={name:t.name,_input:t},n=e[a]=t[a];if(!s(n))return e._template=i,e;for(var l=0;l<o.length;l++){var u=o[l];if(u.name===n)return c[n]=1,e._template=u,e}return e[r]=t[r]||!1,e._template=!1,e},defaultItems:function(){for(var t=[],e=0;e<o.length;e++){var r=o[e],n=r.name;if(s(n)&&!c[n]){var i={_template:r,name:n,_input:{_templateitemname:n}};i[a]=r[a],t.push(i),c[n]=1}}return t}}},r.arrayDefaultKey=l,r.arrayEditor=function(t,e,r){var i=(n.nestedProperty(t,e).get()||[]).length,o=r._index,s=o>=i&&(r._input||{})._templateitemname;s&&(o=i);var l,c=e+"["+o+"]";function u(){l={},s&&(l[c]={},l[c][a]=s)}function h(t,e){s?n.nestedProperty(l[c],t).set(e):l[c+"."+t]=e}function f(){var t=l;return u(),t}return u(),{modifyBase:function(t,e){l[t]=e},modifyItem:h,getUpdateObj:f,applyUpdate:function(e,r){e&&h(e,r);var i=f();for(var a in i)n.nestedProperty(t,a).set(i[a])}}}},{"../lib":684,"../plots/attributes":729}],723:[function(t,e,r){"use strict";var n=t("d3"),i=t("../registry"),a=t("../plots/plots"),o=t("../lib"),s=t("../lib/clear_gl_canvases"),l=t("../components/color"),c=t("../components/drawing"),u=t("../components/titles"),h=t("../components/modebar"),f=t("../plots/cartesian/axes"),p=t("../constants/alignment"),d=t("../plots/cartesian/constraints"),g=d.enforce,m=d.clean,v=t("../plots/cartesian/autorange").doAutoRange;function y(t){var e,i=t._fullLayout,a=i._size,s=a.p,u=f.list(t,"",!0),d=i._has("cartesian");function g(t,e,r){var n=t._lw/2;return"x"===t._id.charAt(0)?e?"top"===r?e._offset-s-n:e._offset+e._length+s+n:a.t+a.h*(1-(t.position||0))+n%1:e?"right"===r?e._offset+e._length+s+n:e._offset-s-n:a.l+a.w*(t.position||0)+n%1}for(e=0;e<u.length;e++){var m=u[e];m.setScale();var v=m._anchorAxis;m._linepositions={},m._lw=c.crispRound(t,m.linewidth,1),m._mainLinePosition=g(m,v,m.side),m._mainMirrorPosition=m.mirror&&v?g(m,v,p.OPPOSITE_SIDE[m.side]):null,m._mainSubplot=x(m,i)}i._paperdiv.style({width:i.width+"px",height:i.height+"px"}).selectAll(".main-svg").call(c.setSize,i.width,i.height),t._context.setBackground(t,i.paper_bgcolor);var y=i._paper.selectAll("g.subplot"),_=[],k=[];y.each(function(t){var e=t[0],r=i._plots[e];if(r.mainplot)return r.bg&&r.bg.remove(),void(r.bg=void 0);var n=r.xaxis.domain,a=r.yaxis.domain,s=r.plotgroup;if(function(t,e,r){for(var n=0;n<r.length;n++){var i=r[n][0],a=r[n][1];if(!(i[0]>=t[1]||i[1]<=t[0])&&a[0]<e[1]&&a[1]>e[0])return!0}return!1}(n,a,k)){var l=s.node(),c=r.bg=o.ensureSingle(s,"rect","bg");l.insertBefore(c.node(),l.childNodes[0])}else s.select("rect.bg").remove(),_.push(e),k.push([n,a])});var M=i._bgLayer.selectAll(".bg").data(_);return M.enter().append("rect").classed("bg",!0),M.exit().remove(),M.each(function(t){i._plots[t].bg=n.select(this)}),y.each(function(t){var e=t[0],r=i._plots[e],n=r.xaxis,a=r.yaxis;r.bg&&d&&r.bg.call(c.setRect,n._offset-s,a._offset-s,n._length+2*s,a._length+2*s).call(l.fill,i.plot_bgcolor).style("stroke-width",0);var h,f,p=r.clipId="clip"+i._uid+e+"plot",m=o.ensureSingleById(i._clips,"clipPath",p,function(t){t.classed("plotclip",!0).append("rect")});if(r.clipRect=m.select("rect").attr({width:n._length,height:a._length}),c.setTranslate(r.plot,n._offset,a._offset),r._hasClipOnAxisFalse?(h=null,f=p):(h=p,f=null),c.setClipUrl(r.plot,h),r.layerClipId=f,d){var v,y,x,_,k,M,A,T,S,E,C,L,z,P="M0,0";b(n,e)&&(k=w(n,"left",a,u),v=n._offset-(k?s+k:0),M=w(n,"right",a,u),y=n._offset+n._length+(M?s+M:0),x=g(n,a,"bottom"),_=g(n,a,"top"),(z=!n._anchorAxis||e!==n._mainSubplot)&&n.ticks&&"allticks"===n.mirror&&(n._linepositions[e]=[x,_]),P=R(n,O,function(t){return"M"+n._offset+","+t+"h"+n._length}),z&&n.showline&&("all"===n.mirror||"allticks"===n.mirror)&&(P+=O(x)+O(_)),r.xlines.style("stroke-width",n._lw+"px").call(l.stroke,n.showline?n.linecolor:"rgba(0,0,0,0)")),r.xlines.attr("d",P);var I="M0,0";b(a,e)&&(C=w(a,"bottom",n,u),A=a._offset+a._length+(C?s:0),L=w(a,"top",n,u),T=a._offset-(L?s:0),S=g(a,n,"left"),E=g(a,n,"right"),(z=!a._anchorAxis||e!==n._mainSubplot)&&a.ticks&&"allticks"===a.mirror&&(a._linepositions[e]=[S,E]),I=R(a,D,function(t){return"M"+t+","+a._offset+"v"+a._length}),z&&a.showline&&("all"===a.mirror||"allticks"===a.mirror)&&(I+=D(S)+D(E)),r.ylines.style("stroke-width",a._lw+"px").call(l.stroke,a.showline?a.linecolor:"rgba(0,0,0,0)")),r.ylines.attr("d",I)}function O(t){return"M"+v+","+t+"H"+y}function D(t){return"M"+t+","+T+"V"+A}function R(t,r,n){if(!t.showline||e!==t._mainSubplot)return"";if(!t._anchorAxis)return n(t._mainLinePosition);var i=r(t._mainLinePosition);return t.mirror&&(i+=r(t._mainMirrorPosition)),i}}),f.makeClipPaths(t),r.drawMainTitle(t),h.manage(t),t._promises.length&&Promise.all(t._promises)}function x(t,e){var r=e._subplots,n=r.cartesian.concat(r.gl2d||[]),i={_fullLayout:e},a="x"===t._id.charAt(0),o=t._mainAxis._anchorAxis,s="",l="",c="";if(o&&(c=o._mainAxis._id,s=a?t._id+c:c+t._id),!s||!e._plots[s]){s="";for(var u=0;u<n.length;u++){var h=n[u],p=h.indexOf("y"),d=a?h.substr(0,p):h.substr(p),g=a?h.substr(p):h.substr(0,p);if(d===t._id){l||(l=h);var m=f.getFromId(i,g);if(c&&m.overlaying===c){s=h;break}}}}return s||l}function b(t,e){return(t.ticks||t.showline)&&(e===t._mainSubplot||"all"===t.mirror||"allticks"===t.mirror)}function _(t,e,r){if(!r.showline||!r._lw)return!1;if("all"===r.mirror||"allticks"===r.mirror)return!0;var n=r._anchorAxis;if(!n)return!1;var i=p.FROM_BL[e];return r.side===e?n.domain[i]===t.domain[i]:r.mirror&&n.domain[1-i]===t.domain[1-i]}function w(t,e,r,n){if(_(t,e,r))return r._lw;for(var i=0;i<n.length;i++){var a=n[i];if(a._mainAxis===r._mainAxis&&_(t,e,a))return a._lw}return 0}r.layoutStyles=function(t){return o.syncOrAsync([a.doAutoMargin,y],t)},r.drawMainTitle=function(t){var e=t._fullLayout;u.draw(t,"gtitle",{propContainer:e,propName:"title",placeholder:e._dfltTitle.plot,attributes:{x:e.width/2,y:e._size.t/2,"text-anchor":"middle"}})},r.doTraceStyle=function(t){for(var e=0;e<t.calcdata.length;e++){var r=t.calcdata[e],n=(((r[0]||{}).trace||{})._module||{}).arraysToCalcdata;n&&n(r,r[0].trace)}return a.style(t),i.getComponentMethod("legend","draw")(t),a.previousPromises(t)},r.doColorBars=function(t){for(var e=0;e<t.calcdata.length;e++){var r=t.calcdata[e][0];if((r.t||{}).cb){var n=r.trace,o=r.t.cb;i.traceIs(n,"contour")&&o.line({width:!1!==n.contours.showlines?n.line.width:0,dash:n.line.dash,color:"line"===n.contours.coloring?o._opts.line.color:n.line.color});var s=n._module.colorbar.container,l=(s?n[s]:n).colorbar;o.options(l)()}}return a.previousPromises(t)},r.layoutReplot=function(t){var e=t.layout;return t.layout=void 0,i.call("plot",t,"",e)},r.doLegend=function(t){return i.getComponentMethod("legend","draw")(t),a.previousPromises(t)},r.doTicksRelayout=function(t,e){return e?f.doTicks(t,Object.keys(e),!0):f.doTicks(t,"redraw"),t._fullLayout._hasOnlyLargeSploms&&(s(t),i.subplotsRegistry.splom.plot(t)),r.drawMainTitle(t),a.previousPromises(t)},r.doModeBar=function(t){var e=t._fullLayout;h.manage(t);for(var r=0;r<e._basePlotModules.length;r++){var n=e._basePlotModules[r].updateFx;n&&n(e)}return a.previousPromises(t)},r.doCamera=function(t){for(var e=t._fullLayout,r=e._subplots.gl3d,n=0;n<r.length;n++){var i=e[r[n]];i._scene.setCamera(i.camera)}},r.drawData=function(t){var e,r=t._fullLayout,n=t.calcdata;for(e=0;e<n.length;e++){var o=n[e][0].trace;!0===o.visible&&o._module.colorbar||r._infolayer.select(".cb"+o.uid).remove()}s(t);var l=r._basePlotModules;for(e=0;e<l.length;e++)l[e].plot(t);return a.style(t),i.getComponentMethod("shapes","draw")(t),i.getComponentMethod("annotations","draw")(t),r._replotting=!1,a.previousPromises(t)},r.doAutoRangeAndConstraints=function(t){for(var e=f.list(t,"",!0),r=0;r<e.length;r++){var n=e[r];m(t,n),v(n)}g(t)},r.finalDraw=function(t){i.getComponentMethod("shapes","draw")(t),i.getComponentMethod("images","draw")(t),i.getComponentMethod("annotations","draw")(t),i.getComponentMethod("rangeslider","draw")(t),i.getComponentMethod("rangeselector","draw")(t)},r.drawMarginPushers=function(t){i.getComponentMethod("legend","draw")(t),i.getComponentMethod("rangeselector","draw")(t),i.getComponentMethod("sliders","draw")(t),i.getComponentMethod("updatemenus","draw")(t)}},{"../components/color":558,"../components/drawing":583,"../components/modebar":621,"../components/titles":649,"../constants/alignment":656,"../lib":684,"../lib/clear_gl_canvases":668,"../plots/cartesian/autorange":731,"../plots/cartesian/axes":732,"../plots/cartesian/constraints":739,"../plots/plots":795,"../registry":817,d3:147}],724:[function(t,e,r){"use strict";var n=t("../lib"),i=n.isPlainObject,a=t("./plot_schema"),o=t("../plots/plots"),s=t("../plots/attributes"),l=t("./plot_template"),c=t("./plot_config");function u(t,e){t=n.extendDeep({},t);var r,a,o=Object.keys(t).sort();function s(e,r,n){if(i(r)&&i(e))u(e,r);else if(Array.isArray(r)&&Array.isArray(e)){var o=l.arrayTemplater({_template:t},n);for(a=0;a<r.length;a++){var s=r[a],c=o.newItem(s)._template;c&&u(c,s)}var h=o.defaultItems();for(a=0;a<h.length;a++)r.push(h[a]._template);for(a=0;a<r.length;a++)delete r[a].templateitemname}}for(r=0;r<o.length;r++){var c=o[r],f=t[c];if(c in e?s(f,e[c],c):e[c]=f,h(c)===c)for(var p in e){var d=h(p);p===d||d!==c||p in t||s(f,e[p],c)}}}function h(t){return t.replace(/[0-9]+$/,"")}function f(t,e,r,a,o){var s=o&&r(o);for(var c in t){var u=t[c],d=p(t,c,a),g=p(t,c,o),m=r(g);if(!m){var v=h(c);v!==c&&(m=r(g=p(t,v,o)))}if((!s||s!==m)&&!(!m||m._noTemplating||"data_array"===m.valType||m.arrayOk&&Array.isArray(u)))if(!m.valType&&i(u))f(u,e,r,d,g);else if(m._isLinkedToArray&&Array.isArray(u))for(var y=!1,x=0,b={},_=0;_<u.length;_++){var w=u[_];if(i(w)){var k=w.name;if(k)b[k]||(f(w,e,r,p(u,x,d),p(u,x,g)),x++,b[k]=1);else if(!y){var M=p(t,l.arrayDefaultKey(c),a),A=p(u,x,d);f(w,e,r,A,p(u,x,g));var T=n.nestedProperty(e,A);n.nestedProperty(e,M).set(T.get()),T.set(null),y=!0}}}else{n.nestedProperty(e,d).set(u)}}}function p(t,e,r){return r?Array.isArray(t)?r+"["+e+"]":r+"."+e:e}function d(t){for(var e=0;e<t.length;e++)if(i(t[e]))return!0}function g(t){var e;switch(t.code){case"data":e="The template has no key data.";break;case"layout":e="The template has no key layout.";break;case"missing":e=t.path?"There are no templates for item "+t.path+" with name "+t.templateitemname:"There are no templates for trace "+t.index+", of type "+t.traceType+".";break;case"unused":e=t.path?"The template item at "+t.path+" was not used in constructing the plot.":t.dataCount?"Some of the templates of type "+t.traceType+" were not used. The template has "+t.templateCount+" traces, the data only has "+t.dataCount+" of this type.":"The template has "+t.templateCount+" traces of type "+t.traceType+" but there are none in the data.";break;case"reused":e="Some of the templates of type "+t.traceType+" were used more than once. The template has "+t.templateCount+" traces, the data has "+t.dataCount+" of this type."}return t.msg=e,t}r.makeTemplate=function(t){t=n.extendDeep({_context:c},t),o.supplyDefaults(t);var e=t.data||[],r=t.layout||{};r._basePlotModules=t._fullLayout._basePlotModules,r._modules=t._fullLayout._modules;var l={data:{},layout:{}};e.forEach(function(t){var e={};f(t,e,function(t,e){return a.getTraceValObject(t,n.nestedProperty({},e).parts)}.bind(null,t));var r=n.coerce(t,{},s,"type"),i=l.data[r];i||(i=l.data[r]=[]),i.push(e)}),f(r,l.layout,function(t,e){return a.getLayoutValObject(t,n.nestedProperty({},e).parts)}.bind(null,r)),delete l.layout.template;var h=r.template;if(i(h)){var p,d,g,m,v,y,x=h.layout;i(x)&&u(x,l.layout);var b=h.data;if(i(b)){for(d in l.data)if(g=b[d],Array.isArray(g)){for(y=(v=l.data[d]).length,m=g.length,p=0;p<y;p++)u(g[p%m],v[p]);for(p=y;p<m;p++)v.push(n.extendDeep({},g[p]))}for(d in b)d in l.data||(l.data[d]=n.extendDeep([],b[d]))}}return l},r.validateTemplate=function(t,e){var r=n.extendDeep({},{_context:c,data:t.data,layout:t.layout}),a=r.layout||{};i(e)||(e=a.template||{});var s=e.layout,l=e.data,u=[];r.layout=a,r.layout.template=e,o.supplyDefaults(r);var f=r._fullLayout,m=r._fullData,v={};if(i(s)?(!function t(e,r){for(var n in e)if("_"!==n.charAt(0)&&i(e[n])){var a,o=h(n),s=[];for(a=0;a<r.length;a++)s.push(p(e,n,r[a])),o!==n&&s.push(p(e,o,r[a]));for(a=0;a<s.length;a++)v[s[a]]=1;t(e[n],s)}}(f,["layout"]),function t(e,r){for(var n in e)if(-1===n.indexOf("defaults")&&i(e[n])){var a=p(e,n,r);v[a]?t(e[n],a):u.push({code:"unused",path:a})}}(s,"layout")):u.push({code:"layout"}),i(l)){for(var y,x={},b=0;b<m.length;b++){var _=m[b];x[y=_.type]=(x[y]||0)+1,_._fullInput._template||u.push({code:"missing",index:_._fullInput.index,traceType:y})}for(y in l){var w=l[y].length,k=x[y]||0;w>k?u.push({code:"unused",traceType:y,templateCount:w,dataCount:k}):k>w&&u.push({code:"reused",traceType:y,templateCount:w,dataCount:k})}}else u.push({code:"data"});if(function t(e,r){for(var n in e)if("_"!==n.charAt(0)){var a=e[n],o=p(e,n,r);i(a)?(Array.isArray(e)&&!1===a._template&&a.templateitemname&&u.push({code:"missing",path:o,templateitemname:a.templateitemname}),t(a,o)):Array.isArray(a)&&d(a)&&t(a,o)}}({data:m,layout:f},""),u.length)return u.map(g)}},{"../lib":684,"../plots/attributes":729,"../plots/plots":795,"./plot_config":720,"./plot_schema":721,"./plot_template":722}],725:[function(t,e,r){"use strict";var n=t("./plot_api"),i=t("../lib"),a=t("../snapshot/helpers"),o=t("../snapshot/tosvg"),s=t("../snapshot/svgtoimg"),l={format:{valType:"enumerated",values:["png","jpeg","webp","svg"],dflt:"png"},width:{valType:"number",min:1},height:{valType:"number",min:1},scale:{valType:"number",min:0,dflt:1},setBackground:{valType:"any",dflt:!1},imageDataOnly:{valType:"boolean",dflt:!1}},c=/^data:image\/\w+;base64,/;e.exports=function(t,e){var r,u,h;function f(t){return!(t in e)||i.validate(e[t],l[t])}if(e=e||{},i.isPlainObject(t)?(r=t.data||[],u=t.layout||{},h=t.config||{}):(t=i.getGraphDiv(t),r=i.extendDeep([],t.data),u=i.extendDeep({},t.layout),h=t._context),!f("width")||!f("height"))throw new Error("Height and width should be pixel values.");if(!f("format"))throw new Error("Image format is not jpeg, png, svg or webp.");var p={};function d(t,r){return i.coerce(e,p,l,t,r)}var g=d("format"),m=d("width"),v=d("height"),y=d("scale"),x=d("setBackground"),b=d("imageDataOnly"),_=document.createElement("div");_.style.position="absolute",_.style.left="-5000px",document.body.appendChild(_);var w=i.extendFlat({},u);m&&(w.width=m),v&&(w.height=v);var k=i.extendFlat({},h,{staticPlot:!0,setBackground:x}),M=a.getRedrawFunc(_);function A(){return new Promise(function(t){setTimeout(t,a.getDelay(_._fullLayout))})}function T(){return new Promise(function(t,e){var r=o(_,g,y),a=_._fullLayout.width,l=_._fullLayout.height;if(n.purge(_),document.body.removeChild(_),"svg"===g)return t(b?r:"data:image/svg+xml,"+encodeURIComponent(r));var c=document.createElement("canvas");c.id=i.randstr(),s({format:g,width:a,height:l,scale:y,canvas:c,svg:r,promise:!0}).then(t).catch(e)})}return new Promise(function(t,e){n.plot(_,r,w,k).then(M).then(A).then(T).then(function(e){t(function(t){return b?t.replace(c,""):t}(e))}).catch(function(t){e(t)})})}},{"../lib":684,"../snapshot/helpers":821,"../snapshot/svgtoimg":823,"../snapshot/tosvg":825,"./plot_api":719}],726:[function(t,e,r){"use strict";var n=t("../lib"),i=t("../plots/plots"),a=t("./plot_schema"),o=t("./plot_config"),s=n.isPlainObject,l=Array.isArray,c=n.isArrayOrTypedArray;function u(t,e,r,i,a,o){o=o||[];for(var h=Object.keys(t),f=0;f<h.length;f++){var m=h[f];if("transforms"!==m){var v=o.slice();v.push(m);var y=t[m],x=e[m],b=g(r,m),_="info_array"===(b||{}).valType,w="colorscale"===(b||{}).valType,k=(b||{}).items;if(d(r,m))if(s(y)&&s(x))u(y,x,b,i,a,v);else if(_&&l(y)){y.length>x.length&&i.push(p("unused",a,v.concat(x.length)));var M,A,T,S,E,C=x.length,L=Array.isArray(k);if(L&&(C=Math.min(C,k.length)),2===b.dimensions)for(A=0;A<C;A++)if(l(y[A])){y[A].length>x[A].length&&i.push(p("unused",a,v.concat(A,x[A].length)));var z=x[A].length;for(M=0;M<(L?Math.min(z,k[A].length):z);M++)T=L?k[A][M]:k,S=y[A][M],E=x[A][M],n.validate(S,T)?E!==S&&E!==+S&&i.push(p("dynamic",a,v.concat(A,M),S,E)):i.push(p("value",a,v.concat(A,M),S))}else i.push(p("array",a,v.concat(A),y[A]));else for(A=0;A<C;A++)T=L?k[A]:k,S=y[A],E=x[A],n.validate(S,T)?E!==S&&E!==+S&&i.push(p("dynamic",a,v.concat(A),S,E)):i.push(p("value",a,v.concat(A),S))}else if(b.items&&!_&&l(y)){var P,I,O=k[Object.keys(k)[0]],D=[];for(P=0;P<x.length;P++){var R=x[P]._index||P;if((I=v.slice()).push(R),s(y[R])&&s(x[P])){D.push(R);var B=y[R],F=x[P];s(B)&&!1!==B.visible&&!1===F.visible?i.push(p("invisible",a,I)):u(B,F,O,i,a,I)}}for(P=0;P<y.length;P++)(I=v.slice()).push(P),s(y[P])?-1===D.indexOf(P)&&i.push(p("unused",a,I)):i.push(p("object",a,I,y[P]))}else!s(y)&&s(x)?i.push(p("object",a,v,y)):c(y)||!c(x)||_||w?m in e?n.validate(y,b)?"enumerated"===b.valType&&(b.coerceNumber&&y!==+x||y!==x)&&i.push(p("dynamic",a,v,y,x)):i.push(p("value",a,v,y)):i.push(p("unused",a,v,y)):i.push(p("array",a,v,y));else i.push(p("schema",a,v))}}return i}e.exports=function(t,e){var r,c,h=a.get(),f=[],d={_context:n.extendFlat({},o)};l(t)?(d.data=n.extendDeep([],t),r=t):(d.data=[],r=[],f.push(p("array","data"))),s(e)?(d.layout=n.extendDeep({},e),c=e):(d.layout={},c={},arguments.length>1&&f.push(p("object","layout"))),i.supplyDefaults(d);for(var g=d._fullData,m=r.length,v=0;v<m;v++){var y=r[v],x=["data",v];if(s(y)){var b=g[v],_=b.type,w=h.traces[_].attributes;w.type={valType:"enumerated",values:[_]},!1===b.visible&&!1!==y.visible&&f.push(p("invisible",x)),u(y,b,w,f,x);var k=y.transforms,M=b.transforms;if(k){l(k)||f.push(p("array",x,["transforms"])),x.push("transforms");for(var A=0;A<k.length;A++){var T=["transforms",A],S=k[A].type;if(s(k[A])){var E=h.transforms[S]?h.transforms[S].attributes:{};E.type={valType:"enumerated",values:Object.keys(h.transforms)},u(k[A],M[A],E,f,x,T)}else f.push(p("object",x,T))}}}else f.push(p("object",x))}return u(c,d._fullLayout,function(t,e){for(var r=0;r<e.length;r++){var i=e[r].type,a=t.traces[i].layoutAttributes;a&&n.extendFlat(t.layout.layoutAttributes,a)}return t.layout.layoutAttributes}(h,g),f,"layout"),0===f.length?void 0:f};var h={object:function(t,e){return("layout"===t&&""===e?"The layout argument":"data"===t[0]&&""===e?"Trace "+t[1]+" in the data argument":f(t)+"key "+e)+" must be linked to an object container"},array:function(t,e){return("data"===t?"The data argument":f(t)+"key "+e)+" must be linked to an array container"},schema:function(t,e){return f(t)+"key "+e+" is not part of the schema"},unused:function(t,e,r){var n=s(r)?"container":"key";return f(t)+n+" "+e+" did not get coerced"},dynamic:function(t,e,r,n){return[f(t)+"key",e,"(set to '"+r+"')","got reset to","'"+n+"'","during defaults."].join(" ")},invisible:function(t,e){return(e?f(t)+"item "+e:"Trace "+t[1])+" got defaulted to be not visible"},value:function(t,e,r){return[f(t)+"key "+e,"is set to an invalid value ("+r+")"].join(" ")}};function f(t){return l(t)?"In data trace "+t[1]+", ":"In "+t+", "}function p(t,e,r,i,a){var o,s;r=r||"",l(e)?(o=e[0],s=e[1]):(o=e,s=null);var c=function(t){if(!l(t))return String(t);for(var e="",r=0;r<t.length;r++){var n=t[r];"number"==typeof n?e=e.substr(0,e.length-1)+"["+n+"]":e+=n,r<t.length-1&&(e+=".")}return e}(r),u=h[t](e,c,i,a);return n.log(u),{code:t,container:o,trace:s,path:r,astr:c,msg:u}}function d(t,e){var r=v(e),n=r.keyMinusId,i=r.id;return!!(n in t&&t[n]._isSubplotObj&&i)||e in t}function g(t,e){return e in t?t[e]:t[v(e).keyMinusId]}var m=n.counterRegex("([a-z]+)");function v(t){var e=t.match(m);return{keyMinusId:e&&e[1],id:e&&e[2]}}},{"../lib":684,"../plots/plots":795,"./plot_config":720,"./plot_schema":721}],727:[function(t,e,r){"use strict";e.exports={mode:{valType:"enumerated",dflt:"afterall",values:["immediate","next","afterall"]},direction:{valType:"enumerated",values:["forward","reverse"],dflt:"forward"},fromcurrent:{valType:"boolean",dflt:!1},frame:{duration:{valType:"number",min:0,dflt:500},redraw:{valType:"boolean",dflt:!0}},transition:{duration:{valType:"number",min:0,dflt:500},easing:{valType:"enumerated",dflt:"cubic-in-out",values:["linear","quad","cubic","sin","exp","circle","elastic","back","bounce","linear-in","quad-in","cubic-in","sin-in","exp-in","circle-in","elastic-in","back-in","bounce-in","linear-out","quad-out","cubic-out","sin-out","exp-out","circle-out","elastic-out","back-out","bounce-out","linear-in-out","quad-in-out","cubic-in-out","sin-in-out","exp-in-out","circle-in-out","elastic-in-out","back-in-out","bounce-in-out"]}}}},{}],728:[function(t,e,r){"use strict";var n=t("../lib"),i=t("../plot_api/plot_template");e.exports=function(t,e,r){var a,o,s=r.name,l=r.inclusionAttr||"visible",c=e[s],u=n.isArrayOrTypedArray(t[s])?t[s]:[],h=e[s]=[],f=i.arrayTemplater(e,s,l);for(a=0;a<u.length;a++){var p=u[a];n.isPlainObject(p)?o=f.newItem(p):(o=f.newItem({}))[l]=!1,o._index=a,!1!==o[l]&&r.handleItemDefaults(p,o,e,r),h.push(o)}var d=f.defaultItems();for(a=0;a<d.length;a++)(o=d[a])._index=h.length,r.handleItemDefaults({},o,e,r,{}),h.push(o);if(n.isArrayOrTypedArray(c)){var g=Math.min(c.length,h.length);for(a=0;a<g;a++)n.relinkPrivateKeys(h[a],c[a])}return h}},{"../lib":684,"../plot_api/plot_template":722}],729:[function(t,e,r){"use strict";var n=t("../components/fx/attributes");e.exports={type:{valType:"enumerated",values:[],dflt:"scatter",editType:"calc+clearAxisTypes",_noTemplating:!0},visible:{valType:"enumerated",values:[!0,!1,"legendonly"],dflt:!0,editType:"calc"},showlegend:{valType:"boolean",dflt:!0,editType:"style"},legendgroup:{valType:"string",dflt:"",editType:"style"},opacity:{valType:"number",min:0,max:1,dflt:1,editType:"style"},name:{valType:"string",editType:"style"},uid:{valType:"string",editType:"plot"},ids:{valType:"data_array",editType:"calc"},customdata:{valType:"data_array",editType:"calc"},selectedpoints:{valType:"any",editType:"calc"},hoverinfo:{valType:"flaglist",flags:["x","y","z","text","name"],extras:["all","none","skip"],arrayOk:!0,dflt:"all",editType:"none"},hoverlabel:n.hoverlabel,stream:{token:{valType:"string",noBlank:!0,strict:!0,editType:"calc"},maxpoints:{valType:"number",min:0,max:1e4,dflt:500,editType:"calc"},editType:"calc"},transforms:{_isLinkedToArray:"transform",editType:"calc"}}},{"../components/fx/attributes":592}],730:[function(t,e,r){"use strict";e.exports={xaxis:{valType:"subplotid",dflt:"x",editType:"calc+clearAxisTypes"},yaxis:{valType:"subplotid",dflt:"y",editType:"calc+clearAxisTypes"}}},{}],731:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib"),a=t("../../constants/numerical").FP_SAFE;function o(t){var e,r,n,a,o,l,c,u,h=[],f=t._min[0].val,p=t._max[0].val,d=0,g=!1,m=s(t);for(e=1;e<t._min.length&&f===p;e++)f=Math.min(f,t._min[e].val);for(e=1;e<t._max.length&&f===p;e++)p=Math.max(p,t._max[e].val);if(t.range){var v=i.simpleMap(t.range,t.r2l);g=v[1]<v[0]}for("reversed"===t.autorange&&(g=!0,t.autorange=!0),e=0;e<t._min.length;e++)for(n=t._min[e],r=0;r<t._max.length;r++)u=(a=t._max[r]).val-n.val,c=t._length-m(n)-m(a),u>0&&c>0&&u/c>d&&(o=n,l=a,d=u/c);if(f===p){var y=f-1,x=f+1;h="tozero"===t.rangemode?f<0?[y,0]:[0,x]:"nonnegative"===t.rangemode?[Math.max(0,y),Math.max(0,x)]:[y,x]}else d&&("linear"!==t.type&&"-"!==t.type||("tozero"===t.rangemode?(o.val>=0&&(o={val:0,pad:0}),l.val<=0&&(l={val:0,pad:0})):"nonnegative"===t.rangemode&&(o.val-d*m(o)<0&&(o={val:0,pad:0}),l.val<0&&(l={val:1,pad:0})),d=(l.val-o.val)/(t._length-m(o)-m(l))),h=[o.val-d*m(o),l.val+d*m(l)]);return h[0]===h[1]&&("tozero"===t.rangemode?h=h[0]<0?[h[0],0]:h[0]>0?[0,h[0]]:[0,1]:(h=[h[0]-1,h[0]+1],"nonnegative"===t.rangemode&&(h[0]=Math.max(0,h[0])))),g&&h.reverse(),i.simpleMap(h,t.l2r||Number)}function s(t){var e=t._length/20;return"domain"===t.constrain&&t._inputDomain&&(e*=(t._inputDomain[1]-t._inputDomain[0])/(t.domain[1]-t.domain[0])),function(t){return t.pad+(t.extrapad?e:0)}}function l(t){return n(t)&&Math.abs(t)<a}function c(t,e){return t<=e}function u(t,e){return t>=e}e.exports={getAutoRange:o,makePadFn:s,doAutoRange:function(t){t._length||t.setScale();var e,r=t._min&&t._max&&t._min.length&&t._max.length;t.autorange&&r&&(t.range=o(t),t._r=t.range.slice(),t._rl=i.simpleMap(t._r,t.r2l),(e=t._input).range=t.range.slice(),e.autorange=t.autorange);if(t._anchorAxis&&t._anchorAxis.rangeslider){var n=t._anchorAxis.rangeslider[t._name];n&&"auto"===n.rangemode&&(n.range=r?o(t):t._rangeInitial?t._rangeInitial.slice():t.range.slice()),(e=t._anchorAxis._input).rangeslider[t._name]=i.extendFlat({},n)}},expand:function(t,e,r){if(!function(t){return t.autorange||t._rangesliderAutorange}(t)||!e)return;t._min||(t._min=[]);t._max||(t._max=[]);r||(r={});t._m||t.setScale();var i,o,s,h,f,p,d,g,m,v,y,x,b=e.length,_=r.padded||!1,w=r.tozero&&("linear"===t.type||"-"===t.type),k="log"===t.type,M=!1;function A(t){if(Array.isArray(t))return M=!0,function(e){return Math.max(Number(t[e]||0),0)};var e=Math.max(Number(t||0),0);return function(){return e}}var T=A((t._m>0?r.ppadplus:r.ppadminus)||r.ppad||0),S=A((t._m>0?r.ppadminus:r.ppadplus)||r.ppad||0),E=A(r.vpadplus||r.vpad),C=A(r.vpadminus||r.vpad);if(!M){if(y=1/0,x=-1/0,k)for(i=0;i<b;i++)(h=e[i])<y&&h>0&&(y=h),h>x&&h<a&&(x=h);else for(i=0;i<b;i++)(h=e[i])<y&&h>-a&&(y=h),h>x&&h<a&&(x=h);e=[y,x],b=2}function L(r){if(f=e[r],n(f))for(g=T(r),m=S(r),y=f-C(r),x=f+E(r),k&&y<x/10&&(y=x/10),p=t.c2l(y),d=t.c2l(x),w&&(p=Math.min(0,p),d=Math.max(0,d)),s=0;s<2;s++){var i=s?d:p;if(l(i)){var a=s?t._max:t._min,b=s?g:m,M=s?u:c;for(v=!0,o=0;o<a.length&&v;o++){if(h=a[o],M(h.val,i)&&h.pad>=b&&(h.extrapad||!_)){v=!1;break}M(i,h.val)&&h.pad<=b&&(_||!h.extrapad)&&(a.splice(o,1),o--)}if(v){var A=w&&0===i;a.push({val:i,pad:A?0:b,extrapad:!A&&_})}}}}var z=Math.min(6,b);for(i=0;i<z;i++)L(i);for(i=b-1;i>=z;i--)L(i)}}},{"../../constants/numerical":661,"../../lib":684,"fast-isnumeric":214}],732:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("../../plots/plots"),o=t("../../registry"),s=t("../../lib"),l=t("../../lib/svg_text_utils"),c=t("../../components/titles"),u=t("../../components/color"),h=t("../../components/drawing"),f=t("../../constants/numerical"),p=f.ONEAVGYEAR,d=f.ONEAVGMONTH,g=f.ONEDAY,m=f.ONEHOUR,v=f.ONEMIN,y=f.ONESEC,x=f.MINUS_SIGN,b=f.BADNUM,_=t("../../constants/alignment").MID_SHIFT,w=t("../../constants/alignment").LINE_SPACING,k=e.exports={};k.setConvert=t("./set_convert");var M=t("./axis_autotype"),A=t("./axis_ids");k.id2name=A.id2name,k.name2id=A.name2id,k.cleanId=A.cleanId,k.list=A.list,k.listIds=A.listIds,k.getFromId=A.getFromId,k.getFromTrace=A.getFromTrace;var T=t("./autorange");k.expand=T.expand,k.getAutoRange=T.getAutoRange,k.coerceRef=function(t,e,r,n,i,a){var o=n.charAt(n.length-1),l=r._fullLayout._subplots[o+"axis"],c=n+"ref",u={};return i||(i=l[0]||a),a||(a=i),u[c]={valType:"enumerated",values:l.concat(a?[a]:[]),dflt:i},s.coerce(t,e,u,c)},k.coercePosition=function(t,e,r,n,i,a){var o,l;if("paper"===n||"pixel"===n)o=s.ensureNumber,l=r(i,a);else{var c=k.getFromId(e,n);l=r(i,a=c.fraction2r(a)),o=c.cleanPos}t[i]=o(l)},k.cleanPosition=function(t,e,r){return("paper"===r||"pixel"===r?s.ensureNumber:k.getFromId(e,r).cleanPos)(t)};var S=k.getDataConversions=function(t,e,r,n){var i,a="x"===r||"y"===r||"z"===r?r:n;if(Array.isArray(a)){if(i={type:M(n),_categories:[]},k.setConvert(i),"category"===i.type)for(var o=0;o<n.length;o++)i.d2c(n[o])}else i=k.getFromTrace(t,e,a);return i?{d2c:i.d2c,c2d:i.c2d}:"ids"===a?{d2c:C,c2d:C}:{d2c:E,c2d:E}};function E(t){return+t}function C(t){return String(t)}k.getDataToCoordFunc=function(t,e,r,n){return S(t,e,r,n).d2c},k.counterLetter=function(t){var e=t.charAt(0);return"x"===e?"y":"y"===e?"x":void 0},k.minDtick=function(t,e,r,n){-1===["log","category"].indexOf(t.type)&&n?void 0===t._minDtick?(t._minDtick=e,t._forceTick0=r):t._minDtick&&((t._minDtick/e+1e-6)%1<2e-6&&((r-t._forceTick0)/e%1+1.000001)%1<2e-6?(t._minDtick=e,t._forceTick0=r):((e/t._minDtick+1e-6)%1>2e-6||((r-t._forceTick0)/t._minDtick%1+1.000001)%1>2e-6)&&(t._minDtick=0)):t._minDtick=0},k.saveRangeInitial=function(t,e){for(var r=k.list(t,"",!0),n=!1,i=0;i<r.length;i++){var a=r[i],o=void 0===a._rangeInitial,s=o||!(a.range[0]===a._rangeInitial[0]&&a.range[1]===a._rangeInitial[1]);(o&&!1===a.autorange||e&&s)&&(a._rangeInitial=a.range.slice(),n=!0)}return n},k.saveShowSpikeInitial=function(t,e){for(var r=k.list(t,"",!0),n=!1,i="on",a=0;a<r.length;a++){var o=r[a],s=void 0===o._showSpikeInitial,l=s||!(o.showspikes===o._showspikes);(s||e&&l)&&(o._showSpikeInitial=o.showspikes,n=!0),"on"!==i||o.showspikes||(i="off")}return t._fullLayout._cartesianSpikesEnabled=i,n},k.autoBin=function(t,e,r,n,a){var o,l,c=s.aggNums(Math.min,null,t),u=s.aggNums(Math.max,null,t);if(a||(a=e.calendar),"category"===e.type)return{start:c-.5,end:u+.5,size:1,_dataSpan:u-c};if(r)o=(u-c)/r;else{var h=s.distinctVals(t),f=Math.pow(10,Math.floor(Math.log(h.minDiff)/Math.LN10)),p=f*s.roundUp(h.minDiff/f,[.9,1.9,4.9,9.9],!0);o=Math.max(p,2*s.stdev(t)/Math.pow(t.length,n?.25:.4)),i(o)||(o=1)}l="log"===e.type?{type:"linear",range:[c,u]}:{type:e.type,range:s.simpleMap([c,u],e.c2r,0,a),calendar:a},k.setConvert(l),k.autoTicks(l,o);var d,m=k.tickIncrement(k.tickFirst(l),l.dtick,"reverse",a);if("number"==typeof l.dtick)d=(m=function(t,e,r,n,a){var o=0,s=0,l=0,c=0;function u(e){return(1+100*(e-t)/r.dtick)%100<2}for(var h=0;h<e.length;h++)e[h]%1==0?l++:i(e[h])||c++,u(e[h])&&o++,u(e[h]+r.dtick/2)&&s++;var f=e.length-c;if(l===f&&"date"!==r.type)r.dtick<1?t=n-.5*r.dtick:(t-=.5)+r.dtick<n&&(t+=r.dtick);else if(s<.1*f&&(o>.3*f||u(n)||u(a))){var p=r.dtick/2;t+=t+p<n?p:-p}return t}(m,t,l,c,u))+(1+Math.floor((u-m)/l.dtick))*l.dtick;else for("M"===l.dtick.charAt(0)&&(m=function(t,e,r,n,i){var a=s.findExactDates(e,i);if(a.exactDays>.8){var o=Number(r.substr(1));a.exactYears>.8&&o%12==0?t=k.tickIncrement(t,"M6","reverse")+1.5*g:a.exactMonths>.8?t=k.tickIncrement(t,"M1","reverse")+15.5*g:t-=g/2;var l=k.tickIncrement(t,r);if(l<=n)return l}return t}(m,t,l.dtick,c,a)),d=m,0;d<=u;)d=k.tickIncrement(d,l.dtick,!1,a),0;return{start:e.c2r(m,0,a),end:e.c2r(d,0,a),size:l.dtick,_dataSpan:u-c}},k.prepTicks=function(t){var e=s.simpleMap(t.range,t.r2l);if("auto"===t.tickmode||!t.dtick){var r,n=t.nticks;n||("category"===t.type?(r=t.tickfont?1.2*(t.tickfont.size||12):15,n=t._length/r):(r="y"===t._id.charAt(0)?40:80,n=s.constrain(t._length/r,4,9)+1),"radialaxis"===t._name&&(n*=2)),"array"===t.tickmode&&(n*=100),k.autoTicks(t,Math.abs(e[1]-e[0])/n),t._minDtick>0&&t.dtick<2*t._minDtick&&(t.dtick=t._minDtick,t.tick0=t.l2r(t._forceTick0))}t.tick0||(t.tick0="date"===t.type?"2000-01-01":0),F(t)},k.calcTicks=function(t){k.prepTicks(t);var e=s.simpleMap(t.range,t.r2l);if("array"===t.tickmode)return function(t){var e,r,n=t.tickvals,i=t.ticktext,a=new Array(n.length),o=s.simpleMap(t.range,t.r2l),l=1.0001*o[0]-1e-4*o[1],c=1.0001*o[1]-1e-4*o[0],u=Math.min(l,c),h=Math.max(l,c),f=0;Array.isArray(i)||(i=[]);var p="category"===t.type?t.d2l_noadd:t.d2l;"log"===t.type&&"L"!==String(t.dtick).charAt(0)&&(t.dtick="L"+Math.pow(10,Math.floor(Math.min(t.range[0],t.range[1]))-1));for(r=0;r<n.length;r++)(e=p(n[r]))>u&&e<h&&(void 0===i[r]?a[f]=k.tickText(t,e):a[f]=N(t,e,String(i[r])),f++);f<n.length&&a.splice(f,n.length-f);return a}(t);t._tmin=k.tickFirst(t);var r=1.0001*e[0]-1e-4*e[1],n=1.0001*e[1]-1e-4*e[0],i=e[1]<e[0];if(t._tmin<r!==i)return[];var a=[];"category"===t.type&&(n=i?Math.max(-.5,n):Math.min(t._categories.length-.5,n));for(var o=null,l=Math.max(1e3,t._length||0),c=t._tmin;(i?c>=n:c<=n)&&!(a.length>l||c===o);c=k.tickIncrement(c,t.dtick,i,t.calendar))o=c,a.push(c);"angular"===t._id&&360===Math.abs(e[1]-e[0])&&a.pop(),t._tmax=a[a.length-1],t._prevDateHead="",t._inCalcTicks=!0;for(var u=new Array(a.length),h=0;h<a.length;h++)u[h]=k.tickText(t,a[h]);return t._inCalcTicks=!1,u};var L=[2,5,10],z=[1,2,3,6,12],P=[1,2,5,10,15,30],I=[1,2,3,7,14],O=[-.046,0,.301,.477,.602,.699,.778,.845,.903,.954,1],D=[-.301,0,.301,.699,1],R=[15,30,45,90,180];function B(t,e,r){return e*s.roundUp(t/e,r)}function F(t){var e=t.dtick;if(t._tickexponent=0,i(e)||"string"==typeof e||(e=1),"category"===t.type&&(t._tickround=null),"date"===t.type){var r=t.r2l(t.tick0),n=t.l2r(r).replace(/(^-|i)/g,""),a=n.length;if("M"===String(e).charAt(0))a>10||"01-01"!==n.substr(5)?t._tickround="d":t._tickround=+e.substr(1)%12==0?"y":"m";else if(e>=g&&a<=10||e>=15*g)t._tickround="d";else if(e>=v&&a<=16||e>=m)t._tickround="M";else if(e>=y&&a<=19||e>=v)t._tickround="S";else{var o=t.l2r(r+e).replace(/^-/,"").length;t._tickround=Math.max(a,o)-20}}else if(i(e)||"L"===e.charAt(0)){var s=t.range.map(t.r2d||Number);i(e)||(e=Number(e.substr(1))),t._tickround=2-Math.floor(Math.log(e)/Math.LN10+.01);var l=Math.max(Math.abs(s[0]),Math.abs(s[1])),c=Math.floor(Math.log(l)/Math.LN10+.01);Math.abs(c)>3&&(V(t.exponentformat)&&!U(c)?t._tickexponent=3*Math.round((c-1)/3):t._tickexponent=c)}else t._tickround=null}function N(t,e,r){var n=t.tickfont||{};return{x:e,dx:0,dy:0,text:r||"",fontSize:n.size,font:n.family,fontColor:n.color}}k.autoTicks=function(t,e){var r;function n(t){return Math.pow(t,Math.floor(Math.log(e)/Math.LN10))}if("date"===t.type){t.tick0=s.dateTick0(t.calendar);var a=2*e;a>p?(e/=p,r=n(10),t.dtick="M"+12*B(e,r,L)):a>d?(e/=d,t.dtick="M"+B(e,1,z)):a>g?(t.dtick=B(e,g,I),t.tick0=s.dateTick0(t.calendar,!0)):a>m?t.dtick=B(e,m,z):a>v?t.dtick=B(e,v,P):a>y?t.dtick=B(e,y,P):(r=n(10),t.dtick=B(e,r,L))}else if("log"===t.type){t.tick0=0;var o=s.simpleMap(t.range,t.r2l);if(e>.7)t.dtick=Math.ceil(e);else if(Math.abs(o[1]-o[0])<1){var l=1.5*Math.abs((o[1]-o[0])/e);e=Math.abs(Math.pow(10,o[1])-Math.pow(10,o[0]))/l,r=n(10),t.dtick="L"+B(e,r,L)}else t.dtick=e>.3?"D2":"D1"}else"category"===t.type?(t.tick0=0,t.dtick=Math.ceil(Math.max(e,1))):"angular"===t._id?(t.tick0=0,r=1,t.dtick=B(e,r,R)):(t.tick0=0,r=n(10),t.dtick=B(e,r,L));if(0===t.dtick&&(t.dtick=1),!i(t.dtick)&&"string"!=typeof t.dtick){var c=t.dtick;throw t.dtick=1,"ax.dtick error: "+String(c)}},k.tickIncrement=function(t,e,r,a){var o=r?-1:1;if(i(e))return t+o*e;var l=e.charAt(0),c=o*Number(e.substr(1));if("M"===l)return s.incrementMonth(t,c,a);if("L"===l)return Math.log(Math.pow(10,t)+c)/Math.LN10;if("D"===l){var u="D2"===e?D:O,h=t+.01*o,f=s.roundUp(s.mod(h,1),u,r);return Math.floor(h)+Math.log(n.round(Math.pow(10,f),1))/Math.LN10}throw"unrecognized dtick "+String(e)},k.tickFirst=function(t){var e=t.r2l||Number,r=s.simpleMap(t.range,e),a=r[1]<r[0],o=a?Math.floor:Math.ceil,l=1.0001*r[0]-1e-4*r[1],c=t.dtick,u=e(t.tick0);if(i(c)){var h=o((l-u)/c)*c+u;return"category"===t.type&&(h=s.constrain(h,0,t._categories.length-1)),h}var f=c.charAt(0),p=Number(c.substr(1));if("M"===f){for(var d,g,m,v=0,y=u;v<10;){if(((d=k.tickIncrement(y,c,a,t.calendar))-l)*(y-l)<=0)return a?Math.min(y,d):Math.max(y,d);g=(l-(y+d)/2)/(d-y),m=f+(Math.abs(Math.round(g))||1)*p,y=k.tickIncrement(y,m,g<0?!a:a,t.calendar),v++}return s.error("tickFirst did not converge",t),y}if("L"===f)return Math.log(o((Math.pow(10,l)-u)/p)*p+u)/Math.LN10;if("D"===f){var x="D2"===c?D:O,b=s.roundUp(s.mod(l,1),x,a);return Math.floor(l)+Math.log(n.round(Math.pow(10,b),1))/Math.LN10}throw"unrecognized dtick "+String(c)},k.tickText=function(t,e,r){var n,a,o=N(t,e),l="array"===t.tickmode,c=r||l,u="category"===t.type?t.d2l_noadd:t.d2l;if(l&&Array.isArray(t.ticktext)){var h=s.simpleMap(t.range,t.r2l),f=Math.abs(h[1]-h[0])/1e4;for(a=0;a<t.ticktext.length&&!(Math.abs(e-u(t.tickvals[a]))<f);a++);if(a<t.ticktext.length)return o.text=String(t.ticktext[a]),o}function p(n){var i;return void 0===n||(r?"none"===n:(i={first:t._tmin,last:t._tmax}[n],"all"!==n&&e!==i))}return n=r?"never":"none"!==t.exponentformat&&p(t.showexponent)?"hide":"","date"===t.type?function(t,e,r,n){var a=t._tickround,o=r&&t.hoverformat||k.getTickFormat(t);n&&(a=i(a)?4:{y:"m",m:"d",d:"M",M:"S",S:4}[a]);var l,c=s.formatDate(e.x,o,a,t._dateFormat,t.calendar,t._extraFormat),u=c.indexOf("\n");-1!==u&&(l=c.substr(u+1),c=c.substr(0,u));n&&("00:00:00"===c||"00:00"===c?(c=l,l=""):8===c.length&&(c=c.replace(/:00$/,"")));l&&(r?"d"===a?c+=", "+l:c=l+(c?", "+c:""):t._inCalcTicks&&l===t._prevDateHead||(c+="<br>"+l,t._prevDateHead=l));e.text=c}(t,o,r,c):"log"===t.type?function(t,e,r,n,a){var o=t.dtick,l=e.x,c=t.tickformat;"never"===a&&(a="");!n||"string"==typeof o&&"L"===o.charAt(0)||(o="L3");if(c||"string"==typeof o&&"L"===o.charAt(0))e.text=q(Math.pow(10,l),t,a,n);else if(i(o)||"D"===o.charAt(0)&&s.mod(l+.01,1)<.1){var u=Math.round(l);-1!==["e","E","power"].indexOf(t.exponentformat)||V(t.exponentformat)&&U(u)?(e.text=0===u?1:1===u?"10":u>1?"10<sup>"+u+"</sup>":"10<sup>"+x+-u+"</sup>",e.fontSize*=1.25):(e.text=q(Math.pow(10,l),t,"","fakehover"),"D1"===o&&"y"===t._id.charAt(0)&&(e.dy-=e.fontSize/6))}else{if("D"!==o.charAt(0))throw"unrecognized dtick "+String(o);e.text=String(Math.round(Math.pow(10,s.mod(l,1)))),e.fontSize*=.75}if("D1"===t.dtick){var h=String(e.text).charAt(0);"0"!==h&&"1"!==h||("y"===t._id.charAt(0)?e.dx-=e.fontSize/4:(e.dy+=e.fontSize/2,e.dx+=(t.range[1]>t.range[0]?1:-1)*e.fontSize*(l<0?.5:.25)))}}(t,o,0,c,n):"category"===t.type?function(t,e){var r=t._categories[Math.round(e.x)];void 0===r&&(r="");e.text=String(r)}(t,o):"angular"===t._id?function(t,e,r,n,i){if("radians"!==t.thetaunit||r)e.text=q(e.x,t,i,n);else{var a=e.x/180;if(0===a)e.text="0";else{var o=function(t){function e(t,e){return Math.abs(t-e)<=1e-6}var r=function(t){var r=1;for(;!e(Math.round(t*r)/r,t);)r*=10;return r}(t),n=t*r,i=Math.abs(function t(r,n){return e(n,0)?r:t(n,r%n)}(n,r));return[Math.round(n/i),Math.round(r/i)]}(a);if(o[1]>=100)e.text=q(s.deg2rad(e.x),t,i,n);else{var l=e.x<0;1===o[1]?1===o[0]?e.text="\u03c0":e.text=o[0]+"\u03c0":e.text=["<sup>",o[0],"</sup>","\u2044","<sub>",o[1],"</sub>","\u03c0"].join(""),l&&(e.text=x+e.text)}}}}(t,o,r,c,n):function(t,e,r,n,i){"never"===i?i="":"all"===t.showexponent&&Math.abs(e.x/t.dtick)<1e-6&&(i="hide");e.text=q(e.x,t,i,n)}(t,o,0,c,n),t.tickprefix&&!p(t.showtickprefix)&&(o.text=t.tickprefix+o.text),t.ticksuffix&&!p(t.showticksuffix)&&(o.text+=t.ticksuffix),o},k.hoverLabelText=function(t,e,r){if(r!==b&&r!==e)return k.hoverLabelText(t,e)+" - "+k.hoverLabelText(t,r);var n="log"===t.type&&e<=0,i=k.tickText(t,t.c2l(n?-e:e),"hover").text;return n?0===e?"0":x+i:i};var j=["f","p","n","\u03bc","m","","k","M","G","T"];function V(t){return"SI"===t||"B"===t}function U(t){return t>14||t<-15}function q(t,e,r,n){var a=t<0,o=e._tickround,l=r||e.exponentformat||"B",c=e._tickexponent,u=k.getTickFormat(e),h=e.separatethousands;if(n){var f={exponentformat:l,dtick:"none"===e.showexponent?e.dtick:i(t)&&Math.abs(t)||1,range:"none"===e.showexponent?e.range.map(e.r2d):[0,t||1]};F(f),o=(Number(f._tickround)||0)+4,c=f._tickexponent,e.hoverformat&&(u=e.hoverformat)}if(u)return e._numFormat(u)(t).replace(/-/g,x);var p,d=Math.pow(10,-o)/2;if("none"===l&&(c=0),(t=Math.abs(t))<d)t="0",a=!1;else{if(t+=d,c&&(t*=Math.pow(10,-c),o+=c),0===o)t=String(Math.floor(t));else if(o<0){t=(t=String(Math.round(t))).substr(0,t.length+o);for(var g=o;g<0;g++)t+="0"}else{var m=(t=String(t)).indexOf(".")+1;m&&(t=t.substr(0,m+o).replace(/\.?0+$/,""))}t=s.numSeparate(t,e._separators,h)}c&&"hide"!==l&&(V(l)&&U(c)&&(l="power"),p=c<0?x+-c:"power"!==l?"+"+c:String(c),"e"===l?t+="e"+p:"E"===l?t+="E"+p:"power"===l?t+="\xd710<sup>"+p+"</sup>":"B"===l&&9===c?t+="B":V(l)&&(t+=j[c/3+5]));return a?x+t:t}function H(t,e){for(var r=0;r<e.length;r++)-1===t.indexOf(e[r])&&t.push(e[r])}function G(t,e,r){var n,i,a=[],o=[],l=t.layout;for(n=0;n<e.length;n++)a.push(k.getFromId(t,e[n]));for(n=0;n<r.length;n++)o.push(k.getFromId(t,r[n]));var c=Object.keys(a[0]),u=["anchor","domain","overlaying","position","side","tickangle"],h=["linear","log"];for(n=0;n<c.length;n++){var f=c[n],p=a[0][f],d=o[0][f],g=!0,m=!1,v=!1;if("_"!==f.charAt(0)&&"function"!=typeof p&&-1===u.indexOf(f)){for(i=1;i<a.length&&g;i++){var y=a[i][f];"type"===f&&-1!==h.indexOf(p)&&-1!==h.indexOf(y)&&p!==y?m=!0:y!==p&&(g=!1)}for(i=1;i<o.length&&g;i++){var x=o[i][f];"type"===f&&-1!==h.indexOf(d)&&-1!==h.indexOf(x)&&d!==x?v=!0:o[i][f]!==d&&(g=!1)}g&&(m&&(l[a[0]._name].type="linear"),v&&(l[o[0]._name].type="linear"),W(l,f,a,o,t._fullLayout._dfltTitle))}}for(n=0;n<t._fullLayout.annotations.length;n++){var b=t._fullLayout.annotations[n];-1!==e.indexOf(b.xref)&&-1!==r.indexOf(b.yref)&&s.swapAttrs(l.annotations[n],["?"])}}function W(t,e,r,n,i){var a,o=s.nestedProperty,l=o(t[r[0]._name],e).get(),c=o(t[n[0]._name],e).get();for("title"===e&&(l===i.x&&(l=i.y),c===i.y&&(c=i.x)),a=0;a<r.length;a++)o(t,r[a]._name+"."+e).set(c);for(a=0;a<n.length;a++)o(t,n[a]._name+"."+e).set(l)}k.getTickFormat=function(t){var e,r,n,i,a,o,s,l;function c(t){return"string"!=typeof t?t:Number(t.replace("M",""))*d}function u(t,e){var r=["L","D"];if(typeof t==typeof e){if("number"==typeof t)return t-e;var n=r.indexOf(t.charAt(0)),i=r.indexOf(e.charAt(0));return n===i?Number(t.replace(/(L|D)/g,""))-Number(e.replace(/(L|D)/g,"")):n-i}return"number"==typeof t?1:-1}function h(t,e){var r=null===e[0],n=null===e[1],i=u(t,e[0])>=0,a=u(t,e[1])<=0;return(r||i)&&(n||a)}if(t.tickformatstops&&t.tickformatstops.length>0)switch(t.type){case"date":case"linear":for(e=0;e<t.tickformatstops.length;e++)if((n=t.tickformatstops[e]).enabled&&(i=t.dtick,a=n.dtickrange,o=void 0,void 0,void 0,o=c||function(t){return t},s=a[0],l=a[1],(!s&&"number"!=typeof s||o(s)<=o(i))&&(!l&&"number"!=typeof l||o(l)>=o(i)))){r=n;break}break;case"log":for(e=0;e<t.tickformatstops.length;e++)if((n=t.tickformatstops[e]).enabled&&h(t.dtick,n.dtickrange)){r=n;break}}return r?r.value:t.tickformat},k.getSubplots=function(t,e){var r=t._fullLayout._subplots,n=r.cartesian.concat(r.gl2d||[]),i=e?k.findSubplotsWithAxis(n,e):n;return i.sort(function(t,e){var r=t.substr(1).split("y"),n=e.substr(1).split("y");return r[0]===n[0]?+r[1]-+n[1]:+r[0]-+n[0]}),i},k.findSubplotsWithAxis=function(t,e){for(var r=new RegExp("x"===e._id.charAt(0)?"^"+e._id+"y":e._id+"$"),n=[],i=0;i<t.length;i++){var a=t[i];r.test(a)&&n.push(a)}return n},k.makeClipPaths=function(t){var e=t._fullLayout;if(!e._hasOnlyLargeSploms){var r,i,a={_offset:0,_length:e.width,_id:""},o={_offset:0,_length:e.height,_id:""},s=k.list(t,"x",!0),l=k.list(t,"y",!0),c=[];for(r=0;r<s.length;r++)for(c.push({x:s[r],y:o}),i=0;i<l.length;i++)0===r&&c.push({x:a,y:l[i]}),c.push({x:s[r],y:l[i]});var u=e._clips.selectAll(".axesclip").data(c,function(t){return t.x._id+t.y._id});u.enter().append("clipPath").classed("axesclip",!0).attr("id",function(t){return"clip"+e._uid+t.x._id+t.y._id}).append("rect"),u.exit().remove(),u.each(function(t){n.select(this).select("rect").attr({x:t.x._offset||0,y:t.y._offset||0,width:t.x._length||1,height:t.y._length||1})})}},k.doTicks=function(t,e,r){var n=t._fullLayout;"redraw"===e&&n._paper.selectAll("g.subplot").each(function(t){var e=t[0],r=n._plots[e],i=r.xaxis,a=r.yaxis;r.xaxislayer.selectAll("."+i._id+"tick").remove(),r.yaxislayer.selectAll("."+a._id+"tick").remove(),r.gridlayer&&r.gridlayer.selectAll("path").remove(),r.zerolinelayer&&r.zerolinelayer.selectAll("path").remove(),n._infolayer.select(".g-"+i._id+"title").remove(),n._infolayer.select(".g-"+a._id+"title").remove()});var i=e&&"redraw"!==e?e:k.listIds(t);s.syncOrAsync(i.map(function(e){return function(){if(e){var n=k.doTicksSingle(t,e,r),i=k.getFromId(t,e);return i._r=i.range.slice(),i._rl=s.simpleMap(i._r,i.r2l),n}}}))},k.doTicksSingle=function(t,e,r){var f,p=t._fullLayout,d=!1;s.isPlainObject(e)?(f=e,d=!0):f=k.getFromId(t,e),f.setScale();var g,m,v,y,x,b,M=f._id,T=M.charAt(0),S=k.counterLetter(M),E=f._vals=k.calcTicks(f),C=function(t){return[t.text,t.x,f.mirror,t.font,t.fontSize,t.fontColor].join("_")},L=M+"tick",z=M+"grid",P=M+"zl",I=(f.linewidth||1)/2,O="outside"===f.ticks?f.ticklen:0,D=0,R=h.crispRound(t,f.gridwidth,1),B=h.crispRound(t,f.zerolinewidth,R),F=h.crispRound(t,f.tickwidth,1);if(f._counterangle&&"outside"===f.ticks){var N=f._counterangle*Math.PI/180;O=f.ticklen*Math.cos(N)+1,D=f.ticklen*Math.sin(N)}if(f.showticklabels&&("outside"===f.ticks||f.showline)&&(O+=.2*f.tickfont.size),"x"===T)g=["bottom","top"],m=f._transfn||function(t){return"translate("+(f._offset+f.l2p(t.x))+",0)"},v=function(t,e){if(f._counterangle){var r=f._counterangle*Math.PI/180;return"M0,"+t+"l"+Math.sin(r)*e+","+Math.cos(r)*e}return"M0,"+t+"v"+e};else if("y"===T)g=["left","right"],m=f._transfn||function(t){return"translate(0,"+(f._offset+f.l2p(t.x))+")"},v=function(t,e){if(f._counterangle){var r=f._counterangle*Math.PI/180;return"M"+t+",0l"+Math.cos(r)*e+","+-Math.sin(r)*e}return"M"+t+",0h"+e};else{if("angular"!==M)return void s.warn("Unrecognized doTicks axis:",M);g=["left","right"],m=f._transfn,v=function(t,e){return"M"+t+",0h"+e}}var j=f.side||g[0],V=[-1,1,j===g[1]?1:-1];if("inside"!==f.ticks==("x"===T)&&(V=V.map(function(t){return-t})),f.visible){f._tickFilter&&(E=E.filter(f._tickFilter));var U=E.filter(Z);if("angular"===f._id&&(U=E),d){if($(f._axislayer,v(f._pos+I*V[2],V[2]*f.ticklen)),f._counteraxis)tt({gridlayer:f._gridlayer,zerolinelayer:f._zerolinelayer},f._counteraxis);return J(f._axislayer,f._pos)}if(p._has("cartesian")){y=k.getSubplots(t,f);var q={};y.map(function(t){var e=p._plots[t],r=e[S+"axis"],n=r._mainAxis._id;q[n]||(q[n]=1,tt(e,r,t))});var H=f._mainSubplot,G=p._plots[H],W=[];if(f.ticks){var Y=V[2],X=v(f._mainLinePosition+I*Y,Y*f.ticklen);f._anchorAxis&&f.mirror&&!0!==f.mirror&&(X+=v(f._mainMirrorPosition-I*Y,-Y*f.ticklen)),$(G[T+"axislayer"],X),W=Object.keys(f._linepositions||{})}return W.map(function(t){var e=p._plots[t][T+"axislayer"],r=f._linepositions[t]||[];function n(t){var e=V[t];return v(r[t]+I*e,e*f.ticklen)}$(e,n(0)+n(1))}),J(G[T+"axislayer"],f._mainLinePosition)}}function Z(t){var e=f.l2p(t.x);return e>1&&e<f._length-1}function $(t,e){var r=t.selectAll("path."+L).data("inside"===f.ticks?U:E,C);e&&f.ticks?(r.enter().append("path").classed(L,1).classed("ticks",1).classed("crisp",1).call(u.stroke,f.tickcolor).style("stroke-width",F+"px").attr("d",e),r.attr("transform",m),r.exit().remove()):r.remove()}function J(e,r){if(x=e.selectAll("g."+L).data(E,C),!i(r))return x.remove(),void K();if(!f.showticklabels)return x.remove(),K(),void z();var o,c,u,d,g;"x"===T?(o=function(t){return t.dx+D*g},d=r+(O+I)*(g="bottom"===j?1:-1),c=function(t){return t.dy+d+t.fontSize*("bottom"===j?1:-.2)},u=function(t){return i(t)&&0!==t&&180!==t?t*g<0?"end":"start":"middle"}):"y"===T?(g="right"===j?1:-1,c=function(t){return t.dy+t.fontSize*_-D*g},o=function(t){return t.dx+r+(O+I+(90===Math.abs(f.tickangle)?t.fontSize/2:0))*g},u=function(t){return i(t)&&90===Math.abs(t)?"middle":"right"===j?"start":"end"}):"angular"===M&&(f._labelShift=D,f._labelStandoff=O,f._pad=I,o=f._labelx,c=f._labely,u=f._labelanchor);var v=0,k=0,A=[];function S(t,e){t.each(function(t){var r=u(e,t),a=n.select(this),s=a.select(".text-math-group"),f=m.call(a.node(),t)+(i(e)&&0!=+e?" rotate("+e+","+o(t)+","+(c(t)-t.fontSize/2)+")":""),p=function(t,e,r){var n=(t-1)*e;if("x"===T){if(r<-60||60<r)return-.5*n;if("top"===j)return-n}else{if((r*="left"===j?1:-1)<-30)return-n;if(r<30)return-.5*n}return 0}(l.lineCount(a),w*t.fontSize,i(e)?+e:0);if(p&&(f+=" translate(0, "+p+")"),s.empty())a.select("text").attr({transform:f,"text-anchor":r});else{var d=h.bBox(s.node()).width*{end:-.5,start:.5}[r];s.attr("transform",f+(d?"translate("+d+",0)":""))}})}function z(){if(f.showticklabels){var r=t.getBoundingClientRect(),n=e.node().getBoundingClientRect();f._boundingBox={width:n.width,height:n.height,left:n.left-r.left,right:n.right-r.left,top:n.top-r.top,bottom:n.bottom-r.top}}else{var i,a=p._size;"x"===T?(i="free"===f.anchor?a.t+a.h*(1-f.position):a.t+a.h*(1-f._anchorAxis.domain[{bottom:0,top:1}[f.side]]),f._boundingBox={top:i,bottom:i,left:f._offset,right:f._offset+f._length,width:f._length,height:0}):(i="free"===f.anchor?a.l+a.w*f.position:a.l+a.w*f._anchorAxis.domain[{left:0,right:1}[f.side]],f._boundingBox={left:i,right:i,bottom:f._offset+f._length,top:f._offset,height:f._length,width:0})}if(y){var o=f._counterSpan=[1/0,-1/0];for(b=0;b<y.length;b++){var s=p._plots[y[b]]["x"===T?"yaxis":"xaxis"];l(o,[s._offset,s._offset+s._length])}"free"===f.anchor&&l(o,"x"===T?[f._boundingBox.bottom,f._boundingBox.top]:[f._boundingBox.right,f._boundingBox.left])}function l(t,e){t[0]=Math.min(t[0],e[0]),t[1]=Math.max(t[1],e[1])}}x.enter().append("g").classed(L,1).append("text").attr("text-anchor","middle").each(function(e){var r=n.select(this),i=t._promises.length;r.call(l.positionText,o(e),c(e)).call(h.font,e.font,e.fontSize,e.fontColor).text(e.text).call(l.convertToTspans,t),(i=t._promises[i])?A.push(t._promises.pop().then(function(){S(r,f.tickangle)})):S(r,f.tickangle)}),x.exit().remove(),x.each(function(t){v=Math.max(v,t.fontSize)}),"angular"===M&&x.each(function(t){n.select(this).select("text").call(l.positionText,o(t),c(t))}),S(x,f._lastangle||f.tickangle);var P=s.syncOrAsync([function(){return A.length&&Promise.all(A)},function(){if(S(x,f.tickangle),"x"===T&&!i(f.tickangle)&&("log"!==f.type||"D"!==String(f.dtick).charAt(0))){var t=[];for(x.each(function(e){var r=n.select(this),i=r.select(".text-math-group"),a=f.l2p(e.x);i.empty()&&(i=r.select("text"));var o=h.bBox(i.node());t.push({top:0,bottom:10,height:10,left:a-o.width/2,right:a+o.width/2+2,width:o.width+2})}),b=0;b<t.length-1;b++)if(s.bBoxIntersect(t[b],t[b+1])){k=30;break}k&&(Math.abs((E[E.length-1].x-E[0].x)*f._m)/(E.length-1)<2.5*v&&(k=90),S(x,k)),f._lastangle=k}return K(),M+" done"},z,function(){var e=f._name+".automargin";if("x"===T||"y"===T)if(f.automargin){var r=f.side[0],n={x:0,y:0,r:0,l:0,t:0,b:0};"x"===T?(n.y="free"===f.anchor?f.position:f._anchorAxis.domain["t"===r?1:0],n[r]+=f._boundingBox.height):(n.x="free"===f.anchor?f.position:f._anchorAxis.domain["r"===r?1:0],n[r]+=f._boundingBox.width),f.title!==p._dfltTitle[T]&&(n[r]+=f.titlefont.size),a.autoMargin(t,e,n)}else a.autoMargin(t,e)}]);return P&&P.then&&t._promises.push(P),P}function K(){if(!(r||f.rangeslider&&f.rangeslider.visible&&f._boundingBox&&"bottom"===f.side)){var e,n,i,a,o={selection:x,side:f.side},s=M.charAt(0),l=t._fullLayout._size,u=f.titlefont.size;if(x.size()){var d=h.getTranslate(x.node().parentNode);o.offsetLeft=d.x,o.offsetTop=d.y}var g=10+1.5*u+(f.linewidth?f.linewidth-1:0);"x"===s?(n="free"===f.anchor?{_offset:l.t+(1-(f.position||0))*l.h,_length:0}:A.getFromId(t,f.anchor),i=f._offset+f._length/2,a="top"===f.side?-g-u*(f.showticklabels?1:0):n._length+g+u*(f.showticklabels?1.5:.5),a+=n._offset,o.side||(o.side="bottom")):(n="free"===f.anchor?{_offset:l.l+(f.position||0)*l.w,_length:0}:A.getFromId(t,f.anchor),a=f._offset+f._length/2,i="right"===f.side?n._length+g+u*(f.showticklabels?1:.5):-g-u*(f.showticklabels?.5:0),i+=n._offset,e={rotate:"-90",offset:0},o.side||(o.side="left")),c.draw(t,M+"title",{propContainer:f,propName:f._name+".title",placeholder:p._dfltTitle[s],avoid:o,transform:e,attributes:{x:i,y:a,"text-anchor":"middle"}})}}function Q(t,e){return!0===t.visible&&t.xaxis+t.yaxis===e&&(!(!o.traceIs(t,"bar")||t.orientation!=={x:"h",y:"v"}[T])||t.fill&&t.fill.charAt(t.fill.length-1)===T)}function tt(e,r,i){if(!p._hasOnlyLargeSploms){var a=e.gridlayer.selectAll("."+M),o=e.zerolinelayer,l=e["hidegrid"+T]?[]:U,c=f._gridpath||("x"===T?"M0,"+r._offset+"v":"M"+r._offset+",0h")+r._length,h=a.selectAll("path."+z).data(!1===f.showgrid?[]:l,C);if(h.enter().append("path").classed(z,1).classed("crisp",1).attr("d",c).each(function(t){f.zeroline&&("linear"===f.type||"-"===f.type)&&Math.abs(t.x)<f.dtick/100&&n.select(this).remove()}),h.attr("transform",m).call(u.stroke,f.gridcolor||"#ddd").style("stroke-width",R+"px"),"function"==typeof c&&h.attr("d",c),h.exit().remove(),o){for(var d=!1,g=0;g<t._fullData.length;g++)if(Q(t._fullData[g],i)){d=!0;break}var v=s.simpleMap(f.range,f.r2l),y=v[0]*v[1]<=0&&f.zeroline&&("linear"===f.type||"-"===f.type)&&l.length&&(d||Z({x:0})||!f.showline),x=o.selectAll("path."+P).data(y?[{x:0,id:M}]:[]);x.enter().append("path").classed(P,1).classed("zl",1).classed("crisp",1).attr("d",c).each(function(){o.selectAll("path").sort(function(t,e){return A.idSort(t.id,e.id)})}),x.attr("transform",m).call(u.stroke,f.zerolinecolor||u.defaultLine).style("stroke-width",B+"px"),x.exit().remove()}}}},k.allowAutoMargin=function(t){for(var e=k.list(t,"",!0),r=0;r<e.length;r++){var n=e[r];n.automargin&&a.allowAutoMargin(t,n._name+".automargin"),n.rangeslider&&n.rangeslider.visible&&a.allowAutoMargin(t,"rangeslider"+n._id)}},k.swap=function(t,e){for(var r=function(t,e){var r,n,i=[];for(r=0;r<e.length;r++){var a=[],o=t._fullData[e[r]].xaxis,s=t._fullData[e[r]].yaxis;if(o&&s){for(n=0;n<i.length;n++)-1===i[n].x.indexOf(o)&&-1===i[n].y.indexOf(s)||a.push(n);if(a.length){var l,c=i[a[0]];if(a.length>1)for(n=1;n<a.length;n++)l=i[a[n]],H(c.x,l.x),H(c.y,l.y);H(c.x,[o]),H(c.y,[s])}else i.push({x:[o],y:[s]})}}return i}(t,e),n=0;n<r.length;n++)G(t,r[n].x,r[n].y)}},{"../../components/color":558,"../../components/drawing":583,"../../components/titles":649,"../../constants/alignment":656,"../../constants/numerical":661,"../../lib":684,"../../lib/svg_text_utils":708,"../../plots/plots":795,"../../registry":817,"./autorange":731,"./axis_autotype":733,"./axis_ids":735,"./set_convert":750,d3:147,"fast-isnumeric":214}],733:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib"),a=t("../../constants/numerical").BADNUM;e.exports=function(t,e){return function(t,e){for(var r,a=0,o=0,s=Math.max(1,(t.length-1)/1e3),l=0;l<t.length;l+=s)r=t[Math.round(l)],i.isDateTime(r,e)&&(a+=1),n(r)&&(o+=1);return a>2*o}(t,e)?"date":function(t){for(var e,r=Math.max(1,(t.length-1)/1e3),n=0,o=0,s=0;s<t.length;s+=r)e=t[Math.round(s)],i.cleanNumber(e)!==a?n++:"string"==typeof e&&""!==e&&"None"!==e&&o++;return o>2*n}(t)?"category":function(t){if(!t)return!1;for(var e=0;e<t.length;e++)if(n(t[e]))return!0;return!1}(t)?"linear":"-"}},{"../../constants/numerical":661,"../../lib":684,"fast-isnumeric":214}],734:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib"),a=t("./layout_attributes"),o=t("./tick_value_defaults"),s=t("./tick_mark_defaults"),l=t("./tick_label_defaults"),c=t("./category_order_defaults"),u=t("./line_grid_defaults"),h=t("./set_convert");e.exports=function(t,e,r,f,p){var d=f.letter,g=e._id,m=f.font||{},v=r("visible",!f.cheateronly),y=e.type;"date"===y&&n.getComponentMethod("calendars","handleDefaults")(t,e,"calendar",f.calendar);h(e,p);var x=r("autorange",!e.isValidRange(t.range));if(e._rangesliderAutorange=!1,x&&r("rangemode"),r("range"),e.cleanRange(),c(t,e,r,f),"category"===y||f.noHover||r("hoverformat"),!v)return e;var b=r("color"),_=b!==a.color.dflt?b:m.color;return r("title",((p._splomAxes||{})[d]||{})[g]||p._dfltTitle[d]),i.coerceFont(r,"titlefont",{family:m.family,size:Math.round(1.2*m.size),color:_}),o(t,e,r,y),l(t,e,r,y,f),s(t,e,r,f),u(t,e,r,{dfltColor:b,bgColor:f.bgColor,showGrid:f.showGrid,attributes:a}),(e.showline||e.ticks)&&r("mirror"),f.automargin&&r("automargin"),e}},{"../../lib":684,"../../registry":817,"./category_order_defaults":736,"./layout_attributes":744,"./line_grid_defaults":746,"./set_convert":750,"./tick_label_defaults":751,"./tick_mark_defaults":752,"./tick_value_defaults":753}],735:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("./constants");r.id2name=function(t){if("string"==typeof t&&t.match(i.AX_ID_PATTERN)){var e=t.substr(1);return"1"===e&&(e=""),t.charAt(0)+"axis"+e}},r.name2id=function(t){if(t.match(i.AX_NAME_PATTERN)){var e=t.substr(5);return"1"===e&&(e=""),t.charAt(0)+e}},r.cleanId=function(t,e){if(t.match(i.AX_ID_PATTERN)&&(!e||t.charAt(0)===e)){var r=t.substr(1).replace(/^0+/,"");return"1"===r&&(r=""),t.charAt(0)+r}},r.list=function(t,e,n){var i=t._fullLayout;if(!i)return[];var a,o=r.listIds(t,e),s=new Array(o.length);for(a=0;a<o.length;a++){var l=o[a];s[a]=i[l.charAt(0)+"axis"+l.substr(1)]}if(!n){var c=i._subplots.gl3d||[];for(a=0;a<c.length;a++){var u=i[c[a]];e?s.push(u[e+"axis"]):s.push(u.xaxis,u.yaxis,u.zaxis)}}return s},r.listIds=function(t,e){var r=t._fullLayout;if(!r)return[];var n=r._subplots;return e?n[e+"axis"]:n.xaxis.concat(n.yaxis)},r.getFromId=function(t,e,n){var i=t._fullLayout;return"x"===n?e=e.replace(/y[0-9]*/,""):"y"===n&&(e=e.replace(/x[0-9]*/,"")),i[r.id2name(e)]},r.getFromTrace=function(t,e,i){var a=t._fullLayout,o=null;if(n.traceIs(e,"gl3d")){var s=e.scene;"scene"===s.substr(0,5)&&(o=a[s][i+"axis"])}else o=r.getFromId(t,e[i+"axis"]||i);return o},r.idSort=function(t,e){var r=t.charAt(0),n=e.charAt(0);return r!==n?r>n?1:-1:+(t.substr(1)||1)-+(e.substr(1)||1)}},{"../../registry":817,"./constants":737}],736:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){if("category"===e.type){var i,a=t.categoryarray,o=Array.isArray(a)&&a.length>0;o&&(i="array");var s,l=r("categoryorder",i);"array"===l&&(s=r("categoryarray")),o||"array"!==l||(l=e.categoryorder="trace"),"trace"===l?e._initialCategories=[]:"array"===l?e._initialCategories=s.slice():(s=function(t,e){var r,n,i,a=e.dataAttr||t._id.charAt(0),o={};if(e.axData)r=e.axData;else for(r=[],n=0;n<e.data.length;n++){var s=e.data[n];s[a+"axis"]===t._id&&r.push(s)}for(n=0;n<r.length;n++){var l=r[n][a];for(i=0;i<l.length;i++){var c=l[i];null!=c&&(o[c]=1)}}return Object.keys(o)}(e,n).sort(),"category ascending"===l?e._initialCategories=s:"category descending"===l&&(e._initialCategories=s.reverse()))}}},{}],737:[function(t,e,r){"use strict";var n=t("../../lib/regex").counter;e.exports={idRegex:{x:n("x"),y:n("y")},attrRegex:n("[xy]axis"),xAxisMatch:n("xaxis"),yAxisMatch:n("yaxis"),AX_ID_PATTERN:/^[xyz][0-9]*$/,AX_NAME_PATTERN:/^[xyz]axis[0-9]*$/,SUBPLOT_PATTERN:/^x([0-9]*)y([0-9]*)$/,MINDRAG:8,MINSELECT:12,MINZOOM:20,DRAGGERSIZE:20,BENDPX:1.5,REDRAWDELAY:50,SELECTDELAY:100,SELECTID:"-select",DFLTRANGEX:[-1,6],DFLTRANGEY:[-1,4],traceLayerClasses:["heatmaplayer","contourcarpetlayer","contourlayer","barlayer","carpetlayer","violinlayer","boxlayer","ohlclayer","scattercarpetlayer","scatterlayer"],layerValue2layerClass:{"above traces":"above","below traces":"below"}}},{"../../lib/regex":700}],738:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./axis_ids").id2name;e.exports=function(t,e,r,a,o){var s=o._axisConstraintGroups,l=e._id,c=l.charAt(0);if(!e.fixedrange&&(r("constrain"),n.coerce(t,e,{constraintoward:{valType:"enumerated",values:"x"===c?["left","center","right"]:["bottom","middle","top"],dflt:"x"===c?"center":"middle"}},"constraintoward"),t.scaleanchor)){var u=function(t,e,r,n){var a,o,s,l,c=n[i(e)].type,u=[];for(o=0;o<r.length;o++)(s=r[o])!==e&&((l=n[i(s)]).type!==c||l.fixedrange||u.push(s));for(a=0;a<t.length;a++)if(t[a][e]){var h=t[a],f=[];for(o=0;o<u.length;o++)s=u[o],h[s]||f.push(s);return{linkableAxes:f,thisGroup:h}}return{linkableAxes:u,thisGroup:null}}(s,l,a,o),h=n.coerce(t,e,{scaleanchor:{valType:"enumerated",values:u.linkableAxes}},"scaleanchor");if(h){var f=r("scaleratio");f||(f=e.scaleratio=1),function(t,e,r,n,i){var a,o,s,l,c;null===e?((e={})[r]=1,c=t.length,t.push(e)):c=t.indexOf(e);var u=Object.keys(e);for(a=0;a<t.length;a++)if(s=t[a],a!==c&&s[n]){var h=s[n];for(o=0;o<u.length;o++)l=u[o],s[l]=h*i*e[l];return void t.splice(c,1)}if(1!==i)for(o=0;o<u.length;o++)e[u[o]]*=i;e[n]=1}(s,u.thisGroup,l,h,f)}else-1!==a.indexOf(t.scaleanchor)&&n.warn("ignored "+e._name+'.scaleanchor: "'+t.scaleanchor+'" to avoid either an infinite loop and possibly inconsistent scaleratios, or because the targetaxis has fixed range.')}}},{"../../lib":684,"./axis_ids":735}],739:[function(t,e,r){"use strict";var n=t("./axis_ids").id2name,i=t("./scale_zoom"),a=t("./autorange").makePadFn,o=t("../../constants/numerical").ALMOST_EQUAL,s=t("../../constants/alignment").FROM_BL;function l(t,e){var r=t._inputDomain,n=s[t.constraintoward],i=r[0]+(r[1]-r[0])*n;t.domain=t._input.domain=[i+(r[0]-i)/e,i+(r[1]-i)/e]}r.enforce=function(t){var e,r,s,c,u,h,f,p=t._fullLayout,d=p._axisConstraintGroups||[];for(e=0;e<d.length;e++){var g=d[e],m=Object.keys(g),v=1/0,y=0,x=1/0,b={},_={},w=!1;for(r=0;r<m.length;r++)_[s=m[r]]=c=p[n(s)],c._inputDomain?c.domain=c._inputDomain.slice():c._inputDomain=c.domain.slice(),c._inputRange||(c._inputRange=c.range.slice()),c.setScale(),b[s]=u=Math.abs(c._m)/g[s],v=Math.min(v,u),"domain"!==c.constrain&&c._constraintShrinkable||(x=Math.min(x,u)),delete c._constraintShrinkable,y=Math.max(y,u),"domain"===c.constrain&&(w=!0);if(!(v>o*y)||w)for(r=0;r<m.length;r++)if(u=b[s=m[r]],h=(c=_[s]).constrain,u!==x||"domain"===h)if(f=u/x,"range"===h)i(c,f);else{var k=c._inputDomain,M=(c.domain[1]-c.domain[0])/(k[1]-k[0]),A=(c.r2l(c.range[1])-c.r2l(c.range[0]))/(c.r2l(c._inputRange[1])-c.r2l(c._inputRange[0]));if((f/=M)*A<1){c.domain=c._input.domain=k.slice(),i(c,f);continue}if(A<1&&(c.range=c._input.range=c._inputRange.slice(),f*=A),c.autorange&&c._min.length&&c._max.length){var T=c.r2l(c.range[0]),S=c.r2l(c.range[1]),E=(T+S)/2,C=E,L=E,z=Math.abs(S-E),P=E-z*f*1.0001,I=E+z*f*1.0001,O=a(c);l(c,f),c.setScale();var D,R,B=Math.abs(c._m);for(R=0;R<c._min.length;R++)(D=c._min[R].val-O(c._min[R])/B)>P&&D<C&&(C=D);for(R=0;R<c._max.length;R++)(D=c._max[R].val+O(c._max[R])/B)<I&&D>L&&(L=D);f/=(L-C)/(2*z),C=c.l2r(C),L=c.l2r(L),c.range=c._input.range=T<S?[C,L]:[L,C]}l(c,f)}}},r.clean=function(t,e){if(e._inputDomain){for(var r=!1,n=e._id,i=t._fullLayout._axisConstraintGroups,a=0;a<i.length;a++)if(i[a][n]){r=!0;break}r&&"domain"===e.constrain||(e._input.domain=e.domain=e._inputDomain,delete e._inputDomain)}}},{"../../constants/alignment":656,"../../constants/numerical":661,"./autorange":731,"./axis_ids":735,"./scale_zoom":748}],740:[function(t,e,r){"use strict";var n=t("d3"),i=t("tinycolor2"),a=t("has-passive-events"),o=t("../../registry"),s=t("../../lib"),l=t("../../lib/svg_text_utils"),c=t("../../lib/clear_gl_canvases"),u=t("../../components/color"),h=t("../../components/drawing"),f=t("../../components/fx"),p=t("../../lib/setcursor"),d=t("../../components/dragelement"),g=t("../../constants/alignment").FROM_TL,m=t("../plots"),v=t("./axes").doTicksSingle,y=t("./axis_ids").getFromId,x=t("./select").prepSelect,b=t("./select").clearSelect,_=t("./scale_zoom"),w=t("./constants"),k=w.MINDRAG,M=w.MINZOOM,A=!0;function T(t,e,r,n){var i=s.ensureSingle(t.draglayer,e,r,function(e){e.classed("drag",!0).style({fill:"transparent","stroke-width":0}).attr("data-subplot",t.id)});return i.call(p,n),i.node()}function S(t,e,r,i,a,o,s){var l=T(t,"rect",e,r);return n.select(l).call(h.setRect,i,a,o,s),l}function E(t,e){for(var r=0;r<t.length;r++)if(!t[r].fixedrange)return e;return""}function C(t,e,r,n,i){var a,o,s,l;for(a=0;a<t.length;a++)(o=t[a]).fixedrange||(s=o._rl[0],l=o._rl[1]-s,o.range=[o.l2r(s+l*e),o.l2r(s+l*r)],n[o._name+".range[0]"]=o.range[0],n[o._name+".range[1]"]=o.range[1]);if(i&&i.length){var c=(e+(1-r))/2;C(i,c,1-c,n)}}function L(t,e){for(var r=0;r<t.length;r++){var n=t[r];n.fixedrange||(n.range=[n.l2r(n._rl[0]-e/n._m),n.l2r(n._rl[1]-e/n._m)])}}function z(t){return 1-(t>=0?Math.min(t,.9):1/(1/Math.max(t,-.3)+3.222))}function P(t,e,r,n,i){return t.append("path").attr("class","zoombox").style({fill:e>.2?"rgba(0,0,0,0)":"rgba(255,255,255,0)","stroke-width":0}).attr("transform","translate("+r+", "+n+")").attr("d",i+"Z")}function I(t,e,r){return t.append("path").attr("class","zoombox-corners").style({fill:u.background,stroke:u.defaultLine,"stroke-width":1,opacity:0}).attr("transform","translate("+e+", "+r+")").attr("d","M0,0Z")}function O(t,e,r,n,i,a){t.attr("d",n+"M"+r.l+","+r.t+"v"+r.h+"h"+r.w+"v-"+r.h+"h-"+r.w+"Z"),D(t,e,i,a)}function D(t,e,r,n){r||(t.transition().style("fill",n>.2?"rgba(0,0,0,0.4)":"rgba(255,255,255,0.3)").duration(200),e.transition().style("opacity",1).duration(200))}function R(t){n.select(t).selectAll(".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners").remove()}function B(t){A&&t.data&&t._context.showTips&&(s.notifier(s._(t,"Double-click to zoom back out"),"long"),A=!1)}function F(t){return"lasso"===t||"select"===t}function N(t){var e=Math.floor(Math.min(t.b-t.t,t.r-t.l,M)/2);return"M"+(t.l-3.5)+","+(t.t-.5+e)+"h3v"+-e+"h"+e+"v-3h-"+(e+3)+"ZM"+(t.r+3.5)+","+(t.t-.5+e)+"h-3v"+-e+"h"+-e+"v-3h"+(e+3)+"ZM"+(t.r+3.5)+","+(t.b+.5-e)+"h-3v"+e+"h"+-e+"v3h"+(e+3)+"ZM"+(t.l-3.5)+","+(t.b+.5-e)+"h3v"+e+"h"+e+"v3h-"+(e+3)+"Z"}function j(t,e){if(a){var r=void 0!==t.onwheel?"wheel":"mousewheel";t._onwheel&&t.removeEventListener(r,t._onwheel),t._onwheel=e,t.addEventListener(r,e,{passive:!1})}else void 0!==t.onwheel?t.onwheel=e:void 0!==t.onmousewheel&&(t.onmousewheel=e)}function V(t){var e=[];for(var r in t)e.push(t[r]);return e}e.exports={makeDragBox:function(t,e,r,a,u,p,A,T){var D,U,q,H,G,W,Y,X,Z,$,J,K,Q,tt,et,rt,nt,it,at,ot,st,lt=t._fullLayout._zoomlayer,ct=A+T==="nsew",ut=1===(A+T).length;function ht(){if(D=e.xaxis,U=e.yaxis,Z=D._length,$=U._length,Y=D._offset,X=U._offset,(q={})[D._id]=D,(H={})[U._id]=U,A&&T)for(var r=e.overlays,n=0;n<r.length;n++){var i=r[n].xaxis;q[i._id]=i;var a=r[n].yaxis;H[a._id]=a}G=V(q),W=V(H),K=E(G,T),Q=E(W,A),tt=!Q&&!K,J=function(t,e,r){for(var n,i,a,o,l=t._fullLayout._axisConstraintGroups,c=!1,u={},h={},f=0;f<l.length;f++){var p=l[f];for(n in e)if(p[n]){for(a in p)("x"===a.charAt(0)?e:r)[a]||(u[a]=1);for(i in r)p[i]&&(c=!0)}for(i in r)if(p[i])for(o in p)("x"===o.charAt(0)?e:r)[o]||(h[o]=1)}c&&(s.extendFlat(u,h),h={});var d={},g=[];for(a in u){var m=y(t,a);g.push(m),d[m._id]=m}var v={},x=[];for(o in h){var b=y(t,o);x.push(b),v[b._id]=b}return{xaHash:d,yaHash:v,xaxes:g,yaxes:x,isSubplotConstrained:c}}(t,q,H),et=J.isSubplotConstrained,rt=T||et,nt=A||et;var o=t._fullLayout;it=o._has("scattergl"),at=o._hasOnlyLargeSploms,ot=at||o._has("splom"),st=o._has("svg")}ht();var ft=function(t,e,r){return t?"nsew"===t?r?"":"pan"===e?"move":"crosshair":t.toLowerCase()+"-resize":"pointer"}(Q+K,t._fullLayout.dragmode,ct),pt=S(e,A+T+"drag",ft,r,a,u,p);if(tt&&!ct)return pt.onmousedown=null,pt.style.pointerEvents="none",pt;var dt,gt,mt,vt,yt,xt,bt,_t,wt,kt,Mt={element:pt,gd:t,plotinfo:e};function At(){Mt.plotinfo.selection=!1,b(lt)}function Tt(r,i){if(R(t),2!==r||ut||function(){if(!t._transitioningWithDuration){var e,r,n,i=t._context.doubleClick,a=(K?G:[]).concat(Q?W:[]),s={};if("reset+autosize"===i)for(i="autosize",r=0;r<a.length;r++)if((e=a[r])._rangeInitial&&(e.range[0]!==e._rangeInitial[0]||e.range[1]!==e._rangeInitial[1])||!e._rangeInitial&&!e.autorange){i="reset";break}if("autosize"===i)for(r=0;r<a.length;r++)(e=a[r]).fixedrange||(s[e._name+".autorange"]=!0);else if("reset"===i)for((K||et)&&(a=a.concat(J.xaxes)),Q&&!et&&(a=a.concat(J.yaxes)),et&&(K?Q||(a=a.concat(W)):a=a.concat(G)),r=0;r<a.length;r++)(e=a[r])._rangeInitial?(n=e._rangeInitial,s[e._name+".range[0]"]=n[0],s[e._name+".range[1]"]=n[1]):s[e._name+".autorange"]=!0;t.emit("plotly_doubleclick",null),o.call("relayout",t,s)}}(),ct)f.click(t,i,e.id);else if(1===r&&ut){var a=A?U:D,s="s"===A||"w"===T?0:1,c=a._name+".range["+s+"]",u=function(t,e){var r,i=t.range[e],a=Math.abs(i-t.range[1-e]);return"date"===t.type?i:"log"===t.type?(r=Math.ceil(Math.max(0,-Math.log(a)/Math.LN10))+3,n.format("."+r+"g")(Math.pow(10,i))):(r=Math.floor(Math.log(Math.abs(i))/Math.LN10)-Math.floor(Math.log(a)/Math.LN10)+4,n.format("."+String(r)+"g")(i))}(a,s),h="left",p="middle";if(a.fixedrange)return;A?(p="n"===A?"top":"bottom","right"===a.side&&(h="right")):"e"===T&&(h="right"),t._context.showAxisRangeEntryBoxes&&n.select(pt).call(l.makeEditable,{gd:t,immediate:!0,background:t._fullLayout.paper_bgcolor,text:String(u),fill:a.tickfont?a.tickfont.color:"#444",horizontalAlign:h,verticalAlign:p}).on("edit",function(e){var r=a.d2r(e);void 0!==r&&o.call("relayout",t,c,r)})}}Mt.prepFn=function(e,r,n){var a=t._fullLayout.dragmode;ht(),tt||(ct?e.shiftKey?"pan"===a?a="zoom":F(a)||(a="pan"):e.ctrlKey&&(a="pan"):a="pan"),Mt.minDrag="lasso"===a?1:void 0,F(a)?(Mt.xaxes=G,Mt.yaxes=W,x(e,r,n,Mt,a)):(Mt.clickFn=Tt,At(),tt||("zoom"===a?(Mt.moveFn=Et,Mt.doneFn=Ct,Mt.minDrag=1,function(e,r,n){var a=pt.getBoundingClientRect();dt=r-a.left,gt=n-a.top,mt={l:dt,r:dt,w:0,t:gt,b:gt,h:0},vt=t._hmpixcount?t._hmlumcount/t._hmpixcount:i(t._fullLayout.plot_bgcolor).getLuminance(),xt=!1,bt="xy",kt=!1,_t=P(lt,vt,Y,X,yt="M0,0H"+Z+"V"+$+"H0V0"),wt=I(lt,Y,X)}(0,r,n)):"pan"===a&&(Mt.moveFn=Rt,Mt.doneFn=Ft)))},d.init(Mt);var St={};function Et(e,r){if(t._transitioningWithDuration)return!1;var n=Math.max(0,Math.min(Z,e+dt)),i=Math.max(0,Math.min($,r+gt)),a=Math.abs(n-dt),o=Math.abs(i-gt);function s(){bt="",mt.r=mt.l,mt.t=mt.b,wt.attr("d","M0,0Z")}mt.l=Math.min(dt,n),mt.r=Math.max(dt,n),mt.t=Math.min(gt,i),mt.b=Math.max(gt,i),et?a>M||o>M?(bt="xy",a/Z>o/$?(o=a*$/Z,gt>i?mt.t=gt-o:mt.b=gt+o):(a=o*Z/$,dt>n?mt.l=dt-a:mt.r=dt+a),wt.attr("d",N(mt))):s():!Q||o<Math.min(Math.max(.6*a,k),M)?a<k||!K?s():(mt.t=0,mt.b=$,bt="x",wt.attr("d",function(t,e){return"M"+(t.l-.5)+","+(e-M-.5)+"h-3v"+(2*M+1)+"h3ZM"+(t.r+.5)+","+(e-M-.5)+"h3v"+(2*M+1)+"h-3Z"}(mt,gt))):!K||a<Math.min(.6*o,M)?(mt.l=0,mt.r=Z,bt="y",wt.attr("d",function(t,e){return"M"+(e-M-.5)+","+(t.t-.5)+"v-3h"+(2*M+1)+"v3ZM"+(e-M-.5)+","+(t.b+.5)+"v3h"+(2*M+1)+"v-3Z"}(mt,dt))):(bt="xy",wt.attr("d",N(mt))),mt.w=mt.r-mt.l,mt.h=mt.b-mt.t,bt&&(kt=!0),t._dragged=kt,O(_t,wt,mt,yt,xt,vt),xt=!0}function Ct(){if(Math.min(mt.h,mt.w)<2*k)return R(t);"xy"!==bt&&"x"!==bt||C(G,mt.l/Z,mt.r/Z,St,J.xaxes),"xy"!==bt&&"y"!==bt||C(W,($-mt.b)/$,($-mt.t)/$,St,J.yaxes),R(t),Ft(),B(t)}var Lt,zt,Pt=[0,0,Z,$],It=null,Ot=w.REDRAWDELAY,Dt=e.mainplot?t._fullLayout._plots[e.mainplot]:e;function Rt(e,r){if(!t._transitioningWithDuration){if("ew"===K||"ns"===Q)return K&&L(G,e),Q&&L(W,r),Nt([K?-e:0,Q?-r:0,Z,$]),void Bt(Q,K);if(et&&K&&Q){var n="w"===K==("n"===Q)?1:-1,i=(e/Z+n*r/$)/2;e=i*Z,r=n*i*$}"w"===K?e=l(G,0,e):"e"===K?e=l(G,1,-e):K||(e=0),"n"===Q?r=l(W,1,r):"s"===Q?r=l(W,0,-r):Q||(r=0);var a="w"===K?e:0,o="n"===Q?r:0;if(et){var s;if(!K&&1===Q.length){for(s=0;s<G.length;s++)G[s].range=G[s]._r.slice(),_(G[s],1-r/$);a=(e=r*Z/$)/2}if(!Q&&1===K.length){for(s=0;s<W.length;s++)W[s].range=W[s]._r.slice(),_(W[s],1-e/Z);o=(r=e*$/Z)/2}}Nt([a,o,Z-e,$-r]),Bt(Q,K)}function l(t,e,r){for(var n,i,a=1-e,o=0;o<t.length;o++){var s=t[o];if(!s.fixedrange){n=s,i=s._rl[a]+(s._rl[e]-s._rl[a])/z(r/s._length);var l=s.l2r(i);!1!==l&&void 0!==l&&(s.range[e]=l)}}return n._length*(n._rl[e]-i)/(n._rl[e]-n._rl[a])}}function Bt(e,r){var n,i=[];function a(t){for(n=0;n<t.length;n++)t[n].fixedrange||i.push(t[n]._id)}for(rt&&(a(G),a(J.xaxes)),nt&&(a(W),a(J.yaxes)),St={},n=0;n<i.length;n++){var s=i[n];v(t,s,!0);var l=y(t,s);St[l._name+".range[0]"]=l.range[0],St[l._name+".range[1]"]=l.range[1]}function c(a,o,s){for(n=0;n<a.length;n++){var l=a[n];if((r&&-1!==i.indexOf(l.xref)||e&&-1!==i.indexOf(l.yref))&&(o(t,n),s))return}}c(t._fullLayout.annotations||[],o.getComponentMethod("annotations","drawOne")),c(t._fullLayout.shapes||[],o.getComponentMethod("shapes","drawOne")),c(t._fullLayout.images||[],o.getComponentMethod("images","draw"),!0)}function Ft(){Nt([0,0,Z,$]),s.syncOrAsync([m.previousPromises,function(){o.call("relayout",t,St)}],t)}function Nt(e){var r,n,i,a,l=t._fullLayout,u=l._plots,f=l._subplots.cartesian;if((ot||it)&&c(t),!ot||(o.subplotsRegistry.splom.drag(t),!at)){if(it)for(r=0;r<f.length;r++){i=(n=u[f[r]]).xaxis,a=n.yaxis;var p=n._scene;if(p){var d=s.simpleMap(i.range,i.r2l),g=s.simpleMap(a.range,a.r2l);p.update({range:[d[0],g[0],d[1],g[1]]})}}if(st){var m=e[2]/D._length,v=e[3]/U._length;for(r=0;r<f.length;r++){i=(n=u[f[r]]).xaxis,a=n.yaxis;var y,x,b,_,w=rt&&!i.fixedrange&&q[i._id],k=nt&&!a.fixedrange&&H[a._id];if(w?(y=m,b=T?e[0]:Ut(i,y)):b=Vt(i,y=jt(i,m,v)),k?(x=v,_=A?e[1]:Ut(a,x)):_=Vt(a,x=jt(a,m,v)),y||x){y||(y=1),x||(x=1);var M=i._offset-b/y,S=a._offset-_/x;n.clipRect.call(h.setTranslate,b,_).call(h.setScale,y,x),n.plot.call(h.setTranslate,M,S).call(h.setScale,1/y,1/x),y===Lt&&x===zt||(h.setPointGroupScale(n.zoomScalePts,y,x),h.setTextPointsScale(n.zoomScaleTxt,y,x)),h.hideOutsideRangePoints(n.clipOnAxisFalseTraces,n),Lt=y,zt=x}}}}}function jt(t,e,r){return t.fixedrange?0:rt&&J.xaHash[t._id]?e:nt&&(et?J.xaHash:J.yaHash)[t._id]?r:0}function Vt(t,e){return e?(t.range=t._r.slice(),_(t,e),Ut(t,e)):0}function Ut(t,e){return t._length*(1-e)*g[t.constraintoward||"middle"]}return A.length*T.length!=1&&j(pt,function(e){if(t._context.scrollZoom||t._fullLayout._enablescrollzoom){if(At(),t._transitioningWithDuration)return e.preventDefault(),void e.stopPropagation();var r=t.querySelector(".plotly");if(ht(),!(r.scrollHeight-r.clientHeight>10||r.scrollWidth-r.clientWidth>10)){clearTimeout(It);var n=-e.deltaY;if(isFinite(n)||(n=e.wheelDelta/10),isFinite(n)){var i,a=Math.exp(-Math.min(Math.max(n,-20),20)/200),o=Dt.draglayer.select(".nsewdrag").node().getBoundingClientRect(),l=(e.clientX-o.left)/o.width,c=(o.bottom-e.clientY)/o.height;if(rt){for(T||(l=.5),i=0;i<G.length;i++)u(G[i],l,a);Pt[2]*=a,Pt[0]+=Pt[2]*l*(1/a-1)}if(nt){for(A||(c=.5),i=0;i<W.length;i++)u(W[i],c,a);Pt[3]*=a,Pt[1]+=Pt[3]*(1-c)*(1/a-1)}Nt(Pt),Bt(A,T),It=setTimeout(function(){Pt=[0,0,Z,$],Ft()},Ot),e.preventDefault()}else s.log("Did not find wheel motion attributes: ",e)}}function u(t,e,r){if(!t.fixedrange){var n=s.simpleMap(t.range,t.r2l),i=n[0]+(n[1]-n[0])*e;t.range=n.map(function(e){return t.l2r(i+(e-i)*r)})}}}),pt},makeDragger:T,makeRectDragger:S,makeZoombox:P,makeCorners:I,updateZoombox:O,xyCorners:N,transitionZoombox:D,removeZoombox:R,showDoubleClickNotifier:B,attachWheelEventHandler:j}},{"../../components/color":558,"../../components/dragelement":580,"../../components/drawing":583,"../../components/fx":600,"../../constants/alignment":656,"../../lib":684,"../../lib/clear_gl_canvases":668,"../../lib/setcursor":704,"../../lib/svg_text_utils":708,"../../registry":817,"../plots":795,"./axes":732,"./axis_ids":735,"./constants":737,"./scale_zoom":748,"./select":749,d3:147,"has-passive-events":379,tinycolor2:499}],741:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/fx"),a=t("../../components/dragelement"),o=t("../../lib/setcursor"),s=t("./dragbox").makeDragBox,l=t("./constants").DRAGGERSIZE;r.initInteractions=function(t){var e=t._fullLayout;if(t._context.staticPlot)n.select(t).selectAll(".drag").remove();else if(e._has("cartesian")||e._has("splom")){Object.keys(e._plots||{}).sort(function(t,r){if((e._plots[t].mainplot&&!0)===(e._plots[r].mainplot&&!0)){var n=t.split("y"),i=r.split("y");return n[0]===i[0]?Number(n[1]||1)-Number(i[1]||1):Number(n[0]||1)-Number(i[0]||1)}return e._plots[t].mainplot?1:-1}).forEach(function(r){var n=e._plots[r],o=n.xaxis,c=n.yaxis;if(!n.mainplot){var u=s(t,n,o._offset,c._offset,o._length,c._length,"ns","ew");u.onmousemove=function(e){t._fullLayout._rehover=function(){t._fullLayout._hoversubplot===r&&i.hover(t,e,r)},i.hover(t,e,r),t._fullLayout._lasthover=u,t._fullLayout._hoversubplot=r},u.onmouseout=function(e){t._dragging||(t._fullLayout._hoversubplot=null,a.unhover(t,e))},t._context.showAxisDragHandles&&(s(t,n,o._offset-l,c._offset-l,l,l,"n","w"),s(t,n,o._offset+o._length,c._offset-l,l,l,"n","e"),s(t,n,o._offset-l,c._offset+c._length,l,l,"s","w"),s(t,n,o._offset+o._length,c._offset+c._length,l,l,"s","e"))}if(t._context.showAxisDragHandles){if(r===o._mainSubplot){var h=o._mainLinePosition;"top"===o.side&&(h-=l),s(t,n,o._offset+.1*o._length,h,.8*o._length,l,"","ew"),s(t,n,o._offset,h,.1*o._length,l,"","w"),s(t,n,o._offset+.9*o._length,h,.1*o._length,l,"","e")}if(r===c._mainSubplot){var f=c._mainLinePosition;"right"!==c.side&&(f-=l),s(t,n,f,c._offset+.1*c._length,l,.8*c._length,"ns",""),s(t,n,f,c._offset+.9*c._length,l,.1*c._length,"s",""),s(t,n,f,c._offset,l,.1*c._length,"n","")}}});var o=e._hoverlayer.node();o.onmousemove=function(r){r.target=t._fullLayout._lasthover,i.hover(t,r,e._hoversubplot)},o.onclick=function(e){e.target=t._fullLayout._lasthover,i.click(t,e)},o.onmousedown=function(e){t._fullLayout._lasthover.onmousedown(e)},r.updateFx(e)}},r.updateFx=function(t){var e="pan"===t.dragmode?"move":"crosshair";o(t._draggers,e)}},{"../../components/dragelement":580,"../../components/fx":600,"../../lib/setcursor":704,"./constants":737,"./dragbox":740,d3:147}],742:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib");e.exports=function(t){return function(e,r){var a=e[t];if(Array.isArray(a))for(var o=n.subplotsRegistry.cartesian,s=o.idRegex,l=r._subplots,c=l.xaxis,u=l.yaxis,h=l.cartesian,f=r._has("cartesian")||r._has("gl2d"),p=0;p<a.length;p++){var d=a[p];if(i.isPlainObject(d)){var g=d.xref,m=d.yref,v=s.x.test(g),y=s.y.test(m);if(v||y){f||i.pushUnique(r._basePlotModules,o);var x=!1;v&&-1===c.indexOf(g)&&(c.push(g),x=!0),y&&-1===u.indexOf(m)&&(u.push(m),x=!0),x&&v&&y&&h.push(g+m)}}}}}},{"../../lib":684,"../../registry":817}],743:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../registry"),a=t("../../lib"),o=t("../plots"),s=t("../../components/drawing"),l=t("../get_data").getModuleCalcData,c=t("./axis_ids"),u=t("./constants"),h=t("../../constants/xmlns_namespaces"),f=a.ensureSingle;function p(t,e,r){return a.ensureSingle(t,e,r,function(t){t.datum(r)})}function d(t,e,r,a,o){for(var c,h,f,p=u.traceLayerClasses,d=t._fullLayout,g=d._modules,m=[],v=[],y=0;y<g.length;y++){var x=(c=g[y]).name,b=i.modules[x].categories;if(b.svg){var _=c.layerName||x+"layer",w=c.plot;f=(h=l(r,w))[0],r=h[1],f.length&&m.push({i:p.indexOf(_),className:_,plotMethod:w,cdModule:f}),b.zoomScale&&v.push("."+_)}}m.sort(function(t,e){return t.i-e.i});var k=e.plot.selectAll("g.mlayer").data(m,function(t){return t.className});if(k.enter().append("g").attr("class",function(t){return t.className}).classed("mlayer",!0),k.exit().remove(),k.order(),k.each(function(r){var i=n.select(this),l=r.className;r.plotMethod(t,e,r.cdModule,i,a,o),"scatterlayer"!==l&&"barlayer"!==l&&s.setClipUrl(i,e.layerClipId)}),d._has("scattergl")&&(c=i.getModule("scattergl"),f=l(r,c)[0],c.plot(t,e,f)),!t._context.staticPlot&&(e._hasClipOnAxisFalse&&(e.clipOnAxisFalseTraces=e.plot.selectAll(".scatterlayer, .barlayer").selectAll(".trace")),v.length)){var M=e.plot.selectAll(v.join(",")).selectAll(".trace");e.zoomScalePts=M.selectAll("path.point"),e.zoomScaleTxt=M.selectAll(".textpoint")}}function g(t,e){var r=e.plotgroup,n=e.id,i=u.layerValue2layerClass[e.xaxis.layer],a=u.layerValue2layerClass[e.yaxis.layer],o=t._fullLayout._hasOnlyLargeSploms;if(e.mainplot){var s=e.mainplotinfo,l=s.plotgroup,h=n+"-x",d=n+"-y";e.gridlayer=s.gridlayer,e.zerolinelayer=s.zerolinelayer,f(s.overlinesBelow,"path",h),f(s.overlinesBelow,"path",d),f(s.overaxesBelow,"g",h),f(s.overaxesBelow,"g",d),e.plot=f(s.overplot,"g",n),f(s.overlinesAbove,"path",h),f(s.overlinesAbove,"path",d),f(s.overaxesAbove,"g",h),f(s.overaxesAbove,"g",d),e.xlines=l.select(".overlines-"+i).select("."+h),e.ylines=l.select(".overlines-"+a).select("."+d),e.xaxislayer=l.select(".overaxes-"+i).select("."+h),e.yaxislayer=l.select(".overaxes-"+a).select("."+d)}else if(o)e.plot=f(r,"g","plot"),e.xlines=f(r,"path","xlines-above"),e.ylines=f(r,"path","ylines-above"),e.xaxislayer=f(r,"g","xaxislayer-above"),e.yaxislayer=f(r,"g","yaxislayer-above");else{var g=f(r,"g","layer-subplot");e.shapelayer=f(g,"g","shapelayer"),e.imagelayer=f(g,"g","imagelayer"),e.gridlayer=f(r,"g","gridlayer"),e.zerolinelayer=f(r,"g","zerolinelayer"),f(r,"path","xlines-below"),f(r,"path","ylines-below"),e.overlinesBelow=f(r,"g","overlines-below"),f(r,"g","xaxislayer-below"),f(r,"g","yaxislayer-below"),e.overaxesBelow=f(r,"g","overaxes-below"),e.plot=f(r,"g","plot"),e.overplot=f(r,"g","overplot"),e.xlines=f(r,"path","xlines-above"),e.ylines=f(r,"path","ylines-above"),e.overlinesAbove=f(r,"g","overlines-above"),f(r,"g","xaxislayer-above"),f(r,"g","yaxislayer-above"),e.overaxesAbove=f(r,"g","overaxes-above"),e.xlines=r.select(".xlines-"+i),e.ylines=r.select(".ylines-"+a),e.xaxislayer=r.select(".xaxislayer-"+i),e.yaxislayer=r.select(".yaxislayer-"+a)}o||(p(e.gridlayer,"g",e.xaxis._id),p(e.gridlayer,"g",e.yaxis._id),e.gridlayer.selectAll("g").map(function(t){return t[0]}).sort(c.idSort)),e.xlines.style("fill","none").classed("crisp",!0),e.ylines.style("fill","none").classed("crisp",!0)}function m(t,e){if(t){var r={};for(var i in t.each(function(t){var i=t[0];n.select(this).remove(),v(i,e),r[i]=!0}),e._plots)for(var a=e._plots[i].overlays||[],o=0;o<a.length;o++){var s=a[o];r[s.id]&&s.plot.selectAll(".trace").remove()}}}function v(t,e){e._draggers.selectAll("g."+t).remove(),e._defs.select("#clip"+e._uid+t+"plot").remove()}r.name="cartesian",r.attr=["xaxis","yaxis"],r.idRoot=["x","y"],r.idRegex=u.idRegex,r.attrRegex=u.attrRegex,r.attributes=t("./attributes"),r.layoutAttributes=t("./layout_attributes"),r.supplyLayoutDefaults=t("./layout_defaults"),r.transitionAxes=t("./transition_axes"),r.finalizeSubplots=function(t,e){var r,n,i,o=e._subplots,s=o.xaxis,l=o.yaxis,h=o.cartesian,f=h.concat(o.gl2d||[]),p={},d={};for(r=0;r<f.length;r++){var g=f[r].split("y");p[g[0]]=1,d["y"+g[1]]=1}for(r=0;r<s.length;r++)p[n=s[r]]||(i=(t[c.id2name(n)]||{}).anchor,u.idRegex.y.test(i)||(i="y"),h.push(n+i),f.push(n+i),d[i]||(d[i]=1,a.pushUnique(l,i)));for(r=0;r<l.length;r++)d[i=l[r]]||(n=(t[c.id2name(i)]||{}).anchor,u.idRegex.x.test(n)||(n="x"),h.push(n+i),f.push(n+i),p[n]||(p[n]=1,a.pushUnique(s,n)));if(!f.length){for(var m in n="",i="",t){if(u.attrRegex.test(m))"x"===m.charAt(0)?(!n||+m.substr(5)<+n.substr(5))&&(n=m):(!i||+m.substr(5)<+i.substr(5))&&(i=m)}n=n?c.name2id(n):"x",i=i?c.name2id(i):"y",s.push(n),l.push(i),h.push(n+i)}},r.plot=function(t,e,r,n){var i,a=t._fullLayout,o=a._subplots.cartesian,s=t.calcdata;if(null!==e){if(!Array.isArray(e))for(e=[],i=0;i<s.length;i++)e.push(i);for(i=0;i<o.length;i++){for(var l,c=o[i],u=a._plots[c],h=[],f=0;f<s.length;f++){var p=s[f],g=p[0].trace;g.xaxis+g.yaxis===c&&((-1!==e.indexOf(g.index)||g.carpet)&&(l&&l[0].trace.xaxis+l[0].trace.yaxis===c&&-1!==["tonextx","tonexty","tonext"].indexOf(g.fill)&&-1===h.indexOf(l)&&h.push(l),h.push(p)),l=p)}d(t,u,h,r,n)}}},r.clean=function(t,e,r,n){var i,a,o,s=n._plots||{},l=e._plots||{},u=n._subplots||{};if(n._hasOnlyLargeSploms&&!e._hasOnlyLargeSploms)for(o in s)(i=s[o]).plotgroup&&i.plotgroup.remove();var h=n._has&&n._has("gl"),f=e._has&&e._has("gl");if(h&&!f)for(o in s)(i=s[o])._scene&&i._scene.destroy();if(u.xaxis&&u.yaxis){var p=c.listIds({_fullLayout:n});for(a=0;a<p.length;a++){var d=p[a];e[c.id2name(d)]||n._infolayer.selectAll(".g-"+d+"title").remove()}}var g=n._has&&n._has("cartesian"),y=e._has&&e._has("cartesian");if(g&&!y)m(n._cartesianlayer.selectAll(".subplot"),n),n._defs.selectAll(".axesclip").remove(),delete n._axisConstraintGroups;else if(u.cartesian)for(a=0;a<u.cartesian.length;a++){var x=u.cartesian[a];if(!l[x]){var b="."+x+",."+x+"-x,."+x+"-y";n._cartesianlayer.selectAll(b).remove(),v(x,n)}}},r.drawFramework=function(t){var e=t._fullLayout,r=function(t){var e,r,n,i,a,o,s=t._fullLayout,l=s._subplots.cartesian,c=l.length,u=[],h=[];for(e=0;e<c;e++){n=l[e],i=s._plots[n],a=i.xaxis,o=i.yaxis;var f=a._mainAxis,p=o._mainAxis,d=f._id+p._id,g=s._plots[d];i.overlays=[],d!==n&&g?(i.mainplot=d,i.mainplotinfo=g,h.push(n)):(i.mainplot=void 0,i.mainPlotinfo=void 0,u.push(n))}for(e=0;e<h.length;e++)n=h[e],(i=s._plots[n]).mainplotinfo.overlays.push(i);var m=u.concat(h),v=new Array(c);for(e=0;e<c;e++){n=m[e],i=s._plots[n],a=i.xaxis,o=i.yaxis;var y=[n,a.layer,o.layer,a.overlaying||"",o.overlaying||""];for(r=0;r<i.overlays.length;r++)y.push(i.overlays[r].id);v[e]=y}return v}(t),i=e._cartesianlayer.selectAll(".subplot").data(r,String);i.enter().append("g").attr("class",function(t){return"subplot "+t[0]}),i.order(),i.exit().call(m,e),i.each(function(r){var i=r[0],a=e._plots[i];a.plotgroup=n.select(this),g(t,a),a.draglayer=f(e._draggers,"g",i)})},r.rangePlot=function(t,e,r){g(t,e),d(t,e,r),o.style(t)},r.toSVG=function(t){var e=t._fullLayout._glimages,r=n.select(t).selectAll(".svg-container");r.filter(function(t,e){return e===r.size()-1}).selectAll(".gl-canvas-context, .gl-canvas-focus").each(function(){var t=this.toDataURL("image/png");e.append("svg:image").attr({xmlns:h.svg,"xlink:href":t,preserveAspectRatio:"none",x:0,y:0,width:this.width,height:this.height})})},r.updateFx=t("./graph_interact").updateFx},{"../../components/drawing":583,"../../constants/xmlns_namespaces":663,"../../lib":684,"../../registry":817,"../get_data":768,"../plots":795,"./attributes":730,"./axis_ids":735,"./constants":737,"./graph_interact":741,"./layout_attributes":744,"./layout_defaults":745,"./transition_axes":754,d3:147}],744:[function(t,e,r){"use strict";var n=t("../font_attributes"),i=t("../../components/color/attributes"),a=t("../../components/drawing/attributes").dash,o=t("../../lib/extend").extendFlat,s=t("../../plot_api/plot_template").templatedArray,l=t("./constants");e.exports={visible:{valType:"boolean",editType:"plot"},color:{valType:"color",dflt:i.defaultLine,editType:"ticks"},title:{valType:"string",editType:"ticks"},titlefont:n({editType:"ticks"}),type:{valType:"enumerated",values:["-","linear","log","date","category"],dflt:"-",editType:"calc",_noTemplating:!0},autorange:{valType:"enumerated",values:[!0,!1,"reversed"],dflt:!0,editType:"calc",impliedEdits:{"range[0]":void 0,"range[1]":void 0}},rangemode:{valType:"enumerated",values:["normal","tozero","nonnegative"],dflt:"normal",editType:"plot"},range:{valType:"info_array",items:[{valType:"any",editType:"axrange",impliedEdits:{"^autorange":!1}},{valType:"any",editType:"axrange",impliedEdits:{"^autorange":!1}}],editType:"axrange",impliedEdits:{autorange:!1}},fixedrange:{valType:"boolean",dflt:!1,editType:"calc"},scaleanchor:{valType:"enumerated",values:[l.idRegex.x.toString(),l.idRegex.y.toString()],editType:"plot"},scaleratio:{valType:"number",min:0,dflt:1,editType:"plot"},constrain:{valType:"enumerated",values:["range","domain"],dflt:"range",editType:"plot"},constraintoward:{valType:"enumerated",values:["left","center","right","top","middle","bottom"],editType:"plot"},tickmode:{valType:"enumerated",values:["auto","linear","array"],editType:"ticks",impliedEdits:{tick0:void 0,dtick:void 0}},nticks:{valType:"integer",min:0,dflt:0,editType:"ticks"},tick0:{valType:"any",editType:"ticks",impliedEdits:{tickmode:"linear"}},dtick:{valType:"any",editType:"ticks",impliedEdits:{tickmode:"linear"}},tickvals:{valType:"data_array",editType:"ticks"},ticktext:{valType:"data_array",editType:"ticks"},ticks:{valType:"enumerated",values:["outside","inside",""],editType:"ticks"},mirror:{valType:"enumerated",values:[!0,"ticks",!1,"all","allticks"],dflt:!1,editType:"ticks+layoutstyle"},ticklen:{valType:"number",min:0,dflt:5,editType:"ticks"},tickwidth:{valType:"number",min:0,dflt:1,editType:"ticks"},tickcolor:{valType:"color",dflt:i.defaultLine,editType:"ticks"},showticklabels:{valType:"boolean",dflt:!0,editType:"ticks"},automargin:{valType:"boolean",dflt:!1,editType:"ticks"},showspikes:{valType:"boolean",dflt:!1,editType:"modebar"},spikecolor:{valType:"color",dflt:null,editType:"none"},spikethickness:{valType:"number",dflt:3,editType:"none"},spikedash:o({},a,{dflt:"dash",editType:"none"}),spikemode:{valType:"flaglist",flags:["toaxis","across","marker"],dflt:"toaxis",editType:"none"},spikesnap:{valType:"enumerated",values:["data","cursor"],dflt:"data",editType:"none"},tickfont:n({editType:"ticks"}),tickangle:{valType:"angle",dflt:"auto",editType:"ticks"},tickprefix:{valType:"string",dflt:"",editType:"ticks"},showtickprefix:{valType:"enumerated",values:["all","first","last","none"],dflt:"all",editType:"ticks"},ticksuffix:{valType:"string",dflt:"",editType:"ticks"},showticksuffix:{valType:"enumerated",values:["all","first","last","none"],dflt:"all",editType:"ticks"},showexponent:{valType:"enumerated",values:["all","first","last","none"],dflt:"all",editType:"ticks"},exponentformat:{valType:"enumerated",values:["none","e","E","power","SI","B"],dflt:"B",editType:"ticks"},separatethousands:{valType:"boolean",dflt:!1,editType:"ticks"},tickformat:{valType:"string",dflt:"",editType:"ticks"},tickformatstops:s("tickformatstop",{enabled:{valType:"boolean",dflt:!0,editType:"ticks"},dtickrange:{valType:"info_array",items:[{valType:"any",editType:"ticks"},{valType:"any",editType:"ticks"}],editType:"ticks"},value:{valType:"string",dflt:"",editType:"ticks"},editType:"ticks"}),hoverformat:{valType:"string",dflt:"",editType:"none"},showline:{valType:"boolean",dflt:!1,editType:"layoutstyle"},linecolor:{valType:"color",dflt:i.defaultLine,editType:"layoutstyle"},linewidth:{valType:"number",min:0,dflt:1,editType:"ticks+layoutstyle"},showgrid:{valType:"boolean",editType:"ticks"},gridcolor:{valType:"color",dflt:i.lightLine,editType:"ticks"},gridwidth:{valType:"number",min:0,dflt:1,editType:"ticks"},zeroline:{valType:"boolean",editType:"ticks"},zerolinecolor:{valType:"color",dflt:i.defaultLine,editType:"ticks"},zerolinewidth:{valType:"number",dflt:1,editType:"ticks"},anchor:{valType:"enumerated",values:["free",l.idRegex.x.toString(),l.idRegex.y.toString()],editType:"plot"},side:{valType:"enumerated",values:["top","bottom","left","right"],editType:"plot"},overlaying:{valType:"enumerated",values:["free",l.idRegex.x.toString(),l.idRegex.y.toString()],editType:"plot"},layer:{valType:"enumerated",values:["above traces","below traces"],dflt:"above traces",editType:"plot"},domain:{valType:"info_array",items:[{valType:"number",min:0,max:1,editType:"plot"},{valType:"number",min:0,max:1,editType:"plot"}],dflt:[0,1],editType:"plot"},position:{valType:"number",min:0,max:1,dflt:0,editType:"plot"},categoryorder:{valType:"enumerated",values:["trace","category ascending","category descending","array"],dflt:"trace",editType:"calc"},categoryarray:{valType:"data_array",editType:"calc"},editType:"calc",_deprecated:{autotick:{valType:"boolean",editType:"ticks"}}}},{"../../components/color/attributes":557,"../../components/drawing/attributes":582,"../../lib/extend":673,"../../plot_api/plot_template":722,"../font_attributes":758,"./constants":737}],745:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib"),a=t("../../components/color"),o=t("../../plot_api/plot_template"),s=t("../layout_attributes"),l=t("./layout_attributes"),c=t("./type_defaults"),u=t("./axis_defaults"),h=t("./constraint_defaults"),f=t("./position_defaults"),p=t("./axis_ids");e.exports=function(t,e,r){var d,g={},m={},v={},y={};for(d=0;d<r.length;d++){var x=r[d];if(n.traceIs(x,"cartesian")||n.traceIs(x,"gl2d")){var b=p.id2name(x.xaxis),_=p.id2name(x.yaxis);if(n.traceIs(x,"carpet")&&("carpet"!==x.type||x._cheater)||b&&(m[b]=1),"carpet"===x.type&&x._cheater&&b&&(g[b]=1),n.traceIs(x,"2dMap")&&(v[b]=!0,v[_]=!0),n.traceIs(x,"oriented"))y["h"===x.orientation?_:b]=!0}}var w=e._subplots,k=w.xaxis,M=w.yaxis,A=i.simpleMap(k,p.id2name),T=i.simpleMap(M,p.id2name),S=A.concat(T),E=a.background;k.length&&M.length&&(E=i.coerce(t,e,s,"plot_bgcolor"));var C,L,z,P,I=a.combine(E,e.paper_bgcolor);function O(t,e){return i.coerce(z,P,l,t,e)}function D(t,e){return i.coerce2(z,P,l,t,e)}function R(t){return"x"===t?M:k}var B={x:R("x"),y:R("y")};function F(e,r){for(var n="x"===e?A:T,i=[],a=0;a<n.length;a++){var o=n[a];o===r||(t[o]||{}).overlaying||i.push(p.name2id(o))}return i}for(d=0;d<S.length;d++){L=(C=S[d]).charAt(0),i.isPlainObject(t[C])||(t[C]={}),z=t[C],P=o.newContainer(e,C,L+"axis"),c(z,P,O,r,C);var N=F(L,C),j={letter:L,font:e.font,outerTicks:v[C],showGrid:!y[C],data:r,bgColor:I,calendar:e.calendar,automargin:!0,cheateronly:"x"===L&&g[C]&&!m[C]};u(z,P,O,j,e);var V=D("spikecolor"),U=D("spikethickness"),q=D("spikedash"),H=D("spikemode"),G=D("spikesnap");O("showspikes",!!(V||U||q||H||G))||(delete P.spikecolor,delete P.spikethickness,delete P.spikedash,delete P.spikemode,delete P.spikesnap);var W={letter:L,counterAxes:B[L],overlayableAxes:N,grid:e.grid};f(z,P,O,W),P._input=z}var Y=n.getComponentMethod("rangeslider","handleDefaults"),X=n.getComponentMethod("rangeselector","handleDefaults");for(d=0;d<A.length;d++)C=A[d],z=t[C],P=e[C],Y(t,e,C),"date"===P.type&&X(z,P,e,T,P.calendar),O("fixedrange");for(d=0;d<T.length;d++){C=T[d],z=t[C],P=e[C];var Z=e[p.id2name(P.anchor)];O("fixedrange",Z&&Z.rangeslider&&Z.rangeslider.visible)}e._axisConstraintGroups=[];var $=B.x.concat(B.y);for(d=0;d<S.length;d++)L=(C=S[d]).charAt(0),z=t[C],P=e[C],h(z,P,O,$,e)}},{"../../components/color":558,"../../lib":684,"../../plot_api/plot_template":722,"../../registry":817,"../layout_attributes":786,"./axis_defaults":734,"./axis_ids":735,"./constraint_defaults":738,"./layout_attributes":744,"./position_defaults":747,"./type_defaults":755}],746:[function(t,e,r){"use strict";var n=t("tinycolor2").mix,i=t("../../components/color/attributes").lightFraction,a=t("../../lib");e.exports=function(t,e,r,o){var s=(o=o||{}).dfltColor;function l(r,n){return a.coerce2(t,e,o.attributes,r,n)}var c=l("linecolor",s),u=l("linewidth");r("showline",o.showLine||!!c||!!u)||(delete e.linecolor,delete e.linewidth);var h=l("gridcolor",n(s,o.bgColor,o.blend||i).toRgbString()),f=l("gridwidth");if(r("showgrid",o.showGrid||!!h||!!f)||(delete e.gridcolor,delete e.gridwidth),!o.noZeroLine){var p=l("zerolinecolor",s),d=l("zerolinewidth");r("zeroline",o.showGrid||!!p||!!d)||(delete e.zerolinecolor,delete e.zerolinewidth)}}},{"../../components/color/attributes":557,"../../lib":684,tinycolor2:499}],747:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib");e.exports=function(t,e,r,a){var o,s,l,c,u=a.counterAxes||[],h=a.overlayableAxes||[],f=a.letter,p=a.grid;p&&(s=p._domains[f][p._axisMap[e._id]],o=p._anchors[e._id],s&&(l=p[f+"side"].split(" ")[0],c=p.domain[f]["right"===l||"top"===l?1:0])),s=s||[0,1],o=o||(n(t.position)?"free":u[0]||"free"),l=l||("x"===f?"bottom":"left"),c=c||0,"free"===i.coerce(t,e,{anchor:{valType:"enumerated",values:["free"].concat(u),dflt:o}},"anchor")&&r("position",c),i.coerce(t,e,{side:{valType:"enumerated",values:"x"===f?["bottom","top"]:["left","right"],dflt:l}},"side");var d=!1;if(h.length&&(d=i.coerce(t,e,{overlaying:{valType:"enumerated",values:[!1].concat(h),dflt:!1}},"overlaying")),!d){var g=r("domain",s);g[0]>g[1]-.01&&(e.domain=s),i.noneOrAll(t.domain,e.domain,s)}return r("layer"),e}},{"../../lib":684,"fast-isnumeric":214}],748:[function(t,e,r){"use strict";var n=t("../../constants/alignment").FROM_BL;e.exports=function(t,e,r){void 0===r&&(r=n[t.constraintoward||"center"]);var i=[t.r2l(t.range[0]),t.r2l(t.range[1])],a=i[0]+(i[1]-i[0])*r;t.range=t._input.range=[t.l2r(a+(i[0]-a)*e),t.l2r(a+(i[1]-a)*e)]}},{"../../constants/alignment":656}],749:[function(t,e,r){"use strict";var n=t("polybooljs"),i=t("../../registry"),a=t("../../components/color"),o=t("../../components/fx"),s=t("../../lib/polygon"),l=t("../../lib/throttle"),c=t("../../components/fx/helpers").makeEventData,u=t("./axis_ids").getFromId,h=t("../sort_modules").sortModules,f=t("./constants"),p=f.MINSELECT,d=s.filter,g=s.tester,m=s.multitester;function v(t){return t._id}function y(t,e,r){var n,a,o,s;if(r){var l=r.points||[];for(n=0;n<e.length;n++)(s=e[n].cd[0].trace).selectedpoints=[],s._input.selectedpoints=[];for(n=0;n<l.length;n++){var c=l[n],u=c.data,f=c.fullData;c.pointIndices?([].push.apply(u.selectedpoints,c.pointIndices),[].push.apply(f.selectedpoints,c.pointIndices)):(u.selectedpoints.push(c.pointIndex),f.selectedpoints.push(c.pointIndex))}}else for(n=0;n<e.length;n++)delete(s=e[n].cd[0].trace).selectedpoints,delete s._input.selectedpoints;var p={};for(n=0;n<e.length;n++){var d=(o=e[n])._module.name;p[d]?p[d].push(o):p[d]=[o]}var g=Object.keys(p).sort(h);for(n=0;n<g.length;n++){var m=p[g[n]],v=m.length,y=m[0],x=y.cd[0].trace,b=y._module,_=b.styleOnSelect||b.style;if(i.traceIs(x,"regl")){var w=new Array(v);for(a=0;a<v;a++)w[a]=m[a].cd;_(t,w)}else for(a=0;a<v;a++)_(t,m[a].cd)}}function x(t,e){if(Array.isArray(t))for(var r=e.cd,n=e.cd[0].trace,i=0;i<t.length;i++)t[i]=c(t[i],n,r);return t}function b(t){t.selectAll(".select-outline").remove()}e.exports={prepSelect:function(t,e,r,i,s){var c,h,_,w,k,M,A,T,S,E=i.gd,C=E._fullLayout,L=C._zoomlayer,z=i.element.getBoundingClientRect(),P=i.plotinfo,I=P.xaxis._offset,O=P.yaxis._offset,D=e-z.left,R=r-z.top,B=D,F=R,N="M"+D+","+R,j=i.xaxes[0]._length,V=i.yaxes[0]._length,U=i.xaxes.map(v),q=i.yaxes.map(v),H=i.xaxes.concat(i.yaxes),G=t.altKey,W=C._lastSelectedSubplot&&C._lastSelectedSubplot===P.id;W&&(t.shiftKey||t.altKey)&&P.selection&&P.selection.polygons&&!i.polygons?(i.polygons=P.selection.polygons,i.mergedPolygons=P.selection.mergedPolygons):(!t.shiftKey&&!t.altKey||(t.shiftKey||t.altKey)&&!P.selection)&&(P.selection={},P.selection.polygons=i.polygons=[],P.selection.mergedPolygons=i.mergedPolygons=[]),W||(b(L),C._lastSelectedSubplot=P.id),"lasso"===s&&(c=d([[D,R]],f.BENDPX));var Y=L.selectAll("path.select-outline-"+P.id).data([1,2]);Y.enter().append("path").attr("class",function(t){return"select-outline select-outline-"+t+" select-outline-"+P.id}).attr("transform","translate("+I+", "+O+")").attr("d",N+"Z");var X,Z=L.append("path").attr("class","zoombox-corners").style({fill:a.background,stroke:a.defaultLine,"stroke-width":1}).attr("transform","translate("+I+", "+O+")").attr("d","M0,0Z"),$=[],J=C._uid+f.SELECTID,K=[];for(k=0;k<E.calcdata.length;k++)if(!0===(A=(M=E.calcdata[k])[0].trace).visible&&A._module&&A._module.selectPoints)if(i.subplot)A.subplot!==i.subplot&&A.geo!==i.subplot||$.push({_module:A._module,cd:M,xaxis:i.xaxes[0],yaxis:i.yaxes[0]});else if("splom"===A.type&&A._xaxes[U[0]]&&A._yaxes[q[0]])$.push({_module:A._module,cd:M,xaxis:i.xaxes[0],yaxis:i.yaxes[0]});else{if(-1===U.indexOf(A.xaxis))continue;if(-1===q.indexOf(A.yaxis))continue;$.push({_module:A._module,cd:M,xaxis:u(E,A.xaxis),yaxis:u(E,A.yaxis)})}function Q(t){var e="y"===t._id.charAt(0)?1:0;return function(r){return t.p2d(r[e])}}function tt(t,e){return t-e}X=P.fillRangeItems?P.fillRangeItems:"select"===s?function(t,e){var r=t.range={};for(k=0;k<H.length;k++){var n=H[k],i=n._id.charAt(0);r[n._id]=[n.p2d(e[i+"min"]),n.p2d(e[i+"max"])].sort(tt)}}:function(t,e,r){var n=t.lassoPoints={};for(k=0;k<H.length;k++){var i=H[k];n[i._id]=r.filtered.map(Q(i))}},i.moveFn=function(t,e){B=Math.max(0,Math.min(j,t+D)),F=Math.max(0,Math.min(V,e+R));var r=Math.abs(B-D),a=Math.abs(F-R);if("select"===s){var o=C.selectdirection;"h"===(o="any"===C.selectdirection?a<Math.min(.6*r,p)?"h":r<Math.min(.6*a,p)?"v":"d":C.selectdirection)?((w=[[D,0],[D,V],[B,V],[B,0]]).xmin=Math.min(D,B),w.xmax=Math.max(D,B),w.ymin=Math.min(0,V),w.ymax=Math.max(0,V),Z.attr("d","M"+w.xmin+","+(R-p)+"h-4v"+2*p+"h4ZM"+(w.xmax-1)+","+(R-p)+"h4v"+2*p+"h-4Z")):"v"===o?((w=[[0,R],[0,F],[j,F],[j,R]]).xmin=Math.min(0,j),w.xmax=Math.max(0,j),w.ymin=Math.min(R,F),w.ymax=Math.max(R,F),Z.attr("d","M"+(D-p)+","+w.ymin+"v-4h"+2*p+"v4ZM"+(D-p)+","+(w.ymax-1)+"v4h"+2*p+"v-4Z")):"d"===o&&((w=[[D,R],[D,F],[B,F],[B,R]]).xmin=Math.min(D,B),w.xmax=Math.max(D,B),w.ymin=Math.min(R,F),w.ymax=Math.max(R,F),Z.attr("d","M0,0Z"))}else"lasso"===s&&(c.addPt([B,F]),w=c.filtered);i.polygons&&i.polygons.length?(_=function(t,e,r){return r?n.difference({regions:t,inverted:!1},{regions:[e],inverted:!1}).regions:n.union({regions:t,inverted:!1},{regions:[e],inverted:!1}).regions}(i.mergedPolygons,w,G),w.subtract=G,h=m(i.polygons.concat([w]))):(_=[w],h=g(w));var u=[];for(k=0;k<_.length;k++){var d=_[k];u.push(d.join("L")+"L"+d[0])}Y.attr("d","M"+u.join("M")+"Z"),l.throttle(J,f.SELECTDELAY,function(){K=[];var t,e,r=[];for(k=0;k<$.length;k++)if(e=(T=$[k])._module.selectPoints(T,h),r.push(e),t=x(e,T),K.length)for(var n=0;n<t.length;n++)K.push(t[n]);else K=t;y(E,$,S={points:K}),X(S,w,c),i.gd.emit("plotly_selecting",S)})},i.clickFn=function(t,e){Z.remove(),l.done(J).then(function(){if(l.clear(J),2===t){for(Y.remove(),k=0;k<$.length;k++)(T=$[k])._module.selectPoints(T,!1);y(E,$),E.emit("plotly_deselect",null)}else E.emit("plotly_selected",void 0);o.click(E,e)})},i.doneFn=function(){Z.remove(),l.done(J).then(function(){l.clear(J),i.gd.emit("plotly_selected",S),w&&i.polygons&&(w.subtract=G,i.polygons.push(w),i.mergedPolygons.length=0,[].push.apply(i.mergedPolygons,_))})}},clearSelect:b}},{"../../components/color":558,"../../components/fx":600,"../../components/fx/helpers":597,"../../lib/polygon":696,"../../lib/throttle":709,"../../registry":817,"../sort_modules":808,"./axis_ids":735,"./constants":737,polybooljs:440}],750:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("../../lib"),o=a.cleanNumber,s=a.ms2DateTime,l=a.dateTime2ms,c=a.ensureNumber,u=t("../../constants/numerical"),h=u.FP_SAFE,f=u.BADNUM,p=t("./constants"),d=t("./axis_ids");function g(t){return Math.pow(10,t)}e.exports=function(t,e){e=e||{};var r=(t._id||"x").charAt(0),u=10;function m(e,r){if(e>0)return Math.log(e)/Math.LN10;if(e<=0&&r&&t.range&&2===t.range.length){var n=t.range[0],i=t.range[1];return.5*(n+i-3*u*Math.abs(n-i))}return f}function v(e,r,n){var o=l(e,n||t.calendar);if(o===f){if(!i(e))return f;e=+e;var s=Math.floor(10*a.mod(e+.05,1)),c=Math.round(e-s/10);o=l(new Date(c))+s/10}return o}function y(e,r,n){return s(e,r,n||t.calendar)}function x(e){return t._categories[Math.round(e)]}function b(e){if(t._categoriesMap){var r=t._categoriesMap[e];if(void 0!==r)return r}if(i(e))return+e}function _(e){return i(e)?n.round(t._b+t._m*e,2):f}function w(e){return(e-t._b)/t._m}t.c2l="log"===t.type?m:c,t.l2c="log"===t.type?g:c,t.l2p=_,t.p2l=w,t.c2p="log"===t.type?function(t,e){return _(m(t,e))}:_,t.p2c="log"===t.type?function(t){return g(w(t))}:w,-1!==["linear","-"].indexOf(t.type)?(t.d2r=t.r2d=t.d2c=t.r2c=t.d2l=t.r2l=o,t.c2d=t.c2r=t.l2d=t.l2r=c,t.d2p=t.r2p=function(e){return t.l2p(o(e))},t.p2d=t.p2r=w,t.cleanPos=c):"log"===t.type?(t.d2r=t.d2l=function(t,e){return m(o(t),e)},t.r2d=t.r2c=function(t){return g(o(t))},t.d2c=t.r2l=o,t.c2d=t.l2r=c,t.c2r=m,t.l2d=g,t.d2p=function(e,r){return t.l2p(t.d2r(e,r))},t.p2d=function(t){return g(w(t))},t.r2p=function(e){return t.l2p(o(e))},t.p2r=w,t.cleanPos=c):"date"===t.type?(t.d2r=t.r2d=a.identity,t.d2c=t.r2c=t.d2l=t.r2l=v,t.c2d=t.c2r=t.l2d=t.l2r=y,t.d2p=t.r2p=function(e,r,n){return t.l2p(v(e,0,n))},t.p2d=t.p2r=function(t,e,r){return y(w(t),e,r)},t.cleanPos=function(e){return a.cleanDate(e,f,t.calendar)}):"category"===t.type&&(t.d2c=t.d2l=function(e){if(null!=e){if(void 0===t._categoriesMap&&(t._categoriesMap={}),void 0!==t._categoriesMap[e])return t._categoriesMap[e];t._categories.push(e);var r=t._categories.length-1;return t._categoriesMap[e]=r,r}return f},t.r2d=t.c2d=t.l2d=x,t.d2r=t.d2l_noadd=b,t.r2c=function(e){var r=b(e);return void 0!==r?r:t.fraction2r(.5)},t.l2r=t.c2r=c,t.r2l=b,t.d2p=function(e){return t.l2p(t.r2c(e))},t.p2d=function(t){return x(w(t))},t.r2p=t.d2p,t.p2r=w,t.cleanPos=function(t){return"string"==typeof t&&""!==t?t:c(t)}),t.fraction2r=function(e){var r=t.r2l(t.range[0]),n=t.r2l(t.range[1]);return t.l2r(r+e*(n-r))},t.r2fraction=function(e){var r=t.r2l(t.range[0]),n=t.r2l(t.range[1]);return(t.r2l(e)-r)/(n-r)},t.cleanRange=function(e,n){n||(n={}),e||(e="range");var o,s,l=a.nestedProperty(t,e).get();if(s=(s="date"===t.type?a.dfltRange(t.calendar):"y"===r?p.DFLTRANGEY:n.dfltRange||p.DFLTRANGEX).slice(),l&&2===l.length)for("date"===t.type&&(l[0]=a.cleanDate(l[0],f,t.calendar),l[1]=a.cleanDate(l[1],f,t.calendar)),o=0;o<2;o++)if("date"===t.type){if(!a.isDateTime(l[o],t.calendar)){t[e]=s;break}if(t.r2l(l[0])===t.r2l(l[1])){var c=a.constrain(t.r2l(l[0]),a.MIN_MS+1e3,a.MAX_MS-1e3);l[0]=t.l2r(c-1e3),l[1]=t.l2r(c+1e3);break}}else{if(!i(l[o])){if(!i(l[1-o])){t[e]=s;break}l[o]=l[1-o]*(o?10:.1)}if(l[o]<-h?l[o]=-h:l[o]>h&&(l[o]=h),l[0]===l[1]){var u=Math.max(1,Math.abs(1e-6*l[0]));l[0]-=u,l[1]+=u}}else a.nestedProperty(t,e).set(s)},t.setScale=function(n){var i=e._size;if(t._categories||(t._categories=[]),t._categoriesMap||(t._categoriesMap={}),t.overlaying){var a=d.getFromId({_fullLayout:e},t.overlaying);t.domain=a.domain}var o=n&&t._r?"_r":"range",s=t.calendar;t.cleanRange(o);var l=t.r2l(t[o][0],s),c=t.r2l(t[o][1],s);if("y"===r?(t._offset=i.t+(1-t.domain[1])*i.h,t._length=i.h*(t.domain[1]-t.domain[0]),t._m=t._length/(l-c),t._b=-t._m*c):(t._offset=i.l+t.domain[0]*i.w,t._length=i.w*(t.domain[1]-t.domain[0]),t._m=t._length/(c-l),t._b=-t._m*l),!isFinite(t._m)||!isFinite(t._b))throw e._replotting=!1,new Error("Something went wrong with axis scaling")},t.makeCalcdata=function(e,r){var n,i,o,s,l=t.type,c="date"===l&&e[r+"calendar"];if(r in e){if(n=e[r],s=e._length||n.length,a.isTypedArray(n)&&("linear"===l||"log"===l)){if(s===n.length)return n;if(n.subarray)return n.subarray(0,s)}for(i=new Array(s),o=0;o<s;o++)i[o]=t.d2c(n[o],0,c)}else{var u=r+"0"in e?t.d2c(e[r+"0"],0,c):0,h=e["d"+r]?Number(e["d"+r]):1;for(n=e[{x:"y",y:"x"}[r]],s=e._length||n.length,i=new Array(s),o=0;o<s;o++)i[o]=u+o*h}return i},t.isValidRange=function(e){return Array.isArray(e)&&2===e.length&&i(t.r2l(e[0]))&&i(t.r2l(e[1]))},t.isPtWithinRange=function(e,n){var i=t.c2l(e[r],null,n),a=t.r2l(t.range[0]),o=t.r2l(t.range[1]);return a<o?a<=i&&i<=o:o<=i&&i<=a},t.clearCalc=function(){t._min=[],t._max=[],t._categories=(t._initialCategories||[]).slice(),t._categoriesMap={};for(var e=0;e<t._categories.length;e++)t._categoriesMap[t._categories[e]]=e};var k=e._d3locale;"date"===t.type&&(t._dateFormat=k?k.timeFormat.utc:n.time.format.utc,t._extraFormat=e._extraFormat),t._separators=e.separators,t._numFormat=k?k.numberFormat:n.format,delete t._minDtick,delete t._forceTick0}},{"../../constants/numerical":661,"../../lib":684,"./axis_ids":735,"./constants":737,d3:147,"fast-isnumeric":214}],751:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./layout_attributes"),a=t("../array_container_defaults");function o(t,e){function r(r,a){return n.coerce(t,e,i.tickformatstops,r,a)}r("enabled")&&(r("dtickrange"),r("value"))}e.exports=function(t,e,r,s,l){var c=function(t){var e=["showexponent","showtickprefix","showticksuffix"].filter(function(e){return void 0!==t[e]});if(e.every(function(r){return t[r]===t[e[0]]})||1===e.length)return t[e[0]]}(t);if(r("tickprefix")&&r("showtickprefix",c),r("ticksuffix",l.tickSuffixDflt)&&r("showticksuffix",c),r("showticklabels")){var u=l.font||{},h=e.color!==i.color.dflt?e.color:u.color;if(n.coerceFont(r,"tickfont",{family:u.family,size:u.size,color:h}),r("tickangle"),"category"!==s){var f=r("tickformat"),p=t.tickformatstops;Array.isArray(p)&&p.length&&a(t,e,{name:"tickformatstops",inclusionAttr:"enabled",handleItemDefaults:o}),f||"date"===s||(r("showexponent",c),r("exponentformat"),r("separatethousands"))}}}},{"../../lib":684,"../array_container_defaults":728,"./layout_attributes":744}],752:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./layout_attributes");e.exports=function(t,e,r,a){var o=n.coerce2(t,e,i,"ticklen"),s=n.coerce2(t,e,i,"tickwidth"),l=n.coerce2(t,e,i,"tickcolor",e.color);r("ticks",a.outerTicks||o||s||l?"outside":"")||(delete e.ticklen,delete e.tickwidth,delete e.tickcolor)}},{"../../lib":684,"./layout_attributes":744}],753:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib"),a=t("../../constants/numerical").ONEDAY;e.exports=function(t,e,r,o){var s;"array"!==t.tickmode||"log"!==o&&"date"!==o?s=r("tickmode",Array.isArray(t.tickvals)?"array":t.dtick?"linear":"auto"):s=e.tickmode="auto";if("auto"===s)r("nticks");else if("linear"===s){var l="date"===o?a:1,c=r("dtick",l);if(n(c))e.dtick=c>0?Number(c):l;else if("string"!=typeof c)e.dtick=l;else{var u=c.charAt(0),h=c.substr(1);((h=n(h)?Number(h):0)<=0||!("date"===o&&"M"===u&&h===Math.round(h)||"log"===o&&"L"===u||"log"===o&&"D"===u&&(1===h||2===h)))&&(e.dtick=l)}var f="date"===o?i.dateTick0(e.calendar):0,p=r("tick0",f);"date"===o?e.tick0=i.cleanDate(p,f):n(p)&&"D1"!==c&&"D2"!==c?e.tick0=Number(p):e.tick0=f}else{void 0===r("tickvals")?e.tickmode="auto":r("ticktext")}}},{"../../constants/numerical":661,"../../lib":684,"fast-isnumeric":214}],754:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../registry"),a=t("../../components/drawing"),o=t("./axes"),s=t("./constants").attrRegex;e.exports=function(t,e,r,l){var c=t._fullLayout,u=[];var h,f,p,d,g=function(t){var e,r,n,i,a={};for(e in t)if((r=e.split("."))[0].match(s)){var o=e.charAt(0),l=r[0];if(n=c[l],i={},Array.isArray(t[e])?i.to=t[e].slice(0):Array.isArray(t[e].range)&&(i.to=t[e].range.slice(0)),!i.to)continue;i.axisName=l,i.length=n._length,u.push(o),a[o]=i}return a}(e),m=Object.keys(g),v=function(t,e,r){var n,i,a,o=t._plots,s=[];for(n in o){var l=o[n];if(-1===s.indexOf(l)){var c=l.xaxis._id,u=l.yaxis._id,h=l.xaxis.range,f=l.yaxis.range;l.xaxis._r=l.xaxis.range.slice(),l.yaxis._r=l.yaxis.range.slice(),i=r[c]?r[c].to:h,a=r[u]?r[u].to:f,h[0]===i[0]&&h[1]===i[1]&&f[0]===a[0]&&f[1]===a[1]||-1===e.indexOf(c)&&-1===e.indexOf(u)||s.push(l)}}return s}(c,m,g);if(!v.length)return function(){function e(e,r,n){for(var i=0;i<e.length;i++)if(r(t,i),n)return}e(c.annotations||[],i.getComponentMethod("annotations","drawOne")),e(c.shapes||[],i.getComponentMethod("shapes","drawOne")),e(c.images||[],i.getComponentMethod("images","draw"),!0)}(),!1;function y(t){var e=t.xaxis,r=t.yaxis;c._defs.select("#"+t.clipId+"> rect").call(a.setTranslate,0,0).call(a.setScale,1,1),t.plot.call(a.setTranslate,e._offset,r._offset).call(a.setScale,1,1);var n=t.plot.selectAll(".scatterlayer .trace");n.selectAll(".point").call(a.setPointGroupScale,1,1),n.selectAll(".textpoint").call(a.setTextPointsScale,1,1),n.call(a.hideOutsideRangePoints,t)}function x(e,r){var n,s,l,u=g[e.xaxis._id],h=g[e.yaxis._id],f=[];if(u){s=(n=t._fullLayout[u.axisName])._r,l=u.to,f[0]=(s[0]*(1-r)+r*l[0]-s[0])/(s[1]-s[0])*e.xaxis._length;var p=s[1]-s[0],d=l[1]-l[0];n.range[0]=s[0]*(1-r)+r*l[0],n.range[1]=s[1]*(1-r)+r*l[1],f[2]=e.xaxis._length*(1-r+r*d/p)}else f[0]=0,f[2]=e.xaxis._length;if(h){s=(n=t._fullLayout[h.axisName])._r,l=h.to,f[1]=(s[1]*(1-r)+r*l[1]-s[1])/(s[0]-s[1])*e.yaxis._length;var m=s[1]-s[0],v=l[1]-l[0];n.range[0]=s[0]*(1-r)+r*l[0],n.range[1]=s[1]*(1-r)+r*l[1],f[3]=e.yaxis._length*(1-r+r*v/m)}else f[1]=0,f[3]=e.yaxis._length;!function(e,r){var n,a=[];for(a=[e._id,r._id],n=0;n<a.length;n++)o.doTicksSingle(t,a[n],!0);function s(e,r,i){for(n=0;n<e.length;n++){var o=e[n];if(-1===a.indexOf(o.xref)&&-1===a.indexOf(o.yref)||r(t,n),i)return}}s(c.annotations||[],i.getComponentMethod("annotations","drawOne")),s(c.shapes||[],i.getComponentMethod("shapes","drawOne")),s(c.images||[],i.getComponentMethod("images","draw"),!0)}(e.xaxis,e.yaxis);var y=e.xaxis,x=e.yaxis,b=!!u,_=!!h,w=b?y._length/f[2]:1,k=_?x._length/f[3]:1,M=b?f[0]:0,A=_?f[1]:0,T=b?f[0]/f[2]*y._length:0,S=_?f[1]/f[3]*x._length:0,E=y._offset-T,C=x._offset-S;e.clipRect.call(a.setTranslate,M,A).call(a.setScale,1/w,1/k),e.plot.call(a.setTranslate,E,C).call(a.setScale,w,k),a.setPointGroupScale(e.zoomScalePts,1/w,1/k),a.setTextPointsScale(e.zoomScaleTxt,1/w,1/k)}l&&(h=l());var b=n.ease(r.easing);return t._transitionData._interruptCallbacks.push(function(){return window.cancelAnimationFrame(d),d=null,function(){for(var e={},r=0;r<m.length;r++){var n=t._fullLayout[m[r]+"axis"];e[n._name+".range[0]"]=n.range[0],e[n._name+".range[1]"]=n.range[1],n.range=n._r.slice()}return i.call("relayout",t,e).then(function(){for(var t=0;t<v.length;t++)y(v[t])})}()}),f=Date.now(),d=window.requestAnimationFrame(function e(){p=Date.now();for(var n=Math.min(1,(p-f)/r.duration),a=b(n),o=0;o<v.length;o++)x(v[o],a);p-f>r.duration?(function(){for(var e={},r=0;r<m.length;r++){var n=t._fullLayout[g[m[r]].axisName],a=g[m[r]].to;e[n._name+".range[0]"]=a[0],e[n._name+".range[1]"]=a[1],n.range=a.slice()}h&&h(),i.call("relayout",t,e).then(function(){for(var t=0;t<v.length;t++)y(v[t])})}(),d=window.cancelAnimationFrame(e)):d=window.requestAnimationFrame(e)}),Promise.resolve()}},{"../../components/drawing":583,"../../registry":817,"./axes":732,"./constants":737,d3:147}],755:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("./axis_autotype"),a=t("./axis_ids").name2id;function o(t){return{v:"x",h:"y"}[t.orientation||"v"]}function s(t,e){var r=o(t),i=n.traceIs(t,"box-violin"),a=n.traceIs(t._fullInput||{},"candlestick");return i&&!a&&e===r&&void 0===t[r]&&void 0===t[r+"0"]}e.exports=function(t,e,r,l,c){c&&(e._name=c,e._id=a(c)),"-"===r("type")&&(!function(t,e){if("-"!==t.type)return;var r=t._id,a=r.charAt(0);-1!==r.indexOf("scene")&&(r=a);var l=function(t,e,r){for(var n=0;n<t.length;n++){var i=t[n];if("splom"===i.type&&i._length>0&&i["_"+r+"axes"][e])return i;if((i[r+"axis"]||r)===e){if(s(i,r))return i;if((i[r]||[]).length||i[r+"0"])return i}}}(e,r,a);if(!l)return;if("histogram"===l.type&&a==={v:"y",h:"x"}[l.orientation||"v"])return void(t.type="linear");var c,u=a+"calendar",h=l[u];if(s(l,a)){var f=o(l),p=[];for(c=0;c<e.length;c++){var d=e[c];n.traceIs(d,"box-violin")&&(d[a+"axis"]||a)===r&&(void 0!==d[f]?p.push(d[f][0]):void 0!==d.name?p.push(d.name):p.push("text"),d[u]!==h&&(h=void 0))}t.type=i(p,h)}else if("splom"===l.type){var g=l.dimensions;for(c=0;c<g.length;c++){var m=g[c];if(m.visible){t.type=i(m.values,h);break}}}else t.type=i(l[a]||[l[a+"0"]],h)}(e,l),"-"===e.type?e.type="linear":t.type=e.type)}},{"../../registry":817,"./axis_autotype":733,"./axis_ids":735}],756:[function(t,e,r){"use strict";var n=t("../registry"),i=t("../lib");function a(t,e,r){var n,a,o,s=!1;if("data"===e.type)n=t._fullData[null!==e.traces?e.traces[0]:0];else{if("layout"!==e.type)return!1;n=t._fullLayout}return a=i.nestedProperty(n,e.prop).get(),(o=r[e.type]=r[e.type]||{}).hasOwnProperty(e.prop)&&o[e.prop]!==a&&(s=!0),o[e.prop]=a,{changed:s,value:a}}function o(t,e){var r=[],n=e[0],a={};if("string"==typeof n)a[n]=e[1];else{if(!i.isPlainObject(n))return r;a=n}return l(a,function(t,e,n){r.push({type:"layout",prop:t,value:n})},"",0),r}function s(t,e){var r,n,a,o,s=[];if(n=e[0],a=e[1],r=e[2],o={},"string"==typeof n)o[n]=a;else{if(!i.isPlainObject(n))return s;o=n,void 0===r&&(r=a)}return void 0===r&&(r=null),l(o,function(e,n,i){var a;if(Array.isArray(i)){var o=Math.min(i.length,t.data.length);r&&(o=Math.min(o,r.length)),a=[];for(var l=0;l<o;l++)a[l]=r?r[l]:l}else a=r?r.slice(0):null;if(null===a)Array.isArray(i)&&(i=i[0]);else if(Array.isArray(a)){if(!Array.isArray(i)){var c=i;i=[];for(var u=0;u<a.length;u++)i[u]=c}i.length=Math.min(a.length,i.length)}s.push({type:"data",prop:e,traces:a,value:i})},"",0),s}function l(t,e,r,n){Object.keys(t).forEach(function(a){var o=t[a];if("_"!==a[0]){var s=r+(n>0?".":"")+a;i.isPlainObject(o)?l(o,e,s,n+1):e(s,a,o)}})}r.manageCommandObserver=function(t,e,n,o){var s={},l=!0;e&&e._commandObserver&&(s=e._commandObserver),s.cache||(s.cache={}),s.lookupTable={};var c=r.hasSimpleAPICommandBindings(t,n,s.lookupTable);if(e&&e._commandObserver){if(c)return s;if(e._commandObserver.remove)return e._commandObserver.remove(),e._commandObserver=null,s}if(c){a(t,c,s.cache),s.check=function(){if(l){var e=a(t,c,s.cache);return e.changed&&o&&void 0!==s.lookupTable[e.value]&&(s.disable(),Promise.resolve(o({value:e.value,type:c.type,prop:c.prop,traces:c.traces,index:s.lookupTable[e.value]})).then(s.enable,s.enable)),e.changed}};for(var u=["plotly_relayout","plotly_redraw","plotly_restyle","plotly_update","plotly_animatingframe","plotly_afterplot"],h=0;h<u.length;h++)t._internalOn(u[h],s.check);s.remove=function(){for(var e=0;e<u.length;e++)t._removeInternalListener(u[e],s.check)}}else i.log("Unable to automatically bind plot updates to API command"),s.lookupTable={},s.remove=function(){};return s.disable=function(){l=!1},s.enable=function(){l=!0},e&&(e._commandObserver=s),s},r.hasSimpleAPICommandBindings=function(t,e,n){var i,a,o=e.length;for(i=0;i<o;i++){var s,l=e[i],c=l.method,u=l.args;if(Array.isArray(u)||(u=[]),!c)return!1;var h=r.computeAPICommandBindings(t,c,u);if(1!==h.length)return!1;if(a){if((s=h[0]).type!==a.type)return!1;if(s.prop!==a.prop)return!1;if(Array.isArray(a.traces)){if(!Array.isArray(s.traces))return!1;s.traces.sort();for(var f=0;f<a.traces.length;f++)if(a.traces[f]!==s.traces[f])return!1}else if(s.prop!==a.prop)return!1}else a=h[0],Array.isArray(a.traces)&&a.traces.sort();var p=(s=h[0]).value;if(Array.isArray(p)){if(1!==p.length)return!1;p=p[0]}n&&(n[p]=i)}return a},r.executeAPICommand=function(t,e,r){if("skip"===e)return Promise.resolve();var a=n.apiMethodRegistry[e],o=[t];Array.isArray(r)||(r=[]);for(var s=0;s<r.length;s++)o.push(r[s]);return a.apply(null,o).catch(function(t){return i.warn("API call to Plotly."+e+" rejected.",t),Promise.reject(t)})},r.computeAPICommandBindings=function(t,e,r){var n;switch(Array.isArray(r)||(r=[]),e){case"restyle":n=s(t,r);break;case"relayout":n=o(t,r);break;case"update":n=s(t,[r[0],r[2]]).concat(o(t,[r[1]]));break;case"animate":n=function(t,e){return Array.isArray(e[0])&&1===e[0].length&&-1!==["string","number"].indexOf(typeof e[0][0])?[{type:"layout",prop:"_currentFrame",value:e[0][0].toString()}]:[]}(0,r);break;default:n=[]}return n}},{"../lib":684,"../registry":817}],757:[function(t,e,r){"use strict";var n=t("../lib/extend").extendFlat;r.attributes=function(t,e){e=e||{};var r={valType:"info_array",editType:(t=t||{}).editType,items:[{valType:"number",min:0,max:1,editType:t.editType},{valType:"number",min:0,max:1,editType:t.editType}],dflt:[0,1]},i=(t.name&&t.name,t.trace,e.description&&e.description,{x:n({},r,{}),y:n({},r,{}),editType:t.editType});return t.noGridCell||(i.row={valType:"integer",min:0,dflt:0,editType:t.editType},i.column={valType:"integer",min:0,dflt:0,editType:t.editType}),i},r.defaults=function(t,e,r,n){var i=n&&n.x||[0,1],a=n&&n.y||[0,1],o=e.grid;if(o){var s=r("domain.column");void 0!==s&&(s<o.columns?i=o._domains.x[s]:delete t.domain.column);var l=r("domain.row");void 0!==l&&(l<o.rows?a=o._domains.y[l]:delete t.domain.row)}r("domain.x",i),r("domain.y",a)}},{"../lib/extend":673}],758:[function(t,e,r){"use strict";e.exports=function(t){var e=t.editType,r=t.colorEditType;void 0===r&&(r=e);var n={family:{valType:"string",noBlank:!0,strict:!0,editType:e},size:{valType:"number",min:1,editType:e},color:{valType:"color",editType:r},editType:e};return t.arrayOk&&(n.family.arrayOk=!0,n.size.arrayOk=!0,n.color.arrayOk=!0),n}},{}],759:[function(t,e,r){"use strict";e.exports={_isLinkedToArray:"frames_entry",group:{valType:"string"},name:{valType:"string"},traces:{valType:"any"},baseframe:{valType:"string"},data:{valType:"any"},layout:{valType:"any"}}},{}],760:[function(t,e,r){"use strict";r.projNames={equirectangular:"equirectangular",mercator:"mercator",orthographic:"orthographic","natural earth":"naturalEarth",kavrayskiy7:"kavrayskiy7",miller:"miller",robinson:"robinson",eckert4:"eckert4","azimuthal equal area":"azimuthalEqualArea","azimuthal equidistant":"azimuthalEquidistant","conic equal area":"conicEqualArea","conic conformal":"conicConformal","conic equidistant":"conicEquidistant",gnomonic:"gnomonic",stereographic:"stereographic",mollweide:"mollweide",hammer:"hammer","transverse mercator":"transverseMercator","albers usa":"albersUsa","winkel tripel":"winkel3",aitoff:"aitoff",sinusoidal:"sinusoidal"},r.axesNames=["lonaxis","lataxis"],r.lonaxisSpan={orthographic:180,"azimuthal equal area":360,"azimuthal equidistant":360,"conic conformal":180,gnomonic:160,stereographic:180,"transverse mercator":180,"*":360},r.lataxisSpan={"conic conformal":150,stereographic:179.5,"*":180},r.scopeDefaults={world:{lonaxisRange:[-180,180],lataxisRange:[-90,90],projType:"equirectangular",projRotate:[0,0,0]},usa:{lonaxisRange:[-180,-50],lataxisRange:[15,80],projType:"albers usa"},europe:{lonaxisRange:[-30,60],lataxisRange:[30,85],projType:"conic conformal",projRotate:[15,0,0],projParallels:[0,60]},asia:{lonaxisRange:[22,160],lataxisRange:[-15,55],projType:"mercator",projRotate:[0,0,0]},africa:{lonaxisRange:[-30,60],lataxisRange:[-40,40],projType:"mercator",projRotate:[0,0,0]},"north america":{lonaxisRange:[-180,-45],lataxisRange:[5,85],projType:"conic conformal",projRotate:[-100,0,0],projParallels:[29.5,45.5]},"south america":{lonaxisRange:[-100,-30],lataxisRange:[-60,15],projType:"mercator",projRotate:[0,0,0]}},r.clipPad=.001,r.precision=.1,r.landColor="#F0DC82",r.waterColor="#3399FF",r.locationmodeToLayer={"ISO-3":"countries","USA-states":"subunits","country names":"countries"},r.sphereSVG={type:"Sphere"},r.fillLayers={ocean:1,land:1,lakes:1},r.lineLayers={subunits:1,countries:1,coastlines:1,rivers:1,frame:1},r.layers=["bg","ocean","land","lakes","subunits","countries","coastlines","rivers","lataxis","lonaxis","frame","backplot","frontplot"],r.layersForChoropleth=["bg","ocean","land","subunits","countries","coastlines","lataxis","lonaxis","frame","backplot","rivers","lakes","frontplot"],r.layerNameToAdjective={ocean:"ocean",land:"land",lakes:"lake",subunits:"subunit",countries:"country",coastlines:"coastline",rivers:"river",frame:"frame"}},{}],761:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../registry"),a=t("../../lib"),o=t("../../components/color"),s=t("../../components/drawing"),l=t("../../components/fx"),c=t("../plots"),u=t("../cartesian/axes"),h=t("../../components/dragelement"),f=t("../cartesian/select").prepSelect,p=t("./zoom"),d=t("./constants"),g=t("../../lib/topojson_utils"),m=t("topojson-client").feature;function v(t){this.id=t.id,this.graphDiv=t.graphDiv,this.container=t.container,this.topojsonURL=t.topojsonURL,this.isStatic=t.staticPlot,this.topojsonName=null,this.topojson=null,this.projection=null,this.viewInitial=null,this.fitScale=null,this.bounds=null,this.midPt=null,this.hasChoropleth=!1,this.traceHash={},this.layers={},this.basePaths={},this.dataPaths={},this.dataPoints={},this.clipDef=null,this.clipRect=null,this.bgRect=null,this.makeFramework()}t("./projections")(n);var y=v.prototype;e.exports=function(t){return new v(t)},y.plot=function(t,e,r){var n=this,i=e[this.id],a=g.getTopojsonName(i);null===n.topojson||a!==n.topojsonName?(n.topojsonName=a,void 0===PlotlyGeoAssets.topojson[n.topojsonName]?r.push(n.fetchTopojson().then(function(r){PlotlyGeoAssets.topojson[n.topojsonName]=r,n.topojson=r,n.update(t,e)})):(n.topojson=PlotlyGeoAssets.topojson[n.topojsonName],n.update(t,e))):n.update(t,e)},y.fetchTopojson=function(){var t=g.getTopojsonPath(this.topojsonURL,this.topojsonName);return new Promise(function(e,r){n.json(t,function(n,i){if(n)return 404===n.status?r(new Error(["plotly.js could not find topojson file at",t,".","Make sure the *topojsonURL* plot config option","is set properly."].join(" "))):r(new Error(["unexpected error while fetching topojson file at",t].join(" ")));e(i)})})},y.update=function(t,e){var r=e[this.id];if(!this.updateProjection(e,r)){this.hasChoropleth=!1;for(var n=0;n<t.length;n++)if("choropleth"===t[n][0].trace.type){this.hasChoropleth=!0;break}this.viewInitial||this.saveViewInitial(r),this.updateBaseLayers(e,r),this.updateDims(e,r),this.updateFx(e,r),c.generalUpdatePerTraceModule(this.graphDiv,this,t,r);var i=this.layers.frontplot.select(".scatterlayer");this.dataPoints.point=i.selectAll(".point"),this.dataPoints.text=i.selectAll("text"),this.dataPaths.line=i.selectAll(".js-line");var a=this.layers.backplot.select(".choroplethlayer");this.dataPaths.choropleth=a.selectAll("path"),this.render()}},y.updateProjection=function(t,e){var r=t._size,o=e.domain,s=e.projection,l=s.rotation||{},c=e.center||{},u=this.projection=function(t){for(var e=t.projection.type,r=n.geo[d.projNames[e]](),i=t._isClipped?d.lonaxisSpan[e]/2:null,a=["center","rotate","parallels","clipExtent"],o=function(t){return t?r:[]},s=0;s<a.length;s++){var l=a[s];"function"!=typeof r[l]&&(r[l]=o)}r.isLonLatOverEdges=function(t){if(null===r(t))return!0;if(i){var e=r.rotate();return n.geo.distance(t,[-e[0],-e[1]])>i*Math.PI/180}return!1},r.getPath=function(){return n.geo.path().projection(r)},r.getBounds=function(t){return r.getPath().bounds(t)},r.fitExtent=function(t,e){var n=t[1][0]-t[0][0],i=t[1][1]-t[0][1],a=r.clipExtent&&r.clipExtent();r.scale(150).translate([0,0]),a&&r.clipExtent(null);var o=r.getBounds(e),s=Math.min(n/(o[1][0]-o[0][0]),i/(o[1][1]-o[0][1])),l=+t[0][0]+(n-s*(o[1][0]+o[0][0]))/2,c=+t[0][1]+(i-s*(o[1][1]+o[0][1]))/2;return a&&r.clipExtent(a),r.scale(150*s).translate([l,c])},r.precision(d.precision),i&&r.clipAngle(i-d.clipPad);return r}(e);u.center([c.lon-l.lon,c.lat-l.lat]).rotate([-l.lon,-l.lat,l.roll]).parallels(s.parallels);var h=[[r.l+r.w*o.x[0],r.t+r.h*(1-o.y[1])],[r.l+r.w*o.x[1],r.t+r.h*(1-o.y[0])]],f=e.lonaxis,p=e.lataxis,g=function(t,e){var r=d.clipPad,n=t[0]+r,i=t[1]-r,a=e[0]+r,o=e[1]-r;n>0&&i<0&&(i+=360);var s=(i-n)/4;return{type:"Polygon",coordinates:[[[n,a],[n,o],[n+s,o],[n+2*s,o],[n+3*s,o],[i,o],[i,a],[i-s,a],[i-2*s,a],[i-3*s,a],[n,a]]]}}(f.range,p.range);u.fitExtent(h,g);var m=this.bounds=u.getBounds(g),v=this.fitScale=u.scale(),y=u.translate();if(!isFinite(m[0][0])||!isFinite(m[0][1])||!isFinite(m[1][0])||!isFinite(m[1][1])||isNaN(y[0])||isNaN(y[0])){for(var x=this.graphDiv,b=["projection.rotation","center","lonaxis.range","lataxis.range"],_="Invalid geo settings, relayout'ing to default view.",w={},k=0;k<b.length;k++)w[this.id+"."+b[k]]=null;return this.viewInitial=null,a.warn(_),x._promises.push(i.call("relayout",x,w)),_}var M=this.midPt=[(m[0][0]+m[1][0])/2,(m[0][1]+m[1][1])/2];if(u.scale(s.scale*v).translate([y[0]+(M[0]-y[0]),y[1]+(M[1]-y[1])]).clipExtent(m),e._isAlbersUsa){var A=u([c.lon,c.lat]),T=u.translate();u.translate([T[0]-(A[0]-T[0]),T[1]-(A[1]-T[1])])}},y.updateBaseLayers=function(t,e){var r=this,i=r.topojson,a=r.layers,l=r.basePaths;function c(t){return"lonaxis"===t||"lataxis"===t}function u(t){return Boolean(d.lineLayers[t])}function h(t){return Boolean(d.fillLayers[t])}var f=(this.hasChoropleth?d.layersForChoropleth:d.layers).filter(function(t){return u(t)||h(t)?e["show"+t]:!c(t)||e[t].showgrid}),p=r.framework.selectAll(".layer").data(f,String);p.exit().each(function(t){delete a[t],delete l[t],n.select(this).remove()}),p.enter().append("g").attr("class",function(t){return"layer "+t}).each(function(t){var e=a[t]=n.select(this);"bg"===t?r.bgRect=e.append("rect").style("pointer-events","all"):c(t)?l[t]=e.append("path").style("fill","none"):"backplot"===t?e.append("g").classed("choroplethlayer",!0):"frontplot"===t?e.append("g").classed("scatterlayer",!0):u(t)?l[t]=e.append("path").style("fill","none").style("stroke-miterlimit",2):h(t)&&(l[t]=e.append("path").style("stroke","none"))}),p.order(),p.each(function(t){var r=l[t],a=d.layerNameToAdjective[t];"frame"===t?r.datum(d.sphereSVG):u(t)||h(t)?r.datum(m(i,i.objects[t])):c(t)&&r.datum(function(t,e){var r=e[t].dtick,i=d.scopeDefaults[e.scope],a=i.lonaxisRange,o=i.lataxisRange,s="lonaxis"===t?[r]:[0,r];return n.geo.graticule().extent([[a[0],o[0]],[a[1],o[1]]]).step(s)}(t,e)).call(o.stroke,e[t].gridcolor).call(s.dashLine,"",e[t].gridwidth),u(t)?r.call(o.stroke,e[a+"color"]).call(s.dashLine,"",e[a+"width"]):h(t)&&r.call(o.fill,e[a+"color"])})},y.updateDims=function(t,e){var r=this.bounds,n=(e.framewidth||0)/2,i=r[0][0]-n,a=r[0][1]-n,l=r[1][0]-i+n,c=r[1][1]-a+n;s.setRect(this.clipRect,i,a,l,c),this.bgRect.call(s.setRect,i,a,l,c).call(o.fill,e.bgcolor),this.xaxis._offset=i,this.xaxis._length=l,this.yaxis._offset=a,this.yaxis._length=c},y.updateFx=function(t,e){var r=this,a=r.graphDiv,o=r.bgRect,s=t.dragmode;if(!r.isStatic){if("pan"===s)o.node().onmousedown=null,o.call(p(r,e)),o.on("dblclick.zoom",function(){var t=r.viewInitial,e={};for(var n in t)e[r.id+"."+n]=t[n];i.call("relayout",a,e),a.emit("plotly_doubleclick",null)});else if("select"===s||"lasso"===s){var c;o.on(".zoom",null),"select"===s?c=function(t,e){(t.range={})[r.id]=[d([e.xmin,e.ymin]),d([e.xmax,e.ymax])]}:"lasso"===s&&(c=function(t,e,n){(t.lassoPoints={})[r.id]=n.filtered.map(d)});var u={element:r.bgRect.node(),gd:a,plotinfo:{xaxis:r.xaxis,yaxis:r.yaxis,fillRangeItems:c},xaxes:[r.xaxis],yaxes:[r.yaxis],subplot:r.id,clickFn:function(e){2===e&&t._zoomlayer.selectAll(".select-outline").remove()},prepFn:function(t,e,r){f(t,e,r,u,s)}};h.init(u)}o.on("mousemove",function(){var t=r.projection.invert(n.mouse(this));if(!t||isNaN(t[0])||isNaN(t[1]))return h.unhover(a,n.event);r.xaxis.p2c=function(){return t[0]},r.yaxis.p2c=function(){return t[1]},l.hover(a,n.event,r.id)}),o.on("mouseout",function(){h.unhover(a,n.event)}),o.on("click",function(){l.click(a,n.event)})}function d(t){return r.projection.invert([t[0]+r.xaxis._offset,t[1]+r.yaxis._offset])}},y.makeFramework=function(){var t=this,e=t.graphDiv._fullLayout,r="clip"+e._uid+t.id;t.clipDef=e._clips.append("clipPath").attr("id",r),t.clipRect=t.clipDef.append("rect"),t.framework=n.select(t.container).append("g").attr("class","geo "+t.id).call(s.setClipUrl,r),t.project=function(e){var r=t.projection(e);return r?[r[0]-t.xaxis._offset,r[1]-t.yaxis._offset]:[null,null]},t.xaxis={_id:"x",c2p:function(e){return t.project(e)[0]}},t.yaxis={_id:"y",c2p:function(e){return t.project(e)[1]}},t.mockAxis={type:"linear",showexponent:"all",exponentformat:"B"},u.setConvert(t.mockAxis,e)},y.saveViewInitial=function(t){var e=t.center||{},r=t.projection,n=r.rotation||{};t._isScoped?this.viewInitial={"center.lon":e.lon,"center.lat":e.lat,"projection.scale":r.scale}:t._isClipped?this.viewInitial={"projection.scale":r.scale,"projection.rotation.lon":n.lon,"projection.rotation.lat":n.lat}:this.viewInitial={"center.lon":e.lon,"center.lat":e.lat,"projection.scale":r.scale,"projection.rotation.lon":n.lon}},y.render=function(){var t,e=this.projection,r=e.getPath();function n(t){var r=e(t.lonlat);return r?"translate("+r[0]+","+r[1]+")":null}function i(t){return e.isLonLatOverEdges(t.lonlat)?"none":null}for(t in this.basePaths)this.basePaths[t].attr("d",r);for(t in this.dataPaths)this.dataPaths[t].attr("d",function(t){return r(t.geojson)});for(t in this.dataPoints)this.dataPoints[t].attr("display",i).attr("transform",n)}},{"../../components/color":558,"../../components/dragelement":580,"../../components/drawing":583,"../../components/fx":600,"../../lib":684,"../../lib/topojson_utils":711,"../../registry":817,"../cartesian/axes":732,"../cartesian/select":749,"../plots":795,"./constants":760,"./projections":766,"./zoom":767,d3:147,"topojson-client":502}],762:[function(t,e,r){"use strict";var n=t("./geo"),i=t("../../plots/get_data").getSubplotCalcData,a=t("../../lib").counterRegex,o="geo";r.name=o,r.attr=o,r.idRoot=o,r.idRegex=r.attrRegex=a(o),r.attributes=t("./layout/attributes"),r.layoutAttributes=t("./layout/layout_attributes"),r.supplyLayoutDefaults=t("./layout/defaults"),r.plot=function(t){var e=t._fullLayout,r=t.calcdata,a=e._subplots.geo;void 0===window.PlotlyGeoAssets&&(window.PlotlyGeoAssets={topojson:{}});for(var s=0;s<a.length;s++){var l=a[s],c=i(r,o,l),u=e[l]._subplot;u||(u=n({id:l,graphDiv:t,container:e._geolayer.node(),topojsonURL:t._context.topojsonURL,staticPlot:t._context.staticPlot}),e[l]._subplot=u),u.plot(c,e,t._promises)}},r.clean=function(t,e,r,n){for(var i=n._subplots.geo||[],a=0;a<i.length;a++){var o=i[a],s=n[o]._subplot;!e[o]&&s&&(s.framework.remove(),s.clipDef.remove())}},r.updateFx=function(t){for(var e=t._subplots.geo,r=0;r<e.length;r++){var n=t[e[r]];n._subplot.updateFx(t,n)}}},{"../../lib":684,"../../plots/get_data":768,"./geo":761,"./layout/attributes":763,"./layout/defaults":764,"./layout/layout_attributes":765}],763:[function(t,e,r){"use strict";e.exports={geo:{valType:"subplotid",dflt:"geo",editType:"calc"}}},{}],764:[function(t,e,r){"use strict";var n=t("../../subplot_defaults"),i=t("../constants"),a=t("./layout_attributes"),o=i.axesNames;function s(t,e,r){var n=r("resolution"),a=r("scope"),s=i.scopeDefaults[a],l=r("projection.type",s.projType),c=e._isAlbersUsa="albers usa"===l;c&&(a=e.scope="usa");var u=e._isScoped="world"!==a,h=e._isConic=-1!==l.indexOf("conic");e._isClipped=!!i.lonaxisSpan[l];for(var f=0;f<o.length;f++){var p,d=o[f],g=[30,10][f];if(u)p=s[d+"Range"];else{var m=i[d+"Span"],v=(m[l]||m["*"])/2,y=r("projection.rotation."+d.substr(0,3),s.projRotate[f]);p=[y-v,y+v]}var x=r(d+".range",p);r(d+".tick0",x[0]),r(d+".dtick",g),r(d+".showgrid")&&(r(d+".gridcolor"),r(d+".gridwidth"))}var b=e.lonaxis.range,_=e.lataxis.range,w=b[0],k=b[1];w>0&&k<0&&(k+=360);var M,A,T,S=(w+k)/2;if(!c){var E=u?s.projRotate:[S,0,0];M=r("projection.rotation.lon",E[0]),r("projection.rotation.lat",E[1]),r("projection.rotation.roll",E[2]),r("showcoastlines",!u)&&(r("coastlinecolor"),r("coastlinewidth")),r("showocean")&&r("oceancolor")}(c?(A=-96.6,T=38.7):(A=u?S:M,T=(_[0]+_[1])/2),r("center.lon",A),r("center.lat",T),h)&&r("projection.parallels",s.projParallels||[0,60]);r("projection.scale"),r("showland")&&r("landcolor"),r("showlakes")&&r("lakecolor"),r("showrivers")&&(r("rivercolor"),r("riverwidth")),r("showcountries",u&&"usa"!==a)&&(r("countrycolor"),r("countrywidth")),("usa"===a||"north america"===a&&50===n)&&(r("showsubunits",!0),r("subunitcolor"),r("subunitwidth")),u||r("showframe",!0)&&(r("framecolor"),r("framewidth")),r("bgcolor")}e.exports=function(t,e,r){n(t,e,r,{type:"geo",attributes:a,handleDefaults:s,partition:"y"})}},{"../../subplot_defaults":809,"../constants":760,"./layout_attributes":765}],765:[function(t,e,r){"use strict";var n=t("../../../components/color/attributes"),i=t("../../domain").attributes,a=t("../constants"),o=t("../../../plot_api/edit_types").overrideAll,s={range:{valType:"info_array",items:[{valType:"number"},{valType:"number"}]},showgrid:{valType:"boolean",dflt:!1},tick0:{valType:"number"},dtick:{valType:"number"},gridcolor:{valType:"color",dflt:n.lightLine},gridwidth:{valType:"number",min:0,dflt:1}};e.exports=o({domain:i({name:"geo"},{}),resolution:{valType:"enumerated",values:[110,50],dflt:110,coerceNumber:!0},scope:{valType:"enumerated",values:Object.keys(a.scopeDefaults),dflt:"world"},projection:{type:{valType:"enumerated",values:Object.keys(a.projNames)},rotation:{lon:{valType:"number"},lat:{valType:"number"},roll:{valType:"number"}},parallels:{valType:"info_array",items:[{valType:"number"},{valType:"number"}]},scale:{valType:"number",min:0,dflt:1}},center:{lon:{valType:"number"},lat:{valType:"number"}},showcoastlines:{valType:"boolean"},coastlinecolor:{valType:"color",dflt:n.defaultLine},coastlinewidth:{valType:"number",min:0,dflt:1},showland:{valType:"boolean",dflt:!1},landcolor:{valType:"color",dflt:a.landColor},showocean:{valType:"boolean",dflt:!1},oceancolor:{valType:"color",dflt:a.waterColor},showlakes:{valType:"boolean",dflt:!1},lakecolor:{valType:"color",dflt:a.waterColor},showrivers:{valType:"boolean",dflt:!1},rivercolor:{valType:"color",dflt:a.waterColor},riverwidth:{valType:"number",min:0,dflt:1},showcountries:{valType:"boolean"},countrycolor:{valType:"color",dflt:n.defaultLine},countrywidth:{valType:"number",min:0,dflt:1},showsubunits:{valType:"boolean"},subunitcolor:{valType:"color",dflt:n.defaultLine},subunitwidth:{valType:"number",min:0,dflt:1},showframe:{valType:"boolean"},framecolor:{valType:"color",dflt:n.defaultLine},framewidth:{valType:"number",min:0,dflt:1},bgcolor:{valType:"color",dflt:n.background},lonaxis:s,lataxis:s},"plot","from-root")},{"../../../components/color/attributes":557,"../../../plot_api/edit_types":715,"../../domain":757,"../constants":760}],766:[function(t,e,r){"use strict";e.exports=function(t){function e(t,e){return{type:"Feature",id:t.id,properties:t.properties,geometry:r(t.geometry,e)}}function r(e,n){if(!e)return null;if("GeometryCollection"===e.type)return{type:"GeometryCollection",geometries:object.geometries.map(function(t){return r(t,n)})};if(!c.hasOwnProperty(e.type))return null;var i=c[e.type];return t.geo.stream(e,n(i)),i.result()}t.geo.project=function(t,e){var i=e.stream;if(!i)throw new Error("not yet supported");return(t&&n.hasOwnProperty(t.type)?n[t.type]:r)(t,i)};var n={Feature:e,FeatureCollection:function(t,r){return{type:"FeatureCollection",features:t.features.map(function(t){return e(t,r)})}}},i=[],a=[],o={point:function(t,e){i.push([t,e])},result:function(){var t=i.length?i.length<2?{type:"Point",coordinates:i[0]}:{type:"MultiPoint",coordinates:i}:null;return i=[],t}},s={lineStart:u,point:function(t,e){i.push([t,e])},lineEnd:function(){i.length&&(a.push(i),i=[])},result:function(){var t=a.length?a.length<2?{type:"LineString",coordinates:a[0]}:{type:"MultiLineString",coordinates:a}:null;return a=[],t}},l={polygonStart:u,lineStart:u,point:function(t,e){i.push([t,e])},lineEnd:function(){var t=i.length;if(t){do{i.push(i[0].slice())}while(++t<4);a.push(i),i=[]}},polygonEnd:u,result:function(){if(!a.length)return null;var t=[],e=[];return a.forEach(function(r){!function(t){if((e=t.length)<4)return!1;for(var e,r=0,n=t[e-1][1]*t[0][0]-t[e-1][0]*t[0][1];++r<e;)n+=t[r-1][1]*t[r][0]-t[r-1][0]*t[r][1];return n<=0}(r)?e.push(r):t.push([r])}),e.forEach(function(e){var r=e[0];t.some(function(t){if(function(t,e){for(var r=e[0],n=e[1],i=!1,a=0,o=t.length,s=o-1;a<o;s=a++){var l=t[a],c=l[0],u=l[1],h=t[s],f=h[0],p=h[1];u>n^p>n&&r<(f-c)*(n-u)/(p-u)+c&&(i=!i)}return i}(t[0],r))return t.push(e),!0})||t.push([e])}),a=[],t.length?t.length>1?{type:"MultiPolygon",coordinates:t}:{type:"Polygon",coordinates:t[0]}:null}},c={Point:o,MultiPoint:o,LineString:s,MultiLineString:s,Polygon:l,MultiPolygon:l,Sphere:l};function u(){}var h=1e-6,f=h*h,p=Math.PI,d=p/2,g=(Math.sqrt(p),p/180),m=180/p;function v(t){return t>1?d:t<-1?-d:Math.asin(t)}function y(t){return t>1?0:t<-1?p:Math.acos(t)}var x=t.geo.projection,b=t.geo.projectionMutator;function _(t,e){var r=(2+d)*Math.sin(e);e/=2;for(var n=0,i=1/0;n<10&&Math.abs(i)>h;n++){var a=Math.cos(e);e-=i=(e+Math.sin(e)*(a+2)-r)/(2*a*(1+a))}return[2/Math.sqrt(p*(4+p))*t*(1+Math.cos(e)),2*Math.sqrt(p/(4+p))*Math.sin(e)]}t.geo.interrupt=function(e){var r,n=[[[[-p,0],[0,d],[p,0]]],[[[-p,0],[0,-d],[p,0]]]];function i(t,r){for(var i=r<0?-1:1,a=n[+(r<0)],o=0,s=a.length-1;o<s&&t>a[o][2][0];++o);var l=e(t-a[o][1][0],r);return l[0]+=e(a[o][1][0],i*r>i*a[o][0][1]?a[o][0][1]:r)[0],l}e.invert&&(i.invert=function(t,a){for(var o=r[+(a<0)],s=n[+(a<0)],c=0,u=o.length;c<u;++c){var h=o[c];if(h[0][0]<=t&&t<h[1][0]&&h[0][1]<=a&&a<h[1][1]){var f=e.invert(t-e(s[c][1][0],0)[0],a);return f[0]+=s[c][1][0],l(i(f[0],f[1]),[t,a])?f:null}}});var a=t.geo.projection(i),o=a.stream;function s(t,e){for(var r,n,i,a=-1,o=t.length,s=t[0],l=[];++a<o;){n=((r=t[a])[0]-s[0])/e,i=(r[1]-s[1])/e;for(var c=0;c<e;++c)l.push([s[0]+c*n,s[1]+c*i]);s=r}return l.push(r),l}function l(t,e){return Math.abs(t[0]-e[0])<h&&Math.abs(t[1]-e[1])<h}return a.stream=function(e){var r=a.rotate(),i=o(e),l=(a.rotate([0,0]),o(e));return a.rotate(r),i.sphere=function(){t.geo.stream(function(){for(var e=1e-6,r=[],i=0,a=n[0].length;i<a;++i){var o=n[0][i],l=180*o[0][0]/p,c=180*o[0][1]/p,u=180*o[1][1]/p,h=180*o[2][0]/p,f=180*o[2][1]/p;r.push(s([[l+e,c+e],[l+e,u-e],[h-e,u-e],[h-e,f+e]],30))}for(var i=n[1].length-1;i>=0;--i){var o=n[1][i],l=180*o[0][0]/p,c=180*o[0][1]/p,u=180*o[1][1]/p,h=180*o[2][0]/p,f=180*o[2][1]/p;r.push(s([[h-e,f-e],[h-e,u+e],[l+e,u+e],[l+e,c-e]],30))}return{type:"Polygon",coordinates:[t.merge(r)]}}(),l)},i},a.lobes=function(t){return arguments.length?(n=t.map(function(t){return t.map(function(t){return[[t[0][0]*p/180,t[0][1]*p/180],[t[1][0]*p/180,t[1][1]*p/180],[t[2][0]*p/180,t[2][1]*p/180]]})}),r=n.map(function(t){return t.map(function(t){var r,n=e(t[0][0],t[0][1])[0],i=e(t[2][0],t[2][1])[0],a=e(t[1][0],t[0][1])[1],o=e(t[1][0],t[1][1])[1];return a>o&&(r=a,a=o,o=r),[[n,a],[i,o]]})}),a):n.map(function(t){return t.map(function(t){return[[180*t[0][0]/p,180*t[0][1]/p],[180*t[1][0]/p,180*t[1][1]/p],[180*t[2][0]/p,180*t[2][1]/p]]})})},a},_.invert=function(t,e){var r=.5*e*Math.sqrt((4+p)/p),n=v(r),i=Math.cos(n);return[t/(2/Math.sqrt(p*(4+p))*(1+i)),v((n+r*(i+2))/(2+d))]},(t.geo.eckert4=function(){return x(_)}).raw=_;var w=t.geo.azimuthalEqualArea.raw;function k(t,e){if(arguments.length<2&&(e=t),1===e)return w;if(e===1/0)return M;function r(r,n){var i=w(r/e,n);return i[0]*=t,i}return r.invert=function(r,n){var i=w.invert(r/t,n);return i[0]*=e,i},r}function M(t,e){return[t*Math.cos(e)/Math.cos(e/=2),2*Math.sin(e)]}function A(t,e){return[3*t/(2*p)*Math.sqrt(p*p/3-e*e),e]}function T(t,e){return[t,1.25*Math.log(Math.tan(p/4+.4*e))]}function S(t){return function(e){var r,n=t*Math.sin(e),i=30;do{e-=r=(e+Math.sin(e)-n)/(1+Math.cos(e))}while(Math.abs(r)>h&&--i>0);return e/2}}M.invert=function(t,e){var r=2*v(e/2);return[t*Math.cos(r/2)/Math.cos(r),r]},(t.geo.hammer=function(){var t=2,e=b(k),r=e(t);return r.coefficient=function(r){return arguments.length?e(t=+r):t},r}).raw=k,A.invert=function(t,e){return[2/3*p*t/Math.sqrt(p*p/3-e*e),e]},(t.geo.kavrayskiy7=function(){return x(A)}).raw=A,T.invert=function(t,e){return[t,2.5*Math.atan(Math.exp(.8*e))-.625*p]},(t.geo.miller=function(){return x(T)}).raw=T,S(p);var E=function(t,e,r){var n=S(r);function i(r,i){return[t*r*Math.cos(i=n(i)),e*Math.sin(i)]}return i.invert=function(n,i){var a=v(i/e);return[n/(t*Math.cos(a)),v((2*a+Math.sin(2*a))/r)]},i}(Math.SQRT2/d,Math.SQRT2,p);function C(t,e){var r=e*e,n=r*r;return[t*(.8707-.131979*r+n*(n*(.003971*r-.001529*n)-.013791)),e*(1.007226+r*(.015085+n*(.028874*r-.044475-.005916*n)))]}(t.geo.mollweide=function(){return x(E)}).raw=E,C.invert=function(t,e){var r,n=e,i=25;do{var a=n*n,o=a*a;n-=r=(n*(1.007226+a*(.015085+o*(.028874*a-.044475-.005916*o)))-e)/(1.007226+a*(.045255+o*(.259866*a-.311325-.005916*11*o)))}while(Math.abs(r)>h&&--i>0);return[t/(.8707+(a=n*n)*(a*(a*a*a*(.003971-.001529*a)-.013791)-.131979)),n]},(t.geo.naturalEarth=function(){return x(C)}).raw=C;var L=[[.9986,-.062],[1,0],[.9986,.062],[.9954,.124],[.99,.186],[.9822,.248],[.973,.31],[.96,.372],[.9427,.434],[.9216,.4958],[.8962,.5571],[.8679,.6176],[.835,.6769],[.7986,.7346],[.7597,.7903],[.7186,.8435],[.6732,.8936],[.6213,.9394],[.5722,.9761],[.5322,1]];function z(t,e){var r,n=Math.min(18,36*Math.abs(e)/p),i=Math.floor(n),a=n-i,o=(r=L[i])[0],s=r[1],l=(r=L[++i])[0],c=r[1],u=(r=L[Math.min(19,++i)])[0],h=r[1];return[t*(l+a*(u-o)/2+a*a*(u-2*l+o)/2),(e>0?d:-d)*(c+a*(h-s)/2+a*a*(h-2*c+s)/2)]}function P(t,e){return[t*Math.cos(e),e]}function I(t,e){var r,n=Math.cos(e),i=(r=y(n*Math.cos(t/=2)))?r/Math.sin(r):1;return[2*n*Math.sin(t)*i,Math.sin(e)*i]}function O(t,e){var r=I(t,e);return[(r[0]+t/d)/2,(r[1]+e)/2]}L.forEach(function(t){t[1]*=1.0144}),z.invert=function(t,e){var r=e/d,n=90*r,i=Math.min(18,Math.abs(n/5)),a=Math.max(0,Math.floor(i));do{var o=L[a][1],s=L[a+1][1],l=L[Math.min(19,a+2)][1],c=l-o,u=l-2*s+o,h=2*(Math.abs(r)-s)/c,p=u/c,v=h*(1-p*h*(1-2*p*h));if(v>=0||1===a){n=(e>=0?5:-5)*(v+i);var y,x=50;do{v=(i=Math.min(18,Math.abs(n)/5))-(a=Math.floor(i)),o=L[a][1],s=L[a+1][1],l=L[Math.min(19,a+2)][1],n-=(y=(e>=0?d:-d)*(s+v*(l-o)/2+v*v*(l-2*s+o)/2)-e)*m}while(Math.abs(y)>f&&--x>0);break}}while(--a>=0);var b=L[a][0],_=L[a+1][0],w=L[Math.min(19,a+2)][0];return[t/(_+v*(w-b)/2+v*v*(w-2*_+b)/2),n*g]},(t.geo.robinson=function(){return x(z)}).raw=z,P.invert=function(t,e){return[t/Math.cos(e),e]},(t.geo.sinusoidal=function(){return x(P)}).raw=P,I.invert=function(t,e){if(!(t*t+4*e*e>p*p+h)){var r=t,n=e,i=25;do{var a,o=Math.sin(r),s=Math.sin(r/2),l=Math.cos(r/2),c=Math.sin(n),u=Math.cos(n),f=Math.sin(2*n),d=c*c,g=u*u,m=s*s,v=1-g*l*l,x=v?y(u*l)*Math.sqrt(a=1/v):a=0,b=2*x*u*s-t,_=x*c-e,w=a*(g*m+x*u*l*d),k=a*(.5*o*f-2*x*c*s),M=.25*a*(f*s-x*c*g*o),A=a*(d*l+x*m*u),T=k*M-A*w;if(!T)break;var S=(_*k-b*A)/T,E=(b*M-_*w)/T;r-=S,n-=E}while((Math.abs(S)>h||Math.abs(E)>h)&&--i>0);return[r,n]}},(t.geo.aitoff=function(){return x(I)}).raw=I,O.invert=function(t,e){var r=t,n=e,i=25;do{var a,o=Math.cos(n),s=Math.sin(n),l=Math.sin(2*n),c=s*s,u=o*o,f=Math.sin(r),p=Math.cos(r/2),g=Math.sin(r/2),m=g*g,v=1-u*p*p,x=v?y(o*p)*Math.sqrt(a=1/v):a=0,b=.5*(2*x*o*g+r/d)-t,_=.5*(x*s+n)-e,w=.5*a*(u*m+x*o*p*c)+.5/d,k=a*(f*l/4-x*s*g),M=.125*a*(l*g-x*s*u*f),A=.5*a*(c*p+x*m*o)+.5,T=k*M-A*w,S=(_*k-b*A)/T,E=(b*M-_*w)/T;r-=S,n-=E}while((Math.abs(S)>h||Math.abs(E)>h)&&--i>0);return[r,n]},(t.geo.winkel3=function(){return x(O)}).raw=O}},{}],767:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../lib"),a=Math.PI/180,o=180/Math.PI,s={cursor:"pointer"},l={cursor:"auto"};function c(t,e){return n.behavior.zoom().translate(e.translate()).scale(e.scale())}function u(t,e,r){var n=t.id,a=t.graphDiv,o=a.layout[n],s=a._fullLayout[n],l={};function c(t,e){var r=i.nestedProperty(s,t);r.get()!==e&&(r.set(e),i.nestedProperty(o,t).set(e),l[n+"."+t]=e)}r(c),c("projection.scale",e.scale()/t.fitScale),a.emit("plotly_relayout",l)}function h(t,e){var r=c(0,e);function i(r){var n=e.invert(t.midPt);r("center.lon",n[0]),r("center.lat",n[1])}return r.on("zoomstart",function(){n.select(this).style(s)}).on("zoom",function(){e.scale(n.event.scale).translate(n.event.translate),t.render()}).on("zoomend",function(){n.select(this).style(l),u(t,e,i)}),r}function f(t,e){var r,i,a,o,h,f,p,d,g,m=c(0,e),v=2;function y(t){return e.invert(t)}function x(r){var n=e.rotate(),i=e.invert(t.midPt);r("projection.rotation.lon",-n[0]),r("center.lon",i[0]),r("center.lat",i[1])}return m.on("zoomstart",function(){n.select(this).style(s),r=n.mouse(this),i=e.rotate(),a=e.translate(),o=i,h=y(r)}).on("zoom",function(){if(f=n.mouse(this),function(t){var r=y(t);if(!r)return!0;var n=e(r);return Math.abs(n[0]-t[0])>v||Math.abs(n[1]-t[1])>v}(r))return m.scale(e.scale()),void m.translate(e.translate());e.scale(n.event.scale),e.translate([a[0],n.event.translate[1]]),h?y(f)&&(d=y(f),p=[o[0]+(d[0]-h[0]),i[1],i[2]],e.rotate(p),o=p):h=y(r=f),g=!0,t.render()}).on("zoomend",function(){n.select(this).style(l),g&&u(t,e,x)}),m}function p(t,e){var r,i={r:e.rotate(),k:e.scale()},h=c(0,e),f=function(t){var e=0,r=arguments.length,i=[];for(;++e<r;)i.push(arguments[e]);var a=n.dispatch.apply(null,i);return a.of=function(e,r){return function(i){var o;try{o=i.sourceEvent=n.event,i.target=t,n.event=i,a[i.type].apply(e,r)}finally{n.event=o}}},a}(h,"zoomstart","zoom","zoomend"),p=0,m=h.on;function x(t){var r=e.rotate();t("projection.rotation.lon",-r[0]),t("projection.rotation.lat",-r[1])}return h.on("zoomstart",function(){n.select(this).style(s);var t,l,c,u,x,b,_,w,k,M,A,T=n.mouse(this),S=e.rotate(),E=S,C=e.translate(),L=(l=.5*(t=S)[0]*a,c=.5*t[1]*a,u=.5*t[2]*a,x=Math.sin(l),b=Math.cos(l),_=Math.sin(c),w=Math.cos(c),k=Math.sin(u),M=Math.cos(u),[b*w*M+x*_*k,x*w*M-b*_*k,b*_*M+x*w*k,b*w*k-x*_*M]);r=d(e,T),m.call(h,"zoom",function(){var t,a,s,l,c,u,h,p,m,x,b=n.mouse(this);if(e.scale(i.k=n.event.scale),r){if(d(e,b)){e.rotate(S).translate(C);var _=d(e,b),w=function(t,e){if(!t||!e)return;var r=function(t,e){return[t[1]*e[2]-t[2]*e[1],t[2]*e[0]-t[0]*e[2],t[0]*e[1]-t[1]*e[0]]}(t,e),n=Math.sqrt(y(r,r)),i=.5*Math.acos(Math.max(-1,Math.min(1,y(t,e)))),a=Math.sin(i)/n;return n&&[Math.cos(i),r[2]*a,-r[1]*a,r[0]*a]}(r,_),k=function(t){return[Math.atan2(2*(t[0]*t[1]+t[2]*t[3]),1-2*(t[1]*t[1]+t[2]*t[2]))*o,Math.asin(Math.max(-1,Math.min(1,2*(t[0]*t[2]-t[3]*t[1]))))*o,Math.atan2(2*(t[0]*t[3]+t[1]*t[2]),1-2*(t[2]*t[2]+t[3]*t[3]))*o]}((a=w,s=(t=L)[0],l=t[1],c=t[2],u=t[3],h=a[0],p=a[1],m=a[2],x=a[3],[s*h-l*p-c*m-u*x,s*p+l*h+c*x-u*m,s*m-l*x+c*h+u*p,s*x+l*m-c*p+u*h])),M=i.r=function(t,e,r){var n=v(e,2,t[0]);n=v(n,1,t[1]),n=v(n,0,t[2]-r[2]);var i,a,s=e[0],l=e[1],c=e[2],u=n[0],h=n[1],f=n[2],p=Math.atan2(l,s)*o,d=Math.sqrt(s*s+l*l);Math.abs(h)>d?(a=(h>0?90:-90)-p,i=0):(a=Math.asin(h/d)*o-p,i=Math.sqrt(d*d-h*h));var m=180-a-2*p,y=(Math.atan2(f,u)-Math.atan2(c,i))*o,x=(Math.atan2(f,u)-Math.atan2(c,-i))*o,b=g(r[0],r[1],a,y),_=g(r[0],r[1],m,x);return b<=_?[a,y,r[2]]:[m,x,r[2]]}(k,r,E);isFinite(M[0])&&isFinite(M[1])&&isFinite(M[2])||(M=E),e.rotate(M),E=M}}else r=d(e,T=b);f.of(this,arguments)({type:"zoom"})}),A=f.of(this,arguments),p++||A({type:"zoomstart"})}).on("zoomend",function(){var r;n.select(this).style(l),m.call(h,"zoom",null),r=f.of(this,arguments),--p||r({type:"zoomend"}),u(t,e,x)}).on("zoom.redraw",function(){t.render()}),n.rebind(h,f,"on")}function d(t,e){var r=t.invert(e);return r&&isFinite(r[0])&&isFinite(r[1])&&function(t){var e=t[0]*a,r=t[1]*a,n=Math.cos(r);return[n*Math.cos(e),n*Math.sin(e),Math.sin(r)]}(r)}function g(t,e,r,n){var i=m(r-t),a=m(n-e);return Math.sqrt(i*i+a*a)}function m(t){return(t%360+540)%360-180}function v(t,e,r){var n=r*a,i=t.slice(),o=0===e?1:0,s=2===e?1:2,l=Math.cos(n),c=Math.sin(n);return i[o]=t[o]*l-t[s]*c,i[s]=t[s]*l+t[o]*c,i}function y(t,e){for(var r=0,n=0,i=t.length;n<i;++n)r+=t[n]*e[n];return r}e.exports=function(t,e){var r=t.projection;return(e._isScoped?h:e._isClipped?p:f)(t,r)}},{"../../lib":684,d3:147}],768:[function(t,e,r){"use strict";var n=t("../registry"),i=t("./cartesian/constants").SUBPLOT_PATTERN;r.getSubplotCalcData=function(t,e,r){var i=n.subplotsRegistry[e];if(!i)return[];for(var a=i.attr,o=[],s=0;s<t.length;s++){var l=t[s];l[0].trace[a]===r&&o.push(l)}return o},r.getModuleCalcData=function(t,e){var r,i=[],a=[];if(!(r="string"==typeof e?n.getModule(e).plot:"function"==typeof e?e:e.plot))return[i,t];for(var o=0;o<t.length;o++){var s=t[o],l=s[0].trace;!0===l.visible&&(l._module.plot===r?i.push(s):a.push(s))}return[i,a]},r.getSubplotData=function(t,e,r){if(!n.subplotsRegistry[e])return[];var a,o,s,l=n.subplotsRegistry[e].attr,c=[];if("gl2d"===e){var u=r.match(i);o="x"+u[1],s="y"+u[2]}for(var h=0;h<t.length;h++)a=t[h],"gl2d"===e&&n.traceIs(a,"gl2d")?a[l[0]]===o&&a[l[1]]===s&&c.push(a):a[l]===r&&c.push(a);return c},r.getUidsFromCalcData=function(t){for(var e={},r=0;r<t.length;r++){e[t[r][0].trace.uid]=1}return e}},{"../registry":817,"./cartesian/constants":737}],769:[function(t,e,r){"use strict";var n=t("mouse-change"),i=t("mouse-wheel"),a=t("mouse-event-offset"),o=t("../cartesian/constants"),s=t("has-passive-events");function l(t,e){this.element=t,this.plot=e,this.mouseListener=null,this.wheelListener=null,this.lastInputTime=Date.now(),this.lastPos=[0,0],this.boxEnabled=!1,this.boxInited=!1,this.boxStart=[0,0],this.boxEnd=[0,0],this.dragStart=[0,0]}e.exports=function(t){var e=t.mouseContainer,r=t.glplot,c=new l(e,r);function u(){t.xaxis.autorange=!1,t.yaxis.autorange=!1}function h(e,n,i){var a,s,l=t.calcDataBox(),h=r.viewBox,f=c.lastPos[0],p=c.lastPos[1],d=o.MINDRAG*r.pixelRatio,g=o.MINZOOM*r.pixelRatio;function m(e,r,n){var i=Math.min(r,n),a=Math.max(r,n);i!==a?(l[e]=i,l[e+2]=a,c.dataBox=l,t.setRanges(l)):(t.selectBox.selectBox=[0,0,1,1],t.glplot.setDirty())}switch(n*=r.pixelRatio,i*=r.pixelRatio,i=h[3]-h[1]-i,t.fullLayout.dragmode){case"zoom":if(e){var v=n/(h[2]-h[0])*(l[2]-l[0])+l[0],y=i/(h[3]-h[1])*(l[3]-l[1])+l[1];c.boxInited||(c.boxStart[0]=v,c.boxStart[1]=y,c.dragStart[0]=n,c.dragStart[1]=i),c.boxEnd[0]=v,c.boxEnd[1]=y,c.boxInited=!0,c.boxEnabled||c.boxStart[0]===c.boxEnd[0]&&c.boxStart[1]===c.boxEnd[1]||(c.boxEnabled=!0);var x=Math.abs(c.dragStart[0]-n)<g,b=Math.abs(c.dragStart[1]-i)<g;if(!function(){for(var e=t.graphDiv._fullLayout._axisConstraintGroups,r=t.xaxis._id,n=t.yaxis._id,i=0;i<e.length;i++)if(-1!==e[i][r]){if(-1!==e[i][n])return!0;break}return!1}()||x&&b)x&&(c.boxEnd[0]=c.boxStart[0]),b&&(c.boxEnd[1]=c.boxStart[1]);else{a=c.boxEnd[0]-c.boxStart[0],s=c.boxEnd[1]-c.boxStart[1];var _=(l[3]-l[1])/(l[2]-l[0]);Math.abs(a*_)>Math.abs(s)?(c.boxEnd[1]=c.boxStart[1]+Math.abs(a)*_*(s>=0?1:-1),c.boxEnd[1]<l[1]?(c.boxEnd[1]=l[1],c.boxEnd[0]=c.boxStart[0]+(l[1]-c.boxStart[1])/Math.abs(_)):c.boxEnd[1]>l[3]&&(c.boxEnd[1]=l[3],c.boxEnd[0]=c.boxStart[0]+(l[3]-c.boxStart[1])/Math.abs(_))):(c.boxEnd[0]=c.boxStart[0]+Math.abs(s)/_*(a>=0?1:-1),c.boxEnd[0]<l[0]?(c.boxEnd[0]=l[0],c.boxEnd[1]=c.boxStart[1]+(l[0]-c.boxStart[0])*Math.abs(_)):c.boxEnd[0]>l[2]&&(c.boxEnd[0]=l[2],c.boxEnd[1]=c.boxStart[1]+(l[2]-c.boxStart[0])*Math.abs(_)))}}else c.boxEnabled?(a=c.boxStart[0]!==c.boxEnd[0],s=c.boxStart[1]!==c.boxEnd[1],a||s?(a&&(m(0,c.boxStart[0],c.boxEnd[0]),t.xaxis.autorange=!1),s&&(m(1,c.boxStart[1],c.boxEnd[1]),t.yaxis.autorange=!1),t.relayoutCallback()):t.glplot.setDirty(),c.boxEnabled=!1,c.boxInited=!1):c.boxInited&&(c.boxInited=!1);break;case"pan":c.boxEnabled=!1,c.boxInited=!1,e?(c.panning||(c.dragStart[0]=n,c.dragStart[1]=i),Math.abs(c.dragStart[0]-n)<d&&(n=c.dragStart[0]),Math.abs(c.dragStart[1]-i)<d&&(i=c.dragStart[1]),a=(f-n)*(l[2]-l[0])/(r.viewBox[2]-r.viewBox[0]),s=(p-i)*(l[3]-l[1])/(r.viewBox[3]-r.viewBox[1]),l[0]+=a,l[2]+=a,l[1]+=s,l[3]+=s,t.setRanges(l),c.panning=!0,c.lastInputTime=Date.now(),u(),t.cameraChanged(),t.handleAnnotations()):c.panning&&(c.panning=!1,t.relayoutCallback())}c.lastPos[0]=n,c.lastPos[1]=i}return c.mouseListener=n(e,h),e.addEventListener("touchstart",function(t){var r=a(t.changedTouches[0],e);h(0,r[0],r[1]),h(1,r[0],r[1]),t.preventDefault()},!!s&&{passive:!1}),e.addEventListener("touchmove",function(t){t.preventDefault();var r=a(t.changedTouches[0],e);h(1,r[0],r[1]),t.preventDefault()},!!s&&{passive:!1}),e.addEventListener("touchend",function(t){h(0,c.lastPos[0],c.lastPos[1]),t.preventDefault()},!!s&&{passive:!1}),c.wheelListener=i(e,function(e,n){if(!t.scrollZoom)return!1;var i=t.calcDataBox(),a=r.viewBox,o=c.lastPos[0],s=c.lastPos[1],l=Math.exp(5*n/(a[3]-a[1])),h=o/(a[2]-a[0])*(i[2]-i[0])+i[0],f=s/(a[3]-a[1])*(i[3]-i[1])+i[1];return i[0]=(i[0]-h)*l+h,i[2]=(i[2]-h)*l+h,i[1]=(i[1]-f)*l+f,i[3]=(i[3]-f)*l+f,t.setRanges(i),c.lastInputTime=Date.now(),u(),t.cameraChanged(),t.handleAnnotations(),t.relayoutCallback(),!0},!0),c}},{"../cartesian/constants":737,"has-passive-events":379,"mouse-change":402,"mouse-event-offset":403,"mouse-wheel":405}],770:[function(t,e,r){"use strict";var n=t("../cartesian/axes"),i=t("../../lib/html2unicode"),a=t("../../lib/str2rgbarray");function o(t){this.scene=t,this.gl=t.gl,this.pixelRatio=t.pixelRatio,this.screenBox=[0,0,1,1],this.viewBox=[0,0,1,1],this.dataBox=[-1,-1,1,1],this.borderLineEnable=[!1,!1,!1,!1],this.borderLineWidth=[1,1,1,1],this.borderLineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.ticks=[[],[]],this.tickEnable=[!0,!0,!1,!1],this.tickPad=[15,15,15,15],this.tickAngle=[0,0,0,0],this.tickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.tickMarkLength=[0,0,0,0],this.tickMarkWidth=[0,0,0,0],this.tickMarkColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.labels=["x","y"],this.labelEnable=[!0,!0,!1,!1],this.labelAngle=[0,Math.PI/2,0,3*Math.PI/2],this.labelPad=[15,15,15,15],this.labelSize=[12,12],this.labelFont=["sans-serif","sans-serif"],this.labelColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.title="",this.titleEnable=!0,this.titleCenter=[0,0,0,0],this.titleAngle=0,this.titleColor=[0,0,0,1],this.titleFont="sans-serif",this.titleSize=18,this.gridLineEnable=[!0,!0],this.gridLineColor=[[0,0,0,.5],[0,0,0,.5]],this.gridLineWidth=[1,1],this.zeroLineEnable=[!0,!0],this.zeroLineWidth=[1,1],this.zeroLineColor=[[0,0,0,1],[0,0,0,1]],this.borderColor=!1,this.backgroundColor=[0,0,0,0],this.static=this.scene.staticPlot}var s=o.prototype,l=["xaxis","yaxis"];s.merge=function(t){var e,r,n,o,s,c,u,h,f,p,d;for(this.titleEnable=!1,this.backgroundColor=a(t.plot_bgcolor),p=0;p<2;++p){var g=(e=l[p]).charAt(0);for(n=(r=t[this.scene[e]._name]).title===this.scene.fullLayout._dfltTitle[g]?"":r.title,d=0;d<=2;d+=2)this.labelEnable[p+d]=!1,this.labels[p+d]=i(n),this.labelColor[p+d]=a(r.titlefont.color),this.labelFont[p+d]=r.titlefont.family,this.labelSize[p+d]=r.titlefont.size,this.labelPad[p+d]=this.getLabelPad(e,r),this.tickEnable[p+d]=!1,this.tickColor[p+d]=a((r.tickfont||{}).color),this.tickAngle[p+d]="auto"===r.tickangle?0:Math.PI*-r.tickangle/180,this.tickPad[p+d]=this.getTickPad(r),this.tickMarkLength[p+d]=0,this.tickMarkWidth[p+d]=r.tickwidth||0,this.tickMarkColor[p+d]=a(r.tickcolor),this.borderLineEnable[p+d]=!1,this.borderLineColor[p+d]=a(r.linecolor),this.borderLineWidth[p+d]=r.linewidth||0;u=this.hasSharedAxis(r),s=this.hasAxisInDfltPos(e,r)&&!u,c=this.hasAxisInAltrPos(e,r)&&!u,o=r.mirror||!1,h=u?-1!==String(o).indexOf("all"):!!o,f=u?"allticks"===o:-1!==String(o).indexOf("ticks"),s?this.labelEnable[p]=!0:c&&(this.labelEnable[p+2]=!0),s?this.tickEnable[p]=r.showticklabels:c&&(this.tickEnable[p+2]=r.showticklabels),(s||h)&&(this.borderLineEnable[p]=r.showline),(c||h)&&(this.borderLineEnable[p+2]=r.showline),(s||f)&&(this.tickMarkLength[p]=this.getTickMarkLength(r)),(c||f)&&(this.tickMarkLength[p+2]=this.getTickMarkLength(r)),this.gridLineEnable[p]=r.showgrid,this.gridLineColor[p]=a(r.gridcolor),this.gridLineWidth[p]=r.gridwidth,this.zeroLineEnable[p]=r.zeroline,this.zeroLineColor[p]=a(r.zerolinecolor),this.zeroLineWidth[p]=r.zerolinewidth}},s.hasSharedAxis=function(t){var e=this.scene,r=e.fullLayout._subplots.gl2d;return 0!==n.findSubplotsWithAxis(r,t).indexOf(e.id)},s.hasAxisInDfltPos=function(t,e){var r=e.side;return"xaxis"===t?"bottom"===r:"yaxis"===t?"left"===r:void 0},s.hasAxisInAltrPos=function(t,e){var r=e.side;return"xaxis"===t?"top"===r:"yaxis"===t?"right"===r:void 0},s.getLabelPad=function(t,e){var r=e.titlefont.size,n=e.showticklabels;return"xaxis"===t?"top"===e.side?r*(1.5+(n?1:0))-10:r*(1.5+(n?.5:0))-10:"yaxis"===t?"right"===e.side?10+r*(1.5+(n?1:.5)):10+r*(1.5+(n?.5:0)):void 0},s.getTickPad=function(t){return"outside"===t.ticks?10+t.ticklen:15},s.getTickMarkLength=function(t){if(!t.ticks)return 0;var e=t.ticklen;return"inside"===t.ticks?-e:e},e.exports=function(t){return new o(t)}},{"../../lib/html2unicode":682,"../../lib/str2rgbarray":707,"../cartesian/axes":732}],771:[function(t,e,r){"use strict";var n=t("../../plot_api/edit_types").overrideAll,i=t("./scene2d"),a=t("../layout_attributes"),o=t("../../constants/xmlns_namespaces"),s=t("../cartesian/constants"),l=t("../cartesian"),c=t("../../components/fx/layout_attributes"),u=t("../get_data").getSubplotData;r.name="gl2d",r.attr=["xaxis","yaxis"],r.idRoot=["x","y"],r.idRegex=s.idRegex,r.attrRegex=s.attrRegex,r.attributes=t("../cartesian/attributes"),r.supplyLayoutDefaults=function(t,e,r){e._has("cartesian")||l.supplyLayoutDefaults(t,e,r)},r.layoutAttrOverrides=n(l.layoutAttributes,"plot","from-root"),r.baseLayoutAttrOverrides=n({plot_bgcolor:a.plot_bgcolor,hoverlabel:c.hoverlabel},"plot","nested"),r.plot=function(t){for(var e=t._fullLayout,r=t._fullData,n=e._subplots.gl2d,a=0;a<n.length;a++){var o=n[a],s=e._plots[o],l=u(r,"gl2d",o),c=s._scene2d;void 0===c&&(c=new i({id:o,graphDiv:t,container:t.querySelector(".gl-container"),staticPlot:t._context.staticPlot,plotGlPixelRatio:t._context.plotGlPixelRatio},e),s._scene2d=c),c.plot(l,t.calcdata,e,t.layout)}},r.clean=function(t,e,r,n){for(var i=n._subplots.gl2d||[],a=0;a<i.length;a++){var o=i[a],s=n._plots[o];if(s._scene2d)0===u(t,"gl2d",o).length&&(s._scene2d.destroy(),delete n._plots[o])}l.clean.apply(this,arguments)},r.drawFramework=function(t){t._context.staticPlot||l.drawFramework(t)},r.toSVG=function(t){for(var e=t._fullLayout,r=e._subplots.gl2d,n=0;n<r.length;n++){var i=e._plots[r[n]]._scene2d,a=i.toImage("png");e._glimages.append("svg:image").attr({xmlns:o.svg,"xlink:href":a,x:0,y:0,width:"100%",height:"100%",preserveAspectRatio:"none"}),i.destroy()}},r.updateFx=function(t){for(var e=t._subplots.gl2d,r=0;r<e.length;r++){t._plots[e[r]]._scene2d.updateFx(t.dragmode)}}},{"../../components/fx/layout_attributes":601,"../../constants/xmlns_namespaces":663,"../../plot_api/edit_types":715,"../cartesian":743,"../cartesian/attributes":730,"../cartesian/constants":737,"../get_data":768,"../layout_attributes":786,"./scene2d":772}],772:[function(t,e,r){"use strict";var n,i,a=t("../../registry"),o=t("../../plots/cartesian/axes"),s=t("../../components/fx"),l=t("gl-plot2d"),c=t("gl-spikes2d"),u=t("gl-select-box"),h=t("webgl-context"),f=t("./convert"),p=t("./camera"),d=t("../../lib/html2unicode"),g=t("../../lib/show_no_webgl_msg"),m=t("../cartesian/constraints"),v=m.enforce,y=m.clean,x=t("../cartesian/autorange").doAutoRange,b=["xaxis","yaxis"],_=t("../cartesian/constants").SUBPLOT_PATTERN;function w(t,e){this.container=t.container,this.graphDiv=t.graphDiv,this.pixelRatio=t.plotGlPixelRatio||window.devicePixelRatio,this.id=t.id,this.staticPlot=!!t.staticPlot,this.scrollZoom=this.graphDiv._context.scrollZoom,this.fullData=null,this.updateRefs(e),this.makeFramework(),this.stopped||(this.glplotOptions=f(this),this.glplotOptions.merge(e),this.glplot=l(this.glplotOptions),this.camera=p(this),this.traces={},this.spikes=c(this.glplot),this.selectBox=u(this.glplot,{innerFill:!1,outerFill:!0}),this.lastButtonState=0,this.pickResult=null,this.isMouseOver=!0,this.stopped=!1,this.redraw=this.draw.bind(this),this.redraw())}e.exports=w;var k=w.prototype;k.makeFramework=function(){if(this.staticPlot){if(!(i||(n=document.createElement("canvas"),i=h({canvas:n,preserveDrawingBuffer:!1,premultipliedAlpha:!0,antialias:!0}))))throw new Error("Error creating static canvas/context for image server");this.canvas=n,this.gl=i}else{var t=this.container.querySelector(".gl-canvas-focus"),e=h({canvas:t,preserveDrawingBuffer:!0,premultipliedAlpha:!0});if(!e)return g(this),void(this.stopped=!0);this.canvas=t,this.gl=e}var r=this.canvas;r.style.width="100%",r.style.height="100%",r.style.position="absolute",r.style.top="0px",r.style.left="0px",r.style["pointer-events"]="none",this.updateSize(r),r.className+=" user-select-none";var a=this.svgContainer=document.createElementNS("http://www.w3.org/2000/svg","svg");a.style.position="absolute",a.style.top=a.style.left="0px",a.style.width=a.style.height="100%",a.style["z-index"]=20,a.style["pointer-events"]="none";var o=this.mouseContainer=document.createElement("div");o.style.position="absolute",o.style["pointer-events"]="auto",this.pickCanvas=this.container.querySelector(".gl-canvas-pick");var s=this.container;s.appendChild(a),s.appendChild(o);var l=this;o.addEventListener("mouseout",function(){l.isMouseOver=!1,l.unhover()}),o.addEventListener("mouseover",function(){l.isMouseOver=!0})},k.toImage=function(t){t||(t="png"),this.stopped=!0,this.staticPlot&&this.container.appendChild(n),this.updateSize(this.canvas);var e=this.glplot.gl,r=e.drawingBufferWidth,i=e.drawingBufferHeight;e.clearColor(1,1,1,0),e.clear(e.COLOR_BUFFER_BIT|e.DEPTH_BUFFER_BIT),this.glplot.setDirty(),this.glplot.draw(),e.bindFramebuffer(e.FRAMEBUFFER,null);var a=new Uint8Array(r*i*4);e.readPixels(0,0,r,i,e.RGBA,e.UNSIGNED_BYTE,a);for(var o=0,s=i-1;o<s;++o,--s)for(var l=0;l<r;++l)for(var c=0;c<4;++c){var u=a[4*(r*o+l)+c];a[4*(r*o+l)+c]=a[4*(r*s+l)+c],a[4*(r*s+l)+c]=u}var h=document.createElement("canvas");h.width=r,h.height=i;var f,p=h.getContext("2d"),d=p.createImageData(r,i);switch(d.data.set(a),p.putImageData(d,0,0),t){case"jpeg":f=h.toDataURL("image/jpeg");break;case"webp":f=h.toDataURL("image/webp");break;default:f=h.toDataURL("image/png")}return this.staticPlot&&this.container.removeChild(n),f},k.updateSize=function(t){t||(t=this.canvas);var e=this.pixelRatio,r=this.fullLayout,n=r.width,i=r.height,a=0|Math.ceil(e*n),o=0|Math.ceil(e*i);return t.width===a&&t.height===o||(t.width=a,t.height=o),t},k.computeTickMarks=function(){this.xaxis.setScale(),this.yaxis.setScale();for(var t=[o.calcTicks(this.xaxis),o.calcTicks(this.yaxis)],e=0;e<2;++e)for(var r=0;r<t[e].length;++r)t[e][r].text=d(t[e][r].text+"");return t},k.updateRefs=function(t){this.fullLayout=t;var e=this.id.match(_),r="xaxis"+e[1],n="yaxis"+e[2];this.xaxis=this.fullLayout[r],this.yaxis=this.fullLayout[n]},k.relayoutCallback=function(){var t=this.graphDiv,e=this.xaxis,r=this.yaxis,n=t.layout;n.xaxis.autorange=e.autorange,n.xaxis.range=e.range.slice(0),n.yaxis.autorange=r.autorange,n.yaxis.range=r.range.slice(0);var i={lastInputTime:this.camera.lastInputTime};i[e._name]=e.range.slice(0),i[r._name]=r.range.slice(0),t.emit("plotly_relayout",i)},k.cameraChanged=function(){var t=this.camera;this.glplot.setDataBox(this.calcDataBox());var e=this.computeTickMarks();(function(t,e){for(var r=0;r<2;++r){var n=t[r],i=e[r];if(n.length!==i.length)return!0;for(var a=0;a<n.length;++a)if(n[a].x!==i[a].x)return!0}return!1})(e,this.glplotOptions.ticks)&&(this.glplotOptions.ticks=e,this.glplotOptions.dataBox=t.dataBox,this.glplot.update(this.glplotOptions),this.handleAnnotations())},k.handleAnnotations=function(){for(var t=this.graphDiv,e=this.fullLayout.annotations,r=0;r<e.length;r++){var n=e[r];n.xref===this.xaxis._id&&n.yref===this.yaxis._id&&a.getComponentMethod("annotations","drawOne")(t,r)}},k.destroy=function(){if(this.glplot){var t=this.traces;t&&Object.keys(t).map(function(e){t[e].dispose(),delete t[e]}),this.glplot.dispose(),this.container.removeChild(this.svgContainer),this.container.removeChild(this.mouseContainer),this.fullData=null,this.glplot=null,this.stopped=!0,this.camera.mouseListener.enabled=!1,this.mouseContainer.removeEventListener("wheel",this.camera.wheelListener),this.camera=null}},k.plot=function(t,e,r){var n=this.glplot;this.updateRefs(r),this.xaxis.clearCalc(),this.yaxis.clearCalc(),this.updateTraces(t,e),this.updateFx(r.dragmode);var i=r.width,a=r.height;this.updateSize(this.canvas);var o=this.glplotOptions;o.merge(r),o.screenBox=[0,0,i,a];var s={_fullLayout:{_axisConstraintGroups:this.graphDiv._fullLayout._axisConstraintGroups,xaxis:this.xaxis,yaxis:this.yaxis}};y(s,this.xaxis),y(s,this.yaxis);var l,c,u=r._size,h=this.xaxis.domain,f=this.yaxis.domain;for(o.viewBox=[u.l+h[0]*u.w,u.b+f[0]*u.h,i-u.r-(1-h[1])*u.w,a-u.t-(1-f[1])*u.h],this.mouseContainer.style.width=u.w*(h[1]-h[0])+"px",this.mouseContainer.style.height=u.h*(f[1]-f[0])+"px",this.mouseContainer.height=u.h*(f[1]-f[0]),this.mouseContainer.style.left=u.l+h[0]*u.w+"px",this.mouseContainer.style.top=u.t+(1-f[1])*u.h+"px",c=0;c<2;++c)(l=this[b[c]])._length=o.viewBox[c+2]-o.viewBox[c],x(l),l.setScale();v(s),o.ticks=this.computeTickMarks(),o.dataBox=this.calcDataBox(),o.merge(r),n.update(o),this.glplot.draw()},k.calcDataBox=function(){var t=this.xaxis,e=this.yaxis,r=t.range,n=e.range,i=t.r2l,a=e.r2l;return[i(r[0]),a(n[0]),i(r[1]),a(n[1])]},k.setRanges=function(t){var e=this.xaxis,r=this.yaxis,n=e.l2r,i=r.l2r;e.range=[n(t[0]),n(t[2])],r.range=[i(t[1]),i(t[3])]},k.updateTraces=function(t,e){var r,n,i,a=Object.keys(this.traces);this.fullData=t;t:for(r=0;r<a.length;r++){var o=a[r],s=this.traces[o];for(n=0;n<t.length;n++)if((i=t[n]).uid===o&&i.type===s.type)continue t;s.dispose(),delete this.traces[o]}for(r=0;r<t.length;r++){i=t[r];var l=e[r],c=this.traces[i.uid];c?c.update(i,l):(c=i._module.plot(this,i,l),this.traces[i.uid]=c)}this.glplot.objects.sort(function(t,e){return t._trace.index-e._trace.index})},k.updateFx=function(t){"lasso"===t||"select"===t?(this.pickCanvas.style["pointer-events"]="none",this.mouseContainer.style["pointer-events"]="none"):(this.pickCanvas.style["pointer-events"]="auto",this.mouseContainer.style["pointer-events"]="auto"),this.mouseContainer.style.cursor="pan"===t?"move":"zoom"===t?"crosshair":null},k.emitPointAction=function(t,e){for(var r,n=t.trace.uid,i=t.pointIndex,a=0;a<this.fullData.length;a++)this.fullData[a].uid===n&&(r=this.fullData[a]);var o={x:t.traceCoord[0],y:t.traceCoord[1],curveNumber:r.index,pointNumber:i,data:r._input,fullData:this.fullData,xaxis:this.xaxis,yaxis:this.yaxis};s.appendArrayPointValue(o,r,i),this.graphDiv.emit(e,{points:[o]})},k.draw=function(){if(!this.stopped){requestAnimationFrame(this.redraw);var t=this.glplot,e=this.camera,r=e.mouseListener,n=1===this.lastButtonState&&0===r.buttons,i=this.fullLayout;this.lastButtonState=r.buttons,this.cameraChanged();var a,o=r.x*t.pixelRatio,l=this.canvas.height-t.pixelRatio*r.y;if(e.boxEnabled&&"zoom"===i.dragmode){this.selectBox.enabled=!0;for(var c=this.selectBox.selectBox=[Math.min(e.boxStart[0],e.boxEnd[0]),Math.min(e.boxStart[1],e.boxEnd[1]),Math.max(e.boxStart[0],e.boxEnd[0]),Math.max(e.boxStart[1],e.boxEnd[1])],u=0;u<2;u++)e.boxStart[u]===e.boxEnd[u]&&(c[u]=t.dataBox[u],c[u+2]=t.dataBox[u+2]);t.setDirty()}else if(!e.panning&&this.isMouseOver){this.selectBox.enabled=!1;var h=i._size,f=this.xaxis.domain,p=this.yaxis.domain,d=(a=t.pick(o/t.pixelRatio+h.l+f[0]*h.w,l/t.pixelRatio-(h.t+(1-p[1])*h.h)))&&a.object._trace.handlePick(a);if(d&&n&&this.emitPointAction(d,"plotly_click"),a&&"skip"!==a.object._trace.hoverinfo&&i.hovermode&&d&&(!this.lastPickResult||this.lastPickResult.traceUid!==d.trace.uid||this.lastPickResult.dataCoord[0]!==d.dataCoord[0]||this.lastPickResult.dataCoord[1]!==d.dataCoord[1])){var g=d;this.lastPickResult={traceUid:d.trace?d.trace.uid:null,dataCoord:d.dataCoord.slice()},this.spikes.update({center:a.dataCoord}),g.screenCoord=[((t.viewBox[2]-t.viewBox[0])*(a.dataCoord[0]-t.dataBox[0])/(t.dataBox[2]-t.dataBox[0])+t.viewBox[0])/t.pixelRatio,(this.canvas.height-(t.viewBox[3]-t.viewBox[1])*(a.dataCoord[1]-t.dataBox[1])/(t.dataBox[3]-t.dataBox[1])-t.viewBox[1])/t.pixelRatio],this.emitPointAction(d,"plotly_hover");var m=this.fullData[g.trace.index]||{},v=g.pointIndex,y=s.castHoverinfo(m,i,v);if(y&&"all"!==y){var x=y.split("+");-1===x.indexOf("x")&&(g.traceCoord[0]=void 0),-1===x.indexOf("y")&&(g.traceCoord[1]=void 0),-1===x.indexOf("z")&&(g.traceCoord[2]=void 0),-1===x.indexOf("text")&&(g.textLabel=void 0),-1===x.indexOf("name")&&(g.name=void 0)}s.loneHover({x:g.screenCoord[0],y:g.screenCoord[1],xLabel:this.hoverFormatter("xaxis",g.traceCoord[0]),yLabel:this.hoverFormatter("yaxis",g.traceCoord[1]),zLabel:g.traceCoord[2],text:g.textLabel,name:g.name,color:s.castHoverOption(m,v,"bgcolor")||g.color,borderColor:s.castHoverOption(m,v,"bordercolor"),fontFamily:s.castHoverOption(m,v,"font.family"),fontSize:s.castHoverOption(m,v,"font.size"),fontColor:s.castHoverOption(m,v,"font.color")},{container:this.svgContainer,gd:this.graphDiv})}}a||this.unhover(),t.draw()}},k.unhover=function(){this.lastPickResult&&(this.spikes.update({}),this.lastPickResult=null,this.graphDiv.emit("plotly_unhover"),s.loneUnhover(this.svgContainer))},k.hoverFormatter=function(t,e){if(void 0!==e){var r=this[t];return o.tickText(r,r.c2l(e),"hover").text}}},{"../../components/fx":600,"../../lib/html2unicode":682,"../../lib/show_no_webgl_msg":705,"../../plots/cartesian/axes":732,"../../registry":817,"../cartesian/autorange":731,"../cartesian/constants":737,"../cartesian/constraints":739,"./camera":769,"./convert":770,"gl-plot2d":275,"gl-select-box":285,"gl-spikes2d":294,"webgl-context":521}],773:[function(t,e,r){"use strict";e.exports=function(t,e){t=t||document.body,e=e||{};var r=[.01,1/0];"distanceLimits"in e&&(r[0]=e.distanceLimits[0],r[1]=e.distanceLimits[1]);"zoomMin"in e&&(r[0]=e.zoomMin);"zoomMax"in e&&(r[1]=e.zoomMax);var c=i({center:e.center||[0,0,0],up:e.up||[0,1,0],eye:e.eye||[0,0,10],mode:e.mode||"orbit",distanceLimits:r}),u=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0],h=0,f=t.clientWidth,p=t.clientHeight,d={keyBindingMode:"rotate",view:c,element:t,delay:e.delay||16,rotateSpeed:e.rotateSpeed||1,zoomSpeed:e.zoomSpeed||1,translateSpeed:e.translateSpeed||1,flipX:!!e.flipX,flipY:!!e.flipY,modes:c.modes,tick:function(){var e=n(),r=this.delay,i=e-2*r;c.idle(e-r),c.recalcMatrix(i),c.flush(e-(100+2*r));for(var a=!0,o=c.computedMatrix,s=0;s<16;++s)a=a&&u[s]===o[s],u[s]=o[s];var l=t.clientWidth===f&&t.clientHeight===p;return f=t.clientWidth,p=t.clientHeight,a?!l:(h=Math.exp(c.computedRadius[0]),!0)},lookAt:function(t,e,r){c.lookAt(c.lastT(),t,e,r)},rotate:function(t,e,r){c.rotate(c.lastT(),t,e,r)},pan:function(t,e,r){c.pan(c.lastT(),t,e,r)},translate:function(t,e,r){c.translate(c.lastT(),t,e,r)}};Object.defineProperties(d,{matrix:{get:function(){return c.computedMatrix},set:function(t){return c.setMatrix(c.lastT(),t),c.computedMatrix},enumerable:!0},mode:{get:function(){return c.getMode()},set:function(t){var e=c.computedUp.slice(),r=c.computedEye.slice(),i=c.computedCenter.slice();if(c.setMode(t),"turntable"===t){var a=n();c._active.lookAt(a,r,i,e),c._active.lookAt(a+500,r,i,[0,0,1]),c._active.flush(a)}return c.getMode()},enumerable:!0},center:{get:function(){return c.computedCenter},set:function(t){return c.lookAt(c.lastT(),null,t),c.computedCenter},enumerable:!0},eye:{get:function(){return c.computedEye},set:function(t){return c.lookAt(c.lastT(),t),c.computedEye},enumerable:!0},up:{get:function(){return c.computedUp},set:function(t){return c.lookAt(c.lastT(),null,null,t),c.computedUp},enumerable:!0},distance:{get:function(){return h},set:function(t){return c.setDistance(c.lastT(),t),t},enumerable:!0},distanceLimits:{get:function(){return c.getDistanceLimits(r)},set:function(t){return c.setDistanceLimits(t),t},enumerable:!0}}),t.addEventListener("contextmenu",function(t){return t.preventDefault(),!1});var g=0,m=0,v={shift:!1,control:!1,alt:!1,meta:!1};function y(e,r,i,a){var o=d.keyBindingMode;if(!1!==o){var s="rotate"===o,l="pan"===o,u="zoom"===o,f=!!a.control,p=!!a.alt,y=!!a.shift,x=!!(1&e),b=!!(2&e),_=!!(4&e),w=1/t.clientHeight,k=w*(r-g),M=w*(i-m),A=d.flipX?1:-1,T=d.flipY?1:-1,S=n(),E=Math.PI*d.rotateSpeed;if((s&&x&&!f&&!p&&!y||x&&!f&&!p&&y)&&c.rotate(S,A*E*k,-T*E*M,0),(l&&x&&!f&&!p&&!y||b||x&&f&&!p&&!y)&&c.pan(S,-d.translateSpeed*k*h,d.translateSpeed*M*h,0),u&&x&&!f&&!p&&!y||_||x&&!f&&p&&!y){var C=-d.zoomSpeed*M/window.innerHeight*(S-c.lastT())*100;c.pan(S,0,0,h*(Math.exp(C)-1))}return g=r,m=i,v=a,!0}}return d.mouseListener=a(t,y),t.addEventListener("touchstart",function(e){var r=s(e.changedTouches[0],t);y(0,r[0],r[1],v),y(1,r[0],r[1],v),e.preventDefault()},!!l&&{passive:!1}),t.addEventListener("touchmove",function(e){var r=s(e.changedTouches[0],t);y(1,r[0],r[1],v),e.preventDefault()},!!l&&{passive:!1}),t.addEventListener("touchend",function(t){y(0,g,m,v),t.preventDefault()},!!l&&{passive:!1}),d.wheelListener=o(t,function(t,e){if(!1!==d.keyBindingMode){var r=d.flipX?1:-1,i=d.flipY?1:-1,a=n();if(Math.abs(t)>Math.abs(e))c.rotate(a,0,0,-t*r*Math.PI*d.rotateSpeed/window.innerWidth);else{var o=-d.zoomSpeed*i*e/window.innerHeight*(a-c.lastT())/20;c.pan(a,0,0,h*(Math.exp(o)-1))}}},!0),d};var n=t("right-now"),i=t("3d-view"),a=t("mouse-change"),o=t("mouse-wheel"),s=t("mouse-event-offset"),l=t("has-passive-events")},{"3d-view":43,"has-passive-events":379,"mouse-change":402,"mouse-event-offset":403,"mouse-wheel":405,"right-now":465}],774:[function(t,e,r){"use strict";var n=t("../../plot_api/edit_types").overrideAll,i=t("../../components/fx/layout_attributes"),a=t("./scene"),o=t("../get_data").getSubplotData,s=t("../../lib"),l=t("../../constants/xmlns_namespaces");r.name="gl3d",r.attr="scene",r.idRoot="scene",r.idRegex=r.attrRegex=s.counterRegex("scene"),r.attributes=t("./layout/attributes"),r.layoutAttributes=t("./layout/layout_attributes"),r.baseLayoutAttrOverrides=n({hoverlabel:i.hoverlabel},"plot","nested"),r.supplyLayoutDefaults=t("./layout/defaults"),r.plot=function(t){for(var e=t._fullLayout,r=t._fullData,n=e._subplots.gl3d,i=0;i<n.length;i++){var l=n[i],c=o(r,"gl3d",l),u=e[l],h=u._scene;h||(h=new a({id:l,graphDiv:t,container:t.querySelector(".gl-container"),staticPlot:t._context.staticPlot,plotGlPixelRatio:t._context.plotGlPixelRatio},e),u._scene=h),h.cameraInitial||(h.cameraInitial=s.extendDeep({},u.camera)),h.plot(c,e,t.layout)}},r.clean=function(t,e,r,n){for(var i=n._subplots.gl3d||[],a=0;a<i.length;a++){var o=i[a];!e[o]&&n[o]._scene&&(n[o]._scene.destroy(),n._infolayer&&n._infolayer.selectAll(".annotation-"+o).remove())}},r.toSVG=function(t){for(var e=t._fullLayout,r=e._subplots.gl3d,n=e._size,i=0;i<r.length;i++){var a=e[r[i]],o=a.domain,s=a._scene,c=s.toImage("png");e._glimages.append("svg:image").attr({xmlns:l.svg,"xlink:href":c,x:n.l+n.w*o.x[0],y:n.t+n.h*(1-o.y[1]),width:n.w*(o.x[1]-o.x[0]),height:n.h*(o.y[1]-o.y[0]),preserveAspectRatio:"none"}),s.destroy()}},r.cleanId=function(t){if(t.match(/^scene[0-9]*$/)){var e=t.substr(5);return"1"===e&&(e=""),"scene"+e}},r.updateFx=function(t){for(var e=t._subplots.gl3d,r=0;r<e.length;r++){t[e[r]]._scene.updateFx(t.dragmode,t.hovermode)}}},{"../../components/fx/layout_attributes":601,"../../constants/xmlns_namespaces":663,"../../lib":684,"../../plot_api/edit_types":715,"../get_data":768,"./layout/attributes":775,"./layout/defaults":779,"./layout/layout_attributes":780,"./scene":784}],775:[function(t,e,r){"use strict";e.exports={scene:{valType:"subplotid",dflt:"scene",editType:"calc+clearAxisTypes"}}},{}],776:[function(t,e,r){"use strict";var n=t("../../../components/color"),i=t("../../cartesian/layout_attributes"),a=t("../../../lib/extend").extendFlat,o=t("../../../plot_api/edit_types").overrideAll;e.exports=o({visible:i.visible,showspikes:{valType:"boolean",dflt:!0},spikesides:{valType:"boolean",dflt:!0},spikethickness:{valType:"number",min:0,dflt:2},spikecolor:{valType:"color",dflt:n.defaultLine},showbackground:{valType:"boolean",dflt:!1},backgroundcolor:{valType:"color",dflt:"rgba(204, 204, 204, 0.5)"},showaxeslabels:{valType:"boolean",dflt:!0},color:i.color,categoryorder:i.categoryorder,categoryarray:i.categoryarray,title:i.title,titlefont:i.titlefont,type:i.type,autorange:i.autorange,rangemode:i.rangemode,range:i.range,tickmode:i.tickmode,nticks:i.nticks,tick0:i.tick0,dtick:i.dtick,tickvals:i.tickvals,ticktext:i.ticktext,ticks:i.ticks,mirror:i.mirror,ticklen:i.ticklen,tickwidth:i.tickwidth,tickcolor:i.tickcolor,showticklabels:i.showticklabels,tickfont:i.tickfont,tickangle:i.tickangle,tickprefix:i.tickprefix,showtickprefix:i.showtickprefix,ticksuffix:i.ticksuffix,showticksuffix:i.showticksuffix,showexponent:i.showexponent,exponentformat:i.exponentformat,separatethousands:i.separatethousands,tickformat:i.tickformat,tickformatstops:i.tickformatstops,hoverformat:i.hoverformat,showline:i.showline,linecolor:i.linecolor,linewidth:i.linewidth,showgrid:i.showgrid,gridcolor:a({},i.gridcolor,{dflt:"rgb(204, 204, 204)"}),gridwidth:i.gridwidth,zeroline:i.zeroline,zerolinecolor:i.zerolinecolor,zerolinewidth:i.zerolinewidth},"plot","from-root")},{"../../../components/color":558,"../../../lib/extend":673,"../../../plot_api/edit_types":715,"../../cartesian/layout_attributes":744}],777:[function(t,e,r){"use strict";var n=t("tinycolor2").mix,i=t("../../../lib"),a=t("../../../plot_api/plot_template"),o=t("./axis_attributes"),s=t("../../cartesian/type_defaults"),l=t("../../cartesian/axis_defaults"),c=["xaxis","yaxis","zaxis"];e.exports=function(t,e,r){var u,h;function f(t,e){return i.coerce(u,h,o,t,e)}for(var p=0;p<c.length;p++){var d=c[p];u=t[d]||{},(h=a.newContainer(e,d))._id=d[0]+r.scene,h._name=d,s(u,h,f,r.data),l(u,h,f,{font:r.font,letter:d[0],data:r.data,showGrid:!0,bgColor:r.bgColor,calendar:r.calendar},r.fullLayout),f("gridcolor",n(h.color,r.bgColor,13600/187).toRgbString()),f("title",d[0]),h.setScale=i.noop,f("showspikes")&&(f("spikesides"),f("spikethickness"),f("spikecolor",h.color)),f("showaxeslabels"),f("showbackground")&&f("backgroundcolor")}}},{"../../../lib":684,"../../../plot_api/plot_template":722,"../../cartesian/axis_defaults":734,"../../cartesian/type_defaults":755,"./axis_attributes":776,tinycolor2:499}],778:[function(t,e,r){"use strict";var n=t("../../../lib/html2unicode"),i=t("../../../lib/str2rgbarray"),a=["xaxis","yaxis","zaxis"];function o(){this.bounds=[[-10,-10,-10],[10,10,10]],this.ticks=[[],[],[]],this.tickEnable=[!0,!0,!0],this.tickFont=["sans-serif","sans-serif","sans-serif"],this.tickSize=[12,12,12],this.tickAngle=[0,0,0],this.tickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.tickPad=[18,18,18],this.labels=["x","y","z"],this.labelEnable=[!0,!0,!0],this.labelFont=["Open Sans","Open Sans","Open Sans"],this.labelSize=[20,20,20],this.labelAngle=[0,0,0],this.labelColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.labelPad=[30,30,30],this.lineEnable=[!0,!0,!0],this.lineMirror=[!1,!1,!1],this.lineWidth=[1,1,1],this.lineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.lineTickEnable=[!0,!0,!0],this.lineTickMirror=[!1,!1,!1],this.lineTickLength=[10,10,10],this.lineTickWidth=[1,1,1],this.lineTickColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.gridEnable=[!0,!0,!0],this.gridWidth=[1,1,1],this.gridColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.zeroEnable=[!0,!0,!0],this.zeroLineColor=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.zeroLineWidth=[2,2,2],this.backgroundEnable=[!0,!0,!0],this.backgroundColor=[[.8,.8,.8,.5],[.8,.8,.8,.5],[.8,.8,.8,.5]],this._defaultTickPad=this.tickPad.slice(),this._defaultLabelPad=this.labelPad.slice(),this._defaultLineTickLength=this.lineTickLength.slice()}o.prototype.merge=function(t){for(var e=0;e<3;++e){var r=t[a[e]];r.visible?(this.labels[e]=n(r.title),"titlefont"in r&&(r.titlefont.color&&(this.labelColor[e]=i(r.titlefont.color)),r.titlefont.family&&(this.labelFont[e]=r.titlefont.family),r.titlefont.size&&(this.labelSize[e]=r.titlefont.size)),"showline"in r&&(this.lineEnable[e]=r.showline),"linecolor"in r&&(this.lineColor[e]=i(r.linecolor)),"linewidth"in r&&(this.lineWidth[e]=r.linewidth),"showgrid"in r&&(this.gridEnable[e]=r.showgrid),"gridcolor"in r&&(this.gridColor[e]=i(r.gridcolor)),"gridwidth"in r&&(this.gridWidth[e]=r.gridwidth),"log"===r.type?this.zeroEnable[e]=!1:"zeroline"in r&&(this.zeroEnable[e]=r.zeroline),"zerolinecolor"in r&&(this.zeroLineColor[e]=i(r.zerolinecolor)),"zerolinewidth"in r&&(this.zeroLineWidth[e]=r.zerolinewidth),"ticks"in r&&r.ticks?this.lineTickEnable[e]=!0:this.lineTickEnable[e]=!1,"ticklen"in r&&(this.lineTickLength[e]=this._defaultLineTickLength[e]=r.ticklen),"tickcolor"in r&&(this.lineTickColor[e]=i(r.tickcolor)),"tickwidth"in r&&(this.lineTickWidth[e]=r.tickwidth),"tickangle"in r&&(this.tickAngle[e]="auto"===r.tickangle?0:Math.PI*-r.tickangle/180),"showticklabels"in r&&(this.tickEnable[e]=r.showticklabels),"tickfont"in r&&(r.tickfont.color&&(this.tickColor[e]=i(r.tickfont.color)),r.tickfont.family&&(this.tickFont[e]=r.tickfont.family),r.tickfont.size&&(this.tickSize[e]=r.tickfont.size)),"mirror"in r?-1!==["ticks","all","allticks"].indexOf(r.mirror)?(this.lineTickMirror[e]=!0,this.lineMirror[e]=!0):!0===r.mirror?(this.lineTickMirror[e]=!1,this.lineMirror[e]=!0):(this.lineTickMirror[e]=!1,this.lineMirror[e]=!1):this.lineMirror[e]=!1,"showbackground"in r&&!1!==r.showbackground?(this.backgroundEnable[e]=!0,this.backgroundColor[e]=i(r.backgroundcolor)):this.backgroundEnable[e]=!1):(this.tickEnable[e]=!1,this.labelEnable[e]=!1,this.lineEnable[e]=!1,this.lineTickEnable[e]=!1,this.gridEnable[e]=!1,this.zeroEnable[e]=!1,this.backgroundEnable[e]=!1)}},e.exports=function(t){var e=new o;return e.merge(t),e}},{"../../../lib/html2unicode":682,"../../../lib/str2rgbarray":707}],779:[function(t,e,r){"use strict";var n=t("../../../lib"),i=t("../../../components/color"),a=t("../../../registry"),o=t("../../subplot_defaults"),s=t("./axis_defaults"),l=t("./layout_attributes");function c(t,e,r,n){for(var o=r("bgcolor"),l=i.combine(o,n.paper_bgcolor),c=["up","center","eye"],u=0;u<c.length;u++)r("camera."+c[u]+".x"),r("camera."+c[u]+".y"),r("camera."+c[u]+".z");var h=!!r("aspectratio.x")&&!!r("aspectratio.y")&&!!r("aspectratio.z"),f=r("aspectmode",h?"manual":"auto");h||(t.aspectratio=e.aspectratio={x:1,y:1,z:1},"manual"===f&&(e.aspectmode="auto"),t.aspectmode=e.aspectmode),s(t,e,{font:n.font,scene:n.id,data:n.fullData,bgColor:l,calendar:n.calendar,fullLayout:n.fullLayout}),a.getComponentMethod("annotations3d","handleDefaults")(t,e,n),r("dragmode",n.getDfltFromLayout("dragmode")),r("hovermode",n.getDfltFromLayout("hovermode"))}e.exports=function(t,e,r){var i=e._basePlotModules.length>1;o(t,e,r,{type:"gl3d",attributes:l,handleDefaults:c,fullLayout:e,font:e.font,fullData:r,getDfltFromLayout:function(e){if(!i)return n.validate(t[e],l[e])?t[e]:void 0},paper_bgcolor:e.paper_bgcolor,calendar:e.calendar})}},{"../../../components/color":558,"../../../lib":684,"../../../registry":817,"../../subplot_defaults":809,"./axis_defaults":777,"./layout_attributes":780}],780:[function(t,e,r){"use strict";var n=t("./axis_attributes"),i=t("../../domain").attributes,a=t("../../../lib/extend").extendFlat,o=t("../../../lib").counterRegex;function s(t,e,r){return{x:{valType:"number",dflt:t,editType:"camera"},y:{valType:"number",dflt:e,editType:"camera"},z:{valType:"number",dflt:r,editType:"camera"},editType:"camera"}}e.exports={_arrayAttrRegexps:[o("scene",".annotations",!0)],bgcolor:{valType:"color",dflt:"rgba(0,0,0,0)",editType:"plot"},camera:{up:a(s(0,0,1),{}),center:a(s(0,0,0),{}),eye:a(s(1.25,1.25,1.25),{}),editType:"camera"},domain:i({name:"scene",editType:"plot"}),aspectmode:{valType:"enumerated",values:["auto","cube","data","manual"],dflt:"auto",editType:"plot",impliedEdits:{"aspectratio.x":void 0,"aspectratio.y":void 0,"aspectratio.z":void 0}},aspectratio:{x:{valType:"number",min:0,editType:"plot",impliedEdits:{"^aspectmode":"manual"}},y:{valType:"number",min:0,editType:"plot",impliedEdits:{"^aspectmode":"manual"}},z:{valType:"number",min:0,editType:"plot",impliedEdits:{"^aspectmode":"manual"}},editType:"plot",impliedEdits:{aspectmode:"manual"}},xaxis:n,yaxis:n,zaxis:n,dragmode:{valType:"enumerated",values:["orbit","turntable","zoom","pan",!1],dflt:"turntable",editType:"plot"},hovermode:{valType:"enumerated",values:["closest",!1],dflt:"closest",editType:"modebar"},editType:"plot",_deprecated:{cameraposition:{valType:"info_array",editType:"camera"}}}},{"../../../lib":684,"../../../lib/extend":673,"../../domain":757,"./axis_attributes":776}],781:[function(t,e,r){"use strict";var n=t("../../../lib/str2rgbarray"),i=["xaxis","yaxis","zaxis"];function a(){this.enabled=[!0,!0,!0],this.colors=[[0,0,0,1],[0,0,0,1],[0,0,0,1]],this.drawSides=[!0,!0,!0],this.lineWidth=[1,1,1]}a.prototype.merge=function(t){for(var e=0;e<3;++e){var r=t[i[e]];r.visible?(this.enabled[e]=r.showspikes,this.colors[e]=n(r.spikecolor),this.drawSides[e]=r.spikesides,this.lineWidth[e]=r.spikethickness):(this.enabled[e]=!1,this.drawSides[e]=!1)}},e.exports=function(t){var e=new a;return e.merge(t),e}},{"../../../lib/str2rgbarray":707}],782:[function(t,e,r){"use strict";e.exports=function(t){for(var e=t.axesOptions,r=t.glplot.axesPixels,l=t.fullSceneLayout,c=[[],[],[]],u=0;u<3;++u){var h=l[o[u]];if(h._length=(r[u].hi-r[u].lo)*r[u].pixelsPerDataUnit/t.dataScale[u],Math.abs(h._length)===1/0)c[u]=[];else{h._input_range=h.range.slice(),h.range[0]=r[u].lo/t.dataScale[u],h.range[1]=r[u].hi/t.dataScale[u],h._m=1/(t.dataScale[u]*r[u].pixelsPerDataUnit),h.range[0]===h.range[1]&&(h.range[0]-=1,h.range[1]+=1);var f=h.tickmode;if("auto"===h.tickmode){h.tickmode="linear";var p=h.nticks||i.constrain(h._length/40,4,9);n.autoTicks(h,Math.abs(h.range[1]-h.range[0])/p)}for(var d=n.calcTicks(h),g=0;g<d.length;++g)d[g].x=d[g].x*t.dataScale[u],d[g].text=a(d[g].text);c[u]=d,h.tickmode=f}}e.ticks=c;for(var u=0;u<3;++u){s[u]=.5*(t.glplot.bounds[0][u]+t.glplot.bounds[1][u]);for(var g=0;g<2;++g)e.bounds[g][u]=t.glplot.bounds[g][u]}t.contourLevels=function(t){for(var e=new Array(3),r=0;r<3;++r){for(var n=t[r],i=new Array(n.length),a=0;a<n.length;++a)i[a]=n[a].x;e[r]=i}return e}(c)};var n=t("../../cartesian/axes"),i=t("../../../lib"),a=t("../../../lib/html2unicode"),o=["xaxis","yaxis","zaxis"],s=[0,0,0]},{"../../../lib":684,"../../../lib/html2unicode":682,"../../cartesian/axes":732}],783:[function(t,e,r){"use strict";function n(t,e){var r,n,i=[0,0,0,0];for(r=0;r<4;++r)for(n=0;n<4;++n)i[n]+=t[4*r+n]*e[r];return i}e.exports=function(t,e){return n(t.projection,n(t.view,n(t.model,[e[0],e[1],e[2],1])))}},{}],784:[function(t,e,r){"use strict";var n,i,a=t("gl-plot3d"),o=t("webgl-context"),s=t("has-passive-events"),l=t("../../registry"),c=t("../../lib"),u=t("../../plots/cartesian/axes"),h=t("../../components/fx"),f=t("../../lib/str2rgbarray"),p=t("../../lib/show_no_webgl_msg"),d=t("./camera"),g=t("./project"),m=t("./layout/convert"),v=t("./layout/spikes"),y=t("./layout/tick_marks");function x(t,e,r,l){var f={canvas:r,gl:l,container:t.container,axes:t.axesOptions,spikes:t.spikeOptions,pickRadius:10,snapToData:!0,autoScale:!0,autoBounds:!1};if(t.staticMode){if(!(i||(n=document.createElement("canvas"),i=o({canvas:n,preserveDrawingBuffer:!0,premultipliedAlpha:!0,antialias:!0}))))throw new Error("error creating static canvas/context for image server");f.pixelRatio=t.pixelRatio,f.gl=i,f.canvas=n}try{t.glplot=a(f)}catch(e){return p(t)}var m=function(t){if(!1!==t.fullSceneLayout.dragmode){var e={};e[t.id+".camera"]=M(t.camera),t.saveCamera(t.graphDiv.layout),t.graphDiv.emit("plotly_relayout",e)}};if(t.glplot.canvas.addEventListener("mouseup",m.bind(null,t)),t.glplot.canvas.addEventListener("wheel",m.bind(null,t),!!s&&{passive:!1}),t.staticMode||t.glplot.canvas.addEventListener("webglcontextlost",function(t){c.warn("Lost WebGL context."),t.preventDefault()}),!t.camera){var v=t.fullSceneLayout.camera;t.camera=d(t.container,{center:[v.center.x,v.center.y,v.center.z],eye:[v.eye.x,v.eye.y,v.eye.z],up:[v.up.x,v.up.y,v.up.z],zoomMin:.1,zoomMax:100,mode:"orbit"})}return t.glplot.camera=t.camera,t.glplot.oncontextloss=function(){t.recoverContext()},t.glplot.onrender=function(t){var e,r=t.svgContainer,n=t.container.getBoundingClientRect(),i=n.width,a=n.height;r.setAttributeNS(null,"viewBox","0 0 "+i+" "+a),r.setAttributeNS(null,"width",i),r.setAttributeNS(null,"height",a),y(t),t.glplot.axes.update(t.axesOptions);for(var o,s=Object.keys(t.traces),l=null,c=t.glplot.selection,f=0;f<s.length;++f)"skip"!==(e=t.traces[s[f]]).data.hoverinfo&&e.handlePick(c)&&(l=e),e.setContourLevels&&e.setContourLevels();function p(e,r){var n=t.fullSceneLayout[e];return u.tickText(n,n.d2l(r),"hover").text}if(null!==l){var d=g(t.glplot.cameraParams,c.dataCoordinate);e=l.data;var m,v=c.index,x=h.castHoverinfo(e,t.fullLayout,v),b=x.split("+"),_="all"===x,w=p("xaxis",c.traceCoordinate[0]),k=p("yaxis",c.traceCoordinate[1]),M=p("zaxis",c.traceCoordinate[2]);if(_||(-1===b.indexOf("x")&&(w=void 0),-1===b.indexOf("y")&&(k=void 0),-1===b.indexOf("z")&&(M=void 0),-1===b.indexOf("text")&&(c.textLabel=void 0),-1===b.indexOf("name")&&(l.name=void 0)),"cone"===e.type||"streamtube"===e.type){var A=[];(_||-1!==b.indexOf("u"))&&A.push("u: "+p("xaxis",c.traceCoordinate[3])),(_||-1!==b.indexOf("v"))&&A.push("v: "+p("yaxis",c.traceCoordinate[4])),(_||-1!==b.indexOf("w"))&&A.push("w: "+p("zaxis",c.traceCoordinate[5])),(_||-1!==b.indexOf("norm"))&&A.push("norm: "+c.traceCoordinate[6].toPrecision(3)),"streamtube"!==e.type||!_&&-1===b.indexOf("divergence")||A.push("divergence: "+c.traceCoordinate[7].toPrecision(3)),c.textLabel&&A.push(c.textLabel),m=A.join("<br>")}else m=c.textLabel;t.fullSceneLayout.hovermode&&h.loneHover({x:(.5+.5*d[0]/d[3])*i,y:(.5-.5*d[1]/d[3])*a,xLabel:w,yLabel:k,zLabel:M,text:m,name:l.name,color:h.castHoverOption(e,v,"bgcolor")||l.color,borderColor:h.castHoverOption(e,v,"bordercolor"),fontFamily:h.castHoverOption(e,v,"font.family"),fontSize:h.castHoverOption(e,v,"font.size"),fontColor:h.castHoverOption(e,v,"font.color")},{container:r,gd:t.graphDiv});var T={x:c.traceCoordinate[0],y:c.traceCoordinate[1],z:c.traceCoordinate[2],data:e._input,fullData:e,curveNumber:e.index,pointNumber:v};e._module.eventData&&(T=e._module.eventData(T,c,e,{},v)),h.appendArrayPointValue(T,e,v);var S={points:[T]};c.buttons&&c.distance<5?t.graphDiv.emit("plotly_click",S):t.graphDiv.emit("plotly_hover",S),o=S}else h.loneUnhover(r),t.graphDiv.emit("plotly_unhover",o);t.drawAnnotations(t)}.bind(null,t),t.traces={},!0}function b(t,e){var r=document.createElement("div"),n=t.container;this.graphDiv=t.graphDiv;var i=document.createElementNS("http://www.w3.org/2000/svg","svg");i.style.position="absolute",i.style.top=i.style.left="0px",i.style.width=i.style.height="100%",i.style["z-index"]=20,i.style["pointer-events"]="none",r.appendChild(i),this.svgContainer=i,r.id=t.id,r.style.position="absolute",r.style.top=r.style.left="0px",r.style.width=r.style.height="100%",n.appendChild(r),this.fullLayout=e,this.id=t.id||"scene",this.fullSceneLayout=e[this.id],this.plotArgs=[[],{},{}],this.axesOptions=m(e[this.id]),this.spikeOptions=v(e[this.id]),this.container=r,this.staticMode=!!t.staticPlot,this.pixelRatio=t.plotGlPixelRatio||2,this.dataScale=[1,1,1],this.contourLevels=[[],[],[]],this.convertAnnotations=l.getComponentMethod("annotations3d","convert"),this.drawAnnotations=l.getComponentMethod("annotations3d","draw"),x(this)}var _=b.prototype;_.recoverContext=function(){var t=this,e=this.glplot.gl,r=this.glplot.canvas;this.glplot.dispose(),requestAnimationFrame(function n(){e.isContextLost()?requestAnimationFrame(n):x(t,t.fullLayout,r,e)?t.plot.apply(t,t.plotArgs):c.error("Catastrophic and unrecoverable WebGL error. Context lost.")})};var w=["xaxis","yaxis","zaxis"];function k(t,e,r){for(var n=t.fullSceneLayout,i=0;i<3;i++){var a=w[i],o=a.charAt(0),s=n[a],l=e[o],u=e[o+"calendar"],h=e["_"+o+"length"];if(c.isArrayOrTypedArray(l))for(var f,p=0;p<(h||l.length);p++)if(c.isArrayOrTypedArray(l[p]))for(var d=0;d<l[p].length;++d)f=s.d2l(l[p][d],0,u),!isNaN(f)&&isFinite(f)&&(r[0][i]=Math.min(r[0][i],f),r[1][i]=Math.max(r[1][i],f));else f=s.d2l(l[p],0,u),!isNaN(f)&&isFinite(f)&&(r[0][i]=Math.min(r[0][i],f),r[1][i]=Math.max(r[1][i],f));else r[0][i]=Math.min(r[0][i],0),r[1][i]=Math.max(r[1][i],h-1)}}function M(t){return{up:{x:t.up[0],y:t.up[1],z:t.up[2]},center:{x:t.center[0],y:t.center[1],z:t.center[2]},eye:{x:t.eye[0],y:t.eye[1],z:t.eye[2]}}}_.plot=function(t,e,r){if(this.plotArgs=[t,e,r],!this.glplot.contextLost){var n,i,a,o,s,l,c=e[this.id],u=r[this.id];c.bgcolor?this.glplot.clearColor=f(c.bgcolor):this.glplot.clearColor=[0,0,0,0],this.glplot.snapToData=!0,this.fullLayout=e,this.fullSceneLayout=c,this.glplotLayout=c,this.axesOptions.merge(c),this.spikeOptions.merge(c),this.setCamera(c.camera),this.updateFx(c.dragmode,c.hovermode),this.glplot.update({}),this.setConvert(s),t?Array.isArray(t)||(t=[t]):t=[];var h=[[1/0,1/0,1/0],[-1/0,-1/0,-1/0]];for(a=0;a<t.length;++a)!0===(n=t[a]).visible&&k(this,n,h);var p=[1,1,1];for(o=0;o<3;++o)h[0][o]>h[1][o]?p[o]=1:h[1][o]===h[0][o]?p[o]=1:p[o]=1/(h[1][o]-h[0][o]);for(this.dataScale=p,this.convertAnnotations(this),a=0;a<t.length;++a)!0===(n=t[a]).visible&&((i=this.traces[n.uid])?i.data.type===n.type?i.update(n):(i.dispose(),i=n._module.plot(this,n),this.traces[n.uid]=i):(i=n._module.plot(this,n),this.traces[n.uid]=i),i.name=n.name);var d=Object.keys(this.traces);t:for(a=0;a<d.length;++a){for(o=0;o<t.length;++o)if(t[o].uid===d[a]&&!0===t[o].visible)continue t;(i=this.traces[d[a]]).dispose(),delete this.traces[d[a]]}this.glplot.objects.sort(function(t,e){return t._trace.data.index-e._trace.data.index});var g=[[0,0,0],[0,0,0]],m=[],v={};for(a=0;a<3;++a){if((l=(s=c[w[a]]).type)in v?(v[l].acc*=p[a],v[l].count+=1):v[l]={acc:p[a],count:1},s.autorange){g[0][a]=1/0,g[1][a]=-1/0;var y=this.glplot.objects,x=this.fullSceneLayout.annotations||[],b=s._name.charAt(0);for(o=0;o<y.length;o++){var _=y[o],M=_.bounds,A=_._trace.data._pad||0;g[0][a]=Math.min(g[0][a],M[0][a]/p[a]-A),g[1][a]=Math.max(g[1][a],M[1][a]/p[a]+A)}for(o=0;o<x.length;o++){var T=x[o];if(T.visible){var S=s.r2l(T[b]);g[0][a]=Math.min(g[0][a],S),g[1][a]=Math.max(g[1][a],S)}}if("rangemode"in s&&"tozero"===s.rangemode&&(g[0][a]=Math.min(g[0][a],0),g[1][a]=Math.max(g[1][a],0)),g[0][a]>g[1][a])g[0][a]=-1,g[1][a]=1;else{var E=g[1][a]-g[0][a];g[0][a]-=E/32,g[1][a]+=E/32}}else{var C=s.range;g[0][a]=s.r2l(C[0]),g[1][a]=s.r2l(C[1])}g[0][a]===g[1][a]&&(g[0][a]-=1,g[1][a]+=1),m[a]=g[1][a]-g[0][a],this.glplot.bounds[0][a]=g[0][a]*p[a],this.glplot.bounds[1][a]=g[1][a]*p[a]}var L=[1,1,1];for(a=0;a<3;++a){var z=v[l=(s=c[w[a]]).type];L[a]=Math.pow(z.acc,1/z.count)/p[a]}var P;if("auto"===c.aspectmode)P=Math.max.apply(null,L)/Math.min.apply(null,L)<=4?L:[1,1,1];else if("cube"===c.aspectmode)P=[1,1,1];else if("data"===c.aspectmode)P=L;else{if("manual"!==c.aspectmode)throw new Error("scene.js aspectRatio was not one of the enumerated types");var I=c.aspectratio;P=[I.x,I.y,I.z]}c.aspectratio.x=u.aspectratio.x=P[0],c.aspectratio.y=u.aspectratio.y=P[1],c.aspectratio.z=u.aspectratio.z=P[2],this.glplot.aspect=P;var O=c.domain||null,D=e._size||null;if(O&&D){var R=this.container.style;R.position="absolute",R.left=D.l+O.x[0]*D.w+"px",R.top=D.t+(1-O.y[1])*D.h+"px",R.width=D.w*(O.x[1]-O.x[0])+"px",R.height=D.h*(O.y[1]-O.y[0])+"px"}this.glplot.redraw()}},_.destroy=function(){this.glplot&&(this.camera.mouseListener.enabled=!1,this.container.removeEventListener("wheel",this.camera.wheelListener),this.camera=this.glplot.camera=null,this.glplot.dispose(),this.container.parentNode.removeChild(this.container),this.glplot=null)},_.getCamera=function(){return this.glplot.camera.view.recalcMatrix(this.camera.view.lastT()),M(this.glplot.camera)},_.setCamera=function(t){var e;this.glplot.camera.lookAt.apply(this,[[(e=t).eye.x,e.eye.y,e.eye.z],[e.center.x,e.center.y,e.center.z],[e.up.x,e.up.y,e.up.z]])},_.saveCamera=function(t){var e=this.getCamera(),r=c.nestedProperty(t,this.id+".camera"),n=r.get(),i=!1;function a(t,e,r,n){var i=["up","center","eye"],a=["x","y","z"];return e[i[r]]&&t[i[r]][a[n]]===e[i[r]][a[n]]}if(void 0===n)i=!0;else for(var o=0;o<3;o++)for(var s=0;s<3;s++)if(!a(e,n,o,s)){i=!0;break}return i&&r.set(e),i},_.updateFx=function(t,e){var r=this.camera;r&&("orbit"===t?(r.mode="orbit",r.keyBindingMode="rotate"):"turntable"===t?(r.up=[0,0,1],r.mode="turntable",r.keyBindingMode="rotate"):r.keyBindingMode=t),this.fullSceneLayout.hovermode=e},_.toImage=function(t){t||(t="png"),this.staticMode&&this.container.appendChild(n),this.glplot.redraw();var e=this.glplot.gl,r=e.drawingBufferWidth,i=e.drawingBufferHeight;e.bindFramebuffer(e.FRAMEBUFFER,null);var a=new Uint8Array(r*i*4);e.readPixels(0,0,r,i,e.RGBA,e.UNSIGNED_BYTE,a);for(var o=0,s=i-1;o<s;++o,--s)for(var l=0;l<r;++l)for(var c=0;c<4;++c){var u=a[4*(r*o+l)+c];a[4*(r*o+l)+c]=a[4*(r*s+l)+c],a[4*(r*s+l)+c]=u}var h=document.createElement("canvas");h.width=r,h.height=i;var f,p=h.getContext("2d"),d=p.createImageData(r,i);switch(d.data.set(a),p.putImageData(d,0,0),t){case"jpeg":f=h.toDataURL("image/jpeg");break;case"webp":f=h.toDataURL("image/webp");break;default:f=h.toDataURL("image/png")}return this.staticMode&&this.container.removeChild(n),f},_.setConvert=function(){for(var t=0;t<3;t++){var e=this.fullSceneLayout[w[t]];u.setConvert(e,this.fullLayout),e.setScale=c.noop}},e.exports=b},{"../../components/fx":600,"../../lib":684,"../../lib/show_no_webgl_msg":705,"../../lib/str2rgbarray":707,"../../plots/cartesian/axes":732,"../../registry":817,"./camera":773,"./layout/convert":778,"./layout/spikes":781,"./layout/tick_marks":782,"./project":783,"gl-plot3d":277,"has-passive-events":379,"webgl-context":521}],785:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){n=n||t.length;for(var i=new Array(n),a=0;a<n;a++)i[a]=[t[a],e[a],r[a]];return i}},{}],786:[function(t,e,r){"use strict";var n=t("./font_attributes"),i=t("../components/color/attributes"),a=n({editType:"calc"});a.family.dflt='"Open Sans", verdana, arial, sans-serif',a.size.dflt=12,a.color.dflt=i.defaultLine,e.exports={font:a,title:{valType:"string",editType:"layoutstyle"},titlefont:n({editType:"layoutstyle"}),autosize:{valType:"boolean",dflt:!1,editType:"none"},width:{valType:"number",min:10,dflt:700,editType:"plot"},height:{valType:"number",min:10,dflt:450,editType:"plot"},margin:{l:{valType:"number",min:0,dflt:80,editType:"plot"},r:{valType:"number",min:0,dflt:80,editType:"plot"},t:{valType:"number",min:0,dflt:100,editType:"plot"},b:{valType:"number",min:0,dflt:80,editType:"plot"},pad:{valType:"number",min:0,dflt:0,editType:"plot"},autoexpand:{valType:"boolean",dflt:!0,editType:"plot"},editType:"plot"},paper_bgcolor:{valType:"color",dflt:i.background,editType:"plot"},plot_bgcolor:{valType:"color",dflt:i.background,editType:"layoutstyle"},separators:{valType:"string",editType:"plot"},hidesources:{valType:"boolean",dflt:!1,editType:"plot"},showlegend:{valType:"boolean",editType:"legend"},colorway:{valType:"colorlist",dflt:i.defaults,editType:"calc"},datarevision:{valType:"any",editType:"calc"},template:{valType:"any",editType:"calc"}}},{"../components/color/attributes":557,"./font_attributes":758}],787:[function(t,e,r){"use strict";e.exports={requiredVersion:"0.45.0",styleUrlPrefix:"mapbox://styles/mapbox/",styleUrlSuffix:"v9",controlContainerClassName:"mapboxgl-control-container",wrongVersionErrorMsg:["Your custom plotly.js bundle is not using the correct mapbox-gl version","Please install mapbox-gl@0.45.0."].join("\n"),noAccessTokenErrorMsg:["Missing Mapbox access token.","Mapbox trace type require a Mapbox access token to be registered.","For example:","  Plotly.plot(gd, data, layout, { mapboxAccessToken: 'my-access-token' });","More info here: https://www.mapbox.com/help/define-access-token/"].join("\n"),mapOnErrorMsg:"Mapbox error.",styleRules:{map:"overflow:hidden;position:relative;","missing-css":"display:none"}}},{}],788:[function(t,e,r){"use strict";var n=t("../../lib");e.exports=function(t,e){var r=t.split(" "),i=r[0],a=r[1],o=n.isArrayOrTypedArray(e)?n.mean(e):e,s=.5+o/100,l=1.5+o/100,c=["",""],u=[0,0];switch(i){case"top":c[0]="top",u[1]=-l;break;case"bottom":c[0]="bottom",u[1]=l}switch(a){case"left":c[1]="right",u[0]=-s;break;case"right":c[1]="left",u[0]=s}return{anchor:c[0]&&c[1]?c.join("-"):c[0]?c[0]:c[1]?c[1]:"center",offset:u}}},{"../../lib":684}],789:[function(t,e,r){"use strict";var n=t("mapbox-gl"),i=t("../../lib"),a=t("../../plots/get_data").getSubplotCalcData,o=t("../../constants/xmlns_namespaces"),s=t("./mapbox"),l=t("./constants");for(var c in l.styleRules)i.addStyleRule(".mapboxgl-"+c,l.styleRules[c]);r.name="mapbox",r.attr="subplot",r.idRoot="mapbox",r.idRegex=r.attrRegex=i.counterRegex("mapbox"),r.attributes={subplot:{valType:"subplotid",dflt:"mapbox",editType:"calc"}},r.layoutAttributes=t("./layout_attributes"),r.supplyLayoutDefaults=t("./layout_defaults"),r.plot=function(t){var e=t._fullLayout,r=t.calcdata,o=e._subplots.mapbox;if(n.version!==l.requiredVersion)throw new Error(l.wrongVersionErrorMsg);var c=function(t,e){var r=t._fullLayout;if(""===t._context.mapboxAccessToken)return"";for(var n=0;n<e.length;n++){var i=r[e[n]];if(i.accesstoken)return i.accesstoken}throw new Error(l.noAccessTokenErrorMsg)}(t,o);n.accessToken=c;for(var u=0;u<o.length;u++){var h=o[u],f=a(r,"mapbox",h),p=e[h],d=p._subplot;d||(d=s({gd:t,container:e._glcontainer.node(),id:h,fullLayout:e,staticPlot:t._context.staticPlot}),e[h]._subplot=d),d.viewInitial||(d.viewInitial={center:i.extendFlat({},p.center),zoom:p.zoom,bearing:p.bearing,pitch:p.pitch}),d.plot(f,e,t._promises)}},r.clean=function(t,e,r,n){for(var i=n._subplots.mapbox||[],a=0;a<i.length;a++){var o=i[a];!e[o]&&n[o]._subplot&&n[o]._subplot.destroy()}},r.toSVG=function(t){for(var e=t._fullLayout,r=e._subplots.mapbox,n=e._size,i=0;i<r.length;i++){var a=e[r[i]],s=a.domain,l=a._subplot,c=l.toImage("png");e._glimages.append("svg:image").attr({xmlns:o.svg,"xlink:href":c,x:n.l+n.w*s.x[0],y:n.t+n.h*(1-s.y[1]),width:n.w*(s.x[1]-s.x[0]),height:n.h*(s.y[1]-s.y[0]),preserveAspectRatio:"none"}),l.destroy()}},r.updateFx=function(t){for(var e=t._subplots.mapbox,r=0;r<e.length;r++){t[e[r]]._subplot.updateFx(t)}}},{"../../constants/xmlns_namespaces":663,"../../lib":684,"../../plots/get_data":768,"./constants":787,"./layout_attributes":791,"./layout_defaults":792,"./mapbox":793,"mapbox-gl":393}],790:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./convert_text_opts");function a(t,e){this.mapbox=t,this.map=t.map,this.uid=t.uid+"-layer"+e,this.idSource=this.uid+"-source",this.idLayer=this.uid+"-layer",this.sourceType=null,this.source=null,this.layerType=null,this.below=null,this.visible=!1}var o=a.prototype;function s(t){var e=t.source;return t.visible&&(n.isPlainObject(e)||"string"==typeof e&&e.length>0)}function l(t){var e={},r={};switch(t.type){case"circle":n.extendFlat(r,{"circle-radius":t.circle.radius,"circle-color":t.color,"circle-opacity":t.opacity});break;case"line":n.extendFlat(r,{"line-width":t.line.width,"line-color":t.color,"line-opacity":t.opacity});break;case"fill":n.extendFlat(r,{"fill-color":t.color,"fill-outline-color":t.fill.outlinecolor,"fill-opacity":t.opacity});break;case"symbol":var a=t.symbol,o=i(a.textposition,a.iconsize);n.extendFlat(e,{"icon-image":a.icon+"-15","icon-size":a.iconsize/10,"text-field":a.text,"text-size":a.textfont.size,"text-anchor":o.anchor,"text-offset":o.offset}),n.extendFlat(r,{"icon-color":t.color,"text-color":a.textfont.color,"text-opacity":t.opacity})}return{layout:e,paint:r}}o.update=function(t){this.visible?this.needsNewSource(t)?(this.removeLayer(),this.updateSource(t),this.updateLayer(t)):this.needsNewLayer(t)?this.updateLayer(t):this.updateStyle(t):(this.updateSource(t),this.updateLayer(t)),this.visible=s(t)},o.needsNewSource=function(t){return this.sourceType!==t.sourcetype||this.source!==t.source||this.layerType!==t.type},o.needsNewLayer=function(t){return this.layerType!==t.type||this.below!==t.below},o.updateSource=function(t){var e=this.map;if(e.getSource(this.idSource)&&e.removeSource(this.idSource),this.sourceType=t.sourcetype,this.source=t.source,s(t)){var r=function(t){var e,r=t.sourcetype,n=t.source,i={type:r};"geojson"===r?e="data":"vector"===r&&(e="string"==typeof n?"url":"tiles");return i[e]=n,i}(t);e.addSource(this.idSource,r)}},o.updateLayer=function(t){var e=this.map,r=l(t);this.removeLayer(),this.layerType=t.type,s(t)&&e.addLayer({id:this.idLayer,source:this.idSource,"source-layer":t.sourcelayer||"",type:t.type,layout:r.layout,paint:r.paint},t.below)},o.updateStyle=function(t){if(s(t)){var e=l(t);this.mapbox.setOptions(this.idLayer,"setLayoutProperty",e.layout),this.mapbox.setOptions(this.idLayer,"setPaintProperty",e.paint)}},o.removeLayer=function(){var t=this.map;t.getLayer(this.idLayer)&&t.removeLayer(this.idLayer)},o.dispose=function(){var t=this.map;t.removeLayer(this.idLayer),t.removeSource(this.idSource)},e.exports=function(t,e,r){var n=new a(t,e);return n.update(r),n}},{"../../lib":684,"./convert_text_opts":788}],791:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../components/color").defaultLine,a=t("../domain").attributes,o=t("../font_attributes"),s=t("../../traces/scatter/attributes").textposition,l=t("../../plot_api/edit_types").overrideAll,c=t("../../plot_api/plot_template").templatedArray,u=o({});u.family.dflt="Open Sans Regular, Arial Unicode MS Regular",e.exports=l({_arrayAttrRegexps:[n.counterRegex("mapbox",".layers",!0)],domain:a({name:"mapbox"}),accesstoken:{valType:"string",noBlank:!0,strict:!0},style:{valType:"any",values:["basic","streets","outdoors","light","dark","satellite","satellite-streets"],dflt:"basic"},center:{lon:{valType:"number",dflt:0},lat:{valType:"number",dflt:0}},zoom:{valType:"number",dflt:1},bearing:{valType:"number",dflt:0},pitch:{valType:"number",dflt:0},layers:c("layer",{visible:{valType:"boolean",dflt:!0},sourcetype:{valType:"enumerated",values:["geojson","vector"],dflt:"geojson"},source:{valType:"any"},sourcelayer:{valType:"string",dflt:""},type:{valType:"enumerated",values:["circle","line","fill","symbol"],dflt:"circle"},below:{valType:"string",dflt:""},color:{valType:"color",dflt:i},opacity:{valType:"number",min:0,max:1,dflt:1},circle:{radius:{valType:"number",dflt:15}},line:{width:{valType:"number",dflt:2}},fill:{outlinecolor:{valType:"color",dflt:i}},symbol:{icon:{valType:"string",dflt:"marker"},iconsize:{valType:"number",dflt:10},text:{valType:"string",dflt:""},textfont:u,textposition:n.extendFlat({},s,{arrayOk:!1})}})},"plot","from-root")},{"../../components/color":558,"../../lib":684,"../../plot_api/edit_types":715,"../../plot_api/plot_template":722,"../../traces/scatter/attributes":1015,"../domain":757,"../font_attributes":758}],792:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../subplot_defaults"),a=t("../array_container_defaults"),o=t("./layout_attributes");function s(t,e,r,n){r("accesstoken",n.accessToken),r("style"),r("center.lon"),r("center.lat"),r("zoom"),r("bearing"),r("pitch"),a(t,e,{name:"layers",handleItemDefaults:l}),e._input=t}function l(t,e){function r(r,i){return n.coerce(t,e,o.layers,r,i)}if(r("visible")){var i=r("sourcetype");r("source"),"vector"===i&&r("sourcelayer");var a=r("type");r("below"),r("color"),r("opacity"),"circle"===a&&r("circle.radius"),"line"===a&&r("line.width"),"fill"===a&&r("fill.outlinecolor"),"symbol"===a&&(r("symbol.icon"),r("symbol.iconsize"),r("symbol.text"),n.coerceFont(r,"symbol.textfont"),r("symbol.textposition"))}}e.exports=function(t,e,r){i(t,e,r,{type:"mapbox",attributes:o,handleDefaults:s,partition:"y",accessToken:e._mapboxAccessToken})}},{"../../lib":684,"../array_container_defaults":728,"../subplot_defaults":809,"./layout_attributes":791}],793:[function(t,e,r){"use strict";var n=t("mapbox-gl"),i=t("../../components/fx"),a=t("../../lib"),o=t("../../components/dragelement"),s=t("../cartesian/select").prepSelect,l=t("./constants"),c=t("./layout_attributes"),u=t("./layers");function h(t){this.id=t.id,this.gd=t.gd,this.container=t.container,this.isStatic=t.staticPlot;var e=t.fullLayout;this.uid=e._uid+"-"+this.id,this.opts=e[this.id],this.div=null,this.xaxis=null,this.yaxis=null,this.createFramework(e),this.map=null,this.accessToken=null,this.styleObj=null,this.traceHash={},this.layerList=[]}var f=h.prototype;function p(t){var e=c.style.values,r=c.style.dflt,n={};return a.isPlainObject(t)?(n.id=t.id,n.style=t):"string"==typeof t?(n.id=t,n.style=-1!==e.indexOf(t)?d(t):t):(n.id=r,n.style=d(r)),n.transition={duration:0,delay:0},n}function d(t){return l.styleUrlPrefix+t+"-"+l.styleUrlSuffix}function g(t){return[t.lon,t.lat]}e.exports=function(t){return new h(t)},f.plot=function(t,e,r){var n,i=this,a=i.opts=e[this.id];i.map&&a.accesstoken!==i.accessToken&&(i.map.remove(),i.map=null,i.styleObj=null,i.traceHash=[],i.layerList={}),n=i.map?new Promise(function(r,n){i.updateMap(t,e,r,n)}):new Promise(function(r,n){i.createMap(t,e,r,n)}),r.push(n)},f.createMap=function(t,e,r,a){var o=this,s=o.gd,c=o.opts,u=o.styleObj=p(c.style);o.accessToken=c.accesstoken;var h=o.map=new n.Map({container:o.div,style:u.style,center:g(c.center),zoom:c.zoom,bearing:c.bearing,pitch:c.pitch,interactive:!o.isStatic,preserveDrawingBuffer:o.isStatic,doubleClickZoom:!1,boxZoom:!1}),f=l.controlContainerClassName,d=o.div.getElementsByClassName(f)[0];if(o.div.removeChild(d),h._canvas.style.left="0px",h._canvas.style.top="0px",o.rejectOnError(a),h.once("load",function(){o.updateData(t),o.updateLayout(e),o.resolveOnRender(r)}),!o.isStatic){var m=!1;h.on("moveend",function(t){if(o.map){var e=o.getView();c._input.center=c.center=e.center,c._input.zoom=c.zoom=e.zoom,c._input.bearing=c.bearing=e.bearing,c._input.pitch=c.pitch=e.pitch,(t.originalEvent||m)&&y(e),m=!1}}),h.on("wheel",function(){m=!0}),h.on("mousemove",function(t){var e=o.div.getBoundingClientRect();t.clientX=t.point.x+e.left,t.clientY=t.point.y+e.top,t.target.getBoundingClientRect=function(){return e},o.xaxis.p2c=function(){return t.lngLat.lng},o.yaxis.p2c=function(){return t.lngLat.lat},i.hover(s,t,o.id)}),h.on("click",function(t){i.click(s,t.originalEvent)}),h.on("dragstart",v),h.on("zoomstart",v),h.on("dblclick",function(){s.emit("plotly_doubleclick",null);var t=o.viewInitial;h.setCenter(g(t.center)),h.setZoom(t.zoom),h.setBearing(t.bearing),h.setPitch(t.pitch);var e=o.getView();c._input.center=c.center=e.center,c._input.zoom=c.zoom=e.zoom,c._input.bearing=c.bearing=e.bearing,c._input.pitch=c.pitch=e.pitch,y(e)}),o.clearSelect=function(){s._fullLayout._zoomlayer.selectAll(".select-outline").remove()}}function v(){i.loneUnhover(e._toppaper)}function y(t){var e=o.id,r={};for(var n in t)r[e+"."+n]=t[n];s.emit("plotly_relayout",r)}},f.updateMap=function(t,e,r,n){var i=this,a=i.map;i.rejectOnError(n);var o=p(i.opts.style);i.styleObj.id!==o.id?(i.styleObj=o,a.setStyle(o.style),a.once("styledata",function(){i.traceHash={},i.updateData(t),i.updateLayout(e),i.resolveOnRender(r)})):(i.updateData(t),i.updateLayout(e),i.resolveOnRender(r))},f.updateData=function(t){var e,r,n,i,a=this.traceHash;for(n=0;n<t.length;n++){var o=t[n];(e=a[(r=o[0].trace).uid])?e.update(o):r._module&&(a[r.uid]=r._module.plot(this,o))}var s=Object.keys(a);t:for(n=0;n<s.length;n++){var l=s[n];for(i=0;i<t.length;i++)if(l===(r=t[i][0].trace).uid)continue t;(e=a[l]).dispose(),delete a[l]}},f.updateLayout=function(t){var e=this.map,r=this.opts;e.setCenter(g(r.center)),e.setZoom(r.zoom),e.setBearing(r.bearing),e.setPitch(r.pitch),this.updateLayers(),this.updateFramework(t),this.updateFx(t),this.map.resize()},f.resolveOnRender=function(t){var e=this.map;e.on("render",function r(){e.loaded()&&(e.off("render",r),setTimeout(t,0))})},f.rejectOnError=function(t){var e=this.map;function r(){t(new Error(l.mapOnErrorMsg))}e.once("error",r),e.once("style.error",r),e.once("source.error",r),e.once("tile.error",r),e.once("layer.error",r)},f.createFramework=function(t){var e=this,r=e.div=document.createElement("div");r.id=e.uid,r.style.position="absolute",e.container.appendChild(r),e.xaxis={_id:"x",c2p:function(t){return e.project(t).x}},e.yaxis={_id:"y",c2p:function(t){return e.project(t).y}},e.updateFramework(t)},f.updateFx=function(t){var e=this,r=e.map,n=e.gd;if(!e.isStatic){var i,a=t.dragmode;if(i="select"===a?function(t,r){(t.range={})[e.id]=[c([r.xmin,r.ymin]),c([r.xmax,r.ymax])]}:function(t,r,n){(t.lassoPoints={})[e.id]=n.filtered.map(c)},"select"===a||"lasso"===a){r.dragPan.disable(),r.on("zoomstart",e.clearSelect);var l={element:e.div,gd:n,plotinfo:{xaxis:e.xaxis,yaxis:e.yaxis,fillRangeItems:i},xaxes:[e.xaxis],yaxes:[e.yaxis],subplot:e.id,prepFn:function(t,e,r){s(t,e,r,l,a)}};o.init(l)}else r.dragPan.enable(),r.off("zoomstart",e.clearSelect),e.div.onmousedown=null}function c(t){var r=e.map.unproject(t);return[r.lng,r.lat]}},f.updateFramework=function(t){var e=t[this.id].domain,r=t._size,n=this.div.style;n.width=r.w*(e.x[1]-e.x[0])+"px",n.height=r.h*(e.y[1]-e.y[0])+"px",n.left=r.l+e.x[0]*r.w+"px",n.top=r.t+(1-e.y[1])*r.h+"px",this.xaxis._offset=r.l+e.x[0]*r.w,this.xaxis._length=r.w*(e.x[1]-e.x[0]),this.yaxis._offset=r.t+(1-e.y[1])*r.h,this.yaxis._length=r.h*(e.y[1]-e.y[0])},f.updateLayers=function(){var t,e=this.opts.layers,r=this.layerList;if(e.length!==r.length){for(t=0;t<r.length;t++)r[t].dispose();for(r=this.layerList=[],t=0;t<e.length;t++)r.push(u(this,t,e[t]))}else for(t=0;t<e.length;t++)r[t].update(e[t])},f.destroy=function(){this.map&&(this.map.remove(),this.map=null,this.container.removeChild(this.div))},f.toImage=function(){return this.map.stop(),this.map.getCanvas().toDataURL()},f.setOptions=function(t,e,r){for(var n in r)this.map[e](t,n,r[n])},f.project=function(t){return this.map.project(new n.LngLat(t[0],t[1]))},f.getView=function(){var t=this.map,e=t.getCenter();return{center:{lon:e.lng,lat:e.lat},zoom:t.getZoom(),bearing:t.getBearing(),pitch:t.getPitch()}}},{"../../components/dragelement":580,"../../components/fx":600,"../../lib":684,"../cartesian/select":749,"./constants":787,"./layers":790,"./layout_attributes":791,"mapbox-gl":393}],794:[function(t,e,r){"use strict";e.exports={t:{valType:"number",dflt:0,editType:"arraydraw"},r:{valType:"number",dflt:0,editType:"arraydraw"},b:{valType:"number",dflt:0,editType:"arraydraw"},l:{valType:"number",dflt:0,editType:"arraydraw"},editType:"arraydraw"}},{}],795:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("../registry"),o=t("../plot_api/plot_schema"),s=t("../plot_api/plot_template"),l=t("../lib"),c=t("../components/color"),u=t("../constants/numerical").BADNUM,h=t("../plots/cartesian/axis_ids"),f=t("./sort_modules").sortBasePlotModules,p=t("./animation_attributes"),d=t("./frame_attributes"),g=l.relinkPrivateKeys,m=l._,v=e.exports={};l.extendFlat(v,a),v.attributes=t("./attributes"),v.attributes.type.values=v.allTypes,v.fontAttrs=t("./font_attributes"),v.layoutAttributes=t("./layout_attributes"),v.fontWeight="normal";var y=v.transformsRegistry,x=t("./command");v.executeAPICommand=x.executeAPICommand,v.computeAPICommandBindings=x.computeAPICommandBindings,v.manageCommandObserver=x.manageCommandObserver,v.hasSimpleAPICommandBindings=x.hasSimpleAPICommandBindings,v.redrawText=function(t){if(!((t=l.getGraphDiv(t)).data&&t.data[0]&&t.data[0].r))return new Promise(function(e){setTimeout(function(){a.getComponentMethod("annotations","draw")(t),a.getComponentMethod("legend","draw")(t),(t.calcdata||[]).forEach(function(t){t[0]&&t[0].t&&t[0].t.cb&&t[0].t.cb()}),e(v.previousPromises(t))},300)})},v.resize=function(t){return t=l.getGraphDiv(t),new Promise(function(e,r){function n(t){var e=window.getComputedStyle(t).display;return!e||"none"===e}t&&!n(t)||r(new Error("Resize must be passed a displayed plot div element.")),t._redrawTimer&&clearTimeout(t._redrawTimer),t._redrawTimer=setTimeout(function(){if(!t.layout||t.layout.width&&t.layout.height||n(t))e(t);else{delete t.layout.width,delete t.layout.height;var r=t.changed;t.autoplay=!0,a.call("relayout",t,{autosize:!0}).then(function(){t.changed=r,e(t)})}},100)})},v.previousPromises=function(t){if((t._promises||[]).length)return Promise.all(t._promises).then(function(){t._promises=[]})},v.addLinks=function(t){if(t._context.showLink||t._context.showSources){var e=t._fullLayout,r=l.ensureSingle(e._paper,"text","js-plot-link-container",function(t){t.style({"font-family":'"Open Sans", Arial, sans-serif',"font-size":"12px",fill:c.defaultLine,"pointer-events":"all"}).each(function(){var t=n.select(this);t.append("tspan").classed("js-link-to-tool",!0),t.append("tspan").classed("js-link-spacer",!0),t.append("tspan").classed("js-sourcelinks",!0)})}),i=r.node(),a={y:e._paper.attr("height")-9};document.body.contains(i)&&i.getComputedTextLength()>=e.width-20?(a["text-anchor"]="start",a.x=5):(a["text-anchor"]="end",a.x=e._paper.attr("width")-7),r.attr(a);var o=r.select(".js-link-to-tool"),s=r.select(".js-link-spacer"),u=r.select(".js-sourcelinks");t._context.showSources&&t._context.showSources(t),t._context.showLink&&function(t,e){e.text("");var r=e.append("a").attr({"xlink:xlink:href":"#",class:"link--impt link--embedview","font-weight":"bold"}).text(t._context.linkText+" "+String.fromCharCode(187));if(t._context.sendData)r.on("click",function(){v.sendDataToCloud(t)});else{var n=window.location.pathname.split("/"),i=window.location.search;r.attr({"xlink:xlink:show":"new","xlink:xlink:href":"/"+n[2].split(".")[0]+"/"+n[1]+i})}}(t,o),s.text(o.text()&&u.text()?" - ":"")}},v.sendDataToCloud=function(t){t.emit("plotly_beforeexport");var e=(window.PLOTLYENV||{}).BASE_URL||t._context.plotlyServerURL,r=n.select(t).append("div").attr("id","hiddenform").style("display","none"),i=r.append("form").attr({action:e+"/external",method:"post",target:"_blank"});return i.append("input").attr({type:"text",name:"data"}).node().value=v.graphJson(t,!1,"keepdata"),i.node().submit(),r.remove(),t.emit("plotly_afterexport"),!1};var b,_=["days","shortDays","months","shortMonths","periods","dateTime","date","time","decimal","thousands","grouping","currency"],w=["year","month","dayMonth","dayMonthYear"];function k(t,e){var r=t._context.locale,n=!1,i={};function o(t){for(var r=!0,a=0;a<e.length;a++){var o=e[a];i[o]||(t[o]?i[o]=t[o]:r=!1)}r&&(n=!0)}for(var s=0;s<2;s++){for(var l=t._context.locales,c=0;c<2;c++){var u=(l[r]||{}).format;if(u&&(o(u),n))break;l=a.localeRegistry}var h=r.split("-")[0];if(n||h===r)break;r=h}return n||o(a.localeRegistry.en.format),i}function M(t,e,r,n){for(var i=t.transforms,a=[t],o=0;o<i.length;o++){var s=i[o],l=y[s.type];l&&l.transform&&(a=l.transform(a,{transform:s,fullTrace:t,fullData:e,layout:r,fullLayout:n,transformIndex:o}))}return a}function A(t){t._pushmargin||(t._pushmargin={}),t._pushmarginIds||(t._pushmarginIds={})}function T(t){for(var e=0;e<t.length;e++)t[e].clearCalc()}v.supplyDefaults=function(t,e){var r=e&&e.skipUpdateCalc,i=t._fullLayout||{};if(i._skipDefaults)delete i._skipDefaults;else{var o,s=t._fullLayout={},c=t.layout||{},u=t._fullData||[],p=t._fullData=[],d=t.data||[],y=t.calcdata||[],x=t._context||{};t._transitionData||v.createTransitionData(t),s._dfltTitle={plot:m(t,"Click to enter Plot title"),x:m(t,"Click to enter X axis title"),y:m(t,"Click to enter Y axis title"),colorbar:m(t,"Click to enter Colorscale title"),annotation:m(t,"new text")},s._traceWord=m(t,"trace");var M=k(t,_);if(s._mapboxAccessToken=x.mapboxAccessToken,i._initialAutoSizeIsDone){var A=i.width,T=i.height;v.supplyLayoutGlobalDefaults(c,s,M),c.width||(s.width=A),c.height||(s.height=T),v.sanitizeMargins(s)}else{v.supplyLayoutGlobalDefaults(c,s,M);var S=!c.width||!c.height,E=s.autosize,C=x.autosizable;S&&(E||C)?v.plotAutoSize(t,c,s):S&&v.sanitizeMargins(s),!E&&S&&(c.width=s.width,c.height=s.height)}s._d3locale=function(t,e){return t.decimal=e.charAt(0),t.thousands=e.charAt(1),n.locale(t)}(M,s.separators),s._extraFormat=k(t,w),s._initialAutoSizeIsDone=!0,s._dataLength=d.length,s._modules=[],s._basePlotModules=[];var L=s._subplots=function(){var t,e,r={};if(!b){b=[];var n=a.subplotsRegistry;for(var i in n){var o=n[i],s=o.attr;if(s&&(b.push(i),Array.isArray(s)))for(e=0;e<s.length;e++)l.pushUnique(b,s[e])}}for(t=0;t<b.length;t++)r[b[t]]=[];return r}(),z=s._splomAxes={x:{},y:{}},P=s._splomSubplots={};s._splomGridDflt={},s._requestRangeslider={},s._traceUids=function(t,e){var r,n,i=e.length,a=[];for(r=0;r<t.length;r++){var o=t[r]._fullInput;o!==n&&a.push(o),n=o}var s=a.length,c=new Array(i),u={};function h(t,e){c[e]=t,u[t]=1}function f(t,e){if(t&&"string"==typeof t&&!u[t])return h(t,e),!0}for(r=0;r<i;r++)f(e[r].uid,r)||r<s&&f(a[r].uid,r)||h(l.randstr(u),r);return c}(u,d),s._globalTransforms=(t._context||{}).globalTransforms,v.supplyDataDefaults(d,p,c,s);var I=Object.keys(z.x),O=Object.keys(z.y);if(I.length>1&&O.length>1){for(a.getComponentMethod("grid","sizeDefaults")(c,s),o=0;o<I.length;o++)l.pushUnique(L.xaxis,I[o]);for(o=0;o<O.length;o++)l.pushUnique(L.yaxis,O[o]);for(var D in P)l.pushUnique(L.cartesian,D)}s._has=v._hasPlotType.bind(s);var R=s._modules;for(o=0;o<R.length;o++){var B=R[o];B.cleanData&&B.cleanData(p)}if(u.length===p.length)for(o=0;o<p.length;o++)g(p[o],u[o]);v.supplyLayoutModuleDefaults(c,s,p,t._transitionData),s._hasOnlyLargeSploms=1===s._basePlotModules.length&&"splom"===s._basePlotModules[0].name&&I.length>15&&O.length>15&&0===s.shapes.length&&0===s.images.length,s._hasCartesian=s._has("cartesian"),s._hasGeo=s._has("geo"),s._hasGL3D=s._has("gl3d"),s._hasGL2D=s._has("gl2d"),s._hasTernary=s._has("ternary"),s._hasPie=s._has("pie"),v.linkSubplots(p,s,u,i),v.cleanPlot(p,s,u,i,y),g(s,i),v.doAutoMargin(t);var F=h.list(t);for(o=0;o<F.length;o++){F[o].setScale()}r||y.length!==p.length||v.supplyDefaultsUpdateCalc(y,p),s._basePlotModules.sort(f)}},v.supplyDefaultsUpdateCalc=function(t,e){for(var r=0;r<e.length;r++){var n=e[r],i=t[r][0];if(i&&i.trace){var a=i.trace;if(a._hasCalcTransform){var o,s,c,u=a._arrayAttrs;for(o=0;o<u.length;o++)s=u[o],c=l.nestedProperty(a,s).get().slice(),l.nestedProperty(n,s).set(c)}i.trace=n}}},v.createTransitionData=function(t){t._transitionData||(t._transitionData={}),t._transitionData._frames||(t._transitionData._frames=[]),t._transitionData._frameHash||(t._transitionData._frameHash={}),t._transitionData._counter||(t._transitionData._counter=0),t._transitionData._interruptCallbacks||(t._transitionData._interruptCallbacks=[])},v._hasPlotType=function(t){var e,r=this._basePlotModules||[];for(e=0;e<r.length;e++)if(r[e].name===t)return!0;var n=this._modules||[];for(e=0;e<n.length;e++){var i=n[e].name;if(i===t)return!0;var o=a.modules[i];if(o&&o.categories[t])return!0}return!1},v.cleanPlot=function(t,e,r,n,i){var a,o,s=n._basePlotModules||[];for(a=0;a<s.length;a++){var l=s[a];l.clean&&l.clean(t,e,r,n,i)}var c=n._has&&n._has("gl"),u=e._has&&e._has("gl");c&&!u&&void 0!==n._glcontainer&&(n._glcontainer.selectAll(".gl-canvas").remove(),n._glcontainer.selectAll(".no-webgl").remove(),n._glcanvas=null);var h=!!n._infolayer;t:for(a=0;a<r.length;a++){var f=r[a].uid;for(o=0;o<t.length;o++){if(f===t[o].uid)continue t}h&&n._infolayer.select(".cb"+f).remove()}n._zoomlayer&&n._zoomlayer.selectAll(".select-outline").remove()},v.linkSubplots=function(t,e,r,n){var i,a,o=n._plots||{},s=e._plots={},l=e._subplots,c={_fullData:t,_fullLayout:e},u=l.cartesian.concat(l.gl2d||[]);for(i=0;i<u.length;i++){var f,p=u[i],d=o[p],g=h.getFromId(c,p,"x"),m=h.getFromId(c,p,"y");for(d?f=s[p]=d:(f=s[p]={}).id=p,f.xaxis=g,f.yaxis=m,f._hasClipOnAxisFalse=!1,a=0;a<t.length;a++){var v=t[a];if(v.xaxis===f.xaxis._id&&v.yaxis===f.yaxis._id&&!1===v.cliponaxis){f._hasClipOnAxisFalse=!0;break}}}var y=h.list(c,null,!0);for(i=0;i<y.length;i++){var x=y[i],b=null;x.overlaying&&(b=h.getFromId(c,x.overlaying))&&b.overlaying&&(x.overlaying=!1,b=null),x._mainAxis=b||x,b&&(x.domain=b.domain.slice()),x._anchorAxis="free"===x.anchor?null:h.getFromId(c,x.anchor)}},v.clearExpandedTraceDefaultColors=function(t){var e,r,n;for(r=[],(e=t._module._colorAttrs)||(t._module._colorAttrs=e=[],o.crawl(t._module.attributes,function(t,n,i,a){r[a]=n,r.length=a+1,"color"===t.valType&&void 0===t.dflt&&e.push(r.join("."))})),n=0;n<e.length;n++){l.nestedProperty(t,"_input."+e[n]).get()||l.nestedProperty(t,e[n]).set(null)}},v.supplyDataDefaults=function(t,e,r,n){var i,o,c,u=n._modules,h=n._basePlotModules,f=0,p=0;function d(t){e.push(t);var r=t._module;r&&(!0===t.visible&&l.pushUnique(u,r),l.pushUnique(h,t._module.basePlotModule),f++,!1!==t._input.visible&&p++)}n._transformModules=[];var m={},y=[],x=(r.template||{}).data||{},b=s.traceTemplater(x);for(i=0;i<t.length;i++){if(c=t[i],(o=b.newTrace(c)).uid=n._traceUids[i],v.supplyTraceDefaults(c,o,p,n,i),o.uid=n._traceUids[i],o.index=i,o._input=c,o._expandedIndex=f,o.transforms&&o.transforms.length)for(var _=M(o,e,r,n),w=0;w<_.length;w++){var k=_[w],A={_template:o._template,type:o.type,uid:o.uid+w};v.supplyTraceDefaults(k,A,f,n,i),g(A,k),A.index=i,A._input=c,A._fullInput=o,A._expandedIndex=f,A._expandedInput=k,d(A)}else o._fullInput=o,o._expandedInput=o,d(o);a.traceIs(o,"carpetAxis")&&(m[o.carpet]=o),a.traceIs(o,"carpetDependent")&&y.push(i)}for(i=0;i<y.length;i++)if((o=e[y[i]]).visible){var T=m[o.carpet];o._carpet=T,T&&T.visible?(o.xaxis=T.xaxis,o.yaxis=T.yaxis):o.visible=!1}},v.supplyAnimationDefaults=function(t){var e;t=t||{};var r={};function n(e,n){return l.coerce(t||{},r,p,e,n)}if(n("mode"),n("direction"),n("fromcurrent"),Array.isArray(t.frame))for(r.frame=[],e=0;e<t.frame.length;e++)r.frame[e]=v.supplyAnimationFrameDefaults(t.frame[e]||{});else r.frame=v.supplyAnimationFrameDefaults(t.frame||{});if(Array.isArray(t.transition))for(r.transition=[],e=0;e<t.transition.length;e++)r.transition[e]=v.supplyAnimationTransitionDefaults(t.transition[e]||{});else r.transition=v.supplyAnimationTransitionDefaults(t.transition||{});return r},v.supplyAnimationFrameDefaults=function(t){var e={};function r(r,n){return l.coerce(t||{},e,p.frame,r,n)}return r("duration"),r("redraw"),e},v.supplyAnimationTransitionDefaults=function(t){var e={};function r(r,n){return l.coerce(t||{},e,p.transition,r,n)}return r("duration"),r("easing"),e},v.supplyFrameDefaults=function(t){var e={};function r(r,n){return l.coerce(t,e,d,r,n)}return r("group"),r("name"),r("traces"),r("baseframe"),r("data"),r("layout"),e},v.supplyTraceDefaults=function(t,e,r,n,i){var o,s=n.colorway||c.defaults,u=s[r%s.length];function h(r,n){return l.coerce(t,e,v.attributes,r,n)}var f=h("visible");h("type"),h("name",n._traceWord+" "+i);var p=v.getModule(e);if(e._module=p,p){var d=p.basePlotModule,g=d.attr,m=d.attributes;if(g&&m){var y=n._subplots,x="";if("gl2d"!==d.name||f){if(Array.isArray(g))for(o=0;o<g.length;o++){var b=g[o],_=l.coerce(t,e,m,b);y[b]&&l.pushUnique(y[b],_),x+=_}else x=l.coerce(t,e,m,g);y[d.name]&&l.pushUnique(y[d.name],x)}}}return f&&(h("customdata"),h("ids"),a.traceIs(e,"showLegend")&&(h("showlegend"),h("legendgroup")),a.getComponentMethod("fx","supplyDefaults")(t,e,u,n),p&&(p.supplyDefaults(t,e,u,n),l.coerceHoverinfo(t,e,n)),a.traceIs(e,"noOpacity")||h("opacity"),a.traceIs(e,"notLegendIsolatable")&&(e.visible=!!e.visible),p&&p.selectPoints&&h("selectedpoints"),v.supplyTransformDefaults(t,e,n)),e},v.supplyTransformDefaults=function(t,e,r){if(e._length||function(t){var e=t.transforms;if(Array.isArray(e)&&e.length)for(var r=0;r<e.length;r++){var n=y[e[r].type];if(n&&n.makesData)return!0}return!1}(t)){var n=r._globalTransforms||[],i=r._transformModules||[];if(Array.isArray(t.transforms)||0!==n.length)for(var a=t.transforms||[],o=n.concat(a),s=e.transforms=[],c=0;c<o.length;c++){var u,h=o[c],f=h.type,p=y[f],d=!(h._module&&h._module===p),g=p&&"function"==typeof p.transform;p||l.warn("Unrecognized transform type "+f+"."),p&&p.supplyDefaults&&(d||g)?((u=p.supplyDefaults(h,e,r,t)).type=f,u._module=p,l.pushUnique(i,p)):u=l.extendFlat({},h),s.push(u)}}},v.supplyLayoutGlobalDefaults=function(t,e,r){function n(r,n){return l.coerce(t,e,v.layoutAttributes,r,n)}var i=t.template;l.isPlainObject(i)&&(e.template=i,e._template=i.layout,e._dataTemplate=i.data);var o=l.coerceFont(n,"font");n("title",e._dfltTitle.plot),l.coerceFont(n,"titlefont",{family:o.family,size:Math.round(1.4*o.size),color:o.color}),n("autosize",!(t.width&&t.height)),n("width"),n("height"),n("margin.l"),n("margin.r"),n("margin.t"),n("margin.b"),n("margin.pad"),n("margin.autoexpand"),t.width&&t.height&&v.sanitizeMargins(e),a.getComponentMethod("grid","sizeDefaults")(t,e),n("paper_bgcolor"),n("separators",r.decimal+r.thousands),n("hidesources"),n("colorway"),n("datarevision"),a.getComponentMethod("calendars","handleDefaults")(t,e,"calendar"),a.getComponentMethod("fx","supplyLayoutGlobalDefaults")(t,e,n)},v.plotAutoSize=function(t,e,r){var n,a,o=t._context||{},s=o.frameMargins,c=l.isPlotDiv(t);if(c&&t.emit("plotly_autosize"),o.fillFrame)n=window.innerWidth,a=window.innerHeight,document.body.style.overflow="hidden";else if(i(s)&&s>0){var u=function(t){var e,r={left:0,right:0,bottom:0,top:0};if(t)for(e in t)t.hasOwnProperty(e)&&(r.left+=t[e].left||0,r.right+=t[e].right||0,r.bottom+=t[e].bottom||0,r.top+=t[e].top||0);return r}(t._boundingBoxMargins),h=u.left+u.right,f=u.bottom+u.top,p=1-2*s,d=r._container&&r._container.node?r._container.node().getBoundingClientRect():{width:r.width,height:r.height};n=Math.round(p*(d.width-h)),a=Math.round(p*(d.height-f))}else{var g=c?window.getComputedStyle(t):{};n=parseFloat(g.width)||r.width,a=parseFloat(g.height)||r.height}var m=v.layoutAttributes.width.min,y=v.layoutAttributes.height.min;n<m&&(n=m),a<y&&(a=y);var x=!e.width&&Math.abs(r.width-n)>1,b=!e.height&&Math.abs(r.height-a)>1;(b||x)&&(x&&(r.width=n),b&&(r.height=a)),t._initialAutoSize||(t._initialAutoSize={width:n,height:a}),v.sanitizeMargins(r)},v.supplyLayoutModuleDefaults=function(t,e,r,n){var i,o,s,c=a.componentsRegistry,u=e._basePlotModules,h=a.subplotsRegistry.cartesian;for(i in c)(s=c[i]).includeBasePlot&&s.includeBasePlot(t,e);for(var f in u.length||u.push(h),e._has("cartesian")&&(a.getComponentMethod("grid","contentDefaults")(t,e),h.finalizeSubplots(t,e)),e._subplots)e._subplots[f].sort(l.subplotSort);for(o=0;o<u.length;o++)(s=u[o]).supplyLayoutDefaults&&s.supplyLayoutDefaults(t,e,r);var p=e._modules;for(o=0;o<p.length;o++)(s=p[o]).supplyLayoutDefaults&&s.supplyLayoutDefaults(t,e,r);var d=e._transformModules;for(o=0;o<d.length;o++)(s=d[o]).supplyLayoutDefaults&&s.supplyLayoutDefaults(t,e,r,n);for(i in c)(s=c[i]).supplyLayoutDefaults&&s.supplyLayoutDefaults(t,e,r)},v.purge=function(t){var e=t._fullLayout||{};void 0!==e._glcontainer&&(e._glcontainer.selectAll(".gl-canvas").remove(),e._glcontainer.remove(),e._glcanvas=null),void 0!==e._geocontainer&&e._geocontainer.remove(),e._modeBar&&e._modeBar.destroy(),t._transitionData&&(t._transitionData._interruptCallbacks&&(t._transitionData._interruptCallbacks.length=0),t._transitionData._animationRaf&&window.cancelAnimationFrame(t._transitionData._animationRaf)),l.clearThrottle(),delete t.data,delete t.layout,delete t._fullData,delete t._fullLayout,delete t.calcdata,delete t.framework,delete t.empty,delete t.fid,delete t.undoqueue,delete t.undonum,delete t.autoplay,delete t.changed,delete t._promises,delete t._redrawTimer,delete t.firstscatter,delete t._hmlumcount,delete t._hmpixcount,delete t._transitionData,delete t._transitioning,delete t._initialAutoSize,delete t._transitioningWithDuration,delete t._dragging,delete t._dragged,delete t._hoverdata,delete t._snapshotInProgress,delete t._editing,delete t._replotPending,delete t._mouseDownTime,delete t._legendMouseDownTime,t.removeAllListeners&&t.removeAllListeners()},v.style=function(t){var e,r=t._fullLayout._modules,n=[];for(e=0;e<r.length;e++){var i=r[e];i.style&&l.pushUnique(n,i.style)}for(e=0;e<n.length;e++)n[e](t)},v.sanitizeMargins=function(t){if(t&&t.margin){var e,r=t.width,n=t.height,i=t.margin,a=r-(i.l+i.r),o=n-(i.t+i.b);a<0&&(e=(r-1)/(i.l+i.r),i.l=Math.floor(e*i.l),i.r=Math.floor(e*i.r)),o<0&&(e=(n-1)/(i.t+i.b),i.t=Math.floor(e*i.t),i.b=Math.floor(e*i.b))}},v.clearAutoMarginIds=function(t){t._fullLayout._pushmarginIds={}},v.allowAutoMargin=function(t,e){t._fullLayout._pushmarginIds[e]=1},v.autoMargin=function(t,e,r){var n=t._fullLayout;A(n);var i=n._pushmargin,a=n._pushmarginIds;if(!1!==n.margin.autoexpand){if(r){var o=r.pad;if(void 0===o){var s=n.margin;o=Math.min(12,s.l,s.r,s.t,s.b)}r.l+r.r>.5*n.width&&(r.l=r.r=0),r.b+r.t>.5*n.height&&(r.b=r.t=0);var l=void 0!==r.xl?r.xl:r.x,c=void 0!==r.xr?r.xr:r.x,u=void 0!==r.yt?r.yt:r.y,h=void 0!==r.yb?r.yb:r.y;i[e]={l:{val:l,size:r.l+o},r:{val:c,size:r.r+o},b:{val:h,size:r.b+o},t:{val:u,size:r.t+o}},a[e]=1}else delete i[e],delete a[e];n._replotting||v.doAutoMargin(t)}},v.doAutoMargin=function(t){var e=t._fullLayout;e._size||(e._size={}),A(e);var r=e._size,n=JSON.stringify(r),o=Math.max(e.margin.l||0,0),s=Math.max(e.margin.r||0,0),l=Math.max(e.margin.t||0,0),c=Math.max(e.margin.b||0,0),u=e._pushmargin,h=e._pushmarginIds;if(!1!==e.margin.autoexpand){for(var f in u)h[f]||delete u[f];for(var p in u.base={l:{val:0,size:o},r:{val:1,size:s},t:{val:1,size:l},b:{val:0,size:c}},u){var d=u[p].l||{},g=u[p].b||{},m=d.val,v=d.size,y=g.val,x=g.size;for(var b in u){if(i(v)&&u[b].r){var _=u[b].r.val,w=u[b].r.size;if(_>m){var k=(v*_+(w-e.width)*m)/(_-m),M=(w*(1-m)+(v-e.width)*(1-_))/(_-m);k>=0&&M>=0&&k+M>o+s&&(o=k,s=M)}}if(i(x)&&u[b].t){var T=u[b].t.val,S=u[b].t.size;if(T>y){var E=(x*T+(S-e.height)*y)/(T-y),C=(S*(1-y)+(x-e.height)*(1-T))/(T-y);E>=0&&C>=0&&E+C>c+l&&(c=E,l=C)}}}}}if(r.l=Math.round(o),r.r=Math.round(s),r.t=Math.round(l),r.b=Math.round(c),r.p=Math.round(e.margin.pad),r.w=Math.round(e.width)-r.l-r.r,r.h=Math.round(e.height)-r.t-r.b,!e._replotting&&"{}"!==n&&n!==JSON.stringify(e._size))return"_redrawFromAutoMarginCount"in e?e._redrawFromAutoMarginCount++:e._redrawFromAutoMarginCount=1,a.call("plot",t)},v.graphJson=function(t,e,r,n,i){(i&&e&&!t._fullData||i&&!e&&!t._fullLayout)&&v.supplyDefaults(t);var a=i?t._fullData:t.data,o=i?t._fullLayout:t.layout,s=(t._transitionData||{})._frames;function c(t){if("function"==typeof t)return null;if(l.isPlainObject(t)){var e,n,i={};for(e in t)if("function"!=typeof t[e]&&-1===["_","["].indexOf(e.charAt(0))){if("keepdata"===r){if("src"===e.substr(e.length-3))continue}else if("keepstream"===r){if("string"==typeof(n=t[e+"src"])&&n.indexOf(":")>0&&!l.isPlainObject(t.stream))continue}else if("keepall"!==r&&"string"==typeof(n=t[e+"src"])&&n.indexOf(":")>0)continue;i[e]=c(t[e])}return i}return Array.isArray(t)?t.map(c):l.isJSDate(t)?l.ms2DateTimeLocal(+t):t}var u={data:(a||[]).map(function(t){var r=c(t);return e&&delete r.fit,r})};return e||(u.layout=c(o)),t.framework&&t.framework.isPolar&&(u=t.framework.getConfig()),s&&(u.frames=c(s)),"object"===n?u:JSON.stringify(u)},v.modifyFrames=function(t,e){var r,n,i,a=t._transitionData._frames,o=t._transitionData._frameHash;for(r=0;r<e.length;r++)switch((n=e[r]).type){case"replace":i=n.value;var s=(a[n.index]||{}).name,l=i.name;a[n.index]=o[l]=i,l!==s&&(delete o[s],o[l]=i);break;case"insert":o[(i=n.value).name]=i,a.splice(n.index,0,i);break;case"delete":delete o[(i=a[n.index]).name],a.splice(n.index,1)}return Promise.resolve()},v.computeFrame=function(t,e){var r,n,i,a,o=t._transitionData._frameHash;if(!e)throw new Error("computeFrame must be given a string frame name");var s=o[e.toString()];if(!s)return!1;for(var l=[s],c=[s.name];s.baseframe&&(s=o[s.baseframe.toString()])&&-1===c.indexOf(s.name);)l.push(s),c.push(s.name);for(var u={};s=l.pop();)if(s.layout&&(u.layout=v.extendLayout(u.layout,s.layout)),s.data){if(u.data||(u.data=[]),!(n=s.traces))for(n=[],r=0;r<s.data.length;r++)n[r]=r;for(u.traces||(u.traces=[]),r=0;r<s.data.length;r++)null!=(i=n[r])&&(-1===(a=u.traces.indexOf(i))&&(a=u.data.length,u.traces[a]=i),u.data[a]=v.extendTrace(u.data[a],s.data[r]))}return u},v.recomputeFrameHash=function(t){for(var e=t._transitionData._frameHash={},r=t._transitionData._frames,n=0;n<r.length;n++){var i=r[n];i&&i.name&&(e[i.name]=i)}},v.extendObjectWithContainers=function(t,e,r){var n,i,a,o,s,c,u,h=l.extendDeepNoArrays({},e||{}),f=l.expandObjectPaths(h),p={};if(r&&r.length)for(a=0;a<r.length;a++)void 0===(i=(n=l.nestedProperty(f,r[a])).get())?l.nestedProperty(p,r[a]).set(null):(n.set(null),l.nestedProperty(p,r[a]).set(i));if(t=l.extendDeepNoArrays(t||{},f),r&&r.length)for(a=0;a<r.length;a++)if(c=l.nestedProperty(p,r[a]).get()){for(u=(s=l.nestedProperty(t,r[a])).get(),Array.isArray(u)||(u=[],s.set(u)),o=0;o<c.length;o++){var d=c[o];u[o]=null===d?null:v.extendObjectWithContainers(u[o],d)}s.set(u)}return t},v.dataArrayContainers=["transforms","dimensions"],v.layoutArrayContainers=a.layoutArrayContainers,v.extendTrace=function(t,e){return v.extendObjectWithContainers(t,e,v.dataArrayContainers)},v.extendLayout=function(t,e){return v.extendObjectWithContainers(t,e,v.layoutArrayContainers)},v.transition=function(t,e,r,n,i,o){var s,c,u=Array.isArray(e)?e.length:0,h=n.slice(0,u),f=[];var p=!1;for(s=0;s<h.length;s++){c=h[s];t._fullData[c]._module}var d=[v.previousPromises,function(){if(t._transitionData)return t._transitioning=!1,function(t){var e=Promise.resolve();if(!t)return e;for(;t.length;)e=e.then(t.shift());return e}(t._transitionData._interruptCallbacks)},function(){var n;for(n=0;n<h.length;n++){var i=h[n],o=t._fullData[i]._module;o&&(o.animatable&&f.push(i),t.data[h[n]]=v.extendTrace(t.data[h[n]],e[n]))}var s=l.expandObjectPaths(l.extendDeepNoArrays({},r)),c=/^[xy]axis[0-9]*$/;for(var u in s)c.test(u)&&delete s[u].range;return v.extendLayout(t.layout,s),delete t.calcdata,v.supplyDefaults(t),v.doCalcdata(t),v.doSetPositions(t),a.getComponentMethod("errorbars","calc")(t),Promise.resolve()},v.rehover,function(){return t.emit("plotly_transitioning",[]),new Promise(function(e){t._transitioning=!0,o.duration>0&&(t._transitioningWithDuration=!0),t._transitionData._interruptCallbacks.push(function(){p=!0}),i.redraw&&t._transitionData._interruptCallbacks.push(function(){return a.call("redraw",t)}),t._transitionData._interruptCallbacks.push(function(){t.emit("plotly_transitioninterrupted",[])});var n,s,c=0,u=0;function h(){return c++,function(){var r;u++,p||u!==c||(r=e,t._transitionData&&(function(t){if(t)for(;t.length;)t.shift()}(t._transitionData._interruptCallbacks),Promise.resolve().then(function(){if(i.redraw)return a.call("redraw",t)}).then(function(){t._transitioning=!1,t._transitioningWithDuration=!1,t.emit("plotly_transitioned",[])}).then(r)))}}var d=t._fullLayout._basePlotModules,g=!1;if(r)for(s=0;s<d.length;s++)if(d[s].transitionAxes){var m=l.expandObjectPaths(r);g=d[s].transitionAxes(t,m,o,h)||g}for(g?((n=l.extendFlat({},o)).duration=0,f=null):n=o,s=0;s<d.length;s++)d[s].plot(t,f,n,h);setTimeout(h())})}],g=l.syncOrAsync(d,t);return g&&g.then||(g=Promise.resolve()),g.then(function(){return t})},v.doCalcdata=function(t,e){var r,n,i,s,l=h.list(t),c=t._fullData,f=t._fullLayout,p=new Array(c.length),d=(t.calcdata||[]).slice(0);for(t.calcdata=p,t.firstscatter=!0,f._numBoxes=0,f._numViolins=0,f._violinScaleGroupStats={},t._hmpixcount=0,t._hmlumcount=0,f._piecolormap={},f._piecolorway=null,f._piedefaultcolorcount=0,i=0;i<c.length;i++)Array.isArray(e)&&-1===e.indexOf(i)&&(p[i]=d[i]);for(i=0;i<c.length;i++)(r=c[i])._arrayAttrs=o.findArrayAttributes(r);var g=f._subplots.polar||[];for(i=0;i<g.length;i++)l.push(f[g[i]].radialaxis,f[g[i]].angularaxis);T(l);var m=!1;for(i=0;i<c.length;i++)if(!0===(r=c[i]).visible&&r.transforms){if((n=r._module)&&n.calc){var v=n.calc(t,r);v[0]&&v[0].t&&v[0].t._scene&&delete v[0].t._scene.dirty}for(s=0;s<r.transforms.length;s++){var x=r.transforms[s];(n=y[x.type])&&n.calcTransform&&(r._hasCalcTransform=!0,m=!0,n.calcTransform(t,r,x))}}function b(e,i){if(r=c[e],!!(n=r._module).isContainer===i){var a=[];if(!0===r.visible){delete r._indexToPoints;var o=r.transforms||[];for(s=o.length-1;s>=0;s--)if(o[s].enabled){r._indexToPoints=o[s]._indexToPoints;break}n&&n.calc&&(a=n.calc(t,r))}Array.isArray(a)&&a[0]||(a=[{x:u,y:u}]),a[0].t||(a[0].t={}),a[0].trace=r,p[e]=a}}for(m&&T(l),i=0;i<c.length;i++)b(i,!0);for(i=0;i<c.length;i++)b(i,!1);a.getComponentMethod("fx","calc")(t)},v.doSetPositions=function(t){var e,r,n=t._fullLayout,i=n._subplots.cartesian,a=n._modules,o=[];for(r=0;r<a.length;r++)l.pushUnique(o,a[r].setPositions);if(o.length)for(e=0;e<i.length;e++){var s=n._plots[i[e]];for(r=0;r<o.length;r++)o[r](t,s)}},v.rehover=function(t){t._fullLayout._rehover&&t._fullLayout._rehover()},v.generalUpdatePerTraceModule=function(t,e,r,n){var i,a=e.traceHash,o={};for(i=0;i<r.length;i++){var s=r[i],c=s[0].trace;c.visible&&(o[c.type]=o[c.type]||[],o[c.type].push(s))}for(var u in a)if(!o[u]){var h=a[u][0];h[0].trace.visible=!1,o[u]=[h]}for(var f in o){var p=o[f];p[0][0].trace._module.plot(t,e,l.filterVisible(p),n)}e.traceHash=o}},{"../components/color":558,"../constants/numerical":661,"../lib":684,"../plot_api/plot_schema":721,"../plot_api/plot_template":722,"../plots/cartesian/axis_ids":735,"../registry":817,"./animation_attributes":727,"./attributes":729,"./command":756,"./font_attributes":758,"./frame_attributes":759,"./layout_attributes":786,"./sort_modules":808,d3:147,"fast-isnumeric":214}],796:[function(t,e,r){"use strict";e.exports={attr:"subplot",name:"polar",axisNames:["angularaxis","radialaxis"],axisName2dataArray:{angularaxis:"theta",radialaxis:"r"},layerNames:["draglayer","plotbg","backplot","angular-grid","radial-grid","frontplot","angular-axis","radial-axis","angular-line","radial-line"],radialDragBoxSize:50,angularDragBoxSize:30,cornerLen:25,cornerHalfWidth:2,MINDRAG:8,MINZOOM:20,OFFEDGE:20}},{}],797:[function(t,e,r){"use strict";var n=t("../../lib");r.setConvertAngular=function(t){var e,r,i={clockwise:-1,counterclockwise:1}[t.direction],a=n.deg2rad(t.rotation);function o(){return t.period?Math.max(t.period,t._categories.length):t._categories.length}function s(t){return(t-a)/i}"linear"===t.type?(e=function(t,e){return"degrees"===e?n.deg2rad(t):t},r=function(t,e){return"degrees"===e?n.rad2deg(t):t}):"category"===t.type&&(e=function(t){var e=o();return 2*t*Math.PI/e},r=function(t){return t*o()/Math.PI/2}),t.unTransformRad=s,t._c2rad=e,t.c2rad=function(t,r){return function(t){return i*t+a}(e(t,r))},t.rad2c=function(t,e){return r(s(t),e)},t.c2deg=function(e,r){return n.rad2deg(t.c2rad(e,r))},t.deg2c=function(e,r){return t.rad2c(n.deg2rad(e),r)}}},{"../../lib":684}],798:[function(t,e,r){"use strict";var n=t("../get_data").getSubplotCalcData,i=t("../../lib").counterRegex,a=t("./polar"),o=t("./constants"),s=o.attr,l=o.name,c=i(l),u={};u[s]={valType:"subplotid",dflt:l,editType:"calc"},e.exports={attr:s,name:l,idRoot:l,idRegex:c,attrRegex:c,attributes:u,layoutAttributes:t("./layout_attributes"),supplyLayoutDefaults:t("./layout_defaults"),plot:function(t){for(var e=t._fullLayout,r=t.calcdata,i=e._subplots[l],o=0;o<i.length;o++){var s=i[o],c=n(r,l,s),u=e[s]._subplot;u||(u=a(t,s),e[s]._subplot=u),u.plot(c,e,t._promises)}},clean:function(t,e,r,n){for(var i=n._subplots[l]||[],a=0;a<i.length;a++){var o=i[a],s=n[o]._subplot;if(!e[o]&&s)for(var c in s.framework.remove(),s.layers["radial-axis-title"].remove(),s.clipPaths)s.clipPaths[c].remove()}},toSVG:t("../cartesian").toSVG}},{"../../lib":684,"../cartesian":743,"../get_data":768,"./constants":796,"./layout_attributes":799,"./layout_defaults":800,"./polar":807}],799:[function(t,e,r){"use strict";var n=t("../../components/color/attributes"),i=t("../cartesian/layout_attributes"),a=t("../domain").attributes,o=t("../../lib").extendFlat,s=t("../../plot_api/edit_types").overrideAll,l=s({color:i.color,showline:o({},i.showline,{dflt:!0}),linecolor:i.linecolor,linewidth:i.linewidth,showgrid:o({},i.showgrid,{dflt:!0}),gridcolor:i.gridcolor,gridwidth:i.gridwidth},"plot","from-root"),c=s({tickmode:i.tickmode,nticks:i.nticks,tick0:i.tick0,dtick:i.dtick,tickvals:i.tickvals,ticktext:i.ticktext,ticks:i.ticks,ticklen:i.ticklen,tickwidth:i.tickwidth,tickcolor:i.tickcolor,showticklabels:i.showticklabels,showtickprefix:i.showtickprefix,tickprefix:i.tickprefix,showticksuffix:i.showticksuffix,ticksuffix:i.ticksuffix,showexponent:i.showexponent,exponentformat:i.exponentformat,separatethousands:i.separatethousands,tickfont:i.tickfont,tickangle:i.tickangle,tickformat:i.tickformat,tickformatstops:i.tickformatstops,layer:i.layer},"plot","from-root"),u={visible:o({},i.visible,{dflt:!0}),type:i.type,autorange:i.autorange,rangemode:{valType:"enumerated",values:["tozero","nonnegative","normal"],dflt:"tozero",editType:"calc"},range:i.range,categoryorder:i.categoryorder,categoryarray:i.categoryarray,angle:{valType:"angle",editType:"plot"},side:{valType:"enumerated",values:["clockwise","counterclockwise"],dflt:"clockwise",editType:"plot"},title:o({},i.title,{editType:"plot",dflt:""}),titlefont:s(i.titlefont,"plot","from-root"),hoverformat:i.hoverformat,editType:"calc"};o(u,l,c);var h={visible:o({},i.visible,{dflt:!0}),type:{valType:"enumerated",values:["-","linear","category"],dflt:"-",editType:"calc",_noTemplating:!0},categoryorder:i.categoryorder,categoryarray:i.categoryarray,thetaunit:{valType:"enumerated",values:["radians","degrees"],dflt:"degrees",editType:"calc"},period:{valType:"number",editType:"calc",min:0},direction:{valType:"enumerated",values:["counterclockwise","clockwise"],dflt:"counterclockwise",editType:"calc"},rotation:{valType:"angle",editType:"calc"},hoverformat:i.hoverformat,editType:"calc"};o(h,l,c),e.exports={domain:a({name:"polar",editType:"plot"}),sector:{valType:"info_array",items:[{valType:"number",editType:"plot"},{valType:"number",editType:"plot"}],dflt:[0,360],editType:"plot"},bgcolor:{valType:"color",editType:"plot",dflt:n.background},radialaxis:u,angularaxis:h,gridshape:{valType:"enumerated",values:["circular","linear"],dflt:"circular",editType:"plot"},editType:"calc"}},{"../../components/color/attributes":557,"../../lib":684,"../../plot_api/edit_types":715,"../cartesian/layout_attributes":744,"../domain":757}],800:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../components/color"),a=t("../subplot_defaults"),o=t("../get_data").getSubplotData,s=t("../cartesian/tick_value_defaults"),l=t("../cartesian/tick_mark_defaults"),c=t("../cartesian/tick_label_defaults"),u=t("../cartesian/category_order_defaults"),h=t("../cartesian/line_grid_defaults"),f=t("../cartesian/axis_autotype"),p=t("../cartesian/set_convert"),d=t("./helpers").setConvertAngular,g=t("./layout_attributes"),m=t("./constants"),v=m.axisNames;function y(t,e,r,a){var f=r("bgcolor");a.bgColor=i.combine(f,a.paper_bgcolor);var y,b=r("sector"),_=o(a.fullData,m.name,a.id),w=a.layoutOut;function k(t,e){return r(y+"."+t,e)}for(var M=0;M<v.length;M++){y=v[M],n.isPlainObject(t[y])||(t[y]={});var A=t[y],T=e[y]={};T._id=T._name=y;var S=m.axisName2dataArray[y],E=x(A,T,k,_,S);u(A,T,k,{axData:_,dataAttr:S});var C,L,z=k("visible");switch(p(T,w),z&&(L=(C=k("color"))===A.color?C:a.font.color),T._m=1,y){case"radialaxis":var P=k("autorange",!T.isValidRange(A.range));A.autorange=P,P&&k("rangemode"),"reversed"===P&&(T._m=-1),k("range"),T.cleanRange("range",{dfltRange:[0,1]}),z&&(k("side"),k("angle",b[0]),k("title"),n.coerceFont(k,"titlefont",{family:a.font.family,size:Math.round(1.2*a.font.size),color:L}));break;case"angularaxis":if("date"===E){n.log("Polar plots do not support date angular axes yet.");for(var I=0;I<_.length;I++)_[I].visible=!1;E=A.type=T.type="linear"}k("linear"===E?"thetaunit":"period");var O=k("direction");k("rotation",{counterclockwise:0,clockwise:90}[O]),d(T)}if(z)s(A,T,k,T.type),c(A,T,k,T.type,{tickSuffixDflt:"degrees"===T.thetaunit?"\xb0":void 0}),l(A,T,k,{outerTicks:!0}),k("showticklabels")&&(n.coerceFont(k,"tickfont",{family:a.font.family,size:a.font.size,color:L}),k("tickangle"),k("tickformat")),h(A,T,k,{dfltColor:C,bgColor:a.bgColor,blend:60,showLine:!0,showGrid:!0,noZeroLine:!0,attributes:g[y]}),k("layer");"category"!==E&&k("hoverformat"),T._input=A}"category"===e.angularaxis.type&&r("gridshape")}function x(t,e,r,n,i){if("-"===r("type")){for(var a,o=0;o<n.length;o++)if(n[o].visible){a=n[o];break}a&&(e.type=f(a[i],"gregorian")),"-"===e.type?e.type="linear":t.type=e.type}return e.type}e.exports=function(t,e,r){a(t,e,r,{type:m.name,attributes:g,handleDefaults:y,font:e.font,paper_bgcolor:e.paper_bgcolor,fullData:r,layoutOut:e})}},{"../../components/color":558,"../../lib":684,"../cartesian/axis_autotype":733,"../cartesian/category_order_defaults":736,"../cartesian/line_grid_defaults":746,"../cartesian/set_convert":750,"../cartesian/tick_label_defaults":751,"../cartesian/tick_mark_defaults":752,"../cartesian/tick_value_defaults":753,"../get_data":768,"../subplot_defaults":809,"./constants":796,"./helpers":797,"./layout_attributes":799}],801:[function(t,e,r){"use strict";var n=t("../../../traces/scatter/attributes"),i=n.marker;e.exports={r:n.r,t:n.t,marker:{color:i.color,size:i.size,symbol:i.symbol,opacity:i.opacity,editType:"calc"}}},{"../../../traces/scatter/attributes":1015}],802:[function(t,e,r){"use strict";var n=t("../../cartesian/layout_attributes"),i=t("../../../lib/extend").extendFlat,a=t("../../../plot_api/edit_types").overrideAll,o=i({},n.domain,{});function s(t,e){return i({},e,{showline:{valType:"boolean"},showticklabels:{valType:"boolean"},tickorientation:{valType:"enumerated",values:["horizontal","vertical"]},ticklen:{valType:"number",min:0},tickcolor:{valType:"color"},ticksuffix:{valType:"string"},endpadding:{valType:"number"},visible:{valType:"boolean"}})}e.exports=a({radialaxis:s(0,{range:{valType:"info_array",items:[{valType:"number"},{valType:"number"}]},domain:o,orientation:{valType:"number"}}),angularaxis:s(0,{range:{valType:"info_array",items:[{valType:"number",dflt:0},{valType:"number",dflt:360}]},domain:o}),layout:{direction:{valType:"enumerated",values:["clockwise","counterclockwise"]},orientation:{valType:"angle"}}},"plot","nested")},{"../../../lib/extend":673,"../../../plot_api/edit_types":715,"../../cartesian/layout_attributes":744}],803:[function(t,e,r){"use strict";(e.exports=t("./micropolar")).manager=t("./micropolar_manager")},{"./micropolar":804,"./micropolar_manager":805}],804:[function(t,e,r){var n=t("d3"),i=t("../../../lib").extendDeepAll,a=t("../../../constants/alignment").MID_SHIFT,o=e.exports={version:"0.2.2"};o.Axis=function(){var t,e,r,s,l={data:[],layout:{}},c={},u={},h=n.dispatch("hover"),f={};return f.render=function(c){return function(c){e=c||e;var h=l.data,f=l.layout;("string"==typeof e||e.nodeName)&&(e=n.select(e)),e.datum(h).each(function(e,l){var c=e.slice();u={data:o.util.cloneJson(c),layout:o.util.cloneJson(f)};var h=0;c.forEach(function(t,e){t.color||(t.color=f.defaultColorRange[h],h=(h+1)%f.defaultColorRange.length),t.strokeColor||(t.strokeColor="LinePlot"===t.geometry?t.color:n.rgb(t.color).darker().toString()),u.data[e].color=t.color,u.data[e].strokeColor=t.strokeColor,u.data[e].strokeDash=t.strokeDash,u.data[e].strokeSize=t.strokeSize});var p=c.filter(function(t,e){var r=t.visible;return"undefined"==typeof r||!0===r}),d=!1,g=p.map(function(t,e){return d=d||"undefined"!=typeof t.groupId,t});if(d){var m=n.nest().key(function(t,e){return"undefined"!=typeof t.groupId?t.groupId:"unstacked"}).entries(g),v=[],y=m.map(function(t,e){if("unstacked"===t.key)return t.values;var r=t.values[0].r.map(function(t,e){return 0});return t.values.forEach(function(t,e,n){t.yStack=[r],v.push(r),r=o.util.sumArrays(t.r,r)}),t.values});p=n.merge(y)}p.forEach(function(t,e){t.t=Array.isArray(t.t[0])?t.t:[t.t],t.r=Array.isArray(t.r[0])?t.r:[t.r]});var x=Math.min(f.width-f.margin.left-f.margin.right,f.height-f.margin.top-f.margin.bottom)/2;x=Math.max(10,x);var b,_=[f.margin.left+x,f.margin.top+x];b=d?[0,n.max(o.util.sumArrays(o.util.arrayLast(p).r[0],o.util.arrayLast(v)))]:n.extent(o.util.flattenArray(p.map(function(t,e){return t.r}))),f.radialAxis.domain!=o.DATAEXTENT&&(b[0]=0),r=n.scale.linear().domain(f.radialAxis.domain!=o.DATAEXTENT&&f.radialAxis.domain?f.radialAxis.domain:b).range([0,x]),u.layout.radialAxis.domain=r.domain();var w,k=o.util.flattenArray(p.map(function(t,e){return t.t})),M="string"==typeof k[0];M&&(k=o.util.deduplicate(k),w=k.slice(),k=n.range(k.length),p=p.map(function(t,e){var r=t;return t.t=[k],d&&(r.yStack=t.yStack),r}));var A=p.filter(function(t,e){return"LinePlot"===t.geometry||"DotPlot"===t.geometry}).length===p.length,T=null===f.needsEndSpacing?M||!A:f.needsEndSpacing,S=f.angularAxis.domain&&f.angularAxis.domain!=o.DATAEXTENT&&!M&&f.angularAxis.domain[0]>=0?f.angularAxis.domain:n.extent(k),E=Math.abs(k[1]-k[0]);A&&!M&&(E=0);var C=S.slice();T&&M&&(C[1]+=E);var L=f.angularAxis.ticksCount||4;L>8&&(L=L/(L/8)+L%8),f.angularAxis.ticksStep&&(L=(C[1]-C[0])/L);var z=f.angularAxis.ticksStep||(C[1]-C[0])/(L*(f.minorTicks+1));w&&(z=Math.max(Math.round(z),1)),C[2]||(C[2]=z);var P=n.range.apply(this,C);if(P=P.map(function(t,e){return parseFloat(t.toPrecision(12))}),s=n.scale.linear().domain(C.slice(0,2)).range("clockwise"===f.direction?[0,360]:[360,0]),u.layout.angularAxis.domain=s.domain(),u.layout.angularAxis.endPadding=T?E:0,"undefined"==typeof(t=n.select(this).select("svg.chart-root"))||t.empty()){var I=(new DOMParser).parseFromString("<svg xmlns='http://www.w3.org/2000/svg' class='chart-root'>' + '<g class='outer-group'>' + '<g class='chart-group'>' + '<circle class='background-circle'></circle>' + '<g class='geometry-group'></g>' + '<g class='radial axis-group'>' + '<circle class='outside-circle'></circle>' + '</g>' + '<g class='angular axis-group'></g>' + '<g class='guides-group'><line></line><circle r='0'></circle></g>' + '</g>' + '<g class='legend-group'></g>' + '<g class='tooltips-group'></g>' + '<g class='title-group'><text></text></g>' + '</g>' + '</svg>","application/xml"),O=this.appendChild(this.ownerDocument.importNode(I.documentElement,!0));t=n.select(O)}t.select(".guides-group").style({"pointer-events":"none"}),t.select(".angular.axis-group").style({"pointer-events":"none"}),t.select(".radial.axis-group").style({"pointer-events":"none"});var D,R=t.select(".chart-group"),B={fill:"none",stroke:f.tickColor},F={"font-size":f.font.size,"font-family":f.font.family,fill:f.font.color,"text-shadow":["-1px 0px","1px -1px","-1px 1px","1px 1px"].map(function(t,e){return" "+t+" 0 "+f.font.outlineColor}).join(",")};if(f.showLegend){D=t.select(".legend-group").attr({transform:"translate("+[x,f.margin.top]+")"}).style({display:"block"});var N=p.map(function(t,e){var r=o.util.cloneJson(t);return r.symbol="DotPlot"===t.geometry?t.dotType||"circle":"LinePlot"!=t.geometry?"square":"line",r.visibleInLegend="undefined"==typeof t.visibleInLegend||t.visibleInLegend,r.color="LinePlot"===t.geometry?t.strokeColor:t.color,r});o.Legend().config({data:p.map(function(t,e){return t.name||"Element"+e}),legendConfig:i({},o.Legend.defaultConfig().legendConfig,{container:D,elements:N,reverseOrder:f.legend.reverseOrder})})();var j=D.node().getBBox();x=Math.min(f.width-j.width-f.margin.left-f.margin.right,f.height-f.margin.top-f.margin.bottom)/2,x=Math.max(10,x),_=[f.margin.left+x,f.margin.top+x],r.range([0,x]),u.layout.radialAxis.domain=r.domain(),D.attr("transform","translate("+[_[0]+x,_[1]-x]+")")}else D=t.select(".legend-group").style({display:"none"});t.attr({width:f.width,height:f.height}).style({opacity:f.opacity}),R.attr("transform","translate("+_+")").style({cursor:"crosshair"});var V=[(f.width-(f.margin.left+f.margin.right+2*x+(j?j.width:0)))/2,(f.height-(f.margin.top+f.margin.bottom+2*x))/2];if(V[0]=Math.max(0,V[0]),V[1]=Math.max(0,V[1]),t.select(".outer-group").attr("transform","translate("+V+")"),f.title){var U=t.select("g.title-group text").style(F).text(f.title),q=U.node().getBBox();U.attr({x:_[0]-q.width/2,y:_[1]-x-20})}var H=t.select(".radial.axis-group");if(f.radialAxis.gridLinesVisible){var G=H.selectAll("circle.grid-circle").data(r.ticks(5));G.enter().append("circle").attr({class:"grid-circle"}).style(B),G.attr("r",r),G.exit().remove()}H.select("circle.outside-circle").attr({r:x}).style(B);var W=t.select("circle.background-circle").attr({r:x}).style({fill:f.backgroundColor,stroke:f.stroke});function Y(t,e){return s(t)%360+f.orientation}if(f.radialAxis.visible){var X=n.svg.axis().scale(r).ticks(5).tickSize(5);H.call(X).attr({transform:"rotate("+f.radialAxis.orientation+")"}),H.selectAll(".domain").style(B),H.selectAll("g>text").text(function(t,e){return this.textContent+f.radialAxis.ticksSuffix}).style(F).style({"text-anchor":"start"}).attr({x:0,y:0,dx:0,dy:0,transform:function(t,e){return"horizontal"===f.radialAxis.tickOrientation?"rotate("+-f.radialAxis.orientation+") translate("+[0,F["font-size"]]+")":"translate("+[0,F["font-size"]]+")"}}),H.selectAll("g>line").style({stroke:"black"})}var Z=t.select(".angular.axis-group").selectAll("g.angular-tick").data(P),$=Z.enter().append("g").classed("angular-tick",!0);Z.attr({transform:function(t,e){return"rotate("+Y(t)+")"}}).style({display:f.angularAxis.visible?"block":"none"}),Z.exit().remove(),$.append("line").classed("grid-line",!0).classed("major",function(t,e){return e%(f.minorTicks+1)==0}).classed("minor",function(t,e){return!(e%(f.minorTicks+1)==0)}).style(B),$.selectAll(".minor").style({stroke:f.minorTickColor}),Z.select("line.grid-line").attr({x1:f.tickLength?x-f.tickLength:0,x2:x}).style({display:f.angularAxis.gridLinesVisible?"block":"none"}),$.append("text").classed("axis-text",!0).style(F);var J=Z.select("text.axis-text").attr({x:x+f.labelOffset,dy:a+"em",transform:function(t,e){var r=Y(t),n=x+f.labelOffset,i=f.angularAxis.tickOrientation;return"horizontal"==i?"rotate("+-r+" "+n+" 0)":"radial"==i?r<270&&r>90?"rotate(180 "+n+" 0)":null:"rotate("+(r<=180&&r>0?-90:90)+" "+n+" 0)"}}).style({"text-anchor":"middle",display:f.angularAxis.labelsVisible?"block":"none"}).text(function(t,e){return e%(f.minorTicks+1)!=0?"":w?w[t]+f.angularAxis.ticksSuffix:t+f.angularAxis.ticksSuffix}).style(F);f.angularAxis.rewriteTicks&&J.text(function(t,e){return e%(f.minorTicks+1)!=0?"":f.angularAxis.rewriteTicks(this.textContent,e)});var K=n.max(R.selectAll(".angular-tick text")[0].map(function(t,e){return t.getCTM().e+t.getBBox().width}));D.attr({transform:"translate("+[x+K,f.margin.top]+")"});var Q=t.select("g.geometry-group").selectAll("g").size()>0,tt=t.select("g.geometry-group").selectAll("g.geometry").data(p);if(tt.enter().append("g").attr({class:function(t,e){return"geometry geometry"+e}}),tt.exit().remove(),p[0]||Q){var et=[];p.forEach(function(t,e){var n={};n.radialScale=r,n.angularScale=s,n.container=tt.filter(function(t,r){return r==e}),n.geometry=t.geometry,n.orientation=f.orientation,n.direction=f.direction,n.index=e,et.push({data:t,geometryConfig:n})});var rt=n.nest().key(function(t,e){return"undefined"!=typeof t.data.groupId||"unstacked"}).entries(et),nt=[];rt.forEach(function(t,e){"unstacked"===t.key?nt=nt.concat(t.values.map(function(t,e){return[t]})):nt.push(t.values)}),nt.forEach(function(t,e){var r;r=Array.isArray(t)?t[0].geometryConfig.geometry:t.geometryConfig.geometry;var n=t.map(function(t,e){return i(o[r].defaultConfig(),t)});o[r]().config(n)()})}var it,at,ot=t.select(".guides-group"),st=t.select(".tooltips-group"),lt=o.tooltipPanel().config({container:st,fontSize:8})(),ct=o.tooltipPanel().config({container:st,fontSize:8})(),ut=o.tooltipPanel().config({container:st,hasTick:!0})();if(!M){var ht=ot.select("line").attr({x1:0,y1:0,y2:0}).style({stroke:"grey","pointer-events":"none"});R.on("mousemove.angular-guide",function(t,e){var r=o.util.getMousePos(W).angle;ht.attr({x2:-x,transform:"rotate("+r+")"}).style({opacity:.5});var n=(r+180+360-f.orientation)%360;it=s.invert(n);var i=o.util.convertToCartesian(x+12,r+180);lt.text(o.util.round(it)).move([i[0]+_[0],i[1]+_[1]])}).on("mouseout.angular-guide",function(t,e){ot.select("line").style({opacity:0})})}var ft=ot.select("circle").style({stroke:"grey",fill:"none"});R.on("mousemove.radial-guide",function(t,e){var n=o.util.getMousePos(W).radius;ft.attr({r:n}).style({opacity:.5}),at=r.invert(o.util.getMousePos(W).radius);var i=o.util.convertToCartesian(n,f.radialAxis.orientation);ct.text(o.util.round(at)).move([i[0]+_[0],i[1]+_[1]])}).on("mouseout.radial-guide",function(t,e){ft.style({opacity:0}),ut.hide(),lt.hide(),ct.hide()}),t.selectAll(".geometry-group .mark").on("mouseover.tooltip",function(e,r){var i=n.select(this),a=this.style.fill,s="black",l=this.style.opacity||1;if(i.attr({"data-opacity":l}),a&&"none"!==a){i.attr({"data-fill":a}),s=n.hsl(a).darker().toString(),i.style({fill:s,opacity:1});var c={t:o.util.round(e[0]),r:o.util.round(e[1])};M&&(c.t=w[e[0]]);var u="t: "+c.t+", r: "+c.r,h=this.getBoundingClientRect(),f=t.node().getBoundingClientRect(),p=[h.left+h.width/2-V[0]-f.left,h.top+h.height/2-V[1]-f.top];ut.config({color:s}).text(u),ut.move(p)}else a=this.style.stroke||"black",i.attr({"data-stroke":a}),s=n.hsl(a).darker().toString(),i.style({stroke:s,opacity:1})}).on("mousemove.tooltip",function(t,e){if(0!=n.event.which)return!1;n.select(this).attr("data-fill")&&ut.show()}).on("mouseout.tooltip",function(t,e){ut.hide();var r=n.select(this),i=r.attr("data-fill");i?r.style({fill:i,opacity:r.attr("data-opacity")}):r.style({stroke:r.attr("data-stroke"),opacity:r.attr("data-opacity")})})})}(c),this},f.config=function(t){if(!arguments.length)return l;var e=o.util.cloneJson(t);return e.data.forEach(function(t,e){l.data[e]||(l.data[e]={}),i(l.data[e],o.Axis.defaultConfig().data[0]),i(l.data[e],t)}),i(l.layout,o.Axis.defaultConfig().layout),i(l.layout,e.layout),this},f.getLiveConfig=function(){return u},f.getinputConfig=function(){return c},f.radialScale=function(t){return r},f.angularScale=function(t){return s},f.svg=function(){return t},n.rebind(f,h,"on"),f},o.Axis.defaultConfig=function(t,e){return{data:[{t:[1,2,3,4],r:[10,11,12,13],name:"Line1",geometry:"LinePlot",color:null,strokeDash:"solid",strokeColor:null,strokeSize:"1",visibleInLegend:!0,opacity:1}],layout:{defaultColorRange:n.scale.category10().range(),title:null,height:450,width:500,margin:{top:40,right:40,bottom:40,left:40},font:{size:12,color:"gray",outlineColor:"white",family:"Tahoma, sans-serif"},direction:"clockwise",orientation:0,labelOffset:10,radialAxis:{domain:null,orientation:-45,ticksSuffix:"",visible:!0,gridLinesVisible:!0,tickOrientation:"horizontal",rewriteTicks:null},angularAxis:{domain:[0,360],ticksSuffix:"",visible:!0,gridLinesVisible:!0,labelsVisible:!0,tickOrientation:"horizontal",rewriteTicks:null,ticksCount:null,ticksStep:null},minorTicks:0,tickLength:null,tickColor:"silver",minorTickColor:"#eee",backgroundColor:"none",needsEndSpacing:null,showLegend:!0,legend:{reverseOrder:!1},opacity:1}}},o.util={},o.DATAEXTENT="dataExtent",o.AREA="AreaChart",o.LINE="LinePlot",o.DOT="DotPlot",o.BAR="BarChart",o.util._override=function(t,e){for(var r in t)r in e&&(e[r]=t[r])},o.util._extend=function(t,e){for(var r in t)e[r]=t[r]},o.util._rndSnd=function(){return 2*Math.random()-1+(2*Math.random()-1)+(2*Math.random()-1)},o.util.dataFromEquation2=function(t,e){var r=e||6;return n.range(0,360+r,r).map(function(e,r){var n=e*Math.PI/180;return[e,t(n)]})},o.util.dataFromEquation=function(t,e,r){var i=e||6,a=[],o=[];n.range(0,360+i,i).forEach(function(e,r){var n=e*Math.PI/180,i=t(n);a.push(e),o.push(i)});var s={t:a,r:o};return r&&(s.name=r),s},o.util.ensureArray=function(t,e){if("undefined"==typeof t)return null;var r=[].concat(t);return n.range(e).map(function(t,e){return r[e]||r[0]})},o.util.fillArrays=function(t,e,r){return e.forEach(function(e,n){t[e]=o.util.ensureArray(t[e],r)}),t},o.util.cloneJson=function(t){return JSON.parse(JSON.stringify(t))},o.util.validateKeys=function(t,e){"string"==typeof e&&(e=e.split("."));var r=e.shift();return t[r]&&(!e.length||objHasKeys(t[r],e))},o.util.sumArrays=function(t,e){return n.zip(t,e).map(function(t,e){return n.sum(t)})},o.util.arrayLast=function(t){return t[t.length-1]},o.util.arrayEqual=function(t,e){for(var r=Math.max(t.length,e.length,1);r-- >=0&&t[r]===e[r];);return-2===r},o.util.flattenArray=function(t){for(var e=[];!o.util.arrayEqual(e,t);)e=t,t=[].concat.apply([],t);return t},o.util.deduplicate=function(t){return t.filter(function(t,e,r){return r.indexOf(t)==e})},o.util.convertToCartesian=function(t,e){var r=e*Math.PI/180;return[t*Math.cos(r),t*Math.sin(r)]},o.util.round=function(t,e){var r=e||2,n=Math.pow(10,r);return Math.round(t*n)/n},o.util.getMousePos=function(t){var e=n.mouse(t.node()),r=e[0],i=e[1],a={};return a.x=r,a.y=i,a.pos=e,a.angle=180*(Math.atan2(i,r)+Math.PI)/Math.PI,a.radius=Math.sqrt(r*r+i*i),a},o.util.duplicatesCount=function(t){for(var e,r={},n={},i=0,a=t.length;i<a;i++)(e=t[i])in r?(r[e]++,n[e]=r[e]):r[e]=1;return n},o.util.duplicates=function(t){return Object.keys(o.util.duplicatesCount(t))},o.util.translator=function(t,e,r,n){if(n){var i=r.slice();r=e,e=i}var a=e.reduce(function(t,e){if("undefined"!=typeof t)return t[e]},t);"undefined"!=typeof a&&(e.reduce(function(t,r,n){if("undefined"!=typeof t)return n===e.length-1&&delete t[r],t[r]},t),r.reduce(function(t,e,n){return"undefined"==typeof t[e]&&(t[e]={}),n===r.length-1&&(t[e]=a),t[e]},t))},o.PolyChart=function(){var t=[o.PolyChart.defaultConfig()],e=n.dispatch("hover"),r={solid:"none",dash:[5,2],dot:[2,5]};function a(){var e=t[0].geometryConfig,i=e.container;"string"==typeof i&&(i=n.select(i)),i.datum(t).each(function(t,i){var a=!!t[0].data.yStack,o=t.map(function(t,e){return a?n.zip(t.data.t[0],t.data.r[0],t.data.yStack[0]):n.zip(t.data.t[0],t.data.r[0])}),s=e.angularScale,l=e.radialScale.domain()[0],c={bar:function(r,i,a){var o=t[a].data,l=e.radialScale(r[1])-e.radialScale(0),c=e.radialScale(r[2]||0),u=o.barWidth;n.select(this).attr({class:"mark bar",d:"M"+[[l+c,-u/2],[l+c,u/2],[c,u/2],[c,-u/2]].join("L")+"Z",transform:function(t,r){return"rotate("+(e.orientation+s(t[0]))+")"}})}};c.dot=function(r,i,a){var o=r[2]?[r[0],r[1]+r[2]]:r,s=n.svg.symbol().size(t[a].data.dotSize).type(t[a].data.dotType)(r,i);n.select(this).attr({class:"mark dot",d:s,transform:function(t,r){var n,i,a,s=(n=function(t,r){var n=e.radialScale(t[1]),i=(e.angularScale(t[0])+e.orientation)*Math.PI/180;return{r:n,t:i}}(o),i=n.r*Math.cos(n.t),a=n.r*Math.sin(n.t),{x:i,y:a});return"translate("+[s.x,s.y]+")"}})};var u=n.svg.line.radial().interpolate(t[0].data.lineInterpolation).radius(function(t){return e.radialScale(t[1])}).angle(function(t){return e.angularScale(t[0])*Math.PI/180});c.line=function(r,i,a){var s=r[2]?o[a].map(function(t,e){return[t[0],t[1]+t[2]]}):o[a];if(n.select(this).each(c.dot).style({opacity:function(e,r){return+t[a].data.dotVisible},fill:d.stroke(r,i,a)}).attr({class:"mark dot"}),!(i>0)){var l=n.select(this.parentNode).selectAll("path.line").data([0]);l.enter().insert("path"),l.attr({class:"line",d:u(s),transform:function(t,r){return"rotate("+(e.orientation+90)+")"},"pointer-events":"none"}).style({fill:function(t,e){return d.fill(r,i,a)},"fill-opacity":0,stroke:function(t,e){return d.stroke(r,i,a)},"stroke-width":function(t,e){return d["stroke-width"](r,i,a)},"stroke-dasharray":function(t,e){return d["stroke-dasharray"](r,i,a)},opacity:function(t,e){return d.opacity(r,i,a)},display:function(t,e){return d.display(r,i,a)}})}};var h=e.angularScale.range(),f=Math.abs(h[1]-h[0])/o[0].length*Math.PI/180,p=n.svg.arc().startAngle(function(t){return-f/2}).endAngle(function(t){return f/2}).innerRadius(function(t){return e.radialScale(l+(t[2]||0))}).outerRadius(function(t){return e.radialScale(l+(t[2]||0))+e.radialScale(t[1])});c.arc=function(t,r,i){n.select(this).attr({class:"mark arc",d:p,transform:function(t,r){return"rotate("+(e.orientation+s(t[0])+90)+")"}})};var d={fill:function(e,r,n){return t[n].data.color},stroke:function(e,r,n){return t[n].data.strokeColor},"stroke-width":function(e,r,n){return t[n].data.strokeSize+"px"},"stroke-dasharray":function(e,n,i){return r[t[i].data.strokeDash]},opacity:function(e,r,n){return t[n].data.opacity},display:function(e,r,n){return"undefined"==typeof t[n].data.visible||t[n].data.visible?"block":"none"}},g=n.select(this).selectAll("g.layer").data(o);g.enter().append("g").attr({class:"layer"});var m=g.selectAll("path.mark").data(function(t,e){return t});m.enter().append("path").attr({class:"mark"}),m.style(d).each(c[e.geometryType]),m.exit().remove(),g.exit().remove()})}return a.config=function(e){return arguments.length?(e.forEach(function(e,r){t[r]||(t[r]={}),i(t[r],o.PolyChart.defaultConfig()),i(t[r],e)}),this):t},a.getColorScale=function(){},n.rebind(a,e,"on"),a},o.PolyChart.defaultConfig=function(){return{data:{name:"geom1",t:[[1,2,3,4]],r:[[1,2,3,4]],dotType:"circle",dotSize:64,dotVisible:!1,barWidth:20,color:"#ffa500",strokeSize:1,strokeColor:"silver",strokeDash:"solid",opacity:1,index:0,visible:!0,visibleInLegend:!0},geometryConfig:{geometry:"LinePlot",geometryType:"arc",direction:"clockwise",orientation:0,container:"body",radialScale:null,angularScale:null,colorScale:n.scale.category20()}}},o.BarChart=function(){return o.PolyChart()},o.BarChart.defaultConfig=function(){return{geometryConfig:{geometryType:"bar"}}},o.AreaChart=function(){return o.PolyChart()},o.AreaChart.defaultConfig=function(){return{geometryConfig:{geometryType:"arc"}}},o.DotPlot=function(){return o.PolyChart()},o.DotPlot.defaultConfig=function(){return{geometryConfig:{geometryType:"dot",dotType:"circle"}}},o.LinePlot=function(){return o.PolyChart()},o.LinePlot.defaultConfig=function(){return{geometryConfig:{geometryType:"line"}}},o.Legend=function(){var t=o.Legend.defaultConfig(),e=n.dispatch("hover");function r(){var e=t.legendConfig,a=t.data.map(function(t,r){return[].concat(t).map(function(t,n){var a=i({},e.elements[r]);return a.name=t,a.color=[].concat(e.elements[r].color)[n],a})}),o=n.merge(a);o=o.filter(function(t,r){return e.elements[r]&&(e.elements[r].visibleInLegend||"undefined"==typeof e.elements[r].visibleInLegend)}),e.reverseOrder&&(o=o.reverse());var s=e.container;("string"==typeof s||s.nodeName)&&(s=n.select(s));var l=o.map(function(t,e){return t.color}),c=e.fontSize,u=null==e.isContinuous?"number"==typeof o[0]:e.isContinuous,h=u?e.height:c*o.length,f=s.classed("legend-group",!0).selectAll("svg").data([0]),p=f.enter().append("svg").attr({width:300,height:h+c,xmlns:"http://www.w3.org/2000/svg","xmlns:xlink":"http://www.w3.org/1999/xlink",version:"1.1"});p.append("g").classed("legend-axis",!0),p.append("g").classed("legend-marks",!0);var d=n.range(o.length),g=n.scale[u?"linear":"ordinal"]().domain(d).range(l),m=n.scale[u?"linear":"ordinal"]().domain(d)[u?"range":"rangePoints"]([0,h]);if(u){var v=f.select(".legend-marks").append("defs").append("linearGradient").attr({id:"grad1",x1:"0%",y1:"0%",x2:"0%",y2:"100%"}).selectAll("stop").data(l);v.enter().append("stop"),v.attr({offset:function(t,e){return e/(l.length-1)*100+"%"}}).style({"stop-color":function(t,e){return t}}),f.append("rect").classed("legend-mark",!0).attr({height:e.height,width:e.colorBandWidth,fill:"url(#grad1)"})}else{var y=f.select(".legend-marks").selectAll("path.legend-mark").data(o);y.enter().append("path").classed("legend-mark",!0),y.attr({transform:function(t,e){return"translate("+[c/2,m(e)+c/2]+")"},d:function(t,e){var r,i,a,o=t.symbol;return a=3*(i=c),"line"===(r=o)?"M"+[[-i/2,-i/12],[i/2,-i/12],[i/2,i/12],[-i/2,i/12]]+"Z":-1!=n.svg.symbolTypes.indexOf(r)?n.svg.symbol().type(r).size(a)():n.svg.symbol().type("square").size(a)()},fill:function(t,e){return g(e)}}),y.exit().remove()}var x=n.svg.axis().scale(m).orient("right"),b=f.select("g.legend-axis").attr({transform:"translate("+[u?e.colorBandWidth:c,c/2]+")"}).call(x);return b.selectAll(".domain").style({fill:"none",stroke:"none"}),b.selectAll("line").style({fill:"none",stroke:u?e.textColor:"none"}),b.selectAll("text").style({fill:e.textColor,"font-size":e.fontSize}).text(function(t,e){return o[e].name}),r}return r.config=function(e){return arguments.length?(i(t,e),this):t},n.rebind(r,e,"on"),r},o.Legend.defaultConfig=function(t,e){return{data:["a","b","c"],legendConfig:{elements:[{symbol:"line",color:"red"},{symbol:"square",color:"yellow"},{symbol:"diamond",color:"limegreen"}],height:150,colorBandWidth:30,fontSize:12,container:"body",isContinuous:null,textColor:"grey",reverseOrder:!1}}},o.tooltipPanel=function(){var t,e,r,a={container:null,hasTick:!1,fontSize:12,color:"white",padding:5},s="tooltip-"+o.tooltipPanel.uid++,l=10,c=function(){var n=(t=a.container.selectAll("g."+s).data([0])).enter().append("g").classed(s,!0).style({"pointer-events":"none",display:"none"});return r=n.append("path").style({fill:"white","fill-opacity":.9}).attr({d:"M0 0"}),e=n.append("text").attr({dx:a.padding+l,dy:.3*+a.fontSize}),c};return c.text=function(i){var o=n.hsl(a.color).l,s=o>=.5?"#aaa":"white",u=o>=.5?"black":"white",h=i||"";e.style({fill:u,"font-size":a.fontSize+"px"}).text(h);var f=a.padding,p=e.node().getBBox(),d={fill:a.color,stroke:s,"stroke-width":"2px"},g=p.width+2*f+l,m=p.height+2*f;return r.attr({d:"M"+[[l,-m/2],[l,-m/4],[a.hasTick?0:l,0],[l,m/4],[l,m/2],[g,m/2],[g,-m/2]].join("L")+"Z"}).style(d),t.attr({transform:"translate("+[l,-m/2+2*f]+")"}),t.style({display:"block"}),c},c.move=function(e){if(t)return t.attr({transform:"translate("+[e[0],e[1]]+")"}).style({display:"block"}),c},c.hide=function(){if(t)return t.style({display:"none"}),c},c.show=function(){if(t)return t.style({display:"block"}),c},c.config=function(t){return i(a,t),c},c},o.tooltipPanel.uid=1,o.adapter={},o.adapter.plotly=function(){var t={convert:function(t,e){var r={};if(t.data&&(r.data=t.data.map(function(t,r){var n=i({},t);return[[n,["marker","color"],["color"]],[n,["marker","opacity"],["opacity"]],[n,["marker","line","color"],["strokeColor"]],[n,["marker","line","dash"],["strokeDash"]],[n,["marker","line","width"],["strokeSize"]],[n,["marker","symbol"],["dotType"]],[n,["marker","size"],["dotSize"]],[n,["marker","barWidth"],["barWidth"]],[n,["line","interpolation"],["lineInterpolation"]],[n,["showlegend"],["visibleInLegend"]]].forEach(function(t,r){o.util.translator.apply(null,t.concat(e))}),e||delete n.marker,e&&delete n.groupId,e?("LinePlot"===n.geometry?(n.type="scatter",!0===n.dotVisible?(delete n.dotVisible,n.mode="lines+markers"):n.mode="lines"):"DotPlot"===n.geometry?(n.type="scatter",n.mode="markers"):"AreaChart"===n.geometry?n.type="area":"BarChart"===n.geometry&&(n.type="bar"),delete n.geometry):("scatter"===n.type?"lines"===n.mode?n.geometry="LinePlot":"markers"===n.mode?n.geometry="DotPlot":"lines+markers"===n.mode&&(n.geometry="LinePlot",n.dotVisible=!0):"area"===n.type?n.geometry="AreaChart":"bar"===n.type&&(n.geometry="BarChart"),delete n.mode,delete n.type),n}),!e&&t.layout&&"stack"===t.layout.barmode)){var a=o.util.duplicates(r.data.map(function(t,e){return t.geometry}));r.data.forEach(function(t,e){var n=a.indexOf(t.geometry);-1!=n&&(r.data[e].groupId=n)})}if(t.layout){var s=i({},t.layout);if([[s,["plot_bgcolor"],["backgroundColor"]],[s,["showlegend"],["showLegend"]],[s,["radialaxis"],["radialAxis"]],[s,["angularaxis"],["angularAxis"]],[s.angularaxis,["showline"],["gridLinesVisible"]],[s.angularaxis,["showticklabels"],["labelsVisible"]],[s.angularaxis,["nticks"],["ticksCount"]],[s.angularaxis,["tickorientation"],["tickOrientation"]],[s.angularaxis,["ticksuffix"],["ticksSuffix"]],[s.angularaxis,["range"],["domain"]],[s.angularaxis,["endpadding"],["endPadding"]],[s.radialaxis,["showline"],["gridLinesVisible"]],[s.radialaxis,["tickorientation"],["tickOrientation"]],[s.radialaxis,["ticksuffix"],["ticksSuffix"]],[s.radialaxis,["range"],["domain"]],[s.angularAxis,["showline"],["gridLinesVisible"]],[s.angularAxis,["showticklabels"],["labelsVisible"]],[s.angularAxis,["nticks"],["ticksCount"]],[s.angularAxis,["tickorientation"],["tickOrientation"]],[s.angularAxis,["ticksuffix"],["ticksSuffix"]],[s.angularAxis,["range"],["domain"]],[s.angularAxis,["endpadding"],["endPadding"]],[s.radialAxis,["showline"],["gridLinesVisible"]],[s.radialAxis,["tickorientation"],["tickOrientation"]],[s.radialAxis,["ticksuffix"],["ticksSuffix"]],[s.radialAxis,["range"],["domain"]],[s.font,["outlinecolor"],["outlineColor"]],[s.legend,["traceorder"],["reverseOrder"]],[s,["labeloffset"],["labelOffset"]],[s,["defaultcolorrange"],["defaultColorRange"]]].forEach(function(t,r){o.util.translator.apply(null,t.concat(e))}),e?("undefined"!=typeof s.tickLength&&(s.angularaxis.ticklen=s.tickLength,delete s.tickLength),s.tickColor&&(s.angularaxis.tickcolor=s.tickColor,delete s.tickColor)):(s.angularAxis&&"undefined"!=typeof s.angularAxis.ticklen&&(s.tickLength=s.angularAxis.ticklen),s.angularAxis&&"undefined"!=typeof s.angularAxis.tickcolor&&(s.tickColor=s.angularAxis.tickcolor)),s.legend&&"boolean"!=typeof s.legend.reverseOrder&&(s.legend.reverseOrder="normal"!=s.legend.reverseOrder),s.legend&&"boolean"==typeof s.legend.traceorder&&(s.legend.traceorder=s.legend.traceorder?"reversed":"normal",delete s.legend.reverseOrder),s.margin&&"undefined"!=typeof s.margin.t){var l=["t","r","b","l","pad"],c=["top","right","bottom","left","pad"],u={};n.entries(s.margin).forEach(function(t,e){u[c[l.indexOf(t.key)]]=t.value}),s.margin=u}e&&(delete s.needsEndSpacing,delete s.minorTickColor,delete s.minorTicks,delete s.angularaxis.ticksCount,delete s.angularaxis.ticksCount,delete s.angularaxis.ticksStep,delete s.angularaxis.rewriteTicks,delete s.angularaxis.nticks,delete s.radialaxis.ticksCount,delete s.radialaxis.ticksCount,delete s.radialaxis.ticksStep,delete s.radialaxis.rewriteTicks,delete s.radialaxis.nticks),r.layout=s}return r}};return t}},{"../../../constants/alignment":656,"../../../lib":684,d3:147}],805:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../../lib"),a=t("../../../components/color"),o=t("./micropolar"),s=t("./undo_manager"),l=i.extendDeepAll,c=e.exports={};c.framework=function(t){var e,r,i,a,u,h=new s;function f(r,s){return s&&(u=s),n.select(n.select(u).node().parentNode).selectAll(".svg-container>*:not(.chart-root)").remove(),e=e?l(e,r):r,i||(i=o.Axis()),a=o.adapter.plotly().convert(e),i.config(a).render(u),t.data=e.data,t.layout=e.layout,c.fillLayout(t),e}return f.isPolar=!0,f.svg=function(){return i.svg()},f.getConfig=function(){return e},f.getLiveConfig=function(){return o.adapter.plotly().convert(i.getLiveConfig(),!0)},f.getLiveScales=function(){return{t:i.angularScale(),r:i.radialScale()}},f.setUndoPoint=function(){var t,n,i=this,a=o.util.cloneJson(e);t=a,n=r,h.add({undo:function(){n&&i(n)},redo:function(){i(t)}}),r=o.util.cloneJson(a)},f.undo=function(){h.undo()},f.redo=function(){h.redo()},f},c.fillLayout=function(t){var e=n.select(t).selectAll(".plot-container"),r=e.selectAll(".svg-container"),i=t.framework&&t.framework.svg&&t.framework.svg(),o={width:800,height:600,paper_bgcolor:a.background,_container:e,_paperdiv:r,_paper:i};t._fullLayout=l(o,t.layout)}},{"../../../components/color":558,"../../../lib":684,"./micropolar":804,"./undo_manager":806,d3:147}],806:[function(t,e,r){"use strict";e.exports=function(){var t,e=[],r=-1,n=!1;function i(t,e){return t?(n=!0,t[e](),n=!1,this):this}return{add:function(t){return n?this:(e.splice(r+1,e.length-r),e.push(t),r=e.length-1,this)},setCallback:function(e){t=e},undo:function(){var n=e[r];return n?(i(n,"undo"),r-=1,t&&t(n.undo),this):this},redo:function(){var n=e[r+1];return n?(i(n,"redo"),r+=1,t&&t(n.redo),this):this},clear:function(){e=[],r=-1},hasUndo:function(){return-1!==r},hasRedo:function(){return r<e.length-1},getCommands:function(){return e},getPreviousCommand:function(){return e[r-1]},getIndex:function(){return r}}}},{}],807:[function(t,e,r){"use strict";var n=t("d3"),i=t("tinycolor2"),a=t("../../registry"),o=t("../../lib"),s=t("../../components/color"),l=t("../../components/drawing"),c=t("../plots"),u=t("../cartesian/axes"),h=t("../cartesian/autorange").doAutoRange,f=t("../../components/dragelement"),p=t("../cartesian/dragbox"),d=t("../../components/fx"),g=t("../../components/titles"),m=t("../cartesian/select").prepSelect,v=t("../cartesian/select").clearSelect,y=t("../../lib/setcursor"),x=t("../../lib/polygon").tester,b=t("../../constants/alignment").MID_SHIFT,_=o._,w=o.deg2rad,k=o.rad2deg,M=o.wrap360,A=o.wrap180,T=t("./helpers").setConvertAngular,S=t("./constants");function E(t,e){this.id=e,this.gd=t,this._hasClipOnAxisFalse=null,this.vangles=null,this.radialAxisAngle=null,this.traceHash={},this.layers={},this.clipPaths={},this.clipIds={},this.viewInitial={};var r=t._fullLayout,n="clip"+r._uid+e;this.clipIds.forTraces=n+"-for-traces",this.clipPaths.forTraces=r._clips.append("clipPath").attr("id",this.clipIds.forTraces),this.clipPaths.forTraces.append("path"),this.framework=r._polarlayer.append("g").attr("class",e),this.radialTickLayout=null,this.angularTickLayout=null}var C=E.prototype;function L(t,e,r){u.setConvert(t,r),t._min=e._min,t._max=e._max,t.setScale()}function z(t){var e=t.ticks+String(t.ticklen)+String(t.showticklabels);return"side"in t&&(e+=t.side),e}function P(t,e){if(U(e))return!0;var r=M(e[0]),n=M(e[1]);r>n&&(n+=360);var i=M(k(t)),a=i+360;return i>=r&&i<=n||a>=r&&a<=n}function I(t,e){return e[D(e,function(e){return Math.abs(O(t,e))})]}function O(t,e){var r=e-t;return Math.atan2(Math.sin(r),Math.cos(r))}function D(t,e){e=e||o.identity;for(var r,n=1/0,i=0;i<t.length;i++){var a=e(t[i]);a<n&&(n=a,r=i)}return r}function R(t,e,r,n){var i,a,o=n[0],s=n[1],l=W(Math.sin(e)-Math.sin(t)),c=W(Math.cos(e)-Math.cos(t)),u=Math.tan(r),h=W(1/u),f=l/c,p=s-f*o;return h?l&&c?a=u*(i=p/(u-f)):c?(i=s*h,a=s):(i=o,a=o*u):l&&c?(i=0,a=p):c?(i=0,a=s):i=a=NaN,[i,a]}function B(t,e,r,n){var i=-e*r,a=e*e+1,o=2*(e*i-r),s=i*i+r*r-t*t,l=Math.sqrt(o*o-4*a*s),c=(-o+l)/(2*a),u=(-o-l)/(2*a);return[[c,e*c+i+n],[u,e*u+i+n]]}function F(t,e,r){return U(e)?function(t,e){var r,n=e.length,i=new Array(n+1);for(r=0;r<n;r++){var a=e[r];i[r]=[t*Math.cos(a),t*Math.sin(a)]}return i[r]=i[0].slice(),i}(t,r):function(t,e,r){var n,i,a=r.length,s=[];function l(e){return[t*Math.cos(e),t*Math.sin(e)]}function c(t,e,r){return R(t,e,r,l(t))}function u(t){return o.mod(t,a)}var h=w(e[0]),f=w(e[1]),p=D(r,function(t){return P(t,e)?Math.abs(O(t,h)):1/0}),d=c(r[p],r[u(p-1)],h);for(s.push(d),n=p,i=0;i<a;n++,i++){var g=r[u(n)];if(!P(g,e))break;s.push(l(g))}var m=D(r,function(t){return P(t,e)?Math.abs(O(t,f)):1/0}),v=c(r[m],r[u(m+1)],f);return s.push(v),s.push([0,0]),s.push(s[0].slice()),s}(t,e,r)}function N(t){for(var e=t.length,r=new Array(e),n=0;n<e;n++){var i=t[n];r[n]=[i[0],-i[1]]}return r}function j(t,e,r){var n;if(r)n="M"+N(F(t,e,r)).join("L");else if(U(e))n=l.symbolFuncs[0](t);else{var i=Math.abs(e[1]-e[0])<=180?[0,0,0]:[0,1,0];n="M"+[t*Math.cos(w(e[0])),-t*Math.sin(w(e[0]))]+"A"+[t,t]+" "+i+" "+[t*Math.cos(w(e[1])),-t*Math.sin(w(e[1]))]}return n}function V(t,e,r){var n=j(t,e,r);return U(e)||r?n:n+"L0,0Z"}function U(t){return 360===Math.abs(t[1]-t[0])}function q(t,e,r){return e?(t.attr("display",null),t.attr(r)):t&&t.attr("display","none"),t}function H(t,e){return"translate("+t+","+e+")"}function G(t){return"rotate("+t+")"}function W(t){return Math.abs(t)>1e-10?t:0}function Y(t){return Math.abs(t)<1e-10?0:t>0?1:-1}function X(t){return Y(Math.cos(t))}function Z(t){return Y(Math.sin(t))}e.exports=function(t,e){return new E(t,e)},C.plot=function(t,e){var r=e[this.id];this._hasClipOnAxisFalse=!1;for(var n=0;n<t.length;n++){if(!1===t[n][0].trace.cliponaxis){this._hasClipOnAxisFalse=!0;break}}this.updateLayers(e,r),this.updateLayout(e,r),c.generalUpdatePerTraceModule(this.gd,this,t,r),this.updateFx(e,r)},C.updateLayers=function(t,e){var r=this.layers,i=e.radialaxis,a=e.angularaxis,o=S.layerNames,s=o.indexOf("frontplot"),l=o.slice(0,s),c="below traces"===a.layer,u="below traces"===i.layer;c&&l.push("angular-axis"),u&&l.push("radial-axis"),c&&l.push("angular-line"),u&&l.push("radial-line"),l.push("frontplot"),c||l.push("angular-axis"),u||l.push("radial-axis"),c||l.push("angular-line"),u||l.push("radial-line");var h=this.framework.selectAll(".polarsublayer").data(l,String);h.enter().append("g").attr("class",function(t){return"polarsublayer "+t}).each(function(t){var e=r[t]=n.select(this);switch(t){case"frontplot":e.append("g").classed("scatterlayer",!0);break;case"backplot":e.append("g").classed("maplayer",!0);break;case"plotbg":r.bg=e.append("path");break;case"radial-grid":e.style("fill","none"),e.append("g").classed("x",1);break;case"angular-grid":e.style("fill","none"),e.append("g").classed("angular",1);break;case"radial-line":e.append("line").style("fill","none");break;case"angular-line":e.append("path").style("fill","none")}}),h.order()},C.updateLayout=function(t,e){var r=this,n=r.layers,i=t._size,a=e.domain.x,c=e.domain.y;r.xOffset=i.l+i.w*a[0],r.yOffset=i.t+i.h*(1-c[1]);var h,f,p,d,g,m=r.xLength=i.w*(a[1]-a[0]),v=r.yLength=i.h*(c[1]-c[0]),y=r.sector=e.sector,x=r.sectorBBox=function(t){var e,r,n,i,a=t[0],o=t[1]-a,s=M(a),l=s+o,c=Math.cos(w(s)),u=Math.sin(w(s)),h=Math.cos(w(l)),f=Math.sin(w(l));i=s<=90&&l>=90||s>90&&l>=450?1:u<=0&&f<=0?0:Math.max(u,f);e=s<=180&&l>=180||s>180&&l>=540?-1:c>=0&&h>=0?0:Math.min(c,h);r=s<=270&&l>=270||s>270&&l>=630?-1:u>=0&&f>=0?0:Math.min(u,f);n=l>=360?1:c<=0&&h<=0?0:Math.max(c,h);return[e,r,n,i]}(y),b=x[2]-x[0],_=x[3]-x[1],k=v/m,A=Math.abs(_/b);k>A?(h=m,g=(v-(f=m*A))/i.h/2,p=[a[0],a[1]],d=[c[0]+g,c[1]-g]):(f=v,g=(m-(h=v/A))/i.w/2,p=[a[0]+g,a[1]-g],d=[c[0],c[1]]),r.xLength2=h,r.yLength2=f,r.xDomain2=p,r.yDomain2=d;var T=r.xOffset2=i.l+i.w*p[0],S=r.yOffset2=i.t+i.h*(1-d[1]),E=r.radius=h/b,C=r.cx=T-E*x[0],L=r.cy=S+E*x[3],z=r.cxx=C-T,P=r.cyy=L-S,I={anchor:"free",position:0,_counteraxis:!0,automargin:!1};r.radialAxis=o.extendFlat({},e.radialaxis,I,{_axislayer:n["radial-axis"],_gridlayer:n["radial-grid"],_id:"x",_pos:0,side:{counterclockwise:"top",clockwise:"bottom"}[e.radialaxis.side],domain:[0,E/i.w]}),r.angularAxis=o.extendFlat({},e.angularaxis,I,{_axislayer:n["angular-axis"],_gridlayer:n["angular-grid"],_id:"angular",_pos:0,side:"right",domain:[0,Math.PI],autorange:!1}),r.doAutoRange(t,e),r.updateAngularAxis(t,e),r.updateRadialAxis(t,e),r.updateRadialAxisTitle(t,e);var O=r.radialAxis.range,D=O[1]-O[0],R=r.xaxis={type:"linear",_id:"x",range:[x[0]*D,x[2]*D],domain:p};u.setConvert(R,t),R.setScale();var B=r.yaxis={type:"linear",_id:"y",range:[x[1]*D,x[3]*D],domain:d};u.setConvert(B,t),B.setScale(),R.isPtWithinRange=function(t){return r.isPtWithinSector(t)},B.isPtWithinRange=function(){return!0},r.clipPaths.forTraces.select("path").attr("d",V(E,y,r.vangles)).attr("transform",H(z,P)),n.frontplot.attr("transform",H(T,S)).call(l.setClipUrl,r._hasClipOnAxisFalse?null:r.clipIds.forTraces),n.bg.attr("d",V(E,y,r.vangles)).attr("transform",H(C,L)).call(s.fill,e.bgcolor),r.framework.selectAll(".crisp").classed("crisp",0)},C.doAutoRange=function(t,e){var r=e.radialaxis,n=this.radialAxis;L(n,r,t),h(n),r.range=n.range.slice(),r._input.range=n.range.slice()},C.updateRadialAxis=function(t,e){var r=this,n=r.gd,i=r.layers,a=r.radius,o=r.cx,l=r.cy,c=e.radialaxis,h=e.sector,f=M(h[0]),p=r.radialAxis;r.fillViewInitialKey("radialaxis.angle",c.angle),r.fillViewInitialKey("radialaxis.range",p.range.slice()),"auto"===p.tickangle&&f>90&&f<=270&&(p.tickangle=180),p._transfn=function(t){return"translate("+p.l2p(t.x)+",0)"},p._gridpath=function(t){return j(p.r2p(t.x),h,r.vangles)};var d=z(c);r.radialTickLayout!==d&&(i["radial-axis"].selectAll(".xtick").remove(),r.radialTickLayout=d),u.doTicksSingle(n,p,!0);var g=r.radialAxisAngle=r.vangles?k(I(w(c.angle),r.vangles)):c.angle,m=H(o,l)+G(-g);q(i["radial-axis"],c.showticklabels||c.ticks,{transform:m}),q(i["radial-grid"],c.showgrid,{transform:H(o,l)}).selectAll("path").attr("transform",null),q(i["radial-line"].select("line"),c.showline,{x1:0,y1:0,x2:a,y2:0,transform:m}).attr("stroke-width",c.linewidth).call(s.stroke,c.linecolor)},C.updateRadialAxisTitle=function(t,e,r){var n=this.gd,i=this.radius,a=this.cx,o=this.cy,s=e.radialaxis,c=this.id+"title",u=void 0!==r?r:this.radialAxisAngle,h=w(u),f=Math.cos(h),p=Math.sin(h),d=0;if(s.title){var m=l.bBox(this.layers["radial-axis"].node()).height,v=s.titlefont.size;d="counterclockwise"===s.side?-m-.4*v:m+.8*v}this.layers["radial-axis-title"]=g.draw(n,c,{propContainer:s,propName:this.id+".radialaxis.title",placeholder:_(n,"Click to enter radial axis title"),attributes:{x:a+i/2*f+d*p,y:o-i/2*p+d*f,"text-anchor":"middle"},transform:{rotate:-u}})},C.updateAngularAxis=function(t,e){var r=this.gd,i=this.layers,a=this.radius,o=this.cx,l=this.cy,c=e.angularaxis,h=e.sector,f=h.map(w),p=this.angularAxis;function d(t){return p.c2rad(t.x,"degrees")}function g(t){return[a*Math.cos(t),a*Math.sin(t)]}if(this.fillViewInitialKey("angularaxis.rotation",c.rotation),"linear"===p.type)U(h)?p.range=h.slice():p.range=f.map(p.unTransformRad).map(k),"radians"===p.thetaunit&&(p.tick0=k(p.tick0),p.dtick=k(p.dtick));else if("category"===p.type){var m=c.period?Math.max(c.period,c._categories.length):c._categories.length;p.range=[0,m],p._tickFilter=function(t){return P(d(t),h)}}L(p,c,t),p._transfn=function(t){var e=d(t),r=g(e),i=H(o+r[0],l-r[1]),a=n.select(this);return a&&a.node()&&a.classed("ticks")&&(i+=G(-k(e))),i},p._gridpath=function(t){var e=g(d(t));return"M0,0L"+-e[0]+","+e[1]};var v="outside"!==c.ticks?.7:.5;p._labelx=function(t){var e=d(t),r=p._labelStandoff,n=p._pad;return(0===Z(e)?0:Math.cos(e)*(r+n+v*t.fontSize))+X(e)*(t.dx+r+n)},p._labely=function(t){var e=d(t),r=p._labelStandoff,n=p._labelShift,i=p._pad;return t.dy+t.fontSize*b-n+-Math.sin(e)*(r+i+v*t.fontSize)},p._labelanchor=function(t,e){var r=d(e);return 0===Z(r)?X(r)>0?"start":"end":"middle"};var y,x=z(c);this.angularTickLayout!==x&&(i["angular-axis"].selectAll(".angulartick").remove(),this.angularTickLayout=x),u.doTicksSingle(r,p,!0),"linear"===e.gridshape?O((y=p._vals.map(d))[0],y[1])<0&&(y=y.slice().reverse()):y=null,this.vangles=y,q(i["angular-line"].select("path"),c.showline,{d:V(a,h,y),transform:H(o,l)}).attr("stroke-width",c.linewidth).call(s.stroke,c.linecolor)},C.updateFx=function(t,e){this.gd._context.staticPlot||(this.updateAngularDrag(t,e),this.updateRadialDrag(t,e),this.updateMainDrag(t,e))},C.updateMainDrag=function(t,e){var r=this,s=r.gd,l=r.layers,c=t._zoomlayer,u=S.MINZOOM,h=S.OFFEDGE,g=r.radius,y=r.cx,x=r.cy,b=r.cxx,_=r.cyy,w=e.sector,k=r.vangles,M=S.cornerHalfWidth,A=S.cornerLen/2,T=p.makeDragger(l,"path","maindrag","crosshair");n.select(T).attr("d",V(g,w,k)).attr("transform",H(y,x));var E,C,L,z,P,I,N,j,U,q={element:T,gd:s,subplot:r.id,plotinfo:{xaxis:r.xaxis,yaxis:r.yaxis},xaxes:[r.xaxis],yaxes:[r.yaxis]};function G(t,e){return Math.sqrt(t*t+e*e)}function Y(t,e){return G(t-b,e-_)}function X(t,e){return Math.atan2(_-e,t-b)}function Z(t,e){return[t*Math.cos(e),t*Math.sin(-e)]}function $(t){return V(t,w,k)}function J(t,e){if(0===t)return $(2*M);var r=A/t,n=e-r,i=e+r,a=Math.max(0,Math.min(t,g)),o=a-M,s=a+M;return"M"+Z(o,n)+"A"+[o,o]+" 0,0,0 "+Z(o,i)+"L"+Z(s,i)+"A"+[s,s]+" 0,0,1 "+Z(s,n)+"Z"}function K(t,e,r){if(0===t)return $(2*M);var n,i,a=Z(t,e),o=Z(t,r),s=W((a[0]+o[0])/2),l=W((a[1]+o[1])/2);if(s&&l){var c=l/s,u=-1/c,h=B(M,c,s,l);n=B(A,u,h[0][0],h[0][1]),i=B(A,u,h[1][0],h[1][1])}else{var f,p;l?(f=A,p=M):(f=M,p=A),n=[[s-f,l-p],[s+f,l-p]],i=[[s-f,l+p],[s+f,l+p]]}return"M"+n.join("L")+"L"+i.reverse().join("L")+"Z"}function Q(t,e){return e=Math.min(e,g),t<h?t=0:g-t<h?t=g:e<h?e=0:g-e<h&&(e=g),Math.abs(e-t)>u?(t<e?(L=t,z=e):(L=e,z=t),!0):(L=null,z=null,!1)}function tt(t,e){t=t||P,e=e||"M0,0Z",j.attr("d",t),U.attr("d",e),p.transitionZoombox(j,U,I,N),I=!0}function et(t,e){var r,n,i=E+t,a=C+e,o=Y(E,C),s=Math.min(Y(i,a),g),l=X(E,C);Q(o,s)&&(r=P+$(z)+$(L),n=J(L,l)+J(z,l)),tt(r,n)}function rt(t){var e=D(k,function(e){var r=O(e,t);return r>0?r:1/0}),r=o.mod(e+1,k.length);return[k[e],k[r]]}function nt(t,e,r,n){var i=R(r,n,r,[t-b,_-e]);return G(i[0],i[1])}function it(t,e){var r,n,i=E+t,a=C+e,o=X(E,C),s=X(i,a),l=rt(o),c=rt(s);Q(nt(E,C,l[0],l[1]),Math.min(nt(i,a,c[0],c[1]),g))&&(r=P+$(z)+$(L),n=[K(L,l[0],l[1]),K(z,l[0],l[1])].join(" ")),tt(r,n)}function at(){if(p.removeZoombox(s),null!==L&&null!==z){p.showDoubleClickNotifier(s);var t=r.radialAxis.range,e=t[1]-t[0],n={};n[r.id+".radialaxis.range"]=[t[0]+L*e/g,t[0]+z*e/g],a.call("relayout",s,n)}}q.prepFn=function(t,e,n){var a=s._fullLayout.dragmode,o=T.getBoundingClientRect();if(E=e-o.left,C=n-o.top,k){var l=function(t,e,r){for(var n=1/0,i=1/0,a=F(t,e,r),o=0;o<a.length;o++){var s=a[o];n=Math.min(n,s[0]),i=Math.min(i,-s[1])}return[n,i]}(g,w,k);E+=b+l[0],C+=_+l[1]}switch(a){case"zoom":q.moveFn=k?it:et,q.doneFn=at,function(){L=null,z=null,P=$(g),I=!1;var t=s._fullLayout[r.id];N=i(t.bgcolor).getLuminance(),(j=p.makeZoombox(c,N,y,x,P)).attr("fill-rule","evenodd"),U=p.makeCorners(c,y,x),v(c)}();break;case"select":case"lasso":m(t,e,n,q,a)}},q.clickFn=function(t,e){if(p.removeZoombox(s),2===t){var n={};for(var i in r.viewInitial)n[r.id+"."+i]=r.viewInitial[i];s.emit("plotly_doubleclick",null),a.call("relayout",s,n)}d.click(s,e,r.id)},T.onmousemove=function(t){d.hover(s,t,r.id),s._fullLayout._lasthover=T,s._fullLayout._hoversubplot=r.id},T.onmouseout=function(t){s._dragging||f.unhover(s,t)},f.init(q)},C.updateRadialDrag=function(t,e){var r=this,i=r.gd,s=r.layers,l=r.radius,c=r.cx,h=r.cy,d=r.radialAxis,g=e.radialaxis,m=w(r.radialAxisAngle),y=d.range.slice(),x=y[1]-y[0],b=S.radialDragBoxSize,_=b/2;if(g.visible){var M,A,T,E=p.makeRectDragger(s,"radialdrag","crosshair",-_,-_,b,b),C={element:E,gd:i},L=c+(l+_)*Math.cos(m),z=h-(l+_)*Math.sin(m);n.select(E).attr("transform",H(L,z)),C.prepFn=function(){M=null,A=null,T=null,C.moveFn=P,C.doneFn=O,v(t._zoomlayer)},C.clampFn=function(t,e){return Math.sqrt(t*t+e*e)<S.MINDRAG&&(t=0,e=0),[t,e]},f.init(C)}function P(t,e){if(M)M(t,e);else{var r=[t,-e],n=[Math.cos(m),Math.sin(m)],i=Math.abs(o.dot(r,n)/Math.sqrt(o.dot(r,r)));isNaN(i)||(M=i<.5?D:R)}}function O(){null!==A?a.call("relayout",i,r.id+".radialaxis.angle",A):null!==T&&a.call("relayout",i,r.id+".radialaxis.range[1]",T)}function D(t,e){var n=L+t,i=z+e;A=Math.atan2(h-i,n-c),r.vangles&&(A=I(A,r.vangles)),A=k(A);var a=H(c,h)+G(-A);s["radial-axis"].attr("transform",a),s["radial-line"].select("line").attr("transform",a);var o=r.gd._fullLayout,l=o[r.id];r.updateRadialAxisTitle(o,l,A)}function R(t,e){var n=o.dot([t,-e],[Math.cos(m),Math.sin(m)]),f=y[1]-x*n/l*.75;if(x>0==f>y[0]){T=d.range[1]=f,u.doTicksSingle(i,r.radialAxis,!0),s["radial-grid"].attr("transform",H(c,h)).selectAll("path").attr("transform",null);var p=T-y[0],g=r.sectorBBox;for(var v in r.xaxis.range=[g[0]*p,g[2]*p],r.yaxis.range=[g[1]*p,g[3]*p],r.xaxis.setScale(),r.yaxis.setScale(),r.traceHash){var b=r.traceHash[v],_=o.filterVisible(b),w=b[0][0].trace._module,k=i._fullLayout[r.id];if(w.plot(i,r,_,k),!a.traceIs(v,"gl"))for(var M=0;M<_.length;M++)w.style(i,_[M])}}}},C.updateAngularDrag=function(t,e){var r,i=this,s=i.gd,c=i.layers,h=i.radius,d=i.cx,g=i.cy,m=i.cxx,x=i.cyy,b=e.sector,_=S.angularDragBoxSize,M=p.makeDragger(c,"path","angulardrag","move"),E={element:M,gd:s};if(i.vangles){var C=N(F(h+_,b,i.vangles)),L=N(F(h,b,i.vangles));r="M"+C.reverse().join("L")+"M"+L.join("L")}else r=function(t,e,r){var n,i,a,o=Math.abs(r[1]-r[0])<=180?0:1;function s(t,e){return[t*Math.cos(e),-t*Math.sin(e)]}function l(t,e,r){return"A"+[t,t]+" "+[0,o,r]+" "+s(t,e)}return U(r)?(n=0,a=2*Math.PI,i=Math.PI,"M"+s(t,n)+l(t,i,0)+l(t,a,0)+"ZM"+s(e,n)+l(e,i,1)+l(e,a,1)+"Z"):(n=w(r[0]),a=w(r[1]),"M"+s(t,n)+"L"+s(e,n)+l(e,a,0)+"L"+s(t,a)+l(t,n,1)+"Z")}(h,h+_,b);function z(t,e){return Math.atan2(x+_-e,t-m-_)}n.select(M).attr("d",r).attr("transform",H(d,g)).call(y,"move");var P,I,O,D,R,B,j,V=c.frontplot.select(".scatterlayer").selectAll(".trace"),q=V.selectAll(".point"),W=V.selectAll(".textpoint");function Y(t,e){var r=i.gd._fullLayout,h=r[i.id],f=z(P+t,I+e),p=k(f-j);if(D=O+p,c.frontplot.attr("transform",H(i.xOffset2,i.yOffset2)+G([-p,m,x])),i.vangles){R=i.radialAxisAngle+p;var v=H(d,g)+G(-p),y=H(d,g)+G(-R);c.bg.attr("transform",v),c["radial-grid"].attr("transform",v),c["angular-line"].select("path").attr("transform",v),c["radial-axis"].attr("transform",y),c["radial-line"].select("line").attr("transform",y),i.updateRadialAxisTitle(r,h,R)}else i.clipPaths.forTraces.select("path").attr("transform",H(m,x)+G(p));q.each(function(){var t=n.select(this),e=l.getTranslate(t);t.attr("transform",H(e.x,e.y)+G([p]))}),W.each(function(){var t=n.select(this),e=t.select("text"),r=l.getTranslate(t);t.attr("transform",G([p,e.attr("x"),e.attr("y")])+H(r.x,r.y))});var _=i.angularAxis;for(var M in _.rotation=A(D),"linear"!==_.type||U(b)||(_.range=B.map(w).map(_.unTransformRad).map(k)),T(_),u.doTicksSingle(s,_,!0),i._hasClipOnAxisFalse&&!U(b)&&(i.sector=[B[0]-p,B[1]-p],V.call(l.hideOutsideRangePoints,i)),i.traceHash)if(a.traceIs(M,"gl")){var S=i.traceHash[M],E=o.filterVisible(S);S[0][0].trace._module.plot(s,i,E,h)}}function X(){W.select("text").attr("transform",null);var t={};t[i.id+".angularaxis.rotation"]=D,i.vangles&&(t[i.id+".radialaxis.angle"]=R),a.call("relayout",s,t)}E.prepFn=function(e,r,n){var a=t[i.id];B=a.sector.slice(),O=a.angularaxis.rotation;var o=M.getBoundingClientRect();P=r-o.left,I=n-o.top,j=z(P,I),E.moveFn=Y,E.doneFn=X,v(t._zoomlayer)},i.vangles&&!U(b)&&(E.prepFn=o.noop,y(n.select(M),null)),f.init(E)},C.isPtWithinSector=function(t){var e=this.sector;if(!P(t.rad,e))return!1;var r,n,i=this.vangles,a=this.radialAxis,o=a.range,s=a.c2r(t.r);if(o[1]>=o[0]?(r=o[0],n=o[1]):(r=o[1],n=o[0]),i){var l=x(F(r,e,i)),c=x(F(n,e,i)),u=[s*Math.cos(t.rad),s*Math.sin(t.rad)];return c.contains(u)&&!l.contains(u)}return s>=r&&s<=n},C.fillViewInitialKey=function(t,e){t in this.viewInitial||(this.viewInitial[t]=e)}},{"../../components/color":558,"../../components/dragelement":580,"../../components/drawing":583,"../../components/fx":600,"../../components/titles":649,"../../constants/alignment":656,"../../lib":684,"../../lib/polygon":696,"../../lib/setcursor":704,"../../registry":817,"../cartesian/autorange":731,"../cartesian/axes":732,"../cartesian/dragbox":740,"../cartesian/select":749,"../plots":795,"./constants":796,"./helpers":797,d3:147,tinycolor2:499}],808:[function(t,e,r){"use strict";function n(t,e){return"splom"===t?-1:"splom"===e?1:0}e.exports={sortBasePlotModules:function(t,e){return n(t.name,e.name)},sortModules:n}},{}],809:[function(t,e,r){"use strict";var n=t("../lib"),i=t("../plot_api/plot_template"),a=t("./domain").defaults;e.exports=function(t,e,r,o){var s,l,c=o.type,u=o.attributes,h=o.handleDefaults,f=o.partition||"x",p=e._subplots[c],d=p.length,g=d&&p[0].replace(/\d+$/,"");function m(t,e){return n.coerce(s,l,u,t,e)}for(var v=0;v<d;v++){var y=p[v];s=t[y]?t[y]:t[y]={},l=i.newContainer(e,y,g);var x={};x[f]=[v/d,(v+1)/d],a(l,e,m,x),o.id=y,h(s,l,m,o)}}},{"../lib":684,"../plot_api/plot_template":722,"./domain":757}],810:[function(t,e,r){"use strict";var n=t("./ternary"),i=t("../../plots/get_data").getSubplotCalcData,a=t("../../lib").counterRegex;r.name="ternary",r.attr="subplot",r.idRoot="ternary",r.idRegex=r.attrRegex=a("ternary"),r.attributes=t("./layout/attributes"),r.layoutAttributes=t("./layout/layout_attributes"),r.supplyLayoutDefaults=t("./layout/defaults"),r.plot=function(t){for(var e=t._fullLayout,r=t.calcdata,a=e._subplots.ternary,o=0;o<a.length;o++){var s=a[o],l=i(r,"ternary",s),c=e[s]._subplot;c||(c=new n({id:s,graphDiv:t,container:e._ternarylayer.node()},e),e[s]._subplot=c),c.plot(l,e,t._promises)}},r.clean=function(t,e,r,n){for(var i=n._subplots.ternary||[],a=0;a<i.length;a++){var o=i[a],s=n[o]._subplot;!e[o]&&s&&(s.plotContainer.remove(),s.clipDef.remove(),s.clipDefRelative.remove(),s.layers["a-title"].remove(),s.layers["b-title"].remove(),s.layers["c-title"].remove())}}},{"../../lib":684,"../../plots/get_data":768,"./layout/attributes":811,"./layout/defaults":814,"./layout/layout_attributes":815,"./ternary":816}],811:[function(t,e,r){"use strict";e.exports={subplot:{valType:"subplotid",dflt:"ternary",editType:"calc"}}},{}],812:[function(t,e,r){"use strict";var n=t("../../cartesian/layout_attributes"),i=t("../../../lib/extend").extendFlat;e.exports={title:n.title,titlefont:n.titlefont,color:n.color,tickmode:n.tickmode,nticks:i({},n.nticks,{dflt:6,min:1}),tick0:n.tick0,dtick:n.dtick,tickvals:n.tickvals,ticktext:n.ticktext,ticks:n.ticks,ticklen:n.ticklen,tickwidth:n.tickwidth,tickcolor:n.tickcolor,showticklabels:n.showticklabels,showtickprefix:n.showtickprefix,tickprefix:n.tickprefix,showticksuffix:n.showticksuffix,ticksuffix:n.ticksuffix,showexponent:n.showexponent,exponentformat:n.exponentformat,separatethousands:n.separatethousands,tickfont:n.tickfont,tickangle:n.tickangle,tickformat:n.tickformat,tickformatstops:n.tickformatstops,hoverformat:n.hoverformat,showline:i({},n.showline,{dflt:!0}),linecolor:n.linecolor,linewidth:n.linewidth,showgrid:i({},n.showgrid,{dflt:!0}),gridcolor:n.gridcolor,gridwidth:n.gridwidth,layer:n.layer,min:{valType:"number",dflt:0,min:0}}},{"../../../lib/extend":673,"../../cartesian/layout_attributes":744}],813:[function(t,e,r){"use strict";var n=t("../../../lib"),i=t("./axis_attributes"),a=t("../../cartesian/tick_label_defaults"),o=t("../../cartesian/tick_mark_defaults"),s=t("../../cartesian/tick_value_defaults"),l=t("../../cartesian/line_grid_defaults");e.exports=function(t,e,r){function c(r,a){return n.coerce(t,e,i,r,a)}e.type="linear";var u=c("color"),h=u!==i.color.dflt?u:r.font.color,f=e._name.charAt(0).toUpperCase(),p="Component "+f,d=c("title",p);e._hovertitle=d===p?d:f,n.coerceFont(c,"titlefont",{family:r.font.family,size:Math.round(1.2*r.font.size),color:h}),c("min"),s(t,e,c,"linear"),a(t,e,c,"linear",{}),o(t,e,c,{outerTicks:!0}),c("showticklabels")&&(n.coerceFont(c,"tickfont",{family:r.font.family,size:r.font.size,color:h}),c("tickangle"),c("tickformat")),l(t,e,c,{dfltColor:u,bgColor:r.bgColor,blend:60,showLine:!0,showGrid:!0,noZeroLine:!0,attributes:i}),c("hoverformat"),c("layer")}},{"../../../lib":684,"../../cartesian/line_grid_defaults":746,"../../cartesian/tick_label_defaults":751,"../../cartesian/tick_mark_defaults":752,"../../cartesian/tick_value_defaults":753,"./axis_attributes":812}],814:[function(t,e,r){"use strict";var n=t("../../../components/color"),i=t("../../../plot_api/plot_template"),a=t("../../subplot_defaults"),o=t("./layout_attributes"),s=t("./axis_defaults"),l=["aaxis","baxis","caxis"];function c(t,e,r,a){var o,c,u,h=r("bgcolor"),f=r("sum");a.bgColor=n.combine(h,a.paper_bgcolor);for(var p=0;p<l.length;p++)c=t[o=l[p]]||{},(u=i.newContainer(e,o))._name=o,s(c,u,a);var d=e.aaxis,g=e.baxis,m=e.caxis;d.min+g.min+m.min>=f&&(d.min=0,g.min=0,m.min=0,t.aaxis&&delete t.aaxis.min,t.baxis&&delete t.baxis.min,t.caxis&&delete t.caxis.min)}e.exports=function(t,e,r){a(t,e,r,{type:"ternary",attributes:o,handleDefaults:c,font:e.font,paper_bgcolor:e.paper_bgcolor})}},{"../../../components/color":558,"../../../plot_api/plot_template":722,"../../subplot_defaults":809,"./axis_defaults":813,"./layout_attributes":815}],815:[function(t,e,r){"use strict";var n=t("../../../components/color/attributes"),i=t("../../domain").attributes,a=t("./axis_attributes"),o=t("../../../plot_api/edit_types").overrideAll;e.exports=o({domain:i({name:"ternary"}),bgcolor:{valType:"color",dflt:n.background},sum:{valType:"number",dflt:1,min:0},aaxis:a,baxis:a,caxis:a},"plot","from-root")},{"../../../components/color/attributes":557,"../../../plot_api/edit_types":715,"../../domain":757,"./axis_attributes":812}],816:[function(t,e,r){"use strict";var n=t("d3"),i=t("tinycolor2"),a=t("../../registry"),o=t("../../lib"),s=o._,l=t("../../components/color"),c=t("../../components/drawing"),u=t("../cartesian/set_convert"),h=t("../../lib/extend").extendFlat,f=t("../plots"),p=t("../cartesian/axes"),d=t("../../components/dragelement"),g=t("../../components/fx"),m=t("../../components/titles"),v=t("../cartesian/select").prepSelect,y=t("../cartesian/select").clearSelect,x=t("../cartesian/constants");function b(t,e){this.id=t.id,this.graphDiv=t.graphDiv,this.init(e),this.makeFramework(e)}e.exports=b;var _=b.prototype;_.init=function(t){this.container=t._ternarylayer,this.defs=t._defs,this.layoutId=t._uid,this.traceHash={},this.layers={}},_.plot=function(t,e){var r=e[this.id],n=e._size;this._hasClipOnAxisFalse=!1;for(var i=0;i<t.length;i++){if(!1===t[i][0].trace.cliponaxis){this._hasClipOnAxisFalse=!0;break}}this.updateLayers(r),this.adjustLayout(r,n),f.generalUpdatePerTraceModule(this.graphDiv,this,t,r),this.layers.plotbg.select("path").call(l.fill,r.bgcolor)},_.makeFramework=function(t){var e=t[this.id],r=this.clipId="clip"+this.layoutId+this.id,n=this.clipIdRelative="clip-relative"+this.layoutId+this.id;this.clipDef=o.ensureSingleById(t._clips,"clipPath",r,function(t){t.append("path").attr("d","M0,0Z")}),this.clipDefRelative=o.ensureSingleById(t._clips,"clipPath",n,function(t){t.append("path").attr("d","M0,0Z")}),this.plotContainer=o.ensureSingle(this.container,"g",this.id),this.updateLayers(e),c.setClipUrl(this.layers.backplot,r),c.setClipUrl(this.layers.grids,r)},_.updateLayers=function(t){var e=this.layers,r=["draglayer","plotbg","backplot","grids"];"below traces"===t.aaxis.layer&&r.push("aaxis","aline"),"below traces"===t.baxis.layer&&r.push("baxis","bline"),"below traces"===t.caxis.layer&&r.push("caxis","cline"),r.push("frontplot"),"above traces"===t.aaxis.layer&&r.push("aaxis","aline"),"above traces"===t.baxis.layer&&r.push("baxis","bline"),"above traces"===t.caxis.layer&&r.push("caxis","cline");var i=this.plotContainer.selectAll("g.toplevel").data(r,String),a=["agrid","bgrid","cgrid"];i.enter().append("g").attr("class",function(t){return"toplevel "+t}).each(function(t){var r=n.select(this);e[t]=r,"frontplot"===t?r.append("g").classed("scatterlayer",!0):"backplot"===t?r.append("g").classed("maplayer",!0):"plotbg"===t?r.append("path").attr("d","M0,0Z"):"aline"===t||"bline"===t||"cline"===t?r.append("path"):"grids"===t&&a.forEach(function(t){e[t]=r.append("g").classed("grid "+t,!0);var n="bgrid"===t?"x":"y";e[t].append("g").classed(n,!0)})}),i.order()};var w=Math.sqrt(4/3);_.adjustLayout=function(t,e){var r,n,i,a,o,s,f=this,p=t.domain,d=(p.x[0]+p.x[1])/2,g=(p.y[0]+p.y[1])/2,m=p.x[1]-p.x[0],v=p.y[1]-p.y[0],y=m*e.w,x=v*e.h,b=t.sum,_=t.aaxis.min,k=t.baxis.min,M=t.caxis.min;y>w*x?i=(a=x)*w:a=(i=y)/w,o=m*i/y,s=v*a/x,r=e.l+e.w*d-i/2,n=e.t+e.h*(1-g)-a/2,f.x0=r,f.y0=n,f.w=i,f.h=a,f.sum=b,f.xaxis={type:"linear",range:[_+2*M-b,b-_-2*k],domain:[d-o/2,d+o/2],_id:"x"},u(f.xaxis,f.graphDiv._fullLayout),f.xaxis.setScale(),f.xaxis.isPtWithinRange=function(t){return t.a>=f.aaxis.range[0]&&t.a<=f.aaxis.range[1]&&t.b>=f.baxis.range[1]&&t.b<=f.baxis.range[0]&&t.c>=f.caxis.range[1]&&t.c<=f.caxis.range[0]},f.yaxis={type:"linear",range:[_,b-k-M],domain:[g-s/2,g+s/2],_id:"y"},u(f.yaxis,f.graphDiv._fullLayout),f.yaxis.setScale(),f.yaxis.isPtWithinRange=function(){return!0};var A=f.yaxis.domain[0],T=f.aaxis=h({},t.aaxis,{visible:!0,range:[_,b-k-M],side:"left",_counterangle:30,tickangle:(+t.aaxis.tickangle||0)-30,domain:[A,A+s*w],_axislayer:f.layers.aaxis,_gridlayer:f.layers.agrid,_pos:0,_id:"y",_length:i,_gridpath:"M0,0l"+a+",-"+i/2,automargin:!1});u(T,f.graphDiv._fullLayout),T.setScale();var S=f.baxis=h({},t.baxis,{visible:!0,range:[b-_-M,k],side:"bottom",_counterangle:30,domain:f.xaxis.domain,_axislayer:f.layers.baxis,_gridlayer:f.layers.bgrid,_counteraxis:f.aaxis,_pos:0,_id:"x",_length:i,_gridpath:"M0,0l-"+i/2+",-"+a,automargin:!1});u(S,f.graphDiv._fullLayout),S.setScale(),T._counteraxis=S;var E=f.caxis=h({},t.caxis,{visible:!0,range:[b-_-k,M],side:"right",_counterangle:30,tickangle:(+t.caxis.tickangle||0)+30,domain:[A,A+s*w],_axislayer:f.layers.caxis,_gridlayer:f.layers.cgrid,_counteraxis:f.baxis,_pos:0,_id:"y",_length:i,_gridpath:"M0,0l-"+a+","+i/2,automargin:!1});u(E,f.graphDiv._fullLayout),E.setScale();var C="M"+r+","+(n+a)+"h"+i+"l-"+i/2+",-"+a+"Z";f.clipDef.select("path").attr("d",C),f.layers.plotbg.select("path").attr("d",C);var L="M0,"+a+"h"+i+"l-"+i/2+",-"+a+"Z";f.clipDefRelative.select("path").attr("d",L);var z="translate("+r+","+n+")";f.plotContainer.selectAll(".scatterlayer,.maplayer").attr("transform",z),f.clipDefRelative.select("path").attr("transform",null);var P="translate("+(r-S._offset)+","+(n+a)+")";f.layers.baxis.attr("transform",P),f.layers.bgrid.attr("transform",P);var I="translate("+(r+i/2)+","+n+")rotate(30)translate(0,"+-T._offset+")";f.layers.aaxis.attr("transform",I),f.layers.agrid.attr("transform",I);var O="translate("+(r+i/2)+","+n+")rotate(-30)translate(0,"+-E._offset+")";f.layers.caxis.attr("transform",O),f.layers.cgrid.attr("transform",O),f.drawAxes(!0),f.plotContainer.selectAll(".crisp").classed("crisp",!1),f.layers.aline.select("path").attr("d",T.showline?"M"+r+","+(n+a)+"l"+i/2+",-"+a:"M0,0").call(l.stroke,T.linecolor||"#000").style("stroke-width",(T.linewidth||0)+"px"),f.layers.bline.select("path").attr("d",S.showline?"M"+r+","+(n+a)+"h"+i:"M0,0").call(l.stroke,S.linecolor||"#000").style("stroke-width",(S.linewidth||0)+"px"),f.layers.cline.select("path").attr("d",E.showline?"M"+(r+i/2)+","+n+"l"+i/2+","+a:"M0,0").call(l.stroke,E.linecolor||"#000").style("stroke-width",(E.linewidth||0)+"px"),f.graphDiv._context.staticPlot||f.initInteractions(),c.setClipUrl(f.layers.frontplot,f._hasClipOnAxisFalse?null:f.clipId)},_.drawAxes=function(t){var e=this.graphDiv,r=this.id.substr(7)+"title",n=this.aaxis,i=this.baxis,a=this.caxis;if(p.doTicksSingle(e,n,!0),p.doTicksSingle(e,i,!0),p.doTicksSingle(e,a,!0),t){var o=Math.max(n.showticklabels?n.tickfont.size/2:0,(a.showticklabels?.75*a.tickfont.size:0)+("outside"===a.ticks?.87*a.ticklen:0));this.layers["a-title"]=m.draw(e,"a"+r,{propContainer:n,propName:this.id+".aaxis.title",placeholder:s(e,"Click to enter Component A title"),attributes:{x:this.x0+this.w/2,y:this.y0-n.titlefont.size/3-o,"text-anchor":"middle"}});var l=(i.showticklabels?i.tickfont.size:0)+("outside"===i.ticks?i.ticklen:0)+3;this.layers["b-title"]=m.draw(e,"b"+r,{propContainer:i,propName:this.id+".baxis.title",placeholder:s(e,"Click to enter Component B title"),attributes:{x:this.x0-l,y:this.y0+this.h+.83*i.titlefont.size+l,"text-anchor":"middle"}}),this.layers["c-title"]=m.draw(e,"c"+r,{propContainer:a,propName:this.id+".caxis.title",placeholder:s(e,"Click to enter Component C title"),attributes:{x:this.x0+this.w+l,y:this.y0+this.h+.83*a.titlefont.size+l,"text-anchor":"middle"}})}};var k=x.MINZOOM/2+.87,M="m-0.87,.5h"+k+"v3h-"+(k+5.2)+"l"+(k/2+2.6)+",-"+(.87*k+4.5)+"l2.6,1.5l-"+k/2+","+.87*k+"Z",A="m0.87,.5h-"+k+"v3h"+(k+5.2)+"l-"+(k/2+2.6)+",-"+(.87*k+4.5)+"l-2.6,1.5l"+k/2+","+.87*k+"Z",T="m0,1l"+k/2+","+.87*k+"l2.6,-1.5l-"+(k/2+2.6)+",-"+(.87*k+4.5)+"l-"+(k/2+2.6)+","+(.87*k+4.5)+"l2.6,1.5l"+k/2+",-"+.87*k+"Z",S="m0.5,0.5h5v-2h-5v-5h-2v5h-5v2h5v5h2Z",E=!0;function C(t){n.select(t).selectAll(".zoombox,.js-zoombox-backdrop,.js-zoombox-menu,.zoombox-corners").remove()}_.initInteractions=function(){var t,e,r,n,u,h,f,p,m,b,_=this,k=_.layers.plotbg.select("path").node(),L=_.graphDiv,z=L._fullLayout._zoomlayer,P={element:k,gd:L,plotinfo:{xaxis:_.xaxis,yaxis:_.yaxis},subplot:_.id,prepFn:function(a,o,s){P.xaxes=[_.xaxis],P.yaxes=[_.yaxis];var c=L._fullLayout.dragmode;a.shiftKey&&(c="pan"===c?"zoom":"pan"),P.minDrag="lasso"===c?1:void 0,"zoom"===c?(P.moveFn=R,P.doneFn=B,function(a,o,s){var c=k.getBoundingClientRect();t=o-c.left,e=s-c.top,r={a:_.aaxis.range[0],b:_.baxis.range[1],c:_.caxis.range[1]},u=r,n=_.aaxis.range[1]-r.a,h=i(_.graphDiv._fullLayout[_.id].bgcolor).getLuminance(),f="M0,"+_.h+"L"+_.w/2+", 0L"+_.w+","+_.h+"Z",p=!1,m=z.append("path").attr("class","zoombox").attr("transform","translate("+_.x0+", "+_.y0+")").style({fill:h>.2?"rgba(0,0,0,0)":"rgba(255,255,255,0)","stroke-width":0}).attr("d",f),b=z.append("path").attr("class","zoombox-corners").attr("transform","translate("+_.x0+", "+_.y0+")").style({fill:l.background,stroke:l.defaultLine,"stroke-width":1,opacity:0}).attr("d","M0,0Z"),y(z)}(0,o,s)):"pan"===c?(P.moveFn=F,P.doneFn=N,r={a:_.aaxis.range[0],b:_.baxis.range[1],c:_.caxis.range[1]},u=r,y(z)):"select"!==c&&"lasso"!==c||v(a,o,s,P,c)},clickFn:function(t,e){if(C(L),2===t){var r={};r[_.id+".aaxis.min"]=0,r[_.id+".baxis.min"]=0,r[_.id+".caxis.min"]=0,L.emit("plotly_doubleclick",null),a.call("relayout",L,r)}g.click(L,e,_.id)}};function I(t,e){return 1-e/_.h}function O(t,e){return 1-(t+(_.h-e)/Math.sqrt(3))/_.w}function D(t,e){return(t-(_.h-e)/Math.sqrt(3))/_.w}function R(i,a){var o=t+i,s=e+a,l=Math.max(0,Math.min(1,I(0,e),I(0,s))),c=Math.max(0,Math.min(1,O(t,e),O(o,s))),d=Math.max(0,Math.min(1,D(t,e),D(o,s))),g=(l/2+d)*_.w,v=(1-l/2-c)*_.w,y=(g+v)/2,k=v-g,E=(1-l)*_.h,C=E-k/w;k<x.MINZOOM?(u=r,m.attr("d",f),b.attr("d","M0,0Z")):(u={a:r.a+l*n,b:r.b+c*n,c:r.c+d*n},m.attr("d",f+"M"+g+","+E+"H"+v+"L"+y+","+C+"L"+g+","+E+"Z"),b.attr("d","M"+t+","+e+S+"M"+g+","+E+M+"M"+v+","+E+A+"M"+y+","+C+T)),p||(m.transition().style("fill",h>.2?"rgba(0,0,0,0.4)":"rgba(255,255,255,0.3)").duration(200),b.transition().style("opacity",1).duration(200),p=!0)}function B(){if(C(L),u!==r){var t={};t[_.id+".aaxis.min"]=u.a,t[_.id+".baxis.min"]=u.b,t[_.id+".caxis.min"]=u.c,a.call("relayout",L,t),E&&L.data&&L._context.showTips&&(o.notifier(s(L,"Double-click to zoom back out"),"long"),E=!1)}}function F(t,e){var n=t/_.xaxis._m,i=e/_.yaxis._m,a=[(u={a:r.a-i,b:r.b+(n+i)/2,c:r.c-(n-i)/2}).a,u.b,u.c].sort(),o=a.indexOf(u.a),s=a.indexOf(u.b),l=a.indexOf(u.c);a[0]<0&&(a[1]+a[0]/2<0?(a[2]+=a[0]+a[1],a[0]=a[1]=0):(a[2]+=a[0]/2,a[1]+=a[0]/2,a[0]=0),u={a:a[o],b:a[s],c:a[l]},e=(r.a-u.a)*_.yaxis._m,t=(r.c-u.c-r.b+u.b)*_.xaxis._m);var h="translate("+(_.x0+t)+","+(_.y0+e)+")";_.plotContainer.selectAll(".scatterlayer,.maplayer").attr("transform",h);var f="translate("+-t+","+-e+")";_.clipDefRelative.select("path").attr("transform",f),_.aaxis.range=[u.a,_.sum-u.b-u.c],_.baxis.range=[_.sum-u.a-u.c,u.b],_.caxis.range=[_.sum-u.a-u.b,u.c],_.drawAxes(!1),_.plotContainer.selectAll(".crisp").classed("crisp",!1),_._hasClipOnAxisFalse&&_.plotContainer.select(".scatterlayer").selectAll(".trace").call(c.hideOutsideRangePoints,_)}function N(){var t={};t[_.id+".aaxis.min"]=u.a,t[_.id+".baxis.min"]=u.b,t[_.id+".caxis.min"]=u.c,a.call("relayout",L,t)}k.onmousemove=function(t){g.hover(L,t,_.id),L._fullLayout._lasthover=k,L._fullLayout._hoversubplot=_.id},k.onmouseout=function(t){L._dragging||d.unhover(L,t)},d.init(P)}},{"../../components/color":558,"../../components/dragelement":580,"../../components/drawing":583,"../../components/fx":600,"../../components/titles":649,"../../lib":684,"../../lib/extend":673,"../../registry":817,"../cartesian/axes":732,"../cartesian/constants":737,"../cartesian/select":749,"../cartesian/set_convert":750,"../plots":795,d3:147,tinycolor2:499}],817:[function(t,e,r){"use strict";var n=t("./lib/loggers"),i=t("./lib/noop"),a=t("./lib/push_unique"),o=t("./lib/is_plain_object"),s=t("./lib/extend"),l=t("./plots/attributes"),c=t("./plots/layout_attributes"),u=s.extendFlat,h=s.extendDeepAll;function f(t){var e=t.name,i=t.categories,a=t.meta;if(r.modules[e])n.log("Type "+e+" already registered");else{r.subplotsRegistry[t.basePlotModule.name]||function(t){var e=t.name;if(r.subplotsRegistry[e])return void n.log("Plot type "+e+" already registered.");for(var i in m(t),r.subplotsRegistry[e]=t,r.componentsRegistry)x(i,t.name)}(t.basePlotModule);for(var o={},s=0;s<i.length;s++)o[i[s]]=!0,r.allCategories[i[s]]=!0;for(var l in r.modules[e]={_module:t,categories:o},a&&Object.keys(a).length&&(r.modules[e].meta=a),r.allTypes.push(e),r.componentsRegistry)v(l,e);t.layoutAttributes&&u(r.traceLayoutAttributes,t.layoutAttributes)}}function p(t){if("string"!=typeof t.name)throw new Error("Component module *name* must be a string.");var e=t.name;for(var n in r.componentsRegistry[e]=t,t.layoutAttributes&&(t.layoutAttributes._isLinkedToArray&&a(r.layoutArrayContainers,e),m(t)),r.modules)v(e,n);for(var i in r.subplotsRegistry)x(e,i);for(var o in r.transformsRegistry)y(e,o);t.schema&&t.schema.layout&&h(c,t.schema.layout)}function d(t){if("string"!=typeof t.name)throw new Error("Transform module *name* must be a string.");var e="Transform module "+t.name,i="function"==typeof t.transform,a="function"==typeof t.calcTransform;if(!i&&!a)throw new Error(e+" is missing a *transform* or *calcTransform* method.");for(var s in i&&a&&n.log([e+" has both a *transform* and *calcTransform* methods.","Please note that all *transform* methods are executed","before all *calcTransform* methods."].join(" ")),o(t.attributes)||n.log(e+" registered without an *attributes* object."),"function"!=typeof t.supplyDefaults&&n.log(e+" registered without a *supplyDefaults* method."),r.transformsRegistry[t.name]=t,r.componentsRegistry)y(s,t.name)}function g(t){var e=t.name,n=e.split("-")[0],i=t.dictionary,a=t.format,o=i&&Object.keys(i).length,s=a&&Object.keys(a).length,l=r.localeRegistry,c=l[e];if(c||(l[e]=c={}),n!==e){var u=l[n];u||(l[n]=u={}),o&&u.dictionary===c.dictionary&&(u.dictionary=i),s&&u.format===c.format&&(u.format=a)}o&&(c.dictionary=i),s&&(c.format=a)}function m(t){if(t.layoutAttributes){var e=t.layoutAttributes._arrayAttrRegexps;if(e)for(var n=0;n<e.length;n++)a(r.layoutArrayRegexes,e[n])}}function v(t,e){var n=r.componentsRegistry[t].schema;if(n&&n.traces){var i=n.traces[e];i&&h(r.modules[e]._module.attributes,i)}}function y(t,e){var n=r.componentsRegistry[t].schema;if(n&&n.transforms){var i=n.transforms[e];i&&h(r.transformsRegistry[e].attributes,i)}}function x(t,e){var n=r.componentsRegistry[t].schema;if(n&&n.subplots){var i=r.subplotsRegistry[e],a=i.layoutAttributes,o="subplot"===i.attr?i.name:i.attr;Array.isArray(o)&&(o=o[0]);var s=n.subplots[o];a&&s&&h(a,s)}}function b(t){return"object"==typeof t&&(t=t.type),t}r.modules={},r.allCategories={},r.allTypes=[],r.subplotsRegistry={},r.transformsRegistry={},r.componentsRegistry={},r.layoutArrayContainers=[],r.layoutArrayRegexes=[],r.traceLayoutAttributes={},r.localeRegistry={},r.apiMethodRegistry={},r.register=function(t){if(!t)throw new Error("No argument passed to Plotly.register.");t&&!Array.isArray(t)&&(t=[t]);for(var e=0;e<t.length;e++){var n=t[e];if(!n)throw new Error("Invalid module was attempted to be registered!");switch(n.moduleType){case"trace":f(n);break;case"transform":d(n);break;case"component":p(n);break;case"locale":g(n);break;case"apiMethod":var i=n.name;r.apiMethodRegistry[i]=n.fn;break;default:throw new Error("Invalid module was attempted to be registered!")}}},r.getModule=function(t){var e=r.modules[b(t)];return!!e&&e._module},r.traceIs=function(t,e){if("various"===(t=b(t)))return!1;var i=r.modules[t];return i||(t&&"area"!==t&&n.log("Unrecognized trace type "+t+"."),i=r.modules[l.type.dflt]),!!i.categories[e]},r.getTransformIndices=function(t,e){for(var r=[],n=t.transforms||[],i=0;i<n.length;i++)n[i].type===e&&r.push(i);return r},r.hasTransform=function(t,e){for(var r=t.transforms||[],n=0;n<r.length;n++)if(r[n].type===e)return!0;return!1},r.getComponentMethod=function(t,e){var n=r.componentsRegistry[t];return n&&n[e]||i},r.call=function(){var t=arguments[0],e=[].slice.call(arguments,1);return r.apiMethodRegistry[t].apply(null,e)}},{"./lib/extend":673,"./lib/is_plain_object":686,"./lib/loggers":689,"./lib/noop":693,"./lib/push_unique":698,"./plots/attributes":729,"./plots/layout_attributes":786}],818:[function(t,e,r){"use strict";var n=t("../lib"),i=n.extendFlat,a=n.extendDeep;function o(t){var e;switch(t){case"themes__thumb":e={autosize:!0,width:150,height:150,title:"",showlegend:!1,margin:{l:5,r:5,t:5,b:5,pad:0},annotations:[]};break;case"thumbnail":e={title:"",hidesources:!0,showlegend:!1,borderwidth:0,bordercolor:"",margin:{l:1,r:1,t:1,b:1,pad:0},annotations:[]};break;default:e={}}return e}e.exports=function(t,e){var r;t.framework&&t.framework.isPolar&&(t=t.framework.getConfig());var n,s=t.data,l=t.layout,c=a([],s),u=a({},l,o(e.tileClass)),h=t._context||{};if(e.width&&(u.width=e.width),e.height&&(u.height=e.height),"thumbnail"===e.tileClass||"themes__thumb"===e.tileClass){u.annotations=[];var f=Object.keys(u);for(r=0;r<f.length;r++)n=f[r],["xaxis","yaxis","zaxis"].indexOf(n.slice(0,5))>-1&&(u[f[r]].title="");for(r=0;r<c.length;r++){var p=c[r];p.showscale=!1,p.marker&&(p.marker.showscale=!1),"pie"===p.type&&(p.textposition="none")}}if(Array.isArray(e.annotations))for(r=0;r<e.annotations.length;r++)u.annotations.push(e.annotations[r]);var d=Object.keys(u).filter(function(t){return t.match(/^scene\d*$/)});if(d.length){var g={};for("thumbnail"===e.tileClass&&(g={title:"",showaxeslabels:!1,showticklabels:!1,linetickenable:!1}),r=0;r<d.length;r++){var m=u[d[r]];m.xaxis||(m.xaxis={}),m.yaxis||(m.yaxis={}),m.zaxis||(m.zaxis={}),i(m.xaxis,g),i(m.yaxis,g),i(m.zaxis,g),m._scene=null}}var v=document.createElement("div");e.tileClass&&(v.className=e.tileClass);var y={gd:v,td:v,layout:u,data:c,config:{staticPlot:void 0===e.staticPlot||e.staticPlot,plotGlPixelRatio:void 0===e.plotGlPixelRatio?2:e.plotGlPixelRatio,displaylogo:e.displaylogo||!1,showLink:e.showLink||!1,showTips:e.showTips||!1,mapboxAccessToken:h.mapboxAccessToken}};return"transparent"!==e.setBackground&&(y.config.setBackground=e.setBackground||"opaque"),y.gd.defaultLayout=o(e.tileClass),y}},{"../lib":684}],819:[function(t,e,r){"use strict";var n=t("../plot_api/to_image"),i=t("../lib"),a=t("./filesaver");e.exports=function(t,e){return(e=e||{}).format=e.format||"png",new Promise(function(r,o){t._snapshotInProgress&&o(new Error("Snapshotting already in progress.")),i.isIE()&&"svg"!==e.format&&o(new Error("Sorry IE does not support downloading from canvas. Try {format:'svg'} instead.")),t._snapshotInProgress=!0;var s=n(t,e),l=e.filename||t.fn||"newplot";l+="."+e.format,s.then(function(e){return t._snapshotInProgress=!1,a(e,l)}).then(function(t){r(t)}).catch(function(e){t._snapshotInProgress=!1,o(e)})})}},{"../lib":684,"../plot_api/to_image":725,"./filesaver":820}],820:[function(t,e,r){"use strict";e.exports=function(t,e){var r=document.createElement("a"),n="download"in r,i=/Version\/[\d\.]+.*Safari/.test(navigator.userAgent);return new Promise(function(a,o){if("undefined"!=typeof navigator&&/MSIE [1-9]\./.test(navigator.userAgent)&&o(new Error("IE < 10 unsupported")),i&&(document.location.href="data:application/octet-stream"+t.slice(t.search(/[,;]/)),a(e)),e||(e="download"),n&&(r.href=t,r.download=e,document.body.appendChild(r),r.click(),document.body.removeChild(r),a(e)),"undefined"!=typeof navigator&&navigator.msSaveBlob){var s=t.split(/^data:image\/svg\+xml,/)[1],l=decodeURIComponent(s);navigator.msSaveBlob(new Blob([l]),e),a(e)}o(new Error("download error"))})}},{}],821:[function(t,e,r){"use strict";r.getDelay=function(t){return t._has&&(t._has("gl3d")||t._has("gl2d")||t._has("mapbox"))?500:0},r.getRedrawFunc=function(t){var e=t._fullLayout||{};if(!(!(e._has&&e._has("polar"))&&t.data&&t.data[0]&&t.data[0].r))return function(){(t.calcdata||[]).forEach(function(t){t[0]&&t[0].t&&t[0].t.cb&&t[0].t.cb()})}}},{}],822:[function(t,e,r){"use strict";var n=t("./helpers"),i={getDelay:n.getDelay,getRedrawFunc:n.getRedrawFunc,clone:t("./cloneplot"),toSVG:t("./tosvg"),svgToImg:t("./svgtoimg"),toImage:t("./toimage"),downloadImage:t("./download")};e.exports=i},{"./cloneplot":818,"./download":819,"./helpers":821,"./svgtoimg":823,"./toimage":824,"./tosvg":825}],823:[function(t,e,r){"use strict";var n=t("../lib"),i=t("events").EventEmitter;e.exports=function(t){var e=t.emitter||new i,r=new Promise(function(i,a){var o=window.Image,s=t.svg,l=t.format||"png";if(n.isIE()&&"svg"!==l){var c=new Error("Sorry IE does not support downloading from canvas. Try {format:'svg'} instead.");return a(c),t.promise?r:e.emit("error",c)}var u=t.canvas,h=t.scale||1,f=t.width||300,p=t.height||150,d=h*f,g=h*p,m=u.getContext("2d"),v=new o,y="data:image/svg+xml,"+encodeURIComponent(s);u.width=d,u.height=g,v.onload=function(){var r;switch("svg"!==l&&m.drawImage(v,0,0,d,g),l){case"jpeg":r=u.toDataURL("image/jpeg");break;case"png":r=u.toDataURL("image/png");break;case"webp":r=u.toDataURL("image/webp");break;case"svg":r=y;break;default:var n="Image format is not jpeg, png, svg or webp.";if(a(new Error(n)),!t.promise)return e.emit("error",n)}i(r),t.promise||e.emit("success",r)},v.onerror=function(r){if(a(r),!t.promise)return e.emit("error",r)},v.src=y});return t.promise?r:e}},{"../lib":684,events:212}],824:[function(t,e,r){"use strict";var n=t("events").EventEmitter,i=t("../registry"),a=t("../lib"),o=t("./helpers"),s=t("./cloneplot"),l=t("./tosvg"),c=t("./svgtoimg");e.exports=function(t,e){var r=new n,u=s(t,{format:"png"}),h=u.gd;h.style.position="absolute",h.style.left="-5000px",document.body.appendChild(h);var f=o.getRedrawFunc(h);return i.call("plot",h,u.data,u.layout,u.config).then(f).then(function(){var t=o.getDelay(h._fullLayout);setTimeout(function(){var t=l(h),n=document.createElement("canvas");n.id=a.randstr(),(r=c({format:e.format,width:h._fullLayout.width,height:h._fullLayout.height,canvas:n,emitter:r,svg:t})).clean=function(){h&&document.body.removeChild(h)}},t)}).catch(function(t){r.emit("error",t)}),r}},{"../lib":684,"../registry":817,"./cloneplot":818,"./helpers":821,"./svgtoimg":823,"./tosvg":825,events:212}],825:[function(t,e,r){"use strict";var n=t("d3"),i=t("../lib"),a=t("../components/drawing"),o=t("../components/color"),s=t("../constants/xmlns_namespaces"),l=/"/g,c=new RegExp('("TOBESTRIPPED)|(TOBESTRIPPED")',"g");e.exports=function(t,e,r){var u,h=t._fullLayout,f=h._paper,p=h._toppaper,d=h.width,g=h.height;f.insert("rect",":first-child").call(a.setRect,0,0,d,g).call(o.fill,h.paper_bgcolor);var m=h._basePlotModules||[];for(u=0;u<m.length;u++){var v=m[u];v.toSVG&&v.toSVG(t)}if(p){var y=p.node().childNodes,x=Array.prototype.slice.call(y);for(u=0;u<x.length;u++){var b=x[u];b.childNodes.length&&f.node().appendChild(b)}}h._draggers&&h._draggers.remove(),f.node().style.background="",f.selectAll("text").attr({"data-unformatted":null,"data-math":null}).each(function(){var t=n.select(this);if("hidden"!==this.style.visibility&&"none"!==this.style.display){t.style({visibility:null,display:null});var e=this.style.fontFamily;e&&-1!==e.indexOf('"')&&t.style("font-family",e.replace(l,"TOBESTRIPPED"))}else t.remove()}),f.selectAll(".point,.scatterpts").each(function(){var t=n.select(this),e=this.style.fill;e&&-1!==e.indexOf("url(")&&t.style("fill",e.replace(l,"TOBESTRIPPED"))}),"pdf"!==e&&"eps"!==e||f.selectAll("#MathJax_SVG_glyphs path").attr("stroke-width",0),f.node().setAttributeNS(s.xmlns,"xmlns",s.svg),f.node().setAttributeNS(s.xmlns,"xmlns:xlink",s.xlink),"svg"===e&&r&&(f.attr("width",r*d),f.attr("height",r*g),f.attr("viewBox","0 0 "+d+" "+g));var _=(new window.XMLSerializer).serializeToString(f.node());return _=function(t){var e=n.select("body").append("div").style({display:"none"}).html(""),r=t.replace(/(&[^;]*;)/gi,function(t){return"&lt;"===t?"&#60;":"&rt;"===t?"&#62;":-1!==t.indexOf("<")||-1!==t.indexOf(">")?"":e.html(t).text()});return e.remove(),r}(_),_=(_=_.replace(/&(?!\w+;|\#[0-9]+;| \#x[0-9A-F]+;)/g,"&amp;")).replace(c,"'"),i.isIE()&&(_=(_=(_=_.replace(/"/gi,"'")).replace(/(\('#)([^']*)('\))/gi,'("#$2")')).replace(/(\\')/gi,'"')),_}},{"../components/color":558,"../components/drawing":583,"../constants/xmlns_namespaces":663,"../lib":684,d3:147}],826:[function(t,e,r){"use strict";var n=t("../../lib").mergeArray;e.exports=function(t,e){for(var r=0;r<t.length;r++)t[r].i=r;n(e.text,t,"tx"),n(e.hovertext,t,"htx");var i=e.marker;if(i){n(i.opacity,t,"mo"),n(i.color,t,"mc");var a=i.line;a&&(n(a.color,t,"mlc"),n(a.width,t,"mlw"))}}},{"../../lib":684}],827:[function(t,e,r){"use strict";var n=t("../scatter/attributes"),i=t("../../components/colorscale/attributes"),a=t("../../components/colorbar/attributes"),o=t("../../plots/font_attributes"),s=t("../../lib/extend").extendFlat,l=o({editType:"calc",arrayOk:!0}),c=s({},n.marker.line.width,{dflt:0}),u=s({width:c,editType:"calc"},i("marker.line")),h=s({line:u,editType:"calc"},i("marker"),{colorbar:a,opacity:{valType:"number",arrayOk:!0,dflt:1,min:0,max:1,editType:"style"}});e.exports={x:n.x,x0:n.x0,dx:n.dx,y:n.y,y0:n.y0,dy:n.dy,text:n.text,hovertext:n.hovertext,textposition:{valType:"enumerated",values:["inside","outside","auto","none"],dflt:"none",arrayOk:!0,editType:"calc"},textfont:s({},l,{}),insidetextfont:s({},l,{}),outsidetextfont:s({},l,{}),constraintext:{valType:"enumerated",values:["inside","outside","both","none"],dflt:"both",editType:"calc"},cliponaxis:s({},n.cliponaxis,{}),orientation:{valType:"enumerated",values:["v","h"],editType:"calc+clearAxisTypes"},base:{valType:"any",dflt:null,arrayOk:!0,editType:"calc"},offset:{valType:"number",dflt:null,arrayOk:!0,editType:"calc"},width:{valType:"number",dflt:null,min:0,arrayOk:!0,editType:"calc"},marker:h,selected:{marker:{opacity:n.selected.marker.opacity,color:n.selected.marker.color,editType:"style"},textfont:n.selected.textfont,editType:"style"},unselected:{marker:{opacity:n.unselected.marker.opacity,color:n.unselected.marker.color,editType:"style"},textfont:n.unselected.textfont,editType:"style"},r:n.r,t:n.t,_deprecated:{bardir:{valType:"enumerated",editType:"calc",values:["v","h"]}}}},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../../plots/font_attributes":758,"../scatter/attributes":1015}],828:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib").isArrayOrTypedArray,a=t("../../plots/cartesian/axes"),o=t("../../components/colorscale/has_colorscale"),s=t("../../components/colorscale/calc"),l=t("./arrays_to_calcdata"),c=t("../scatter/calc_selection");e.exports=function(t,e){var r,u,h,f,p,d=a.getFromId(t,e.xaxis||"x"),g=a.getFromId(t,e.yaxis||"y");"h"===(e.orientation||(e.x&&!e.y?"h":"v"))?(r=d,h=d.makeCalcdata(e,"x"),u=g.makeCalcdata(e,"y"),p=e.xcalendar):(r=g,h=g.makeCalcdata(e,"y"),u=d.makeCalcdata(e,"x"),p=e.ycalendar);var m=Math.min(u.length,h.length),v=new Array(m);for(f=0;f<m;f++)v[f]={p:u[f],s:h[f]},e.ids&&(v[f].id=String(e.ids[f]));var y,x=e.base;if(i(x)){for(f=0;f<Math.min(x.length,v.length);f++)y=r.d2c(x[f],0,p),n(y)?(v[f].b=+y,v[f].hasB=1):v[f].b=0;for(;f<v.length;f++)v[f].b=0}else{y=r.d2c(x,0,p);var b=n(y);for(y=b?y:0,f=0;f<v.length;f++)v[f].b=y,b&&(v[f].hasB=1)}return o(e,"marker")&&s(e,e.marker.color,"marker","c"),o(e,"marker.line")&&s(e,e.marker.line.color,"marker.line","c"),l(v,e),c(v,e),v}},{"../../components/colorscale/calc":566,"../../components/colorscale/has_colorscale":572,"../../lib":684,"../../plots/cartesian/axes":732,"../scatter/calc_selection":1017,"./arrays_to_calcdata":826,"fast-isnumeric":214}],829:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../components/color"),a=t("../../registry"),o=t("../scatter/xy_defaults"),s=t("../bar/style_defaults"),l=t("./attributes");e.exports=function(t,e,r,c){function u(r,i){return n.coerce(t,e,l,r,i)}var h=n.coerceFont;if(o(t,e,c,u)){u("orientation",e.x&&!e.y?"h":"v"),u("base"),u("offset"),u("width"),u("text"),u("hovertext");var f=u("textposition"),p=Array.isArray(f)||"auto"===f,d=p||"inside"===f,g=p||"outside"===f;if(d||g){var m=h(u,"textfont",c.font);d&&h(u,"insidetextfont",m),g&&h(u,"outsidetextfont",m),u("constraintext"),u("selected.textfont.color"),u("unselected.textfont.color"),u("cliponaxis")}s(t,e,u,r,c);var v=a.getComponentMethod("errorbars","supplyDefaults");v(t,e,i.defaultLine,{axis:"y"}),v(t,e,i.defaultLine,{axis:"x",inherit:"y"}),n.coerceSelectionMarkerOpacity(e,u)}else e.visible=!1}},{"../../components/color":558,"../../lib":684,"../../registry":817,"../bar/style_defaults":839,"../scatter/xy_defaults":1039,"./attributes":827}],830:[function(t,e,r){"use strict";var n=t("../../components/fx"),i=t("../../registry"),a=t("../../components/color"),o=t("../scatter/fill_hover_text");e.exports=function(t,e,r,s){var l,c,u,h,f,p,d,g=t.cd,m=g[0].trace,v=g[0].t,y="closest"===s,x=t.maxHoverDistance,b=t.maxSpikeDistance;function _(t){return t[u]-t.w/2}function w(t){return t[u]+t.w/2}var k=y?_:function(t){return Math.min(_(t),t.p-v.bardelta/2)},M=y?w:function(t){return Math.max(w(t),t.p+v.bardelta/2)};function A(t,e){return n.inbox(t-l,e-l,x+Math.min(1,Math.abs(e-t)/d)-1)}function T(t){return A(k(t),M(t))}function S(t){return n.inbox(t.b-c,t[h]-c,x+(t[h]-c)/(t[h]-t.b)-1)}"h"===m.orientation?(l=r,c=e,u="y",h="x",f=S,p=T):(l=e,c=r,u="x",h="y",p=S,f=T);var E=t[u+"a"],C=t[h+"a"];d=Math.abs(E.r2c(E.range[1])-E.r2c(E.range[0]));var L=n.getDistanceFunction(s,f,p,function(t){return(f(t)+p(t))/2});if(n.getClosest(g,L,t),!1!==t.index){y||(k=function(t){return Math.min(_(t),t.p-v.bargroupwidth/2)},M=function(t){return Math.max(w(t),t.p+v.bargroupwidth/2)});var z=g[t.index],P=z.mcc||m.marker.color,I=z.mlcc||m.marker.line.color,O=z.mlw||m.marker.line.width;a.opacity(P)?t.color=P:a.opacity(I)&&O&&(t.color=I);var D=m.base?z.b+z.s:z.s;t[h+"0"]=t[h+"1"]=C.c2p(z[h],!0),t[h+"LabelVal"]=D;var R=v.extents[v.extents.round(z.p)];return t[u+"0"]=E.c2p(y?k(z):R[0],!0),t[u+"1"]=E.c2p(y?M(z):R[1],!0),t[u+"LabelVal"]=z.p,t.spikeDistance=(S(z)+function(t){return A(_(t),w(t))}(z))/2+b-x,t[u+"Spike"]=E.c2p(z.p,!0),o(z,m,t),i.getComponentMethod("errorbars","hoverInfo")(z,m,t),[t]}}},{"../../components/color":558,"../../components/fx":600,"../../registry":817,"../scatter/fill_hover_text":1022}],831:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.layoutAttributes=t("./layout_attributes"),n.supplyDefaults=t("./defaults"),n.supplyLayoutDefaults=t("./layout_defaults"),n.calc=t("./calc"),n.setPositions=t("./set_positions"),n.colorbar=t("../scatter/marker_colorbar"),n.arraysToCalcdata=t("./arrays_to_calcdata"),n.plot=t("./plot"),n.style=t("./style").style,n.styleOnSelect=t("./style").styleOnSelect,n.hoverPoints=t("./hover"),n.selectPoints=t("./select"),n.moduleType="trace",n.name="bar",n.basePlotModule=t("../../plots/cartesian"),n.categories=["cartesian","svg","bar","oriented","errorBarsOK","showLegend","zoomScale"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"../scatter/marker_colorbar":1032,"./arrays_to_calcdata":826,"./attributes":827,"./calc":828,"./defaults":829,"./hover":830,"./layout_attributes":832,"./layout_defaults":833,"./plot":834,"./select":835,"./set_positions":836,"./style":838}],832:[function(t,e,r){"use strict";e.exports={barmode:{valType:"enumerated",values:["stack","group","overlay","relative"],dflt:"group",editType:"calc"},barnorm:{valType:"enumerated",values:["","fraction","percent"],dflt:"",editType:"calc"},bargap:{valType:"number",min:0,max:1,editType:"calc"},bargroupgap:{valType:"number",min:0,max:1,dflt:0,editType:"calc"}}},{}],833:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../plots/cartesian/axes"),a=t("../../lib"),o=t("./layout_attributes");e.exports=function(t,e,r){function s(r,n){return a.coerce(t,e,o,r,n)}for(var l=!1,c=!1,u=!1,h={},f=0;f<r.length;f++){var p=r[f];if(n.traceIs(p,"bar")){if(l=!0,"overlay"!==t.barmode&&"stack"!==t.barmode){var d=p.xaxis+p.yaxis;h[d]&&(u=!0),h[d]=!0}if(p.visible&&"histogram"===p.type)"category"!==i.getFromId({_fullLayout:e},p["v"===p.orientation?"xaxis":"yaxis"]).type&&(c=!0)}}l&&("overlay"!==s("barmode")&&s("barnorm"),s("bargap",c&&!u?0:.2),s("bargroupgap"))}},{"../../lib":684,"../../plots/cartesian/axes":732,"../../registry":817,"./layout_attributes":832}],834:[function(t,e,r){"use strict";var n=t("d3"),i=t("fast-isnumeric"),a=t("tinycolor2"),o=t("../../lib"),s=t("../../lib/svg_text_utils"),l=t("../../components/color"),c=t("../../components/drawing"),u=t("../../registry"),h=t("./attributes"),f=h.text,p=h.textposition,d=h.textfont,g=h.insidetextfont,m=h.outsidetextfont,v=3;function y(t,e,r,n,i,a){var o;return i<1?o="scale("+i+") ":(i=1,o=""),"translate("+(r-i*t)+" "+(n-i*e)+")"+o+(a?"rotate("+a+" "+t+" "+e+") ":"")}function x(t,e,r,n){var o=b((e=e||{}).family,r),s=b(e.size,r),l=b(e.color,r);return{family:_(t.family,o,n.family),size:function(t,e,r){if(i(e)){e=+e;var n=t.min,a=t.max,o=void 0!==n&&e<n||void 0!==a&&e>a;if(!o)return e}return void 0!==r?r:t.dflt}(t.size,s,n.size),color:function(t,e,r){return a(e).isValid()?e:void 0!==r?r:t.dflt}(t.color,l,n.color)}}function b(t,e){var r;return Array.isArray(t)?e<t.length&&(r=t[e]):r=t,r}function _(t,e,r){if("string"==typeof e){if(e||!t.noBlank)return e}else if("number"==typeof e&&!t.strict)return String(e);return void 0!==r?r:t.dflt}e.exports=function(t,e,r,a){var h=e.xaxis,w=e.yaxis,k=t._fullLayout,M=a.selectAll("g.trace.bars").data(r,function(t){return t[0].trace.uid});M.enter().append("g").attr("class","trace bars").append("g").attr("class","points"),M.exit().remove(),M.order(),M.each(function(r){var a=r[0],u=a.t,M=a.trace,A=n.select(this);e.isRangePlot||(a.node3=A);var T=u.poffset,S=Array.isArray(T),E=A.select("g.points").selectAll("g.point").data(o.identity);E.enter().append("g").classed("point",!0),E.exit().remove(),E.each(function(a,u){var A,E,C,L,z=n.select(this),P=a.p+(S?T[u]:T),I=P+a.w,O=a.b,D=O+a.s;if("h"===M.orientation?(C=w.c2p(P,!0),L=w.c2p(I,!0),A=h.c2p(O,!0),E=h.c2p(D,!0),a.ct=[E,(C+L)/2]):(A=h.c2p(P,!0),E=h.c2p(I,!0),C=w.c2p(O,!0),L=w.c2p(D,!0),a.ct=[(A+E)/2,L]),i(A)&&i(E)&&i(C)&&i(L)&&A!==E&&C!==L){var R=(a.mlw+1||M.marker.line.width+1||(a.trace?a.trace.marker.line.width:0)+1)-1,B=n.round(R/2%1,2);if(!t._context.staticPlot){var F=l.opacity(a.mc||M.marker.color)<1||R>.01?N:function(t,e){return Math.abs(t-e)>=2?N(t):t>e?Math.ceil(t):Math.floor(t)};A=F(A,E),E=F(E,A),C=F(C,L),L=F(L,C)}o.ensureSingle(z,"path").style("vector-effect","non-scaling-stroke").attr("d","M"+A+","+C+"V"+L+"H"+E+"V"+C+"Z").call(c.setClipUrl,e.layerClipId),function(t,e,r,n,i,a,l,u){var h;function w(e,r,n){var i=o.ensureSingle(e,"text").text(r).attr({class:"bartext bartext-"+h,transform:"","text-anchor":"middle","data-notex":1}).call(c.font,n).call(s.convertToTspans,t);return i}var k=r[0].trace,M=k.orientation,A=function(t,e){var r=b(t.text,e);return _(f,r)}(k,n);if(h=function(t,e){var r=b(t.textposition,e);return function(t,e,r){return t.coerceNumber&&(e=+e),-1!==t.values.indexOf(e)?e:void 0!==r?r:t.dflt}(p,r)}(k,n),!A||"none"===h)return void e.select("text").remove();var T,S,E,C,L,z,P=function(t,e,r){return x(d,t.textfont,e,r)}(k,n,t._fullLayout.font),I=function(t,e,r){return x(g,t.insidetextfont,e,r)}(k,n,P),O=function(t,e,r){return x(m,t.outsidetextfont,e,r)}(k,n,P),D=t._fullLayout.barmode,R="relative"===D,B="stack"===D||R,F=r[n],N=!B||F._outmost,j=Math.abs(a-i)-2*v,V=Math.abs(u-l)-2*v;"outside"===h&&(N||(h="inside"));if("auto"===h)if(N){h="inside",T=w(e,A,I),S=c.bBox(T.node()),E=S.width,C=S.height;var U=E>0&&C>0,q=E<=j&&C<=V,H=E<=V&&C<=j,G="h"===M?j>=E*(V/C):V>=C*(j/E);U&&(q||H||G)?h="inside":(h="outside",T.remove(),T=null)}else h="inside";if(!T&&(T=w(e,A,"outside"===h?O:I),S=c.bBox(T.node()),E=S.width,C=S.height,E<=0||C<=0))return void T.remove();"outside"===h?(z="both"===k.constraintext||"outside"===k.constraintext,L=function(t,e,r,n,i,a,o){var s,l="h"===a?Math.abs(n-r):Math.abs(e-t);l>2*v&&(s=v);var c=1;o&&(c="h"===a?Math.min(1,l/i.height):Math.min(1,l/i.width));var u,h,f,p,d=(i.left+i.right)/2,g=(i.top+i.bottom)/2;u=c*i.width,h=c*i.height,"h"===a?e<t?(f=e-s-u/2,p=(r+n)/2):(f=e+s+u/2,p=(r+n)/2):n>r?(f=(t+e)/2,p=n+s+h/2):(f=(t+e)/2,p=n-s-h/2);return y(d,g,f,p,c,!1)}(i,a,l,u,S,M,z)):(z="both"===k.constraintext||"inside"===k.constraintext,L=function(t,e,r,n,i,a,o){var s,l,c,u,h,f,p,d=i.width,g=i.height,m=(i.left+i.right)/2,x=(i.top+i.bottom)/2,b=Math.abs(e-t),_=Math.abs(n-r);b>2*v&&_>2*v?(b-=2*(h=v),_-=2*h):h=0;d<=b&&g<=_?(f=!1,p=1):d<=_&&g<=b?(f=!0,p=1):d<g==b<_?(f=!1,p=o?Math.min(b/d,_/g):1):(f=!0,p=o?Math.min(_/d,b/g):1);f&&(f=90);f?(s=p*g,l=p*d):(s=p*d,l=p*g);"h"===a?e<t?(c=e+h+s/2,u=(r+n)/2):(c=e-h-s/2,u=(r+n)/2):n>r?(c=(t+e)/2,u=n-h-l/2):(c=(t+e)/2,u=n+h+l/2);return y(m,x,c,u,p,f)}(i,a,l,u,S,M,z));T.attr("transform",L)}(t,z,r,u,A,E,C,L),e.layerClipId&&c.hideOutsideRangePoint(r[u],z.select("text"),h,w,M.xcalendar,M.ycalendar)}else z.remove();function N(t){return 0===k.bargap&&0===k.bargroupgap?n.round(Math.round(t)-B,2):t}});var C=!1===r[0].trace.cliponaxis;c.setClipUrl(A,C?null:e.layerClipId)}),u.getComponentMethod("errorbars","plot")(M,e)}},{"../../components/color":558,"../../components/drawing":583,"../../lib":684,"../../lib/svg_text_utils":708,"../../registry":817,"./attributes":827,d3:147,"fast-isnumeric":214,tinycolor2:499}],835:[function(t,e,r){"use strict";e.exports=function(t,e){var r,n=t.cd,i=t.xaxis,a=t.yaxis,o=[];if(!1===e)for(r=0;r<n.length;r++)n[r].selected=0;else for(r=0;r<n.length;r++){var s=n[r];e.contains(s.ct)?(o.push({pointNumber:r,x:i.c2d(s.x),y:a.c2d(s.y)}),s.selected=1):s.selected=0}return o}},{}],836:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib").isArrayOrTypedArray,a=t("../../constants/numerical").BADNUM,o=t("../../registry"),s=t("../../plots/cartesian/axes"),l=t("./sieve.js");function c(t,e,r,i){if(i.length){var o,c,b,_,w=t._fullLayout.barmode,k="group"===w;if("overlay"===w)u(t,e,r,i);else if(k){for(o=[],c=[],b=0;b<i.length;b++)void 0===(_=i[b])[0].trace.offset?c.push(_):o.push(_);c.length&&function(t,e,r,n){var i=t._fullLayout.barnorm,a=new l(n,!1,!i);(function(t,e,r){var n,i,a,o,s=t._fullLayout,l=s.bargap,c=s.bargroupgap,u=r.positions,h=r.distinctPositions,g=r.minDiff,m=r.traces,v=u.length!==h.length,y=m.length,x=g*(1-l),b=v?x/y:x,_=b*(1-c);for(n=0;n<y;n++){i=m[n],a=i[0];var w=v?((2*n+1-y)*b-_)/2:-_/2;(o=a.t).barwidth=_,o.poffset=w,o.bargroupwidth=x,o.bardelta=g}r.binWidth=m[0][0].t.barwidth/100,f(r),p(t,e,r),d(t,e,r,v)})(t,e,a),i?(v(t,r,a),y(t,r,a)):m(t,r,a)}(t,e,r,c),o.length&&u(t,e,r,o)}else{for(o=[],c=[],b=0;b<i.length;b++)void 0===(_=i[b])[0].trace.base?c.push(_):o.push(_);c.length&&function(t,e,r,i){var o=t._fullLayout.barmode,c="stack"===o,u="relative"===o,f=t._fullLayout.barnorm,p=new l(i,u,!(f||c||u));h(t,e,p),function(t,e,r){var i,o,l,c,u=t._fullLayout.barnorm,h=x(e),f=r.traces,p=[null,null];for(i=0;i<f.length;i++)for(o=f[i],l=0;l<o.length;l++)if((c=o[l]).s!==a){var d=r.put(c.p,c.b+c.s),m=d+c.b+c.s;c.b=d,c[h]=m,u||(n(e.c2l(m))&&g(p,m),c.hasB&&n(e.c2l(d))&&g(p,d))}u||s.expand(e,p,{tozero:!0,padded:!0})}(t,r,p);for(var d=0;d<i.length;d++)for(var m=i[d],v=0;v<m.length;v++){var b=m[v];if(b.s!==a){var _=b.b+b.s===p.get(b.p,b.s);_&&(b._outmost=!0)}}f&&y(t,r,p)}(t,e,r,c),o.length&&u(t,e,r,o)}!function(t,e){var r,i,a,o=e._id.charAt(0),s={},l=1/0,c=-1/0;for(r=0;r<t.length;r++)for(a=t[r],i=0;i<a.length;i++){var u=a[i].p;n(u)&&(l=Math.min(l,u),c=Math.max(c,u))}var h=1e4/(c-l),f=s.round=function(t){return String(Math.round(h*(t-l)))};for(r=0;r<t.length;r++)for((a=t[r])[0].t.extents=s,i=0;i<a.length;i++){var p=a[i],d=p[o]-p.w/2;if(n(d)){var g=p[o]+p.w/2,m=f(p.p);s[m]?s[m]=[Math.min(d,s[m][0]),Math.max(g,s[m][1])]:s[m]=[d,g]}}}(i,e)}}function u(t,e,r,n){for(var i=t._fullLayout.barnorm,a=!i,o=0;o<n.length;o++){var s=n[o],c=new l([s],!1,a);h(t,e,c),i?(v(t,r,c),y(t,r,c)):m(t,r,c)}}function h(t,e,r){var n,i,a=t._fullLayout,o=a.bargap,s=a.bargroupgap,l=r.minDiff,c=r.traces,u=l*(1-o),h=u*(1-s),g=-h/2;for(n=0;n<c.length;n++)(i=c[n][0].t).barwidth=h,i.poffset=g,i.bargroupwidth=u,i.bardelta=l;r.binWidth=c[0][0].t.barwidth/100,f(r),p(t,e,r),d(t,e,r)}function f(t){var e,r,a,o,s,l,c=t.traces;for(e=0;e<c.length;e++){o=(a=(r=c[e])[0]).trace,l=a.t;var u,h=o.offset,f=l.poffset;if(i(h)){for(u=h.slice(0,r.length),s=0;s<u.length;s++)n(u[s])||(u[s]=f);for(s=u.length;s<r.length;s++)u.push(f);l.poffset=u}else void 0!==h&&(l.poffset=h);var p=o.width,d=l.barwidth;if(i(p)){var g=p.slice(0,r.length);for(s=0;s<g.length;s++)n(g[s])||(g[s]=d);for(s=g.length;s<r.length;s++)g.push(d);if(l.barwidth=g,void 0===h){for(u=[],s=0;s<r.length;s++)u.push(f+(d-g[s])/2);l.poffset=u}}else void 0!==p&&(l.barwidth=p,void 0===h&&(l.poffset=f+(d-p)/2))}}function p(t,e,r){for(var n=r.traces,i=x(e),a=0;a<n.length;a++)for(var o=n[a],s=o[0].t,l=s.poffset,c=Array.isArray(l),u=s.barwidth,h=Array.isArray(u),f=0;f<o.length;f++){var p=o[f],d=p.w=h?u[f]:u;p[i]=p.p+(c?l[f]:l)+d/2}}function d(t,e,r,n){var i=r.traces,a=r.distinctPositions,o=a[0],l=r.minDiff,c=l/2;s.minDtick(e,l,o,n);for(var u=Math.min.apply(Math,a)-c,h=Math.max.apply(Math,a)+c,f=0;f<i.length;f++){var p=i[f],d=p[0],g=d.trace;if(void 0!==g.width||void 0!==g.offset)for(var m=d.t,v=m.poffset,y=m.barwidth,x=Array.isArray(v),b=Array.isArray(y),_=0;_<p.length;_++){var w=p[_],k=x?v[_]:v,M=b?y[_]:y,A=w.p+k,T=A+M;u=Math.min(u,A),h=Math.max(h,T)}}s.expand(e,[u,h],{padded:!1})}function g(t,e){n(t[0])?t[0]=Math.min(t[0],e):t[0]=e,n(t[1])?t[1]=Math.max(t[1],e):t[1]=e}function m(t,e,r){for(var i=r.traces,a=x(e),o=[null,null],l=0;l<i.length;l++)for(var c=i[l],u=0;u<c.length;u++){var h=c[u],f=h.b,p=f+h.s;h[a]=p,n(e.c2l(p))&&g(o,p),h.hasB&&n(e.c2l(f))&&g(o,f)}s.expand(e,o,{tozero:!0,padded:!0})}function v(t,e,r){for(var n=r.traces,i=0;i<n.length;i++)for(var o=n[i],s=0;s<o.length;s++){var l=o[s];l.s!==a&&r.put(l.p,l.b+l.s)}}function y(t,e,r){var i=r.traces,o=x(e),l="fraction"===t._fullLayout.barnorm?1:100,c=l/1e9,u=e.l2c(e.c2l(0)),h="stack"===t._fullLayout.barmode?l:u,f=[u,h],p=!1;function d(t){n(e.c2l(t))&&(t<u-c||t>h+c||!n(u))&&(p=!0,g(f,t))}for(var m=0;m<i.length;m++)for(var v=i[m],y=0;y<v.length;y++){var b=v[y];if(b.s!==a){var _=Math.abs(l/r.get(b.p,b.s));b.b*=_,b.s*=_;var w=b.b,k=w+b.s;b[o]=k,d(k),b.hasB&&d(w)}}s.expand(e,f,{tozero:!0,padded:p})}function x(t){return t._id.charAt(0)}e.exports=function(t,e){var r,n=e.xaxis,i=e.yaxis,a=t._fullData,s=t.calcdata,l=[],u=[];for(r=0;r<a.length;r++){var h=a[r];!0===h.visible&&o.traceIs(h,"bar")&&h.xaxis===n._id&&h.yaxis===i._id&&("h"===h.orientation?l.push(s[r]):u.push(s[r]))}c(t,n,i,u),c(t,i,n,l)}},{"../../constants/numerical":661,"../../lib":684,"../../plots/cartesian/axes":732,"../../registry":817,"./sieve.js":837,"fast-isnumeric":214}],837:[function(t,e,r){"use strict";e.exports=a;var n=t("../../lib"),i=t("../../constants/numerical").BADNUM;function a(t,e,r){this.traces=t,this.separateNegativeValues=e,this.dontMergeOverlappingData=r;for(var a=1/0,o=[],s=0;s<t.length;s++){for(var l=t[s],c=0;c<l.length;c++){var u=l[c];u.p!==i&&o.push(u.p)}l[0]&&l[0].width1&&(a=Math.min(l[0].width1,a))}this.positions=o;var h=n.distinctVals(o);this.distinctPositions=h.vals,1===h.vals.length&&a!==1/0?this.minDiff=a:this.minDiff=Math.min(h.minDiff,a),this.binWidth=this.minDiff,this.bins={}}a.prototype.put=function(t,e){var r=this.getLabel(t,e),n=this.bins[r]||0;return this.bins[r]=n+e,n},a.prototype.get=function(t,e){var r=this.getLabel(t,e);return this.bins[r]||0},a.prototype.getLabel=function(t,e){return(e<0&&this.separateNegativeValues?"v":"^")+(this.dontMergeOverlappingData?t:Math.round(t/this.binWidth))}},{"../../constants/numerical":661,"../../lib":684}],838:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/drawing"),a=t("../../registry");function o(t,e,r){var a=t.selectAll("path"),o=t.selectAll("text");i.pointStyle(a,e,r),o.each(function(t){var r,a=n.select(this);function o(e){var n=r[e];return Array.isArray(n)?n[t.i]:n}a.classed("bartext-inside")?r=e.insidetextfont:a.classed("bartext-outside")&&(r=e.outsidetextfont),r||(r=e.textfont),i.font(a,o("family"),o("size"),o("color"))})}e.exports={style:function(t,e){var r=e?e[0].node3:n.select(t).selectAll("g.trace.bars"),i=r.size(),s=t._fullLayout;r.style("opacity",function(t){return t[0].trace.opacity}).each(function(t){("stack"===s.barmode&&i>1||0===s.bargap&&0===s.bargroupgap&&!t[0].trace.marker.line.width)&&n.select(this).attr("shape-rendering","crispEdges")}),r.selectAll("g.points").each(function(e){o(n.select(this),e[0].trace,t)}),a.getComponentMethod("errorbars","style")(r)},styleOnSelect:function(t,e){var r=e[0].node3,n=e[0].trace;n.selectedpoints?(i.selectedPointStyle(r.selectAll("path"),n),i.selectedTextStyle(r.selectAll("text"),n)):o(r,n,t)}}},{"../../components/drawing":583,"../../registry":817,d3:147}],839:[function(t,e,r){"use strict";var n=t("../../components/color"),i=t("../../components/colorscale/has_colorscale"),a=t("../../components/colorscale/defaults");e.exports=function(t,e,r,o,s){r("marker.color",o),i(t,"marker")&&a(t,e,s,r,{prefix:"marker.",cLetter:"c"}),r("marker.line.color",n.defaultLine),i(t,"marker.line")&&a(t,e,s,r,{prefix:"marker.line.",cLetter:"c"}),r("marker.line.width"),r("marker.opacity"),r("selected.marker.color"),r("unselected.marker.color")}},{"../../components/color":558,"../../components/colorscale/defaults":568,"../../components/colorscale/has_colorscale":572}],840:[function(t,e,r){"use strict";var n=t("../scatter/attributes"),i=t("../../components/color/attributes"),a=t("../../lib/extend").extendFlat,o=n.marker,s=o.line;e.exports={y:{valType:"data_array",editType:"calc+clearAxisTypes"},x:{valType:"data_array",editType:"calc+clearAxisTypes"},x0:{valType:"any",editType:"calc+clearAxisTypes"},y0:{valType:"any",editType:"calc+clearAxisTypes"},name:{valType:"string",editType:"calc+clearAxisTypes"},text:a({},n.text,{}),whiskerwidth:{valType:"number",min:0,max:1,dflt:.5,editType:"calcIfAutorange"},notched:{valType:"boolean",editType:"calcIfAutorange"},notchwidth:{valType:"number",min:0,max:.5,dflt:.25,editType:"calcIfAutorange"},boxpoints:{valType:"enumerated",values:["all","outliers","suspectedoutliers",!1],dflt:"outliers",editType:"calcIfAutorange"},boxmean:{valType:"enumerated",values:[!0,"sd",!1],dflt:!1,editType:"calcIfAutorange"},jitter:{valType:"number",min:0,max:1,editType:"calcIfAutorange"},pointpos:{valType:"number",min:-2,max:2,editType:"calcIfAutorange"},orientation:{valType:"enumerated",values:["v","h"],editType:"calc+clearAxisTypes"},marker:{outliercolor:{valType:"color",dflt:"rgba(0, 0, 0, 0)",editType:"style"},symbol:a({},o.symbol,{arrayOk:!1,editType:"plot"}),opacity:a({},o.opacity,{arrayOk:!1,dflt:1,editType:"style"}),size:a({},o.size,{arrayOk:!1,editType:"calcIfAutorange"}),color:a({},o.color,{arrayOk:!1,editType:"style"}),line:{color:a({},s.color,{arrayOk:!1,dflt:i.defaultLine,editType:"style"}),width:a({},s.width,{arrayOk:!1,dflt:0,editType:"style"}),outliercolor:{valType:"color",editType:"style"},outlierwidth:{valType:"number",min:0,dflt:1,editType:"style"},editType:"style"},editType:"plot"},line:{color:{valType:"color",editType:"style"},width:{valType:"number",min:0,dflt:2,editType:"style"},editType:"plot"},fillcolor:n.fillcolor,selected:{marker:n.selected.marker,editType:"style"},unselected:{marker:n.unselected.marker,editType:"style"},hoveron:{valType:"flaglist",flags:["boxes","points"],dflt:"boxes+points",editType:"style"}}},{"../../components/color/attributes":557,"../../lib/extend":673,"../scatter/attributes":1015}],841:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib"),a=i._,o=t("../../plots/cartesian/axes");function s(t,e,r){var n={text:"tx"};for(var i in n)Array.isArray(e[i])&&(t[n[i]]=e[i][r])}function l(t,e){return t.v-e.v}function c(t){return t.v}e.exports=function(t,e){var r,u,h,f,p,d=t._fullLayout,g=o.getFromId(t,e.xaxis||"x"),m=o.getFromId(t,e.yaxis||"y"),v=[],y="violin"===e.type?"_numViolins":"_numBoxes";"h"===e.orientation?(u=g,h="x",f=m,p="y"):(u=m,h="y",f=g,p="x");var x=u.makeCalcdata(e,h),b=function(t,e,r,a,o){if(e in t)return r.makeCalcdata(t,e);var s;s=e+"0"in t?t[e+"0"]:"name"in t&&("category"===r.type||n(t.name)&&-1!==["linear","log"].indexOf(r.type)||i.isDateTime(t.name)&&"date"===r.type)?t.name:o;var l=r.d2c(s,0,t[e+"calendar"]);return a.map(function(){return l})}(e,p,f,x,d[y]),_=i.distinctVals(b),w=_.vals,k=_.minDiff/2,M=function(t,e){for(var r=t.length,n=new Array(r+1),i=0;i<r;i++)n[i]=t[i]-e;return n[r]=t[r-1]+e,n}(w,k),A=w.length,T=function(t){for(var e=new Array(t),r=0;r<t;r++)e[r]=[];return e}(A);for(r=0;r<e._length;r++){var S=x[r];if(n(S)){var E=i.findBin(b[r],M);if(E>=0&&E<A){var C={v:S,i:r};s(C,e,r),T[E].push(C)}}}for(r=0;r<A;r++)if(T[r].length>0){var L=T[r].sort(l),z=L.map(c),P=z.length,I={pos:w[r],pts:L};I.min=z[0],I.max=z[P-1],I.mean=i.mean(z,P),I.sd=i.stdev(z,P,I.mean),I.q1=i.interp(z,.25),I.med=i.interp(z,.5),I.q3=i.interp(z,.75),I.lf=Math.min(I.q1,z[Math.min(i.findBin(2.5*I.q1-1.5*I.q3,z,!0)+1,P-1)]),I.uf=Math.max(I.q3,z[Math.max(i.findBin(2.5*I.q3-1.5*I.q1,z),0)]),I.lo=4*I.q1-3*I.q3,I.uo=4*I.q3-3*I.q1;var O=1.57*(I.q3-I.q1)/Math.sqrt(P);I.ln=I.med-O,I.un=I.med+O,v.push(I)}return function(t,e){if(i.isArrayOrTypedArray(e.selectedpoints))for(var r=0;r<t.length;r++){for(var n=t[r].pts||[],a={},o=0;o<n.length;o++)a[n[o].i]=o;i.tagSelected(n,e,a)}}(v,e),o.expand(u,x,{padded:!0}),v.length>0?(v[0].t={num:d[y],dPos:k,posLetter:p,valLetter:h,labels:{med:a(t,"median:"),min:a(t,"min:"),q1:a(t,"q1:"),q3:a(t,"q3:"),max:a(t,"max:"),mean:"sd"===e.boxmean?a(t,"mean \xb1 \u03c3:"):a(t,"mean:"),lf:a(t,"lower fence:"),uf:a(t,"upper fence:")}},d[y]++,v):[{t:{empty:!0}}]}},{"../../lib":684,"../../plots/cartesian/axes":732,"fast-isnumeric":214}],842:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../registry"),a=t("../../components/color"),o=t("./attributes");function s(t,e,r,n){var a,o,s=r("y"),l=r("x"),c=l&&l.length;if(s&&s.length)a="v",c?o=Math.min(l.length,s.length):(r("x0"),o=s.length);else{if(!c)return void(e.visible=!1);a="h",r("y0"),o=l.length}e._length=o,i.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x","y"],n),r("orientation",a)}function l(t,e,r,i){var a=i.prefix,s=n.coerce2(t,e,o,"marker.outliercolor"),l=r("marker.line.outliercolor"),c=r(a+"points",s||l?"suspectedoutliers":void 0);c?(r("jitter","all"===c?.3:0),r("pointpos","all"===c?-1.5:0),r("marker.symbol"),r("marker.opacity"),r("marker.size"),r("marker.color",e.line.color),r("marker.line.color"),r("marker.line.width"),"suspectedoutliers"===c&&(r("marker.line.outliercolor",e.marker.color),r("marker.line.outlierwidth")),r("selected.marker.color"),r("unselected.marker.color"),r("selected.marker.size"),r("unselected.marker.size"),r("text")):delete e.marker,r("hoveron"),n.coerceSelectionMarkerOpacity(e,r)}e.exports={supplyDefaults:function(t,e,r,i){function c(r,i){return n.coerce(t,e,o,r,i)}s(t,e,c,i),!1!==e.visible&&(c("line.color",(t.marker||{}).color||r),c("line.width"),c("fillcolor",a.addOpacity(e.line.color,.5)),c("whiskerwidth"),c("boxmean"),c("notched",void 0!==t.notchwidth)&&c("notchwidth"),l(t,e,c,{prefix:"box"}))},handleSampleDefaults:s,handlePointsDefaults:l}},{"../../components/color":558,"../../lib":684,"../../registry":817,"./attributes":840}],843:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/axes"),i=t("../../lib"),a=t("../../components/fx"),o=t("../../components/color"),s=t("../scatter/fill_hover_text");function l(t,e,r,s){var l,c,u,h,f,p,d,g,m,v,y,x,b=t.cd,_=t.xa,w=t.ya,k=b[0].trace,M=b[0].t,A="violin"===k.type,T=[],S=M.bdPos,E=M.wHover,C=function(t){return t.pos+M.bPos-p};A&&"both"!==k.side?("positive"===k.side&&(m=function(t){var e=C(t);return a.inbox(e,e+E,v)}),"negative"===k.side&&(m=function(t){var e=C(t);return a.inbox(e-E,e,v)})):m=function(t){var e=C(t);return a.inbox(e-E,e+E,v)},x=A?function(t){return a.inbox(t.span[0]-f,t.span[1]-f,v)}:function(t){return a.inbox(t.min-f,t.max-f,v)},"h"===k.orientation?(f=e,p=r,d=x,g=m,l="y",u=w,c="x",h=_):(f=r,p=e,d=m,g=x,l="x",u=_,c="y",h=w);var L=Math.min(1,S/Math.abs(u.r2c(u.range[1])-u.r2c(u.range[0])));function z(t){return(d(t)+g(t))/2}v=t.maxHoverDistance-L,y=t.maxSpikeDistance-L;var P=a.getDistanceFunction(s,d,g,z);if(a.getClosest(b,P,t),!1===t.index)return[];var I=b[t.index],O=k.line.color,D=(k.marker||{}).color;o.opacity(O)&&k.line.width?t.color=O:o.opacity(D)&&k.boxpoints?t.color=D:t.color=k.fillcolor,t[l+"0"]=u.c2p(I.pos+M.bPos-S,!0),t[l+"1"]=u.c2p(I.pos+M.bPos+S,!0),t[l+"LabelVal"]=I.pos;var R=l+"Spike";t.spikeDistance=z(I)*y/v,t[R]=u.c2p(I.pos,!0);var B={},F=["med","min","q1","q3","max"];(k.boxmean||(k.meanline||{}).visible)&&F.push("mean"),(k.boxpoints||k.points)&&F.push("lf","uf");for(var N=0;N<F.length;N++){var j=F[N];if(j in I&&!(I[j]in B)){B[I[j]]=!0;var V=I[j],U=h.c2p(V,!0),q=i.extendFlat({},t);q[c+"0"]=q[c+"1"]=U,q[c+"LabelVal"]=V,q[c+"Label"]=(M.labels?M.labels[j]+" ":"")+n.hoverLabelText(h,V),"mean"===j&&"sd"in I&&"sd"===k.boxmean&&(q[c+"err"]=I.sd),t.name="",t.spikeDistance=void 0,t[R]=void 0,T.push(q)}}return T}function c(t,e,r){for(var n,o,l,c=t.cd,u=t.xa,h=t.ya,f=c[0].trace,p=u.c2p(e),d=h.c2p(r),g=a.quadrature(function(t){var e=Math.max(3,t.mrc||0);return Math.max(Math.abs(u.c2p(t.x)-p)-e,1-3/e)},function(t){var e=Math.max(3,t.mrc||0);return Math.max(Math.abs(h.c2p(t.y)-d)-e,1-3/e)}),m=!1,v=0;v<c.length;v++){o=c[v];for(var y=0;y<(o.pts||[]).length;y++){var x=g(l=o.pts[y]);x<=t.distance&&(t.distance=x,m=[v,y])}}if(!m)return!1;l=(o=c[m[0]]).pts[m[1]];var b=u.c2p(l.x,!0),_=h.c2p(l.y,!0),w=l.mrc||1;n=i.extendFlat({},t,{index:l.i,color:(f.marker||{}).color,name:f.name,x0:b-w,x1:b+w,xLabelVal:l.x,y0:_-w,y1:_+w,yLabelVal:l.y,spikeDistance:t.distance});var k="h"===f.orientation?"y":"x",M="h"===f.orientation?h:u;return n[k+"Spike"]=M.c2p(o.pos,!0),s(l,f,n),n}e.exports={hoverPoints:function(t,e,r,n){var i,a=t.cd[0].trace.hoveron,o=[];return-1!==a.indexOf("boxes")&&(o=o.concat(l(t,e,r,n))),-1!==a.indexOf("points")&&(i=c(t,e,r)),"closest"===n?i?[i]:o:i?(o.push(i),o):o},hoverOnBoxes:l,hoverOnPoints:c}},{"../../components/color":558,"../../components/fx":600,"../../lib":684,"../../plots/cartesian/axes":732,"../scatter/fill_hover_text":1022}],844:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.layoutAttributes=t("./layout_attributes"),n.supplyDefaults=t("./defaults").supplyDefaults,n.supplyLayoutDefaults=t("./layout_defaults").supplyLayoutDefaults,n.calc=t("./calc"),n.setPositions=t("./set_positions").setPositions,n.plot=t("./plot").plot,n.style=t("./style").style,n.styleOnSelect=t("./style").styleOnSelect,n.hoverPoints=t("./hover").hoverPoints,n.selectPoints=t("./select"),n.moduleType="trace",n.name="box",n.basePlotModule=t("../../plots/cartesian"),n.categories=["cartesian","svg","symbols","oriented","box-violin","showLegend","boxLayout","zoomScale"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"./attributes":840,"./calc":841,"./defaults":842,"./hover":843,"./layout_attributes":845,"./layout_defaults":846,"./plot":847,"./select":848,"./set_positions":849,"./style":850}],845:[function(t,e,r){"use strict";e.exports={boxmode:{valType:"enumerated",values:["group","overlay"],dflt:"overlay",editType:"calc"},boxgap:{valType:"number",min:0,max:1,dflt:.3,editType:"calc"},boxgroupgap:{valType:"number",min:0,max:1,dflt:.3,editType:"calc"}}},{}],846:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib"),a=t("./layout_attributes");function o(t,e,r,i,a){for(var o,s=a+"Layout",l=0;l<r.length;l++)if(n.traceIs(r[l],s)){o=!0;break}o&&(i(a+"mode"),i(a+"gap"),i(a+"groupgap"))}e.exports={supplyLayoutDefaults:function(t,e,r){o(0,0,r,function(r,n){return i.coerce(t,e,a,r,n)},"box")},_supply:o}},{"../../lib":684,"../../registry":817,"./layout_attributes":845}],847:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../lib"),a=t("../../components/drawing"),o=5,s=.01;function l(t,e,r,a){var o,s,l=e.pos,c=e.val,u=a.bPos,h=a.wdPos||0,f=a.bPosPxOffset||0,p=r.whiskerwidth||0,d=r.notched||!1,g=d?1-2*r.notchwidth:1;Array.isArray(a.bdPos)?(o=a.bdPos[0],s=a.bdPos[1]):(o=a.bdPos,s=a.bdPos);var m=t.selectAll("path.box").data("violin"!==r.type||r.box?i.identity:[]);m.enter().append("path").style("vector-effect","non-scaling-stroke").attr("class","box"),m.exit().remove(),m.each(function(t){var e=t.pos,a=l.c2p(e+u,!0)+f,m=l.c2p(e+u-o,!0)+f,v=l.c2p(e+u+s,!0)+f,y=l.c2p(e+u-h,!0)+f,x=l.c2p(e+u+h,!0)+f,b=l.c2p(e+u-o*g,!0)+f,_=l.c2p(e+u+s*g,!0)+f,w=c.c2p(t.q1,!0),k=c.c2p(t.q3,!0),M=i.constrain(c.c2p(t.med,!0),Math.min(w,k)+1,Math.max(w,k)-1),A=void 0===t.lf||!1===r.boxpoints,T=c.c2p(A?t.min:t.lf,!0),S=c.c2p(A?t.max:t.uf,!0),E=c.c2p(t.ln,!0),C=c.c2p(t.un,!0);"h"===r.orientation?n.select(this).attr("d","M"+M+","+b+"V"+_+"M"+w+","+m+"V"+v+(d?"H"+E+"L"+M+","+_+"L"+C+","+v:"")+"H"+k+"V"+m+(d?"H"+C+"L"+M+","+b+"L"+E+","+m:"")+"ZM"+w+","+a+"H"+T+"M"+k+","+a+"H"+S+(0===p?"":"M"+T+","+y+"V"+x+"M"+S+","+y+"V"+x)):n.select(this).attr("d","M"+b+","+M+"H"+_+"M"+m+","+w+"H"+v+(d?"V"+E+"L"+_+","+M+"L"+v+","+C:"")+"V"+k+"H"+m+(d?"V"+C+"L"+b+","+M+"L"+m+","+E:"")+"ZM"+a+","+w+"V"+T+"M"+a+","+k+"V"+S+(0===p?"":"M"+y+","+T+"H"+x+"M"+y+","+S+"H"+x))})}function c(t,e,r,n){var l=e.x,c=e.y,u=n.bdPos,h=n.bPos,f=r.boxpoints||r.points;i.seedPseudoRandom();var p=t.selectAll("g.points").data(f?function(t){return t.forEach(function(t){t.t=n,t.trace=r}),t}:[]);p.enter().append("g").attr("class","points"),p.exit().remove();var d=p.selectAll("path").data(function(t){var e,n,a="all"===f?t.pts:t.pts.filter(function(e){return e.v<t.lf||e.v>t.uf}),l=Math.max((t.max-t.min)/10,t.q3-t.q1),c=1e-9*l,p=l*s,d=[],g=0;if(r.jitter){if(0===l)for(g=1,d=new Array(a.length),e=0;e<a.length;e++)d[e]=1;else for(e=0;e<a.length;e++){var m=Math.max(0,e-o),v=a[m].v,y=Math.min(a.length-1,e+o),x=a[y].v;"all"!==f&&(a[e].v<t.lf?x=Math.min(x,t.lf):v=Math.max(v,t.uf));var b=Math.sqrt(p*(y-m)/(x-v+c))||0;b=i.constrain(Math.abs(b),0,1),d.push(b),g=Math.max(b,g)}n=2*r.jitter/(g||1)}for(e=0;e<a.length;e++){var _=a[e],w=_.v,k=r.jitter?n*d[e]*(i.pseudoRandom()-.5):0,M=t.pos+h+u*(r.pointpos+k);"h"===r.orientation?(_.y=M,_.x=w):(_.x=M,_.y=w),"suspectedoutliers"===f&&w<t.uo&&w>t.lo&&(_.so=!0)}return a});d.enter().append("path").classed("point",!0),d.exit().remove(),d.call(a.translatePoints,l,c)}function u(t,e,r,a){var o,s,l=e.pos,c=e.val,u=a.bPos,h=a.bPosPxOffset||0,f=r.boxmean||(r.meanline||{}).visible;Array.isArray(a.bdPos)?(o=a.bdPos[0],s=a.bdPos[1]):(o=a.bdPos,s=a.bdPos);var p=t.selectAll("path.mean").data("box"===r.type&&r.boxmean||"violin"===r.type&&r.box&&r.meanline?i.identity:[]);p.enter().append("path").attr("class","mean").style({fill:"none","vector-effect":"non-scaling-stroke"}),p.exit().remove(),p.each(function(t){var e=l.c2p(t.pos+u,!0)+h,i=l.c2p(t.pos+u-o,!0)+h,a=l.c2p(t.pos+u+s,!0)+h,p=c.c2p(t.mean,!0),d=c.c2p(t.mean-t.sd,!0),g=c.c2p(t.mean+t.sd,!0);"h"===r.orientation?n.select(this).attr("d","M"+p+","+i+"V"+a+("sd"===f?"m0,0L"+d+","+e+"L"+p+","+i+"L"+g+","+e+"Z":"")):n.select(this).attr("d","M"+i+","+p+"H"+a+("sd"===f?"m0,0L"+e+","+d+"L"+i+","+p+"L"+e+","+g+"Z":""))})}e.exports={plot:function(t,e,r,i){var a=t._fullLayout,o=e.xaxis,s=e.yaxis,h=i.selectAll("g.trace.boxes").data(r,function(t){return t[0].trace.uid});h.enter().append("g").attr("class","trace boxes"),h.exit().remove(),h.order(),h.each(function(t){var r=t[0],i=r.t,h=r.trace,f=n.select(this);e.isRangePlot||(r.node3=f);var p,d,g=a._numBoxes,m=1-a.boxgap,v="group"===a.boxmode&&g>1,y=i.dPos*m*(1-a.boxgroupgap)/(v?g:1),x=v?2*i.dPos*((i.num+.5)/g-.5)*m:0,b=y*h.whiskerwidth;!0!==h.visible||i.empty?f.remove():("h"===h.orientation?(p=s,d=o):(p=o,d=s),i.bPos=x,i.bdPos=y,i.wdPos=b,i.wHover=i.dPos*(v?m/g:1),l(f,{pos:p,val:d},h,i),c(f,{x:o,y:s},h,i),u(f,{pos:p,val:d},h,i))})},plotBoxAndWhiskers:l,plotPoints:c,plotBoxMean:u}},{"../../components/drawing":583,"../../lib":684,d3:147}],848:[function(t,e,r){"use strict";e.exports=function(t,e){var r,n,i=t.cd,a=t.xaxis,o=t.yaxis,s=[];if(!1===e)for(r=0;r<i.length;r++)for(n=0;n<(i[r].pts||[]).length;n++)i[r].pts[n].selected=0;else for(r=0;r<i.length;r++)for(n=0;n<(i[r].pts||[]).length;n++){var l=i[r].pts[n],c=a.c2p(l.x),u=o.c2p(l.y);e.contains([c,u])?(s.push({pointNumber:l.i,x:a.c2d(l.x),y:o.c2d(l.y)}),l.selected=1):l.selected=0}return s}},{}],849:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/axes"),i=t("../../lib"),a=["v","h"];function o(t,e,r,a,o){var s,l,c,u=e.calcdata,h=e._fullLayout,f=[],p="violin"===t?"_numViolins":"_numBoxes";for(s=0;s<r.length;s++)for(c=u[r[s]],l=0;l<c.length;l++)f.push(c[l].pos);if(f.length){var d=i.distinctVals(f),g=d.minDiff/2;for(f.length===d.vals.length&&(h[p]=1),n.minDtick(a,d.minDiff,d.vals[0],!0),s=0;s<r.length;s++)(c=u[r[s]])[0].t.dPos=g;var m=(1-h[t+"gap"])*(1-h[t+"groupgap"])*g/h[p];n.expand(a,d.vals,{vpadminus:g+o[0]*m,vpadplus:g+o[1]*m})}}e.exports={setPositions:function(t,e){for(var r=t.calcdata,n=e.xaxis,i=e.yaxis,s=0;s<a.length;s++){for(var l=a[s],c="h"===l?i:n,u=[],h=0,f=0,p=0;p<r.length;p++){var d=r[p],g=d[0].t,m=d[0].trace;!0!==m.visible||"box"!==m.type&&"candlestick"!==m.type||g.empty||(m.orientation||"v")!==l||m.xaxis!==n._id||m.yaxis!==i._id||(u.push(p),m.boxpoints&&(h=Math.max(h,m.jitter-m.pointpos-1),f=Math.max(f,m.jitter+m.pointpos-1)))}o("box",t,u,c,[h,f])}},setPositionOffset:o}},{"../../lib":684,"../../plots/cartesian/axes":732}],850:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/color"),a=t("../../components/drawing");e.exports={style:function(t,e){var r=e?e[0].node3:n.select(t).selectAll("g.trace.boxes");r.style("opacity",function(t){return t[0].trace.opacity}),r.each(function(e){var r=n.select(this),o=e[0].trace,s=o.line.width;function l(t,e,r,n){t.style("stroke-width",e+"px").call(i.stroke,r).call(i.fill,n)}var c=r.selectAll("path.box");if("candlestick"===o.type)c.each(function(t){var e=n.select(this),r=o[t.dir];l(e,r.line.width,r.line.color,r.fillcolor),e.style("opacity",o.selectedpoints&&!t.selected?.3:1)});else{l(c,s,o.line.color,o.fillcolor),r.selectAll("path.mean").style({"stroke-width":s,"stroke-dasharray":2*s+"px,"+s+"px"}).call(i.stroke,o.line.color);var u=r.selectAll("path.point");a.pointStyle(u,o,t)}})},styleOnSelect:function(t,e){var r=e[0].node3,n=e[0].trace,i=r.selectAll("path.point");n.selectedpoints?a.selectedPointStyle(i,n):a.pointStyle(i,n,t)}}},{"../../components/color":558,"../../components/drawing":583,d3:147}],851:[function(t,e,r){"use strict";var n=t("../../lib").extendFlat,i=t("../ohlc/attributes"),a=t("../box/attributes");function o(t){return{line:{color:n({},a.line.color,{dflt:t}),width:a.line.width,editType:"style"},fillcolor:a.fillcolor,editType:"style"}}e.exports={x:i.x,open:i.open,high:i.high,low:i.low,close:i.close,line:{width:n({},a.line.width,{}),editType:"style"},increasing:o(i.increasing.line.color.dflt),decreasing:o(i.decreasing.line.color.dflt),text:i.text,whiskerwidth:n({},a.whiskerwidth,{dflt:0})}},{"../../lib":684,"../box/attributes":840,"../ohlc/attributes":970}],852:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes"),a=t("../ohlc/calc").calcCommon;function o(t,e,r,n){return{min:r,q1:Math.min(t,n),med:n,q3:Math.max(t,n),max:e}}e.exports=function(t,e){var r=t._fullLayout,s=i.getFromId(t,e.xaxis),l=i.getFromId(t,e.yaxis),c=s.makeCalcdata(e,"x"),u=a(t,e,c,l,o);return u.length?(n.extendFlat(u[0].t,{num:r._numBoxes,dPos:n.distinctVals(c).minDiff/2,posLetter:"x",valLetter:"y"}),r._numBoxes++,u):[{t:{empty:!0}}]}},{"../../lib":684,"../../plots/cartesian/axes":732,"../ohlc/calc":971}],853:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../components/color"),a=t("../ohlc/ohlc_defaults"),o=t("./attributes");function s(t,e,r,n){var a=r(n+".line.color");r(n+".line.width",e.line.width),r(n+".fillcolor",i.addOpacity(a,.5))}e.exports=function(t,e,r,i){function l(r,i){return n.coerce(t,e,o,r,i)}a(t,e,l,i)?(l("line.width"),s(t,e,l,"increasing"),s(t,e,l,"decreasing"),l("text"),l("whiskerwidth"),i._requestRangeslider[e.xaxis]=!0):e.visible=!1}},{"../../components/color":558,"../../lib":684,"../ohlc/ohlc_defaults":975,"./attributes":851}],854:[function(t,e,r){"use strict";e.exports={moduleType:"trace",name:"candlestick",basePlotModule:t("../../plots/cartesian"),categories:["cartesian","svg","showLegend","candlestick","boxLayout"],meta:{},attributes:t("./attributes"),layoutAttributes:t("../box/layout_attributes"),supplyLayoutDefaults:t("../box/layout_defaults").supplyLayoutDefaults,setPositions:t("../box/set_positions").setPositions,supplyDefaults:t("./defaults"),calc:t("./calc"),plot:t("../box/plot").plot,layerName:"boxlayer",style:t("../box/style").style,hoverPoints:t("../ohlc/hover"),selectPoints:t("../ohlc/select")}},{"../../plots/cartesian":743,"../box/layout_attributes":845,"../box/layout_defaults":846,"../box/plot":847,"../box/set_positions":849,"../box/style":850,"../ohlc/hover":973,"../ohlc/select":977,"./attributes":851,"./calc":852,"./defaults":853}],855:[function(t,e,r){"use strict";var n=t("./axis_defaults");e.exports=function(t,e,r,i,a){i("a")||(i("da"),i("a0")),i("b")||(i("db"),i("b0")),function(t,e,r,i){["aaxis","baxis"].forEach(function(a){var o=a.charAt(0),s=t[a]||{},l={},c={tickfont:"x",id:o+"axis",letter:o,font:e.font,name:a,data:t[o],calendar:e.calendar,dfltColor:i,bgColor:r.paper_bgcolor,fullLayout:r};n(s,l,c),l._categories=l._categories||[],e[a]=l,t[a]||"-"===s.type||(t[a]={type:s.type})})}(t,e,r,a)}},{"./axis_defaults":860}],856:[function(t,e,r){"use strict";var n=t("../../lib").isArrayOrTypedArray;e.exports=function(t){return function t(e,r){if(!n(e)||r>=10)return null;var i=1/0;var a=-1/0;var o=e.length;for(var s=0;s<o;s++){var l=e[s];if(n(l)){var c=t(l,r+1);c&&(i=Math.min(c[0],i),a=Math.max(c[1],a))}else i=Math.min(l,i),a=Math.max(l,a)}return[i,a]}(t,0)}},{"../../lib":684}],857:[function(t,e,r){"use strict";var n=t("../../plots/font_attributes"),i=t("./axis_attributes"),a=t("../../components/color/attributes"),o=n({editType:"calc"});o.family.dflt='"Open Sans", verdana, arial, sans-serif',o.size.dflt=12,o.color.dflt=a.defaultLine,e.exports={carpet:{valType:"string",editType:"calc"},x:{valType:"data_array",editType:"calc+clearAxisTypes"},y:{valType:"data_array",editType:"calc+clearAxisTypes"},a:{valType:"data_array",editType:"calc"},a0:{valType:"number",dflt:0,editType:"calc"},da:{valType:"number",dflt:1,editType:"calc"},b:{valType:"data_array",editType:"calc"},b0:{valType:"number",dflt:0,editType:"calc"},db:{valType:"number",dflt:1,editType:"calc"},cheaterslope:{valType:"number",dflt:1,editType:"calc"},aaxis:i,baxis:i,font:o,color:{valType:"color",dflt:a.defaultLine,editType:"plot"}}},{"../../components/color/attributes":557,"../../plots/font_attributes":758,"./axis_attributes":859}],858:[function(t,e,r){"use strict";var n=t("../../lib").isArrayOrTypedArray;e.exports=function(t,e,r,i){var a,o,s,l,c,u,h,f,p,d,g,m,v,y=n(r)?"a":"b",x=("a"===y?t.aaxis:t.baxis).smoothing,b="a"===y?t.a2i:t.b2j,_="a"===y?r:i,w="a"===y?i:r,k="a"===y?e.a.length:e.b.length,M="a"===y?e.b.length:e.a.length,A=Math.floor("a"===y?t.b2j(w):t.a2i(w)),T="a"===y?function(e){return t.evalxy([],e,A)}:function(e){return t.evalxy([],A,e)};x&&(s=Math.max(0,Math.min(M-2,A)),l=A-s,o="a"===y?function(e,r){return t.dxydi([],e,s,r,l)}:function(e,r){return t.dxydj([],s,e,l,r)});var S=b(_[0]),E=b(_[1]),C=S<E?1:-1,L=1e-8*(E-S),z=C>0?Math.floor:Math.ceil,P=C>0?Math.ceil:Math.floor,I=C>0?Math.min:Math.max,O=C>0?Math.max:Math.min,D=z(S+L),R=P(E-L),B=[[h=T(S)]];for(a=D;a*C<R*C;a+=C)c=[],g=O(S,a),v=(m=I(E,a+C))-g,u=Math.max(0,Math.min(k-2,Math.floor(.5*(g+m)))),f=T(m),x&&(p=o(u,g-u),d=o(u,m-u),c.push([h[0]+p[0]/3*v,h[1]+p[1]/3*v]),c.push([f[0]-d[0]/3*v,f[1]-d[1]/3*v])),c.push(f),B.push(c),h=f;return B}},{"../../lib":684}],859:[function(t,e,r){"use strict";var n=t("../../plots/font_attributes"),i=t("../../components/color/attributes"),a=t("../../plots/cartesian/layout_attributes"),o=t("../../plot_api/edit_types").overrideAll;e.exports={color:{valType:"color",editType:"calc"},smoothing:{valType:"number",dflt:1,min:0,max:1.3,editType:"calc"},title:{valType:"string",editType:"calc"},titlefont:n({editType:"calc"}),titleoffset:{valType:"number",dflt:10,editType:"calc"},type:{valType:"enumerated",values:["-","linear","date","category"],dflt:"-",editType:"calc"},autorange:{valType:"enumerated",values:[!0,!1,"reversed"],dflt:!0,editType:"calc"},rangemode:{valType:"enumerated",values:["normal","tozero","nonnegative"],dflt:"normal",editType:"calc"},range:{valType:"info_array",editType:"calc",items:[{valType:"any",editType:"calc"},{valType:"any",editType:"calc"}]},fixedrange:{valType:"boolean",dflt:!1,editType:"calc"},cheatertype:{valType:"enumerated",values:["index","value"],dflt:"value",editType:"calc"},tickmode:{valType:"enumerated",values:["linear","array"],dflt:"array",editType:"calc"},nticks:{valType:"integer",min:0,dflt:0,editType:"calc"},tickvals:{valType:"data_array",editType:"calc"},ticktext:{valType:"data_array",editType:"calc"},showticklabels:{valType:"enumerated",values:["start","end","both","none"],dflt:"start",editType:"calc"},tickfont:n({editType:"calc"}),tickangle:{valType:"angle",dflt:"auto",editType:"calc"},tickprefix:{valType:"string",dflt:"",editType:"calc"},showtickprefix:{valType:"enumerated",values:["all","first","last","none"],dflt:"all",editType:"calc"},ticksuffix:{valType:"string",dflt:"",editType:"calc"},showticksuffix:{valType:"enumerated",values:["all","first","last","none"],dflt:"all",editType:"calc"},showexponent:{valType:"enumerated",values:["all","first","last","none"],dflt:"all",editType:"calc"},exponentformat:{valType:"enumerated",values:["none","e","E","power","SI","B"],dflt:"B",editType:"calc"},separatethousands:{valType:"boolean",dflt:!1,editType:"calc"},tickformat:{valType:"string",dflt:"",editType:"calc"},tickformatstops:o(a.tickformatstops,"calc","from-root"),categoryorder:{valType:"enumerated",values:["trace","category ascending","category descending","array"],dflt:"trace",editType:"calc"},categoryarray:{valType:"data_array",editType:"calc"},labelpadding:{valType:"integer",dflt:10,editType:"calc"},labelprefix:{valType:"string",editType:"calc"},labelsuffix:{valType:"string",dflt:"",editType:"calc"},showline:{valType:"boolean",dflt:!1,editType:"calc"},linecolor:{valType:"color",dflt:i.defaultLine,editType:"calc"},linewidth:{valType:"number",min:0,dflt:1,editType:"calc"},gridcolor:{valType:"color",editType:"calc"},gridwidth:{valType:"number",min:0,dflt:1,editType:"calc"},showgrid:{valType:"boolean",dflt:!0,editType:"calc"},minorgridcount:{valType:"integer",min:0,dflt:0,editType:"calc"},minorgridwidth:{valType:"number",min:0,dflt:1,editType:"calc"},minorgridcolor:{valType:"color",dflt:i.lightLine,editType:"calc"},startline:{valType:"boolean",editType:"calc"},startlinecolor:{valType:"color",editType:"calc"},startlinewidth:{valType:"number",dflt:1,editType:"calc"},endline:{valType:"boolean",editType:"calc"},endlinewidth:{valType:"number",dflt:1,editType:"calc"},endlinecolor:{valType:"color",editType:"calc"},tick0:{valType:"number",min:0,dflt:0,editType:"calc"},dtick:{valType:"number",min:0,dflt:1,editType:"calc"},arraytick0:{valType:"integer",min:0,dflt:0,editType:"calc"},arraydtick:{valType:"integer",min:1,dflt:1,editType:"calc"},editType:"calc"}},{"../../components/color/attributes":557,"../../plot_api/edit_types":715,"../../plots/cartesian/layout_attributes":744,"../../plots/font_attributes":758}],860:[function(t,e,r){"use strict";var n=t("./attributes"),i=t("../../components/color").addOpacity,a=t("../../registry"),o=t("../../lib"),s=t("../../plots/cartesian/tick_value_defaults"),l=t("../../plots/cartesian/tick_label_defaults"),c=t("../../plots/cartesian/category_order_defaults"),u=t("../../plots/cartesian/set_convert"),h=t("../../plots/cartesian/axis_autotype");e.exports=function(t,e,r){var f=r.letter,p=r.font||{},d=n[f+"axis"];function g(r,n){return o.coerce(t,e,d,r,n)}function m(r,n){return o.coerce2(t,e,d,r,n)}r.name&&(e._name=r.name,e._id=r.name);var v=g("type");("-"===v&&(r.data&&function(t,e){if("-"!==t.type)return;var r=t._id.charAt(0),n=t[r+"calendar"];t.type=h(e,n)}(e,r.data),"-"===e.type?e.type="linear":v=t.type=e.type),g("smoothing"),g("cheatertype"),g("showticklabels"),g("labelprefix",f+" = "),g("labelsuffix"),g("showtickprefix"),g("showticksuffix"),g("separatethousands"),g("tickformat"),g("exponentformat"),g("showexponent"),g("categoryorder"),g("tickmode"),g("tickvals"),g("ticktext"),g("tick0"),g("dtick"),"array"===e.tickmode&&(g("arraytick0"),g("arraydtick")),g("labelpadding"),e._hovertitle=f,"date"===v)&&a.getComponentMethod("calendars","handleDefaults")(t,e,"calendar",r.calendar);u(e,r.fullLayout),e.c2p=o.identity;var y=g("color",r.dfltColor),x=y===t.color?y:p.color;g("title"),o.coerceFont(g,"titlefont",{family:p.family,size:Math.round(1.2*p.size),color:x}),g("titleoffset"),g("tickangle"),g("autorange",!e.isValidRange(t.range))&&g("rangemode"),g("range"),e.cleanRange(),g("fixedrange"),s(t,e,g,v),l(t,e,g,v,r),c(t,e,g,{data:r.data,dataAttr:f});var b=m("gridcolor",i(y,.3)),_=m("gridwidth"),w=g("showgrid");w||(delete e.gridcolor,delete e.gridwidth);var k=m("startlinecolor",y),M=m("startlinewidth",_);g("startline",e.showgrid||!!k||!!M)||(delete e.startlinecolor,delete e.startlinewidth);var A=m("endlinecolor",y),T=m("endlinewidth",_);return g("endline",e.showgrid||!!A||!!T)||(delete e.endlinecolor,delete e.endlinewidth),w?(g("minorgridcount"),g("minorgridwidth",_),g("minorgridcolor",i(b,.06)),e.minorgridcount||(delete e.minorgridwidth,delete e.minorgridcolor)):(delete e.gridcolor,delete e.gridWidth),"none"===e.showticklabels&&(delete e.tickfont,delete e.tickangle,delete e.showexponent,delete e.exponentformat,delete e.tickformat,delete e.showticksuffix,delete e.showtickprefix),e.showticksuffix||delete e.ticksuffix,e.showtickprefix||delete e.tickprefix,g("tickmode"),(!e.title||e.title&&0===e.title.length)&&(delete e.titlefont,delete e.titleoffset),e}},{"../../components/color":558,"../../lib":684,"../../plots/cartesian/axis_autotype":733,"../../plots/cartesian/category_order_defaults":736,"../../plots/cartesian/set_convert":750,"../../plots/cartesian/tick_label_defaults":751,"../../plots/cartesian/tick_value_defaults":753,"../../registry":817,"./attributes":857}],861:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/axes"),i=t("../../lib").isArray1D,a=t("./cheater_basis"),o=t("./array_minmax"),s=t("./calc_gridlines"),l=t("./calc_labels"),c=t("./calc_clippath"),u=t("../heatmap/clean_2d_array"),h=t("./smooth_fill_2d_array"),f=t("../heatmap/convert_column_xyz"),p=t("./set_convert");e.exports=function(t,e){var r=n.getFromId(t,e.xaxis),d=n.getFromId(t,e.yaxis),g=e.aaxis,m=e.baxis,v=e.x,y=e.y,x=[];v&&i(v)&&x.push("x"),y&&i(y)&&x.push("y"),x.length&&f(e,g,m,"a","b",x);var b=e._a=e._a||e.a,_=e._b=e._b||e.b;v=e._x||e.x,y=e._y||e.y;var w={};if(e._cheater){var k="index"===g.cheatertype?b.length:b,M="index"===m.cheatertype?_.length:_;v=a(k,M,e.cheaterslope)}e._x=v=u(v),e._y=y=u(y),h(v,b,_),h(y,b,_),p(e),e.setScale();var A=o(v),T=o(y),S=.5*(A[1]-A[0]),E=.5*(A[1]+A[0]),C=.5*(T[1]-T[0]),L=.5*(T[1]+T[0]);return A=[E-1.3*S,E+1.3*S],T=[L-1.3*C,L+1.3*C],n.expand(r,A,{padded:!0}),n.expand(d,T,{padded:!0}),s(e,"a","b"),s(e,"b","a"),l(e,g),l(e,m),w.clipsegments=c(e._xctrl,e._yctrl,g,m),w.x=v,w.y=y,w.a=b,w.b=_,[w]}},{"../../lib":684,"../../plots/cartesian/axes":732,"../heatmap/clean_2d_array":927,"../heatmap/convert_column_xyz":929,"./array_minmax":856,"./calc_clippath":862,"./calc_gridlines":863,"./calc_labels":864,"./cheater_basis":866,"./set_convert":879,"./smooth_fill_2d_array":880}],862:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){var i,a,o,s=[],l=!!r.smoothing,c=!!n.smoothing,u=t[0].length-1,h=t.length-1;for(i=0,a=[],o=[];i<=u;i++)a[i]=t[0][i],o[i]=e[0][i];for(s.push({x:a,y:o,bicubic:l}),i=0,a=[],o=[];i<=h;i++)a[i]=t[i][u],o[i]=e[i][u];for(s.push({x:a,y:o,bicubic:c}),i=u,a=[],o=[];i>=0;i--)a[u-i]=t[h][i],o[u-i]=e[h][i];for(s.push({x:a,y:o,bicubic:l}),i=h,a=[],o=[];i>=0;i--)a[h-i]=t[i][0],o[h-i]=e[i][0];return s.push({x:a,y:o,bicubic:c}),s}},{}],863:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/axes"),i=t("../../lib/extend").extendFlat;e.exports=function(t,e,r){var a,o,s,l,c,u,h,f,p,d,g,m,v,y,x=t["_"+e],b=t[e+"axis"],_=b._gridlines=[],w=b._minorgridlines=[],k=b._boundarylines=[],M=t["_"+r],A=t[r+"axis"];"array"===b.tickmode&&(b.tickvals=x.slice());var T=t._xctrl,S=t._yctrl,E=T[0].length,C=T.length,L=t._a.length,z=t._b.length;n.prepTicks(b),"array"===b.tickmode&&delete b.tickvals;var P=b.smoothing?3:1;function I(n){var i,a,o,s,l,c,u,h,p,d,g,m,v=[],y=[],x={};if("b"===e)for(a=t.b2j(n),o=Math.floor(Math.max(0,Math.min(z-2,a))),s=a-o,x.length=z,x.crossLength=L,x.xy=function(e){return t.evalxy([],e,a)},x.dxy=function(e,r){return t.dxydi([],e,o,r,s)},i=0;i<L;i++)c=Math.min(L-2,i),u=i-c,h=t.evalxy([],i,a),A.smoothing&&i>0&&(p=t.dxydi([],i-1,o,0,s),v.push(l[0]+p[0]/3),y.push(l[1]+p[1]/3),d=t.dxydi([],i-1,o,1,s),v.push(h[0]-d[0]/3),y.push(h[1]-d[1]/3)),v.push(h[0]),y.push(h[1]),l=h;else for(i=t.a2i(n),c=Math.floor(Math.max(0,Math.min(L-2,i))),u=i-c,x.length=L,x.crossLength=z,x.xy=function(e){return t.evalxy([],i,e)},x.dxy=function(e,r){return t.dxydj([],c,e,u,r)},a=0;a<z;a++)o=Math.min(z-2,a),s=a-o,h=t.evalxy([],i,a),A.smoothing&&a>0&&(g=t.dxydj([],c,a-1,u,0),v.push(l[0]+g[0]/3),y.push(l[1]+g[1]/3),m=t.dxydj([],c,a-1,u,1),v.push(h[0]-m[0]/3),y.push(h[1]-m[1]/3)),v.push(h[0]),y.push(h[1]),l=h;return x.axisLetter=e,x.axis=b,x.crossAxis=A,x.value=n,x.constvar=r,x.index=f,x.x=v,x.y=y,x.smoothing=A.smoothing,x}function O(n){var i,a,o,s,l,c=[],u=[],h={};if(h.length=x.length,h.crossLength=M.length,"b"===e)for(o=Math.max(0,Math.min(z-2,n)),l=Math.min(1,Math.max(0,n-o)),h.xy=function(e){return t.evalxy([],e,n)},h.dxy=function(e,r){return t.dxydi([],e,o,r,l)},i=0;i<E;i++)c[i]=T[n*P][i],u[i]=S[n*P][i];else for(a=Math.max(0,Math.min(L-2,n)),s=Math.min(1,Math.max(0,n-a)),h.xy=function(e){return t.evalxy([],n,e)},h.dxy=function(e,r){return t.dxydj([],a,e,s,r)},i=0;i<C;i++)c[i]=T[i][n*P],u[i]=S[i][n*P];return h.axisLetter=e,h.axis=b,h.crossAxis=A,h.value=x[n],h.constvar=r,h.index=n,h.x=c,h.y=u,h.smoothing=A.smoothing,h}if("array"===b.tickmode){for(l=5e-15,u=(c=[Math.floor((x.length-1-b.arraytick0)/b.arraydtick*(1+l)),Math.ceil(-b.arraytick0/b.arraydtick/(1+l))].sort(function(t,e){return t-e}))[0]-1,h=c[1]+1,f=u;f<h;f++)(o=b.arraytick0+b.arraydtick*f)<0||o>x.length-1||_.push(i(O(o),{color:b.gridcolor,width:b.gridwidth}));for(f=u;f<h;f++)if(s=b.arraytick0+b.arraydtick*f,g=Math.min(s+b.arraydtick,x.length-1),!(s<0||s>x.length-1||g<0||g>x.length-1))for(m=x[s],v=x[g],a=0;a<b.minorgridcount;a++)(y=g-s)<=0||(d=m+(v-m)*(a+1)/(b.minorgridcount+1)*(b.arraydtick/y))<x[0]||d>x[x.length-1]||w.push(i(I(d),{color:b.minorgridcolor,width:b.minorgridwidth}));b.startline&&k.push(i(O(0),{color:b.startlinecolor,width:b.startlinewidth})),b.endline&&k.push(i(O(x.length-1),{color:b.endlinecolor,width:b.endlinewidth}))}else{for(l=5e-15,u=(c=[Math.floor((x[x.length-1]-b.tick0)/b.dtick*(1+l)),Math.ceil((x[0]-b.tick0)/b.dtick/(1+l))].sort(function(t,e){return t-e}))[0],h=c[1],f=u;f<=h;f++)p=b.tick0+b.dtick*f,_.push(i(I(p),{color:b.gridcolor,width:b.gridwidth}));for(f=u-1;f<h+1;f++)for(p=b.tick0+b.dtick*f,a=0;a<b.minorgridcount;a++)(d=p+b.dtick*(a+1)/(b.minorgridcount+1))<x[0]||d>x[x.length-1]||w.push(i(I(d),{color:b.minorgridcolor,width:b.minorgridwidth}));b.startline&&k.push(i(I(x[0]),{color:b.startlinecolor,width:b.startlinewidth})),b.endline&&k.push(i(I(x[x.length-1]),{color:b.endlinecolor,width:b.endlinewidth}))}}},{"../../lib/extend":673,"../../plots/cartesian/axes":732}],864:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/axes"),i=t("../../lib/extend").extendFlat;e.exports=function(t,e){var r,a,o,s=e._labels=[],l=e._gridlines;for(r=0;r<l.length;r++)o=l[r],-1!==["start","both"].indexOf(e.showticklabels)&&(a=n.tickText(e,o.value),i(a,{prefix:void 0,suffix:void 0,endAnchor:!0,xy:o.xy(0),dxy:o.dxy(0,0),axis:o.axis,length:o.crossAxis.length,font:o.axis.tickfont,isFirst:0===r,isLast:r===l.length-1}),s.push(a)),-1!==["end","both"].indexOf(e.showticklabels)&&(a=n.tickText(e,o.value),i(a,{endAnchor:!1,xy:o.xy(o.crossLength-1),dxy:o.dxy(o.crossLength-2,1),axis:o.axis,length:o.crossAxis.length,font:o.axis.tickfont,isFirst:0===r,isLast:r===l.length-1}),s.push(a))}},{"../../lib/extend":673,"../../plots/cartesian/axes":732}],865:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){var i=t[0]-e[0],a=t[1]-e[1],o=r[0]-e[0],s=r[1]-e[1],l=Math.pow(i*i+a*a,.25),c=Math.pow(o*o+s*s,.25),u=(c*c*i-l*l*o)*n,h=(c*c*a-l*l*s)*n,f=c*(l+c)*3,p=l*(l+c)*3;return[[e[0]+(f&&u/f),e[1]+(f&&h/f)],[e[0]-(p&&u/p),e[1]-(p&&h/p)]]}},{}],866:[function(t,e,r){"use strict";var n=t("../../lib").isArrayOrTypedArray;e.exports=function(t,e,r){var i,a,o,s,l,c,u=[],h=n(t)?t.length:t,f=n(e)?e.length:e,p=n(t)?t:null,d=n(e)?e:null;p&&(o=(p.length-1)/(p[p.length-1]-p[0])/(h-1)),d&&(s=(d.length-1)/(d[d.length-1]-d[0])/(f-1));var g=1/0,m=-1/0;for(a=0;a<f;a++)for(u[a]=[],l=d?(d[a]-d[0])*s:a/(f-1),i=0;i<h;i++)c=(p?(p[i]-p[0])*o:i/(h-1))-l*r,g=Math.min(c,g),m=Math.max(c,m),u[a][i]=c;var v=1/(m-g),y=-g*v;for(a=0;a<f;a++)for(i=0;i<h;i++)u[a][i]=v*u[a][i]+y;return u}},{"../../lib":684}],867:[function(t,e,r){"use strict";var n=t("./catmull_rom"),i=t("../../lib").ensureArray;function a(t,e,r){var n=-.5*r[0]+1.5*e[0],i=-.5*r[1]+1.5*e[1];return[(2*n+t[0])/3,(2*i+t[1])/3]}e.exports=function(t,e,r,o,s,l){var c,u,h,f,p,d,g,m,v,y,x=r[0].length,b=r.length,_=s?3*x-2:x,w=l?3*b-2:b;for(t=i(t,w),e=i(e,w),h=0;h<w;h++)t[h]=i(t[h],_),e[h]=i(e[h],_);for(u=0,f=0;u<b;u++,f+=l?3:1)for(p=t[f],d=e[f],g=r[u],m=o[u],c=0,h=0;c<x;c++,h+=s?3:1)p[h]=g[c],d[h]=m[c];if(s)for(u=0,f=0;u<b;u++,f+=l?3:1){for(c=1,h=3;c<x-1;c++,h+=3)v=n([r[u][c-1],o[u][c-1]],[r[u][c],o[u][c]],[r[u][c+1],o[u][c+1]],s),t[f][h-1]=v[0][0],e[f][h-1]=v[0][1],t[f][h+1]=v[1][0],e[f][h+1]=v[1][1];y=a([t[f][0],e[f][0]],[t[f][2],e[f][2]],[t[f][3],e[f][3]]),t[f][1]=y[0],e[f][1]=y[1],y=a([t[f][_-1],e[f][_-1]],[t[f][_-3],e[f][_-3]],[t[f][_-4],e[f][_-4]]),t[f][_-2]=y[0],e[f][_-2]=y[1]}if(l)for(h=0;h<_;h++){for(f=3;f<w-3;f+=3)v=n([t[f-3][h],e[f-3][h]],[t[f][h],e[f][h]],[t[f+3][h],e[f+3][h]],l),t[f-1][h]=v[0][0],e[f-1][h]=v[0][1],t[f+1][h]=v[1][0],e[f+1][h]=v[1][1];y=a([t[0][h],e[0][h]],[t[2][h],e[2][h]],[t[3][h],e[3][h]]),t[1][h]=y[0],e[1][h]=y[1],y=a([t[w-1][h],e[w-1][h]],[t[w-3][h],e[w-3][h]],[t[w-4][h],e[w-4][h]]),t[w-2][h]=y[0],e[w-2][h]=y[1]}if(s&&l)for(f=1;f<w;f+=(f+1)%3==0?2:1){for(h=3;h<_-3;h+=3)v=n([t[f][h-3],e[f][h-3]],[t[f][h],e[f][h]],[t[f][h+3],e[f][h+3]],s),t[f][h-1]=.5*(t[f][h-1]+v[0][0]),e[f][h-1]=.5*(e[f][h-1]+v[0][1]),t[f][h+1]=.5*(t[f][h+1]+v[1][0]),e[f][h+1]=.5*(e[f][h+1]+v[1][1]);y=a([t[f][0],e[f][0]],[t[f][2],e[f][2]],[t[f][3],e[f][3]]),t[f][1]=.5*(t[f][1]+y[0]),e[f][1]=.5*(e[f][1]+y[1]),y=a([t[f][_-1],e[f][_-1]],[t[f][_-3],e[f][_-3]],[t[f][_-4],e[f][_-4]]),t[f][_-2]=.5*(t[f][_-2]+y[0]),e[f][_-2]=.5*(e[f][_-2]+y[1])}return[t,e]}},{"../../lib":684,"./catmull_rom":865}],868:[function(t,e,r){"use strict";e.exports={RELATIVE_CULL_TOLERANCE:1e-6}},{}],869:[function(t,e,r){"use strict";e.exports=function(t,e,r){return e&&r?function(e,r,n,i,a){var o,s,l,c,u,h;e||(e=[]),r*=3,n*=3;var f=i*i,p=1-i,d=p*p,g=p*i*2,m=-3*d,v=3*(d-g),y=3*(g-f),x=3*f,b=a*a,_=b*a,w=1-a,k=w*w,M=k*w;for(h=0;h<t.length;h++)o=m*(u=t[h])[n][r]+v*u[n][r+1]+y*u[n][r+2]+x*u[n][r+3],s=m*u[n+1][r]+v*u[n+1][r+1]+y*u[n+1][r+2]+x*u[n+1][r+3],l=m*u[n+2][r]+v*u[n+2][r+1]+y*u[n+2][r+2]+x*u[n+2][r+3],c=m*u[n+3][r]+v*u[n+3][r+1]+y*u[n+3][r+2]+x*u[n+3][r+3],e[h]=M*o+3*(k*a*s+w*b*l)+_*c;return e}:e?function(e,r,n,i,a){var o,s,l,c;e||(e=[]),r*=3;var u=i*i,h=1-i,f=h*h,p=h*i*2,d=-3*f,g=3*(f-p),m=3*(p-u),v=3*u,y=1-a;for(l=0;l<t.length;l++)o=d*(c=t[l])[n][r]+g*c[n][r+1]+m*c[n][r+2]+v*c[n][r+3],s=d*c[n+1][r]+g*c[n+1][r+1]+m*c[n+1][r+2]+v*c[n+1][r+3],e[l]=y*o+a*s;return e}:r?function(e,r,n,i,a){var o,s,l,c,u,h;e||(e=[]),n*=3;var f=a*a,p=f*a,d=1-a,g=d*d,m=g*d;for(u=0;u<t.length;u++)o=(h=t[u])[n][r+1]-h[n][r],s=h[n+1][r+1]-h[n+1][r],l=h[n+2][r+1]-h[n+2][r],c=h[n+3][r+1]-h[n+3][r],e[u]=m*o+3*(g*a*s+d*f*l)+p*c;return e}:function(e,r,n,i,a){var o,s,l,c;e||(e=[]);var u=1-a;for(l=0;l<t.length;l++)o=(c=t[l])[n][r+1]-c[n][r],s=c[n+1][r+1]-c[n+1][r],e[l]=u*o+a*s;return e}}},{}],870:[function(t,e,r){"use strict";e.exports=function(t,e,r){return e&&r?function(e,r,n,i,a){var o,s,l,c,u,h;e||(e=[]),r*=3,n*=3;var f=i*i,p=f*i,d=1-i,g=d*d,m=g*d,v=a*a,y=1-a,x=y*y,b=y*a*2,_=-3*x,w=3*(x-b),k=3*(b-v),M=3*v;for(h=0;h<t.length;h++)o=_*(u=t[h])[n][r]+w*u[n+1][r]+k*u[n+2][r]+M*u[n+3][r],s=_*u[n][r+1]+w*u[n+1][r+1]+k*u[n+2][r+1]+M*u[n+3][r+1],l=_*u[n][r+2]+w*u[n+1][r+2]+k*u[n+2][r+2]+M*u[n+3][r+2],c=_*u[n][r+3]+w*u[n+1][r+3]+k*u[n+2][r+3]+M*u[n+3][r+3],e[h]=m*o+3*(g*i*s+d*f*l)+p*c;return e}:e?function(e,r,n,i,a){var o,s,l,c,u,h;e||(e=[]),r*=3;var f=a*a,p=f*a,d=1-a,g=d*d,m=g*d;for(u=0;u<t.length;u++)o=(h=t[u])[n+1][r]-h[n][r],s=h[n+1][r+1]-h[n][r+1],l=h[n+1][r+2]-h[n][r+2],c=h[n+1][r+3]-h[n][r+3],e[u]=m*o+3*(g*a*s+d*f*l)+p*c;return e}:r?function(e,r,n,i,a){var o,s,l,c;e||(e=[]),n*=3;var u=1-i,h=a*a,f=1-a,p=f*f,d=f*a*2,g=-3*p,m=3*(p-d),v=3*(d-h),y=3*h;for(l=0;l<t.length;l++)o=g*(c=t[l])[n][r]+m*c[n+1][r]+v*c[n+2][r]+y*c[n+3][r],s=g*c[n][r+1]+m*c[n+1][r+1]+v*c[n+2][r+1]+y*c[n+3][r+1],e[l]=u*o+i*s;return e}:function(e,r,n,i,a){var o,s,l,c;e||(e=[]);var u=1-i;for(l=0;l<t.length;l++)o=(c=t[l])[n+1][r]-c[n][r],s=c[n+1][r+1]-c[n][r+1],e[l]=u*o+i*s;return e}}},{}],871:[function(t,e,r){"use strict";e.exports=function(t,e,r,n,i){var a=e-2,o=r-2;return n&&i?function(e,r,n){var i,s,l,c,u,h;e||(e=[]);var f=Math.max(0,Math.min(Math.floor(r),a)),p=Math.max(0,Math.min(Math.floor(n),o)),d=Math.max(0,Math.min(1,r-f)),g=Math.max(0,Math.min(1,n-p));f*=3,p*=3;var m=d*d,v=m*d,y=1-d,x=y*y,b=x*y,_=g*g,w=_*g,k=1-g,M=k*k,A=M*k;for(h=0;h<t.length;h++)i=b*(u=t[h])[p][f]+3*(x*d*u[p][f+1]+y*m*u[p][f+2])+v*u[p][f+3],s=b*u[p+1][f]+3*(x*d*u[p+1][f+1]+y*m*u[p+1][f+2])+v*u[p+1][f+3],l=b*u[p+2][f]+3*(x*d*u[p+2][f+1]+y*m*u[p+2][f+2])+v*u[p+2][f+3],c=b*u[p+3][f]+3*(x*d*u[p+3][f+1]+y*m*u[p+3][f+2])+v*u[p+3][f+3],e[h]=A*i+3*(M*g*s+k*_*l)+w*c;return e}:n?function(e,r,n){e||(e=[]);var i,s,l,c,u,h,f=Math.max(0,Math.min(Math.floor(r),a)),p=Math.max(0,Math.min(Math.floor(n),o)),d=Math.max(0,Math.min(1,r-f)),g=Math.max(0,Math.min(1,n-p));f*=3;var m=d*d,v=m*d,y=1-d,x=y*y,b=x*y,_=1-g;for(u=0;u<t.length;u++)i=_*(h=t[u])[p][f]+g*h[p+1][f],s=_*h[p][f+1]+g*h[p+1][f+1],l=_*h[p][f+2]+g*h[p+1][f+1],c=_*h[p][f+3]+g*h[p+1][f+1],e[u]=b*i+3*(x*d*s+y*m*l)+v*c;return e}:i?function(e,r,n){e||(e=[]);var i,s,l,c,u,h,f=Math.max(0,Math.min(Math.floor(r),a)),p=Math.max(0,Math.min(Math.floor(n),o)),d=Math.max(0,Math.min(1,r-f)),g=Math.max(0,Math.min(1,n-p));p*=3;var m=g*g,v=m*g,y=1-g,x=y*y,b=x*y,_=1-d;for(u=0;u<t.length;u++)i=_*(h=t[u])[p][f]+d*h[p][f+1],s=_*h[p+1][f]+d*h[p+1][f+1],l=_*h[p+2][f]+d*h[p+2][f+1],c=_*h[p+3][f]+d*h[p+3][f+1],e[u]=b*i+3*(x*g*s+y*m*l)+v*c;return e}:function(e,r,n){e||(e=[]);var i,s,l,c,u=Math.max(0,Math.min(Math.floor(r),a)),h=Math.max(0,Math.min(Math.floor(n),o)),f=Math.max(0,Math.min(1,r-u)),p=Math.max(0,Math.min(1,n-h)),d=1-p,g=1-f;for(l=0;l<t.length;l++)i=g*(c=t[l])[h][u]+f*c[h][u+1],s=g*c[h+1][u]+f*c[h+1][u+1],e[l]=d*i+p*s;return e}}},{}],872:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./xy_defaults"),a=t("./ab_defaults"),o=t("./attributes"),s=t("../../components/color/attributes");e.exports=function(t,e,r,l){function c(r,i){return n.coerce(t,e,o,r,i)}e._clipPathId="clip"+e.uid+"carpet";var u=c("color",s.defaultLine);(n.coerceFont(c,"font"),c("carpet"),a(t,e,l,c,u),e.a&&e.b)?(e.a.length<3&&(e.aaxis.smoothing=0),e.b.length<3&&(e.baxis.smoothing=0),i(t,e,c)||(e.visible=!1),e._cheater&&c("cheaterslope")):e.visible=!1}},{"../../components/color/attributes":557,"../../lib":684,"./ab_defaults":855,"./attributes":857,"./xy_defaults":881}],873:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.plot=t("./plot"),n.calc=t("./calc"),n.animatable=!0,n.isContainer=!0,n.moduleType="trace",n.name="carpet",n.basePlotModule=t("../../plots/cartesian"),n.categories=["cartesian","svg","carpet","carpetAxis","notLegendIsolatable"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"./attributes":857,"./calc":861,"./defaults":872,"./plot":878}],874:[function(t,e,r){"use strict";e.exports=function(t,e){for(var r,n=t._fullData.length,i=0;i<n;i++){var a=t._fullData[i];if(a.index!==e.index&&("carpet"===a.type&&(r||(r=a),a.carpet===e.carpet)))return a}return r}},{}],875:[function(t,e,r){"use strict";e.exports=function(t,e,r){if(0===t.length)return"";var n,i=[],a=r?3:1;for(n=0;n<t.length;n+=a)i.push(t[n]+","+e[n]),r&&n<t.length-a&&(i.push("C"),i.push([t[n+1]+","+e[n+1],t[n+2]+","+e[n+2]+" "].join(" ")));return i.join(r?"":"L")}},{}],876:[function(t,e,r){"use strict";var n=t("../../lib").isArrayOrTypedArray;e.exports=function(t,e,r){var i;for(n(t)?t.length>e.length&&(t=t.slice(0,e.length)):t=[],i=0;i<e.length;i++)t[i]=r(e[i]);return t}},{"../../lib":684}],877:[function(t,e,r){"use strict";e.exports=function(t,e,r,n,i,a){var o=i[0]*t.dpdx(e),s=i[1]*t.dpdy(r),l=1,c=1;if(a){var u=Math.sqrt(i[0]*i[0]+i[1]*i[1]),h=Math.sqrt(a[0]*a[0]+a[1]*a[1]),f=(i[0]*a[0]+i[1]*a[1])/u/h;c=Math.max(0,f)}var p=180*Math.atan2(s,o)/Math.PI;return p<-90?(p+=180,l=-l):p>90&&(p-=180,l=-l),{angle:p,flip:l,p:t.c2p(n,e,r),offsetMultplier:c}}},{}],878:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/drawing"),a=t("./map_1d_array"),o=t("./makepath"),s=t("./orient_text"),l=t("../../lib/svg_text_utils"),c=t("../../lib"),u=t("../../constants/alignment"),h=t("../../plots/get_data").getUidsFromCalcData;function f(t,e,r,n){var i=r[0],l=r[0].trace,u=e.xaxis,h=e.yaxis,f=l.aaxis,g=l.baxis,m=t._fullLayout._clips,y=c.ensureSingle(n,"g","carpet"+l.uid).classed("trace",!0),x=c.ensureSingle(y,"g","minorlayer"),b=c.ensureSingle(y,"g","majorlayer"),_=c.ensureSingle(y,"g","boundarylayer"),w=c.ensureSingle(y,"g","labellayer");y.style("opacity",l.opacity),p(u,h,b,f,"a",f._gridlines),p(u,h,b,g,"b",g._gridlines),p(u,h,x,f,"a",f._minorgridlines),p(u,h,x,g,"b",g._minorgridlines),p(u,h,_,f,"a-boundary",f._boundarylines),p(u,h,_,g,"b-boundary",g._boundarylines),function(t,e,r,n,i,a,o,l){var u,h,f,p;u=.5*(r.a[0]+r.a[r.a.length-1]),h=r.b[0],f=r.ab2xy(u,h,!0),p=r.dxyda_rough(u,h),void 0===o.angle&&c.extendFlat(o,s(r,i,a,f,r.dxydb_rough(u,h)));v(t,e,r,n,f,p,r.aaxis,i,a,o,"a-title"),u=r.a[0],h=.5*(r.b[0]+r.b[r.b.length-1]),f=r.ab2xy(u,h,!0),p=r.dxydb_rough(u,h),void 0===l.angle&&c.extendFlat(l,s(r,i,a,f,r.dxyda_rough(u,h)));v(t,e,r,n,f,p,r.baxis,i,a,l,"b-title")}(t,w,l,i,u,h,d(t,u,h,l,i,w,f._labels,"a-label"),d(t,u,h,l,i,w,g._labels,"b-label")),function(t,e,r,n,i){var s,l,u,h,f=r.select("#"+t._clipPathId);f.size()||(f=r.append("clipPath").classed("carpetclip",!0));var p=c.ensureSingle(f,"path","carpetboundary"),d=e.clipsegments,g=[];for(h=0;h<d.length;h++)s=d[h],l=a([],s.x,n.c2p),u=a([],s.y,i.c2p),g.push(o(l,u,s.bicubic));var m="M"+g.join("L")+"Z";f.attr("id",t._clipPathId),p.attr("d",m)}(l,i,m,u,h)}function p(t,e,r,i,s,l){var c="const-"+s+"-lines",u=r.selectAll("."+c).data(l);u.enter().append("path").classed(c,!0).style("vector-effect","non-scaling-stroke"),u.each(function(r){var i=r,s=i.x,l=i.y,c=a([],s,t.c2p),u=a([],l,e.c2p),h="M"+o(c,u,i.smoothing);n.select(this).attr("d",h).style("stroke-width",i.width).style("stroke",i.color).style("fill","none")}),u.exit().remove()}function d(t,e,r,a,o,c,u,h){var f=c.selectAll("text."+h).data(u);f.enter().append("text").classed(h,!0);var p=0,d={};return f.each(function(o,c){var u;if("auto"===o.axis.tickangle)u=s(a,e,r,o.xy,o.dxy);else{var h=(o.axis.tickangle+180)*Math.PI/180;u=s(a,e,r,o.xy,[Math.cos(h),Math.sin(h)])}c||(d={angle:u.angle,flip:u.flip});var f=(o.endAnchor?-1:1)*u.flip,g=n.select(this).attr({"text-anchor":f>0?"start":"end","data-notex":1}).call(i.font,o.font).text(o.text).call(l.convertToTspans,t),m=i.bBox(this);g.attr("transform","translate("+u.p[0]+","+u.p[1]+") rotate("+u.angle+")translate("+o.axis.labelpadding*f+","+.3*m.height+")"),p=Math.max(p,m.width+o.axis.labelpadding)}),f.exit().remove(),d.maxExtent=p,d}e.exports=function(t,e,r,i){var a=h(r);i.selectAll("g.trace").each(function(){var t=n.select(this).attr("class").split("carpet")[1].split(/\s/)[0];a[t]||n.select(this).remove()});for(var o=0;o<r.length;o++)f(t,e,r[o],i)};var g=u.LINE_SPACING,m=(1-u.MID_SHIFT)/g+1;function v(t,e,r,a,o,c,u,h,f,p,d){var v=[];u.title&&v.push(u.title);var y=e.selectAll("text."+d).data(v),x=p.maxExtent;y.enter().append("text").classed(d,!0),y.each(function(){var e=s(r,h,f,o,c);-1===["start","both"].indexOf(u.showticklabels)&&(x=0);var a=u.titlefont.size;x+=a+u.titleoffset;var d=(p.angle+(p.flip<0?180:0)-e.angle+450)%360,v=d>90&&d<270,y=n.select(this);y.text(u.title||"").call(l.convertToTspans,t),v&&(x=(-l.lineCount(y)+m)*g*a-x),y.attr("transform","translate("+e.p[0]+","+e.p[1]+") rotate("+e.angle+") translate(0,"+x+")").classed("user-select-none",!0).attr("text-anchor","middle").call(i.font,u.titlefont)}),y.exit().remove()}},{"../../components/drawing":583,"../../constants/alignment":656,"../../lib":684,"../../lib/svg_text_utils":708,"../../plots/get_data":768,"./makepath":875,"./map_1d_array":876,"./orient_text":877,d3:147}],879:[function(t,e,r){"use strict";var n=t("./constants"),i=t("../../lib/search").findBin,a=t("./compute_control_points"),o=t("./create_spline_evaluator"),s=t("./create_i_derivative_evaluator"),l=t("./create_j_derivative_evaluator");e.exports=function(t){var e=t._a,r=t._b,c=e.length,u=r.length,h=t.aaxis,f=t.baxis,p=e[0],d=e[c-1],g=r[0],m=r[u-1],v=e[e.length-1]-e[0],y=r[r.length-1]-r[0],x=v*n.RELATIVE_CULL_TOLERANCE,b=y*n.RELATIVE_CULL_TOLERANCE;p-=x,d+=x,g-=b,m+=b,t.isVisible=function(t,e){return t>p&&t<d&&e>g&&e<m},t.isOccluded=function(t,e){return t<p||t>d||e<g||e>m},t.setScale=function(){var e=t._x,r=t._y,n=a(t._xctrl,t._yctrl,e,r,h.smoothing,f.smoothing);t._xctrl=n[0],t._yctrl=n[1],t.evalxy=o([t._xctrl,t._yctrl],c,u,h.smoothing,f.smoothing),t.dxydi=s([t._xctrl,t._yctrl],h.smoothing,f.smoothing),t.dxydj=l([t._xctrl,t._yctrl],h.smoothing,f.smoothing)},t.i2a=function(t){var r=Math.max(0,Math.floor(t[0]),c-2),n=t[0]-r;return(1-n)*e[r]+n*e[r+1]},t.j2b=function(t){var e=Math.max(0,Math.floor(t[1]),c-2),n=t[1]-e;return(1-n)*r[e]+n*r[e+1]},t.ij2ab=function(e){return[t.i2a(e[0]),t.j2b(e[1])]},t.a2i=function(t){var r=Math.max(0,Math.min(i(t,e),c-2)),n=e[r],a=e[r+1];return Math.max(0,Math.min(c-1,r+(t-n)/(a-n)))},t.b2j=function(t){var e=Math.max(0,Math.min(i(t,r),u-2)),n=r[e],a=r[e+1];return Math.max(0,Math.min(u-1,e+(t-n)/(a-n)))},t.ab2ij=function(e){return[t.a2i(e[0]),t.b2j(e[1])]},t.i2c=function(e,r){return t.evalxy([],e,r)},t.ab2xy=function(n,i,a){if(!a&&(n<e[0]||n>e[c-1]|i<r[0]||i>r[u-1]))return[!1,!1];var o=t.a2i(n),s=t.b2j(i),l=t.evalxy([],o,s);if(a){var h,f,p,d,g=0,m=0,v=[];n<e[0]?(h=0,f=0,g=(n-e[0])/(e[1]-e[0])):n>e[c-1]?(h=c-2,f=1,g=(n-e[c-1])/(e[c-1]-e[c-2])):f=o-(h=Math.max(0,Math.min(c-2,Math.floor(o)))),i<r[0]?(p=0,d=0,m=(i-r[0])/(r[1]-r[0])):i>r[u-1]?(p=u-2,d=1,m=(i-r[u-1])/(r[u-1]-r[u-2])):d=s-(p=Math.max(0,Math.min(u-2,Math.floor(s)))),g&&(t.dxydi(v,h,p,f,d),l[0]+=v[0]*g,l[1]+=v[1]*g),m&&(t.dxydj(v,h,p,f,d),l[0]+=v[0]*m,l[1]+=v[1]*m)}return l},t.c2p=function(t,e,r){return[e.c2p(t[0]),r.c2p(t[1])]},t.p2x=function(t,e,r){return[e.p2c(t[0]),r.p2c(t[1])]},t.dadi=function(t){var r=Math.max(0,Math.min(e.length-2,t));return e[r+1]-e[r]},t.dbdj=function(t){var e=Math.max(0,Math.min(r.length-2,t));return r[e+1]-r[e]},t.dxyda=function(e,r,n,i){var a=t.dxydi(null,e,r,n,i),o=t.dadi(e,n);return[a[0]/o,a[1]/o]},t.dxydb=function(e,r,n,i){var a=t.dxydj(null,e,r,n,i),o=t.dbdj(r,i);return[a[0]/o,a[1]/o]},t.dxyda_rough=function(e,r,n){var i=v*(n||.1),a=t.ab2xy(e+i,r,!0),o=t.ab2xy(e-i,r,!0);return[.5*(a[0]-o[0])/i,.5*(a[1]-o[1])/i]},t.dxydb_rough=function(e,r,n){var i=y*(n||.1),a=t.ab2xy(e,r+i,!0),o=t.ab2xy(e,r-i,!0);return[.5*(a[0]-o[0])/i,.5*(a[1]-o[1])/i]},t.dpdx=function(t){return t._m},t.dpdy=function(t){return t._m}}},{"../../lib/search":703,"./compute_control_points":867,"./constants":868,"./create_i_derivative_evaluator":869,"./create_j_derivative_evaluator":870,"./create_spline_evaluator":871}],880:[function(t,e,r){"use strict";var n=t("../../lib");e.exports=function(t,e,r){var i,a,o,s=[],l=[],c=t[0].length,u=t.length;function h(e,r){var n,i=0,a=0;return e>0&&void 0!==(n=t[r][e-1])&&(a++,i+=n),e<c-1&&void 0!==(n=t[r][e+1])&&(a++,i+=n),r>0&&void 0!==(n=t[r-1][e])&&(a++,i+=n),r<u-1&&void 0!==(n=t[r+1][e])&&(a++,i+=n),i/Math.max(1,a)}var f,p,d,g,m,v,y,x,b,_,w,k=0;for(i=0;i<c;i++)for(a=0;a<u;a++)void 0===t[a][i]&&(s.push(i),l.push(a),t[a][i]=h(i,a)),k=Math.max(k,Math.abs(t[a][i]));if(!s.length)return t;var M=0,A=0,T=s.length;do{for(M=0,o=0;o<T;o++){i=s[o],a=l[o];var S,E,C,L,z,P,I=0,O=0;0===i?(C=e[z=Math.min(c-1,2)],L=e[1],S=t[a][z],O+=(E=t[a][1])+(E-S)*(e[0]-L)/(L-C),I++):i===c-1&&(C=e[z=Math.max(0,c-3)],L=e[c-2],S=t[a][z],O+=(E=t[a][c-2])+(E-S)*(e[c-1]-L)/(L-C),I++),(0===i||i===c-1)&&a>0&&a<u-1&&(f=r[a+1]-r[a],O+=((p=r[a]-r[a-1])*t[a+1][i]+f*t[a-1][i])/(p+f),I++),0===a?(C=r[P=Math.min(u-1,2)],L=r[1],S=t[P][i],O+=(E=t[1][i])+(E-S)*(r[0]-L)/(L-C),I++):a===u-1&&(C=r[P=Math.max(0,u-3)],L=r[u-2],S=t[P][i],O+=(E=t[u-2][i])+(E-S)*(r[u-1]-L)/(L-C),I++),(0===a||a===u-1)&&i>0&&i<c-1&&(f=e[i+1]-e[i],O+=((p=e[i]-e[i-1])*t[a][i+1]+f*t[a][i-1])/(p+f),I++),I?O/=I:(d=e[i+1]-e[i],g=e[i]-e[i-1],x=(m=r[a+1]-r[a])*(v=r[a]-r[a-1])*(m+v),O=((y=d*g*(d+g))*(v*t[a+1][i]+m*t[a-1][i])+x*(g*t[a][i+1]+d*t[a][i-1]))/(x*(g+d)+y*(v+m))),M+=(_=(b=O-t[a][i])/k)*_,w=I?0:.85,t[a][i]+=b*(1+w)}M=Math.sqrt(M)}while(A++<100&&M>1e-5);return n.log("Smoother converged to",M,"after",A,"iterations"),t}},{"../../lib":684}],881:[function(t,e,r){"use strict";var n=t("../../lib").isArray1D;e.exports=function(t,e,r){var i=r("x"),a=i&&i.length,o=r("y"),s=o&&o.length;if(!a&&!s)return!1;if(e._cheater=!i,a&&!n(i)||s&&!n(o))e._length=null;else{var l=a?i.length:1/0;s&&(l=Math.min(l,o.length)),e.a&&e.a.length&&(l=Math.min(l,e.a.length)),e.b&&e.b.length&&(l=Math.min(l,e.b.length)),e._length=l}return!0}},{"../../lib":684}],882:[function(t,e,r){"use strict";var n=t("../scattergeo/attributes"),i=t("../../components/colorscale/attributes"),a=t("../../components/colorbar/attributes"),o=t("../../plots/attributes"),s=t("../../lib/extend").extendFlat,l=n.marker.line;e.exports=s({locations:{valType:"data_array",editType:"calc"},locationmode:n.locationmode,z:{valType:"data_array",editType:"calc"},text:s({},n.text,{}),marker:{line:{color:l.color,width:s({},l.width,{dflt:1}),editType:"calc"},opacity:{valType:"number",arrayOk:!0,min:0,max:1,dflt:1,editType:"style"},editType:"calc"},selected:{marker:{opacity:n.selected.marker.opacity,editType:"plot"},editType:"plot"},unselected:{marker:{opacity:n.unselected.marker.opacity,editType:"plot"},editType:"plot"},hoverinfo:s({},o.hoverinfo,{editType:"calc",flags:["location","z","text","name"]})},i("",{cLetter:"z",editTypeOverride:"calc"}),{colorbar:a})},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../../plots/attributes":729,"../scattergeo/attributes":1053}],883:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../constants/numerical").BADNUM,a=t("../../components/colorscale/calc"),o=t("../scatter/arrays_to_calcdata"),s=t("../scatter/calc_selection");e.exports=function(t,e){for(var r=e._length,l=new Array(r),c=0;c<r;c++){var u=l[c]={},h=e.locations[c],f=e.z[c];u.loc="string"==typeof h?h:null,u.z=n(f)?f:i}return o(l,e),a(e,e.z,"","z"),s(l,e),l}},{"../../components/colorscale/calc":566,"../../constants/numerical":661,"../scatter/arrays_to_calcdata":1014,"../scatter/calc_selection":1017,"fast-isnumeric":214}],884:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../components/colorscale/defaults"),a=t("./attributes");e.exports=function(t,e,r,o){function s(r,i){return n.coerce(t,e,a,r,i)}var l=s("locations"),c=s("z");l&&l.length&&n.isArrayOrTypedArray(c)&&c.length?(e._length=Math.min(l.length,c.length),s("locationmode"),s("text"),s("marker.line.color"),s("marker.line.width"),s("marker.opacity"),i(t,e,o,s,{prefix:"",cLetter:"z"}),n.coerceSelectionMarkerOpacity(e,s)):e.visible=!1}},{"../../components/colorscale/defaults":568,"../../lib":684,"./attributes":882}],885:[function(t,e,r){"use strict";e.exports=function(t,e){return t.location=e.location,t.z=e.z,t}},{}],886:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/axes"),i=t("./attributes"),a=t("../scatter/fill_hover_text");e.exports=function(t,e,r){var o,s,l,c,u=t.cd,h=u[0].trace,f=t.subplot;for(s=0;s<u.length;s++)if(c=!1,(o=u[s])._polygons){for(l=0;l<o._polygons.length;l++)o._polygons[l].contains([e,r])&&(c=!c),o._polygons[l].contains([e+360,r])&&(c=!c);if(c)break}if(c&&o)return t.x0=t.x1=t.xa.c2p(o.ct),t.y0=t.y1=t.ya.c2p(o.ct),t.index=o.index,t.location=o.loc,t.z=o.z,function(t,e,r,o){var s=r.hi||e.hoverinfo,l="all"===s?i.hoverinfo.flags:s.split("+"),c=-1!==l.indexOf("name"),u=-1!==l.indexOf("location"),h=-1!==l.indexOf("z"),f=-1!==l.indexOf("text"),p=[];!c&&u?t.nameOverride=r.loc:(c&&(t.nameOverride=e.name),u&&p.push(r.loc));h&&p.push((d=r.z,n.tickText(o,o.c2l(d),"hover").text));var d;f&&a(r,e,p);t.extraText=p.join("<br>")}(t,h,o,f.mockAxis),[t]}},{"../../plots/cartesian/axes":732,"../scatter/fill_hover_text":1022,"./attributes":882}],887:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.colorbar=t("../heatmap/colorbar"),n.calc=t("./calc"),n.plot=t("./plot"),n.style=t("./style").style,n.styleOnSelect=t("./style").styleOnSelect,n.hoverPoints=t("./hover"),n.eventData=t("./event_data"),n.selectPoints=t("./select"),n.moduleType="trace",n.name="choropleth",n.basePlotModule=t("../../plots/geo"),n.categories=["geo","noOpacity"],n.meta={},e.exports=n},{"../../plots/geo":762,"../heatmap/colorbar":928,"./attributes":882,"./calc":883,"./defaults":884,"./event_data":885,"./hover":886,"./plot":888,"./select":889,"./style":890}],888:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../lib"),a=t("../../lib/polygon"),o=t("../../lib/topojson_utils").getTopojsonFeatures,s=t("../../lib/geo_location_utils").locationToFeature,l=t("./style").style;function c(t,e){for(var r=t[0].trace,n=t.length,i=o(r,e),a=0;a<n;a++){var l=t[a],c=s(r.locationmode,l.loc,i);c?(l.geojson=c,l.ct=c.properties.ct,l.index=a,l._polygons=u(c)):l.geojson=null}}function u(t){var e,r,n,i,o=t.geometry,s=o.coordinates,l=t.id,c=[];function u(t){for(var e=0;e<t.length-1;e++)if(t[e][0]>0&&t[e+1][0]<0)return e;return null}switch(e="RUS"===l||"FJI"===l?function(t){var e;if(null===u(t))e=t;else for(e=new Array(t.length),i=0;i<t.length;i++)e[i]=[t[i][0]<0?t[i][0]+360:t[i][0],t[i][1]];c.push(a.tester(e))}:"ATA"===l?function(t){var e=u(t);if(null===e)return c.push(a.tester(t));var r=new Array(t.length+1),n=0;for(i=0;i<t.length;i++)i>e?r[n++]=[t[i][0]+360,t[i][1]]:i===e?(r[n++]=t[i],r[n++]=[t[i][0],-90]):r[n++]=t[i];var o=a.tester(r);o.pts.pop(),c.push(o)}:function(t){c.push(a.tester(t))},o.type){case"MultiPolygon":for(r=0;r<s.length;r++)for(n=0;n<s[r].length;n++)e(s[r][n]);break;case"Polygon":for(r=0;r<s.length;r++)e(s[r])}return c}e.exports=function(t,e,r){for(var a=0;a<r.length;a++)c(r[a],e.topojson);var o=e.layers.backplot.select(".choroplethlayer").selectAll("g.trace.choropleth").data(r,function(t){return t[0].trace.uid});o.enter().append("g").attr("class","trace choropleth"),o.exit().remove(),o.each(function(e){var r=(e[0].node3=n.select(this)).selectAll("path.choroplethlocation").data(i.identity);r.enter().append("path").classed("choroplethlocation",!0),r.exit().remove(),l(t,e)})}},{"../../lib":684,"../../lib/geo_location_utils":676,"../../lib/polygon":696,"../../lib/topojson_utils":711,"./style":890,d3:147}],889:[function(t,e,r){"use strict";e.exports=function(t,e){var r,n,i,a,o,s=t.cd,l=t.xaxis,c=t.yaxis,u=[];if(!1===e)for(r=0;r<s.length;r++)s[r].selected=0;else for(r=0;r<s.length;r++)(i=(n=s[r]).ct)&&(a=l.c2p(i),o=c.c2p(i),e.contains([a,o])?(u.push({pointNumber:r,lon:i[0],lat:i[1]}),n.selected=1):n.selected=0);return u}},{}],890:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/color"),a=t("../../components/drawing"),o=t("../../components/colorscale");function s(t,e){var r=e[0].trace,s=e[0].node3.selectAll(".choroplethlocation"),l=r.marker||{},c=l.line||{},u=o.makeColorScaleFunc(o.extractScale(r.colorscale,r.zmin,r.zmax));s.each(function(t){n.select(this).attr("fill",u(t.z)).call(i.stroke,t.mlc||c.color).call(a.dashLine,"",t.mlw||c.width||0).style("opacity",l.opacity)}),a.selectedPointStyle(s,r,t)}e.exports={style:function(t,e){e&&s(t,e)},styleOnSelect:function(t,e){var r=e[0].node3,n=e[0].trace;n.selectedpoints?a.selectedPointStyle(r.selectAll(".choroplethlocation"),n,t):s(t,e)}}},{"../../components/color":558,"../../components/colorscale":573,"../../components/drawing":583,d3:147}],891:[function(t,e,r){"use strict";var n=t("../../components/colorscale/attributes"),i=t("../../components/colorbar/attributes"),a=t("../mesh3d/attributes"),o=t("../../plots/attributes"),s=t("../../lib/extend").extendFlat,l={x:{valType:"data_array",editType:"calc+clearAxisTypes"},y:{valType:"data_array",editType:"calc+clearAxisTypes"},z:{valType:"data_array",editType:"calc+clearAxisTypes"},u:{valType:"data_array",editType:"calc"},v:{valType:"data_array",editType:"calc"},w:{valType:"data_array",editType:"calc"},sizemode:{valType:"enumerated",values:["scaled","absolute"],editType:"calc",dflt:"scaled"},sizeref:{valType:"number",editType:"calc",min:0},anchor:{valType:"enumerated",editType:"calc",values:["tip","tail","cm","center"],dflt:"cm"},text:{valType:"string",dflt:"",arrayOk:!0,editType:"calc"}};s(l,n("",{colorAttr:"u/v/w norm",showScaleDflt:!0,editTypeOverride:"calc"}),{colorbar:i});["opacity","lightposition","lighting"].forEach(function(t){l[t]=a[t]}),l.hoverinfo=s({},o.hoverinfo,{editType:"calc",flags:["x","y","z","u","v","w","norm","text","name"],dflt:"x+y+z+norm+text+name"}),e.exports=l},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../../plots/attributes":729,"../mesh3d/attributes":965}],892:[function(t,e,r){"use strict";var n=t("../../components/colorscale/calc");e.exports=function(t,e){for(var r=e.u,i=e.v,a=e.w,o=Math.min(e.x.length,e.y.length,e.z.length,r.length,i.length,a.length),s=-1/0,l=1/0,c=0;c<o;c++){var u=r[c],h=i[c],f=a[c],p=Math.sqrt(u*u+h*h+f*f);s=Math.max(s,p),l=Math.min(l,p)}e._len=o,e._normMax=s,n(e,[l,s],"","c")}},{"../../components/colorscale/calc":566}],893:[function(t,e,r){"use strict";var n=t("gl-cone3d"),i=t("gl-cone3d").createConeMesh,a=t("../../lib").simpleMap,o=t("../../lib/gl_format_color").parseColorScale,s=t("../../plots/gl3d/zip3");function l(t,e){this.scene=t,this.uid=e,this.mesh=null,this.data=null}var c=l.prototype;c.handlePick=function(t){if(t.object===this.mesh){var e=t.index=t.data.index,r=this.data.x[e],n=this.data.y[e],i=this.data.z[e],a=this.data.u[e],o=this.data.v[e],s=this.data.w[e];t.traceCoordinate=[r,n,i,a,o,s,Math.sqrt(a*a+o*o+s*s)];var l=this.data.text;return Array.isArray(l)&&void 0!==l[e]?t.textLabel=l[e]:l&&(t.textLabel=l),!0}};var u={xaxis:0,yaxis:1,zaxis:2},h={tip:1,tail:0,cm:.25,center:.5},f={tip:1,tail:1,cm:.75,center:.5};function p(t,e){var r=t.fullSceneLayout,i=t.dataScale,l={};function c(t,e){var n=r[e],o=i[u[e]];return a(t,function(t){return n.d2l(t)*o})}l.vectors=s(c(e.u,"xaxis"),c(e.v,"yaxis"),c(e.w,"zaxis"),e._len),l.positions=s(c(e.x,"xaxis"),c(e.y,"yaxis"),c(e.z,"zaxis"),e._len),l.colormap=o(e.colorscale),l.vertexIntensityBounds=[e.cmin/e._normMax,e.cmax/e._normMax],l.coneOffset=h[e.anchor],"scaled"===e.sizemode?l.coneSize=e.sizeref||.5:l.coneSize=e.sizeref&&e._normMax?e.sizeref/e._normMax:.5;var p=n(l),d=e.lightposition;return p.lightPosition=[d.x,d.y,d.z],p.ambient=e.lighting.ambient,p.diffuse=e.lighting.diffuse,p.specular=e.lighting.specular,p.roughness=e.lighting.roughness,p.fresnel=e.lighting.fresnel,p.opacity=e.opacity,e._pad=f[e.anchor]*p.vectorScale*p.coneScale*e._normMax,p}c.update=function(t){this.data=t;var e=p(this.scene,t);this.mesh.update(e)},c.dispose=function(){this.scene.glplot.remove(this.mesh),this.mesh.dispose()},e.exports=function(t,e){var r=t.glplot.gl,n=p(t,e),a=i(r,n),o=new l(t,e.uid);return o.mesh=a,o.data=e,a._trace=o,t.glplot.add(a),o}},{"../../lib":684,"../../lib/gl_format_color":680,"../../plots/gl3d/zip3":785,"gl-cone3d":231}],894:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../components/colorscale/defaults"),a=t("./attributes");e.exports=function(t,e,r,o){function s(r,i){return n.coerce(t,e,a,r,i)}var l=s("u"),c=s("v"),u=s("w"),h=s("x"),f=s("y"),p=s("z");l&&l.length&&c&&c.length&&u&&u.length&&h&&h.length&&f&&f.length&&p&&p.length?(s("sizeref"),s("sizemode"),s("anchor"),s("lighting.ambient"),s("lighting.diffuse"),s("lighting.specular"),s("lighting.roughness"),s("lighting.fresnel"),s("lightposition.x"),s("lightposition.y"),s("lightposition.z"),i(t,e,o,s,{prefix:"",cLetter:"c"}),s("text"),e._length=null):e.visible=!1}},{"../../components/colorscale/defaults":568,"../../lib":684,"./attributes":891}],895:[function(t,e,r){"use strict";e.exports={moduleType:"trace",name:"cone",basePlotModule:t("../../plots/gl3d"),categories:["gl3d"],attributes:t("./attributes"),supplyDefaults:t("./defaults"),colorbar:{min:"cmin",max:"cmax"},calc:t("./calc"),plot:t("./convert"),meta:{}}},{"../../plots/gl3d":774,"./attributes":891,"./calc":892,"./convert":893,"./defaults":894}],896:[function(t,e,r){"use strict";var n=t("../heatmap/attributes"),i=t("../scatter/attributes"),a=t("../../components/colorscale/attributes"),o=t("../../components/colorbar/attributes"),s=t("../../components/drawing/attributes").dash,l=t("../../plots/font_attributes"),c=t("../../lib/extend").extendFlat,u=t("../../constants/filter_ops"),h=u.COMPARISON_OPS2,f=u.INTERVAL_OPS,p=i.line;e.exports=c({z:n.z,x:n.x,x0:n.x0,dx:n.dx,y:n.y,y0:n.y0,dy:n.dy,text:n.text,transpose:n.transpose,xtype:n.xtype,ytype:n.ytype,zhoverformat:n.zhoverformat,connectgaps:n.connectgaps,fillcolor:{valType:"color",editType:"calc"},autocontour:{valType:"boolean",dflt:!0,editType:"calc",impliedEdits:{"contours.start":void 0,"contours.end":void 0,"contours.size":void 0}},ncontours:{valType:"integer",dflt:15,min:1,editType:"calc"},contours:{type:{valType:"enumerated",values:["levels","constraint"],dflt:"levels",editType:"calc"},start:{valType:"number",dflt:null,editType:"plot",impliedEdits:{"^autocontour":!1}},end:{valType:"number",dflt:null,editType:"plot",impliedEdits:{"^autocontour":!1}},size:{valType:"number",dflt:null,min:0,editType:"plot",impliedEdits:{"^autocontour":!1}},coloring:{valType:"enumerated",values:["fill","heatmap","lines","none"],dflt:"fill",editType:"calc"},showlines:{valType:"boolean",dflt:!0,editType:"plot"},showlabels:{valType:"boolean",dflt:!1,editType:"plot"},labelfont:l({editType:"plot",colorEditType:"style"}),labelformat:{valType:"string",dflt:"",editType:"plot"},operation:{valType:"enumerated",values:[].concat(h).concat(f),dflt:"=",editType:"calc"},value:{valType:"any",dflt:0,editType:"calc"},editType:"calc",impliedEdits:{autocontour:!1}},line:{color:c({},p.color,{editType:"style+colorbars"}),width:c({},p.width,{editType:"style+colorbars"}),dash:s,smoothing:c({},p.smoothing,{}),editType:"plot"}},a("",{cLetter:"z",autoColorDflt:!1,editTypeOverride:"calc"}),{colorbar:o})},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../components/drawing/attributes":582,"../../constants/filter_ops":657,"../../lib/extend":673,"../../plots/font_attributes":758,"../heatmap/attributes":925,"../scatter/attributes":1015}],897:[function(t,e,r){"use strict";var n=t("../heatmap/calc"),i=t("./set_contours");e.exports=function(t,e){var r=n(t,e);return i(e),r}},{"../heatmap/calc":926,"./set_contours":915}],898:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){var i,a,o,s=t[0],l=s.x.length,c=s.y.length,u=s.z,h=n.contours,f=-1/0,p=1/0;for(i=0;i<c;i++)p=Math.min(p,u[i][0]),p=Math.min(p,u[i][l-1]),f=Math.max(f,u[i][0]),f=Math.max(f,u[i][l-1]);for(i=1;i<l-1;i++)p=Math.min(p,u[0][i]),p=Math.min(p,u[c-1][i]),f=Math.max(f,u[0][i]),f=Math.max(f,u[c-1][i]);switch(s.prefixBoundary=!1,e){case">":h.value>f&&(s.prefixBoundary=!0);break;case"<":h.value<p&&(s.prefixBoundary=!0);break;case"[]":a=Math.min.apply(null,h.value),((o=Math.max.apply(null,h.value))<p||a>f)&&(s.prefixBoundary=!0);break;case"][":a=Math.min.apply(null,h.value),o=Math.max.apply(null,h.value),a<p&&o>f&&(s.prefixBoundary=!0)}}},{}],899:[function(t,e,r){"use strict";var n=t("../../components/colorbar/draw"),i=t("./make_color_map"),a=t("./end_plus");e.exports=function(t,e){var r=e[0].trace,o="cb"+r.uid;if(t._fullLayout._infolayer.selectAll("."+o).remove(),r.showscale){var s=n(t,o);e[0].t.cb=s;var l=r.contours,c=r.line,u=l.size||1,h=l.coloring,f=i(r,{isColorbar:!0});"heatmap"===h&&s.filllevels({start:r.zmin,end:r.zmax,size:(r.zmax-r.zmin)/254}),s.fillcolor("fill"===h||"heatmap"===h?f:"").line({color:"lines"===h?f:c.color,width:!1!==l.showlines?c.width:0,dash:c.dash}).levels({start:l.start,end:a(l),size:u}).options(r.colorbar)()}}},{"../../components/colorbar/draw":563,"./end_plus":907,"./make_color_map":912}],900:[function(t,e,r){"use strict";e.exports={BOTTOMSTART:[1,9,13,104,713],TOPSTART:[4,6,7,104,713],LEFTSTART:[8,12,14,208,1114],RIGHTSTART:[2,3,11,208,1114],NEWDELTA:[null,[-1,0],[0,-1],[-1,0],[1,0],null,[0,-1],[-1,0],[0,1],[0,1],null,[0,1],[1,0],[1,0],[0,-1]],CHOOSESADDLE:{104:[4,1],208:[2,8],713:[7,13],1114:[11,14]},SADDLEREMAINDER:{1:4,2:8,4:1,7:13,8:2,11:14,13:7,14:11},LABELDISTANCE:2,LABELINCREASE:10,LABELMIN:3,LABELMAX:10,LABELOPTIMIZER:{EDGECOST:1,ANGLECOST:1,NEIGHBORCOST:5,SAMELEVELFACTOR:10,SAMELEVELDISTANCE:5,MAXCOST:100,INITIALSEARCHPOINTS:10,ITERATIONS:5}}},{}],901:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("./label_defaults"),a=t("../../components/color"),o=a.addOpacity,s=a.opacity,l=t("../../constants/filter_ops"),c=l.CONSTRAINT_REDUCTION,u=l.COMPARISON_OPS2;e.exports=function(t,e,r,a,l,h){var f,p,d,g=e.contours,m=r("contours.operation");(g._operation=c[m],function(t,e){var r;-1===u.indexOf(e.operation)?(t("contours.value",[0,1]),Array.isArray(e.value)?e.value.length>2?e.value=e.value.slice(2):0===e.length?e.value=[0,1]:e.length<2?(r=parseFloat(e.value[0]),e.value=[r,r+1]):e.value=[parseFloat(e.value[0]),parseFloat(e.value[1])]:n(e.value)&&(r=parseFloat(e.value),e.value=[r,r+1])):(t("contours.value",0),n(e.value)||(Array.isArray(e.value)?e.value=parseFloat(e.value[0]):e.value=0))}(r,g),"="===m?f=g.showlines=!0:(f=r("contours.showlines"),d=r("fillcolor",o((t.line||{}).color||l,.5))),f)&&(p=r("line.color",d&&s(d)?o(e.fillcolor,1):l),r("line.width",2),r("line.dash"));r("line.smoothing"),i(r,a,p,h)}},{"../../components/color":558,"../../constants/filter_ops":657,"./label_defaults":911,"fast-isnumeric":214}],902:[function(t,e,r){"use strict";var n=t("../../constants/filter_ops"),i=t("fast-isnumeric");function a(t,e){var r,a=Array.isArray(e);function o(t){return i(t)?+t:null}return-1!==n.COMPARISON_OPS2.indexOf(t)?r=o(a?e[0]:e):-1!==n.INTERVAL_OPS.indexOf(t)?r=a?[o(e[0]),o(e[1])]:[o(e),o(e)]:-1!==n.SET_OPS.indexOf(t)&&(r=a?e.map(o):[o(e)]),r}function o(t){return function(e){e=a(t,e);var r=Math.min(e[0],e[1]),n=Math.max(e[0],e[1]);return{start:r,end:n,size:n-r}}}function s(t){return function(e){return{start:e=a(t,e),end:1/0,size:1/0}}}e.exports={"[]":o("[]"),"][":o("]["),">":s(">"),"<":s("<"),"=":s("=")}},{"../../constants/filter_ops":657,"fast-isnumeric":214}],903:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){var i=n("contours.start"),a=n("contours.end"),o=!1===i||!1===a,s=r("contours.size");!(o?e.autocontour=!0:r("autocontour",!1))&&s||r("ncontours")}},{}],904:[function(t,e,r){"use strict";var n=t("../../lib");function i(t){return n.extendFlat({},t,{edgepaths:n.extendDeep([],t.edgepaths),paths:n.extendDeep([],t.paths)})}e.exports=function(t,e){var r,a,o,s=function(t){return t.reverse()},l=function(t){return t};switch(e){case"=":case"<":return t;case">":for(1!==t.length&&n.warn("Contour data invalid for the specified inequality operation."),a=t[0],r=0;r<a.edgepaths.length;r++)a.edgepaths[r]=s(a.edgepaths[r]);for(r=0;r<a.paths.length;r++)a.paths[r]=s(a.paths[r]);return t;case"][":var c=s;s=l,l=c;case"[]":for(2!==t.length&&n.warn("Contour data invalid for the specified inequality range operation."),a=i(t[0]),o=i(t[1]),r=0;r<a.edgepaths.length;r++)a.edgepaths[r]=s(a.edgepaths[r]);for(r=0;r<a.paths.length;r++)a.paths[r]=s(a.paths[r]);for(;o.edgepaths.length;)a.edgepaths.push(l(o.edgepaths.shift()));for(;o.paths.length;)a.paths.push(l(o.paths.shift()));return[a]}}},{"../../lib":684}],905:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../heatmap/xyz_defaults"),a=t("./constraint_defaults"),o=t("./contours_defaults"),s=t("./style_defaults"),l=t("./attributes");e.exports=function(t,e,r,c){function u(r,i){return n.coerce(t,e,l,r,i)}if(i(t,e,u,c)){u("text");var h="constraint"===u("contours.type");u("connectgaps",n.isArray1D(e.z)),h||delete e.showlegend,h?a(t,e,u,c,r):(o(t,e,u,function(r){return n.coerce2(t,e,l,r)}),s(t,e,u,c))}else e.visible=!1}},{"../../lib":684,"../heatmap/xyz_defaults":940,"./attributes":896,"./constraint_defaults":901,"./contours_defaults":903,"./style_defaults":917}],906:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./constraint_mapping"),a=t("./end_plus");e.exports=function(t,e,r){for(var o="constraint"===t.type?i[t._operation](t.value):t,s=o.size,l=[],c=a(o),u=r.trace._carpetTrace,h=u?{xaxis:u.aaxis,yaxis:u.baxis,x:r.a,y:r.b}:{xaxis:e.xaxis,yaxis:e.yaxis,x:r.x,y:r.y},f=o.start;f<c;f+=s)if(l.push(n.extendFlat({level:f,crossings:{},starts:[],edgepaths:[],paths:[],z:r.z,smoothing:r.trace.line.smoothing},h)),l.length>1e3){n.warn("Too many contours, clipping at 1000",t);break}return l}},{"../../lib":684,"./constraint_mapping":902,"./end_plus":907}],907:[function(t,e,r){"use strict";e.exports=function(t){return t.end+t.size/1e6}},{}],908:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./constants");function a(t,e,r,n){return Math.abs(t[0]-e[0])<r&&Math.abs(t[1]-e[1])<n}function o(t,e,r,o,l){var c,u=e.join(","),h=u,f=t.crossings[h],p=function(t,e,r){var n=0,a=0;t>20&&e?208===t||1114===t?n=0===r[0]?1:-1:a=0===r[1]?1:-1:-1!==i.BOTTOMSTART.indexOf(t)?a=1:-1!==i.LEFTSTART.indexOf(t)?n=1:-1!==i.TOPSTART.indexOf(t)?a=-1:n=-1;return[n,a]}(f,r,e),d=[s(t,e,[-p[0],-p[1]])],g=p.join(","),m=t.z.length,v=t.z[0].length;for(c=0;c<1e4;c++){if(f>20?(f=i.CHOOSESADDLE[f][(p[0]||p[1])<0?0:1],t.crossings[h]=i.SADDLEREMAINDER[f]):delete t.crossings[h],!(p=i.NEWDELTA[f])){n.log("Found bad marching index:",f,e,t.level);break}d.push(s(t,e,p)),e[0]+=p[0],e[1]+=p[1],a(d[d.length-1],d[d.length-2],o,l)&&d.pop(),h=e.join(",");var y=p[0]&&(e[0]<0||e[0]>v-2)||p[1]&&(e[1]<0||e[1]>m-2);if(h===u&&p.join(",")===g||r&&y)break;f=t.crossings[h]}1e4===c&&n.log("Infinite loop in contour?");var x,b,_,w,k,M,A,T,S,E,C,L,z,P,I,O=a(d[0],d[d.length-1],o,l),D=0,R=.2*t.smoothing,B=[],F=0;for(c=1;c<d.length;c++)L=d[c],z=d[c-1],void 0,void 0,P=L[2]-z[2],I=L[3]-z[3],D+=A=Math.sqrt(P*P+I*I),B.push(A);var N=D/B.length*R;function j(t){return d[t%d.length]}for(c=d.length-2;c>=F;c--)if((x=B[c])<N){for(_=0,b=c-1;b>=F&&x+B[b]<N;b--)x+=B[b];if(O&&c===d.length-2)for(_=0;_<b&&x+B[_]<N;_++)x+=B[_];k=c-b+_+1,M=Math.floor((c+b+_+2)/2),w=O||c!==d.length-2?O||-1!==b?k%2?j(M):[(j(M)[0]+j(M+1)[0])/2,(j(M)[1]+j(M+1)[1])/2]:d[0]:d[d.length-1],d.splice(b+1,c-b+1,w),c=b+1,_&&(F=_),O&&(c===d.length-2?d[_]=d[d.length-1]:0===c&&(d[d.length-1]=d[0]))}for(d.splice(0,F),c=0;c<d.length;c++)d[c].length=2;if(!(d.length<2))if(O)d.pop(),t.paths.push(d);else{r||n.log("Unclosed interior contour?",t.level,u,d.join("L"));var V=!1;for(T=0;T<t.edgepaths.length;T++)if(E=t.edgepaths[T],!V&&a(E[0],d[d.length-1],o,l)){d.pop(),V=!0;var U=!1;for(S=0;S<t.edgepaths.length;S++)if(a((C=t.edgepaths[S])[C.length-1],d[0],o,l)){U=!0,d.shift(),t.edgepaths.splice(T,1),S===T?t.paths.push(d.concat(C)):(S>T&&S--,t.edgepaths[S]=C.concat(d,E));break}U||(t.edgepaths[T]=d.concat(E))}for(T=0;T<t.edgepaths.length&&!V;T++)a((E=t.edgepaths[T])[E.length-1],d[0],o,l)&&(d.shift(),t.edgepaths[T]=E.concat(d),V=!0);V||t.edgepaths.push(d)}}function s(t,e,r){var n=e[0]+Math.max(r[0],0),i=e[1]+Math.max(r[1],0),a=t.z[i][n],o=t.xaxis,s=t.yaxis;if(r[1]){var l=(t.level-a)/(t.z[i][n+1]-a);return[o.c2p((1-l)*t.x[n]+l*t.x[n+1],!0),s.c2p(t.y[i],!0),n+l,i]}var c=(t.level-a)/(t.z[i+1][n]-a);return[o.c2p(t.x[n],!0),s.c2p((1-c)*t.y[i]+c*t.y[i+1],!0),n,i+c]}e.exports=function(t,e,r){var i,a,s,l;for(e=e||.01,r=r||.01,a=0;a<t.length;a++){for(s=t[a],l=0;l<s.starts.length;l++)o(s,s.starts[l],"edge",e,r);for(i=0;Object.keys(s.crossings).length&&i<1e4;)i++,o(s,Object.keys(s.crossings)[0].split(",").map(Number),void 0,e,r);1e4===i&&n.log("Infinite loop in contour?")}}},{"../../lib":684,"./constants":900}],909:[function(t,e,r){"use strict";var n=t("../../components/color"),i=t("../heatmap/hover");e.exports=function(t,e,r,a,o){var s=i(t,e,r,a,o,!0);return s&&s.forEach(function(t){var e=t.trace;"constraint"===e.contours.type&&(e.fillcolor&&n.opacity(e.fillcolor)?t.color=n.addOpacity(e.fillcolor,1):e.contours.showlines&&n.opacity(e.line.color)&&(t.color=n.addOpacity(e.line.color,1)))}),s}},{"../../components/color":558,"../heatmap/hover":932}],910:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.calc=t("./calc"),n.plot=t("./plot").plot,n.style=t("./style"),n.colorbar=t("./colorbar"),n.hoverPoints=t("./hover"),n.moduleType="trace",n.name="contour",n.basePlotModule=t("../../plots/cartesian"),n.categories=["cartesian","svg","2dMap","contour","showLegend"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"./attributes":896,"./calc":897,"./colorbar":899,"./defaults":905,"./hover":909,"./plot":914,"./style":916}],911:[function(t,e,r){"use strict";var n=t("../../lib");e.exports=function(t,e,r,i){if(i||(i={}),t("contours.showlabels")){var a=e.font;n.coerceFont(t,"contours.labelfont",{family:a.family,size:a.size,color:r}),t("contours.labelformat")}!1!==i.hasHover&&t("zhoverformat")}},{"../../lib":684}],912:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/colorscale"),a=t("./end_plus");e.exports=function(t){var e=t.contours,r=e.start,o=a(e),s=e.size||1,l=Math.floor((o-r)/s)+1,c="lines"===e.coloring?0:1;isFinite(s)||(s=1,l=1);var u,h,f=t.colorscale,p=f.length,d=new Array(p),g=new Array(p);if("heatmap"===e.coloring){for(t.zauto&&!1===t.autocontour&&(t.zmin=r-s/2,t.zmax=t.zmin+l*s),h=0;h<p;h++)u=f[h],d[h]=u[0]*(t.zmax-t.zmin)+t.zmin,g[h]=u[1];var m=n.extent([t.zmin,t.zmax,e.start,e.start+s*(l-1)]),v=m[t.zmin<t.zmax?0:1],y=m[t.zmin<t.zmax?1:0];v!==t.zmin&&(d.splice(0,0,v),g.splice(0,0,Range[0])),y!==t.zmax&&(d.push(y),g.push(g[g.length-1]))}else for(h=0;h<p;h++)u=f[h],d[h]=(u[0]*(l+c-1)-c/2)*s+r,g[h]=u[1];return i.makeColorScaleFunc({domain:d,range:g},{noNumericCheck:!0})}},{"../../components/colorscale":573,"./end_plus":907,d3:147}],913:[function(t,e,r){"use strict";var n=t("./constants");function i(t,e){var r=(e[0][0]>t?0:1)+(e[0][1]>t?0:2)+(e[1][1]>t?0:4)+(e[1][0]>t?0:8);return 5===r||10===r?t>(e[0][0]+e[0][1]+e[1][0]+e[1][1])/4?5===r?713:1114:5===r?104:208:15===r?0:r}e.exports=function(t){var e,r,a,o,s,l,c,u,h,f=t[0].z,p=f.length,d=f[0].length,g=2===p||2===d;for(r=0;r<p-1;r++)for(o=[],0===r&&(o=o.concat(n.BOTTOMSTART)),r===p-2&&(o=o.concat(n.TOPSTART)),e=0;e<d-1;e++)for(a=o.slice(),0===e&&(a=a.concat(n.LEFTSTART)),e===d-2&&(a=a.concat(n.RIGHTSTART)),s=e+","+r,l=[[f[r][e],f[r][e+1]],[f[r+1][e],f[r+1][e+1]]],h=0;h<t.length;h++)(c=i((u=t[h]).level,l))&&(u.crossings[s]=c,-1!==a.indexOf(c)&&(u.starts.push([e,r]),g&&-1!==a.indexOf(c,a.indexOf(c)+1)&&u.starts.push([e,r])))}},{"./constants":900}],914:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../lib"),a=t("../../components/drawing"),o=t("../../lib/svg_text_utils"),s=t("../../plots/cartesian/axes"),l=t("../../plots/cartesian/set_convert"),c=t("../../plots/get_data").getUidsFromCalcData,u=t("../heatmap/plot"),h=t("./make_crossings"),f=t("./find_all_paths"),p=t("./empty_pathinfo"),d=t("./convert_to_constraints"),g=t("./close_boundaries"),m=t("./constants"),v=m.LABELOPTIMIZER;function y(t,e,o,s){var l=o[0].trace,c=o[0].x,v=o[0].y,y=l.contours,b="contour"+l.uid,_=e.xaxis,w=e.yaxis,k=t._fullLayout,M=p(y,e,o[0]),A=i.ensureSingle(s,"g","heatmapcoloring"),T=[];"heatmap"===y.coloring&&(l.zauto&&!1===l.autocontour&&(l._input.zmin=l.zmin=y.start-y.size/2,l._input.zmax=l.zmax=l.zmin+M.length*y.size),T=[o]),u(t,e,T,A),h(M),f(M);var S=_.c2p(c[0],!0),E=_.c2p(c[c.length-1],!0),C=w.c2p(v[0],!0),L=w.c2p(v[v.length-1],!0),z=[[S,L],[E,L],[E,C],[S,C]],P=M;"constraint"===y.type&&(P=d(M,y._operation),g(P,y._operation,z,l));var I=r.makeContourGroup(s,o,b);!function(t,e,r){var n=i.ensureSingle(t,"g","contourbg").selectAll("path").data("fill"===r.coloring?[0]:[]);n.enter().append("path"),n.exit().remove(),n.attr("d","M"+e.join("L")+"Z").style("stroke","none")}(I,z,y),function(t,e,r,a){var o=i.ensureSingle(t,"g","contourfill").selectAll("path").data("fill"===a.coloring||"constraint"===a.type&&"="!==a._operation?e:[]);o.enter().append("path"),o.exit().remove(),o.each(function(t){var e=x(t,r);e?n.select(this).attr("d",e).style("stroke","none"):n.select(this).remove()})}(I,P,z,y),function(t,e,o,s,l,c){var u=i.ensureSingle(t,"g","contourlines"),h=!1!==l.showlines,f=l.showlabels,p=h&&f,d=r.createLines(u,h||f,e),g=r.createLineClip(u,p,o._fullLayout._clips,s.trace.uid),v=t.selectAll("g.contourlabels").data(f?[0]:[]);if(v.exit().remove(),v.enter().append("g").classed("contourlabels",!0),f){var y=[c],x=[];i.clearLocationCache();var b=r.labelFormatter(l,s.t.cb,o._fullLayout),_=a.tester.append("text").attr("data-notex",1).call(a.font,l.labelfont),w=e[0].xaxis._length,k=e[0].yaxis._length,M={left:Math.max(c[0][0],0),right:Math.min(c[2][0],w),top:Math.max(c[0][1],0),bottom:Math.min(c[2][1],k)};M.middle=(M.top+M.bottom)/2,M.center=(M.left+M.right)/2;var A=Math.sqrt(w*w+k*k),T=m.LABELDISTANCE*A/Math.max(1,e.length/m.LABELINCREASE);d.each(function(t){var e=r.calcTextOpts(t.level,b,_,o);n.select(this).selectAll("path").each(function(){var t=i.getVisibleSegment(this,M,e.height/2);if(t&&!(t.len<(e.width+e.height)*m.LABELMIN))for(var n=Math.min(Math.ceil(t.len/T),m.LABELMAX),a=0;a<n;a++){var o=r.findBestTextLocation(this,t,e,x,M);if(!o)break;r.addLabelData(o,e,x,y)}})}),_.remove(),r.drawLabels(v,x,o,g,p?y:null)}f&&!h&&d.remove()}(I,M,t,o[0],y,z),function(t,e,r,n,o){var s="clip"+n.trace.uid,l=r.selectAll("#"+s).data(n.trace.connectgaps?[]:[0]);if(l.enter().append("clipPath").classed("contourclip",!0).attr("id",s),l.exit().remove(),!1===n.trace.connectgaps){var c={level:.9,crossings:{},starts:[],edgepaths:[],paths:[],xaxis:e.xaxis,yaxis:e.yaxis,x:n.x,y:n.y,z:function(t){var e,r,n=t.trace._emptypoints,i=[],a=t.z.length,o=t.z[0].length,s=[];for(e=0;e<o;e++)s.push(1);for(e=0;e<a;e++)i.push(s.slice());for(e=0;e<n.length;e++)r=n[e],i[r[0]][r[1]]=0;return t.zmask=i,i}(n),smoothing:0};h([c]),f([c]);var u=x(c,o),p=i.ensureSingle(l,"path","");p.attr("d",u)}else s=null;t.call(a.setClipUrl,s),e.plot.selectAll(".hm"+n.trace.uid).call(a.setClipUrl,s)}(I,e,k._clips,o[0],z)}function x(t,e){var r,n,o,s,l,c,u,h=function(t,e){var r=t.prefixBoundary;if(void 0===r){var n=Math.min(t.z[0][0],t.z[0][1]);r=!t.edgepaths.length&&n>t.level}return r?"M"+e.join("L")+"Z":""}(t,e),f=0,p=t.edgepaths.map(function(t,e){return e}),d=!0;function g(t){return Math.abs(t[1]-e[2][1])<.01}function m(t){return Math.abs(t[0]-e[0][0])<.01}function v(t){return Math.abs(t[0]-e[2][0])<.01}for(;p.length;){for(c=a.smoothopen(t.edgepaths[f],t.smoothing),h+=d?c:c.replace(/^M/,"L"),p.splice(p.indexOf(f),1),r=t.edgepaths[f][t.edgepaths[f].length-1],s=-1,o=0;o<4;o++){if(!r){i.log("Missing end?",f,t);break}for(u=r,Math.abs(u[1]-e[0][1])<.01&&!v(r)?n=e[1]:m(r)?n=e[0]:g(r)?n=e[3]:v(r)&&(n=e[2]),l=0;l<t.edgepaths.length;l++){var y=t.edgepaths[l][0];Math.abs(r[0]-n[0])<.01?Math.abs(r[0]-y[0])<.01&&(y[1]-r[1])*(n[1]-y[1])>=0&&(n=y,s=l):Math.abs(r[1]-n[1])<.01?Math.abs(r[1]-y[1])<.01&&(y[0]-r[0])*(n[0]-y[0])>=0&&(n=y,s=l):i.log("endpt to newendpt is not vert. or horz.",r,n,y)}if(r=n,s>=0)break;h+="L"+n}if(s===t.edgepaths.length){i.log("unclosed perimeter path");break}f=s,(d=-1===p.indexOf(f))&&(f=p[0],h+="Z")}for(f=0;f<t.paths.length;f++)h+=a.smoothclosed(t.paths[f],t.smoothing);return h}function b(t,e,r,n){var a=e.width/2,o=e.height/2,s=t.x,l=t.y,c=t.theta,u=Math.cos(c)*a,h=Math.sin(c)*a,f=(s>n.center?n.right-s:s-n.left)/(u+Math.abs(Math.sin(c)*o)),p=(l>n.middle?n.bottom-l:l-n.top)/(Math.abs(h)+Math.cos(c)*o);if(f<1||p<1)return 1/0;var d=v.EDGECOST*(1/(f-1)+1/(p-1));d+=v.ANGLECOST*c*c;for(var g=s-u,m=l-h,y=s+u,x=l+h,b=0;b<r.length;b++){var _=r[b],w=Math.cos(_.theta)*_.width/2,k=Math.sin(_.theta)*_.width/2,M=2*i.segmentDistance(g,m,y,x,_.x-w,_.y-k,_.x+w,_.y+k)/(e.height+_.height),A=_.level===e.level,T=A?v.SAMELEVELDISTANCE:1;if(M<=T)return 1/0;d+=v.NEIGHBORCOST*(A?v.SAMELEVELFACTOR:1)/(M-T)}return d}r.plot=function(t,e,r,i){var a=c(r);i.selectAll("g.contour").each(function(t){a[t.trace.uid]||n.select(this).remove()});for(var o=0;o<r.length;o++)y(t,e,r[o],i)},r.makeContourGroup=function(t,e,r){var n=t.selectAll("g.contour."+r).data(e);return n.enter().append("g").classed("contour",!0).classed(r,!0),n.exit().remove(),n},r.createLines=function(t,e,r){var n=r[0].smoothing,i=t.selectAll("g.contourlevel").data(e?r:[]);if(i.exit().remove(),i.enter().append("g").classed("contourlevel",!0),e){var o=i.selectAll("path.openline").data(function(t){return t.pedgepaths||t.edgepaths});o.exit().remove(),o.enter().append("path").classed("openline",!0),o.attr("d",function(t){return a.smoothopen(t,n)}).style("stroke-miterlimit",1).style("vector-effect","non-scaling-stroke");var s=i.selectAll("path.closedline").data(function(t){return t.ppaths||t.paths});s.exit().remove(),s.enter().append("path").classed("closedline",!0),s.attr("d",function(t){return a.smoothclosed(t,n)}).style("stroke-miterlimit",1).style("vector-effect","non-scaling-stroke")}return i},r.createLineClip=function(t,e,r,n){var i=e?"clipline"+n:null,o=r.selectAll("#"+i).data(e?[0]:[]);return o.exit().remove(),o.enter().append("clipPath").classed("contourlineclip",!0).attr("id",i),a.setClipUrl(t,i),o},r.labelFormatter=function(t,e,r){if(t.labelformat)return r._d3locale.numberFormat(t.labelformat);var n;if(e)n=e.axis;else{if(n={type:"linear",_id:"ycontour",showexponent:"all",exponentformat:"B"},"constraint"===t.type){var i=t.value;Array.isArray(i)?n.range=[i[0],i[i.length-1]]:n.range=[i,i]}else n.range=[t.start,t.end],n.nticks=(t.end-t.start)/t.size;n.range[0]===n.range[1]&&(n.range[1]+=n.range[0]||1),n.nticks||(n.nticks=1e3),l(n,r),s.prepTicks(n),n._tmin=null,n._tmax=null}return function(t){return s.tickText(n,t).text}},r.calcTextOpts=function(t,e,r,n){var i=e(t);r.text(i).call(o.convertToTspans,n);var s=a.bBox(r.node(),!0);return{text:i,width:s.width,height:s.height,level:t,dy:(s.top+s.bottom)/2}},r.findBestTextLocation=function(t,e,r,n,a){var o,s,l,c,u,h=r.width;e.isClosed?(s=e.len/v.INITIALSEARCHPOINTS,o=e.min+s/2,l=e.max):(s=(e.len-h)/(v.INITIALSEARCHPOINTS+1),o=e.min+s+h/2,l=e.max-(s+h)/2);for(var f=1/0,p=0;p<v.ITERATIONS;p++){for(var d=o;d<l;d+=s){var g=i.getTextLocation(t,e.total,d,h),m=b(g,r,n,a);m<f&&(f=m,u=g,c=d)}if(f>2*v.MAXCOST)break;p&&(s/=2),l=(o=c-s/2)+1.5*s}if(f<=v.MAXCOST)return u},r.addLabelData=function(t,e,r,n){var i=e.width/2,a=e.height/2,o=t.x,s=t.y,l=t.theta,c=Math.sin(l),u=Math.cos(l),h=i*u,f=a*c,p=i*c,d=-a*u,g=[[o-h-f,s-p-d],[o+h-f,s+p-d],[o+h+f,s+p+d],[o-h+f,s-p+d]];r.push({text:e.text,x:o,y:s,dy:e.dy,theta:l,level:e.level,width:e.width,height:e.height}),n.push(g)},r.drawLabels=function(t,e,r,a,s){var l=t.selectAll("text").data(e,function(t){return t.text+","+t.x+","+t.y+","+t.theta});if(l.exit().remove(),l.enter().append("text").attr({"data-notex":1,"text-anchor":"middle"}).each(function(t){var e=t.x+Math.sin(t.theta)*t.dy,i=t.y-Math.cos(t.theta)*t.dy;n.select(this).text(t.text).attr({x:e,y:i,transform:"rotate("+180*t.theta/Math.PI+" "+e+" "+i+")"}).call(o.convertToTspans,r)}),s){for(var c="",u=0;u<s.length;u++)c+="M"+s[u].join("L")+"Z";i.ensureSingle(a,"path","").attr("d",c)}}},{"../../components/drawing":583,"../../lib":684,"../../lib/svg_text_utils":708,"../../plots/cartesian/axes":732,"../../plots/cartesian/set_convert":750,"../../plots/get_data":768,"../heatmap/plot":937,"./close_boundaries":898,"./constants":900,"./convert_to_constraints":904,"./empty_pathinfo":906,"./find_all_paths":908,"./make_crossings":913,d3:147}],915:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/axes"),i=t("../../lib");function a(t,e,r){var i={type:"linear",range:[t,e]};return n.autoTicks(i,(e-t)/(r||15)),i}e.exports=function(t){var e=t.contours;if(t.autocontour){var r=t.zmin,o=t.zmax;void 0!==r&&void 0!==o||(r=i.aggNums(Math.min,null,t._z),o=i.aggNums(Math.max,null,t._z));var s=a(r,o,t.ncontours);e.size=s.dtick,e.start=n.tickFirst(s),s.range.reverse(),e.end=n.tickFirst(s),e.start===r&&(e.start+=e.size),e.end===o&&(e.end-=e.size),e.start>e.end&&(e.start=e.end=(e.start+e.end)/2),t._input.contours||(t._input.contours={}),i.extendFlat(t._input.contours,{start:e.start,end:e.end,size:e.size}),t._input.autocontour=!0}else if("constraint"!==e.type){var l,c=e.start,u=e.end,h=t._input.contours;if(c>u&&(e.start=h.start=u,u=e.end=h.end=c,c=e.start),!(e.size>0))l=c===u?1:a(c,u,t.ncontours).dtick,h.size=e.size=l}}},{"../../lib":684,"../../plots/cartesian/axes":732}],916:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/drawing"),a=t("../heatmap/style"),o=t("./make_color_map");e.exports=function(t){var e=n.select(t).selectAll("g.contour");e.style("opacity",function(t){return t.trace.opacity}),e.each(function(t){var e=n.select(this),r=t.trace,a=r.contours,s=r.line,l=a.size||1,c=a.start,u="constraint"===a.type,h=!u&&"lines"===a.coloring,f=!u&&"fill"===a.coloring,p=h||f?o(r):null;e.selectAll("g.contourlevel").each(function(t){n.select(this).selectAll("path").call(i.lineGroupStyle,s.width,h?p(t.level):s.color,s.dash)});var d=a.labelfont;if(e.selectAll("g.contourlabels text").each(function(t){i.font(n.select(this),{family:d.family,size:d.size,color:d.color||(h?p(t.level):s.color)})}),u)e.selectAll("g.contourfill path").style("fill",r.fillcolor);else if(f){var g;e.selectAll("g.contourfill path").style("fill",function(t){return void 0===g&&(g=t.level),p(t.level+.5*l)}),void 0===g&&(g=c),e.selectAll("g.contourbg path").style("fill",p(g-.5*l))}}),a(t)}},{"../../components/drawing":583,"../heatmap/style":938,"./make_color_map":912,d3:147}],917:[function(t,e,r){"use strict";var n=t("../../components/colorscale/defaults"),i=t("./label_defaults");e.exports=function(t,e,r,a,o){var s,l=r("contours.coloring"),c="";"fill"===l&&(s=r("contours.showlines")),!1!==s&&("lines"!==l&&(c=r("line.color","#000")),r("line.width",.5),r("line.dash")),"none"!==l&&n(t,e,a,r,{prefix:"",cLetter:"z"}),r("line.smoothing"),i(r,a,c,o)}},{"../../components/colorscale/defaults":568,"./label_defaults":911}],918:[function(t,e,r){"use strict";var n=t("../heatmap/attributes"),i=t("../contour/attributes"),a=i.contours,o=t("../scatter/attributes"),s=t("../../components/colorscale/attributes"),l=t("../../components/colorbar/attributes"),c=t("../../lib/extend").extendFlat,u=o.line;e.exports=c({carpet:{valType:"string",editType:"calc"},z:n.z,a:n.x,a0:n.x0,da:n.dx,b:n.y,b0:n.y0,db:n.dy,text:n.text,transpose:n.transpose,atype:n.xtype,btype:n.ytype,fillcolor:i.fillcolor,autocontour:i.autocontour,ncontours:i.ncontours,contours:{type:a.type,start:a.start,end:a.end,size:a.size,coloring:{valType:"enumerated",values:["fill","lines","none"],dflt:"fill",editType:"calc"},showlines:a.showlines,showlabels:a.showlabels,labelfont:a.labelfont,labelformat:a.labelformat,operation:a.operation,value:a.value,editType:"calc",impliedEdits:{autocontour:!1}},line:{color:c({},u.color,{}),width:u.width,dash:u.dash,smoothing:c({},u.smoothing,{}),editType:"plot"}},s("",{cLetter:"z",autoColorDflt:!1}),{colorbar:l})},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../contour/attributes":896,"../heatmap/attributes":925,"../scatter/attributes":1015}],919:[function(t,e,r){"use strict";var n=t("../../components/colorscale/calc"),i=t("../../lib").isArray1D,a=t("../heatmap/convert_column_xyz"),o=t("../heatmap/clean_2d_array"),s=t("../heatmap/max_row_length"),l=t("../heatmap/interp2d"),c=t("../heatmap/find_empties"),u=t("../heatmap/make_bound_array"),h=t("./defaults"),f=t("../carpet/lookup_carpetid"),p=t("../contour/set_contours");e.exports=function(t,e){var r=e._carpetTrace=f(t,e);if(r&&r.visible&&"legendonly"!==r.visible){if(!e.a||!e.b){var d=t.data[r.index],g=t.data[e.index];g.a||(g.a=d.a),g.b||(g.b=d.b),h(g,e,e._defaultColor,t._fullLayout)}var m=function(t,e){var r,h,f,p,d,g,m,v=e._carpetTrace,y=v.aaxis,x=v.baxis;y._minDtick=0,x._minDtick=0,i(e.z)&&a(e,y,x,"a","b",["z"]);r=e._a=e._a||e.a,p=e._b=e._b||e.b,r=r?y.makeCalcdata(e,"_a"):[],p=p?x.makeCalcdata(e,"_b"):[],h=e.a0||0,f=e.da||1,d=e.b0||0,g=e.db||1,m=e._z=o(e._z||e.z,e.transpose),e._emptypoints=c(m),l(m,e._emptypoints);var b=s(m),_="scaled"===e.xtype?"":r,w=u(e,_,h,f,b,y),k="scaled"===e.ytype?"":p,M=u(e,k,d,g,m.length,x),A={a:w,b:M,z:m};"levels"===e.contours.type&&"none"!==e.contours.coloring&&n(e,m,"","z");return[A]}(0,e);return p(e),m}}},{"../../components/colorscale/calc":566,"../../lib":684,"../carpet/lookup_carpetid":874,"../contour/set_contours":915,"../heatmap/clean_2d_array":927,"../heatmap/convert_column_xyz":929,"../heatmap/find_empties":931,"../heatmap/interp2d":934,"../heatmap/make_bound_array":935,"../heatmap/max_row_length":936,"./defaults":920}],920:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../heatmap/xyz_defaults"),a=t("./attributes"),o=t("../contour/constraint_defaults"),s=t("../contour/contours_defaults"),l=t("../contour/style_defaults");e.exports=function(t,e,r,c){function u(r,i){return n.coerce(t,e,a,r,i)}if(u("carpet"),t.a&&t.b){if(!i(t,e,u,c,"a","b"))return void(e.visible=!1);u("text");var h="constraint"===u("contours.type");h||delete e.showlegend,h?o(t,e,u,c,r,{hasHover:!1}):(s(t,e,u,function(r){return n.coerce2(t,e,a,r)}),l(t,e,u,c,{hasHover:!1}))}else e._defaultColor=r,e._length=null}},{"../../lib":684,"../contour/constraint_defaults":901,"../contour/contours_defaults":903,"../contour/style_defaults":917,"../heatmap/xyz_defaults":940,"./attributes":918}],921:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.colorbar=t("../contour/colorbar"),n.calc=t("./calc"),n.plot=t("./plot"),n.style=t("../contour/style"),n.moduleType="trace",n.name="contourcarpet",n.basePlotModule=t("../../plots/cartesian"),n.categories=["cartesian","svg","carpet","contour","symbols","showLegend","hasLines","carpetDependent"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"../contour/colorbar":899,"../contour/style":916,"./attributes":918,"./calc":919,"./defaults":920,"./plot":924}],922:[function(t,e,r){"use strict";var n=t("../../components/drawing"),i=t("../carpet/axis_aligned_line"),a=t("../../lib");e.exports=function(t,e,r,o,s,l,c,u){var h,f,p,d,g,m,v,y="",x=e.edgepaths.map(function(t,e){return e}),b=!0,_=1e-4*Math.abs(r[0][0]-r[2][0]),w=1e-4*Math.abs(r[0][1]-r[2][1]);function k(t){return Math.abs(t[1]-r[0][1])<w}function M(t){return Math.abs(t[1]-r[2][1])<w}function A(t){return Math.abs(t[0]-r[0][0])<_}function T(t){return Math.abs(t[0]-r[2][0])<_}function S(t,e){var r,n,a,o,h="";for(k(t)&&!T(t)||M(t)&&!A(t)?(o=s.aaxis,a=i(s,l,[t[0],e[0]],.5*(t[1]+e[1]))):(o=s.baxis,a=i(s,l,.5*(t[0]+e[0]),[t[1],e[1]])),r=1;r<a.length;r++)for(h+=o.smoothing?"C":"L",n=0;n<a[r].length;n++){var f=a[r][n];h+=[c.c2p(f[0]),u.c2p(f[1])]+" "}return h}for(h=0,f=null;x.length;){var E=e.edgepaths[h][0];for(f&&(y+=S(f,E)),v=n.smoothopen(e.edgepaths[h].map(o),e.smoothing),y+=b?v:v.replace(/^M/,"L"),x.splice(x.indexOf(h),1),f=e.edgepaths[h][e.edgepaths[h].length-1],g=-1,d=0;d<4;d++){if(!f){a.log("Missing end?",h,e);break}for(k(f)&&!T(f)?p=r[1]:A(f)?p=r[0]:M(f)?p=r[3]:T(f)&&(p=r[2]),m=0;m<e.edgepaths.length;m++){var C=e.edgepaths[m][0];Math.abs(f[0]-p[0])<_?Math.abs(f[0]-C[0])<_&&(C[1]-f[1])*(p[1]-C[1])>=0&&(p=C,g=m):Math.abs(f[1]-p[1])<w?Math.abs(f[1]-C[1])<w&&(C[0]-f[0])*(p[0]-C[0])>=0&&(p=C,g=m):a.log("endpt to newendpt is not vert. or horz.",f,p,C)}if(g>=0)break;y+=S(f,p),f=p}if(g===e.edgepaths.length){a.log("unclosed perimeter path");break}h=g,(b=-1===x.indexOf(h))&&(h=x[0],y+=S(f,p)+"Z",f=null)}for(h=0;h<e.paths.length;h++)y+=n.smoothclosed(e.paths[h].map(o),e.smoothing);return y}},{"../../components/drawing":583,"../../lib":684,"../carpet/axis_aligned_line":858}],923:[function(t,e,r){"use strict";e.exports=function(t,e){var r,n,i,a,o,s,l,c,u;for(r=0;r<t.length;r++){for(o=(a=t[r]).pedgepaths=[],s=a.ppaths=[],n=0;n<a.edgepaths.length;n++){for(u=a.edgepaths[n],l=[],i=0;i<u.length;i++)l[i]=e(u[i]);o.push(l)}for(n=0;n<a.paths.length;n++){for(u=a.paths[n],c=[],i=0;i<u.length;i++)c[i]=e(u[i]);s.push(c)}}}},{}],924:[function(t,e,r){"use strict";var n=t("d3"),i=t("../carpet/map_1d_array"),a=t("../carpet/makepath"),o=t("../../components/drawing"),s=t("../../lib"),l=t("../../plots/get_data").getUidsFromCalcData,c=t("../contour/make_crossings"),u=t("../contour/find_all_paths"),h=t("../contour/plot"),f=t("../contour/constants"),p=t("../contour/convert_to_constraints"),d=t("./join_all_paths"),g=t("../contour/empty_pathinfo"),m=t("./map_pathinfo"),v=t("../carpet/lookup_carpetid"),y=t("../contour/close_boundaries");function x(t,e,r,l){var x=r[0].trace,k=x._carpetTrace=v(t,x),M=t.calcdata[k.index][0];if(k.visible&&"legendonly"!==k.visible){var A=r[0].a,T=r[0].b,S=x.contours,E=x.uid,C=e.xaxis,L=e.yaxis,z="contour"+E,P=g(S,e,r[0]),I="constraint"===S.type,O=S._operation,D=I?"="===O?"lines":"fill":S.coloring,R=[[A[0],T[T.length-1]],[A[A.length-1],T[T.length-1]],[A[A.length-1],T[0]],[A[0],T[0]]];c(P);var B=1e-8*(A[A.length-1]-A[0]),F=1e-8*(T[T.length-1]-T[0]);u(P,B,F);var N=P;"constraint"===S.type&&(N=p(P,O),y(N,O,R,x)),m(P,Y);var j,V,U,q,H=h.makeContourGroup(l,r,z),G=[];for(q=M.clipsegments.length-1;q>=0;q--)j=M.clipsegments[q],V=i([],j.x,C.c2p),U=i([],j.y,L.c2p),V.reverse(),U.reverse(),G.push(a(V,U,j.bicubic));var W="M"+G.join("L")+"Z";!function(t,e,r,n,o,l){var c,u,h,f,p=s.ensureSingle(t,"g","contourbg").selectAll("path").data("fill"!==l||o?[]:[0]);p.enter().append("path"),p.exit().remove();var d=[];for(f=0;f<e.length;f++)c=e[f],u=i([],c.x,r.c2p),h=i([],c.y,n.c2p),d.push(a(u,h,c.bicubic));p.attr("d","M"+d.join("L")+"Z").style("stroke","none")}(H,M.clipsegments,C,L,I,D),function(t,e,r,i,a,o,l,c,u,h,f){var p=s.ensureSingle(e,"g","contourfill").selectAll("path").data("fill"===h?a:[]);p.enter().append("path"),p.exit().remove(),p.each(function(e){var a=d(t,e,o,l,c,u,r,i);e.prefixBoundary&&(a=f+a),a?n.select(this).attr("d",a).style("stroke","none"):n.select(this).remove()})}(x,H,C,L,N,R,Y,k,M,D,W),function(t,e,r,i,a,l,c){var u=s.ensureSingle(t,"g","contourlines"),p=!1!==a.showlines,d=a.showlabels,g=p&&d,m=h.createLines(u,p||d,e),v=h.createLineClip(u,g,r._fullLayout._defs,i.trace.uid),y=t.selectAll("g.contourlabels").data(d?[0]:[]);if(y.exit().remove(),y.enter().append("g").classed("contourlabels",!0),d){var x=l.xaxis,k=l.yaxis,M=x._length,A=k._length,T=[[[0,0],[M,0],[M,A],[0,A]]],S=[];s.clearLocationCache();var E=h.labelFormatter(a,i.t.cb,r._fullLayout),C=o.tester.append("text").attr("data-notex",1).call(o.font,a.labelfont),L={left:0,right:M,center:M/2,top:0,bottom:A,middle:A/2},z=Math.sqrt(M*M+A*A),P=f.LABELDISTANCE*z/Math.max(1,e.length/f.LABELINCREASE);m.each(function(t){var e=h.calcTextOpts(t.level,E,C,r);n.select(this).selectAll("path").each(function(r){var n=s.getVisibleSegment(this,L,e.height/2);if(n&&(function(t,e,r,n,i,a){for(var o,s=0;s<r.pedgepaths.length;s++)e===r.pedgepaths[s]&&(o=r.edgepaths[s]);if(!o)return;var l=i.a[0],c=i.a[i.a.length-1],u=i.b[0],h=i.b[i.b.length-1];function f(t,e){var r,n=0;return(Math.abs(t[0]-l)<.1||Math.abs(t[0]-c)<.1)&&(r=_(i.dxydb_rough(t[0],t[1],.1)),n=Math.max(n,a*w(e,r)/2)),(Math.abs(t[1]-u)<.1||Math.abs(t[1]-h)<.1)&&(r=_(i.dxyda_rough(t[0],t[1],.1)),n=Math.max(n,a*w(e,r)/2)),n}var p=b(t,0,1),d=b(t,n.total,n.total-1),g=f(o[0],p),m=n.total-f(o[o.length-1],d);n.min<g&&(n.min=g);n.max>m&&(n.max=m);n.len=n.max-n.min}(this,r,t,n,c,e.height),!(n.len<(e.width+e.height)*f.LABELMIN)))for(var i=Math.min(Math.ceil(n.len/P),f.LABELMAX),a=0;a<i;a++){var o=h.findBestTextLocation(this,n,e,S,L);if(!o)break;h.addLabelData(o,e,S,T)}})}),C.remove(),h.drawLabels(y,S,r,v,g?T:null)}d&&!p&&m.remove()}(H,P,t,r[0],S,e,k),o.setClipUrl(H,k._clipPathId)}function Y(t){var e=k.ab2xy(t[0],t[1],!0);return[C.c2p(e[0]),L.c2p(e[1])]}}function b(t,e,r){var n=t.getPointAtLength(e),i=t.getPointAtLength(r),a=i.x-n.x,o=i.y-n.y,s=Math.sqrt(a*a+o*o);return[a/s,o/s]}function _(t){var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]);return[t[0]/e,t[1]/e]}function w(t,e){var r=Math.abs(t[0]*e[0]+t[1]*e[1]);return Math.sqrt(1-r*r)/r}e.exports=function(t,e,r,i){var a=l(r);i.selectAll("g.contour").each(function(t){a[t.trace.uid]||n.select(this).remove()});for(var o=0;o<r.length;o++)x(t,e,r[o],i)}},{"../../components/drawing":583,"../../lib":684,"../../plots/get_data":768,"../carpet/lookup_carpetid":874,"../carpet/makepath":875,"../carpet/map_1d_array":876,"../contour/close_boundaries":898,"../contour/constants":900,"../contour/convert_to_constraints":904,"../contour/empty_pathinfo":906,"../contour/find_all_paths":908,"../contour/make_crossings":913,"../contour/plot":914,"./join_all_paths":922,"./map_pathinfo":923,d3:147}],925:[function(t,e,r){"use strict";var n=t("../scatter/attributes"),i=t("../../components/colorscale/attributes"),a=t("../../components/colorbar/attributes"),o=t("../../lib/extend").extendFlat;e.exports=o({z:{valType:"data_array",editType:"calc"},x:o({},n.x,{impliedEdits:{xtype:"array"}}),x0:o({},n.x0,{impliedEdits:{xtype:"scaled"}}),dx:o({},n.dx,{impliedEdits:{xtype:"scaled"}}),y:o({},n.y,{impliedEdits:{ytype:"array"}}),y0:o({},n.y0,{impliedEdits:{ytype:"scaled"}}),dy:o({},n.dy,{impliedEdits:{ytype:"scaled"}}),text:{valType:"data_array",editType:"calc"},transpose:{valType:"boolean",dflt:!1,editType:"calc"},xtype:{valType:"enumerated",values:["array","scaled"],editType:"calc+clearAxisTypes"},ytype:{valType:"enumerated",values:["array","scaled"],editType:"calc+clearAxisTypes"},zsmooth:{valType:"enumerated",values:["fast","best",!1],dflt:!1,editType:"calc"},connectgaps:{valType:"boolean",dflt:!1,editType:"calc"},xgap:{valType:"number",dflt:0,min:0,editType:"plot"},ygap:{valType:"number",dflt:0,min:0,editType:"plot"},zhoverformat:{valType:"string",dflt:"",editType:"none"}},i("",{cLetter:"z",autoColorDflt:!1}),{colorbar:a})},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../scatter/attributes":1015}],926:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib"),a=t("../../plots/cartesian/axes"),o=t("../histogram2d/calc"),s=t("../../components/colorscale/calc"),l=t("./convert_column_xyz"),c=t("./max_row_length"),u=t("./clean_2d_array"),h=t("./interp2d"),f=t("./find_empties"),p=t("./make_bound_array");e.exports=function(t,e){var r,d,g,m,v,y,x,b,_,w=a.getFromId(t,e.xaxis||"x"),k=a.getFromId(t,e.yaxis||"y"),M=n.traceIs(e,"contour"),A=n.traceIs(e,"histogram"),T=n.traceIs(e,"gl2d"),S=M?"best":e.zsmooth;if(w._minDtick=0,k._minDtick=0,A)r=(_=o(t,e)).x,d=_.x0,g=_.dx,m=_.y,v=_.y0,y=_.dy,x=_.z;else{var E=e.z;i.isArray1D(E)?(l(e,w,k,"x","y",["z"]),r=e._x,m=e._y,E=e._z):(r=e.x?w.makeCalcdata(e,"x"):[],m=e.y?k.makeCalcdata(e,"y"):[]),d=e.x0||0,g=e.dx||1,v=e.y0||0,y=e.dy||1,x=u(E,e.transpose),(M||e.connectgaps)&&(e._emptypoints=f(x),h(x,e._emptypoints))}function C(t){S=e._input.zsmooth=e.zsmooth=!1,i.warn('cannot use zsmooth: "fast": '+t)}if("fast"===S)if("log"===w.type||"log"===k.type)C("log axis found");else if(!A){if(r.length){var L=(r[r.length-1]-r[0])/(r.length-1),z=Math.abs(L/100);for(b=0;b<r.length-1;b++)if(Math.abs(r[b+1]-r[b]-L)>z){C("x scale is not linear");break}}if(m.length&&"fast"===S){var P=(m[m.length-1]-m[0])/(m.length-1),I=Math.abs(P/100);for(b=0;b<m.length-1;b++)if(Math.abs(m[b+1]-m[b]-P)>I){C("y scale is not linear");break}}}var O=c(x),D="scaled"===e.xtype?"":r,R=p(e,D,d,g,O,w),B="scaled"===e.ytype?"":m,F=p(e,B,v,y,x.length,k);T||(a.expand(w,R),a.expand(k,F));var N={x:R,y:F,z:x,text:e._text||e.text};if(D&&D.length===R.length-1&&(N.xCenter=D),B&&B.length===F.length-1&&(N.yCenter=B),A&&(N.xRanges=_.xRanges,N.yRanges=_.yRanges,N.pts=_.pts),M&&"constraint"===e.contours.type||s(e,x,"","z"),M&&e.contours&&"heatmap"===e.contours.coloring){var j={type:"contour"===e.type?"heatmap":"histogram2d",xcalendar:e.xcalendar,ycalendar:e.ycalendar};N.xfill=p(j,D,d,g,O,w),N.yfill=p(j,B,v,y,x.length,k)}return[N]}},{"../../components/colorscale/calc":566,"../../lib":684,"../../plots/cartesian/axes":732,"../../registry":817,"../histogram2d/calc":957,"./clean_2d_array":927,"./convert_column_xyz":929,"./find_empties":931,"./interp2d":934,"./make_bound_array":935,"./max_row_length":936}],927:[function(t,e,r){"use strict";var n=t("fast-isnumeric");e.exports=function(t,e){var r,i,a,o,s,l;function c(t){if(n(t))return+t}if(e){for(r=0,s=0;s<t.length;s++)r=Math.max(r,t[s].length);if(0===r)return!1;a=function(t){return t.length},o=function(t,e,r){return t[r][e]}}else r=t.length,a=function(t,e){return t[e].length},o=function(t,e,r){return t[e][r]};var u=new Array(r);for(s=0;s<r;s++)for(i=a(t,s),u[s]=new Array(i),l=0;l<i;l++)u[s][l]=c(o(t,s,l));return u}},{"fast-isnumeric":214}],928:[function(t,e,r){"use strict";e.exports={min:"zmin",max:"zmax"}},{}],929:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../constants/numerical").BADNUM;e.exports=function(t,e,r,a,o,s){var l,c,u,h=t._length,f=t[a].slice(0,h),p=t[o].slice(0,h),d=t.text,g=void 0!==d&&n.isArray1D(d),m=t[a+"calendar"],v=t[o+"calendar"];for(l=0;l<h;l++)f[l]=e.d2c(f[l],0,m),p[l]=r.d2c(p[l],0,v);var y,x,b,_=n.distinctVals(f),w=_.vals,k=n.distinctVals(p),M=k.vals,A=[];for(l=0;l<s.length;l++)A[l]=n.init2dArray(M.length,w.length);for(g&&(b=n.init2dArray(M.length,w.length)),l=0;l<h;l++)if(f[l]!==i&&p[l]!==i){for(y=n.findBin(f[l]+_.minDiff/2,w),x=n.findBin(p[l]+k.minDiff/2,M),c=0;c<s.length;c++)u=t[s[c]],A[c][x][y]=u[l];g&&(b[x][y]=d[l])}for(t["_"+a]=w,t["_"+o]=M,c=0;c<s.length;c++)t["_"+s[c]]=A[c];g&&(t._text=b)}},{"../../constants/numerical":661,"../../lib":684}],930:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./xyz_defaults"),a=t("./style_defaults"),o=t("../../components/colorscale/defaults"),s=t("./attributes");e.exports=function(t,e,r,l){function c(r,i){return n.coerce(t,e,s,r,i)}i(t,e,c,l)?(c("text"),a(t,e,c,l),c("connectgaps",n.isArray1D(e.z)&&!1!==e.zsmooth),o(t,e,l,c,{prefix:"",cLetter:"z"})):e.visible=!1}},{"../../components/colorscale/defaults":568,"../../lib":684,"./attributes":925,"./style_defaults":939,"./xyz_defaults":940}],931:[function(t,e,r){"use strict";var n=t("./max_row_length");e.exports=function(t){var e,r,i,a,o,s,l,c,u=[],h={},f=[],p=t[0],d=[],g=[0,0,0],m=n(t);for(r=0;r<t.length;r++)for(e=d,d=p,p=t[r+1]||[],i=0;i<m;i++)void 0===d[i]&&((s=(void 0!==d[i-1]?1:0)+(void 0!==d[i+1]?1:0)+(void 0!==e[i]?1:0)+(void 0!==p[i]?1:0))?(0===r&&s++,0===i&&s++,r===t.length-1&&s++,i===d.length-1&&s++,s<4&&(h[[r,i]]=[r,i,s]),u.push([r,i,s])):f.push([r,i]));for(;f.length;){for(l={},c=!1,o=f.length-1;o>=0;o--)(s=((h[[(r=(a=f[o])[0])-1,i=a[1]]]||g)[2]+(h[[r+1,i]]||g)[2]+(h[[r,i-1]]||g)[2]+(h[[r,i+1]]||g)[2])/20)&&(l[a]=[r,i,s],f.splice(o,1),c=!0);if(!c)throw"findEmpties iterated with no new neighbors";for(a in l)h[a]=l[a],u.push(l[a])}return u.sort(function(t,e){return e[2]-t[2]})}},{"./max_row_length":936}],932:[function(t,e,r){"use strict";var n=t("../../components/fx"),i=t("../../lib"),a=t("../../plots/cartesian/axes");e.exports=function(t,e,r,o,s,l){var c,u,h,f,p=t.cd[0],d=p.trace,g=t.xa,m=t.ya,v=p.x,y=p.y,x=p.z,b=p.xCenter,_=p.yCenter,w=p.zmask,k=[d.zmin,d.zmax],M=d.zhoverformat,A=v,T=y;if(!1!==t.index){try{h=Math.round(t.index[1]),f=Math.round(t.index[0])}catch(e){return void i.error("Error hovering on heatmap, pointNumber must be [row,col], found:",t.index)}if(h<0||h>=x[0].length||f<0||f>x.length)return}else{if(n.inbox(e-v[0],e-v[v.length-1],0)>0||n.inbox(r-y[0],r-y[y.length-1],0)>0)return;if(l){var S;for(A=[2*v[0]-v[1]],S=1;S<v.length;S++)A.push((v[S]+v[S-1])/2);for(A.push([2*v[v.length-1]-v[v.length-2]]),T=[2*y[0]-y[1]],S=1;S<y.length;S++)T.push((y[S]+y[S-1])/2);T.push([2*y[y.length-1]-y[y.length-2]])}h=Math.max(0,Math.min(A.length-2,i.findBin(e,A))),f=Math.max(0,Math.min(T.length-2,i.findBin(r,T)))}var E=g.c2p(v[h]),C=g.c2p(v[h+1]),L=m.c2p(y[f]),z=m.c2p(y[f+1]);l?(C=E,c=v[h],z=L,u=y[f]):(c=b?b[h]:(v[h]+v[h+1])/2,u=_?_[f]:(y[f]+y[f+1])/2,d.zsmooth&&(E=C=g.c2p(c),L=z=m.c2p(u)));var P,I,O=x[f][h];w&&!w[f][h]&&(O=void 0),Array.isArray(p.text)&&Array.isArray(p.text[f])&&(P=p.text[f][h]);var D={type:"linear",range:k,hoverformat:M,_separators:g._separators,_numFormat:g._numFormat};return I=a.tickText(D,O,"hover").text,[i.extendFlat(t,{index:[f,h],distance:t.maxHoverDistance,spikeDistance:t.maxSpikeDistance,x0:E,x1:C,y0:L,y1:z,xLabelVal:c,yLabelVal:u,zLabelVal:O,zLabel:I,text:P})]}},{"../../components/fx":600,"../../lib":684,"../../plots/cartesian/axes":732}],933:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.calc=t("./calc"),n.plot=t("./plot"),n.colorbar=t("./colorbar"),n.style=t("./style"),n.hoverPoints=t("./hover"),n.moduleType="trace",n.name="heatmap",n.basePlotModule=t("../../plots/cartesian"),n.categories=["cartesian","svg","2dMap"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"./attributes":925,"./calc":926,"./colorbar":928,"./defaults":930,"./hover":932,"./plot":937,"./style":938}],934:[function(t,e,r){"use strict";var n=t("../../lib"),i=[[-1,0],[1,0],[0,-1],[0,1]];function a(t){return.5-.25*Math.min(1,.5*t)}function o(t,e,r){var n,a,o,s,l,c,u,h,f,p,d,g,m,v=0;for(s=0;s<e.length;s++){for(a=(n=e[s])[0],o=n[1],d=t[a][o],p=0,f=0,l=0;l<4;l++)(u=t[a+(c=i[l])[0]])&&void 0!==(h=u[o+c[1]])&&(0===p?g=m=h:(g=Math.min(g,h),m=Math.max(m,h)),f++,p+=h);if(0===f)throw"iterateInterp2d order is wrong: no defined neighbors";t[a][o]=p/f,void 0===d?f<4&&(v=1):(t[a][o]=(1+r)*t[a][o]-r*d,m>g&&(v=Math.max(v,Math.abs(t[a][o]-d)/(m-g))))}return v}e.exports=function(t,e){var r,i=1;for(o(t,e),r=0;r<e.length&&!(e[r][2]<4);r++);for(e=e.slice(r),r=0;r<100&&i>.01;r++)i=o(t,e,a(i));return i>.01&&n.log("interp2d didn't converge quickly",i),t}},{"../../lib":684}],935:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib").isArrayOrTypedArray;e.exports=function(t,e,r,a,o,s){var l,c,u,h=[],f=n.traceIs(t,"contour"),p=n.traceIs(t,"histogram"),d=n.traceIs(t,"gl2d");if(i(e)&&e.length>1&&!p&&"category"!==s.type){var g=e.length;if(!(g<=o))return f?e.slice(0,o):e.slice(0,o+1);if(f||d)h=e.slice(0,o);else if(1===o)h=[e[0]-.5,e[0]+.5];else{for(h=[1.5*e[0]-.5*e[1]],u=1;u<g;u++)h.push(.5*(e[u-1]+e[u]));h.push(1.5*e[g-1]-.5*e[g-2])}if(g<o){var m=h[h.length-1],v=m-h[h.length-2];for(u=g;u<o;u++)m+=v,h.push(m)}}else{c=a||1;var y=t[s._id.charAt(0)+"calendar"];for(l=p||"category"===s.type?s.r2c(r,0,y)||0:i(e)&&1===e.length?e[0]:void 0===r?0:s.d2c(r,0,y),u=f||d?0:-.5;u<o;u++)h.push(l+c*u)}return h}},{"../../lib":684,"../../registry":817}],936:[function(t,e,r){"use strict";e.exports=function(t){for(var e=0,r=0;r<t.length;r++)e=Math.max(e,t[r].length);return e}},{}],937:[function(t,e,r){"use strict";var n=t("d3"),i=t("tinycolor2"),a=t("../../registry"),o=t("../../lib"),s=t("../../components/colorscale"),l=t("../../constants/xmlns_namespaces"),c=t("../../plots/get_data").getUidsFromCalcData,u=t("./max_row_length");function h(t,e,r,n){var c,h,g,m,v,y,x=r[0],b=x.trace,_=e.xaxis,w=e.yaxis,k="hm"+b.uid,M=x.z,A=x.x,T=x.y,S=x.xCenter,E=x.yCenter,C=a.traceIs(b,"contour"),L=C?"best":b.zsmooth,z=M.length,P=u(M),I=!1,O=!1;for(y=0;void 0===c&&y<A.length-1;)c=_.c2p(A[y]),y++;for(y=A.length-1;void 0===h&&y>0;)h=_.c2p(A[y]),y--;for(h<c&&(g=h,h=c,c=g,I=!0),y=0;void 0===m&&y<T.length-1;)m=w.c2p(T[y]),y++;for(y=T.length-1;void 0===v&&y>0;)v=w.c2p(T[y]),y--;if(v<m&&(g=m,m=v,v=g,O=!0),C&&(S=A,E=T,A=x.xfill,T=x.yfill),"fast"!==L){var D="best"===L?0:.5;c=Math.max(-D*_._length,c),h=Math.min((1+D)*_._length,h),m=Math.max(-D*w._length,m),v=Math.min((1+D)*w._length,v)}var R=Math.round(h-c),B=Math.round(v-m),F=R<=0||B<=0,N=n.selectAll("g.hm."+k).data(F?[]:[0]);if(N.enter().append("g").classed("hm",!0).classed(k,!0),N.exit().remove(),!F){var j,V;"fast"===L?(j=P,V=z):(j=R,V=B);var U=document.createElement("canvas");U.width=j,U.height=V;var q,H,G=U.getContext("2d"),W=s.makeColorScaleFunc(s.extractScale(b.colorscale,b.zmin,b.zmax),{noNumericCheck:!0,returnArray:!0});"fast"===L?(q=I?function(t){return P-1-t}:o.identity,H=O?function(t){return z-1-t}:o.identity):(q=function(t){return o.constrain(Math.round(_.c2p(A[t])-c),0,R)},H=function(t){return o.constrain(Math.round(w.c2p(T[t])-m),0,B)});var Y,X,Z,$,J,K=H(0),Q=[K,K],tt=I?0:1,et=O?0:1,rt=0,nt=0,it=0,at=0;if(L){var ot,st=0;try{ot=new Uint8Array(R*B*4)}catch(t){ot=new Array(R*B*4)}if("best"===L){var lt,ct,ut,ht=S||A,ft=E||T,pt=new Array(ht.length),dt=new Array(ft.length),gt=new Array(R),mt=S?p:f,vt=E?p:f;for(y=0;y<ht.length;y++)pt[y]=Math.round(_.c2p(ht[y])-c);for(y=0;y<ft.length;y++)dt[y]=Math.round(w.c2p(ft[y])-m);for(y=0;y<R;y++)gt[y]=mt(y,pt);for(X=0;X<B;X++)for(ct=M[(lt=vt(X,dt)).bin0],ut=M[lt.bin1],y=0;y<R;y++,st+=4)d(ot,st,J=Et(ct,ut,gt[y],lt))}else for(X=0;X<z;X++)for($=M[X],Q=H(X),y=0;y<R;y++)J=St($[y],1),d(ot,st=4*(Q*R+q(y)),J);var yt=G.createImageData(R,B);try{yt.data.set(ot)}catch(t){var xt=yt.data,bt=xt.length;for(X=0;X<bt;X++)xt[X]=ot[X]}G.putImageData(yt,0,0)}else{var _t=b.xgap,wt=b.ygap,kt=Math.floor(_t/2),Mt=Math.floor(wt/2);for(X=0;X<z;X++)if($=M[X],Q.reverse(),Q[et]=H(X+1),Q[0]!==Q[1]&&void 0!==Q[0]&&void 0!==Q[1])for(Y=[Z=q(0),Z],y=0;y<P;y++)Y.reverse(),Y[tt]=q(y+1),Y[0]!==Y[1]&&void 0!==Y[0]&&void 0!==Y[1]&&(J=St($[y],(Y[1]-Y[0])*(Q[1]-Q[0])),G.fillStyle="rgba("+J.join(",")+")",G.fillRect(Y[0]+kt,Q[0]+Mt,Y[1]-Y[0]-_t,Q[1]-Q[0]-wt))}nt=Math.round(nt/rt),it=Math.round(it/rt),at=Math.round(at/rt);var At=i("rgb("+nt+","+it+","+at+")");t._hmpixcount=(t._hmpixcount||0)+rt,t._hmlumcount=(t._hmlumcount||0)+rt*At.getLuminance();var Tt=N.selectAll("image").data(r);Tt.enter().append("svg:image").attr({xmlns:l.svg,preserveAspectRatio:"none"}),Tt.attr({height:B,width:R,x:c,y:m,"xlink:href":U.toDataURL("image/png")}),Tt.exit().remove()}function St(t,e){if(void 0!==t){var r=W(t);return r[0]=Math.round(r[0]),r[1]=Math.round(r[1]),r[2]=Math.round(r[2]),rt+=e,nt+=r[0]*e,it+=r[1]*e,at+=r[2]*e,r}return[0,0,0,0]}function Et(t,e,r,n){var i=t[r.bin0];if(void 0===i)return St(void 0,1);var a,o=t[r.bin1],s=e[r.bin0],l=e[r.bin1],c=o-i||0,u=s-i||0;return a=void 0===o?void 0===l?0:void 0===s?2*(l-i):2*(2*l-s-i)/3:void 0===l?void 0===s?0:2*(2*i-o-s)/3:void 0===s?2*(2*l-o-i)/3:l+i-o-s,St(i+r.frac*c+n.frac*(u+r.frac*a))}}function f(t,e){var r=e.length-2,n=o.constrain(o.findBin(t,e),0,r),i=e[n],a=e[n+1],s=o.constrain(n+(t-i)/(a-i)-.5,0,r),l=Math.round(s),c=Math.abs(s-l);return s&&s!==r&&c?{bin0:l,frac:c,bin1:Math.round(l+c/(s-l))}:{bin0:l,bin1:l,frac:0}}function p(t,e){var r=e.length-1,n=o.constrain(o.findBin(t,e),0,r),i=e[n],a=(t-i)/(e[n+1]-i)||0;return a<=0?{bin0:n,bin1:n,frac:0}:a<.5?{bin0:n,bin1:n+1,frac:a}:{bin0:n+1,bin1:n,frac:1-a}}function d(t,e,r){t[e]=r[0],t[e+1]=r[1],t[e+2]=r[2],t[e+3]=Math.round(255*r[3])}e.exports=function(t,e,r,i){var a=c(r);i.selectAll(".hm > image").each(function(t){var e=t.trace||{};a[e.uid]||n.select(this.parentNode).remove()});for(var o=0;o<r.length;o++)h(t,e,r[o],i)}},{"../../components/colorscale":573,"../../constants/xmlns_namespaces":663,"../../lib":684,"../../plots/get_data":768,"../../registry":817,"./max_row_length":936,d3:147,tinycolor2:499}],938:[function(t,e,r){"use strict";var n=t("d3");e.exports=function(t){n.select(t).selectAll(".hm image").style("opacity",function(t){return t.trace.opacity})}},{d3:147}],939:[function(t,e,r){"use strict";e.exports=function(t,e,r){!1===r("zsmooth")&&(r("xgap"),r("ygap")),r("zhoverformat")}},{}],940:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib"),a=t("../../registry");function o(t,e){var r=e(t);return"scaled"===(r?e(t+"type","array"):"scaled")&&(e(t+"0"),e("d"+t)),r}e.exports=function(t,e,r,s,l,c){var u,h,f=r("z");if(l=l||"x",c=c||"y",void 0===f||!f.length)return 0;if(i.isArray1D(t.z)){if(u=r(l),h=r(c),!(u&&u.length&&h&&h.length))return 0;e._length=Math.min(u.length,h.length,f.length)}else{if(u=o(l,r),h=o(c,r),!function(t){for(var e,r=!0,a=!1,o=!1,s=0;s<t.length;s++){if(e=t[s],!i.isArrayOrTypedArray(e)){r=!1;break}e.length>0&&(a=!0);for(var l=0;l<e.length;l++)if(n(e[l])){o=!0;break}}return r&&a&&o}(f))return 0;r("transpose"),e._length=null}return a.getComponentMethod("calendars","handleTraceDefaults")(t,e,[l,c],s),!0}},{"../../lib":684,"../../registry":817,"fast-isnumeric":214}],941:[function(t,e,r){"use strict";for(var n=t("../heatmap/attributes"),i=t("../../components/colorscale/attributes"),a=t("../../components/colorbar/attributes"),o=t("../../lib/extend").extendFlat,s=t("../../plot_api/edit_types").overrideAll,l=["z","x","x0","dx","y","y0","dy","text","transpose","xtype","ytype"],c={},u=0;u<l.length;u++){var h=l[u];c[h]=n[h]}o(c,i("",{cLetter:"z",autoColorDflt:!1}),{colorbar:a}),e.exports=s(c,"calc","nested")},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../../plot_api/edit_types":715,"../heatmap/attributes":925}],942:[function(t,e,r){"use strict";var n=t("gl-heatmap2d"),i=t("../../plots/cartesian/axes"),a=t("../../lib/str2rgbarray");function o(t,e){this.scene=t,this.uid=e,this.type="heatmapgl",this.name="",this.hoverinfo="all",this.xData=[],this.yData=[],this.zData=[],this.textLabels=[],this.idToIndex=[],this.bounds=[0,0,0,0],this.options={z:[],x:[],y:[],shape:[0,0],colorLevels:[0],colorValues:[0,0,0,1]},this.heatmap=n(t.glplot,this.options),this.heatmap._trace=this}var s=o.prototype;s.handlePick=function(t){var e=this.options,r=e.shape,n=t.pointId,i=n%r[0],a=Math.floor(n/r[0]),o=n;return{trace:this,dataCoord:t.dataCoord,traceCoord:[e.x[i],e.y[a],e.z[o]],textLabel:this.textLabels[n],name:this.name,pointIndex:[a,i],hoverinfo:this.hoverinfo}},s.update=function(t,e){var r=e[0];this.index=t.index,this.name=t.name,this.hoverinfo=t.hoverinfo;var n=r.z;this.options.z=[].concat.apply([],n);var o=n[0].length,s=n.length;this.options.shape=[o,s],this.options.x=r.x,this.options.y=r.y;var l=function(t){for(var e=t.colorscale,r=t.zmin,n=t.zmax,i=e.length,o=new Array(i),s=new Array(4*i),l=0;l<i;l++){var c=e[l],u=a(c[1]);o[l]=r+c[0]*(n-r);for(var h=0;h<4;h++)s[4*l+h]=u[h]}return{colorLevels:o,colorValues:s}}(t);this.options.colorLevels=l.colorLevels,this.options.colorValues=l.colorValues,this.textLabels=[].concat.apply([],t.text),this.heatmap.update(this.options),i.expand(this.scene.xaxis,r.x),i.expand(this.scene.yaxis,r.y)},s.dispose=function(){this.heatmap.dispose()},e.exports=function(t,e,r){var n=new o(t,e.uid);return n.update(e,r),n}},{"../../lib/str2rgbarray":707,"../../plots/cartesian/axes":732,"gl-heatmap2d":241}],943:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("../heatmap/defaults"),n.colorbar=t("../heatmap/colorbar"),n.calc=t("../heatmap/calc"),n.plot=t("./convert"),n.moduleType="trace",n.name="heatmapgl",n.basePlotModule=t("../../plots/gl2d"),n.categories=["gl","gl2d","2dMap"],n.meta={},e.exports=n},{"../../plots/gl2d":771,"../heatmap/calc":926,"../heatmap/colorbar":928,"../heatmap/defaults":930,"./attributes":941,"./convert":942}],944:[function(t,e,r){"use strict";var n=t("../bar/attributes");function i(t){var e={};e["autobin"+t]=!1;var r={};return r["^autobin"+t]=!1,{start:{valType:"any",dflt:null,editType:"calc",impliedEdits:r},end:{valType:"any",dflt:null,editType:"calc",impliedEdits:r},size:{valType:"any",dflt:null,editType:"calc",impliedEdits:r},editType:"calc",impliedEdits:e}}e.exports={x:{valType:"data_array",editType:"calc+clearAxisTypes"},y:{valType:"data_array",editType:"calc+clearAxisTypes"},text:n.text,orientation:n.orientation,histfunc:{valType:"enumerated",values:["count","sum","avg","min","max"],dflt:"count",editType:"calc"},histnorm:{valType:"enumerated",values:["","percent","probability","density","probability density"],dflt:"",editType:"calc"},cumulative:{enabled:{valType:"boolean",dflt:!1,editType:"calc"},direction:{valType:"enumerated",values:["increasing","decreasing"],dflt:"increasing",editType:"calc"},currentbin:{valType:"enumerated",values:["include","exclude","half"],dflt:"include",editType:"calc"},editType:"calc"},autobinx:{valType:"boolean",dflt:null,editType:"calc",impliedEdits:{"xbins.start":void 0,"xbins.end":void 0,"xbins.size":void 0}},nbinsx:{valType:"integer",min:0,dflt:0,editType:"calc"},xbins:i("x"),autobiny:{valType:"boolean",dflt:null,editType:"calc",impliedEdits:{"ybins.start":void 0,"ybins.end":void 0,"ybins.size":void 0}},nbinsy:{valType:"integer",min:0,dflt:0,editType:"calc"},ybins:i("y"),marker:n.marker,selected:n.selected,unselected:n.unselected,_deprecated:{bardir:n._deprecated.bardir}}},{"../bar/attributes":827}],945:[function(t,e,r){"use strict";e.exports=function(t,e){for(var r=t.length,n=0,i=0;i<r;i++)e[i]?(t[i]/=e[i],n+=t[i]):t[i]=null;return n}},{}],946:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){return r("histnorm"),n.forEach(function(t){r(t+"bins.start"),r(t+"bins.end"),r(t+"bins.size"),!1!==r("autobin"+t)&&r("nbins"+t)}),e}},{}],947:[function(t,e,r){"use strict";var n=t("fast-isnumeric");e.exports={count:function(t,e,r){return r[t]++,1},sum:function(t,e,r,i){var a=i[e];return n(a)?(a=Number(a),r[t]+=a,a):0},avg:function(t,e,r,i,a){var o=i[e];return n(o)&&(o=Number(o),r[t]+=o,a[t]++),0},min:function(t,e,r,i){var a=i[e];if(n(a)){if(a=Number(a),!n(r[t]))return r[t]=a,a;if(r[t]>a){var o=a-r[t];return r[t]=a,o}}return 0},max:function(t,e,r,i){var a=i[e];if(n(a)){if(a=Number(a),!n(r[t]))return r[t]=a,a;if(r[t]<a){var o=a-r[t];return r[t]=a,o}}return 0}}},{"fast-isnumeric":214}],948:[function(t,e,r){"use strict";var n=t("../../constants/numerical"),i=n.ONEAVGYEAR,a=n.ONEAVGMONTH,o=n.ONEDAY,s=n.ONEHOUR,l=n.ONEMIN,c=n.ONESEC,u=t("../../plots/cartesian/axes").tickIncrement;function h(t,e,r,n){if(t*e<=0)return 1/0;for(var i=Math.abs(e-t),a="date"===r.type,o=f(i,a),s=0;s<10;s++){var l=f(80*o,a);if(o===l)break;if(!p(l,t,e,a,r,n))break;o=l}return o}function f(t,e){return e&&t>c?t>o?t>1.1*i?i:t>1.1*a?a:o:t>s?s:t>l?l:c:Math.pow(10,Math.floor(Math.log(t)/Math.LN10))}function p(t,e,r,n,a,s){if(n&&t>o){var l=d(e,a,s),c=d(r,a,s),u=t===i?0:1;return l[u]!==c[u]}return Math.floor(r/t)-Math.floor(e/t)>.1}function d(t,e,r){var n=e.c2d(t,i,r).split("-");return""===n[0]&&(n.unshift(),n[0]="-"+n[0]),n}e.exports=function(t,e,r,n,a){var s,l,c=-1.1*e,f=-.1*e,p=t-f,d=r[0],g=r[1],m=Math.min(h(d+f,d+p,n,a),h(g+f,g+p,n,a)),v=Math.min(h(d+c,d+f,n,a),h(g+c,g+f,n,a));if(m>v&&v<Math.abs(g-d)/4e3?(s=m,l=!1):(s=Math.min(m,v),l=!0),"date"===n.type&&s>o){var y=s===i?1:6,x=s===i?"M12":"M1";return function(e,r){var o=n.c2d(e,i,a),s=o.indexOf("-",y);s>0&&(o=o.substr(0,s));var c=n.d2c(o,0,a);if(c<e){var h=u(c,x,!1,a);(c+h)/2<e+t&&(c=h)}return r&&l?u(c,x,!0,a):c}}return function(e,r){var n=s*Math.round(e/s);return n+s/10<e&&n+.9*s<e+t&&(n+=s),r&&l&&(n-=s),n}}},{"../../constants/numerical":661,"../../plots/cartesian/axes":732}],949:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib"),a=t("../../plots/cartesian/axes"),o=t("../bar/arrays_to_calcdata"),s=t("./bin_functions"),l=t("./norm_functions"),c=t("./average"),u=t("./clean_bins"),h=t("../../constants/numerical").ONEAVGMONTH,f=t("./bin_label_vals");function p(t,e,r,i,o){var s,l,c,u,h,f=i+"bins",p="overlay"===t._fullLayout.barmode;if(e._autoBinFinished)delete e._autoBinFinished;else{var v=p?[e]:g(t,e),y=[],x=1/0,b=1/0,_=-1/0,w="autobin"+i;for(s=0;s<v.length;s++){h=(l=v[s])._pos0=r.makeCalcdata(l,i);var k=l[f];if(l[w]||!k||null===k.start||null===k.end){c=l[i+"calendar"];var M=l.cumulative;if(k=a.autoBin(h,r,l["nbins"+i],!1,c),p&&0===k._dataSpan&&"category"!==r.type){if(o)return[k,h,!0];k=d(t,e,r,i,f)}M.enabled&&"include"!==M.currentbin&&("decreasing"===M.direction?b=Math.min(b,r.r2c(k.start,0,c)-k.size):_=Math.max(_,r.r2c(k.end,0,c)+k.size)),y.push(l)}else u||(u={size:k.size,start:r.r2c(k.start,0,c),end:r.r2c(k.end,0,c)});x=m(x,k.size),b=Math.min(b,r.r2c(k.start,0,c)),_=Math.max(_,r.r2c(k.end,0,c)),s&&(l._autoBinFinished=1)}if(u&&n(u.size)&&n(x)){x=x>u.size/1.9?u.size:u.size/Math.ceil(u.size/x);var A=u.start+(u.size-x)/2;b=A-x*Math.ceil((A-b)/x)}for(s=0;s<y.length;s++)c=(l=y[s])[i+"calendar"],l._input[f]=l[f]={start:r.c2r(b,0,c),end:r.c2r(_,0,c),size:x},l._input[w]=l[w]}return h=e._pos0,delete e._pos0,[e[f],h]}function d(t,e,r,n,a){var o,s,l=g(t,e),c=!1,u=1/0,h=[e];for(o=0;o<l.length;o++)if((s=l[o])===e)c=!0;else if(c){var f=p(t,s,r,n,!0),d=f[0],m=f[2];s._autoBinFinished=1,s._pos0=f[1],m?h.push(s):u=Math.min(u,d.size)}else u=Math.min(u,s[a].size);var v=new Array(h.length);for(o=0;o<h.length;o++)for(var y=h[o]._pos0,x=0;x<y.length;x++)if(void 0!==y[x]){v[o]=y[x];break}for(isFinite(u)||(u=i.distinctVals(v).minDiff),o=0;o<h.length;o++){var b=(s=h[o])[n+"calendar"];s._input[a]=s[a]={start:r.c2r(v[o]-u/2,0,b),end:r.c2r(v[o]+u/2,0,b),size:u}}return e[a]}function g(t,e){for(var r=e.xaxis,n=e.yaxis,i=e.orientation,a=[],o=t._fullData,s=0;s<o.length;s++){var l=o[s];"histogram"===l.type&&!0===l.visible&&l.orientation===i&&l.xaxis===r&&l.yaxis===n&&a.push(l)}return a}function m(t,e){if(t===1/0)return e;var r=v(t);return v(e)<r?e:t}function v(t){return n(t)?t:"string"==typeof t&&"M"===t.charAt(0)?h*+t.substr(1):1/0}e.exports=function(t,e){if(!0===e.visible){var r,h=[],d=[],g=a.getFromId(t,"h"===e.orientation?e.yaxis||"y":e.xaxis||"x"),m="h"===e.orientation?"y":"x",v={x:"y",y:"x"}[m],y=e[m+"calendar"],x=e.cumulative;u(e,g,m);var b,_,w,k=p(t,e,g,m),M=k[0],A=k[1],T="string"==typeof M.size,S=[],E=T?S:M,C=[],L=[],z=[],P=0,I=e.histnorm,O=e.histfunc,D=-1!==I.indexOf("density");x.enabled&&D&&(I=I.replace(/ ?density$/,""),D=!1);var R,B="max"===O||"min"===O?null:0,F=s.count,N=l[I],j=!1,V=function(t){return g.r2c(t,0,y)};for(i.isArrayOrTypedArray(e[v])&&"count"!==O&&(R=e[v],j="avg"===O,F=s[O]),r=V(M.start),_=V(M.end)+(r-a.tickIncrement(r,M.size,!1,y))/1e6;r<_&&h.length<1e6&&(b=a.tickIncrement(r,M.size,!1,y),h.push((r+b)/2),d.push(B),z.push([]),S.push(r),D&&C.push(1/(b-r)),j&&L.push(0),!(b<=r));)r=b;S.push(r),T||"date"!==g.type||(E={start:V(E.start),end:V(E.end),size:E.size});var U,q=d.length,H=!0,G=1/0,W=1/0,Y={};for(r=0;r<A.length;r++){var X=A[r];(w=i.findBin(X,E))>=0&&w<q&&(P+=F(w,r,d,R,L),H&&z[w].length&&X!==A[z[w][0]]&&(H=!1),z[w].push(r),Y[r]=w,G=Math.min(G,X-S[w]),W=Math.min(W,S[w+1]-X))}H||(U=f(G,W,S,g,y)),j&&(P=c(d,L)),N&&N(d,P,C),x.enabled&&function(t,e,r){var n,i,a;function o(e){a=t[e],t[e]/=2}function s(e){i=t[e],t[e]=a+i/2,a+=i}if("half"===r)if("increasing"===e)for(o(0),n=1;n<t.length;n++)s(n);else for(o(t.length-1),n=t.length-2;n>=0;n--)s(n);else if("increasing"===e){for(n=1;n<t.length;n++)t[n]+=t[n-1];"exclude"===r&&(t.unshift(0),t.pop())}else{for(n=t.length-2;n>=0;n--)t[n]+=t[n+1];"exclude"===r&&(t.push(0),t.shift())}}(d,x.direction,x.currentbin);var Z=Math.min(h.length,d.length),$=[],J=0,K=Z-1;for(r=0;r<Z;r++)if(d[r]){J=r;break}for(r=Z-1;r>=J;r--)if(d[r]){K=r;break}for(r=J;r<=K;r++)if(n(h[r])&&n(d[r])){var Q={p:h[r],s:d[r],b:0};x.enabled||(Q.pts=z[r],H?Q.p0=Q.p1=z[r].length?A[z[r][0]]:h[r]:(Q.p0=U(S[r]),Q.p1=U(S[r+1],!0))),$.push(Q)}return 1===$.length&&($[0].width1=a.tickIncrement($[0].p,M.size,!1,y)-$[0].p),o($,e),i.isArrayOrTypedArray(e.selectedpoints)&&i.tagSelected($,e,Y),$}}},{"../../constants/numerical":661,"../../lib":684,"../../plots/cartesian/axes":732,"../bar/arrays_to_calcdata":826,"./average":945,"./bin_functions":947,"./bin_label_vals":948,"./clean_bins":950,"./norm_functions":955,"fast-isnumeric":214}],950:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib").cleanDate,a=t("../../constants/numerical"),o=a.ONEDAY,s=a.BADNUM;e.exports=function(t,e,r){var a=e.type,l=r+"bins",c=t[l];c||(c=t[l]={});var u="date"===a?function(t){return t||0===t?i(t,s,c.calendar):null}:function(t){return n(t)?Number(t):null};c.start=u(c.start),c.end=u(c.end);var h="date"===a?o:1,f=c.size;if(n(f))c.size=f>0?Number(f):h;else if("string"!=typeof f)c.size=h;else{var p=f.charAt(0),d=f.substr(1);((d=n(d)?Number(d):0)<=0||"date"!==a||"M"!==p||d!==Math.round(d))&&(c.size=h)}var g="autobin"+r;"boolean"!=typeof t[g]&&(t[g]=t._fullInput[g]=t._input[g]=!((c.start||0===c.start)&&(c.end||0===c.end))),t[g]||(delete t["nbins"+r],delete t._fullInput["nbins"+r])}},{"../../constants/numerical":661,"../../lib":684,"fast-isnumeric":214}],951:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib"),a=t("../../components/color"),o=t("./bin_defaults"),s=t("../bar/style_defaults"),l=t("./attributes");e.exports=function(t,e,r,c){function u(r,n){return i.coerce(t,e,l,r,n)}var h=u("x"),f=u("y");u("cumulative.enabled")&&(u("cumulative.direction"),u("cumulative.currentbin")),u("text");var p=u("orientation",f&&!h?"h":"v"),d="v"===p?"x":"y",g="v"===p?"y":"x",m=h&&f?Math.min(h.length&&f.length):(e[d]||[]).length;if(m){e._length=m,n.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x","y"],c),e[g]&&u("histfunc"),o(t,e,u,[d]),s(t,e,u,r,c);var v=n.getComponentMethod("errorbars","supplyDefaults");v(t,e,a.defaultLine,{axis:"y"}),v(t,e,a.defaultLine,{axis:"x",inherit:"y"}),i.coerceSelectionMarkerOpacity(e,u)}else e.visible=!1}},{"../../components/color":558,"../../lib":684,"../../registry":817,"../bar/style_defaults":839,"./attributes":944,"./bin_defaults":946}],952:[function(t,e,r){"use strict";e.exports=function(t,e,r,n,i){if(t.x="xVal"in e?e.xVal:e.x,t.y="yVal"in e?e.yVal:e.y,e.xa&&(t.xaxis=e.xa),e.ya&&(t.yaxis=e.ya),!(r.cumulative||{}).enabled){var a,o=Array.isArray(i)?n[0].pts[i[0]][i[1]]:n[i].pts;if(t.pointNumbers=o,t.binNumber=t.pointNumber,delete t.pointNumber,delete t.pointIndex,r._indexToPoints){a=[];for(var s=0;s<o.length;s++)a=a.concat(r._indexToPoints[o[s]])}else a=o;t.pointIndices=a}return t}},{}],953:[function(t,e,r){"use strict";var n=t("../bar/hover"),i=t("../../plots/cartesian/axes").hoverLabelText;e.exports=function(t,e,r,a){var o=n(t,e,r,a);if(o){var s=(t=o[0]).cd[t.index],l=t.cd[0].trace;if(!l.cumulative.enabled){var c="h"===l.orientation?"y":"x";t[c+"Label"]=i(t[c+"a"],s.p0,s.p1)}return o}}},{"../../plots/cartesian/axes":732,"../bar/hover":830}],954:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.layoutAttributes=t("../bar/layout_attributes"),n.supplyDefaults=t("./defaults"),n.supplyLayoutDefaults=t("../bar/layout_defaults"),n.calc=t("./calc"),n.setPositions=t("../bar/set_positions"),n.plot=t("../bar/plot"),n.layerName="barlayer",n.style=t("../bar/style").style,n.styleOnSelect=t("../bar/style").styleOnSelect,n.colorbar=t("../scatter/marker_colorbar"),n.hoverPoints=t("./hover"),n.selectPoints=t("../bar/select"),n.eventData=t("./event_data"),n.moduleType="trace",n.name="histogram",n.basePlotModule=t("../../plots/cartesian"),n.categories=["cartesian","svg","bar","histogram","oriented","errorBarsOK","showLegend"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"../bar/layout_attributes":832,"../bar/layout_defaults":833,"../bar/plot":834,"../bar/select":835,"../bar/set_positions":836,"../bar/style":838,"../scatter/marker_colorbar":1032,"./attributes":944,"./calc":949,"./defaults":951,"./event_data":952,"./hover":953}],955:[function(t,e,r){"use strict";e.exports={percent:function(t,e){for(var r=t.length,n=100/e,i=0;i<r;i++)t[i]*=n},probability:function(t,e){for(var r=t.length,n=0;n<r;n++)t[n]/=e},density:function(t,e,r,n){var i=t.length;n=n||1;for(var a=0;a<i;a++)t[a]*=r[a]*n},"probability density":function(t,e,r,n){var i=t.length;n&&(e/=n);for(var a=0;a<i;a++)t[a]*=r[a]/e}}},{}],956:[function(t,e,r){"use strict";var n=t("../histogram/attributes"),i=t("../heatmap/attributes"),a=t("../../components/colorscale/attributes"),o=t("../../components/colorbar/attributes"),s=t("../../lib/extend").extendFlat;e.exports=s({x:n.x,y:n.y,z:{valType:"data_array",editType:"calc"},marker:{color:{valType:"data_array",editType:"calc"},editType:"calc"},histnorm:n.histnorm,histfunc:n.histfunc,autobinx:n.autobinx,nbinsx:n.nbinsx,xbins:n.xbins,autobiny:n.autobiny,nbinsy:n.nbinsy,ybins:n.ybins,xgap:i.xgap,ygap:i.ygap,zsmooth:i.zsmooth,zhoverformat:i.zhoverformat},a("",{cLetter:"z",autoColorDflt:!1}),{colorbar:o})},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../heatmap/attributes":925,"../histogram/attributes":944}],957:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes"),a=t("../histogram/bin_functions"),o=t("../histogram/norm_functions"),s=t("../histogram/average"),l=t("../histogram/clean_bins"),c=t("../histogram/bin_label_vals");function u(t,e,r,n,a,o,s){var c=e+"bins",u="autobin"+e,h=t[c];l(t,n,e),!t[u]&&h&&null!==h.start&&null!==h.end||(h=i.autoBin(r,n,t["nbins"+e],"2d",s),"histogram2dcontour"===t.type&&(h.start=o(i.tickIncrement(a(h.start),h.size,!0,s)),h.end=o(i.tickIncrement(a(h.end),h.size,!1,s))),t._input[c]=t[c]=h,t._input[u]=t[u])}function h(t,e,r,n){var i,a=new Array(t);if(n)for(i=0;i<t;i++)a[i]=1/(e[i+1]-e[i]);else{var o=1/r;for(i=0;i<t;i++)a[i]=o}return a}function f(t,e){return{start:t(e.start),end:t(e.end),size:e.size}}function p(t,e,r,n,i,a){var o,s=t.length-1,l=new Array(s);if(e)for(o=0;o<s;o++)l[o]=[e[o],e[o]];else{var u=c(r,n,t,i,a);for(o=0;o<s;o++)l[o]=[u(t[o]),u(t[o+1],!0)]}return l}e.exports=function(t,e){var r,l,c,d,g=i.getFromId(t,e.xaxis||"x"),m=e.x?g.makeCalcdata(e,"x"):[],v=i.getFromId(t,e.yaxis||"y"),y=e.y?v.makeCalcdata(e,"y"):[],x=e.xcalendar,b=e.ycalendar,_=function(t){return g.r2c(t,0,x)},w=function(t){return v.r2c(t,0,b)},k=function(t){return g.c2r(t,0,x)},M=function(t){return v.c2r(t,0,b)},A=e._length;m.length>A&&m.splice(A,m.length-A),y.length>A&&y.splice(A,y.length-A),u(e,"x",m,g,_,k,x),u(e,"y",y,v,w,M,b);var T=[],S=[],E=[],C="string"==typeof e.xbins.size,L="string"==typeof e.ybins.size,z=[],P=[],I=C?z:e.xbins,O=L?P:e.ybins,D=0,R=[],B=[],F=e.histnorm,N=e.histfunc,j=-1!==F.indexOf("density"),V="max"===N||"min"===N?null:0,U=a.count,q=o[F],H=!1,G=[],W=[],Y="z"in e?e.z:"marker"in e&&Array.isArray(e.marker.color)?e.marker.color:"";Y&&"count"!==N&&(H="avg"===N,U=a[N]);var X=e.xbins,Z=_(X.start),$=_(X.end)+(Z-i.tickIncrement(Z,X.size,!1,x))/1e6;for(r=Z;r<$;r=i.tickIncrement(r,X.size,!1,x))S.push(V),z.push(r),H&&E.push(0);z.push(r);var J=S.length,K=_(e.xbins.start),Q=(r-K)/J,tt=k(K+Q/2);for(Z=w((X=e.ybins).start),$=w(X.end)+(Z-i.tickIncrement(Z,X.size,!1,b))/1e6,r=Z;r<$;r=i.tickIncrement(r,X.size,!1,b)){T.push(S.slice()),P.push(r);var et=new Array(J);for(l=0;l<J;l++)et[l]=[];B.push(et),H&&R.push(E.slice())}P.push(r);var rt=T.length,nt=w(e.ybins.start),it=(r-nt)/rt,at=M(nt+it/2);j&&(G=h(S.length,I,Q,C),W=h(T.length,O,it,L)),C||"date"!==g.type||(I=f(_,I)),L||"date"!==v.type||(O=f(w,O));var ot=!0,st=!0,lt=new Array(J),ct=new Array(rt),ut=1/0,ht=1/0,ft=1/0,pt=1/0;for(r=0;r<A;r++){var dt=m[r],gt=y[r];c=n.findBin(dt,I),d=n.findBin(gt,O),c>=0&&c<J&&d>=0&&d<rt&&(D+=U(c,r,T[d],Y,R[d]),B[d][c].push(r),ot&&(void 0===lt[c]?lt[c]=dt:lt[c]!==dt&&(ot=!1)),st&&(void 0===ct[c]?ct[c]=gt:ct[c]!==gt&&(st=!1)),ut=Math.min(ut,dt-z[c]),ht=Math.min(ht,z[c+1]-dt),ft=Math.min(ft,gt-P[d]),pt=Math.min(pt,P[d+1]-gt))}if(H)for(d=0;d<rt;d++)D+=s(T[d],R[d]);if(q)for(d=0;d<rt;d++)q(T[d],D,G,W[d]);return{x:m,xRanges:p(z,ot&&lt,ut,ht,g,x),x0:tt,dx:Q,y:y,yRanges:p(P,st&&ct,ft,pt,v,b),y0:at,dy:it,z:T,pts:B}}},{"../../lib":684,"../../plots/cartesian/axes":732,"../histogram/average":945,"../histogram/bin_functions":947,"../histogram/bin_label_vals":948,"../histogram/clean_bins":950,"../histogram/norm_functions":955}],958:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./sample_defaults"),a=t("../heatmap/style_defaults"),o=t("../../components/colorscale/defaults"),s=t("./attributes");e.exports=function(t,e,r,l){function c(r,i){return n.coerce(t,e,s,r,i)}i(t,e,c,l),!1!==e.visible&&(a(t,e,c,l),o(t,e,l,c,{prefix:"",cLetter:"z"}))}},{"../../components/colorscale/defaults":568,"../../lib":684,"../heatmap/style_defaults":939,"./attributes":956,"./sample_defaults":961}],959:[function(t,e,r){"use strict";var n=t("../heatmap/hover"),i=t("../../plots/cartesian/axes").hoverLabelText;e.exports=function(t,e,r,a,o,s){var l=n(t,e,r,a,o,s);if(l){var c=(t=l[0]).index,u=c[0],h=c[1],f=t.cd[0],p=f.xRanges[h],d=f.yRanges[u];return t.xLabel=i(t.xa,p[0],p[1]),t.yLabel=i(t.ya,d[0],d[1]),l}}},{"../../plots/cartesian/axes":732,"../heatmap/hover":932}],960:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.calc=t("../heatmap/calc"),n.plot=t("../heatmap/plot"),n.layerName="heatmaplayer",n.colorbar=t("../heatmap/colorbar"),n.style=t("../heatmap/style"),n.hoverPoints=t("./hover"),n.eventData=t("../histogram/event_data"),n.moduleType="trace",n.name="histogram2d",n.basePlotModule=t("../../plots/cartesian"),n.categories=["cartesian","svg","2dMap","histogram"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"../heatmap/calc":926,"../heatmap/colorbar":928,"../heatmap/plot":937,"../heatmap/style":938,"../histogram/event_data":952,"./attributes":956,"./defaults":958,"./hover":959}],961:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../histogram/bin_defaults");e.exports=function(t,e,r,a){var o=r("x"),s=r("y");if(o&&o.length&&s&&s.length){e._length=Math.min(o.length,s.length),n.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x","y"],a),(r("z")||r("marker.color"))&&r("histfunc");i(t,e,r,["x","y"])}else e.visible=!1}},{"../../registry":817,"../histogram/bin_defaults":946}],962:[function(t,e,r){"use strict";var n=t("../histogram2d/attributes"),i=t("../contour/attributes"),a=t("../../components/colorscale/attributes"),o=t("../../components/colorbar/attributes"),s=t("../../lib/extend").extendFlat;e.exports=s({x:n.x,y:n.y,z:n.z,marker:n.marker,histnorm:n.histnorm,histfunc:n.histfunc,autobinx:n.autobinx,nbinsx:n.nbinsx,xbins:n.xbins,autobiny:n.autobiny,nbinsy:n.nbinsy,ybins:n.ybins,autocontour:i.autocontour,ncontours:i.ncontours,contours:i.contours,line:i.line,zhoverformat:n.zhoverformat},a("",{cLetter:"z",editTypeOverride:"calc"}),{colorbar:o})},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../contour/attributes":896,"../histogram2d/attributes":956}],963:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../histogram2d/sample_defaults"),a=t("../contour/contours_defaults"),o=t("../contour/style_defaults"),s=t("./attributes");e.exports=function(t,e,r,l){function c(r,i){return n.coerce(t,e,s,r,i)}i(t,e,c,l),!1!==e.visible&&(a(t,e,c,function(r){return n.coerce2(t,e,s,r)}),o(t,e,c,l))}},{"../../lib":684,"../contour/contours_defaults":903,"../contour/style_defaults":917,"../histogram2d/sample_defaults":961,"./attributes":962}],964:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.calc=t("../contour/calc"),n.plot=t("../contour/plot").plot,n.layerName="contourlayer",n.style=t("../contour/style"),n.colorbar=t("../contour/colorbar"),n.hoverPoints=t("../contour/hover"),n.moduleType="trace",n.name="histogram2dcontour",n.basePlotModule=t("../../plots/cartesian"),n.categories=["cartesian","svg","2dMap","contour","histogram"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"../contour/calc":897,"../contour/colorbar":899,"../contour/hover":909,"../contour/plot":914,"../contour/style":916,"./attributes":962,"./defaults":963}],965:[function(t,e,r){"use strict";var n=t("../../components/colorscale/attributes"),i=t("../../components/colorbar/attributes"),a=t("../surface/attributes"),o=t("../../plots/attributes"),s=t("../../lib/extend").extendFlat;e.exports=s({x:{valType:"data_array",editType:"calc+clearAxisTypes"},y:{valType:"data_array",editType:"calc+clearAxisTypes"},z:{valType:"data_array",editType:"calc+clearAxisTypes"},i:{valType:"data_array",editType:"calc"},j:{valType:"data_array",editType:"calc"},k:{valType:"data_array",editType:"calc"},text:{valType:"string",dflt:"",arrayOk:!0,editType:"calc"},delaunayaxis:{valType:"enumerated",values:["x","y","z"],dflt:"z",editType:"calc"},alphahull:{valType:"number",dflt:-1,editType:"calc"},intensity:{valType:"data_array",editType:"calc"},color:{valType:"color",editType:"calc"},vertexcolor:{valType:"data_array",editType:"calc"},facecolor:{valType:"data_array",editType:"calc"}},n("",{colorAttr:"`intensity`",showScaleDflt:!0,editTypeOverride:"calc"}),{colorbar:i,opacity:a.opacity,flatshading:{valType:"boolean",dflt:!1,editType:"calc"},contour:{show:s({},a.contours.x.show,{}),color:a.contours.x.color,width:a.contours.x.width,editType:"calc"},lightposition:{x:s({},a.lightposition.x,{dflt:1e5}),y:s({},a.lightposition.y,{dflt:1e5}),z:s({},a.lightposition.z,{dflt:0}),editType:"calc"},lighting:s({vertexnormalsepsilon:{valType:"number",min:0,max:1,dflt:1e-12,editType:"calc"},facenormalsepsilon:{valType:"number",min:0,max:1,dflt:1e-6,editType:"calc"},editType:"calc"},a.lighting),hoverinfo:s({},o.hoverinfo,{editType:"calc"})})},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../../plots/attributes":729,"../surface/attributes":1100}],966:[function(t,e,r){"use strict";var n=t("../../components/colorscale/calc");e.exports=function(t,e){e.intensity&&n(e,e.intensity,"","c")}},{"../../components/colorscale/calc":566}],967:[function(t,e,r){"use strict";var n=t("gl-mesh3d"),i=t("delaunay-triangulate"),a=t("alpha-shape"),o=t("convex-hull"),s=t("../../lib/gl_format_color").parseColorScale,l=t("../../lib/str2rgbarray"),c=t("../../plots/gl3d/zip3");function u(t,e,r){this.scene=t,this.uid=r,this.mesh=e,this.name="",this.color="#fff",this.data=null,this.showContour=!1}var h=u.prototype;function f(t){return t.map(l)}h.handlePick=function(t){if(t.object===this.mesh){var e=t.index=t.data.index;t.traceCoordinate=[this.data.x[e],this.data.y[e],this.data.z[e]];var r=this.data.text;return Array.isArray(r)&&void 0!==r[e]?t.textLabel=r[e]:r&&(t.textLabel=r),!0}},h.update=function(t){var e=this.scene,r=e.fullSceneLayout;function n(t,e,r,n){return e.map(function(e){return t.d2l(e,0,n)*r})}this.data=t;var u,h=c(n(r.xaxis,t.x,e.dataScale[0],t.xcalendar),n(r.yaxis,t.y,e.dataScale[1],t.ycalendar),n(r.zaxis,t.z,e.dataScale[2],t.zcalendar));if(t.i&&t.j&&t.k)u=c(t.i,t.j,t.k);else if(0===t.alphahull)u=o(h);else if(t.alphahull>0)u=a(t.alphahull,h);else{var p=["x","y","z"].indexOf(t.delaunayaxis);u=i(h.map(function(t){return[t[(p+1)%3],t[(p+2)%3]]}))}var d={positions:h,cells:u,lightPosition:[t.lightposition.x,t.lightposition.y,t.lightposition.z],ambient:t.lighting.ambient,diffuse:t.lighting.diffuse,specular:t.lighting.specular,roughness:t.lighting.roughness,fresnel:t.lighting.fresnel,vertexNormalsEpsilon:t.lighting.vertexnormalsepsilon,faceNormalsEpsilon:t.lighting.facenormalsepsilon,opacity:t.opacity,contourEnable:t.contour.show,contourColor:l(t.contour.color).slice(0,3),contourWidth:t.contour.width,useFacetNormals:t.flatshading};t.intensity?(this.color="#fff",d.vertexIntensity=t.intensity,d.vertexIntensityBounds=[t.cmin,t.cmax],d.colormap=s(t.colorscale)):t.vertexcolor?(this.color=t.vertexcolor[0],d.vertexColors=f(t.vertexcolor)):t.facecolor?(this.color=t.facecolor[0],d.cellColors=f(t.facecolor)):(this.color=t.color,d.meshColor=l(t.color)),this.mesh.update(d)},h.dispose=function(){this.scene.glplot.remove(this.mesh),this.mesh.dispose()},e.exports=function(t,e){var r=t.glplot.gl,i=n({gl:r}),a=new u(t,i,e.uid);return i._trace=a,a.update(e),t.glplot.add(i),a}},{"../../lib/gl_format_color":680,"../../lib/str2rgbarray":707,"../../plots/gl3d/zip3":785,"alpha-shape":55,"convex-hull":117,"delaunay-triangulate":149,"gl-mesh3d":268}],968:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib"),a=t("../../components/colorscale/defaults"),o=t("./attributes");e.exports=function(t,e,r,s){function l(r,n){return i.coerce(t,e,o,r,n)}function c(t){var e=t.map(function(t){var e=l(t);return e&&i.isArrayOrTypedArray(e)?e:null});return e.every(function(t){return t&&t.length===e[0].length})&&e}var u=c(["x","y","z"]),h=c(["i","j","k"]);u?(h&&h.forEach(function(t){for(var e=0;e<t.length;++e)t[e]|=0}),n.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x","y","z"],s),["lighting.ambient","lighting.diffuse","lighting.specular","lighting.roughness","lighting.fresnel","lighting.vertexnormalsepsilon","lighting.facenormalsepsilon","lightposition.x","lightposition.y","lightposition.z","contour.show","contour.color","contour.width","colorscale","reversescale","flatshading","alphahull","delaunayaxis","opacity"].forEach(function(t){l(t)}),"intensity"in t?(l("intensity"),a(t,e,s,l,{prefix:"",cLetter:"c"})):(e.showscale=!1,"facecolor"in t?l("facecolor"):"vertexcolor"in t?l("vertexcolor"):l("color",r)),l("text"),e._length=null):e.visible=!1}},{"../../components/colorscale/defaults":568,"../../lib":684,"../../registry":817,"./attributes":965}],969:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.calc=t("./calc"),n.colorbar={min:"cmin",max:"cmax"},n.plot=t("./convert"),n.moduleType="trace",n.name="mesh3d",n.basePlotModule=t("../../plots/gl3d"),n.categories=["gl3d"],n.meta={},e.exports=n},{"../../plots/gl3d":774,"./attributes":965,"./calc":966,"./convert":967,"./defaults":968}],970:[function(t,e,r){"use strict";var n=t("../../lib").extendFlat,i=t("../scatter/attributes"),a=t("../../components/drawing/attributes").dash,o=i.line;function s(t){return{line:{color:n({},o.color,{dflt:t}),width:o.width,dash:a,editType:"style"},editType:"style"}}e.exports={x:{valType:"data_array",editType:"calc+clearAxisTypes"},open:{valType:"data_array",editType:"calc"},high:{valType:"data_array",editType:"calc"},low:{valType:"data_array",editType:"calc"},close:{valType:"data_array",editType:"calc"},line:{width:n({},o.width,{}),dash:n({},a,{}),editType:"style"},increasing:s("#3D9970"),decreasing:s("#FF4136"),text:{valType:"string",dflt:"",arrayOk:!0,editType:"calc"},tickwidth:{valType:"number",min:0,max:.5,dflt:.3,editType:"calcIfAutorange"}}},{"../../components/drawing/attributes":582,"../../lib":684,"../scatter/attributes":1015}],971:[function(t,e,r){"use strict";var n=t("../../lib"),i=n._,a=t("../../plots/cartesian/axes"),o=t("../../constants/numerical").BADNUM;function s(t,e,r,n){return{o:t,h:e,l:r,c:n}}function l(t,e,r,n,s){for(var l=n.makeCalcdata(e,"open"),c=n.makeCalcdata(e,"high"),u=n.makeCalcdata(e,"low"),h=n.makeCalcdata(e,"close"),f=Array.isArray(e.text),p=!0,d=null,g=[],m=0;m<r.length;m++){var v=r[m],y=l[m],x=c[m],b=u[m],_=h[m];if(v!==o&&y!==o&&x!==o&&b!==o&&_!==o){_===y?null!==d&&_!==d&&(p=_>d):p=_>y,d=_;var w=s(y,x,b,_);w.pos=v,w.yc=(y+_)/2,w.i=m,w.dir=p?"increasing":"decreasing",f&&(w.tx=e.text[m]),g.push(w)}}return a.expand(n,u.concat(c),{padded:!0}),g.length&&(g[0].t={labels:{open:i(t,"open:")+" ",high:i(t,"high:")+" ",low:i(t,"low:")+" ",close:i(t,"close:")+" "}}),g}e.exports={calc:function(t,e){var r=a.getFromId(t,e.xaxis),i=a.getFromId(t,e.yaxis),o=function(t,e,r){var i=r._minDiff;if(!i){var a,o=t._fullData,s=[];for(i=1/0,a=0;a<o.length;a++){var l=o[a];if("ohlc"===l.type&&!0===l.visible&&l.xaxis===e._id){s.push(l);var c=e.makeCalcdata(l,"x");l._xcalc=c;var u=n.distinctVals(c).minDiff;u&&isFinite(u)&&(i=Math.min(i,u))}}for(i===1/0&&(i=1),a=0;a<s.length;a++)s[a]._minDiff=i}return i*r.tickwidth}(t,r,e),c=e._minDiff;e._minDiff=null;var u=e._xcalc;e._xcalc=null;var h=l(t,e,u,i,s);return a.expand(r,u,{vpad:c/2}),h.length?(n.extendFlat(h[0].t,{wHover:c/2,tickLen:o}),h):[{t:{empty:!0}}]},calcCommon:l}},{"../../constants/numerical":661,"../../lib":684,"../../plots/cartesian/axes":732}],972:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./ohlc_defaults"),a=t("./attributes");function o(t,e,r,n){r(n+".line.color"),r(n+".line.width",e.line.width),r(n+".line.dash",e.line.dash)}e.exports=function(t,e,r,s){function l(r,i){return n.coerce(t,e,a,r,i)}i(t,e,l,s)?(l("line.width"),l("line.dash"),o(t,e,l,"increasing"),o(t,e,l,"decreasing"),l("text"),l("tickwidth"),s._requestRangeslider[e.xaxis]=!0):e.visible=!1}},{"../../lib":684,"./attributes":970,"./ohlc_defaults":975}],973:[function(t,e,r){"use strict";var n=t("../../plots/cartesian/axes"),i=t("../../components/fx"),a=t("../../components/color"),o=t("../scatter/fill_hover_text"),s={increasing:"\u25b2",decreasing:"\u25bc"};e.exports=function(t,e,r,l){var c=t.cd,u=t.xa,h=t.ya,f=c[0].trace,p=c[0].t,d=f.type,g="ohlc"===d?"l":"min",m="ohlc"===d?"h":"max",v=p.bPos||0,y=e-v,x=p.bdPos||p.tickLen,b=p.wHover,_=Math.min(1,x/Math.abs(u.r2c(u.range[1])-u.r2c(u.range[0]))),w=t.maxHoverDistance-_,k=t.maxSpikeDistance-_;function M(t){var e=t.pos-y;return i.inbox(e-b,e+b,w)}function A(t){return i.inbox(t[g]-r,t[m]-r,w)}function T(t){return(M(t)+A(t))/2}var S=i.getDistanceFunction(l,M,A,T);if(i.getClosest(c,S,t),!1===t.index)return[];var E=c[t.index],C=t.index=E.i,L=E.dir,z=f[L],P=z.line.color;function I(t){return p.labels[t]+n.hoverLabelText(h,f[t][C])}a.opacity(P)&&z.line.width?t.color=P:t.color=z.fillcolor,t.x0=u.c2p(E.pos+v-x,!0),t.x1=u.c2p(E.pos+v+x,!0),t.xLabelVal=E.pos,t.spikeDistance=T(E)*k/w,t.xSpike=u.c2p(E.pos,!0);var O=f.hoverinfo,D=O.split("+"),R="all"===O,B=R||-1!==D.indexOf("y"),F=R||-1!==D.indexOf("text"),N=B?[I("open"),I("high"),I("low"),I("close")+"  "+s[L]]:[];return F&&o(E,f,N),t.extraText=N.join("<br>"),t.y0=t.y1=h.c2p(E.yc,!0),[t]}},{"../../components/color":558,"../../components/fx":600,"../../plots/cartesian/axes":732,"../scatter/fill_hover_text":1022}],974:[function(t,e,r){"use strict";e.exports={moduleType:"trace",name:"ohlc",basePlotModule:t("../../plots/cartesian"),categories:["cartesian","svg","showLegend"],meta:{},attributes:t("./attributes"),supplyDefaults:t("./defaults"),calc:t("./calc").calc,plot:t("./plot"),style:t("./style"),hoverPoints:t("./hover"),selectPoints:t("./select")}},{"../../plots/cartesian":743,"./attributes":970,"./calc":971,"./defaults":972,"./hover":973,"./plot":976,"./select":977,"./style":978}],975:[function(t,e,r){"use strict";var n=t("../../registry");e.exports=function(t,e,r,i){var a=r("x"),o=r("open"),s=r("high"),l=r("low"),c=r("close");if(n.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x"],i),o&&s&&l&&c){var u=Math.min(o.length,s.length,l.length,c.length);return a&&(u=Math.min(u,a.length)),e._length=u,u}}},{"../../registry":817}],976:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../lib");e.exports=function(t,e,r,a){var o=e.xaxis,s=e.yaxis,l=a.selectAll("g.trace").data(r,function(t){return t[0].trace.uid});l.enter().append("g").attr("class","trace ohlc"),l.exit().remove(),l.order(),l.each(function(t){var r=t[0],a=r.t,l=r.trace,c=n.select(this);if(e.isRangePlot||(r.node3=c),!0!==l.visible||a.empty)c.remove();else{var u=a.tickLen,h=c.selectAll("path").data(i.identity);h.enter().append("path"),h.exit().remove(),h.attr("d",function(t){var e=o.c2p(t.pos,!0),r=o.c2p(t.pos-u,!0),n=o.c2p(t.pos+u,!0);return"M"+r+","+s.c2p(t.o,!0)+"H"+e+"M"+e+","+s.c2p(t.h,!0)+"V"+s.c2p(t.l,!0)+"M"+n+","+s.c2p(t.c,!0)+"H"+e})}})}},{"../../lib":684,d3:147}],977:[function(t,e,r){"use strict";e.exports=function(t,e){var r,n=t.cd,i=t.xaxis,a=t.yaxis,o=[],s=n[0].t.bPos||0;if(!1===e)for(r=0;r<n.length;r++)n[r].selected=0;else for(r=0;r<n.length;r++){var l=n[r];e.contains([i.c2p(l.pos+s),a.c2p(l.yc)])?(o.push({pointNumber:l.i,x:i.c2d(l.pos),y:a.c2d(l.yc)}),l.selected=1):l.selected=0}return o}},{}],978:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/drawing"),a=t("../../components/color");e.exports=function(t,e){var r=e?e[0].node3:n.select(t).selectAll("g.ohlclayer").selectAll("g.trace");r.style("opacity",function(t){return t[0].trace.opacity}),r.each(function(t){var e=t[0].trace;n.select(this).selectAll("path").each(function(t){var r=e[t.dir].line;n.select(this).style("fill","none").call(a.stroke,r.color).call(i.dashLine,r.dash,r.width).style("opacity",e.selectedpoints&&!t.selected?.3:1)})})}},{"../../components/color":558,"../../components/drawing":583,d3:147}],979:[function(t,e,r){"use strict";var n=t("../../components/colorscale/attributes"),i=t("../../components/colorbar/attributes"),a=t("../../plots/cartesian/layout_attributes"),o=t("../../plots/font_attributes"),s=t("../../plots/domain").attributes,l=t("../../lib/extend").extendFlat,c=t("../../plot_api/plot_template").templatedArray;e.exports={domain:s({name:"parcoords",trace:!0,editType:"calc"}),labelfont:o({editType:"calc"}),tickfont:o({editType:"calc"}),rangefont:o({editType:"calc"}),dimensions:c("dimension",{label:{valType:"string",editType:"calc"},tickvals:l({},a.tickvals,{editType:"calc"}),ticktext:l({},a.ticktext,{editType:"calc"}),tickformat:{valType:"string",dflt:"3s",editType:"calc"},visible:{valType:"boolean",dflt:!0,editType:"calc"},range:{valType:"info_array",items:[{valType:"number",editType:"calc"},{valType:"number",editType:"calc"}],editType:"calc"},constraintrange:{valType:"info_array",freeLength:!0,dimensions:"1-2",items:[{valType:"number",editType:"calc"},{valType:"number",editType:"calc"}],editType:"calc"},multiselect:{valType:"boolean",dflt:!0,editType:"calc"},values:{valType:"data_array",editType:"calc"},editType:"calc"}),line:l(n("line",{colorscaleDflt:"Viridis",autoColorDflt:!1,editTypeOverride:"calc"}),{colorbar:i,editType:"calc"})}},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../../plot_api/plot_template":722,"../../plots/cartesian/layout_attributes":744,"../../plots/domain":757,"../../plots/font_attributes":758}],980:[function(t,e,r){"use strict";var n=t("./constants"),i=t("d3"),a=t("../../lib/gup").keyFun,o=t("../../lib/gup").repeat,s=t("../../lib").sorterAsc,l=n.bar.snapRatio;function c(t,e){return t*(1-l)+e*l}var u=n.bar.snapClose;function h(t,e){return t*(1-u)+e*u}function f(t,e,r){if(d(e,r))return e;for(var n=t[0],i=n,a=1;a<t.length;a++){var o=t[a];if(e<h(n,o))return c(n,i);if(e<o||a===t.length-1)return c(o,n);i=n,n=o}}function p(t,e,r){if(d(e,r))return e;for(var n=t[t.length-1],i=n,a=t.length-2;a>=0;a--){var o=t[a];if(e>h(n,o))return c(n,i);if(e>o||a===t.length-1)return c(o,n);i=n,n=o}}function d(t,e){for(var r=0;r<e.length;r++)if(t>=e[r][0]&&t<=e[r][1])return!0;return!1}function g(t){t.attr("x",-n.bar.captureWidth/2).attr("width",n.bar.captureWidth)}function m(t){t.attr("visibility","visible").style("visibility","visible").attr("fill","yellow").attr("opacity",0)}function v(t){if(!t.brush.filterSpecified)return"0,"+t.height;for(var e,r,n,i=y(t.brush.filter.getConsolidated(),t.height),a=[0],o=i.length?i[0][0]:null,s=0;s<i.length;s++)r=(e=i[s])[1]-e[0],a.push(o),a.push(r),(n=s+1)<i.length&&(o=i[n][0]-e[1]);return a.push(t.height),a}function y(t,e){return t.map(function(t){return t.map(function(t){return t*e}).sort(s)})}function x(){i.select(document.body).style("cursor",null)}function b(t){t.attr("stroke-dasharray",v)}function _(t,e){var r=i.select(t).selectAll(".highlight, .highlight-shadow");b(e?r.transition().duration(n.bar.snapDuration).each("end",e):r)}function w(t,e){var r,i=t.brush,a=NaN,o={};if(i.filterSpecified){var s=t.height,l=i.filter.getConsolidated(),c=y(l,s),u=NaN,h=NaN,f=NaN;for(r=0;r<=c.length;r++){var p=c[r];if(p&&p[0]<=e&&e<=p[1]){u=r;break}if(h=r?r-1:NaN,p&&p[0]>e){f=r;break}}if(a=u,isNaN(a)&&(a=isNaN(h)||isNaN(f)?isNaN(h)?f:h:e-c[h][1]<c[f][0]-e?h:f),!isNaN(a)){var d=c[a],g=function(t,e){var r=n.bar.handleHeight;if(!(e>t[1]+r||e<t[0]-r))return e>=.9*t[1]+.1*t[0]?"n":e<=.9*t[0]+.1*t[1]?"s":"ns"}(d,e);g&&(o.interval=l[a],o.intervalPix=d,o.region=g)}}if(t.ordinal&&!o.region){var m=t.unitTickvals,v=t.unitToPaddedPx.invert(e);for(r=0;r<m.length;r++){var x=[.25*m[Math.max(r-1,0)]+.75*m[r],.25*m[Math.min(r+1,m.length-1)]+.75*m[r]];if(v>=x[0]&&v<=x[1]){o.clickableOrdinalRange=x;break}}}return o}function k(t){t.on("mousemove",function(t){if(i.event.preventDefault(),!t.parent.inBrushDrag){var e=w(t,t.height-i.mouse(this)[1]-2*n.verticalPadding),r="crosshair";e.clickableOrdinalRange?r="pointer":e.region&&(r=e.region+"-resize"),i.select(document.body).style("cursor",r)}}).on("mouseleave",function(t){t.parent.inBrushDrag||x()}).call(i.behavior.drag().on("dragstart",function(t){i.event.sourceEvent.stopPropagation();var e=t.height-i.mouse(this)[1]-2*n.verticalPadding,r=t.unitToPaddedPx.invert(e),a=t.brush,o=w(t,e),s=o.interval,l=a.svgBrush;if(l.wasDragged=!1,l.grabbingBar="ns"===o.region,l.grabbingBar){var c=s.map(t.unitToPaddedPx);l.grabPoint=e-c[0]-n.verticalPadding,l.barLength=c[1]-c[0]}l.clickableOrdinalRange=o.clickableOrdinalRange,l.stayingIntervals=t.multiselect&&a.filterSpecified?a.filter.getConsolidated():[],s&&(l.stayingIntervals=l.stayingIntervals.filter(function(t){return t[0]!==s[0]&&t[1]!==s[1]})),l.startExtent=o.region?s["s"===o.region?1:0]:r,t.parent.inBrushDrag=!0,l.brushStartCallback()}).on("drag",function(t){i.event.sourceEvent.stopPropagation();var e=t.height-i.mouse(this)[1]-2*n.verticalPadding,r=t.brush.svgBrush;r.wasDragged=!0,r.grabbingBar?r.newExtent=[e-r.grabPoint,e+r.barLength-r.grabPoint].map(t.unitToPaddedPx.invert):r.newExtent=[r.startExtent,t.unitToPaddedPx.invert(e)].sort(s);var a=Math.max(0,-r.newExtent[0]),o=Math.max(0,r.newExtent[1]-1);r.newExtent[0]+=a,r.newExtent[1]-=o,r.grabbingBar&&(r.newExtent[1]+=a,r.newExtent[0]-=o),t.brush.filterSpecified=!0,r.extent=r.stayingIntervals.concat([r.newExtent]),r.brushCallback(t),_(this.parentNode)}).on("dragend",function(t){i.event.sourceEvent.stopPropagation();var e=t.brush,r=e.filter,n=e.svgBrush,a=n.grabbingBar;if(n.grabbingBar=!1,n.grabLocation=void 0,t.parent.inBrushDrag=!1,x(),!n.wasDragged)return n.wasDragged=void 0,n.clickableOrdinalRange?e.filterSpecified&&t.multiselect?n.extent.push(n.clickableOrdinalRange):(n.extent=[n.clickableOrdinalRange],e.filterSpecified=!0):a?(n.extent=n.stayingIntervals,0===n.extent.length&&A(e)):A(e),n.brushCallback(t),_(this.parentNode),void n.brushEndCallback(e.filterSpecified?r.getConsolidated():[]);var o=function(){r.set(r.getConsolidated())};if(t.ordinal){var s=t.unitTickvals;s[s.length-1]<s[0]&&s.reverse(),n.newExtent=[f(s,n.newExtent[0],n.stayingIntervals),p(s,n.newExtent[1],n.stayingIntervals)];var l=n.newExtent[1]>n.newExtent[0];n.extent=n.stayingIntervals.concat(l?[n.newExtent]:[]),n.extent.length||A(e),n.brushCallback(t),l?_(this.parentNode,o):(o(),_(this.parentNode))}else o();n.brushEndCallback(e.filterSpecified?r.getConsolidated():[])}))}function M(t,e){return t[0]-e[0]}function A(t){t.filterSpecified=!1,t.svgBrush.extent=[[0,1]]}function T(t){for(var e,r=t.slice(),n=[],i=r.shift();i;){for(e=i.slice();(i=r.shift())&&i[0]<=e[1];)e[1]=Math.max(e[1],i[1]);n.push(e)}return n}e.exports={makeBrush:function(t,e,r,n,i,a){var o,l=function(){var t,e,r=[];return{set:function(n){r=n.map(function(t){return t.slice().sort(s)}).sort(M),t=T(r),e=r.reduce(function(t,e){return[Math.min(t[0],e[0]),Math.max(t[1],e[1])]},[1/0,-1/0])},get:function(){return r.slice()},getConsolidated:function(){return t},getBounds:function(){return e}}}();return l.set(r),{filter:l,filterSpecified:e,svgBrush:{extent:[],brushStartCallback:n,brushCallback:(o=i,function(t){var e=t.brush,r=function(t){return t.svgBrush.extent.map(function(t){return t.slice()})}(e).slice();e.filter.set(r),o()}),brushEndCallback:a}}},ensureAxisBrush:function(t){var e=t.selectAll("."+n.cn.axisBrush).data(o,a);e.enter().append("g").classed(n.cn.axisBrush,!0),function(t){var e=t.selectAll(".background").data(o);e.enter().append("rect").classed("background",!0).call(g).call(m).style("pointer-events","auto").attr("transform","translate(0 "+n.verticalPadding+")"),e.call(k).attr("height",function(t){return t.height-n.verticalPadding});var r=t.selectAll(".highlight-shadow").data(o);r.enter().append("line").classed("highlight-shadow",!0).attr("x",-n.bar.width/2).attr("stroke-width",n.bar.width+n.bar.strokeWidth).attr("stroke",n.bar.strokeColor).attr("opacity",n.bar.strokeOpacity).attr("stroke-linecap","butt"),r.attr("y1",function(t){return t.height}).call(b);var i=t.selectAll(".highlight").data(o);i.enter().append("line").classed("highlight",!0).attr("x",-n.bar.width/2).attr("stroke-width",n.bar.width-n.bar.strokeWidth).attr("stroke",n.bar.fillColor).attr("opacity",n.bar.fillOpacity).attr("stroke-linecap","butt"),i.attr("y1",function(t){return t.height}).call(b)}(e)},cleanRanges:function(t,e){if(Array.isArray(t[0])?(t=t.map(function(t){return t.sort(s)}),t=e.multiselect?T(t.sort(M)):[t[0]]):t=[t.sort(s)],e.tickvals){var r=e.tickvals.slice().sort(s);if(!(t=t.map(function(t){var e=[f(r,t[0],[]),p(r,t[1],[])];if(e[1]>e[0])return e}).filter(function(t){return t})).length)return}return t.length>1?t:t[0]}}},{"../../lib":684,"../../lib/gup":681,"./constants":983,d3:147}],981:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../plots/get_data").getModuleCalcData,a=t("./plot"),o=t("../../constants/xmlns_namespaces");r.name="parcoords",r.plot=function(t){var e=i(t.calcdata,"parcoords")[0];e.length&&a(t,e)},r.clean=function(t,e,r,n){var i=n._has&&n._has("parcoords"),a=e._has&&e._has("parcoords");i&&!a&&(n._paperdiv.selectAll(".parcoords").remove(),n._glimages.selectAll("*").remove())},r.toSVG=function(t){var e=t._fullLayout._glimages,r=n.select(t).selectAll(".svg-container");r.filter(function(t,e){return e===r.size()-1}).selectAll(".gl-canvas-context, .gl-canvas-focus").each(function(){var t=this.toDataURL("image/png");e.append("svg:image").attr({xmlns:o.svg,"xlink:href":t,preserveAspectRatio:"none",x:0,y:0,width:this.width,height:this.height})}),window.setTimeout(function(){n.selectAll("#filterBarPattern").attr("id","filterBarPattern")},60)}},{"../../constants/xmlns_namespaces":663,"../../plots/get_data":768,"./plot":989,d3:147}],982:[function(t,e,r){"use strict";var n=t("../../components/colorscale/has_colorscale"),i=t("../../components/colorscale/calc"),a=t("../../lib"),o=t("../../lib/gup").wrap;e.exports=function(t,e){var r=!!e.line.colorscale&&a.isArrayOrTypedArray(e.line.color),s=r?e.line.color:function(t){for(var e=new Array(t),r=0;r<t;r++)e[r]=.5;return e}(e._length),l=r?e.line.colorscale:[[0,e.line.color],[1,e.line.color]];return n(e,"line")&&i(e,s,"line","c"),o({lineColor:s,cscale:l})}},{"../../components/colorscale/calc":566,"../../components/colorscale/has_colorscale":572,"../../lib":684,"../../lib/gup":681}],983:[function(t,e,r){"use strict";e.exports={maxDimensionCount:60,overdrag:45,verticalPadding:2,tickDistance:50,canvasPixelRatio:1,blockLineCount:5e3,layers:["contextLineLayer","focusLineLayer","pickLineLayer"],axisTitleOffset:28,axisExtentOffset:10,bar:{width:4,captureWidth:10,fillColor:"magenta",fillOpacity:1,snapDuration:150,snapRatio:.25,snapClose:.01,strokeColor:"white",strokeOpacity:1,strokeWidth:1,handleHeight:8,handleOpacity:1,handleOverlap:0},cn:{axisExtentText:"axis-extent-text",parcoordsLineLayers:"parcoords-line-layers",parcoordsLineLayer:"parcoords-lines",parcoords:"parcoords",parcoordsControlView:"parcoords-control-view",yAxis:"y-axis",axisOverlays:"axis-overlays",axis:"axis",axisHeading:"axis-heading",axisTitle:"axis-title",axisExtent:"axis-extent",axisExtentTop:"axis-extent-top",axisExtentTopText:"axis-extent-top-text",axisExtentBottom:"axis-extent-bottom",axisExtentBottomText:"axis-extent-bottom-text",axisBrush:"axis-brush"},id:{filterBarPattern:"filter-bar-pattern"}}},{}],984:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../components/colorscale/has_colorscale"),a=t("../../components/colorscale/defaults"),o=t("../../plots/domain").defaults,s=t("../../plots/array_container_defaults"),l=t("./attributes"),c=t("./axisbrush"),u=t("./constants").maxDimensionCount,h=t("./merge_length");function f(t,e){function r(r,i){return n.coerce(t,e,l.dimensions,r,i)}var i=r("values"),a=r("visible");if(i&&i.length||(a=e.visible=!1),a){r("label"),r("tickvals"),r("ticktext"),r("tickformat"),r("range"),r("multiselect");var o=r("constraintrange");o&&(e.constraintrange=c.cleanRanges(o,e))}}e.exports=function(t,e,r,c){function p(r,i){return n.coerce(t,e,l,r,i)}var d=t.dimensions;Array.isArray(d)&&d.length>u&&(n.log("parcoords traces support up to "+u+" dimensions at the moment"),d.splice(u));var g=s(t,e,{name:"dimensions",handleItemDefaults:f}),m=function(t,e,r,o,s){var l=s("line.color",r);if(i(t,"line")&&n.isArrayOrTypedArray(l)){if(l.length)return s("line.colorscale"),a(t,e,o,s,{prefix:"line.",cLetter:"c"}),l.length;e.line.color=r}return 1/0}(t,e,r,c,p);o(e,c,p),Array.isArray(g)&&g.length||(e.visible=!1),h(e,g,"values",m);var v={family:c.font.family,size:Math.round(c.font.size/1.2),color:c.font.color};n.coerceFont(p,"labelfont",v),n.coerceFont(p,"tickfont",v),n.coerceFont(p,"rangefont",v)}},{"../../components/colorscale/defaults":568,"../../components/colorscale/has_colorscale":572,"../../lib":684,"../../plots/array_container_defaults":728,"../../plots/domain":757,"./attributes":979,"./axisbrush":980,"./constants":983,"./merge_length":987}],985:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.calc=t("./calc"),n.plot=t("./plot"),n.colorbar={container:"line",min:"cmin",max:"cmax"},n.moduleType="trace",n.name="parcoords",n.basePlotModule=t("./base_plot"),n.categories=["gl","regl","noOpacity"],n.meta={},e.exports=n},{"./attributes":979,"./base_plot":981,"./calc":982,"./defaults":984,"./plot":989}],986:[function(t,e,r){"use strict";var n=t("glslify"),i=n(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec4 p0, p1, p2, p3,\n               p4, p5, p6, p7,\n               p8, p9, pa, pb,\n               pc, pd, pe;\n\nattribute vec4 pf;\n\nuniform mat4 dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D,\n             loA, hiA, loB, hiB, loC, hiC, loD, hiD;\n\nuniform vec2 resolution,\n             viewBoxPosition,\n             viewBoxSize;\n\nuniform sampler2D palette;\nuniform sampler2D mask;\nuniform float maskHeight;\n\nuniform vec2 colorClamp;\n\nvarying vec4 fragColor;\n\nvec4 unit_1 = vec4(1, 1, 1, 1);\n\nfloat val(mat4 p, mat4 v) {\n    return dot(matrixCompMult(p, v) * unit_1, unit_1);\n}\n\nfloat axisY(\n        float x,\n        mat4 d[4],\n        mat4 dim1A, mat4 dim2A, mat4 dim1B, mat4 dim2B, mat4 dim1C, mat4 dim2C, mat4 dim1D, mat4 dim2D\n    ) {\n\n    float y1 = val(d[0], dim1A) + val(d[1], dim1B) + val(d[2], dim1C) + val(d[3], dim1D);\n    float y2 = val(d[0], dim2A) + val(d[1], dim2B) + val(d[2], dim2C) + val(d[3], dim2D);\n    return y1 * (1.0 - x) + y2 * x;\n}\n\nconst int bitsPerByte = 8;\n\nint mod2(int a) {\n    return a - 2 * (a / 2);\n}\n\nint mod8(int a) {\n    return a - 8 * (a / 8);\n}\n\nvec4 zero = vec4(0, 0, 0, 0);\nvec4 unit_0 = vec4(1, 1, 1, 1);\nvec2 xyProjection = vec2(1, 1);\n\nmat4 mclamp(mat4 m, mat4 lo, mat4 hi) {\n    return mat4(clamp(m[0], lo[0], hi[0]),\n                clamp(m[1], lo[1], hi[1]),\n                clamp(m[2], lo[2], hi[2]),\n                clamp(m[3], lo[3], hi[3]));\n}\n\nbool mshow(mat4 p, mat4 lo, mat4 hi) {\n    return mclamp(p, lo, hi) == p;\n}\n\nbool withinBoundingBox(\n        mat4 d[4],\n        mat4 loA, mat4 hiA, mat4 loB, mat4 hiB, mat4 loC, mat4 hiC, mat4 loD, mat4 hiD\n    ) {\n\n    return mshow(d[0], loA, hiA) &&\n           mshow(d[1], loB, hiB) &&\n           mshow(d[2], loC, hiC) &&\n           mshow(d[3], loD, hiD);\n}\n\nbool withinRasterMask(mat4 d[4], sampler2D mask, float height) {\n    bool result = true;\n    int bitInByteStepper;\n    float valY, valueY, scaleX;\n    int hit, bitmask, valX;\n    for(int i = 0; i < 4; i++) {\n        for(int j = 0; j < 4; j++) {\n            for(int k = 0; k < 4; k++) {\n                bitInByteStepper = mod8(j * 4 + k);\n                valX = i * 2 + j / 2;\n                valY = d[i][j][k];\n                valueY = valY * (height - 1.0) + 0.5;\n                scaleX = (float(valX) + 0.5) / 8.0;\n                hit = int(texture2D(mask, vec2(scaleX, (valueY + 0.5) / height))[3] * 255.0) / int(pow(2.0, float(bitInByteStepper)));\n                result = result && mod2(hit) == 1;\n            }\n        }\n    }\n    return result;\n}\n\nvec4 position(\n        float depth,\n        vec2 resolution, vec2 viewBoxPosition, vec2 viewBoxSize,\n        mat4 dims[4],\n        float signum,\n        mat4 dim1A, mat4 dim2A, mat4 dim1B, mat4 dim2B, mat4 dim1C, mat4 dim2C, mat4 dim1D, mat4 dim2D,\n        mat4 loA, mat4 hiA, mat4 loB, mat4 hiB, mat4 loC, mat4 hiC, mat4 loD, mat4 hiD,\n        sampler2D mask, float maskHeight\n    ) {\n\n    float x = 0.5 * signum + 0.5;\n    float y = axisY(x, dims, dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D);\n\n    float show = float(\n                            withinBoundingBox(dims, loA, hiA, loB, hiB, loC, hiC, loD, hiD)\n                         && withinRasterMask(dims, mask, maskHeight)\n                      );\n\n    vec2 viewBoxXY = viewBoxPosition + viewBoxSize * vec2(x, y);\n    float depthOrHide = depth + 2.0 * (1.0 - show);\n\n    return vec4(\n        xyProjection * (2.0 * viewBoxXY / resolution - 1.0),\n        depthOrHide,\n        1.0\n    );\n}\n\nvoid main() {\n\n    float prominence = abs(pf[3]);\n\n    mat4 p[4];\n    p[0] = mat4(p0, p1, p2, p3);\n    p[1] = mat4(p4, p5, p6, p7);\n    p[2] = mat4(p8, p9, pa, pb);\n    p[3] = mat4(pc, pd, pe, abs(pf));\n\n    gl_Position = position(\n        1.0 - prominence,\n        resolution, viewBoxPosition, viewBoxSize,\n        p,\n        sign(pf[3]),\n        dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D,\n        loA, hiA, loB, hiB, loC, hiC, loD, hiD,\n        mask, maskHeight\n    );\n\n    float clampedColorIndex = clamp((prominence - colorClamp[0]) / (colorClamp[1] - colorClamp[0]), 0.0, 1.0);\n    fragColor = texture2D(palette, vec2((clampedColorIndex * 255.0 + 0.5) / 256.0, 0.5));\n}\n"]),a=n(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec4 p0, p1, p2, p3,\n               p4, p5, p6, p7,\n               p8, p9, pa, pb,\n               pc, pd, pe;\n\nattribute vec4 pf;\n\nuniform mat4 dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D;\n\nuniform vec2 resolution,\n             viewBoxPosition,\n             viewBoxSize;\n\nuniform sampler2D palette;\n\nuniform vec2 colorClamp;\n\nvarying vec4 fragColor;\n\nvec2 xyProjection = vec2(1, 1);\n\nvec4 unit = vec4(1, 1, 1, 1);\n\nfloat val(mat4 p, mat4 v) {\n    return dot(matrixCompMult(p, v) * unit, unit);\n}\n\nfloat axisY(\n        float x,\n        mat4 d[4],\n        mat4 dim1A, mat4 dim2A, mat4 dim1B, mat4 dim2B, mat4 dim1C, mat4 dim2C, mat4 dim1D, mat4 dim2D\n    ) {\n\n    float y1 = val(d[0], dim1A) + val(d[1], dim1B) + val(d[2], dim1C) + val(d[3], dim1D);\n    float y2 = val(d[0], dim2A) + val(d[1], dim2B) + val(d[2], dim2C) + val(d[3], dim2D);\n    return y1 * (1.0 - x) + y2 * x;\n}\n\nvec4 position(\n        float depth,\n        vec2 resolution, vec2 viewBoxPosition, vec2 viewBoxSize,\n        mat4 dims[4],\n        float signum,\n        mat4 dim1A, mat4 dim2A, mat4 dim1B, mat4 dim2B, mat4 dim1C, mat4 dim2C, mat4 dim1D, mat4 dim2D\n    ) {\n\n    float x = 0.5 * signum + 0.5;\n    float y = axisY(x, dims, dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D);\n\n    vec2 viewBoxXY = viewBoxPosition + viewBoxSize * vec2(x, y);\n\n    return vec4(\n        xyProjection * (2.0 * viewBoxXY / resolution - 1.0),\n        depth,\n        1.0\n    );\n}\n\nvoid main() {\n\n    float prominence = abs(pf[3]);\n\n    mat4 p[4];\n    p[0] = mat4(p0, p1, p2, p3);\n    p[1] = mat4(p4, p5, p6, p7);\n    p[2] = mat4(p8, p9, pa, pb);\n    p[3] = mat4(pc, pd, pe, abs(pf));\n\n    gl_Position = position(\n        1.0 - prominence,\n        resolution, viewBoxPosition, viewBoxSize,\n        p,\n        sign(pf[3]),\n        dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D\n    );\n\n    float clampedColorIndex = clamp((prominence - colorClamp[0]) / (colorClamp[1] - colorClamp[0]), 0.0, 1.0);\n    fragColor = texture2D(palette, vec2((clampedColorIndex * 255.0 + 0.5) / 256.0, 0.5));\n}\n"]),o=n(["precision highp float;\n#define GLSLIFY 1\n\nattribute vec4 p0, p1, p2, p3,\n               p4, p5, p6, p7,\n               p8, p9, pa, pb,\n               pc, pd, pe;\n\nattribute vec4 pf;\n\nuniform mat4 dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D,\n             loA, hiA, loB, hiB, loC, hiC, loD, hiD;\n\nuniform vec2 resolution,\n             viewBoxPosition,\n             viewBoxSize;\n\nuniform sampler2D mask;\nuniform float maskHeight;\n\nuniform vec2 colorClamp;\n\nvarying vec4 fragColor;\n\nvec4 unit_1 = vec4(1, 1, 1, 1);\n\nfloat val(mat4 p, mat4 v) {\n    return dot(matrixCompMult(p, v) * unit_1, unit_1);\n}\n\nfloat axisY(\n        float x,\n        mat4 d[4],\n        mat4 dim1A, mat4 dim2A, mat4 dim1B, mat4 dim2B, mat4 dim1C, mat4 dim2C, mat4 dim1D, mat4 dim2D\n    ) {\n\n    float y1 = val(d[0], dim1A) + val(d[1], dim1B) + val(d[2], dim1C) + val(d[3], dim1D);\n    float y2 = val(d[0], dim2A) + val(d[1], dim2B) + val(d[2], dim2C) + val(d[3], dim2D);\n    return y1 * (1.0 - x) + y2 * x;\n}\n\nconst int bitsPerByte = 8;\n\nint mod2(int a) {\n    return a - 2 * (a / 2);\n}\n\nint mod8(int a) {\n    return a - 8 * (a / 8);\n}\n\nvec4 zero = vec4(0, 0, 0, 0);\nvec4 unit_0 = vec4(1, 1, 1, 1);\nvec2 xyProjection = vec2(1, 1);\n\nmat4 mclamp(mat4 m, mat4 lo, mat4 hi) {\n    return mat4(clamp(m[0], lo[0], hi[0]),\n                clamp(m[1], lo[1], hi[1]),\n                clamp(m[2], lo[2], hi[2]),\n                clamp(m[3], lo[3], hi[3]));\n}\n\nbool mshow(mat4 p, mat4 lo, mat4 hi) {\n    return mclamp(p, lo, hi) == p;\n}\n\nbool withinBoundingBox(\n        mat4 d[4],\n        mat4 loA, mat4 hiA, mat4 loB, mat4 hiB, mat4 loC, mat4 hiC, mat4 loD, mat4 hiD\n    ) {\n\n    return mshow(d[0], loA, hiA) &&\n           mshow(d[1], loB, hiB) &&\n           mshow(d[2], loC, hiC) &&\n           mshow(d[3], loD, hiD);\n}\n\nbool withinRasterMask(mat4 d[4], sampler2D mask, float height) {\n    bool result = true;\n    int bitInByteStepper;\n    float valY, valueY, scaleX;\n    int hit, bitmask, valX;\n    for(int i = 0; i < 4; i++) {\n        for(int j = 0; j < 4; j++) {\n            for(int k = 0; k < 4; k++) {\n                bitInByteStepper = mod8(j * 4 + k);\n                valX = i * 2 + j / 2;\n                valY = d[i][j][k];\n                valueY = valY * (height - 1.0) + 0.5;\n                scaleX = (float(valX) + 0.5) / 8.0;\n                hit = int(texture2D(mask, vec2(scaleX, (valueY + 0.5) / height))[3] * 255.0) / int(pow(2.0, float(bitInByteStepper)));\n                result = result && mod2(hit) == 1;\n            }\n        }\n    }\n    return result;\n}\n\nvec4 position(\n        float depth,\n        vec2 resolution, vec2 viewBoxPosition, vec2 viewBoxSize,\n        mat4 dims[4],\n        float signum,\n        mat4 dim1A, mat4 dim2A, mat4 dim1B, mat4 dim2B, mat4 dim1C, mat4 dim2C, mat4 dim1D, mat4 dim2D,\n        mat4 loA, mat4 hiA, mat4 loB, mat4 hiB, mat4 loC, mat4 hiC, mat4 loD, mat4 hiD,\n        sampler2D mask, float maskHeight\n    ) {\n\n    float x = 0.5 * signum + 0.5;\n    float y = axisY(x, dims, dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D);\n\n    float show = float(\n                            withinBoundingBox(dims, loA, hiA, loB, hiB, loC, hiC, loD, hiD)\n                         && withinRasterMask(dims, mask, maskHeight)\n                      );\n\n    vec2 viewBoxXY = viewBoxPosition + viewBoxSize * vec2(x, y);\n    float depthOrHide = depth + 2.0 * (1.0 - show);\n\n    return vec4(\n        xyProjection * (2.0 * viewBoxXY / resolution - 1.0),\n        depthOrHide,\n        1.0\n    );\n}\n\nvoid main() {\n\n    float prominence = abs(pf[3]);\n\n    mat4 p[4];\n    p[0] = mat4(p0, p1, p2, p3);\n    p[1] = mat4(p4, p5, p6, p7);\n    p[2] = mat4(p8, p9, pa, pb);\n    p[3] = mat4(pc, pd, pe, abs(pf));\n\n    gl_Position = position(\n        1.0 - prominence,\n        resolution, viewBoxPosition, viewBoxSize,\n        p,\n        sign(pf[3]),\n        dim1A, dim2A, dim1B, dim2B, dim1C, dim2C, dim1D, dim2D,\n        loA, hiA, loB, hiB, loC, hiC, loD, hiD,\n        mask, maskHeight\n    );\n\n    fragColor = vec4(pf.rgb, 1.0);\n}\n"]),s=n(["precision lowp float;\n#define GLSLIFY 1\n\nvarying vec4 fragColor;\n\nvoid main() {\n    gl_FragColor = fragColor;\n}\n"]),l=t("../../lib"),c=1e-6,u=1e-7,h=2048,f=64,p=2,d=4,g=8,m=f/g,v=[119,119,119],y=new Uint8Array(4),x=new Uint8Array(4),b={shape:[256,1],format:"rgba",type:"uint8",mag:"nearest",min:"nearest"};function _(t,e,r,n,i){var a=t._gl;a.enable(a.SCISSOR_TEST),a.scissor(e,r,n,i),t.clear({color:[0,0,0,0],depth:1})}function w(t,e,r,n,i,a){var o=a.key;r.drawCompleted||(!function(t){t.read({x:0,y:0,width:1,height:1,data:y})}(t),r.drawCompleted=!0),function s(l){var c;c=Math.min(n,i-l*n),a.offset=p*l*n,a.count=p*c,0===l&&(window.cancelAnimationFrame(r.currentRafs[o]),delete r.currentRafs[o],_(t,a.scissorX,a.scissorY,a.scissorWidth,a.viewBoxSize[1])),r.clearOnly||(e(a),l*n+c<i&&(r.currentRafs[o]=window.requestAnimationFrame(function(){s(l+1)})),r.drawCompleted=!1)}(0)}function k(t,e){return(t>>>8*e)%256/255}function M(t,e,r){var n,i,a,o=[];for(i=0;i<t;i++)for(a=0;a<p;a++)for(n=0;n<d;n++)o.push(e[i*f+r*d+n]),r*d+n===f-1&&a%2==0&&(o[o.length-1]*=-1);return o}e.exports=function(t,e){var r,n,p,d,y,A=e.context,T=e.pick,S=e.regl,E={currentRafs:{},drawCompleted:!0,clearOnly:!1},C=function(t){for(var e={},r=0;r<16;r++)e["p"+r.toString(16)]=t.buffer({usage:"dynamic",type:"float",data:new Uint8Array(0)});return e}(S),L=S.texture(b);P(e);var z=S({profile:!1,blend:{enable:A,func:{srcRGB:"src alpha",dstRGB:"one minus src alpha",srcAlpha:1,dstAlpha:1},equation:{rgb:"add",alpha:"add"},color:[0,0,0,0]},depth:{enable:!A,mask:!0,func:"less",range:[0,1]},cull:{enable:!0,face:"back"},scissor:{enable:!0,box:{x:S.prop("scissorX"),y:S.prop("scissorY"),width:S.prop("scissorWidth"),height:S.prop("scissorHeight")}},viewport:{x:S.prop("viewportX"),y:S.prop("viewportY"),width:S.prop("viewportWidth"),height:S.prop("viewportHeight")},dither:!1,vert:T?o:A?a:i,frag:s,primitive:"lines",lineWidth:1,attributes:C,uniforms:{resolution:S.prop("resolution"),viewBoxPosition:S.prop("viewBoxPosition"),viewBoxSize:S.prop("viewBoxSize"),dim1A:S.prop("dim1A"),dim2A:S.prop("dim2A"),dim1B:S.prop("dim1B"),dim2B:S.prop("dim2B"),dim1C:S.prop("dim1C"),dim2C:S.prop("dim2C"),dim1D:S.prop("dim1D"),dim2D:S.prop("dim2D"),loA:S.prop("loA"),hiA:S.prop("hiA"),loB:S.prop("loB"),hiB:S.prop("hiB"),loC:S.prop("loC"),hiC:S.prop("hiC"),loD:S.prop("loD"),hiD:S.prop("hiD"),palette:L,mask:S.prop("maskTexture"),maskHeight:S.prop("maskHeight"),colorClamp:S.prop("colorClamp")},offset:S.prop("offset"),count:S.prop("count")});function P(t){r=t.model,n=t.viewModel,p=n.dimensions.slice(),d=p[0]?p[0].values.length:0;var e=r.lines,i=T?e.color.map(function(t,r){return r/e.color.length}):e.color,a=Math.max(1/255,Math.pow(1/i.length,1/3)),o=function(t,e,r){for(var n,i=e.length,a=[],o=0;o<t;o++)for(var s=0;s<f;s++)a.push(s<i?e[s].paddedUnitValues[o]:s===f-1?(n=r[o],Math.max(c,Math.min(1-c,n))):s>=f-4?k(o,f-2-s):.5);return a}(d,p,i);!function(t,e,r){for(var n=0;n<16;n++)t["p"+n.toString(16)](M(e,r,n))}(C,d,o),L=S.texture(l.extendFlat({data:function(t,e,r){for(var n=[],i=0;i<256;i++){var a=t(i/255);n.push((e?v:a).concat(r))}return n}(r.unitToColor,A,Math.round(255*(A?a:1)))},b))}var I=[0,1];var O=[];function D(t,e,n,i,a,o,s,c,u,h,f){var p,d,g,m,v=[t,e],y=[0,1].map(function(){return[0,1,2,3].map(function(){return new Float32Array(16)})});for(p=0;p<2;p++)for(m=v[p],d=0;d<4;d++)for(g=0;g<16;g++)y[p][d][g]=g+16*d===m?1:0;var x=r.lines.canvasOverdrag,b=r.domain,_=r.canvasWidth,w=r.canvasHeight;return l.extendFlat({key:s,resolution:[_,w],viewBoxPosition:[n+x,i],viewBoxSize:[a,o],i:t,ii:e,dim1A:y[0][0],dim1B:y[0][1],dim1C:y[0][2],dim1D:y[0][3],dim2A:y[1][0],dim2B:y[1][1],dim2C:y[1][2],dim2D:y[1][3],colorClamp:I,scissorX:(c===u?0:n+x)+(r.pad.l-x)+r.layoutWidth*b.x[0],scissorWidth:(c===h?_-n+x:a+.5)+(c===u?n+x:0),scissorY:i+r.pad.b+r.layoutHeight*b.y[0],scissorHeight:o,viewportX:r.pad.l-x+r.layoutWidth*b.x[0],viewportY:r.pad.b+r.layoutHeight*b.y[0],viewportWidth:_,viewportHeight:w},f)}return{setColorDomain:function(t){I[0]=t[0],I[1]=t[1]},render:function(t,e,n){var i,a,o,s=t.length,l=1/0,c=-1/0;for(i=0;i<s;i++)t[i].dim2.canvasX>c&&(c=t[i].dim2.canvasX,o=i),t[i].dim1.canvasX<l&&(l=t[i].dim1.canvasX,a=i);0===s&&_(S,0,0,r.canvasWidth,r.canvasHeight);var f=A?{}:function(){var t,e,r,n=[0,1].map(function(){return[0,1,2,3].map(function(){return new Float32Array(16)})});for(t=0;t<2;t++)for(e=0;e<4;e++)for(r=0;r<16;r++){var i,a=r+16*e;i=a<p.length?p[a].brush.filter.getBounds()[t]:t,n[t][e][r]=i+(2*t-1)*u}function o(t,e){var r=h-1;return[Math.max(0,Math.floor(e[0]*r)),Math.min(r,Math.ceil(e[1]*r))]}for(var s=Array.apply(null,new Array(h*m)).map(function(){return 255}),l=0;l<p.length;l++){var c=l%g,f=(l-c)/g,d=Math.pow(2,c),v=p[l],x=v.brush.filter.get();if(!(x.length<2))for(var b=o(0,x[0])[1],_=1;_<x.length;_++){for(var w=o(0,x[_]),k=b+1;k<w[0];k++)s[k*m+f]&=~d;b=Math.max(b,w[1])}}var M={shape:[m,h],format:"alpha",type:"uint8",mag:"nearest",min:"nearest",data:s};return y?y(M):y=S.texture(M),{maskTexture:y,maskHeight:h,loA:n[0][0],loB:n[0][1],loC:n[0][2],loD:n[0][3],hiA:n[1][0],hiB:n[1][1],hiC:n[1][2],hiD:n[1][3]}}();for(i=0;i<s;i++){var v=t[i],x=v.dim1,b=x.crossfilterDimensionIndex,k=v.canvasX,M=v.canvasY,T=v.dim2.crossfilterDimensionIndex,C=v.panelSizeX,L=v.panelSizeY,P=k+C;if(e||!O[b]||O[b][0]!==k||O[b][1]!==P){O[b]=[k,P];var I=D(b,T,k,M,C,L,x.crossfilterDimensionIndex,i,a,o,f);E.clearOnly=n,w(S,z,E,e?r.lines.blockLineCount:d,d,I)}}},readPixel:function(t,e){return S.read({x:t,y:e,width:1,height:1,data:x}),x},readPixels:function(t,e,r,n){var i=new Uint8Array(4*r*n);return S.read({x:t,y:e,width:r,height:n,data:i}),i},destroy:function(){for(var e in t.style["pointer-events"]="none",L.destroy(),y&&y.destroy(),C)C[e].destroy()},update:P}}},{"../../lib":684,glslify:377}],987:[function(t,e,r){"use strict";e.exports=function(t,e,r,n){var i,a;for(n||(n=1/0),i=0;i<e.length;i++)(a=e[i]).visible&&(n=Math.min(n,a[r].length));for(n===1/0&&(n=0),t._length=n,i=0;i<e.length;i++)(a=e[i]).visible&&(a._length=n);return n}},{}],988:[function(t,e,r){"use strict";var n=t("./lines"),i=t("./constants"),a=t("../../lib"),o=t("d3"),s=t("../../components/drawing"),l=t("../../lib/gup"),c=l.keyFun,u=l.repeat,h=l.unwrap,f=t("./axisbrush");function p(t){return!("visible"in t)||t.visible}function d(t){var e=t.range?t.range[0]:a.aggNums(Math.min,null,t.values,t._length),r=t.range?t.range[1]:a.aggNums(Math.max,null,t.values,t._length);return!isNaN(e)&&isFinite(e)||(e=0),!isNaN(r)&&isFinite(r)||(r=0),e===r&&(0===e?(e-=1,r+=1):(e*=.9,r*=1.1)),[e,r]}function g(t){return t.dimensions.some(function(t){return t.brush.filterSpecified})}function m(t,e,r){var n=h(e),s=n.trace,l=n.lineColor,c=n.cscale,u=s.line,f=s.domain,g=s.dimensions,m=t.width,v=s.labelfont,y=s.tickfont,x=s.rangefont,b=a.extendDeepNoArrays({},u,{color:l.map(o.scale.linear().domain(d({values:l,range:[u.cmin,u.cmax],_length:s._length}))),blockLineCount:i.blockLineCount,canvasOverdrag:i.overdrag*i.canvasPixelRatio}),_=Math.floor(m*(f.x[1]-f.x[0])),w=Math.floor(t.height*(f.y[1]-f.y[0])),k=t.margin||{l:80,r:80,t:100,b:80},M=_,A=w;return{key:r,colCount:g.filter(p).length,dimensions:g,tickDistance:i.tickDistance,unitToColor:function(t){var e=t.map(function(t){return t[0]}),r=t.map(function(t){return o.rgb(t[1])}),n="rgb".split("").map(function(t){return o.scale.linear().clamp(!0).domain(e).range(r.map((n=t,function(t){return t[n]})));var n});return function(t){return n.map(function(e){return e(t)})}}(c),lines:b,labelFont:v,tickFont:y,rangeFont:x,layoutWidth:m,layoutHeight:t.height,domain:f,translateX:f.x[0]*m,translateY:t.height-f.y[1]*t.height,pad:k,canvasWidth:M*i.canvasPixelRatio+2*b.canvasOverdrag,canvasHeight:A*i.canvasPixelRatio,width:M,height:A,canvasPixelRatio:i.canvasPixelRatio}}function v(t,e,r){var n=r.width,s=r.height,l=r.dimensions,c=r.canvasPixelRatio,u=function(t){return n*t/Math.max(1,r.colCount-1)},h=i.verticalPadding/s,m=function(t,e){return o.scale.linear().range([e,t-e])}(s,i.verticalPadding),v={key:r.key,xScale:u,model:r,inBrushDrag:!1},y={};return v.dimensions=l.filter(p).map(function(n,l){var p=function(t,e){return o.scale.linear().domain(d(t)).range([e,1-e])}(n,h),x=y[n.label];y[n.label]=(x||0)+1;var b=n.label+(x?"__"+x:""),_=n.constraintrange,w=_&&_.length;w&&!Array.isArray(_[0])&&(_=[_]);var k=w?_.map(function(t){return t.map(p)}):[[0,1]],M=n.values;M.length>n._length&&(M=M.slice(0,n._length));var A,T=n.tickvals;function S(t,e){return{val:t,text:A[e]}}function E(t,e){return t.val-e.val}if(Array.isArray(T)&&T.length){A=n.ticktext,Array.isArray(A)&&A.length?A.length>T.length?A=A.slice(0,T.length):T.length>A.length&&(T=T.slice(0,A.length)):A=T.map(o.format(n.tickformat));for(var C=1;C<T.length;C++)if(T[C]<T[C-1]){for(var L=T.map(S).sort(E),z=0;z<T.length;z++)T[z]=L[z].val,A[z]=L[z].text;break}}else T=void 0;return{key:b,label:n.label,tickFormat:n.tickformat,tickvals:T,ticktext:A,ordinal:!!T,multiselect:n.multiselect,xIndex:l,crossfilterDimensionIndex:l,visibleIndex:n._index,height:s,values:M,paddedUnitValues:M.map(p),unitTickvals:T&&T.map(p),xScale:u,x:u(l),canvasX:u(l)*c,unitToPaddedPx:m,domainScale:function(t,e,r,n,i){var a,s,l=d(r);return n?o.scale.ordinal().domain(n.map((a=o.format(r.tickformat),s=i,s?function(t,e){var r=s[e];return null==r?a(t):r}:a))).range(n.map(function(r){var n=(r-l[0])/(l[1]-l[0]);return t-e+n*(2*e-t)})):o.scale.linear().domain(l).range([t-e,e])}(s,i.verticalPadding,n,T,A),ordinalScale:function(t){if(t.tickvals){var e=d(t);return o.scale.ordinal().domain(t.tickvals).range(t.tickvals.map(function(t){return(t-e[0])/(e[1]-e[0])}))}}(n),parent:v,model:r,brush:f.makeBrush(t,w,k,function(){t.linePickActive(!1)},function(){var e=v;e.focusLayer&&e.focusLayer.render(e.panels,!0);var r=g(e);!t.contextShown()&&r?(e.contextLayer&&e.contextLayer.render(e.panels,!0),t.contextShown(!0)):t.contextShown()&&!r&&(e.contextLayer&&e.contextLayer.render(e.panels,!0,!0),t.contextShown(!1))},function(r){var i=v;if(i.focusLayer.render(i.panels,!0),i.pickLayer&&i.pickLayer.render(i.panels,!0),t.linePickActive(!0),e&&e.filterChanged){var o=p.invert,s=r.map(function(t){return t.map(o).sort(a.sorterAsc)}).sort(function(t,e){return t[0]-e[0]});e.filterChanged(i.key,n._index,s)}})}}),v}function y(t){t.classed(i.cn.axisExtentText,!0).attr("text-anchor","middle").style("cursor","default").style("user-select","none")}e.exports=function(t,e,r,l,p,d){var x,b,_=(x=!0,b=!1,{linePickActive:function(t){return arguments.length?x=!!t:x},contextShown:function(t){return arguments.length?b=!!t:b}}),w=l.filter(function(t){return h(t).trace.visible}).map(m.bind(0,p)).map(v.bind(0,_,d));r.each(function(t,e){return a.extendFlat(t,w[e])});var k=r.selectAll(".gl-canvas").each(function(t){t.viewModel=w[0],t.model=t.viewModel?t.viewModel.model:null}),M=null;k.filter(function(t){return t.pick}).style("pointer-events","auto").on("mousemove",function(t){if(_.linePickActive()&&t.lineLayer&&d&&d.hover){var e=o.event,r=this.width,n=this.height,i=o.mouse(this),a=i[0],s=i[1];if(a<0||s<0||a>=r||s>=n)return;var l=t.lineLayer.readPixel(a,n-1-s),c=0!==l[3],u=c?l[2]+256*(l[1]+256*l[0]):null,h={x:a,y:s,clientX:e.clientX,clientY:e.clientY,dataIndex:t.model.key,curveNumber:u};u!==M&&(c?d.hover(h):d.unhover&&d.unhover(h),M=u)}}),k.style("opacity",function(t){return t.pick?.01:1}),e.style("background","rgba(255, 255, 255, 0)");var A=e.selectAll("."+i.cn.parcoords).data(w,c);A.exit().remove(),A.enter().append("g").classed(i.cn.parcoords,!0).style("shape-rendering","crispEdges").style("pointer-events","none"),A.attr("transform",function(t){return"translate("+t.model.translateX+","+t.model.translateY+")"});var T=A.selectAll("."+i.cn.parcoordsControlView).data(u,c);T.enter().append("g").classed(i.cn.parcoordsControlView,!0),T.attr("transform",function(t){return"translate("+t.model.pad.l+","+t.model.pad.t+")"});var S=T.selectAll("."+i.cn.yAxis).data(function(t){return t.dimensions},c);function E(t,e){for(var r=e.panels||(e.panels=[]),n=t.data(),i=n.length-1,a=0;a<i;a++){var o=r[a]||(r[a]={}),s=n[a],l=n[a+1];o.dim1=s,o.dim2=l,o.canvasX=s.canvasX,o.panelSizeX=l.canvasX-s.canvasX,o.panelSizeY=e.model.canvasHeight,o.y=0,o.canvasY=0}}S.enter().append("g").classed(i.cn.yAxis,!0),T.each(function(t){E(S,t)}),k.each(function(t){t.viewModel&&(t.lineLayer?t.lineLayer.update(t):t.lineLayer=n(this,t),t.viewModel[t.key]=t.lineLayer,t.lineLayer.render(t.viewModel.panels,!t.context))}),S.attr("transform",function(t){return"translate("+t.xScale(t.xIndex)+", 0)"}),S.call(o.behavior.drag().origin(function(t){return t}).on("drag",function(t){var e=t.parent;_.linePickActive(!1),t.x=Math.max(-i.overdrag,Math.min(t.model.width+i.overdrag,o.event.x)),t.canvasX=t.x*t.model.canvasPixelRatio,S.sort(function(t,e){return t.x-e.x}).each(function(e,r){e.xIndex=r,e.x=t===e?e.x:e.xScale(e.xIndex),e.canvasX=e.x*e.model.canvasPixelRatio}),E(S,e),S.filter(function(e){return 0!==Math.abs(t.xIndex-e.xIndex)}).attr("transform",function(t){return"translate("+t.xScale(t.xIndex)+", 0)"}),o.select(this).attr("transform","translate("+t.x+", 0)"),S.each(function(r,n,i){i===t.parent.key&&(e.dimensions[n]=r)}),e.contextLayer&&e.contextLayer.render(e.panels,!1,!g(e)),e.focusLayer.render&&e.focusLayer.render(e.panels)}).on("dragend",function(t){var e=t.parent;t.x=t.xScale(t.xIndex),t.canvasX=t.x*t.model.canvasPixelRatio,E(S,e),o.select(this).attr("transform",function(t){return"translate("+t.x+", 0)"}),e.contextLayer&&e.contextLayer.render(e.panels,!1,!g(e)),e.focusLayer&&e.focusLayer.render(e.panels),e.pickLayer&&e.pickLayer.render(e.panels,!0),_.linePickActive(!0),d&&d.axesMoved&&d.axesMoved(e.key,e.dimensions.map(function(t){return t.crossfilterDimensionIndex}))})),S.exit().remove();var C=S.selectAll("."+i.cn.axisOverlays).data(u,c);C.enter().append("g").classed(i.cn.axisOverlays,!0),C.selectAll("."+i.cn.axis).remove();var L=C.selectAll("."+i.cn.axis).data(u,c);L.enter().append("g").classed(i.cn.axis,!0),L.each(function(t){var e=t.model.height/t.model.tickDistance,r=t.domainScale,n=r.domain();o.select(this).call(o.svg.axis().orient("left").tickSize(4).outerTickSize(2).ticks(e,t.tickFormat).tickValues(t.ordinal?n:null).tickFormat(t.ordinal?function(t){return t}:null).scale(r)),s.font(L.selectAll("text"),t.model.tickFont)}),L.selectAll(".domain, .tick>line").attr("fill","none").attr("stroke","black").attr("stroke-opacity",.25).attr("stroke-width","1px"),L.selectAll("text").style("text-shadow","1px 1px 1px #fff, -1px -1px 1px #fff, 1px -1px 1px #fff, -1px 1px 1px #fff").style("cursor","default").style("user-select","none");var z=C.selectAll("."+i.cn.axisHeading).data(u,c);z.enter().append("g").classed(i.cn.axisHeading,!0);var P=z.selectAll("."+i.cn.axisTitle).data(u,c);P.enter().append("text").classed(i.cn.axisTitle,!0).attr("text-anchor","middle").style("cursor","ew-resize").style("user-select","none").style("pointer-events","auto"),P.attr("transform","translate(0,"+-i.axisTitleOffset+")").text(function(t){return t.label}).each(function(t){s.font(o.select(this),t.model.labelFont)});var I=C.selectAll("."+i.cn.axisExtent).data(u,c);I.enter().append("g").classed(i.cn.axisExtent,!0);var O=I.selectAll("."+i.cn.axisExtentTop).data(u,c);O.enter().append("g").classed(i.cn.axisExtentTop,!0),O.attr("transform","translate(0,"+-i.axisExtentOffset+")");var D=O.selectAll("."+i.cn.axisExtentTopText).data(u,c);function R(t,e){if(t.ordinal)return"";var r=t.domainScale.domain();return o.format(t.tickFormat)(r[e?r.length-1:0])}D.enter().append("text").classed(i.cn.axisExtentTopText,!0).call(y),D.text(function(t){return R(t,!0)}).each(function(t){s.font(o.select(this),t.model.rangeFont)});var B=I.selectAll("."+i.cn.axisExtentBottom).data(u,c);B.enter().append("g").classed(i.cn.axisExtentBottom,!0),B.attr("transform",function(t){return"translate(0,"+(t.model.height+i.axisExtentOffset)+")"});var F=B.selectAll("."+i.cn.axisExtentBottomText).data(u,c);F.enter().append("text").classed(i.cn.axisExtentBottomText,!0).attr("dy","0.75em").call(y),F.text(function(t){return R(t)}).each(function(t){s.font(o.select(this),t.model.rangeFont)}),f.ensureAxisBrush(C)}},{"../../components/drawing":583,"../../lib":684,"../../lib/gup":681,"./axisbrush":980,"./constants":983,"./lines":986,d3:147}],989:[function(t,e,r){"use strict";var n=t("./parcoords"),i=t("../../lib/prepare_regl");e.exports=function(t,e){var r=t._fullLayout,a=r._toppaper,o=r._paperdiv,s=r._glcontainer;if(i(t)){var l={},c={},u=r._size;e.forEach(function(e,r){l[r]=t.data[r].dimensions,c[r]=t.data[r].dimensions.slice()});n(o,a,s,e,{width:u.w,height:u.h,margin:{t:u.t,r:u.r,b:u.b,l:u.l}},{filterChanged:function(e,r,n){var i=c[e][r],a=n.map(function(t){return t.slice()});a.length?(1===a.length&&(a=a[0]),i.constraintrange=a,a=[a]):(delete i.constraintrange,a=null);var o={};o["dimensions["+r+"].constraintrange"]=a,t.emit("plotly_restyle",[o,[e]])},hover:function(e){t.emit("plotly_hover",e)},unhover:function(e){t.emit("plotly_unhover",e)},axesMoved:function(e,r){function n(t){return!("visible"in t)||t.visible}function i(t,e,r){var n=e.indexOf(r),i=t.indexOf(n);return-1===i&&(i+=e.length),i}var a=function(t){return function(e,n){return i(r,t,e)-i(r,t,n)}}(c[e].filter(n));l[e].sort(a),c[e].filter(function(t){return!n(t)}).sort(function(t){return c[e].indexOf(t)}).forEach(function(t){l[e].splice(l[e].indexOf(t),1),l[e].splice(c[e].indexOf(t),0,t)}),t.emit("plotly_restyle")}})}}},{"../../lib/prepare_regl":697,"./parcoords":988}],990:[function(t,e,r){"use strict";var n=t("../../components/color/attributes"),i=t("../../plots/font_attributes"),a=t("../../plots/attributes"),o=t("../../plots/domain").attributes,s=t("../../lib/extend").extendFlat,l=i({editType:"calc",colorEditType:"style"});e.exports={labels:{valType:"data_array",editType:"calc"},label0:{valType:"number",dflt:0,editType:"calc"},dlabel:{valType:"number",dflt:1,editType:"calc"},values:{valType:"data_array",editType:"calc"},marker:{colors:{valType:"data_array",editType:"calc"},line:{color:{valType:"color",dflt:n.defaultLine,arrayOk:!0,editType:"style"},width:{valType:"number",min:0,dflt:0,arrayOk:!0,editType:"style"},editType:"calc"},editType:"calc"},text:{valType:"data_array",editType:"calc"},hovertext:{valType:"string",dflt:"",arrayOk:!0,editType:"style"},scalegroup:{valType:"string",dflt:"",editType:"calc"},textinfo:{valType:"flaglist",flags:["label","text","value","percent"],extras:["none"],editType:"calc"},hoverinfo:s({},a.hoverinfo,{flags:["label","text","value","percent","name"]}),textposition:{valType:"enumerated",values:["inside","outside","auto","none"],dflt:"auto",arrayOk:!0,editType:"calc"},textfont:s({},l,{}),insidetextfont:s({},l,{}),outsidetextfont:s({},l,{}),domain:o({name:"pie",trace:!0,editType:"calc"}),hole:{valType:"number",min:0,max:1,dflt:0,editType:"calc"},sort:{valType:"boolean",dflt:!0,editType:"calc"},direction:{valType:"enumerated",values:["clockwise","counterclockwise"],dflt:"counterclockwise",editType:"calc"},rotation:{valType:"number",min:-360,max:360,dflt:0,editType:"calc"},pull:{valType:"number",min:0,max:1,dflt:0,arrayOk:!0,editType:"calc"}}},{"../../components/color/attributes":557,"../../lib/extend":673,"../../plots/attributes":729,"../../plots/domain":757,"../../plots/font_attributes":758}],991:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../plots/get_data").getModuleCalcData;r.name="pie",r.plot=function(t){var e=n.getModule("pie"),r=i(t.calcdata,e)[0];r.length&&e.plot(t,r)},r.clean=function(t,e,r,n){var i=n._has&&n._has("pie"),a=e._has&&e._has("pie");i&&!a&&n._pielayer.selectAll("g.trace").remove()}},{"../../plots/get_data":768,"../../registry":817}],992:[function(t,e,r){"use strict";var n,i=t("fast-isnumeric"),a=t("../../lib").isArrayOrTypedArray,o=t("tinycolor2"),s=t("../../components/color"),l=t("./helpers");function c(t,e){if(!n){var r=s.defaults;n=u(r)}var i=e||n;return i[t%i.length]}function u(t){var e,r=t.slice();for(e=0;e<t.length;e++)r.push(o(t[e]).lighten(20).toHexString());for(e=0;e<t.length;e++)r.push(o(t[e]).darken(20).toHexString());return r}e.exports=function(t,e){var r,n,h,f,p,d=e.values,g=a(d)&&d.length,m=e.labels,v=e.marker.colors||[],y=[],x=t._fullLayout,b=x.colorway,_=x._piecolormap,w={},k=0,M=x.hiddenlabels||[];if(x._piecolorway||b===s.defaults||(x._piecolorway=u(b)),e.dlabel)for(m=new Array(d.length),r=0;r<d.length;r++)m[r]=String(e.label0+r*e.dlabel);function A(t,e){return!!t&&(!!(t=o(t)).isValid()&&(t=s.addOpacity(t,t.getAlpha()),_[e]||(_[e]=t),t))}var T=(g?d:m).length;for(r=0;r<T;r++){if(g){if(n=d[r],!i(n))continue;if((n=+n)<0)continue}else n=1;void 0!==(h=m[r])&&""!==h||(h=r);var S=w[h=String(h)];void 0===S?(w[h]=y.length,(f=-1!==M.indexOf(h))||(k+=n),y.push({v:n,label:h,color:A(v[r]),i:r,pts:[r],hidden:f})):((p=y[S]).v+=n,p.pts.push(r),p.hidden||(k+=n),!1===p.color&&v[r]&&(p.color=A(v[r],h)))}for(e.sort&&y.sort(function(t,e){return e.v-t.v}),r=0;r<y.length;r++)!1===(p=y[r]).color&&(_[p.label]?p.color=_[p.label]:(_[p.label]=p.color=c(x._piedefaultcolorcount,x._piecolorway),x._piedefaultcolorcount++));if(y[0]&&(y[0].vTotal=k),e.textinfo&&"none"!==e.textinfo){var E,C=-1!==e.textinfo.indexOf("label"),L=-1!==e.textinfo.indexOf("text"),z=-1!==e.textinfo.indexOf("value"),P=-1!==e.textinfo.indexOf("percent"),I=x.separators;for(r=0;r<y.length;r++){if(p=y[r],E=C?[p.label]:[],L){var O=l.getFirstFilled(e.text,p.pts);O&&E.push(O)}z&&E.push(l.formatPieValue(p.v,I)),P&&E.push(l.formatPiePercent(p.v/k,I)),p.text=E.join("<br>")}}return y}},{"../../components/color":558,"../../lib":684,"./helpers":995,"fast-isnumeric":214,tinycolor2:499}],993:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./attributes"),a=t("../../plots/domain").defaults;e.exports=function(t,e,r,o){function s(r,a){return n.coerce(t,e,i,r,a)}var l,c=n.coerceFont,u=s("values"),h=n.isArrayOrTypedArray(u),f=s("labels");if(Array.isArray(f)?(l=f.length,h&&(l=Math.min(l,u.length))):h&&(l=u.length,s("label0"),s("dlabel")),l){e._length=l,s("marker.line.width")&&s("marker.line.color"),s("marker.colors"),s("scalegroup");var p=s("text"),d=s("textinfo",Array.isArray(p)?"text+percent":"percent");if(s("hovertext"),d&&"none"!==d){var g=s("textposition"),m=Array.isArray(g)||"auto"===g,v=m||"inside"===g,y=m||"outside"===g;if(v||y){var x=c(s,"textfont",o.font);v&&c(s,"insidetextfont",x),y&&c(s,"outsidetextfont",x)}}a(e,o,s),s("hole"),s("sort"),s("direction"),s("rotation"),s("pull")}else e.visible=!1}},{"../../lib":684,"../../plots/domain":757,"./attributes":990}],994:[function(t,e,r){"use strict";var n=t("../../components/fx/helpers").appendArrayMultiPointValues;e.exports=function(t,e){var r={curveNumber:e.index,pointNumbers:t.pts,data:e._input,fullData:e,label:t.label,color:t.color,value:t.v,v:t.v};return 1===t.pts.length&&(r.pointNumber=r.i=t.pts[0]),n(r,e,t.pts),r}},{"../../components/fx/helpers":597}],995:[function(t,e,r){"use strict";var n=t("../../lib");r.formatPiePercent=function(t,e){var r=(100*t).toPrecision(3);return-1!==r.lastIndexOf(".")&&(r=r.replace(/[.]?0+$/,"")),n.numSeparate(r,e)+"%"},r.formatPieValue=function(t,e){var r=t.toPrecision(10);return-1!==r.lastIndexOf(".")&&(r=r.replace(/[.]?0+$/,"")),n.numSeparate(r,e)},r.getFirstFilled=function(t,e){if(Array.isArray(t))for(var r=0;r<e.length;r++){var n=t[e[r]];if(n||0===n)return n}},r.castOption=function(t,e){return Array.isArray(t)?r.getFirstFilled(t,e):t||void 0}},{"../../lib":684}],996:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.supplyLayoutDefaults=t("./layout_defaults"),n.layoutAttributes=t("./layout_attributes"),n.calc=t("./calc"),n.plot=t("./plot"),n.style=t("./style"),n.styleOne=t("./style_one"),n.moduleType="trace",n.name="pie",n.basePlotModule=t("./base_plot"),n.categories=["pie","showLegend"],n.meta={},e.exports=n},{"./attributes":990,"./base_plot":991,"./calc":992,"./defaults":993,"./layout_attributes":997,"./layout_defaults":998,"./plot":999,"./style":1e3,"./style_one":1001}],997:[function(t,e,r){"use strict";e.exports={hiddenlabels:{valType:"data_array",editType:"calc"}}},{}],998:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./layout_attributes");e.exports=function(t,e){var r,a;r="hiddenlabels",n.coerce(t,e,i,r,a)}},{"../../lib":684,"./layout_attributes":997}],999:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/fx"),a=t("../../components/color"),o=t("../../components/drawing"),s=t("../../lib"),l=t("../../lib/svg_text_utils"),c=t("./helpers"),u=t("./event_data");function h(t,e){if(t.v===e.vTotal&&!e.trace.hole)return 1;var r=Math.PI*Math.min(t.v/e.vTotal,.5);return Math.min(1/(1+1/Math.sin(r)),(1-e.trace.hole)/2)}function f(t,e){var r=e.pxmid[0],n=e.pxmid[1],i=t.width/2,a=t.height/2;return r<0&&(i*=-1),n<0&&(a*=-1),{scale:1,rCenter:1,rotate:0,x:i+Math.abs(a)*(i>0?1:-1)/2,y:a/(1+r*r/(n*n)),outside:!0}}e.exports=function(t,e){var r=t._fullLayout;!function(t,e){var r,n,i,a,o,s,l,c,u,h=[];for(i=0;i<t.length;i++){if(o=t[i][0],s=o.trace,r=e.w*(s.domain.x[1]-s.domain.x[0]),n=e.h*(s.domain.y[1]-s.domain.y[0]),l=s.pull,Array.isArray(l))for(l=0,a=0;a<s.pull.length;a++)s.pull[a]>l&&(l=s.pull[a]);o.r=Math.min(r,n)/(2+2*l),o.cx=e.l+e.w*(s.domain.x[1]+s.domain.x[0])/2,o.cy=e.t+e.h*(2-s.domain.y[1]-s.domain.y[0])/2,s.scalegroup&&-1===h.indexOf(s.scalegroup)&&h.push(s.scalegroup)}for(a=0;a<h.length;a++){for(u=1/0,c=h[a],i=0;i<t.length;i++)(o=t[i][0]).trace.scalegroup===c&&(u=Math.min(u,o.r*o.r/o.vTotal));for(i=0;i<t.length;i++)(o=t[i][0]).trace.scalegroup===c&&(o.r=Math.sqrt(u*o.vTotal))}}(e,r._size);var p=r._pielayer.selectAll("g.trace").data(e);p.enter().append("g").attr({"stroke-linejoin":"round",class:"trace"}),p.exit().remove(),p.order(),p.each(function(e){var p=n.select(this),d=e[0],g=d.trace;!function(t){var e,r,n,i=t[0],a=i.trace,o=a.rotation*Math.PI/180,s=2*Math.PI/i.vTotal,l="px0",c="px1";if("counterclockwise"===a.direction){for(e=0;e<t.length&&t[e].hidden;e++);if(e===t.length)return;o+=s*t[e].v,s*=-1,l="px1",c="px0"}function u(t){return[i.r*Math.sin(t),-i.r*Math.cos(t)]}for(n=u(o),e=0;e<t.length;e++)(r=t[e]).hidden||(r[l]=n,o+=s*r.v/2,r.pxmid=u(o),r.midangle=o,o+=s*r.v/2,n=u(o),r[c]=n,r.largeArc=r.v>i.vTotal/2?1:0)}(e),p.each(function(){var p=n.select(this).selectAll("g.slice").data(e);p.enter().append("g").classed("slice",!0),p.exit().remove();var m=[[[],[]],[[],[]]],v=!1;p.each(function(e){if(e.hidden)n.select(this).selectAll("path,g").remove();else{e.pointNumber=e.i,e.curveNumber=g.index,m[e.pxmid[1]<0?0:1][e.pxmid[0]<0?0:1].push(e);var a=d.cx,p=d.cy,y=n.select(this),x=y.selectAll("path.surface").data([e]),b=!1,_=!1;if(x.enter().append("path").classed("surface",!0).style({"pointer-events":"all"}),y.select("path.textline").remove(),y.on("mouseover",function(){var o=t._fullLayout,s=t._fullData[g.index];if(!t._dragging&&!1!==o.hovermode){var l=s.hoverinfo;if(Array.isArray(l)&&(l=i.castHoverinfo({hoverinfo:[c.castOption(l,e.pts)],_module:g._module},o,0)),"all"===l&&(l="label+text+value+percent+name"),"none"!==l&&"skip"!==l&&l){var f=h(e,d),m=a+e.pxmid[0]*(1-f),v=p+e.pxmid[1]*(1-f),y=r.separators,x=[];if(-1!==l.indexOf("label")&&x.push(e.label),-1!==l.indexOf("text")){var w=c.castOption(s.hovertext||s.text,e.pts);w&&x.push(w)}-1!==l.indexOf("value")&&x.push(c.formatPieValue(e.v,y)),-1!==l.indexOf("percent")&&x.push(c.formatPiePercent(e.v/d.vTotal,y));var k=g.hoverlabel,M=k.font;i.loneHover({x0:m-f*d.r,x1:m+f*d.r,y:v,text:x.join("<br>"),name:-1!==l.indexOf("name")?s.name:void 0,idealAlign:e.pxmid[0]<0?"left":"right",color:c.castOption(k.bgcolor,e.pts)||e.color,borderColor:c.castOption(k.bordercolor,e.pts),fontFamily:c.castOption(M.family,e.pts),fontSize:c.castOption(M.size,e.pts),fontColor:c.castOption(M.color,e.pts)},{container:o._hoverlayer.node(),outerContainer:o._paper.node(),gd:t}),b=!0}t.emit("plotly_hover",{points:[u(e,s)],event:n.event}),_=!0}}).on("mouseout",function(r){var a=t._fullLayout,o=t._fullData[g.index];_&&(r.originalEvent=n.event,t.emit("plotly_unhover",{points:[u(e,o)],event:n.event}),_=!1),b&&(i.loneUnhover(a._hoverlayer.node()),b=!1)}).on("click",function(){var r=t._fullLayout,a=t._fullData[g.index];t._dragging||!1===r.hovermode||(t._hoverdata=[u(e,a)],i.click(t,n.event))}),g.pull){var w=+c.castOption(g.pull,e.pts)||0;w>0&&(a+=w*e.pxmid[0],p+=w*e.pxmid[1])}e.cxFinal=a,e.cyFinal=p;var k=g.hole;if(e.v===d.vTotal){var M="M"+(a+e.px0[0])+","+(p+e.px0[1])+C(e.px0,e.pxmid,!0,1)+C(e.pxmid,e.px0,!0,1)+"Z";k?x.attr("d","M"+(a+k*e.px0[0])+","+(p+k*e.px0[1])+C(e.px0,e.pxmid,!1,k)+C(e.pxmid,e.px0,!1,k)+"Z"+M):x.attr("d",M)}else{var A=C(e.px0,e.px1,!0,1);if(k){var T=1-k;x.attr("d","M"+(a+k*e.px1[0])+","+(p+k*e.px1[1])+C(e.px1,e.px0,!1,k)+"l"+T*e.px0[0]+","+T*e.px0[1]+A+"Z")}else x.attr("d","M"+a+","+p+"l"+e.px0[0]+","+e.px0[1]+A+"Z")}var S=c.castOption(g.textposition,e.pts),E=y.selectAll("g.slicetext").data(e.text&&"none"!==S?[0]:[]);E.enter().append("g").classed("slicetext",!0),E.exit().remove(),E.each(function(){var r=s.ensureSingle(n.select(this),"text","",function(t){t.attr("data-notex",1)});r.text(e.text).attr({class:"slicetext",transform:"","text-anchor":"middle"}).call(o.font,"outside"===S?g.outsidetextfont:g.insidetextfont).call(l.convertToTspans,t);var i,c=o.bBox(r.node());"outside"===S?i=f(c,e):(i=function(t,e,r){var n=Math.sqrt(t.width*t.width+t.height*t.height),i=t.width/t.height,a=Math.PI*Math.min(e.v/r.vTotal,.5),o=1-r.trace.hole,s=h(e,r),l={scale:s*r.r*2/n,rCenter:1-s,rotate:0};if(l.scale>=1)return l;var c=i+1/(2*Math.tan(a)),u=r.r*Math.min(1/(Math.sqrt(c*c+.5)+c),o/(Math.sqrt(i*i+o/2)+i)),f={scale:2*u/t.height,rCenter:Math.cos(u/r.r)-u*i/r.r,rotate:(180/Math.PI*e.midangle+720)%180-90},p=1/i,d=p+1/(2*Math.tan(a)),g=r.r*Math.min(1/(Math.sqrt(d*d+.5)+d),o/(Math.sqrt(p*p+o/2)+p)),m={scale:2*g/t.width,rCenter:Math.cos(g/r.r)-g/i/r.r,rotate:(180/Math.PI*e.midangle+810)%180-90},v=m.scale>f.scale?m:f;return l.scale<1&&v.scale>l.scale?v:l}(c,e,d),"auto"===S&&i.scale<1&&(r.call(o.font,g.outsidetextfont),g.outsidetextfont.family===g.insidetextfont.family&&g.outsidetextfont.size===g.insidetextfont.size||(c=o.bBox(r.node())),i=f(c,e)));var u=a+e.pxmid[0]*i.rCenter+(i.x||0),m=p+e.pxmid[1]*i.rCenter+(i.y||0);i.outside&&(e.yLabelMin=m-c.height/2,e.yLabelMid=m,e.yLabelMax=m+c.height/2,e.labelExtraX=0,e.labelExtraY=0,v=!0),r.attr("transform","translate("+u+","+m+")"+(i.scale<1?"scale("+i.scale+")":"")+(i.rotate?"rotate("+i.rotate+")":"")+"translate("+-(c.left+c.right)/2+","+-(c.top+c.bottom)/2+")")})}function C(t,r,n,i){return"a"+i*d.r+","+i*d.r+" 0 "+e.largeArc+(n?" 1 ":" 0 ")+i*(r[0]-t[0])+","+i*(r[1]-t[1])}}),v&&function(t,e){var r,n,i,a,o,s,l,u,h,f,p,d,g;function m(t,e){return t.pxmid[1]-e.pxmid[1]}function v(t,e){return e.pxmid[1]-t.pxmid[1]}function y(t,r){r||(r={});var i,u,h,p,d,g,m=r.labelExtraY+(n?r.yLabelMax:r.yLabelMin),v=n?t.yLabelMin:t.yLabelMax,y=n?t.yLabelMax:t.yLabelMin,x=t.cyFinal+o(t.px0[1],t.px1[1]),b=m-v;if(b*l>0&&(t.labelExtraY=b),Array.isArray(e.pull))for(u=0;u<f.length;u++)(h=f[u])===t||(c.castOption(e.pull,t.pts)||0)>=(c.castOption(e.pull,h.pts)||0)||((t.pxmid[1]-h.pxmid[1])*l>0?(p=h.cyFinal+o(h.px0[1],h.px1[1]),(b=p-v-t.labelExtraY)*l>0&&(t.labelExtraY+=b)):(y+t.labelExtraY-x)*l>0&&(i=3*s*Math.abs(u-f.indexOf(t)),d=h.cxFinal+a(h.px0[0],h.px1[0]),(g=d+i-(t.cxFinal+t.pxmid[0])-t.labelExtraX)*s>0&&(t.labelExtraX+=g)))}for(n=0;n<2;n++)for(i=n?m:v,o=n?Math.max:Math.min,l=n?1:-1,r=0;r<2;r++){for(a=r?Math.max:Math.min,s=r?1:-1,(u=t[n][r]).sort(i),h=t[1-n][r],f=h.concat(u),d=[],p=0;p<u.length;p++)void 0!==u[p].yLabelMid&&d.push(u[p]);for(g=!1,p=0;n&&p<h.length;p++)if(void 0!==h[p].yLabelMid){g=h[p];break}for(p=0;p<d.length;p++){var x=p&&d[p-1];g&&!p&&(x=g),y(d[p],x)}}}(m,g),p.each(function(t){if(t.labelExtraX||t.labelExtraY){var e=n.select(this),r=e.select("g.slicetext text");r.attr("transform","translate("+t.labelExtraX+","+t.labelExtraY+")"+r.attr("transform"));var i=t.cxFinal+t.pxmid[0],o="M"+i+","+(t.cyFinal+t.pxmid[1]),s=(t.yLabelMax-t.yLabelMin)*(t.pxmid[0]<0?-1:1)/4;if(t.labelExtraX){var l=t.labelExtraX*t.pxmid[1]/t.pxmid[0],c=t.yLabelMid+t.labelExtraY-(t.cyFinal+t.pxmid[1]);Math.abs(l)>Math.abs(c)?o+="l"+c*t.pxmid[0]/t.pxmid[1]+","+c+"H"+(i+t.labelExtraX+s):o+="l"+t.labelExtraX+","+l+"v"+(c-l)+"h"+s}else o+="V"+(t.yLabelMid+t.labelExtraY)+"h"+s;e.append("path").classed("textline",!0).call(a.stroke,g.outsidetextfont.color).attr({"stroke-width":Math.min(2,g.outsidetextfont.size/8),d:o,fill:"none"})}})})}),setTimeout(function(){p.selectAll("tspan").each(function(){var t=n.select(this);t.attr("dy")&&t.attr("dy",t.attr("dy"))})},0)}},{"../../components/color":558,"../../components/drawing":583,"../../components/fx":600,"../../lib":684,"../../lib/svg_text_utils":708,"./event_data":994,"./helpers":995,d3:147}],1000:[function(t,e,r){"use strict";var n=t("d3"),i=t("./style_one");e.exports=function(t){t._fullLayout._pielayer.selectAll(".trace").each(function(t){var e=t[0].trace,r=n.select(this);r.style({opacity:e.opacity}),r.selectAll("path.surface").each(function(t){n.select(this).call(i,t,e)})})}},{"./style_one":1001,d3:147}],1001:[function(t,e,r){"use strict";var n=t("../../components/color"),i=t("./helpers").castOption;e.exports=function(t,e,r){var a=r.marker.line,o=i(a.color,e.pts)||n.defaultLine,s=i(a.width,e.pts)||0;t.style({"stroke-width":s}).call(n.fill,e.color).call(n.stroke,o)}},{"../../components/color":558,"./helpers":995}],1002:[function(t,e,r){"use strict";var n=t("../scatter/attributes");e.exports={x:n.x,y:n.y,xy:{valType:"data_array",editType:"calc"},indices:{valType:"data_array",editType:"calc"},xbounds:{valType:"data_array",editType:"calc"},ybounds:{valType:"data_array",editType:"calc"},text:n.text,marker:{color:{valType:"color",arrayOk:!1,editType:"calc"},opacity:{valType:"number",min:0,max:1,dflt:1,arrayOk:!1,editType:"calc"},blend:{valType:"boolean",dflt:null,editType:"calc"},sizemin:{valType:"number",min:.1,max:2,dflt:.5,editType:"calc"},sizemax:{valType:"number",min:.1,dflt:20,editType:"calc"},border:{color:{valType:"color",arrayOk:!1,editType:"calc"},arearatio:{valType:"number",min:0,max:1,dflt:0,editType:"calc"},editType:"calc"},editType:"calc"}}},{"../scatter/attributes":1015}],1003:[function(t,e,r){"use strict";var n=t("gl-pointcloud2d"),i=t("../../lib/str2rgbarray"),a=t("../../plots/cartesian/autorange").expand,o=t("../scatter/get_trace_color");function s(t,e){this.scene=t,this.uid=e,this.type="pointcloud",this.pickXData=[],this.pickYData=[],this.xData=[],this.yData=[],this.textLabels=[],this.color="rgb(0, 0, 0)",this.name="",this.hoverinfo="all",this.idToIndex=new Int32Array(0),this.bounds=[0,0,0,0],this.pointcloudOptions={positions:new Float32Array(0),idToIndex:this.idToIndex,sizemin:.5,sizemax:12,color:[0,0,0,1],areaRatio:1,borderColor:[0,0,0,1]},this.pointcloud=n(t.glplot,this.pointcloudOptions),this.pointcloud._trace=this}var l=s.prototype;l.handlePick=function(t){var e=this.idToIndex[t.pointId];return{trace:this,dataCoord:t.dataCoord,traceCoord:this.pickXYData?[this.pickXYData[2*e],this.pickXYData[2*e+1]]:[this.pickXData[e],this.pickYData[e]],textLabel:Array.isArray(this.textLabels)?this.textLabels[e]:this.textLabels,color:this.color,name:this.name,pointIndex:e,hoverinfo:this.hoverinfo}},l.update=function(t){this.index=t.index,this.textLabels=t.text,this.name=t.name,this.hoverinfo=t.hoverinfo,this.bounds=[1/0,1/0,-1/0,-1/0],this.updateFast(t),this.color=o(t,{})},l.updateFast=function(t){var e,r,n,a,o,s,l=this.xData=this.pickXData=t.x,c=this.yData=this.pickYData=t.y,u=this.pickXYData=t.xy,h=t.xbounds&&t.ybounds,f=t.indices,p=this.bounds;if(u){if(n=u,e=u.length>>>1,h)p[0]=t.xbounds[0],p[2]=t.xbounds[1],p[1]=t.ybounds[0],p[3]=t.ybounds[1];else for(s=0;s<e;s++)a=n[2*s],o=n[2*s+1],a<p[0]&&(p[0]=a),a>p[2]&&(p[2]=a),o<p[1]&&(p[1]=o),o>p[3]&&(p[3]=o);if(f)r=f;else for(r=new Int32Array(e),s=0;s<e;s++)r[s]=s}else for(e=l.length,n=new Float32Array(2*e),r=new Int32Array(e),s=0;s<e;s++)a=l[s],o=c[s],r[s]=s,n[2*s]=a,n[2*s+1]=o,a<p[0]&&(p[0]=a),a>p[2]&&(p[2]=a),o<p[1]&&(p[1]=o),o>p[3]&&(p[3]=o);this.idToIndex=r,this.pointcloudOptions.idToIndex=r,this.pointcloudOptions.positions=n;var d=i(t.marker.color),g=i(t.marker.border.color),m=t.opacity*t.marker.opacity;d[3]*=m,this.pointcloudOptions.color=d;var v=t.marker.blend;if(null===v){v=l.length<100||c.length<100}this.pointcloudOptions.blend=v,g[3]*=m,this.pointcloudOptions.borderColor=g;var y=t.marker.sizemin,x=Math.max(t.marker.sizemax,t.marker.sizemin);this.pointcloudOptions.sizeMin=y,this.pointcloudOptions.sizeMax=x,this.pointcloudOptions.areaRatio=t.marker.border.arearatio,this.pointcloud.update(this.pointcloudOptions),this.expandAxesFast(p,x/2)},l.expandAxesFast=function(t,e){var r=e||.5;a(this.scene.xaxis,[t[0],t[2]],{ppad:r}),a(this.scene.yaxis,[t[1],t[3]],{ppad:r})},l.dispose=function(){this.pointcloud.dispose()},e.exports=function(t,e){var r=new s(t,e.uid);return r.update(e),r}},{"../../lib/str2rgbarray":707,"../../plots/cartesian/autorange":731,"../scatter/get_trace_color":1024,"gl-pointcloud2d":279}],1004:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./attributes");e.exports=function(t,e,r){function a(r,a){return n.coerce(t,e,i,r,a)}a("x"),a("y"),a("xbounds"),a("ybounds"),t.xy&&t.xy instanceof Float32Array&&(e.xy=t.xy),t.indices&&t.indices instanceof Int32Array&&(e.indices=t.indices),a("text"),a("marker.color",r),a("marker.opacity"),a("marker.blend"),a("marker.sizemin"),a("marker.sizemax"),a("marker.border.color",r),a("marker.border.arearatio"),e._length=null}},{"../../lib":684,"./attributes":1002}],1005:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.calc=t("../scatter3d/calc"),n.plot=t("./convert"),n.moduleType="trace",n.name="pointcloud",n.basePlotModule=t("../../plots/gl2d"),n.categories=["gl","gl2d","showLegend"],n.meta={},e.exports=n},{"../../plots/gl2d":771,"../scatter3d/calc":1041,"./attributes":1002,"./convert":1003,"./defaults":1004}],1006:[function(t,e,r){"use strict";var n=t("../../plots/font_attributes"),i=t("../../plots/attributes"),a=t("../../components/color/attributes"),o=t("../../components/fx/attributes"),s=t("../../plots/domain").attributes,l=t("../../lib/extend").extendFlat,c=t("../../plot_api/edit_types").overrideAll;e.exports=c({hoverinfo:l({},i.hoverinfo,{flags:["label","text","value","percent","name"]}),hoverlabel:o.hoverlabel,domain:s({name:"sankey",trace:!0}),orientation:{valType:"enumerated",values:["v","h"],dflt:"h"},valueformat:{valType:"string",dflt:".3s"},valuesuffix:{valType:"string",dflt:""},arrangement:{valType:"enumerated",values:["snap","perpendicular","freeform","fixed"],dflt:"snap"},textfont:n({}),node:{label:{valType:"data_array",dflt:[]},color:{valType:"color",arrayOk:!0},line:{color:{valType:"color",dflt:a.defaultLine,arrayOk:!0},width:{valType:"number",min:0,dflt:.5,arrayOk:!0}},pad:{valType:"number",arrayOk:!1,min:0,dflt:20},thickness:{valType:"number",arrayOk:!1,min:1,dflt:20}},link:{label:{valType:"data_array",dflt:[]},color:{valType:"color",arrayOk:!0},line:{color:{valType:"color",dflt:a.defaultLine,arrayOk:!0},width:{valType:"number",min:0,dflt:0,arrayOk:!0}},source:{valType:"data_array",dflt:[]},target:{valType:"data_array",dflt:[]},value:{valType:"data_array",dflt:[]}}},"calc","nested")},{"../../components/color/attributes":557,"../../components/fx/attributes":592,"../../lib/extend":673,"../../plot_api/edit_types":715,"../../plots/attributes":729,"../../plots/domain":757,"../../plots/font_attributes":758}],1007:[function(t,e,r){"use strict";var n=t("../../plot_api/edit_types").overrideAll,i=t("../../plots/get_data").getModuleCalcData,a=t("./plot"),o=t("../../components/fx/layout_attributes");r.name="sankey",r.baseLayoutAttrOverrides=n({hoverlabel:o.hoverlabel},"plot","nested"),r.plot=function(t){var e=i(t.calcdata,"sankey")[0];a(t,e)},r.clean=function(t,e,r,n){var i=n._has&&n._has("sankey"),a=e._has&&e._has("sankey");i&&!a&&n._paperdiv.selectAll(".sankey").remove()}},{"../../components/fx/layout_attributes":601,"../../plot_api/edit_types":715,"../../plots/get_data":768,"./plot":1012}],1008:[function(t,e,r){"use strict";var n=t("strongly-connected-components"),i=t("../../lib"),a=t("../../lib/gup").wrap;e.exports=function(t,e){return function(t,e,r){for(var a=t.length,o=i.init2dArray(a,0),s=0;s<Math.min(e.length,r.length);s++)if(i.isIndex(e[s],a)&&i.isIndex(r[s],a)){if(e[s]===r[s])return!0;o[e[s]].push(r[s])}return n(o).components.some(function(t){return t.length>1})}(e.node.label,e.link.source,e.link.target)&&(i.error("Circularity is present in the Sankey data. Removing all nodes and links."),e.link.label=[],e.link.source=[],e.link.target=[],e.link.value=[],e.link.color=[],e.node.label=[],e.node.color=[]),a({link:e.link,node:e.node})}},{"../../lib":684,"../../lib/gup":681,"strongly-connected-components":491}],1009:[function(t,e,r){"use strict";e.exports={nodeTextOffsetHorizontal:4,nodeTextOffsetVertical:3,nodePadAcross:10,sankeyIterations:50,forceIterations:5,forceTicksPerFrame:10,duration:500,ease:"cubic-in-out",cn:{sankey:"sankey",sankeyLinks:"sankey-links",sankeyLink:"sankey-link",sankeyNodeSet:"sankey-node-set",sankeyNode:"sankey-node",nodeRect:"node-rect",nodeCapture:"node-capture",nodeCentered:"node-entered",nodeLabelGuide:"node-label-guide",nodeLabel:"node-label",nodeLabelTextPath:"node-label-text-path"}}},{}],1010:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./attributes"),a=t("../../components/color"),o=t("tinycolor2"),s=t("../../plots/domain").defaults;e.exports=function(t,e,r,l){function c(r,a){return n.coerce(t,e,i,r,a)}c("node.label"),c("node.pad"),c("node.thickness"),c("node.line.color"),c("node.line.width");var u=l.colorway;c("node.color",e.node.label.map(function(t,e){return a.addOpacity(function(t){return u[t%u.length]}(e),.8)})),c("link.label"),c("link.source"),c("link.target"),c("link.value"),c("link.line.color"),c("link.line.width"),c("link.color",e.link.value.map(function(){return o(l.paper_bgcolor).getLuminance()<.333?"rgba(255, 255, 255, 0.6)":"rgba(0, 0, 0, 0.2)"})),s(e,l,c),c("orientation"),c("valueformat"),c("valuesuffix"),c("arrangement"),n.coerceFont(c,"textfont",n.extendFlat({},l.font)),e._length=null}},{"../../components/color":558,"../../lib":684,"../../plots/domain":757,"./attributes":1006,tinycolor2:499}],1011:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.calc=t("./calc"),n.plot=t("./plot"),n.moduleType="trace",n.name="sankey",n.basePlotModule=t("./base_plot"),n.categories=["noOpacity"],n.meta={},e.exports=n},{"./attributes":1006,"./base_plot":1007,"./calc":1008,"./defaults":1010,"./plot":1012}],1012:[function(t,e,r){"use strict";var n=t("d3"),i=t("./render"),a=t("../../components/fx"),o=t("../../components/color"),s=t("../../lib"),l=t("./constants").cn,c=s._;function u(t){return""!==t}function h(t,e){return t.filter(function(t){return t.key===e.traceId})}function f(t,e){n.select(t).select("path").style("fill-opacity",e),n.select(t).select("rect").style("fill-opacity",e)}function p(t){n.select(t).select("text.name").style("fill","black")}function d(t){return function(e){return-1!==t.node.sourceLinks.indexOf(e.link)||-1!==t.node.targetLinks.indexOf(e.link)}}function g(t){return function(e){return-1!==e.node.sourceLinks.indexOf(t.link)||-1!==e.node.targetLinks.indexOf(t.link)}}function m(t,e,r){e&&r&&h(r,e).selectAll("."+l.sankeyLink).filter(d(e)).call(y.bind(0,e,r,!1))}function v(t,e,r){e&&r&&h(r,e).selectAll("."+l.sankeyLink).filter(d(e)).call(x.bind(0,e,r,!1))}function y(t,e,r,n){var i=n.datum().link.label;n.style("fill-opacity",.4),i&&h(e,t).selectAll("."+l.sankeyLink).filter(function(t){return t.link.label===i}).style("fill-opacity",.4),r&&h(e,t).selectAll("."+l.sankeyNode).filter(g(t)).call(m)}function x(t,e,r,n){var i=n.datum().link.label;n.style("fill-opacity",function(t){return t.tinyColorAlpha}),i&&h(e,t).selectAll("."+l.sankeyLink).filter(function(t){return t.link.label===i}).style("fill-opacity",function(t){return t.tinyColorAlpha}),r&&h(e,t).selectAll(l.sankeyNode).filter(g(t)).call(v)}function b(t,e){var r=t.hoverlabel||{},n=s.nestedProperty(r,e).get();return!Array.isArray(n)&&n}e.exports=function(t,e){var r=t._fullLayout,s=r._paper,h=r._size,d=c(t,"source:")+" ",g=c(t,"target:")+" ",_=c(t,"incoming flow count:")+" ",w=c(t,"outgoing flow count:")+" ";i(s,e,{width:h.w,height:h.h,margin:{t:h.t,r:h.r,b:h.b,l:h.l}},{linkEvents:{hover:function(e,r,i){n.select(e).call(y.bind(0,r,i,!0)),t.emit("plotly_hover",{event:n.event,points:[r.link]})},follow:function(e,i){var s=i.link.trace,l=t._fullLayout._paperdiv.node().getBoundingClientRect(),c=e.getBoundingClientRect(),h=c.left+c.width/2,m=c.top+c.height/2,v=a.loneHover({x:h-l.left,y:m-l.top,name:n.format(i.valueFormat)(i.link.value)+i.valueSuffix,text:[i.link.label||"",d+i.link.source.label,g+i.link.target.label].filter(u).join("<br>"),color:b(s,"bgcolor")||o.addOpacity(i.tinyColorHue,1),borderColor:b(s,"bordercolor"),fontFamily:b(s,"font.family"),fontSize:b(s,"font.size"),fontColor:b(s,"font.color"),idealAlign:n.event.x<h?"right":"left"},{container:r._hoverlayer.node(),outerContainer:r._paper.node(),gd:t});f(v,.65),p(v)},unhover:function(e,i,o){n.select(e).call(x.bind(0,i,o,!0)),t.emit("plotly_unhover",{event:n.event,points:[i.link]}),a.loneUnhover(r._hoverlayer.node())},select:function(e,r){var i=r.link;i.originalEvent=n.event,t._hoverdata=[i],a.click(t,{target:!0})}},nodeEvents:{hover:function(e,r,i){n.select(e).call(m,r,i),t.emit("plotly_hover",{event:n.event,points:[r.node]})},follow:function(e,i){var o=i.node.trace,s=n.select(e).select("."+l.nodeRect),c=t._fullLayout._paperdiv.node().getBoundingClientRect(),h=s.node().getBoundingClientRect(),d=h.left-2-c.left,g=h.right+2-c.left,m=h.top+h.height/4-c.top,v=a.loneHover({x0:d,x1:g,y:m,name:n.format(i.valueFormat)(i.node.value)+i.valueSuffix,text:[i.node.label,_+i.node.targetLinks.length,w+i.node.sourceLinks.length].filter(u).join("<br>"),color:b(o,"bgcolor")||i.tinyColorHue,borderColor:b(o,"bordercolor"),fontFamily:b(o,"font.family"),fontSize:b(o,"font.size"),fontColor:b(o,"font.color"),idealAlign:"left"},{container:r._hoverlayer.node(),outerContainer:r._paper.node(),gd:t});f(v,.85),p(v)},unhover:function(e,i,o){n.select(e).call(v,i,o),t.emit("plotly_unhover",{event:n.event,points:[i.node]}),a.loneUnhover(r._hoverlayer.node())},select:function(e,r,i){var o=r.node;o.originalEvent=n.event,t._hoverdata=[o],n.select(e).call(v,r,i),a.click(t,{target:!0})}}})}},{"../../components/color":558,"../../components/fx":600,"../../lib":684,"./constants":1009,"./render":1013,d3:147}],1013:[function(t,e,r){"use strict";var n=t("./constants"),i=t("d3"),a=t("tinycolor2"),o=t("../../components/color"),s=t("../../components/drawing"),l=t("@plotly/d3-sankey").sankey,c=t("d3-force"),u=t("../../lib"),h=u.isArrayOrTypedArray,f=u.isIndex,p=t("../../lib/gup"),d=p.keyFun,g=p.repeat,m=p.unwrap;function v(t){t.lastDraggedX=t.x,t.lastDraggedY=t.y}function y(t){return function(e){return e.node.originalX===t.node.originalX}}function x(t){for(var e=0;e<t.length;e++)t[e].y=t[e].y+t[e].dy/2}function b(t){t.attr("transform",function(t){return"translate("+t.node.x.toFixed(3)+", "+(t.node.y-t.node.dy/2).toFixed(3)+")"})}function _(t){var e=t.sankey.nodes();!function(t){for(var e=0;e<t.length;e++)t[e].y=t[e].y-t[e].dy/2}(e);var r=t.sankey.link()(t.link);return x(e),r}function w(t){t.call(b)}function k(t,e){t.call(w),e.attr("d",_)}function M(t){t.attr("width",function(t){return t.visibleWidth}).attr("height",function(t){return t.visibleHeight})}function A(t){return t.link.dy>1||t.linkLineWidth>0}function T(t){return"translate("+t.translateX+","+t.translateY+")"+(t.horizontal?"matrix(1 0 0 1 0 0)":"matrix(0 1 1 0 0 0)")}function S(t){return"translate("+(t.horizontal?0:t.labelY)+" "+(t.horizontal?t.labelY:0)+")"}function E(t){return i.svg.line()([[t.horizontal?t.left?-t.sizeAcross:t.visibleWidth+n.nodeTextOffsetHorizontal:n.nodeTextOffsetHorizontal,0],[t.horizontal?t.left?-n.nodeTextOffsetHorizontal:t.sizeAcross:t.visibleHeight-n.nodeTextOffsetHorizontal,0]])}function C(t){return t.horizontal?"matrix(1 0 0 1 0 0)":"matrix(0 1 1 0 0 0)"}function L(t){return t.horizontal?"scale(1 1)":"scale(-1 1)"}function z(t){return t.darkBackground&&!t.horizontal?"rgb(255,255,255)":"rgb(0,0,0)"}function P(t){return t.horizontal&&t.left?"100%":"0%"}function I(t,e,r){t.on(".basic",null).on("mouseover.basic",function(t){t.interactionState.dragInProgress||(r.hover(this,t,e),t.interactionState.hovered=[this,t])}).on("mousemove.basic",function(t){t.interactionState.dragInProgress||(r.follow(this,t),t.interactionState.hovered=[this,t])}).on("mouseout.basic",function(t){t.interactionState.dragInProgress||(r.unhover(this,t,e),t.interactionState.hovered=!1)}).on("click.basic",function(t){t.interactionState.hovered&&(r.unhover(this,t,e),t.interactionState.hovered=!1),t.interactionState.dragInProgress||r.select(this,t,e)})}function O(t,e,r){var a=i.behavior.drag().origin(function(t){return t.node}).on("dragstart",function(i){if("fixed"!==i.arrangement&&(u.raiseToTop(this),i.interactionState.dragInProgress=i.node,v(i.node),i.interactionState.hovered&&(r.nodeEvents.unhover.apply(0,i.interactionState.hovered),i.interactionState.hovered=!1),"snap"===i.arrangement)){var a=i.traceId+"|"+Math.floor(i.node.originalX);i.forceLayouts[a]?i.forceLayouts[a].alpha(1):function(t,e,r){var i=r.sankey.nodes().filter(function(t){return t.originalX===r.node.originalX});r.forceLayouts[e]=c.forceSimulation(i).alphaDecay(0).force("collide",c.forceCollide().radius(function(t){return t.dy/2+r.nodePad/2}).strength(1).iterations(n.forceIterations)).force("constrain",function(t,e,r,i){return function(){for(var t=0,a=0;a<r.length;a++){var o=r[a];o===i.interactionState.dragInProgress?(o.x=o.lastDraggedX,o.y=o.lastDraggedY):(o.vx=(o.originalX-o.x)/n.forceTicksPerFrame,o.y=Math.min(i.size-o.dy/2,Math.max(o.dy/2,o.y))),t=Math.max(t,Math.abs(o.vx),Math.abs(o.vy))}!i.interactionState.dragInProgress&&t<.1&&i.forceLayouts[e].alpha()>0&&i.forceLayouts[e].alpha(0)}}(0,e,i,r)).stop()}(0,a,i),function(t,e,r,i){window.requestAnimationFrame(function a(){for(var o=0;o<n.forceTicksPerFrame;o++)r.forceLayouts[i].tick();r.sankey.relayout(),k(t.filter(y(r)),e),r.forceLayouts[i].alpha()>0&&window.requestAnimationFrame(a)})}(t,e,i,a)}}).on("drag",function(r){if("fixed"!==r.arrangement){var n=i.event.x,a=i.event.y;"snap"===r.arrangement?(r.node.x=n,r.node.y=a):("freeform"===r.arrangement&&(r.node.x=n),r.node.y=Math.max(r.node.dy/2,Math.min(r.size-r.node.dy/2,a))),v(r.node),"snap"!==r.arrangement&&(r.sankey.relayout(),k(t.filter(y(r)),e))}}).on("dragend",function(t){t.interactionState.dragInProgress=!1});t.on(".drag",null).call(a)}e.exports=function(t,e,r,i){var c=t.selectAll("."+n.cn.sankey).data(e.filter(function(t){return m(t).trace.visible}).map(function(t,e,r){var i,a=m(e).trace,o=a.domain,s=a.node,c=a.link,u=a.arrangement,p="h"===a.orientation,d=a.node.pad,g=a.node.thickness,v=a.node.line.color,y=a.node.line.width,b=a.link.line.color,_=a.link.line.width,w=a.valueformat,k=a.valuesuffix,M=a.textfont,A=t.width*(o.x[1]-o.x[0]),T=t.height*(o.y[1]-o.y[0]),S=[],E=h(c.color),C={},L=s.label.length;for(i=0;i<c.value.length;i++){var z=c.value[i],P=c.source[i],I=c.target[i];z>0&&f(P,L)&&f(I,L)&&(I=+I,C[P=+P]=C[I]=!0,S.push({pointNumber:i,label:c.label[i],color:E?c.color[i]:c.color,source:P,target:I,value:+z}))}var O=h(s.color),D=[],R=!1,B={};for(i=0;i<L;i++)if(C[i]){var F=s.label[i];B[i]=D.length,D.push({pointNumber:i,label:F,color:O?s.color[i]:s.color})}else R=!0;if(R)for(i=0;i<S.length;i++)S[i].source=B[S[i].source],S[i].target=B[S[i].target];for(var N,j=l().size(p?[A,T]:[T,A]).nodeWidth(g).nodePadding(d).nodes(D).links(S).layout(n.sankeyIterations),V=j.nodes(),U=0;U<V.length;U++)(N=V[U]).width=A,N.height=T;return x(D),{key:r,trace:a,guid:Math.floor(1e12*(1+Math.random())),horizontal:p,width:A,height:T,nodePad:d,nodeLineColor:v,nodeLineWidth:y,linkLineColor:b,linkLineWidth:_,valueFormat:w,valueSuffix:k,textFont:M,translateX:o.x[0]*A+t.margin.l,translateY:t.height-o.y[1]*t.height+t.margin.t,dragParallel:p?T:A,dragPerpendicular:p?A:T,nodes:D,links:S,arrangement:u,sankey:j,forceLayouts:{},interactionState:{dragInProgress:!1,hovered:!1}}}.bind(null,r)),d);c.exit().remove(),c.enter().append("g").classed(n.cn.sankey,!0).style("box-sizing","content-box").style("position","absolute").style("left",0).style("shape-rendering","geometricPrecision").style("pointer-events","auto").attr("transform",T),c.transition().ease(n.ease).duration(n.duration).attr("transform",T);var u=c.selectAll("."+n.cn.sankeyLinks).data(g,d);u.enter().append("g").classed(n.cn.sankeyLinks,!0).style("fill","none");var p=u.selectAll("."+n.cn.sankeyLink).data(function(t){return t.sankey.links().filter(function(t){return t.value}).map(function(t,e,r){var n=a(r.color),i=r.source.label+"|"+r.target.label,s=t[i];t[i]=(s||0)+1;var l=i+"__"+t[i];return r.trace=e.trace,r.curveNumber=e.trace.index,{key:l,traceId:e.key,link:r,tinyColorHue:o.tinyRGB(n),tinyColorAlpha:n.getAlpha(),linkLineColor:e.linkLineColor,linkLineWidth:e.linkLineWidth,valueFormat:e.valueFormat,valueSuffix:e.valueSuffix,sankey:e.sankey,interactionState:e.interactionState}}.bind(null,{},t))},d);p.enter().append("path").classed(n.cn.sankeyLink,!0).attr("d",_).call(I,c,i.linkEvents),p.style("stroke",function(t){return A(t)?o.tinyRGB(a(t.linkLineColor)):t.tinyColorHue}).style("stroke-opacity",function(t){return A(t)?o.opacity(t.linkLineColor):t.tinyColorAlpha}).style("stroke-width",function(t){return A(t)?t.linkLineWidth:1}).style("fill",function(t){return t.tinyColorHue}).style("fill-opacity",function(t){return t.tinyColorAlpha}),p.transition().ease(n.ease).duration(n.duration).attr("d",_),p.exit().transition().ease(n.ease).duration(n.duration).style("opacity",0).remove();var v=c.selectAll("."+n.cn.sankeyNodeSet).data(g,d);v.enter().append("g").classed(n.cn.sankeyNodeSet,!0),v.style("cursor",function(t){switch(t.arrangement){case"fixed":return"default";case"perpendicular":return"ns-resize";default:return"move"}});var y=v.selectAll("."+n.cn.sankeyNode).data(function(t){var e=t.sankey.nodes();return function(t){var e,r=[];for(e=0;e<t.length;e++)t[e].originalX=t[e].x,t[e].originalY=t[e].y,-1===r.indexOf(t[e].x)&&r.push(t[e].x);for(r.sort(function(t,e){return t-e}),e=0;e<t.length;e++)t[e].originalLayerIndex=r.indexOf(t[e].originalX),t[e].originalLayer=t[e].originalLayerIndex/(r.length-1)}(e),e.filter(function(t){return t.value}).map(function(t,e,r){var i=a(r.color),s=n.nodePadAcross,l=e.nodePad/2,c=r.dx,u=Math.max(.5,r.dy),h=r.label,f=t[h];t[h]=(f||0)+1;var p=h+"__"+t[h];return r.trace=e.trace,r.curveNumber=e.trace.index,{key:p,traceId:e.key,node:r,nodePad:e.nodePad,nodeLineColor:e.nodeLineColor,nodeLineWidth:e.nodeLineWidth,textFont:e.textFont,size:e.horizontal?e.height:e.width,visibleWidth:Math.ceil(c),visibleHeight:u,zoneX:-s,zoneY:-l,zoneWidth:c+2*s,zoneHeight:u+2*l,labelY:e.horizontal?r.dy/2+1:r.dx/2+1,left:1===r.originalLayer,sizeAcross:e.width,forceLayouts:e.forceLayouts,horizontal:e.horizontal,darkBackground:i.getBrightness()<=128,tinyColorHue:o.tinyRGB(i),tinyColorAlpha:i.getAlpha(),valueFormat:e.valueFormat,valueSuffix:e.valueSuffix,sankey:e.sankey,arrangement:e.arrangement,uniqueNodeLabelPathId:[e.guid,e.key,p].join(" "),interactionState:e.interactionState}}.bind(null,{},t))},d);y.enter().append("g").classed(n.cn.sankeyNode,!0).call(b).call(I,c,i.nodeEvents),y.call(O,p,i),y.transition().ease(n.ease).duration(n.duration).call(b),y.exit().transition().ease(n.ease).duration(n.duration).style("opacity",0).remove();var w=y.selectAll("."+n.cn.nodeRect).data(g);w.enter().append("rect").classed(n.cn.nodeRect,!0).call(M),w.style("stroke-width",function(t){return t.nodeLineWidth}).style("stroke",function(t){return o.tinyRGB(a(t.nodeLineColor))}).style("stroke-opacity",function(t){return o.opacity(t.nodeLineColor)}).style("fill",function(t){return t.tinyColorHue}).style("fill-opacity",function(t){return t.tinyColorAlpha}),w.transition().ease(n.ease).duration(n.duration).call(M);var k=y.selectAll("."+n.cn.nodeCapture).data(g);k.enter().append("rect").classed(n.cn.nodeCapture,!0).style("fill-opacity",0),k.attr("x",function(t){return t.zoneX}).attr("y",function(t){return t.zoneY}).attr("width",function(t){return t.zoneWidth}).attr("height",function(t){return t.zoneHeight});var D=y.selectAll("."+n.cn.nodeCentered).data(g);D.enter().append("g").classed(n.cn.nodeCentered,!0).attr("transform",S),D.transition().ease(n.ease).duration(n.duration).attr("transform",S);var R=D.selectAll("."+n.cn.nodeLabelGuide).data(g);R.enter().append("path").classed(n.cn.nodeLabelGuide,!0).attr("id",function(t){return t.uniqueNodeLabelPathId}).attr("d",E).attr("transform",C),R.transition().ease(n.ease).duration(n.duration).attr("d",E).attr("transform",C);var B=D.selectAll("."+n.cn.nodeLabel).data(g);B.enter().append("text").classed(n.cn.nodeLabel,!0).attr("transform",L).style("user-select","none").style("cursor","default").style("fill","black"),B.style("text-shadow",function(t){return t.horizontal?"-1px 1px 1px #fff, 1px 1px 1px #fff, 1px -1px 1px #fff, -1px -1px 1px #fff":"none"}).each(function(t){s.font(B,t.textFont)}),B.transition().ease(n.ease).duration(n.duration).attr("transform",L);var F=B.selectAll("."+n.cn.nodeLabelTextPath).data(g);F.enter().append("textPath").classed(n.cn.nodeLabelTextPath,!0).attr("alignment-baseline","middle").attr("xlink:href",function(t){return"#"+t.uniqueNodeLabelPathId}).attr("startOffset",P).style("fill",z),F.text(function(t){return t.horizontal||t.node.dy>5?t.node.label:""}).attr("text-anchor",function(t){return t.horizontal&&t.left?"end":"start"}),F.transition().ease(n.ease).duration(n.duration).attr("startOffset",P).style("fill",z)}},{"../../components/color":558,"../../components/drawing":583,"../../lib":684,"../../lib/gup":681,"./constants":1009,"@plotly/d3-sankey":49,d3:147,"d3-force":143,tinycolor2:499}],1014:[function(t,e,r){"use strict";var n=t("../../lib");e.exports=function(t,e){for(var r=0;r<t.length;r++)t[r].i=r;n.mergeArray(e.text,t,"tx"),n.mergeArray(e.hovertext,t,"htx"),n.mergeArray(e.customdata,t,"data"),n.mergeArray(e.textposition,t,"tp"),e.textfont&&(n.mergeArray(e.textfont.size,t,"ts"),n.mergeArray(e.textfont.color,t,"tc"),n.mergeArray(e.textfont.family,t,"tf"));var i=e.marker;if(i){n.mergeArray(i.size,t,"ms"),n.mergeArray(i.opacity,t,"mo"),n.mergeArray(i.symbol,t,"mx"),n.mergeArray(i.color,t,"mc");var a=i.line;i.line&&(n.mergeArray(a.color,t,"mlc"),n.mergeArray(a.width,t,"mlw"));var o=i.gradient;o&&"none"!==o.type&&(n.mergeArray(o.type,t,"mgt"),n.mergeArray(o.color,t,"mgc"))}}},{"../../lib":684}],1015:[function(t,e,r){"use strict";var n=t("../../components/colorscale/attributes"),i=t("../../components/colorbar/attributes"),a=t("../../plots/font_attributes"),o=t("../../components/drawing/attributes").dash,s=t("../../components/drawing"),l=(t("./constants"),t("../../lib/extend").extendFlat);e.exports={x:{valType:"data_array",editType:"calc+clearAxisTypes"},x0:{valType:"any",dflt:0,editType:"calc+clearAxisTypes"},dx:{valType:"number",dflt:1,editType:"calc"},y:{valType:"data_array",editType:"calc+clearAxisTypes"},y0:{valType:"any",dflt:0,editType:"calc+clearAxisTypes"},dy:{valType:"number",dflt:1,editType:"calc"},text:{valType:"string",dflt:"",arrayOk:!0,editType:"calc"},hovertext:{valType:"string",dflt:"",arrayOk:!0,editType:"style"},mode:{valType:"flaglist",flags:["lines","markers","text"],extras:["none"],editType:"calc"},hoveron:{valType:"flaglist",flags:["points","fills"],editType:"style"},line:{color:{valType:"color",editType:"style"},width:{valType:"number",min:0,dflt:2,editType:"style"},shape:{valType:"enumerated",values:["linear","spline","hv","vh","hvh","vhv"],dflt:"linear",editType:"plot"},smoothing:{valType:"number",min:0,max:1.3,dflt:1,editType:"plot"},dash:l({},o,{editType:"style"}),simplify:{valType:"boolean",dflt:!0,editType:"plot"},editType:"plot"},connectgaps:{valType:"boolean",dflt:!1,editType:"calc"},cliponaxis:{valType:"boolean",dflt:!0,editType:"plot"},fill:{valType:"enumerated",values:["none","tozeroy","tozerox","tonexty","tonextx","toself","tonext"],dflt:"none",editType:"calc"},fillcolor:{valType:"color",editType:"style"},marker:l({symbol:{valType:"enumerated",values:s.symbolList,dflt:"circle",arrayOk:!0,editType:"style"},opacity:{valType:"number",min:0,max:1,arrayOk:!0,editType:"style"},size:{valType:"number",min:0,dflt:6,arrayOk:!0,editType:"calcIfAutorange"},maxdisplayed:{valType:"number",min:0,dflt:0,editType:"plot"},sizeref:{valType:"number",dflt:1,editType:"calc"},sizemin:{valType:"number",min:0,dflt:0,editType:"calc"},sizemode:{valType:"enumerated",values:["diameter","area"],dflt:"diameter",editType:"calc"},colorbar:i,line:l({width:{valType:"number",min:0,arrayOk:!0,editType:"style"},editType:"calc"},n("marker.line")),gradient:{type:{valType:"enumerated",values:["radial","horizontal","vertical","none"],arrayOk:!0,dflt:"none",editType:"calc"},color:{valType:"color",arrayOk:!0,editType:"calc"},editType:"calc"},editType:"calc"},n("marker")),selected:{marker:{opacity:{valType:"number",min:0,max:1,editType:"style"},color:{valType:"color",editType:"style"},size:{valType:"number",min:0,editType:"style"},editType:"style"},textfont:{color:{valType:"color",editType:"style"},editType:"style"},editType:"style"},unselected:{marker:{opacity:{valType:"number",min:0,max:1,editType:"style"},color:{valType:"color",editType:"style"},size:{valType:"number",min:0,editType:"style"},editType:"style"},textfont:{color:{valType:"color",editType:"style"},editType:"style"},editType:"style"},textposition:{valType:"enumerated",values:["top left","top center","top right","middle left","middle center","middle right","bottom left","bottom center","bottom right"],dflt:"middle center",arrayOk:!0,editType:"calc"},textfont:a({editType:"calc",colorEditType:"style",arrayOk:!0}),r:{valType:"data_array",editType:"calc"},t:{valType:"data_array",editType:"calc"}}},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../components/drawing":583,"../../components/drawing/attributes":582,"../../lib/extend":673,"../../plots/font_attributes":758,"./constants":1020}],1016:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib").isArrayOrTypedArray,a=t("../../plots/cartesian/axes"),o=t("../../constants/numerical").BADNUM,s=t("./subtypes"),l=t("./colorscale_calc"),c=t("./arrays_to_calcdata"),u=t("./calc_selection");function h(t,e,r,n,i,o,l){var c=e._length;r._minDtick=0,n._minDtick=0;var u={padded:!0},h={padded:!0};l&&(u.ppad=h.ppad=l),!("tozerox"===e.fill||"tonextx"===e.fill&&t.firstscatter)||i[0]===i[c-1]&&o[0]===o[c-1]?(e.error_y||{}).visible||-1===["tonexty","tozeroy"].indexOf(e.fill)&&(s.hasMarkers(e)||s.hasText(e))||(u.padded=!1,u.ppad=0):u.tozero=!0,!("tozeroy"===e.fill||"tonexty"===e.fill&&t.firstscatter)||i[0]===i[c-1]&&o[0]===o[c-1]?-1!==["tonextx","tozerox"].indexOf(e.fill)&&(h.padded=!1):h.tozero=!0,a.expand(r,i,u),a.expand(n,o,h)}function f(t,e){if(s.hasMarkers(t)){var r,n=t.marker,o=1.6*(t.marker.sizeref||1);if(r="area"===t.marker.sizemode?function(t){return Math.max(Math.sqrt((t||0)/o),3)}:function(t){return Math.max((t||0)/o,3)},i(n.size)){var l={type:"linear"};a.setConvert(l);for(var c=l.makeCalcdata(t.marker,"size"),u=new Array(e),h=0;h<e;h++)u[h]=r(c[h]);return u}return r(n.size)}}e.exports={calc:function(t,e){var r=a.getFromId(t,e.xaxis||"x"),i=a.getFromId(t,e.yaxis||"y"),s=r.makeCalcdata(e,"x"),p=i.makeCalcdata(e,"y"),d=e._length,g=new Array(d);h(t,e,r,i,s,p,f(e,d));for(var m=0;m<d;m++)g[m]=n(s[m])&&n(p[m])?{x:s[m],y:p[m]}:{x:o,y:o},e.ids&&(g[m].id=String(e.ids[m]));return c(g,e),l(e),u(g,e),t.firstscatter=!1,g},calcMarkerSize:f,calcAxisExpansion:h}},{"../../constants/numerical":661,"../../lib":684,"../../plots/cartesian/axes":732,"./arrays_to_calcdata":1014,"./calc_selection":1017,"./colorscale_calc":1019,"./subtypes":1037,"fast-isnumeric":214}],1017:[function(t,e,r){"use strict";var n=t("../../lib");e.exports=function(t,e){n.isArrayOrTypedArray(e.selectedpoints)&&n.tagSelected(t,e)}},{"../../lib":684}],1018:[function(t,e,r){"use strict";e.exports=function(t){for(var e=0;e<t.length;e++){var r=t[e];if("scatter"===r.type){var n=r.fill;if("none"!==n&&"toself"!==n&&(r.opacity=void 0,"tonexty"===n||"tonextx"===n))for(var i=e-1;i>=0;i--){var a=t[i];if("scatter"===a.type&&a.xaxis===r.xaxis&&a.yaxis===r.yaxis){a.opacity=void 0;break}}}}}},{}],1019:[function(t,e,r){"use strict";var n=t("../../components/colorscale/has_colorscale"),i=t("../../components/colorscale/calc"),a=t("./subtypes");e.exports=function(t){a.hasLines(t)&&n(t,"line")&&i(t,t.line.color,"line","c"),a.hasMarkers(t)&&(n(t,"marker")&&i(t,t.marker.color,"marker","c"),n(t,"marker.line")&&i(t,t.marker.line.color,"marker.line","c"))}},{"../../components/colorscale/calc":566,"../../components/colorscale/has_colorscale":572,"./subtypes":1037}],1020:[function(t,e,r){"use strict";e.exports={PTS_LINESONLY:20,minTolerance:.2,toleranceGrowth:10,maxScreensAway:20}},{}],1021:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../registry"),a=t("./attributes"),o=t("./constants"),s=t("./subtypes"),l=t("./xy_defaults"),c=t("./marker_defaults"),u=t("./line_defaults"),h=t("./line_shape_defaults"),f=t("./text_defaults"),p=t("./fillcolor_defaults");e.exports=function(t,e,r,d){function g(r,i){return n.coerce(t,e,a,r,i)}var m=l(t,e,d,g),v=m<o.PTS_LINESONLY?"lines+markers":"lines";if(m){g("text"),g("hovertext"),g("mode",v),s.hasLines(e)&&(u(t,e,r,d,g),h(t,e,g),g("connectgaps"),g("line.simplify")),s.hasMarkers(e)&&c(t,e,r,d,g,{gradient:!0}),s.hasText(e)&&f(t,e,d,g);var y=[];(s.hasMarkers(e)||s.hasText(e))&&(g("cliponaxis"),g("marker.maxdisplayed"),y.push("points")),g("fill"),"none"!==e.fill&&(p(t,e,r,g),s.hasLines(e)||h(t,e,g)),"tonext"!==e.fill&&"toself"!==e.fill||y.push("fills"),g("hoveron",y.join("+")||"points");var x=i.getComponentMethod("errorbars","supplyDefaults");x(t,e,r,{axis:"y"}),x(t,e,r,{axis:"x",inherit:"y"}),n.coerceSelectionMarkerOpacity(e,g)}else e.visible=!1}},{"../../lib":684,"../../registry":817,"./attributes":1015,"./constants":1020,"./fillcolor_defaults":1023,"./line_defaults":1027,"./line_shape_defaults":1029,"./marker_defaults":1033,"./subtypes":1037,"./text_defaults":1038,"./xy_defaults":1039}],1022:[function(t,e,r){"use strict";var n=t("../../lib");function i(t){return t||0===t}e.exports=function(t,e,r){var a=Array.isArray(r)?function(t){r.push(t)}:function(t){r.text=t},o=n.extractOption(t,e,"htx","hovertext");if(i(o))return a(o);var s=n.extractOption(t,e,"tx","text");return i(s)?a(s):void 0}},{"../../lib":684}],1023:[function(t,e,r){"use strict";var n=t("../../components/color"),i=t("../../lib").isArrayOrTypedArray;e.exports=function(t,e,r,a){var o=!1;if(e.marker){var s=e.marker.color,l=(e.marker.line||{}).color;s&&!i(s)?o=s:l&&!i(l)&&(o=l)}a("fillcolor",n.addOpacity((e.line||{}).color||o||r,.5))}},{"../../components/color":558,"../../lib":684}],1024:[function(t,e,r){"use strict";var n=t("../../components/color"),i=t("./subtypes");e.exports=function(t,e){var r,a;if("lines"===t.mode)return(r=t.line.color)&&n.opacity(r)?r:t.fillcolor;if("none"===t.mode)return t.fill?t.fillcolor:"";var o=e.mcc||(t.marker||{}).color,s=e.mlcc||((t.marker||{}).line||{}).color;return(a=o&&n.opacity(o)?o:s&&n.opacity(s)&&(e.mlw||((t.marker||{}).line||{}).width)?s:"")?n.opacity(a)<.3?n.addOpacity(a,.3):a:(r=(t.line||{}).color)&&n.opacity(r)&&i.hasLines(t)&&t.line.width?r:t.fillcolor}},{"../../components/color":558,"./subtypes":1037}],1025:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../components/fx"),a=t("../../registry"),o=t("./get_trace_color"),s=t("../../components/color"),l=t("./fill_hover_text");e.exports=function(t,e,r,c){var u=t.cd,h=u[0].trace,f=t.xa,p=t.ya,d=f.c2p(e),g=p.c2p(r),m=[d,g],v=h.hoveron||"",y=-1!==h.mode.indexOf("markers")?3:.5;if(-1!==v.indexOf("points")){var x=function(t){var e=Math.max(y,t.mrc||0),r=f.c2p(t.x)-d,n=p.c2p(t.y)-g;return Math.max(Math.sqrt(r*r+n*n)-e,1-y/e)},b=i.getDistanceFunction(c,function(t){var e=Math.max(3,t.mrc||0),r=1-1/e,n=Math.abs(f.c2p(t.x)-d);return n<e?r*n/e:n-e+r},function(t){var e=Math.max(3,t.mrc||0),r=1-1/e,n=Math.abs(p.c2p(t.y)-g);return n<e?r*n/e:n-e+r},x);if(i.getClosest(u,b,t),!1!==t.index){var _=u[t.index],w=f.c2p(_.x,!0),k=p.c2p(_.y,!0),M=_.mrc||1;return n.extendFlat(t,{color:o(h,_),x0:w-M,x1:w+M,xLabelVal:_.x,y0:k-M,y1:k+M,yLabelVal:_.y,spikeDistance:x(_)}),l(_,h,t),a.getComponentMethod("errorbars","hoverInfo")(_,h,t),[t]}}if(-1!==v.indexOf("fills")&&h._polygons){var A,T,S,E,C,L,z,P,I,O=h._polygons,D=[],R=!1,B=1/0,F=-1/0,N=1/0,j=-1/0;for(A=0;A<O.length;A++)(S=O[A]).contains(m)&&(R=!R,D.push(S),N=Math.min(N,S.ymin),j=Math.max(j,S.ymax));if(R){var V=((N=Math.max(N,0))+(j=Math.min(j,p._length)))/2;for(A=0;A<D.length;A++)for(E=D[A].pts,T=1;T<E.length;T++)(P=E[T-1][1])>V!=(I=E[T][1])>=V&&(L=E[T-1][0],z=E[T][0],I-P&&(C=L+(z-L)*(V-P)/(I-P),B=Math.min(B,C),F=Math.max(F,C)));B=Math.max(B,0),F=Math.min(F,f._length);var U=s.defaultLine;return s.opacity(h.fillcolor)?U=h.fillcolor:s.opacity((h.line||{}).color)&&(U=h.line.color),n.extendFlat(t,{distance:t.maxHoverDistance,x0:B,x1:F,y0:V,y1:V,color:U}),delete t.index,h.text&&!Array.isArray(h.text)?t.text=String(h.text):t.text=h.name,[t]}}}},{"../../components/color":558,"../../components/fx":600,"../../lib":684,"../../registry":817,"./fill_hover_text":1022,"./get_trace_color":1024}],1026:[function(t,e,r){"use strict";var n={},i=t("./subtypes");n.hasLines=i.hasLines,n.hasMarkers=i.hasMarkers,n.hasText=i.hasText,n.isBubble=i.isBubble,n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.cleanData=t("./clean_data"),n.calc=t("./calc").calc,n.arraysToCalcdata=t("./arrays_to_calcdata"),n.plot=t("./plot"),n.colorbar=t("./marker_colorbar"),n.style=t("./style").style,n.styleOnSelect=t("./style").styleOnSelect,n.hoverPoints=t("./hover"),n.selectPoints=t("./select"),n.animatable=!0,n.moduleType="trace",n.name="scatter",n.basePlotModule=t("../../plots/cartesian"),n.categories=["cartesian","svg","symbols","errorBarsOK","showLegend","scatter-like","zoomScale"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"./arrays_to_calcdata":1014,"./attributes":1015,"./calc":1016,"./clean_data":1018,"./defaults":1021,"./hover":1025,"./marker_colorbar":1032,"./plot":1034,"./select":1035,"./style":1036,"./subtypes":1037}],1027:[function(t,e,r){"use strict";var n=t("../../lib").isArrayOrTypedArray,i=t("../../components/colorscale/has_colorscale"),a=t("../../components/colorscale/defaults");e.exports=function(t,e,r,o,s,l){var c=(t.marker||{}).color;(s("line.color",r),i(t,"line"))?a(t,e,o,s,{prefix:"line.",cLetter:"c"}):s("line.color",!n(c)&&c||r);s("line.width"),(l||{}).noDash||s("line.dash")}},{"../../components/colorscale/defaults":568,"../../components/colorscale/has_colorscale":572,"../../lib":684}],1028:[function(t,e,r){"use strict";var n=t("../../constants/numerical").BADNUM,i=t("../../lib"),a=i.segmentsIntersect,o=i.constrain,s=t("./constants");e.exports=function(t,e){var r,l,c,u,h,f,p,d,g,m,v,y,x,b,_,w,k,M,A=e.xaxis,T=e.yaxis,S=e.connectGaps,E=e.baseTolerance,C=e.shape,L="linear"===C,z=[],P=s.minTolerance,I=new Array(t.length),O=0;function D(e){var r=t[e];if(!r)return!1;var i=A.c2p(r.x),a=T.c2p(r.y);return i===n||a===n?r.intoCenter||!1:[i,a]}function R(t,e,r,n){var i=r-t,a=n-e,o=.5-t,s=.5-e,l=i*i+a*a,c=i*o+a*s;if(c>0&&c<l){var u=o*a-s*i;if(u*u<l)return!0}}function B(t,e){var r=t[0]/A._length,n=t[1]/T._length,i=Math.max(0,-r,r-1,-n,n-1);return i&&void 0!==k&&R(r,n,k,M)&&(i=0),i&&e&&R(r,n,e[0]/A._length,e[1]/T._length)&&(i=0),(1+s.toleranceGrowth*i)*E}function F(t,e){var r=t[0]-e[0],n=t[1]-e[1];return Math.sqrt(r*r+n*n)}var N,j,V,U,q,H,G,W=s.maxScreensAway,Y=-A._length*W,X=A._length*(1+W),Z=-T._length*W,$=T._length*(1+W),J=[[Y,Z,X,Z],[X,Z,X,$],[X,$,Y,$],[Y,$,Y,Z]];function K(t){if(t[0]<Y||t[0]>X||t[1]<Z||t[1]>$)return[o(t[0],Y,X),o(t[1],Z,$)]}function Q(t,e){return t[0]===e[0]&&(t[0]===Y||t[0]===X)||(t[1]===e[1]&&(t[1]===Z||t[1]===$)||void 0)}function tt(t,e,r){return function(n,a){var o=K(n),s=K(a),l=[];if(o&&s&&Q(o,s))return l;o&&l.push(o),s&&l.push(s);var c=2*i.constrain((n[t]+a[t])/2,e,r)-((o||n)[t]+(s||a)[t]);c&&((o&&s?c>0==o[t]>s[t]?o:s:o||s)[t]+=c);return l}}function et(t){var e=t[0],r=t[1],n=e===I[O-1][0],i=r===I[O-1][1];if(!n||!i)if(O>1){var a=e===I[O-2][0],o=r===I[O-2][1];n&&(e===Y||e===X)&&a?o?O--:I[O-1]=t:i&&(r===Z||r===$)&&o?a?O--:I[O-1]=t:I[O++]=t}else I[O++]=t}function rt(t){I[O-1][0]!==t[0]&&I[O-1][1]!==t[1]&&et([V,U]),et(t),q=null,V=U=0}function nt(t){if(k=t[0]/A._length,M=t[1]/T._length,N=t[0]<Y?Y:t[0]>X?X:0,j=t[1]<Z?Z:t[1]>$?$:0,N||j){if(O)if(q){var e=G(q,t);e.length>1&&(rt(e[0]),I[O++]=e[1])}else H=G(I[O-1],t)[0],I[O++]=H;else I[O++]=[N||t[0],j||t[1]];var r=I[O-1];N&&j&&(r[0]!==N||r[1]!==j)?(q&&(V!==N&&U!==j?et(V&&U?(n=q,a=(i=t)[0]-n[0],o=(i[1]-n[1])/a,(n[1]*i[0]-i[1]*n[0])/a>0?[o>0?Y:X,$]:[o>0?X:Y,Z]):[V||N,U||j]):V&&U&&et([V,U])),et([N,j])):V-N&&U-j&&et([N||V,j||U]),q=t,V=N,U=j}else q&&rt(G(q,t)[0]),I[O++]=t;var n,i,a,o}for("linear"===C||"spline"===C?G=function(t,e){for(var r=[],n=0,i=0;i<4;i++){var o=J[i],s=a(t[0],t[1],e[0],e[1],o[0],o[1],o[2],o[3]);s&&(!n||Math.abs(s.x-r[0][0])>1||Math.abs(s.y-r[0][1])>1)&&(s=[s.x,s.y],n&&F(s,t)<F(r[0],t)?r.unshift(s):r.push(s),n++)}return r}:"hv"===C||"vh"===C?G=function(t,e){var r=[],n=K(t),i=K(e);return n&&i&&Q(n,i)?r:(n&&r.push(n),i&&r.push(i),r)}:"hvh"===C?G=tt(0,Y,X):"vhv"===C&&(G=tt(1,Z,$)),r=0;r<t.length;r++)if(l=D(r)){for(O=0,q=null,nt(l),r++;r<t.length;r++){if(!(u=D(r))){if(S)continue;break}if(L&&e.simplify){var it=D(r+1);if(!((m=F(u,l))<B(u,it)*P)){for(d=[(u[0]-l[0])/m,(u[1]-l[1])/m],h=l,v=m,y=b=_=0,p=!1,c=u,r++;r<t.length;r++){if(f=it,it=D(r+1),!f){if(S)continue;break}if(w=(g=[f[0]-l[0],f[1]-l[1]])[0]*d[1]-g[1]*d[0],b=Math.min(b,w),(_=Math.max(_,w))-b>B(f,it))break;c=f,(x=g[0]*d[0]+g[1]*d[1])>v?(v=x,u=f,p=!1):x<y&&(y=x,h=f,p=!0)}if(p?(nt(u),c!==h&&nt(h)):(h!==l&&nt(h),c!==u&&nt(u)),nt(c),r>=t.length||!f)break;nt(f),l=f}}else nt(u)}q&&et([V||q[0],U||q[1]]),z.push(I.slice(0,O))}return z}},{"../../constants/numerical":661,"../../lib":684,"./constants":1020}],1029:[function(t,e,r){"use strict";e.exports=function(t,e,r){"spline"===r("line.shape")&&r("line.smoothing")}},{}],1030:[function(t,e,r){"use strict";e.exports=function(t,e,r){var n,i,a=null;for(i=0;i<r.length;++i)!0===(n=r[i][0].trace).visible?(n._nexttrace=null,-1!==["tonextx","tonexty","tonext"].indexOf(n.fill)&&(n._prevtrace=a,a&&(a._nexttrace=n)),a=n):n._prevtrace=n._nexttrace=null}},{}],1031:[function(t,e,r){"use strict";var n=t("fast-isnumeric");e.exports=function(t){var e=t.marker,r=e.sizeref||1,i=e.sizemin||0,a="area"===e.sizemode?function(t){return Math.sqrt(t/r)}:function(t){return t/r};return function(t){var e=a(t/2);return n(e)&&e>0?Math.max(e,i):0}}},{"fast-isnumeric":214}],1032:[function(t,e,r){"use strict";e.exports={container:"marker",min:"cmin",max:"cmax"}},{}],1033:[function(t,e,r){"use strict";var n=t("../../components/color"),i=t("../../components/colorscale/has_colorscale"),a=t("../../components/colorscale/defaults"),o=t("./subtypes");e.exports=function(t,e,r,s,l,c){var u=o.isBubble(t),h=(t.line||{}).color;(c=c||{},h&&(r=h),l("marker.symbol"),l("marker.opacity",u?.7:1),l("marker.size"),l("marker.color",r),i(t,"marker")&&a(t,e,s,l,{prefix:"marker.",cLetter:"c"}),c.noSelect||(l("selected.marker.color"),l("unselected.marker.color"),l("selected.marker.size"),l("unselected.marker.size")),c.noLine||(l("marker.line.color",h&&!Array.isArray(h)&&e.marker.color!==h?h:u?n.background:n.defaultLine),i(t,"marker.line")&&a(t,e,s,l,{prefix:"marker.line.",cLetter:"c"}),l("marker.line.width",u?1:0)),u&&(l("marker.sizeref"),l("marker.sizemin"),l("marker.sizemode")),c.gradient)&&("none"!==l("marker.gradient.type")&&l("marker.gradient.color"))}},{"../../components/color":558,"../../components/colorscale/defaults":568,"../../components/colorscale/has_colorscale":572,"./subtypes":1037}],1034:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../registry"),a=t("../../lib"),o=t("../../components/drawing"),s=t("./subtypes"),l=t("./line_points"),c=t("./link_traces"),u=t("../../lib/polygon").tester;function h(t,e,r,c,h,f,p){var d,g;!function(t,e,r,i,o){var l=r.xaxis,c=r.yaxis,u=n.extent(a.simpleMap(l.range,l.r2c)),h=n.extent(a.simpleMap(c.range,c.r2c)),f=i[0].trace;if(!s.hasMarkers(f))return;var p=f.marker.maxdisplayed;if(0===p)return;var d=i.filter(function(t){return t.x>=u[0]&&t.x<=u[1]&&t.y>=h[0]&&t.y<=h[1]}),g=Math.ceil(d.length/p),m=0;o.forEach(function(t,r){var n=t[0].trace;s.hasMarkers(n)&&n.marker.maxdisplayed>0&&r<e&&m++});var v=Math.round(m*g/3+Math.floor(m/3)*g/7.1);i.forEach(function(t){delete t.vis}),d.forEach(function(t,e){0===Math.round((e+v)%g)&&(t.vis=!0)})}(0,e,r,c,h);var m=!!p&&p.duration>0;function v(t){return m?t.transition():t}var y=r.xaxis,x=r.yaxis,b=c[0].trace,_=b.line,w=n.select(f);if(i.getComponentMethod("errorbars","plot")(w,r,p),!0===b.visible){var k,M;v(w).style("opacity",b.opacity);var A=b.fill.charAt(b.fill.length-1);"x"!==A&&"y"!==A&&(A=""),r.isRangePlot||(c[0].node3=w);var T="",S=[],E=b._prevtrace;E&&(T=E._prevRevpath||"",M=E._nextFill,S=E._polygons);var C,L,z,P,I,O,D,R,B,F="",N="",j=[],V=a.noop;if(k=b._ownFill,s.hasLines(b)||"none"!==b.fill){for(M&&M.datum(c),-1!==["hv","vh","hvh","vhv"].indexOf(_.shape)?(z=o.steps(_.shape),P=o.steps(_.shape.split("").reverse().join(""))):z=P="spline"===_.shape?function(t){var e=t[t.length-1];return t.length>1&&t[0][0]===e[0]&&t[0][1]===e[1]?o.smoothclosed(t.slice(1),_.smoothing):o.smoothopen(t,_.smoothing)}:function(t){return"M"+t.join("L")},I=function(t){return P(t.reverse())},j=l(c,{xaxis:y,yaxis:x,connectGaps:b.connectgaps,baseTolerance:Math.max(_.width||1,3)/4,shape:_.shape,simplify:_.simplify}),B=b._polygons=new Array(j.length),g=0;g<j.length;g++)b._polygons[g]=u(j[g]);j.length&&(O=j[0][0],R=(D=j[j.length-1])[D.length-1]),V=function(t){return function(e){if(C=z(e),L=I(e),F?A?(F+="L"+C.substr(1),N=L+"L"+N.substr(1)):(F+="Z"+C,N=L+"Z"+N):(F=C,N=L),s.hasLines(b)&&e.length>1){var r=n.select(this);if(r.datum(c),t)v(r.style("opacity",0).attr("d",C).call(o.lineGroupStyle)).style("opacity",1);else{var i=v(r);i.attr("d",C),o.singleLineStyle(c,i)}}}}}var U=w.selectAll(".js-line").data(j);v(U.exit()).style("opacity",0).remove(),U.each(V(!1)),U.enter().append("path").classed("js-line",!0).style("vector-effect","non-scaling-stroke").call(o.lineGroupStyle).each(V(!0)),o.setClipUrl(U,r.layerClipId),j.length?(k?O&&R&&(A?("y"===A?O[1]=R[1]=x.c2p(0,!0):"x"===A&&(O[0]=R[0]=y.c2p(0,!0)),v(k).attr("d","M"+R+"L"+O+"L"+F.substr(1)).call(o.singleFillStyle)):v(k).attr("d",F+"Z").call(o.singleFillStyle)):M&&("tonext"===b.fill.substr(0,6)&&F&&T?("tonext"===b.fill?v(M).attr("d",F+"Z"+T+"Z").call(o.singleFillStyle):v(M).attr("d",F+"L"+T.substr(1)+"Z").call(o.singleFillStyle),b._polygons=b._polygons.concat(S)):(H(M),b._polygons=null)),b._prevRevpath=N,b._prevPolygons=B):(k?H(k):M&&H(M),b._polygons=b._prevRevpath=b._prevPolygons=null);var q=w.selectAll(".points");d=q.data([c]),q.each(Z),d.enter().append("g").classed("points",!0).each(Z),d.exit().remove(),d.each(function(t){var e=!1===t[0].trace.cliponaxis;o.setClipUrl(n.select(this),e?null:r.layerClipId)})}function H(t){v(t).attr("d","M0,0Z")}function G(t){return t.filter(function(t){return t.vis})}function W(t){return t.id}function Y(t){if(t.ids)return W}function X(){return!1}function Z(e){var i,l=e[0].trace,c=n.select(this),u=s.hasMarkers(l),h=s.hasText(l),f=Y(l),p=X,d=X;u&&(p=l.marker.maxdisplayed||l._needsCull?G:a.identity),h&&(d=l.marker.maxdisplayed||l._needsCull?G:a.identity);var g,b=(i=c.selectAll("path.point").data(p,f)).enter().append("path").classed("point",!0);m&&b.call(o.pointStyle,l,t).call(o.translatePoints,y,x).style("opacity",0).transition().style("opacity",1),i.order(),u&&(g=o.makePointStyleFns(l)),i.each(function(e){var i=n.select(this),a=v(i);o.translatePoint(e,a,y,x)?(o.singlePointStyle(e,a,l,g,t),r.layerClipId&&o.hideOutsideRangePoint(e,a,y,x,l.xcalendar,l.ycalendar),l.customdata&&i.classed("plotly-customdata",null!==e.data&&void 0!==e.data)):a.remove()}),m?i.exit().transition().style("opacity",0).remove():i.exit().remove(),(i=c.selectAll("g").data(d,f)).enter().append("g").classed("textpoint",!0).append("text"),i.order(),i.each(function(t){var e=n.select(this),i=v(e.select("text"));o.translatePoint(t,i,y,x)?r.layerClipId&&o.hideOutsideRangePoint(t,e,y,x,l.xcalendar,l.ycalendar):e.remove()}),i.selectAll("text").call(o.textPointStyle,l,t).each(function(t){var e=y.c2p(t.x),r=x.c2p(t.y);n.select(this).selectAll("tspan.line").each(function(){v(n.select(this)).attr({x:e,y:r})})}),i.exit().remove()}}e.exports=function(t,e,r,i,a,s){var l,u,f,p,d=!a,g=!!a&&a.duration>0;for((f=i.selectAll("g.trace").data(r,function(t){return t[0].trace.uid})).enter().append("g").attr("class",function(t){return"trace scatter trace"+t[0].trace.uid}).style("stroke-miterlimit",2),c(t,e,r),function(t,e,r){var i;e.selectAll("g.trace").each(function(t){var e=n.select(this);if((i=t[0].trace)._nexttrace){if(i._nextFill=e.select(".js-fill.js-tonext"),!i._nextFill.size()){var a=":first-child";e.select(".js-fill.js-tozero").size()&&(a+=" + *"),i._nextFill=e.insert("path",a).attr("class","js-fill js-tonext")}}else e.selectAll(".js-fill.js-tonext").remove(),i._nextFill=null;i.fill&&("tozero"===i.fill.substr(0,6)||"toself"===i.fill||"to"===i.fill.substr(0,2)&&!i._prevtrace)?(i._ownFill=e.select(".js-fill.js-tozero"),i._ownFill.size()||(i._ownFill=e.insert("path",":first-child").attr("class","js-fill js-tozero"))):(e.selectAll(".js-fill.js-tozero").remove(),i._ownFill=null),e.selectAll(".js-fill").call(o.setClipUrl,r.layerClipId)})}(0,i,e),l=0,u={};l<r.length;l++)u[r[l][0].trace.uid]=l;(i.selectAll("g.trace").sort(function(t,e){return u[t[0].trace.uid]>u[e[0].trace.uid]?1:-1}),g)?(s&&(p=s()),n.transition().duration(a.duration).ease(a.easing).each("end",function(){p&&p()}).each("interrupt",function(){p&&p()}).each(function(){i.selectAll("g.trace").each(function(n,i){h(t,i,e,n,r,this,a)})})):i.selectAll("g.trace").each(function(n,i){h(t,i,e,n,r,this,a)});d&&f.exit().remove(),i.selectAll("path:not([d])").remove()}},{"../../components/drawing":583,"../../lib":684,"../../lib/polygon":696,"../../registry":817,"./line_points":1028,"./link_traces":1030,"./subtypes":1037,d3:147}],1035:[function(t,e,r){"use strict";var n=t("./subtypes");e.exports=function(t,e){var r,i,a,o,s=t.cd,l=t.xaxis,c=t.yaxis,u=[],h=s[0].trace;if(!n.hasMarkers(h)&&!n.hasText(h))return[];if(!1===e)for(r=0;r<s.length;r++)s[r].selected=0;else for(r=0;r<s.length;r++)i=s[r],a=l.c2p(i.x),o=c.c2p(i.y),e.contains([a,o])?(u.push({pointNumber:r,x:l.c2d(i.x),y:c.c2d(i.y)}),i.selected=1):i.selected=0;return u}},{"./subtypes":1037}],1036:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/drawing"),a=t("../../registry");function o(t,e,r){i.pointStyle(t.selectAll("path.point"),e,r),i.textPointStyle(t.selectAll("text"),e,r)}e.exports={style:function(t,e){var r=e?e[0].node3:n.select(t).selectAll("g.trace.scatter");r.style("opacity",function(t){return t[0].trace.opacity}),r.selectAll("g.points").each(function(e){o(n.select(this),e.trace||e[0].trace,t)}),r.selectAll("g.trace path.js-line").call(i.lineGroupStyle),r.selectAll("g.trace path.js-fill").call(i.fillGroupStyle),a.getComponentMethod("errorbars","style")(r)},stylePoints:o,styleOnSelect:function(t,e){var r=e[0].node3,n=e[0].trace;n.selectedpoints?(i.selectedPointStyle(r.selectAll("path.point"),n),i.selectedTextStyle(r.selectAll("text"),n)):o(r,n,t)}}},{"../../components/drawing":583,"../../registry":817,d3:147}],1037:[function(t,e,r){"use strict";var n=t("../../lib");e.exports={hasLines:function(t){return t.visible&&t.mode&&-1!==t.mode.indexOf("lines")},hasMarkers:function(t){return t.visible&&(t.mode&&-1!==t.mode.indexOf("markers")||"splom"===t.type)},hasText:function(t){return t.visible&&t.mode&&-1!==t.mode.indexOf("text")},isBubble:function(t){return n.isPlainObject(t.marker)&&n.isArrayOrTypedArray(t.marker.size)}}},{"../../lib":684}],1038:[function(t,e,r){"use strict";var n=t("../../lib");e.exports=function(t,e,r,i,a){a=a||{},i("textposition"),n.coerceFont(i,"textfont",r.font),a.noSelect||(i("selected.textfont.color"),i("unselected.textfont.color"))}},{"../../lib":684}],1039:[function(t,e,r){"use strict";var n=t("../../registry");e.exports=function(t,e,r,i){var a,o=i("x"),s=i("y");if(n.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x","y"],r),o)s?a=Math.min(o.length,s.length):(a=o.length,i("y0"),i("dy"));else{if(!s)return 0;a=e.y.length,i("x0"),i("dx")}return e._length=a,a}},{"../../registry":817}],1040:[function(t,e,r){"use strict";var n=t("../scatter/attributes"),i=t("../../components/colorscale/attributes"),a=t("../../plots/attributes"),o=t("../../constants/gl3d_dashes"),s=t("../../constants/gl3d_markers"),l=t("../../lib/extend").extendFlat,c=t("../../plot_api/edit_types").overrideAll,u=n.line,h=n.marker,f=h.line;var p=e.exports=c({x:n.x,y:n.y,z:{valType:"data_array"},text:l({},n.text,{}),hovertext:l({},n.hovertext,{}),mode:l({},n.mode,{dflt:"lines+markers"}),surfaceaxis:{valType:"enumerated",values:[-1,0,1,2],dflt:-1},surfacecolor:{valType:"color"},projection:{x:{show:{valType:"boolean",dflt:!1},opacity:{valType:"number",min:0,max:1,dflt:1},scale:{valType:"number",min:0,max:10,dflt:2/3}},y:{show:{valType:"boolean",dflt:!1},opacity:{valType:"number",min:0,max:1,dflt:1},scale:{valType:"number",min:0,max:10,dflt:2/3}},z:{show:{valType:"boolean",dflt:!1},opacity:{valType:"number",min:0,max:1,dflt:1},scale:{valType:"number",min:0,max:10,dflt:2/3}}},connectgaps:n.connectgaps,line:l({width:u.width,dash:{valType:"enumerated",values:Object.keys(o),dflt:"solid"}},i("line")),marker:l({symbol:{valType:"enumerated",values:Object.keys(s),dflt:"circle",arrayOk:!0},size:l({},h.size,{dflt:8}),sizeref:h.sizeref,sizemin:h.sizemin,sizemode:h.sizemode,opacity:l({},h.opacity,{arrayOk:!1}),colorbar:h.colorbar,line:l({width:l({},f.width,{arrayOk:!1})},i("marker.line"))},i("marker")),textposition:l({},n.textposition,{dflt:"top center"}),textfont:n.textfont,hoverinfo:l({},a.hoverinfo)},"calc","nested");p.x.editType=p.y.editType=p.z.editType="calc+clearAxisTypes"},{"../../components/colorscale/attributes":565,"../../constants/gl3d_dashes":658,"../../constants/gl3d_markers":659,"../../lib/extend":673,"../../plot_api/edit_types":715,"../../plots/attributes":729,"../scatter/attributes":1015}],1041:[function(t,e,r){"use strict";var n=t("../scatter/arrays_to_calcdata"),i=t("../scatter/colorscale_calc");e.exports=function(t,e){var r=[{x:!1,y:!1,trace:e,t:{}}];return n(r,e),i(e),r}},{"../scatter/arrays_to_calcdata":1014,"../scatter/colorscale_calc":1019}],1042:[function(t,e,r){"use strict";var n=t("../../registry");function i(t,e,r){if(!e||!e.visible)return null;for(var i=n.getComponentMethod("errorbars","makeComputeError")(e),a=new Array(t.length),o=0;o<t.length;o++){var s=i(+t[o],o);a[o]=[-s[0]*r,s[1]*r]}return a}e.exports=function(t,e){var r=[i(t.x,t.error_x,e[0]),i(t.y,t.error_y,e[1]),i(t.z,t.error_z,e[2])],n=function(t){for(var e=0;e<t.length;e++)if(t[e])return t[e].length;return 0}(r);if(0===n)return null;for(var a=new Array(n),o=0;o<n;o++){for(var s=[[0,0,0],[0,0,0]],l=0;l<3;l++)if(r[l])for(var c=0;c<2;c++)s[c][l]=r[l][o][c];a[o]=s}return a}},{"../../registry":817}],1043:[function(t,e,r){"use strict";var n=t("gl-line3d"),i=t("gl-scatter3d"),a=t("gl-error3d"),o=t("gl-mesh3d"),s=t("delaunay-triangulate"),l=t("../../lib"),c=t("../../lib/str2rgbarray"),u=t("../../lib/gl_format_color").formatColor,h=t("../scatter/make_bubble_size_func"),f=t("../../constants/gl3d_dashes"),p=t("../../constants/gl3d_markers"),d=t("./calc_errors");function g(t,e){this.scene=t,this.uid=e,this.linePlot=null,this.scatterPlot=null,this.errorBars=null,this.textMarkers=null,this.delaunayMesh=null,this.color=null,this.mode="",this.dataPoints=[],this.axesBounds=[[-1/0,-1/0,-1/0],[1/0,1/0,1/0]],this.textLabels=null,this.data=null}var m=g.prototype;function v(t,e){return e(4*t)}function y(t){return p[t]}function x(t,e,r,n,i){var a=null;if(l.isArrayOrTypedArray(t)){a=[];for(var o=0;o<e;o++)void 0===t[o]?a[o]=n:a[o]=r(t[o],i)}else a=r(t,l.identity);return a}function b(t,e){var r,n,i,a,o,s,f,p,g=[],m=t.fullSceneLayout,b=t.dataScale,_=m.xaxis,w=m.yaxis,k=m.zaxis,M=e.marker,A=e.line,T=e.x||[],S=e.y||[],E=e.z||[],C=T.length,L=e.xcalendar,z=e.ycalendar,P=e.zcalendar;for(n=0;n<C;n++)i=_.d2l(T[n],0,L)*b[0],a=w.d2l(S[n],0,z)*b[1],o=k.d2l(E[n],0,P)*b[2],g[n]=[i,a,o];if(Array.isArray(e.text))s=e.text;else if(void 0!==e.text)for(s=new Array(C),n=0;n<C;n++)s[n]=e.text;if(r={position:g,mode:e.mode,text:s},"line"in e&&(r.lineColor=u(A,1,C),r.lineWidth=A.width,r.lineDashes=A.dash),"marker"in e){var I=h(e);r.scatterColor=u(M,1,C),r.scatterSize=x(M.size,C,v,20,I),r.scatterMarker=x(M.symbol,C,y,"\u25cf"),r.scatterLineWidth=M.line.width,r.scatterLineColor=u(M.line,1,C),r.scatterAngle=0}"textposition"in e&&(r.textOffset=(f=e.textposition,p=[0,0],Array.isArray(f)?[0,-1]:(f.indexOf("bottom")>=0&&(p[1]+=1),f.indexOf("top")>=0&&(p[1]-=1),f.indexOf("left")>=0&&(p[0]-=1),f.indexOf("right")>=0&&(p[0]+=1),p)),r.textColor=u(e.textfont,1,C),r.textSize=x(e.textfont.size,C,l.identity,12),r.textFont=e.textfont.family,r.textAngle=0);var O=["x","y","z"];for(r.project=[!1,!1,!1],r.projectScale=[1,1,1],r.projectOpacity=[1,1,1],n=0;n<3;++n){var D=e.projection[O[n]];(r.project[n]=D.show)&&(r.projectOpacity[n]=D.opacity,r.projectScale[n]=D.scale)}r.errorBounds=d(e,b);var R=function(t){for(var e=[0,0,0],r=[[0,0,0],[0,0,0],[0,0,0]],n=[0,0,0],i=0;i<3;i++){var a=t[i];a&&!1!==a.copy_zstyle&&(a=t[2]),a&&(e[i]=a.width/2,r[i]=c(a.color),n=a.thickness)}return{capSize:e,color:r,lineWidth:n}}([e.error_x,e.error_y,e.error_z]);return r.errorColor=R.color,r.errorLineWidth=R.lineWidth,r.errorCapSize=R.capSize,r.delaunayAxis=e.surfaceaxis,r.delaunayColor=c(e.surfacecolor),r}function _(t){if(Array.isArray(t)){var e=t[0];return Array.isArray(e)&&(t=e),"rgb("+t.slice(0,3).map(function(t){return Math.round(255*t)})+")"}return null}m.handlePick=function(t){if(t.object&&(t.object===this.linePlot||t.object===this.delaunayMesh||t.object===this.textMarkers||t.object===this.scatterPlot)){var e=t.index=t.data.index;return t.object.highlight&&t.object.highlight(null),this.scatterPlot&&(t.object=this.scatterPlot,this.scatterPlot.highlight(t.data)),t.textLabel="",this.textLabels&&(Array.isArray(this.textLabels)?(this.textLabels[e]||0===this.textLabels[e])&&(t.textLabel=this.textLabels[e]):t.textLabel=this.textLabels),t.traceCoordinate=[this.data.x[e],this.data.y[e],this.data.z[e]],!0}},m.update=function(t){var e,r,l,c,u=this.scene.glplot.gl,h=f.solid;this.data=t;var p=b(this.scene,t);"mode"in p&&(this.mode=p.mode),"lineDashes"in p&&p.lineDashes in f&&(h=f[p.lineDashes]),this.color=_(p.scatterColor)||_(p.lineColor),this.dataPoints=p.position,e={gl:u,position:p.position,color:p.lineColor,lineWidth:p.lineWidth||1,dashes:h[0],dashScale:h[1],opacity:t.opacity,connectGaps:t.connectgaps},-1!==this.mode.indexOf("lines")?this.linePlot?this.linePlot.update(e):(this.linePlot=n(e),this.linePlot._trace=this,this.scene.glplot.add(this.linePlot)):this.linePlot&&(this.scene.glplot.remove(this.linePlot),this.linePlot.dispose(),this.linePlot=null);var d=t.opacity;if(t.marker&&t.marker.opacity&&(d*=t.marker.opacity),r={gl:u,position:p.position,color:p.scatterColor,size:p.scatterSize,glyph:p.scatterMarker,opacity:d,orthographic:!0,lineWidth:p.scatterLineWidth,lineColor:p.scatterLineColor,project:p.project,projectScale:p.projectScale,projectOpacity:p.projectOpacity},-1!==this.mode.indexOf("markers")?this.scatterPlot?this.scatterPlot.update(r):(this.scatterPlot=i(r),this.scatterPlot._trace=this,this.scatterPlot.highlightScale=1,this.scene.glplot.add(this.scatterPlot)):this.scatterPlot&&(this.scene.glplot.remove(this.scatterPlot),this.scatterPlot.dispose(),this.scatterPlot=null),c={gl:u,position:p.position,glyph:p.text,color:p.textColor,size:p.textSize,angle:p.textAngle,alignment:p.textOffset,font:p.textFont,orthographic:!0,lineWidth:0,project:!1,opacity:t.opacity},this.textLabels=t.hovertext||t.text,-1!==this.mode.indexOf("text")?this.textMarkers?this.textMarkers.update(c):(this.textMarkers=i(c),this.textMarkers._trace=this,this.textMarkers.highlightScale=1,this.scene.glplot.add(this.textMarkers)):this.textMarkers&&(this.scene.glplot.remove(this.textMarkers),this.textMarkers.dispose(),this.textMarkers=null),l={gl:u,position:p.position,color:p.errorColor,error:p.errorBounds,lineWidth:p.errorLineWidth,capSize:p.errorCapSize,opacity:t.opacity},this.errorBars?p.errorBounds?this.errorBars.update(l):(this.scene.glplot.remove(this.errorBars),this.errorBars.dispose(),this.errorBars=null):p.errorBounds&&(this.errorBars=a(l),this.errorBars._trace=this,this.scene.glplot.add(this.errorBars)),p.delaunayAxis>=0){var g=function(t,e,r){var n,i=(r+1)%3,a=(r+2)%3,o=[],l=[];for(n=0;n<t.length;++n){var c=t[n];!isNaN(c[i])&&isFinite(c[i])&&!isNaN(c[a])&&isFinite(c[a])&&(o.push([c[i],c[a]]),l.push(n))}var u=s(o);for(n=0;n<u.length;++n)for(var h=u[n],f=0;f<h.length;++f)h[f]=l[h[f]];return{positions:t,cells:u,meshColor:e}}(p.position,p.delaunayColor,p.delaunayAxis);g.opacity=t.opacity,this.delaunayMesh?this.delaunayMesh.update(g):(g.gl=u,this.delaunayMesh=o(g),this.delaunayMesh._trace=this,this.scene.glplot.add(this.delaunayMesh))}else this.delaunayMesh&&(this.scene.glplot.remove(this.delaunayMesh),this.delaunayMesh.dispose(),this.delaunayMesh=null)},m.dispose=function(){this.linePlot&&(this.scene.glplot.remove(this.linePlot),this.linePlot.dispose()),this.scatterPlot&&(this.scene.glplot.remove(this.scatterPlot),this.scatterPlot.dispose()),this.errorBars&&(this.scene.glplot.remove(this.errorBars),this.errorBars.dispose()),this.textMarkers&&(this.scene.glplot.remove(this.textMarkers),this.textMarkers.dispose()),this.delaunayMesh&&(this.scene.glplot.remove(this.delaunayMesh),this.delaunayMesh.dispose())},e.exports=function(t,e){var r=new g(t,e.uid);return r.update(e),r}},{"../../constants/gl3d_dashes":658,"../../constants/gl3d_markers":659,"../../lib":684,"../../lib/gl_format_color":680,"../../lib/str2rgbarray":707,"../scatter/make_bubble_size_func":1031,"./calc_errors":1042,"delaunay-triangulate":149,"gl-error3d":237,"gl-line3d":245,"gl-mesh3d":268,"gl-scatter3d":283}],1044:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib"),a=t("../scatter/subtypes"),o=t("../scatter/marker_defaults"),s=t("../scatter/line_defaults"),l=t("../scatter/text_defaults"),c=t("./attributes");e.exports=function(t,e,r,u){function h(r,n){return i.coerce(t,e,c,r,n)}if(function(t,e,r,i){var a=0,o=r("x"),s=r("y"),l=r("z");n.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x","y","z"],i),o&&s&&l&&(a=Math.min(o.length,s.length,l.length),e._length=e._xlength=e._ylength=e._zlength=a);return a}(t,e,h,u)){h("text"),h("hovertext"),h("mode"),a.hasLines(e)&&(h("connectgaps"),s(t,e,r,u,h)),a.hasMarkers(e)&&o(t,e,r,u,h,{noSelect:!0}),a.hasText(e)&&l(t,e,u,h,{noSelect:!0});var f=(e.line||{}).color,p=(e.marker||{}).color;h("surfaceaxis")>=0&&h("surfacecolor",f||p);for(var d=["x","y","z"],g=0;g<3;++g){var m="projection."+d[g];h(m+".show")&&(h(m+".opacity"),h(m+".scale"))}var v=n.getComponentMethod("errorbars","supplyDefaults");v(t,e,r,{axis:"z"}),v(t,e,r,{axis:"y",inherit:"z"}),v(t,e,r,{axis:"x",inherit:"z"})}else e.visible=!1}},{"../../lib":684,"../../registry":817,"../scatter/line_defaults":1027,"../scatter/marker_defaults":1033,"../scatter/subtypes":1037,"../scatter/text_defaults":1038,"./attributes":1040}],1045:[function(t,e,r){"use strict";var n={};n.plot=t("./convert"),n.attributes=t("./attributes"),n.markerSymbols=t("../../constants/gl3d_markers"),n.supplyDefaults=t("./defaults"),n.colorbar=t("../scatter/marker_colorbar"),n.calc=t("./calc"),n.moduleType="trace",n.name="scatter3d",n.basePlotModule=t("../../plots/gl3d"),n.categories=["gl3d","symbols","showLegend"],n.meta={},e.exports=n},{"../../constants/gl3d_markers":659,"../../plots/gl3d":774,"../scatter/marker_colorbar":1032,"./attributes":1040,"./calc":1041,"./convert":1043,"./defaults":1044}],1046:[function(t,e,r){"use strict";var n=t("../scatter/attributes"),i=t("../../plots/attributes"),a=t("../../components/colorscale/attributes"),o=t("../../components/colorbar/attributes"),s=t("../../lib/extend").extendFlat,l=n.marker,c=n.line,u=l.line;e.exports={carpet:{valType:"string",editType:"calc"},a:{valType:"data_array",editType:"calc"},b:{valType:"data_array",editType:"calc"},mode:s({},n.mode,{dflt:"markers"}),text:s({},n.text,{}),line:{color:c.color,width:c.width,dash:c.dash,shape:s({},c.shape,{values:["linear","spline"]}),smoothing:c.smoothing,editType:"calc"},connectgaps:n.connectgaps,fill:s({},n.fill,{values:["none","toself","tonext"]}),fillcolor:n.fillcolor,marker:s({symbol:l.symbol,opacity:l.opacity,maxdisplayed:l.maxdisplayed,size:l.size,sizeref:l.sizeref,sizemin:l.sizemin,sizemode:l.sizemode,line:s({width:u.width,editType:"calc"},a("marker.line")),gradient:l.gradient,editType:"calc"},a("marker"),{colorbar:o}),textfont:n.textfont,textposition:n.textposition,selected:n.selected,unselected:n.unselected,hoverinfo:s({},i.hoverinfo,{flags:["a","b","text","name"]}),hoveron:n.hoveron}},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../../plots/attributes":729,"../scatter/attributes":1015}],1047:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../scatter/colorscale_calc"),a=t("../scatter/arrays_to_calcdata"),o=t("../scatter/calc_selection"),s=t("../scatter/calc").calcMarkerSize,l=t("../carpet/lookup_carpetid");e.exports=function(t,e){var r=e._carpetTrace=l(t,e);if(r&&r.visible&&"legendonly"!==r.visible){var c;e.xaxis=r.xaxis,e.yaxis=r.yaxis;var u,h,f=e._length,p=new Array(f),d=!1;for(c=0;c<f;c++)if(u=e.a[c],h=e.b[c],n(u)&&n(h)){var g=r.ab2xy(+u,+h,!0),m=r.isVisible(+u,+h);m||(d=!0),p[c]={x:g[0],y:g[1],a:u,b:h,vis:m}}else p[c]={x:!1,y:!1};return e._needsCull=d,p[0].carpet=r,p[0].trace=e,s(e,f),i(e),a(p,e),o(p,e),p}}},{"../carpet/lookup_carpetid":874,"../scatter/arrays_to_calcdata":1014,"../scatter/calc":1016,"../scatter/calc_selection":1017,"../scatter/colorscale_calc":1019,"fast-isnumeric":214}],1048:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../scatter/constants"),a=t("../scatter/subtypes"),o=t("../scatter/marker_defaults"),s=t("../scatter/line_defaults"),l=t("../scatter/line_shape_defaults"),c=t("../scatter/text_defaults"),u=t("../scatter/fillcolor_defaults"),h=t("./attributes");e.exports=function(t,e,r,f){function p(r,i){return n.coerce(t,e,h,r,i)}p("carpet"),e.xaxis="x",e.yaxis="y";var d=p("a"),g=p("b"),m=Math.min(d.length,g.length);if(m){e._length=m,p("text"),p("mode",m<i.PTS_LINESONLY?"lines+markers":"lines"),a.hasLines(e)&&(s(t,e,r,f,p),l(t,e,p),p("connectgaps")),a.hasMarkers(e)&&o(t,e,r,f,p,{gradient:!0}),a.hasText(e)&&c(t,e,f,p);var v=[];(a.hasMarkers(e)||a.hasText(e))&&(p("marker.maxdisplayed"),v.push("points")),p("fill"),"none"!==e.fill&&(u(t,e,r,p),a.hasLines(e)||l(t,e,p)),"tonext"!==e.fill&&"toself"!==e.fill||v.push("fills"),p("hoveron",v.join("+")||"points"),n.coerceSelectionMarkerOpacity(e,p)}else e.visible=!1}},{"../../lib":684,"../scatter/constants":1020,"../scatter/fillcolor_defaults":1023,"../scatter/line_defaults":1027,"../scatter/line_shape_defaults":1029,"../scatter/marker_defaults":1033,"../scatter/subtypes":1037,"../scatter/text_defaults":1038,"./attributes":1046}],1049:[function(t,e,r){"use strict";e.exports=function(t,e,r,n,i){var a=n[i];return t.a=a.a,t.b=a.b,t}},{}],1050:[function(t,e,r){"use strict";var n=t("../scatter/hover");e.exports=function(t,e,r,i){var a=n(t,e,r,i);if(a&&!1!==a[0].index){var o=a[0];if(void 0===o.index){var s=1-o.y0/t.ya._length,l=t.xa._length,c=l*s/2,u=l-c;return o.x0=Math.max(Math.min(o.x0,u),c),o.x1=Math.max(Math.min(o.x1,u),c),a}var h=o.cd[o.index];o.a=h.a,o.b=h.b,o.xLabelVal=void 0,o.yLabelVal=void 0;var f=o.trace,p=f._carpet,d=(h.hi||f.hoverinfo).split("+"),g=[];-1!==d.indexOf("all")&&(d=["a","b"]),-1!==d.indexOf("a")&&w(p.aaxis,h.a),-1!==d.indexOf("b")&&w(p.baxis,h.b);var m=p.ab2ij([h.a,h.b]),v=Math.floor(m[0]),y=m[0]-v,x=Math.floor(m[1]),b=m[1]-x,_=p.evalxy([],v,x,y,b);return g.push("y: "+_[1].toFixed(3)),o.extraText=g.join("<br>"),a}function w(t,e){var r;r=t.labelprefix&&t.labelprefix.length>0?t.labelprefix.replace(/ = $/,""):t._hovertitle,g.push(r+": "+e.toFixed(3)+t.labelsuffix)}}},{"../scatter/hover":1025}],1051:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.colorbar=t("../scatter/marker_colorbar"),n.calc=t("./calc"),n.plot=t("./plot"),n.style=t("../scatter/style").style,n.styleOnSelect=t("../scatter/style").styleOnSelect,n.hoverPoints=t("./hover"),n.selectPoints=t("../scatter/select"),n.eventData=t("./event_data"),n.moduleType="trace",n.name="scattercarpet",n.basePlotModule=t("../../plots/cartesian"),n.categories=["svg","carpet","symbols","showLegend","carpetDependent","zoomScale"],n.meta={},e.exports=n},{"../../plots/cartesian":743,"../scatter/marker_colorbar":1032,"../scatter/select":1035,"../scatter/style":1036,"./attributes":1046,"./calc":1047,"./defaults":1048,"./event_data":1049,"./hover":1050,"./plot":1052}],1052:[function(t,e,r){"use strict";var n=t("../scatter/plot"),i=t("../../plots/cartesian/axes"),a=t("../../components/drawing");e.exports=function(t,e,r,o){var s,l,c,u=r[0][0].carpet,h={xaxis:i.getFromId(t,u.xaxis||"x"),yaxis:i.getFromId(t,u.yaxis||"y"),plot:e.plot};for(n(t,h,r,o),s=0;s<r.length;s++)l=r[s][0].trace,c=o.selectAll("g.trace"+l.uid+" .js-line"),a.setClipUrl(c,u._clipPathId)}},{"../../components/drawing":583,"../../plots/cartesian/axes":732,"../scatter/plot":1034}],1053:[function(t,e,r){"use strict";var n=t("../scatter/attributes"),i=t("../../plots/attributes"),a=t("../../components/colorscale/attributes"),o=t("../../components/drawing/attributes").dash,s=t("../../lib/extend").extendFlat,l=t("../../plot_api/edit_types").overrideAll,c=n.marker,u=n.line,h=c.line;e.exports=l({lon:{valType:"data_array"},lat:{valType:"data_array"},locations:{valType:"data_array"},locationmode:{valType:"enumerated",values:["ISO-3","USA-states","country names"],dflt:"ISO-3"},mode:s({},n.mode,{dflt:"markers"}),text:s({},n.text,{}),hovertext:s({},n.hovertext,{}),textfont:n.textfont,textposition:n.textposition,line:{color:u.color,width:u.width,dash:o},connectgaps:n.connectgaps,marker:s({symbol:c.symbol,opacity:c.opacity,size:c.size,sizeref:c.sizeref,sizemin:c.sizemin,sizemode:c.sizemode,colorbar:c.colorbar,line:s({width:h.width},a("marker.line")),gradient:c.gradient},a("marker")),fill:{valType:"enumerated",values:["none","toself"],dflt:"none"},fillcolor:n.fillcolor,selected:n.selected,unselected:n.unselected,hoverinfo:s({},i.hoverinfo,{flags:["lon","lat","location","text","name"]})},"calc","nested")},{"../../components/colorscale/attributes":565,"../../components/drawing/attributes":582,"../../lib/extend":673,"../../plot_api/edit_types":715,"../../plots/attributes":729,"../scatter/attributes":1015}],1054:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../constants/numerical").BADNUM,a=t("../scatter/colorscale_calc"),o=t("../scatter/arrays_to_calcdata"),s=t("../scatter/calc_selection"),l=t("../../lib")._;e.exports=function(t,e){for(var r=Array.isArray(e.locations),c=r?e.locations.length:e._length,u=new Array(c),h=0;h<c;h++){var f=u[h]={};if(r){var p=e.locations[h];f.loc="string"==typeof p?p:null}else{var d=e.lon[h],g=e.lat[h];n(d)&&n(g)?f.lonlat=[+d,+g]:f.lonlat=[i,i]}}return o(u,e),a(e),s(u,e),c&&(u[0].t={labels:{lat:l(t,"lat:")+" ",lon:l(t,"lon:")+" "}}),u}},{"../../constants/numerical":661,"../../lib":684,"../scatter/arrays_to_calcdata":1014,"../scatter/calc_selection":1017,"../scatter/colorscale_calc":1019,"fast-isnumeric":214}],1055:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../scatter/subtypes"),a=t("../scatter/marker_defaults"),o=t("../scatter/line_defaults"),s=t("../scatter/text_defaults"),l=t("../scatter/fillcolor_defaults"),c=t("./attributes");e.exports=function(t,e,r,u){function h(r,i){return n.coerce(t,e,c,r,i)}!function(t,e,r){var n,i,a=0,o=r("locations");if(o)return r("locationmode"),a=o.length;return n=r("lon")||[],i=r("lat")||[],a=Math.min(n.length,i.length),e._length=a,a}(0,e,h)?e.visible=!1:(h("text"),h("hovertext"),h("mode"),i.hasLines(e)&&(o(t,e,r,u,h),h("connectgaps")),i.hasMarkers(e)&&a(t,e,r,u,h,{gradient:!0}),i.hasText(e)&&s(t,e,u,h),h("fill"),"none"!==e.fill&&l(t,e,r,h),n.coerceSelectionMarkerOpacity(e,h))}},{"../../lib":684,"../scatter/fillcolor_defaults":1023,"../scatter/line_defaults":1027,"../scatter/marker_defaults":1033,"../scatter/subtypes":1037,"../scatter/text_defaults":1038,"./attributes":1053}],1056:[function(t,e,r){"use strict";e.exports=function(t,e){return t.lon=e.lon,t.lat=e.lat,t.location=e.loc?e.loc:null,t}},{}],1057:[function(t,e,r){"use strict";var n=t("../../components/fx"),i=t("../../plots/cartesian/axes"),a=t("../../constants/numerical").BADNUM,o=t("../scatter/get_trace_color"),s=t("../scatter/fill_hover_text"),l=t("./attributes");e.exports=function(t,e,r){var c=t.cd,u=c[0].trace,h=t.xa,f=t.ya,p=t.subplot,d=p.projection.isLonLatOverEdges,g=p.project;if(n.getClosest(c,function(t){var n=t.lonlat;if(n[0]===a)return 1/0;if(d(n))return 1/0;var i=g(n),o=g([e,r]),s=Math.abs(i[0]-o[0]),l=Math.abs(i[1]-o[1]),c=Math.max(3,t.mrc||0);return Math.max(Math.sqrt(s*s+l*l)-c,1-3/c)},t),!1!==t.index){var m=c[t.index],v=m.lonlat,y=[h.c2p(v),f.c2p(v)],x=m.mrc||1;return t.x0=y[0]-x,t.x1=y[0]+x,t.y0=y[1]-x,t.y1=y[1]+x,t.loc=m.loc,t.lon=v[0],t.lat=v[1],t.color=o(u,m),t.extraText=function(t,e,r,n){var a=e.hi||t.hoverinfo,o="all"===a?l.hoverinfo.flags:a.split("+"),c=-1!==o.indexOf("location")&&Array.isArray(t.locations),u=-1!==o.indexOf("lon"),h=-1!==o.indexOf("lat"),f=-1!==o.indexOf("text"),p=[];function d(t){return i.tickText(r,r.c2l(t),"hover").text+"\xb0"}c?p.push(e.loc):u&&h?p.push("("+d(e.lonlat[0])+", "+d(e.lonlat[1])+")"):u?p.push(n.lon+d(e.lonlat[0])):h&&p.push(n.lat+d(e.lonlat[1]));f&&s(e,t,p);return p.join("<br>")}(u,m,p.mockAxis,c[0].t.labels),[t]}}},{"../../components/fx":600,"../../constants/numerical":661,"../../plots/cartesian/axes":732,"../scatter/fill_hover_text":1022,"../scatter/get_trace_color":1024,"./attributes":1053}],1058:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.colorbar=t("../scatter/marker_colorbar"),n.calc=t("./calc"),n.plot=t("./plot"),n.style=t("./style"),n.styleOnSelect=t("../scatter/style").styleOnSelect,n.hoverPoints=t("./hover"),n.eventData=t("./event_data"),n.selectPoints=t("./select"),n.moduleType="trace",n.name="scattergeo",n.basePlotModule=t("../../plots/geo"),n.categories=["geo","symbols","showLegend","scatter-like"],n.meta={},e.exports=n},{"../../plots/geo":762,"../scatter/marker_colorbar":1032,"../scatter/style":1036,"./attributes":1053,"./calc":1054,"./defaults":1055,"./event_data":1056,"./hover":1057,"./plot":1059,"./select":1060,"./style":1061}],1059:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../lib"),a=t("../../constants/numerical").BADNUM,o=t("../../lib/topojson_utils").getTopojsonFeatures,s=t("../../lib/geo_location_utils").locationToFeature,l=t("../../lib/geojson_utils"),c=t("../scatter/subtypes"),u=t("./style");function h(t,e){var r=t[0].trace;if(Array.isArray(r.locations))for(var n=o(r,e),i=r.locationmode,l=0;l<t.length;l++){var c=t[l],u=s(i,c.loc,n);c.lonlat=u?u.properties.ct:[a,a]}}e.exports=function(t,e,r){for(var o=0;o<r.length;o++)h(r[o],e.topojson);function s(t,e){t.lonlat[0]===a&&n.select(e).remove()}var f=e.layers.frontplot.select(".scatterlayer").selectAll("g.trace.scattergeo").data(r,function(t){return t[0].trace.uid});f.enter().append("g").attr("class","trace scattergeo"),f.exit().remove(),f.selectAll("*").remove(),f.each(function(e){var r=e[0].node3=n.select(this),a=e[0].trace;if(c.hasLines(a)||"none"!==a.fill){var o=l.calcTraceToLineCoords(e),h="none"!==a.fill?l.makePolygon(o):l.makeLine(o);r.selectAll("path.js-line").data([{geojson:h,trace:a}]).enter().append("path").classed("js-line",!0).style("stroke-miterlimit",2)}c.hasMarkers(a)&&r.selectAll("path.point").data(i.identity).enter().append("path").classed("point",!0).each(function(t){s(t,this)}),c.hasText(a)&&r.selectAll("g").data(i.identity).enter().append("g").append("text").each(function(t){s(t,this)}),u(t,e)})}},{"../../constants/numerical":661,"../../lib":684,"../../lib/geo_location_utils":676,"../../lib/geojson_utils":677,"../../lib/topojson_utils":711,"../scatter/subtypes":1037,"./style":1061,d3:147}],1060:[function(t,e,r){"use strict";var n=t("../scatter/subtypes"),i=t("../../constants/numerical").BADNUM;e.exports=function(t,e){var r,a,o,s,l,c=t.cd,u=t.xaxis,h=t.yaxis,f=[],p=c[0].trace;if(!n.hasMarkers(p)&&!n.hasText(p))return[];if(!1===e)for(l=0;l<c.length;l++)c[l].selected=0;else for(l=0;l<c.length;l++)(a=(r=c[l]).lonlat)[0]!==i&&(o=u.c2p(a),s=h.c2p(a),e.contains([o,s])?(f.push({pointNumber:l,lon:a[0],lat:a[1]}),r.selected=1):r.selected=0);return f}},{"../../constants/numerical":661,"../scatter/subtypes":1037}],1061:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/drawing"),a=t("../../components/color"),o=t("../scatter/style").stylePoints;e.exports=function(t,e){e&&function(t,e){var r=e[0].trace,s=e[0].node3;s.style("opacity",e[0].trace.opacity),o(s,r,t),s.selectAll("path.js-line").style("fill","none").each(function(t){var e=n.select(this),r=t.trace,o=r.line||{};e.call(a.stroke,o.color).call(i.dashLine,o.dash||"",o.width||0),"none"!==r.fill&&e.call(a.fill,r.fillcolor)})}(t,e)}},{"../../components/color":558,"../../components/drawing":583,"../scatter/style":1036,d3:147}],1062:[function(t,e,r){"use strict";var n=t("../../plots/attributes"),i=t("../scatter/attributes"),a=t("../../components/colorscale/attributes"),o=t("../../lib/extend").extendFlat,s=t("../../plot_api/edit_types").overrideAll,l=t("./constants").DASHES,c=i.line,u=i.marker,h=u.line,f=e.exports=s({x:i.x,x0:i.x0,dx:i.dx,y:i.y,y0:i.y0,dy:i.dy,text:o({},i.text,{}),hovertext:i.hovertext,textposition:i.textposition,textfont:i.textfont,mode:{valType:"flaglist",flags:["lines","markers","text"],extras:["none"]},line:{color:c.color,width:c.width,dash:{valType:"enumerated",values:Object.keys(l),dflt:"solid"}},marker:o({},a("marker"),{symbol:u.symbol,size:u.size,sizeref:u.sizeref,sizemin:u.sizemin,sizemode:u.sizemode,opacity:u.opacity,colorbar:u.colorbar,line:o({},a("marker.line"),{width:h.width})}),connectgaps:i.connectgaps,fill:i.fill,fillcolor:i.fillcolor,hoveron:i.hoveron,selected:{marker:i.selected.marker,textfont:i.selected.textfont},unselected:{marker:i.unselected.marker,textfont:i.unselected.textfont},opacity:n.opacity},"calc","nested");f.x.editType=f.y.editType=f.x0.editType=f.y0.editType="calc+clearAxisTypes"},{"../../components/colorscale/attributes":565,"../../lib/extend":673,"../../plot_api/edit_types":715,"../../plots/attributes":729,"../scatter/attributes":1015,"./constants":1063}],1063:[function(t,e,r){"use strict";e.exports={TOO_MANY_POINTS:1e5,SYMBOL_SDF_SIZE:200,SYMBOL_SIZE:20,SYMBOL_STROKE:1,DOT_RE:/-dot/,OPEN_RE:/-open/,DASHES:{solid:[1],dot:[1,1],dash:[4,1],longdash:[8,1],dashdot:[4,1,1,1],longdashdot:[8,1,1,1]}}},{}],1064:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("svg-path-sdf"),a=t("color-normalize"),o=t("../../registry"),s=t("../../lib"),l=t("../../components/drawing"),c=t("../../plots/cartesian/axes"),u=t("../../plots/cartesian/axis_ids"),h=t("../../lib/gl_format_color").formatColor,f=t("../scatter/subtypes"),p=t("../scatter/make_bubble_size_func"),d=t("./constants"),g=t("../../constants/interactions").DESELECTDIM,m={start:1,left:1,end:-1,right:-1,middle:0,center:0,bottom:1,top:-1};function v(t){var e,r=t._length,i=t.textfont,a=t.textposition,o=Array.isArray(a)?a:[a],s=i.color,l=i.size,c=i.family,u={};for(u.text=t.text,u.opacity=t.opacity,u.font={},u.align=[],u.baseline=[],e=0;e<o.length;e++){var h=o[e].split(/\s+/);switch(h[1]){case"left":u.align.push("right");break;case"right":u.align.push("left");break;default:u.align.push(h[1])}switch(h[0]){case"top":u.baseline.push("bottom");break;case"bottom":u.baseline.push("top");break;default:u.baseline.push(h[0])}}if(Array.isArray(s))for(u.color=new Array(r),e=0;e<r;e++)u.color[e]=s[e];else u.color=s;if(Array.isArray(l)||Array.isArray(c))for(u.font=new Array(r),e=0;e<r;e++){var f=u.font[e]={};f.size=Array.isArray(l)?n(l[e])?l[e]:0:l,f.family=Array.isArray(c)?c[e]:c}else u.font={size:l,family:c};return u}function y(t){var e,r,n=t._length,i=t.marker,o={},l=Array.isArray(i.symbol),c=s.isArrayOrTypedArray(i.color),u=s.isArrayOrTypedArray(i.line.color),f=s.isArrayOrTypedArray(i.opacity),g=s.isArrayOrTypedArray(i.size),m=s.isArrayOrTypedArray(i.line.width);if(l||(r=d.OPEN_RE.test(i.symbol)),l||c||u||f){o.colors=new Array(n),o.borderColors=new Array(n);var v=h(i,i.opacity,n),y=h(i.line,i.opacity,n);if(!Array.isArray(y[0])){var x=y;for(y=Array(n),e=0;e<n;e++)y[e]=x}if(!Array.isArray(v[0])){var b=v;for(v=Array(n),e=0;e<n;e++)v[e]=b}for(o.colors=v,o.borderColors=y,e=0;e<n;e++){if(l){var _=i.symbol[e];r=d.OPEN_RE.test(_)}r&&(y[e]=v[e].slice(),v[e]=v[e].slice(),v[e][3]=0)}o.opacity=t.opacity}else r?(o.color=a(i.color,"uint8"),o.color[3]=0,o.borderColor=a(i.color,"uint8")):(o.color=a(i.color,"uint8"),o.borderColor=a(i.line.color,"uint8")),o.opacity=t.opacity*i.opacity;if(l)for(o.markers=new Array(n),e=0;e<n;e++)o.markers[e]=S(i.symbol[e]);else o.marker=S(i.symbol);var w,k=p(t);if(g||m){var M,A=o.sizes=new Array(n),T=o.borderSizes=new Array(n),E=0;if(g){for(e=0;e<n;e++)A[e]=k(i.size[e]),E+=A[e];M=E/n}else for(w=k(i.size),e=0;e<n;e++)A[e]=w;if(m)for(e=0;e<n;e++)T[e]=i.line.width[e]/2;else for(w=i.line.width/2,e=0;e<n;e++)T[e]=w;o.sizeAvg=M}else o.size=k(i&&i.size||10),o.borderSizes=k(i.line.width);return o}function x(t,e){var r=t.marker,n={};return e?(e.marker&&e.marker.symbol?n=y(s.extendFlat({},r,e.marker)):e.marker&&(e.marker.size&&(n.size=e.marker.size/2),e.marker.color&&(n.colors=e.marker.color),void 0!==e.marker.opacity&&(n.opacity=e.marker.opacity)),n):n}function b(t,e){var r={};if(!e)return r;if(e.textfont){var n={opacity:1,text:t.text,textposition:t.textposition,textfont:s.extendFlat({},t.textfont)};e.textfont&&s.extendFlat(n.textfont,e.textfont),r=v(n)}return r}function _(t,e){var r={capSize:2*e.width,lineWidth:e.thickness,color:e.color};return e.copy_ystyle&&(r=t.error_y),r}var w=d.SYMBOL_SDF_SIZE,k=d.SYMBOL_SIZE,M=d.SYMBOL_STROKE,A={},T=l.symbolFuncs[0](.05*k);function S(t){if("circle"===t)return null;var e,r,n=l.symbolNumber(t),a=l.symbolFuncs[n%100],o=!!l.symbolNoDot[n%100],s=!!l.symbolNoFill[n%100],c=d.DOT_RE.test(t);return A[t]?A[t]:(e=c&&!o?a(1.1*k)+T:a(k),r=i(e,{w:w,h:w,viewBox:[-k,-k,k,k],stroke:s?M:-M}),A[t]=r,r||null)}e.exports={style:function(t,e){var r,n={marker:void 0,markerSel:void 0,markerUnsel:void 0,line:void 0,fill:void 0,errorX:void 0,errorY:void 0,text:void 0,textSel:void 0,textUnsel:void 0};if(!0!==e.visible)return n;if(f.hasText(e)&&(n.text=v(e),n.textSel=b(e,e.selected),n.textUnsel=b(e,e.unselected)),f.hasMarkers(e)&&(n.marker=y(e),n.markerSel=x(e,e.selected),n.markerUnsel=x(e,e.unselected),!e.unselected&&Array.isArray(e.marker.opacity))){var i=e.marker.opacity;for(n.markerUnsel.opacity=new Array(i.length),r=0;r<i.length;r++)n.markerUnsel.opacity[r]=g*i[r]}if(f.hasLines(e)){n.line={overlay:!0,thickness:e.line.width,color:e.line.color,opacity:e.opacity};var a=(d.DASHES[e.line.dash]||[1]).slice();for(r=0;r<a.length;++r)a[r]*=e.line.width;n.line.dashes=a}return e.error_x&&e.error_x.visible&&(n.errorX=_(e,e.error_x)),e.error_y&&e.error_y.visible&&(n.errorY=_(e,e.error_y)),e.fill&&"none"!==e.fill&&(n.fill={closed:!0,fill:e.fillcolor,thickness:0}),n},markerStyle:y,markerSelection:x,linePositions:function(t,e,r){var n,i,a=r.length/2;if(f.hasLines(e)&&a)if("hv"===e.line.shape){for(n=[],i=0;i<a-1;i++)isNaN(r[2*i])||isNaN(r[2*i+1])?(n.push(NaN),n.push(NaN),n.push(NaN),n.push(NaN)):(n.push(r[2*i]),n.push(r[2*i+1]),n.push(r[2*i+2]),n.push(r[2*i+1]));n.push(r[r.length-2]),n.push(r[r.length-1])}else if("vh"===e.line.shape){for(n=[],i=0;i<a-1;i++)isNaN(r[2*i])||isNaN(r[2*i+1])?(n.push(NaN),n.push(NaN),n.push(NaN),n.push(NaN)):(n.push(r[2*i]),n.push(r[2*i+1]),n.push(r[2*i]),n.push(r[2*i+3]));n.push(r[r.length-2]),n.push(r[r.length-1])}else n=r;var o=!1;for(i=0;i<n.length;i++)if(isNaN(n[i])){o=!0;break}var s=o||n.length>d.TOO_MANY_POINTS?"rect":f.hasMarkers(e)?"rect":"round";if(o&&e.connectgaps){var l=n[0],c=n[1];for(i=0;i<n.length;i+=2)isNaN(n[i])||isNaN(n[i+1])?(n[i]=l,n[i+1]=c):(l=n[i],c=n[i+1])}return{join:s,positions:n}},errorBarPositions:function(t,e,r,i,a){var s=o.getComponentMethod("errorbars","makeComputeError"),l=u.getFromId(t,e.xaxis),h=u.getFromId(t,e.yaxis),f=r.length/2,p={};function d(t,i){var a=i._id.charAt(0),o=e["error_"+a];if(o&&o.visible&&("linear"===i.type||"log"===i.type)){for(var l=s(o),u={x:0,y:1}[a],h={x:[0,1,2,3],y:[2,3,0,1]}[a],d=new Float64Array(4*f),g=1/0,m=-1/0,v=0,y=0;v<f;v++,y+=4){var x=t[v];if(n(x)){var b=r[2*v+u],_=l(x,v),w=_[0],k=_[1];if(n(w)&&n(k)){var M=x-w,A=x+k;d[y+h[0]]=b-i.c2l(M),d[y+h[1]]=i.c2l(A)-b,d[y+h[2]]=0,d[y+h[3]]=0,g=Math.min(g,x-w),m=Math.max(m,x+k)}}}c.expand(i,[g,m],{padded:!0}),p[a]={positions:r,errors:d}}}return d(i,l),d(a,h),p},textPosition:function(t,e,r,n){var i,a=e._length,o={};if(f.hasMarkers(e)){var s=r.font,l=r.align,c=r.baseline;for(o.offset=new Array(a),i=0;i<a;i++){var u=n.sizes?n.sizes[i]:n.size,h=Array.isArray(s)?s[i].size:s.size,p=Array.isArray(l)?l.length>1?l[i]:l[0]:l,d=Array.isArray(c)?c.length>1?c[i]:c[0]:c,g=m[p],v=m[d],y=u?u/.8+1:0,x=-v*y-.5*v;o.offset[i]=[g*y/h,x/h]}}return o}}},{"../../components/drawing":583,"../../constants/interactions":660,"../../lib":684,"../../lib/gl_format_color":680,"../../plots/cartesian/axes":732,"../../plots/cartesian/axis_ids":735,"../../registry":817,"../scatter/make_bubble_size_func":1031,"../scatter/subtypes":1037,"./constants":1063,"color-normalize":107,"fast-isnumeric":214,"svg-path-sdf":497}],1065:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../registry"),a=t("./attributes"),o=t("../scatter/constants"),s=t("../scatter/subtypes"),l=t("../scatter/xy_defaults"),c=t("../scatter/marker_defaults"),u=t("../scatter/line_defaults"),h=t("../scatter/fillcolor_defaults"),f=t("../scatter/text_defaults");e.exports=function(t,e,r,p){function d(r,i){return n.coerce(t,e,a,r,i)}var g=!!t.marker&&/-open/.test(t.marker.symbol),m=s.isBubble(t),v=l(t,e,p,d);if(v){var y=v<o.PTS_LINESONLY?"lines+markers":"lines";d("text"),d("hovertext"),d("mode",y),s.hasLines(e)&&(d("connectgaps"),u(t,e,r,p,d));var x=[];s.hasMarkers(e)&&(c(t,e,r,p,d),d("marker.line.width",g||m?1:0),x.push("points")),s.hasText(e)&&f(t,e,p,d),d("fill"),"none"!==e.fill&&h(t,e,r,d),"tonext"!==e.fill&&"toself"!==e.fill||x.push("fills"),d("hoveron",x.join("+")||"points");var b=i.getComponentMethod("errorbars","supplyDefaults");b(t,e,r,{axis:"y"}),b(t,e,r,{axis:"x",inherit:"y"}),n.coerceSelectionMarkerOpacity(e,d)}else e.visible=!1}},{"../../lib":684,"../../registry":817,"../scatter/constants":1020,"../scatter/fillcolor_defaults":1023,"../scatter/line_defaults":1027,"../scatter/marker_defaults":1033,"../scatter/subtypes":1037,"../scatter/text_defaults":1038,"../scatter/xy_defaults":1039,"./attributes":1062}],1066:[function(t,e,r){"use strict";var n=t("regl-scatter2d"),i=t("regl-line2d"),a=t("regl-error2d"),o=t("point-cluster"),s=t("array-range"),l=t("@etpinard/gl-text"),c=t("../../registry"),u=t("../../lib"),h=t("../../lib/prepare_regl"),f=t("../../plots/cartesian/axis_ids"),p=t("../../components/color"),d=t("../scatter/subtypes"),g=t("../scatter/calc").calcMarkerSize,m=t("../scatter/calc").calcAxisExpansion,v=t("../scatter/colorscale_calc"),y=t("../scatter/link_traces"),x=t("../scatter/get_trace_color"),b=t("../scatter/fill_hover_text"),_=t("./convert"),w=t("../../constants/numerical").BADNUM,k=t("./constants").TOO_MANY_POINTS,M=t("../../constants/interactions").DESELECTDIM;function A(t,e,r,n,i,a){var o=_.style(t,r);if(o.marker&&(o.marker.positions=n),o.line&&n.length>1&&u.extendFlat(o.line,_.linePositions(t,r,n)),o.errorX||o.errorY){var s=_.errorBarPositions(t,r,n,i,a);o.errorX&&u.extendFlat(o.errorX,s.x),o.errorY&&u.extendFlat(o.errorY,s.y)}return o.text&&(u.extendFlat(o.text,{positions:n},_.textPosition(t,r,o.text,o.marker)),u.extendFlat(o.textSel,{positions:n},_.textPosition(t,r,o.text,o.markerSel)),u.extendFlat(o.textUnsel,{positions:n},_.textPosition(t,r,o.text,o.markerUnsel))),o}function T(t,e){var r=e._scene,n={count:0,dirty:!0,lineOptions:[],fillOptions:[],markerOptions:[],markerSelectedOptions:[],markerUnselectedOptions:[],errorXOptions:[],errorYOptions:[],textOptions:[],textSelectedOptions:[],textUnselectedOptions:[]},i={selectBatch:null,unselectBatch:null,fill2d:!1,scatter2d:!1,error2d:!1,line2d:!1,glText:!1,select2d:null};return e._scene||((r=e._scene={}).init=function(){u.extendFlat(r,i,n)},r.init(),r.update=function(t){var e,n=new Array(r.count);for(e=0;e<r.count;e++)n[e]=t;if(r.fill2d&&r.fill2d.update(n),r.scatter2d&&r.scatter2d.update(n),r.line2d&&r.line2d.update(n),r.error2d&&r.error2d.update(n.concat(n)),r.select2d&&r.select2d.update(n),r.glText)for(e=0;e<r.count;e++)r.glText[e].update(n[e]);r.draw()},r.draw=function(){var t;for(t=0;t<r.count;t++)r.fill2d&&r.fillOptions[t]&&r.fill2d.draw(t);for(t=0;t<r.count;t++)r.line2d&&r.lineOptions[t]&&r.line2d.draw(t),r.error2d&&r.errorXOptions[t]&&r.error2d.draw(t),r.error2d&&r.errorYOptions[t]&&r.error2d.draw(t+r.count),!r.scatter2d||!r.markerOptions[t]||r.selectBatch&&r.selectBatch[t]||r.scatter2d.draw(t);for(r.scatter2d&&r.select2d&&r.selectBatch&&(r.select2d.draw(r.selectBatch),r.scatter2d.draw(r.unselectBatch)),t=0;t<r.count;t++)r.glText[t]&&r.textOptions[t]&&r.glText[t].render();r.dirty=!1},r.clear=function(){var n=t._fullLayout,i=n._size,a=n.width,o=n.height,s=e.xaxis,l=e.yaxis,c=[i.l+s.domain[0]*i.w,i.b+l.domain[0]*i.h,a-i.r-(1-s.domain[1])*i.w,o-i.t-(1-l.domain[1])*i.h];r.select2d&&S(r.select2d,c),r.scatter2d?S(r.scatter2d,c):r.glText&&S(r.glText[0],c)},r.destroy=function(){r.fill2d&&r.fill2d.destroy(),r.scatter2d&&r.scatter2d.destroy(),r.error2d&&r.error2d.destroy(),r.line2d&&r.line2d.destroy(),r.select2d&&r.select2d.destroy(),r.glText&&r.glText.forEach(function(t){t.destroy()}),r.lineOptions=null,r.fillOptions=null,r.markerOptions=null,r.markerSelectedOptions=null,r.markerUnselectedOptions=null,r.errorXOptions=null,r.errorYOptions=null,r.textOptions=null,r.textSelectedOptions=null,r.textUnselectedOptions=null,r.selectBatch=null,r.unselectBatch=null,e._scene=null}),r.dirty||u.extendFlat(r,n),r}function S(t,e){var r=t.regl._gl;r.enable(r.SCISSOR_TEST),r.scissor(e[0],e[1],e[2]-e[0],e[3]-e[1]),r.clearColor(0,0,0,0),r.clear(r.COLOR_BUFFER_BIT)}function E(t,e,r,n){var i=t.xa,a=t.ya,o=t.distance,s=t.dxy,l=t.index,h={pointNumber:l,x:e[l],y:r[l]};h.tx=Array.isArray(n.text)?n.text[l]:n.text,h.htx=Array.isArray(n.hovertext)?n.hovertext[l]:n.hovertext,h.data=Array.isArray(n.customdata)?n.customdata[l]:n.customdata,h.tp=Array.isArray(n.textposition)?n.textposition[l]:n.textposition;var f=n.textfont;f&&(h.ts=Array.isArray(f.size)?f.size[l]:f.size,h.tc=Array.isArray(f.color)?f.color[l]:f.color,h.tf=Array.isArray(f.family)?f.family[l]:f.family);var p=n.marker;p&&(h.ms=u.isArrayOrTypedArray(p.size)?p.size[l]:p.size,h.mo=u.isArrayOrTypedArray(p.opacity)?p.opacity[l]:p.opacity,h.mx=Array.isArray(p.symbol)?p.symbol[l]:p.symbol,h.mc=u.isArrayOrTypedArray(p.color)?p.color[l]:p.color);var d=p&&p.line;d&&(h.mlc=Array.isArray(d.color)?d.color[l]:d.color,h.mlw=u.isArrayOrTypedArray(d.width)?d.width[l]:d.width);var g=p&&p.gradient;g&&"none"!==g.type&&(h.mgt=Array.isArray(g.type)?g.type[l]:g.type,h.mgc=Array.isArray(g.color)?g.color[l]:g.color);var m=i.c2p(h.x,!0),v=a.c2p(h.y,!0),y=h.mrc||1,_=n.hoverlabel;_&&(h.hbg=Array.isArray(_.bgcolor)?_.bgcolor[l]:_.bgcolor,h.hbc=Array.isArray(_.bordercolor)?_.bordercolor[l]:_.bordercolor,h.hts=Array.isArray(_.font.size)?_.font.size[l]:_.font.size,h.htc=Array.isArray(_.font.color)?_.font.color[l]:_.font.color,h.htf=Array.isArray(_.font.family)?_.font.family[l]:_.font.family,h.hnl=Array.isArray(_.namelength)?_.namelength[l]:_.namelength);var w=n.hoverinfo;w&&(h.hi=Array.isArray(w)?w[l]:w);var k={};return k[t.index]=h,u.extendFlat(t,{color:x(n,h),x0:m-y,x1:m+y,xLabelVal:h.x,y0:v-y,y1:v+y,yLabelVal:h.y,cd:k,distance:o,spikeDistance:s}),h.htx?t.text=h.htx:h.tx?t.text=h.tx:n.text&&(t.text=n.text),b(h,n,t),c.getComponentMethod("errorbars","hoverInfo")(h,n,t),t}function C(t){var e,r,n=t[0].t,i=n._scene,a=n.index,o=i.selectBatch[a],s=i.unselectBatch[a],l=i.textOptions[a],c=i.textSelectedOptions[a]||{},h=i.textUnselectedOptions[a]||{},f=u.extendFlat({},l);if(o&&s){var d=c.color,g=h.color,m=l.color,v=Array.isArray(m);for(f.color=new Array(n.count),e=0;e<o.length;e++)r=o[e],f.color[r]=d||(v?m[r]:m);for(e=0;e<s.length;e++){r=s[e];var y=v?m[r]:m;f.color[r]=g||(d?y:p.addOpacity(y,M))}}i.glText[a].update(f)}e.exports={moduleType:"trace",name:"scattergl",basePlotModule:t("../../plots/cartesian"),categories:["gl","regl","cartesian","symbols","errorBarsOK","showLegend","scatter-like"],attributes:t("./attributes"),supplyDefaults:t("./defaults"),cleanData:t("../scatter/clean_data"),colorbar:t("../scatter/marker_colorbar"),calc:function(t,e){var r,n,i,a=t._fullLayout,s=f.getFromId(t,e.xaxis),l=f.getFromId(t,e.yaxis),c=a._plots[e.xaxis+e.yaxis],u=e._length,h=2*u,p={},d=s.makeCalcdata(e,"x"),y=l.makeCalcdata(e,"y"),x=new Array(h);for(r=0;r<u;r++)n=d[r],i=y[r],x[2*r]=n===w?NaN:n,x[2*r+1]=i===w?NaN:i;if("log"===s.type)for(r=0;r<h;r+=2)x[r]=s.c2l(x[r]);if("log"===l.type)for(r=1;r<h;r+=2)x[r]=l.c2l(x[r]);if("log"!==s.type&&"log"!==l.type)p.tree=o(x);else{var b=p.ids=new Array(u);for(r=0;r<u;r++)b[r]=r}v(e);var _,M=A(t,0,e,x,d,y),S=T(t,c);return u<k?_=g(e,u):M.marker&&(_=2*(M.marker.sizeAvg||Math.max(M.marker.size,3))),m(t,e,s,l,d,y,_),M.fill&&!S.fill2d&&(S.fill2d=!0),M.marker&&!S.scatter2d&&(S.scatter2d=!0),M.line&&!S.line2d&&(S.line2d=!0),!M.errorX&&!M.errorY||S.error2d||(S.error2d=!0),M.text&&!S.glText&&(S.glText=!0),M.marker&&u>=k&&(M.marker.cluster=p.tree),S.lineOptions.push(M.line),S.errorXOptions.push(M.errorX),S.errorYOptions.push(M.errorY),S.fillOptions.push(M.fill),S.markerOptions.push(M.marker),S.markerSelectedOptions.push(M.markerSel),S.markerUnselectedOptions.push(M.markerUnsel),S.textOptions.push(M.text),S.textSelectedOptions.push(M.textSel),S.textUnselectedOptions.push(M.textUnsel),S.count++,p._scene=S,p.index=S.count-1,p.x=d,p.y=y,p.positions=x,p.count=u,t.firstscatter=!1,[{x:!1,y:!1,t:p,trace:e}]},plot:function(t,e,r){if(r.length){var o,s=t._fullLayout,c=r[0][0].t._scene,p=s.dragmode;if(c){var d=s._size,g=s.width,m=s.height;if(h(t,["ANGLE_instanced_arrays","OES_element_index_uint"])){var v=s._glcanvas.data()[0].regl;if(y(t,e,r),c.dirty){if(!0===c.error2d&&(c.error2d=a(v)),!0===c.line2d&&(c.line2d=i(v)),!0===c.scatter2d&&(c.scatter2d=n(v)),!0===c.fill2d&&(c.fill2d=i(v)),!0===c.glText)for(c.glText=new Array(c.count),o=0;o<c.count;o++)c.glText[o]=new l(v);if(c.glText)for(o=0;o<c.count;o++)c.glText[o].update(c.textOptions[o]);if(c.line2d&&c.line2d.update(c.lineOptions),c.error2d){var x=(c.errorXOptions||[]).concat(c.errorYOptions||[]);c.error2d.update(x)}c.scatter2d&&c.scatter2d.update(c.markerOptions),c.fill2d&&(c.fillOptions=c.fillOptions.map(function(t,e){var n=r[e];if(!(t&&n&&n[0]&&n[0].trace))return null;var i,a,o=n[0],s=o.trace,l=o.t,u=c.lineOptions[e],h=[],f=u&&u.positions||l.positions;if("tozeroy"===s.fill)(h=(h=[f[0],0]).concat(f)).push(f[f.length-2]),h.push(0);else if("tozerox"===s.fill)(h=(h=[0,f[1]]).concat(f)).push(0),h.push(f[f.length-1]);else if("toself"===s.fill||"tonext"===s.fill){for(h=[],i=0,a=0;a<f.length;a+=2)(isNaN(f[a])||isNaN(f[a+1]))&&((h=h.concat(f.slice(i,a))).push(f[i],f[i+1]),i=a+2);h=h.concat(f.slice(i)),i&&h.push(f[i],f[i+1])}else{var p=s._nexttrace;if(p){var d=c.lineOptions[e+1];if(d){var g=d.positions;if("tonexty"===s.fill){for(h=f.slice(),e=Math.floor(g.length/2);e--;){var m=g[2*e],v=g[2*e+1];isNaN(m)||isNaN(v)||(h.push(m),h.push(v))}t.fill=p.fillcolor}}}}if(s._prevtrace&&"tonext"===s._prevtrace.fill){var y=c.lineOptions[e-1].positions,x=h.length/2,b=[i=x];for(a=0;a<y.length;a+=2)(isNaN(y[a])||isNaN(y[a+1]))&&(b.push(a/2+x+1),i=a+2);h=h.concat(y),t.hole=b}return t.opacity=s.opacity,t.positions=h,t}),c.fill2d.update(c.fillOptions))}var b="lasso"===p||"select"===p;c.selectBatch=null,c.unselectBatch=null;var _=r.map(function(r){if(r&&r[0]&&r[0].trace){var n,i=r[0],a=i.trace,o=i.t,s=o.index,l=o.x,h=o.y,p=e.xaxis||f.getFromId(t,a.xaxis||"x"),v=e.yaxis||f.getFromId(t,a.yaxis||"y"),y=[(p._rl||p.range)[0],(v._rl||v.range)[0],(p._rl||p.range)[1],(v._rl||v.range)[1]],x=[d.l+p.domain[0]*d.w,d.b+v.domain[0]*d.h,g-d.r-(1-p.domain[1])*d.w,m-d.t-(1-v.domain[1])*d.h];if(a.selectedpoints||b){if(b||(b=!0),c.selectBatch||(c.selectBatch=[],c.unselectBatch=[]),a.selectedpoints){var _=c.selectBatch[s]=u.selIndices2selPoints(a),w={};for(n=0;n<_.length;n++)w[_[n]]=1;var k=[];for(n=0;n<o.count;n++)w[n]||k.push(n);c.unselectBatch[s]=k}var M=new Array(o.count),A=new Array(o.count);for(n=0;n<o.count;n++)M[n]=p.c2p(l[n]),A[n]=v.c2p(h[n]);o.xpx=M,o.ypx=A}else o.xpx=o.ypx=null;return a.visible?{viewport:x,range:y}:null}});b&&(c.select2d||(c.select2d=n(s._glcanvas.data()[1].regl)),c.scatter2d&&c.selectBatch&&c.selectBatch.length&&c.scatter2d.update(c.markerUnselectedOptions.map(function(t,e){return c.selectBatch[e]?t:null})),c.select2d&&(c.select2d.update(c.markerOptions),c.select2d.update(c.markerSelectedOptions)),c.glText&&r.forEach(function(t){t&&t[0]&&t[0].trace&&C(t)})),c.fill2d&&c.fill2d.update(_),c.line2d&&c.line2d.update(_),c.error2d&&c.error2d.update(_.concat(_)),c.scatter2d&&c.scatter2d.update(_),c.select2d&&c.select2d.update(_),c.glText&&c.glText.forEach(function(t,e){t.update(_[e])}),c.draw()}else c.init()}}},hoverPoints:function(t,e,r,n){var i,a,o,s,l,c,u,h,f,p=t.cd,d=p[0].t,g=p[0].trace,m=t.xa,v=t.ya,y=d.x,x=d.y,b=m.c2p(e),_=v.c2p(r),w=t.distance;if(d.tree){var k=m.p2c(b-w),M=m.p2c(b+w),A=v.p2c(_-w),T=v.p2c(_+w);i="x"===n?d.tree.range(Math.min(k,M),Math.min(v._rl[0],v._rl[1]),Math.max(k,M),Math.max(v._rl[0],v._rl[1])):d.tree.range(Math.min(k,M),Math.min(A,T),Math.max(k,M),Math.max(A,T))}else{if(!d.ids)return[t];i=d.ids}var S=w;if("x"===n)for(l=0;l<i.length;l++)o=y[i[l]],(c=Math.abs(m.c2p(o)-b))<S&&(S=c,u=v.c2p(x[i[l]])-_,f=Math.sqrt(c*c+u*u),a=i[l]);else for(l=0;l<i.length;l++)o=y[i[l]],s=x[i[l]],c=m.c2p(o)-b,u=v.c2p(s)-_,(h=Math.sqrt(c*c+u*u))<S&&(S=f=h,a=i[l]);return t.index=a,t.distance=S,t.dxy=f,void 0===a?[t]:(E(t,y,x,g),[t])},style:function(t,e){if(e){var r=e[0][0].t._scene;t._fullLayout._has("splom")||r.clear(),r.draw()}},selectPoints:function(t,e){var r=t.cd,n=[],i=r[0].trace,a=r[0].t,o=a.x,l=a.y,c=a._scene;if(!c)return n;var u=d.hasText(i),h=d.hasMarkers(i),f=!h&&!u;if(!0!==i.visible||f)return n;var p,g=null,m=null;if(!1===e||e.degenerate)m=s(a.count);else for(g=[],m=[],p=0;p<a.count;p++)e.contains([a.xpx[p],a.ypx[p]])?(g.push(p),n.push({pointNumber:p,x:o[p],y:l[p]})):m.push(p);if(c.selectBatch||(c.selectBatch=[],c.unselectBatch=[]),!c.selectBatch[a.index]){for(p=0;p<c.count;p++)c.selectBatch[p]=[],c.unselectBatch[p]=[];h&&c.scatter2d.update(c.markerUnselectedOptions)}return c.selectBatch[a.index]=g,c.unselectBatch[a.index]=m,u&&C(r),n},sceneOptions:A,sceneUpdate:T,calcHover:E,meta:{}}},{"../../components/color":558,"../../constants/interactions":660,"../../constants/numerical":661,"../../lib":684,"../../lib/prepare_regl":697,"../../plots/cartesian":743,"../../plots/cartesian/axis_ids":735,"../../registry":817,"../scatter/calc":1016,"../scatter/clean_data":1018,"../scatter/colorscale_calc":1019,"../scatter/fill_hover_text":1022,"../scatter/get_trace_color":1024,"../scatter/link_traces":1030,"../scatter/marker_colorbar":1032,"../scatter/subtypes":1037,"./attributes":1062,"./constants":1063,"./convert":1064,"./defaults":1065,"@etpinard/gl-text":44,"array-range":58,"point-cluster":436,"regl-error2d":457,"regl-line2d":458,"regl-scatter2d":459}],1067:[function(t,e,r){"use strict";var n=t("../scattergeo/attributes"),i=t("../scatter/attributes"),a=t("../../plots/mapbox/layout_attributes"),o=t("../../plots/attributes"),s=t("../../components/colorbar/attributes"),l=t("../../lib/extend").extendFlat,c=t("../../plot_api/edit_types").overrideAll,u=n.line,h=n.marker;e.exports=c({lon:n.lon,lat:n.lat,mode:l({},i.mode,{dflt:"markers"}),text:l({},i.text,{}),hovertext:l({},i.hovertext,{}),line:{color:u.color,width:u.width},connectgaps:i.connectgaps,marker:{symbol:{valType:"string",dflt:"circle",arrayOk:!0},opacity:h.opacity,size:h.size,sizeref:h.sizeref,sizemin:h.sizemin,sizemode:h.sizemode,color:h.color,colorscale:h.colorscale,cauto:h.cauto,cmax:h.cmax,cmin:h.cmin,autocolorscale:h.autocolorscale,reversescale:h.reversescale,showscale:h.showscale,colorbar:s},fill:n.fill,fillcolor:i.fillcolor,textfont:a.layers.symbol.textfont,textposition:a.layers.symbol.textposition,selected:{marker:i.selected.marker},unselected:{marker:i.unselected.marker},hoverinfo:l({},o.hoverinfo,{flags:["lon","lat","text","name"]})},"calc","nested")},{"../../components/colorbar/attributes":559,"../../lib/extend":673,"../../plot_api/edit_types":715,"../../plots/attributes":729,"../../plots/mapbox/layout_attributes":791,"../scatter/attributes":1015,"../scattergeo/attributes":1053}],1068:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../lib"),a=t("../../constants/numerical").BADNUM,o=t("../../lib/geojson_utils"),s=t("../../components/colorscale"),l=t("../../components/drawing"),c=t("../scatter/make_bubble_size_func"),u=t("../scatter/subtypes"),h=t("../../plots/mapbox/convert_text_opts");function f(){return{geojson:o.makeBlank(),layout:{visibility:"none"},paint:{}}}function p(t){return i.isArrayOrTypedArray(t)?function(t){return t}:t?function(){return t}:d}function d(){return""}function g(t){return t[0]===a}e.exports=function(t){var e,r=t[0].trace,a=!0===r.visible,m="none"!==r.fill,v=u.hasLines(r),y=u.hasMarkers(r),x=u.hasText(r),b=y&&"circle"===r.marker.symbol,_=y&&"circle"!==r.marker.symbol,w=f(),k=f(),M=f(),A=f(),T={fill:w,line:k,circle:M,symbol:A};if(!a)return T;if((m||v)&&(e=o.calcTraceToLineCoords(t)),m&&(w.geojson=o.makePolygon(e),w.layout.visibility="visible",i.extendFlat(w.paint,{"fill-color":r.fillcolor})),v&&(k.geojson=o.makeLine(e),k.layout.visibility="visible",i.extendFlat(k.paint,{"line-width":r.line.width,"line-color":r.line.color,"line-opacity":r.opacity})),b){var S=function(t){var e,r,a,o,u=t[0].trace,h=u.marker,f=u.selectedpoints,p=i.isArrayOrTypedArray(h.color),d=i.isArrayOrTypedArray(h.size),m=i.isArrayOrTypedArray(h.opacity);function v(t){return u.opacity*t}p&&(r=s.hasColorscale(u,"marker")?s.makeColorScaleFunc(s.extractScale(h.colorscale,h.cmin,h.cmax)):i.identity);d&&(a=c(u));m&&(o=function(t){var e=n(t)?+i.constrain(t,0,1):0;return v(e)});var y,x=[];for(e=0;e<t.length;e++){var b=t[e],_=b.lonlat;if(!g(_)){var w={};r&&(w.mcc=b.mcc=r(b.mc)),a&&(w.mrc=b.mrc=a(b.ms)),o&&(w.mo=o(b.mo)),f&&(w.selected=b.selected||0),x.push({type:"Feature",geometry:{type:"Point",coordinates:_},properties:w})}}if(f)for(y=l.makeSelectedPointStyleFns(u),e=0;e<x.length;e++){var k=x[e].properties;y.selectedOpacityFn&&(k.mo=v(y.selectedOpacityFn(k))),y.selectedColorFn&&(k.mcc=y.selectedColorFn(k)),y.selectedSizeFn&&(k.mrc=y.selectedSizeFn(k))}return{geojson:{type:"FeatureCollection",features:x},mcc:p||y&&y.selectedColorFn?{type:"identity",property:"mcc"}:h.color,mrc:d||y&&y.selectedSizeFn?{type:"identity",property:"mrc"}:(M=h.size,M/2),mo:m||y&&y.selectedOpacityFn?{type:"identity",property:"mo"}:v(h.opacity)};var M}(t);M.geojson=S.geojson,M.layout.visibility="visible",i.extendFlat(M.paint,{"circle-color":S.mcc,"circle-radius":S.mrc,"circle-opacity":S.mo})}if((_||x)&&(A.geojson=function(t){for(var e=t[0].trace,r=(e.marker||{}).symbol,n=e.text,i="circle"!==r?p(r):d,a=u.hasText(e)?p(n):d,o=[],s=0;s<t.length;s++){var l=t[s];g(l.lonlat)||o.push({type:"Feature",geometry:{type:"Point",coordinates:l.lonlat},properties:{symbol:i(l.mx),text:a(l.tx)}})}return{type:"FeatureCollection",features:o}}(t),i.extendFlat(A.layout,{visibility:"visible","icon-image":"{symbol}-15","text-field":"{text}"}),_&&(i.extendFlat(A.layout,{"icon-size":r.marker.size/10}),i.extendFlat(A.paint,{"icon-opacity":r.opacity*r.marker.opacity,"icon-color":r.marker.color})),x)){var E=(r.marker||{}).size,C=h(r.textposition,E);i.extendFlat(A.layout,{"text-size":r.textfont.size,"text-anchor":C.anchor,"text-offset":C.offset}),i.extendFlat(A.paint,{"text-color":r.textfont.color,"text-opacity":r.opacity})}return T}},{"../../components/colorscale":573,"../../components/drawing":583,"../../constants/numerical":661,"../../lib":684,"../../lib/geojson_utils":677,"../../plots/mapbox/convert_text_opts":788,"../scatter/make_bubble_size_func":1031,"../scatter/subtypes":1037,"fast-isnumeric":214}],1069:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../scatter/subtypes"),a=t("../scatter/marker_defaults"),o=t("../scatter/line_defaults"),s=t("../scatter/text_defaults"),l=t("../scatter/fillcolor_defaults"),c=t("./attributes");e.exports=function(t,e,r,u){function h(r,i){return n.coerce(t,e,c,r,i)}if(function(t,e,r){var n=r("lon")||[],i=r("lat")||[],a=Math.min(n.length,i.length);return e._length=a,a}(0,e,h)){if(h("text"),h("hovertext"),h("mode"),i.hasLines(e)&&(o(t,e,r,u,h,{noDash:!0}),h("connectgaps")),i.hasMarkers(e)){a(t,e,r,u,h,{noLine:!0});var f=e.marker;"circle"!==f.symbol&&(n.isArrayOrTypedArray(f.size)&&(f.size=f.size[0]),n.isArrayOrTypedArray(f.color)&&(f.color=f.color[0]))}i.hasText(e)&&s(t,e,u,h,{noSelect:!0}),h("fill"),"none"!==e.fill&&l(t,e,r,h),n.coerceSelectionMarkerOpacity(e,h)}else e.visible=!1}},{"../../lib":684,"../scatter/fillcolor_defaults":1023,"../scatter/line_defaults":1027,"../scatter/marker_defaults":1033,"../scatter/subtypes":1037,"../scatter/text_defaults":1038,"./attributes":1067}],1070:[function(t,e,r){"use strict";e.exports=function(t,e){return t.lon=e.lon,t.lat=e.lat,t}},{}],1071:[function(t,e,r){"use strict";var n=t("../../components/fx"),i=t("../../lib"),a=t("../scatter/get_trace_color"),o=t("../scatter/fill_hover_text"),s=t("../../constants/numerical").BADNUM;e.exports=function(t,e,r){var l=t.cd,c=l[0].trace,u=t.xa,h=t.ya,f=t.subplot,p=360*(e>=0?Math.floor((e+180)/360):Math.ceil((e-180)/360)),d=e-p;if(n.getClosest(l,function(t){var e=t.lonlat;if(e[0]===s)return 1/0;var n=i.wrap180(e[0]),a=e[1],o=f.project([n,a]),l=o.x-u.c2p([d,a]),c=o.y-h.c2p([n,r]),p=Math.max(3,t.mrc||0);return Math.max(Math.sqrt(l*l+c*c)-p,1-3/p)},t),!1!==t.index){var g=l[t.index],m=g.lonlat,v=[i.wrap180(m[0])+p,m[1]],y=u.c2p(v),x=h.c2p(v),b=g.mrc||1;return t.x0=y-b,t.x1=y+b,t.y0=x-b,t.y1=x+b,t.color=a(c,g),t.extraText=function(t,e,r){var n=(e.hi||t.hoverinfo).split("+"),i=-1!==n.indexOf("all"),a=-1!==n.indexOf("lon"),s=-1!==n.indexOf("lat"),l=e.lonlat,c=[];function u(t){return t+"\xb0"}i||a&&s?c.push("("+u(l[0])+", "+u(l[1])+")"):a?c.push(r.lon+u(l[0])):s&&c.push(r.lat+u(l[1]));(i||-1!==n.indexOf("text"))&&o(e,t,c);return c.join("<br>")}(c,g,l[0].t.labels),[t]}}},{"../../components/fx":600,"../../constants/numerical":661,"../../lib":684,"../scatter/fill_hover_text":1022,"../scatter/get_trace_color":1024}],1072:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.colorbar=t("../scatter/marker_colorbar"),n.calc=t("../scattergeo/calc"),n.plot=t("./plot"),n.hoverPoints=t("./hover"),n.eventData=t("./event_data"),n.selectPoints=t("./select"),n.style=function(t,e){e&&e[0].trace._glTrace.update(e)},n.moduleType="trace",n.name="scattermapbox",n.basePlotModule=t("../../plots/mapbox"),n.categories=["mapbox","gl","symbols","showLegend","scatterlike"],n.meta={},e.exports=n},{"../../plots/mapbox":789,"../scatter/marker_colorbar":1032,"../scattergeo/calc":1054,"./attributes":1067,"./defaults":1069,"./event_data":1070,"./hover":1071,"./plot":1073,"./select":1074}],1073:[function(t,e,r){"use strict";var n=t("./convert");function i(t,e){this.subplot=t,this.uid=e,this.sourceIds={fill:e+"-source-fill",line:e+"-source-line",circle:e+"-source-circle",symbol:e+"-source-symbol"},this.layerIds={fill:e+"-layer-fill",line:e+"-layer-line",circle:e+"-layer-circle",symbol:e+"-layer-symbol"},this.order=["fill","line","circle","symbol"]}var a=i.prototype;a.addSource=function(t,e){this.subplot.map.addSource(this.sourceIds[t],{type:"geojson",data:e.geojson})},a.setSourceData=function(t,e){this.subplot.map.getSource(this.sourceIds[t]).setData(e.geojson)},a.addLayer=function(t,e){this.subplot.map.addLayer({type:t,id:this.layerIds[t],source:this.sourceIds[t],layout:e.layout,paint:e.paint})},a.update=function(t){for(var e=this.subplot,r=n(t),i=0;i<this.order.length;i++){var a=this.order[i],o=r[a];e.setOptions(this.layerIds[a],"setLayoutProperty",o.layout),"visible"===o.layout.visibility&&(this.setSourceData(a,o),e.setOptions(this.layerIds[a],"setPaintProperty",o.paint))}t[0].trace._glTrace=this},a.dispose=function(){for(var t=this.subplot.map,e=0;e<this.order.length;e++){var r=this.order[e];t.removeLayer(this.layerIds[r]),t.removeSource(this.sourceIds[r])}},e.exports=function(t,e){for(var r=new i(t,e[0].trace.uid),a=n(e),o=0;o<r.order.length;o++){var s=r.order[o],l=a[s];r.addSource(s,l),r.addLayer(s,l)}return e[0].trace._glTrace=r,r}},{"./convert":1068}],1074:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../scatter/subtypes"),a=t("../../constants/numerical").BADNUM;e.exports=function(t,e){var r,o=t.cd,s=t.xaxis,l=t.yaxis,c=[],u=o[0].trace;if(!i.hasMarkers(u))return[];if(!1===e)for(r=0;r<o.length;r++)o[r].selected=0;else for(r=0;r<o.length;r++){var h=o[r],f=h.lonlat;if(f[0]!==a){var p=[n.wrap180(f[0]),f[1]],d=[s.c2p(p),l.c2p(p)];e.contains(d)?(c.push({pointNumber:r,lon:f[0],lat:f[1]}),h.selected=1):h.selected=0}}return c}},{"../../constants/numerical":661,"../../lib":684,"../scatter/subtypes":1037}],1075:[function(t,e,r){"use strict";var n=t("../../lib/extend").extendFlat,i=t("../scatter/attributes"),a=t("../../plots/attributes"),o=i.line;e.exports={mode:i.mode,r:{valType:"data_array",editType:"calc+clearAxisTypes"},theta:{valType:"data_array",editType:"calc+clearAxisTypes"},thetaunit:{valType:"enumerated",values:["radians","degrees","gradians"],dflt:"degrees",editType:"calc+clearAxisTypes"},text:i.text,hovertext:i.hovertext,line:{color:o.color,width:o.width,dash:o.dash,shape:n({},o.shape,{values:["linear","spline"]}),smoothing:o.smoothing,editType:"calc"},connectgaps:i.connectgaps,marker:i.marker,cliponaxis:n({},i.cliponaxis,{dflt:!1}),textposition:i.textposition,textfont:i.textfont,fill:n({},i.fill,{values:["none","toself","tonext"]}),fillcolor:i.fillcolor,hoverinfo:n({},a.hoverinfo,{flags:["r","theta","text","name"]}),hoveron:i.hoveron,selected:i.selected,unselected:i.unselected}},{"../../lib/extend":673,"../../plots/attributes":729,"../scatter/attributes":1015}],1076:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../../constants/numerical").BADNUM,a=t("../../plots/cartesian/axes"),o=t("../scatter/colorscale_calc"),s=t("../scatter/arrays_to_calcdata"),l=t("../scatter/calc_selection"),c=t("../scatter/calc").calcMarkerSize;e.exports=function(t,e){var r,u=t._fullLayout,h=e.subplot,f=u[h].radialaxis,p=u[h].angularaxis,d=f.makeCalcdata(e,"r"),g=p.makeCalcdata(e,"theta"),m=e._length,v=new Array(m);for(var y=0;y<m;y++){var x=d[y],b=g[y],_=v[y]={};n(x)&&n(b)?(_.r=x,_.theta=b,_.rad=(r=b,p.c2rad(r,e.thetaunit))):_.r=i}var w=c(e,m);return a.expand(f,d,{ppad:w}),o(e),s(v,e),l(v,e),v}},{"../../constants/numerical":661,"../../plots/cartesian/axes":732,"../scatter/arrays_to_calcdata":1014,"../scatter/calc":1016,"../scatter/calc_selection":1017,"../scatter/colorscale_calc":1019,"fast-isnumeric":214}],1077:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../scatter/subtypes"),a=t("../scatter/marker_defaults"),o=t("../scatter/line_defaults"),s=t("../scatter/line_shape_defaults"),l=t("../scatter/text_defaults"),c=t("../scatter/fillcolor_defaults"),u=t("../scatter/constants").PTS_LINESONLY,h=t("./attributes");e.exports=function(t,e,r,f){function p(r,i){return n.coerce(t,e,h,r,i)}var d=p("r"),g=p("theta"),m=d&&g?Math.min(d.length,g.length):0;if(m){e._length=m,p("thetaunit"),p("mode",m<u?"lines+markers":"lines"),p("text"),p("hovertext"),i.hasLines(e)&&(o(t,e,r,f,p),s(t,e,p),p("connectgaps")),i.hasMarkers(e)&&a(t,e,r,f,p,{gradient:!0}),i.hasText(e)&&l(t,e,f,p);var v=[];(i.hasMarkers(e)||i.hasText(e))&&(p("cliponaxis"),p("marker.maxdisplayed"),v.push("points")),p("fill"),"none"!==e.fill&&(c(t,e,r,p),i.hasLines(e)||s(t,e,p)),"tonext"!==e.fill&&"toself"!==e.fill||v.push("fills"),p("hoveron",v.join("+")||"points"),n.coerceSelectionMarkerOpacity(e,p)}else e.visible=!1}},{"../../lib":684,"../scatter/constants":1020,"../scatter/fillcolor_defaults":1023,"../scatter/line_defaults":1027,"../scatter/line_shape_defaults":1029,"../scatter/marker_defaults":1033,"../scatter/subtypes":1037,"../scatter/text_defaults":1038,"./attributes":1075}],1078:[function(t,e,r){"use strict";var n=t("../scatter/hover"),i=t("../../plots/cartesian/axes"),a=t("../../lib");function o(t,e,r){var n=r.radialAxis,o=r.angularAxis,s=(t.hi||e.hoverinfo).split("+"),l=[];n._hovertitle="r",o._hovertitle="\u03b8";var c,u=o._c2rad(t.theta,e.thetaunit);function h(t,e){l.push(t._hovertitle+": "+i.tickText(t,e,"hover").text)}return c="linear"===o.type&&e.thetaunit!==o.thetaunit?"degrees"===o.thetaunit?a.rad2deg(u):u:t.theta,-1!==s.indexOf("all")&&(s=["r","theta"]),-1!==s.indexOf("r")&&h(n,n.c2r(t.r)),-1!==s.indexOf("theta")&&h(o,c),l.join("<br>")}e.exports={hoverPoints:function(t,e,r,i){var a=n(t,e,r,i);if(a&&!1!==a[0].index){var s=a[0];if(void 0===s.index)return a;var l=t.subplot,c=s.cd[s.index],u=s.trace;if(l.isPtWithinSector(c))return s.xLabelVal=void 0,s.yLabelVal=void 0,s.extraText=o(c,u,l),a}},makeHoverPointText:o}},{"../../lib":684,"../../plots/cartesian/axes":732,"../scatter/hover":1025}],1079:[function(t,e,r){"use strict";e.exports={moduleType:"trace",name:"scatterpolar",basePlotModule:t("../../plots/polar"),categories:["polar","symbols","showLegend","scatter-like"],attributes:t("./attributes"),supplyDefaults:t("./defaults"),colorbar:t("../scatter/marker_colorbar"),calc:t("./calc"),plot:t("./plot"),style:t("../scatter/style").style,hoverPoints:t("./hover").hoverPoints,selectPoints:t("../scatter/select"),meta:{}}},{"../../plots/polar":798,"../scatter/marker_colorbar":1032,"../scatter/select":1035,"../scatter/style":1036,"./attributes":1075,"./calc":1076,"./defaults":1077,"./hover":1078,"./plot":1080}],1080:[function(t,e,r){"use strict";var n=t("../scatter/plot"),i=t("../../constants/numerical").BADNUM;e.exports=function(t,e,r){var a,o,s,l={xaxis:e.xaxis,yaxis:e.yaxis,plot:e.framework,layerClipId:e._hasClipOnAxisFalse?e.clipIds.forTraces:null},c=e.radialAxis,u=c.range;for(s=u[0]>u[1]?function(t){return t<=0}:function(t){return t>=0},a=0;a<r.length;a++)for(o=0;o<r[a].length;o++){var h=r[a][o],f=h.r;if(f!==i){var p=c.c2r(f)-u[0];if(s(p)){var d=h.rad;h.x=p*Math.cos(d),h.y=p*Math.sin(d);continue}h.intoCenter=[e.cxx,e.cyy]}h.x=i,h.y=i}var g=e.layers.frontplot.select("g.scatterlayer");n(t,l,r,g)}},{"../../constants/numerical":661,"../scatter/plot":1034}],1081:[function(t,e,r){"use strict";var n=t("../scatterpolar/attributes"),i=t("../scattergl/attributes");e.exports={mode:n.mode,r:n.r,theta:n.theta,thetaunit:n.thetaunit,text:n.text,line:i.line,connectgaps:i.connectgaps,marker:i.marker,fill:i.fill,fillcolor:i.fillcolor,hoverinfo:n.hoverinfo,hoveron:n.hoveron,selected:n.selected,unselected:n.unselected}},{"../scattergl/attributes":1062,"../scatterpolar/attributes":1075}],1082:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../scatter/subtypes"),a=t("../scatter/marker_defaults"),o=t("../scatter/line_defaults"),s=t("../scatter/fillcolor_defaults"),l=t("../scatter/constants").PTS_LINESONLY,c=t("./attributes");e.exports=function(t,e,r,u){function h(r,i){return n.coerce(t,e,c,r,i)}var f=h("r"),p=h("theta"),d=f&&p?Math.min(f.length,p.length):0;if(d){e._length=d,h("thetaunit"),h("mode",d<l?"lines+markers":"lines"),h("text"),i.hasLines(e)&&(o(t,e,r,u,h),h("connectgaps"));var g=[];i.hasMarkers(e)&&(a(t,e,r,u,h),g.push("points")),h("fill"),"none"!==e.fill&&s(t,e,r,h),"tonext"!==e.fill&&"toself"!==e.fill||g.push("fills"),h("hoveron",g.join("+")||"points"),n.coerceSelectionMarkerOpacity(e,h)}else e.visible=!1}},{"../../lib":684,"../scatter/constants":1020,"../scatter/fillcolor_defaults":1023,"../scatter/line_defaults":1027,"../scatter/marker_defaults":1033,"../scatter/subtypes":1037,"./attributes":1081}],1083:[function(t,e,r){"use strict";var n=t("point-cluster"),i=t("fast-isnumeric"),a=t("../scattergl"),o=t("../scatter/colorscale_calc"),s=t("../../plots/cartesian/axes"),l=t("../scatterpolar/hover").makeHoverPointText,c=t("../scatter/subtypes"),u=t("../scattergl/constants").TOO_MANY_POINTS;e.exports={moduleType:"trace",name:"scatterpolargl",basePlotModule:t("../../plots/polar"),categories:["gl","regl","polar","symbols","showLegend","scatter-like"],attributes:t("./attributes"),supplyDefaults:t("./defaults"),colorbar:t("../scatter/marker_colorbar"),calc:function(t,e){var r=t._fullLayout,n=e.subplot,i=r[n].radialaxis,a=r[n].angularaxis,l=i.makeCalcdata(e,"r"),c=a.makeCalcdata(e,"theta"),u={};return e._length<l.length&&(l=l.slice(0,e._length)),e._length<c.length&&(c=c.slice(0,e._length)),o(e),u.r=l,u.theta=c,s.expand(i,l,{tozero:!0}),"linear"!==a.type&&(a.autorange=!0,s.expand(a,c),delete a.autorange),[{x:!1,y:!1,t:u,trace:e}]},plot:function(t,e,r){var o=e.radialAxis,s=e.angularAxis,l=o.range,h=a.sceneUpdate(t,e);return h.clear(),r.forEach(function(f,p){if(f&&f[0]&&f[0].trace){var d,g,m,v,y,x=f[0],b=x.trace,_=x.t,w=_.r,k=_.theta,M=w.slice(),A=k.slice();for(d=0;d<w.length;d++)g=w[d],v=k[d],y=s.c2rad(v,b.thetaunit),e.isPtWithinSector({r:g,rad:y})||(M[d]=NaN,A[d]=NaN);var T,S=w.length,E=new Array(2*S),C=Array(S),L=Array(S);for(d=0;d<S;d++)g=M[d],v=A[d],i(g)&&i(v)&&g>=0?(m=o.c2r(g)-l[0],T=v,y=s.c2rad(T,b.thetaunit),C[d]=E[2*d]=m*Math.cos(y),L[d]=E[2*d+1]=m*Math.sin(y)):C[d]=L[d]=E[2*d]=E[2*d+1]=NaN;var z=a.sceneOptions(t,e,b,E);z.fill&&!h.fill2d&&(h.fill2d=!0),z.marker&&!h.scatter2d&&(h.scatter2d=!0),z.line&&!h.line2d&&(h.line2d=!0),!z.errorX&&!z.errorY||h.error2d||(h.error2d=!0),_.tree=n(E),z.marker&&S>=u&&(z.marker.cluster=_.tree),c.hasMarkers(b)&&(z.markerSel.positions=z.markerUnsel.positions=z.marker.positions),h.lineOptions.push(z.line),h.errorXOptions.push(z.errorX),h.errorYOptions.push(z.errorY),h.fillOptions.push(z.fill),h.markerOptions.push(z.marker),h.markerSelectedOptions.push(z.markerSel),h.markerUnselectedOptions.push(z.markerUnsel),h.count=r.length,_._scene=h,_.index=p,_.x=C,_.y=L,_.rawx=C,_.rawy=L,_.r=w,_.theta=k,_.positions=E,_.count=S}}),a.plot(t,e,r)},hoverPoints:function(t,e,r,n){var i=t.cd[0].t,o=i.r,s=i.theta,c=a.hoverPoints(t,e,r,n);if(c&&!1!==c[0].index){var u=c[0];if(void 0===u.index)return c;var h=t.subplot,f=h.angularAxis,p=u.cd[u.index],d=u.trace;if(p.r=o[u.index],p.theta=s[u.index],p.rad=f.c2rad(p.theta,d.thetaunit),h.isPtWithinSector(p))return u.xLabelVal=void 0,u.yLabelVal=void 0,u.extraText=l(p,d,h),c}},style:a.style,selectPoints:a.selectPoints,meta:{}}},{"../../plots/cartesian/axes":732,"../../plots/polar":798,"../scatter/colorscale_calc":1019,"../scatter/marker_colorbar":1032,"../scatter/subtypes":1037,"../scattergl":1066,"../scattergl/constants":1063,"../scatterpolar/hover":1078,"./attributes":1081,"./defaults":1082,"fast-isnumeric":214,"point-cluster":436}],1084:[function(t,e,r){"use strict";var n=t("../scatter/attributes"),i=t("../../plots/attributes"),a=t("../../components/colorscale/attributes"),o=t("../../components/colorbar/attributes"),s=t("../../components/drawing/attributes").dash,l=t("../../lib/extend").extendFlat,c=n.marker,u=n.line,h=c.line;e.exports={a:{valType:"data_array",editType:"calc"},b:{valType:"data_array",editType:"calc"},c:{valType:"data_array",editType:"calc"},sum:{valType:"number",dflt:0,min:0,editType:"calc"},mode:l({},n.mode,{dflt:"markers"}),text:l({},n.text,{}),hovertext:l({},n.hovertext,{}),line:{color:u.color,width:u.width,dash:s,shape:l({},u.shape,{values:["linear","spline"]}),smoothing:u.smoothing,editType:"calc"},connectgaps:n.connectgaps,cliponaxis:n.cliponaxis,fill:l({},n.fill,{values:["none","toself","tonext"]}),fillcolor:n.fillcolor,marker:l({symbol:c.symbol,opacity:c.opacity,maxdisplayed:c.maxdisplayed,size:c.size,sizeref:c.sizeref,sizemin:c.sizemin,sizemode:c.sizemode,line:l({width:h.width,editType:"calc"},a("marker.line")),gradient:c.gradient,editType:"calc"},a("marker"),{colorbar:o}),textfont:n.textfont,textposition:n.textposition,selected:n.selected,unselected:n.unselected,hoverinfo:l({},i.hoverinfo,{flags:["a","b","c","text","name"]}),hoveron:n.hoveron}},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../components/drawing/attributes":582,"../../lib/extend":673,"../../plots/attributes":729,"../scatter/attributes":1015}],1085:[function(t,e,r){"use strict";var n=t("fast-isnumeric"),i=t("../scatter/colorscale_calc"),a=t("../scatter/arrays_to_calcdata"),o=t("../scatter/calc_selection"),s=t("../scatter/calc").calcMarkerSize,l=["a","b","c"],c={a:["b","c"],b:["a","c"],c:["a","b"]};e.exports=function(t,e){var r,u,h,f,p,d,g=t._fullLayout[e.subplot].sum,m=e.sum||g,v={a:e.a,b:e.b,c:e.c};for(r=0;r<l.length;r++)if(!v[h=l[r]]){for(p=v[c[h][0]],d=v[c[h][1]],f=new Array(p.length),u=0;u<p.length;u++)f[u]=m-p[u]-d[u];v[h]=f}var y,x,b,_,w,k,M=e._length,A=new Array(M);for(r=0;r<M;r++)y=v.a[r],x=v.b[r],b=v.c[r],n(y)&&n(x)&&n(b)?(1!==(_=g/((y=+y)+(x=+x)+(b=+b)))&&(y*=_,x*=_,b*=_),k=y,w=b-x,A[r]={x:w,y:k,a:y,b:x,c:b}):A[r]={x:!1,y:!1};return s(e,M),i(e),a(A,e),o(A,e),A}},{"../scatter/arrays_to_calcdata":1014,"../scatter/calc":1016,"../scatter/calc_selection":1017,"../scatter/colorscale_calc":1019,"fast-isnumeric":214}],1086:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../scatter/constants"),a=t("../scatter/subtypes"),o=t("../scatter/marker_defaults"),s=t("../scatter/line_defaults"),l=t("../scatter/line_shape_defaults"),c=t("../scatter/text_defaults"),u=t("../scatter/fillcolor_defaults"),h=t("./attributes");e.exports=function(t,e,r,f){function p(r,i){return n.coerce(t,e,h,r,i)}var d,g=p("a"),m=p("b"),v=p("c");if(g?(d=g.length,m?(d=Math.min(d,m.length),v&&(d=Math.min(d,v.length))):d=v?Math.min(d,v.length):0):m&&v&&(d=Math.min(m.length,v.length)),d){e._length=d,p("sum"),p("text"),p("hovertext"),p("mode",d<i.PTS_LINESONLY?"lines+markers":"lines"),a.hasLines(e)&&(s(t,e,r,f,p),l(t,e,p),p("connectgaps")),a.hasMarkers(e)&&o(t,e,r,f,p,{gradient:!0}),a.hasText(e)&&c(t,e,f,p);var y=[];(a.hasMarkers(e)||a.hasText(e))&&(p("cliponaxis"),p("marker.maxdisplayed"),y.push("points")),p("fill"),"none"!==e.fill&&(u(t,e,r,p),a.hasLines(e)||l(t,e,p)),"tonext"!==e.fill&&"toself"!==e.fill||y.push("fills"),p("hoveron",y.join("+")||"points"),n.coerceSelectionMarkerOpacity(e,p)}else e.visible=!1}},{"../../lib":684,"../scatter/constants":1020,"../scatter/fillcolor_defaults":1023,"../scatter/line_defaults":1027,"../scatter/line_shape_defaults":1029,"../scatter/marker_defaults":1033,"../scatter/subtypes":1037,"../scatter/text_defaults":1038,"./attributes":1084}],1087:[function(t,e,r){"use strict";e.exports=function(t,e,r,n,i){if(e.xa&&(t.xaxis=e.xa),e.ya&&(t.yaxis=e.ya),n[i]){var a=n[i];t.a=a.a,t.b=a.b,t.c=a.c}else t.a=e.a,t.b=e.b,t.c=e.c;return t}},{}],1088:[function(t,e,r){"use strict";var n=t("../scatter/hover"),i=t("../../plots/cartesian/axes");e.exports=function(t,e,r,a){var o=n(t,e,r,a);if(o&&!1!==o[0].index){var s=o[0];if(void 0===s.index){var l=1-s.y0/t.ya._length,c=t.xa._length,u=c*l/2,h=c-u;return s.x0=Math.max(Math.min(s.x0,h),u),s.x1=Math.max(Math.min(s.x1,h),u),o}var f=s.cd[s.index];s.a=f.a,s.b=f.b,s.c=f.c,s.xLabelVal=void 0,s.yLabelVal=void 0;var p=s.trace,d=s.subplot,g=(f.hi||p.hoverinfo).split("+"),m=[];return-1!==g.indexOf("all")&&(g=["a","b","c"]),-1!==g.indexOf("a")&&v(d.aaxis,f.a),-1!==g.indexOf("b")&&v(d.baxis,f.b),-1!==g.indexOf("c")&&v(d.caxis,f.c),s.extraText=m.join("<br>"),o}function v(t,e){m.push(t._hovertitle+": "+i.tickText(t,e,"hover").text)}}},{"../../plots/cartesian/axes":732,"../scatter/hover":1025}],1089:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.colorbar=t("../scatter/marker_colorbar"),n.calc=t("./calc"),n.plot=t("./plot"),n.style=t("../scatter/style").style,n.styleOnSelect=t("../scatter/style").styleOnSelect,n.hoverPoints=t("./hover"),n.selectPoints=t("../scatter/select"),n.eventData=t("./event_data"),n.moduleType="trace",n.name="scatterternary",n.basePlotModule=t("../../plots/ternary"),n.categories=["ternary","symbols","showLegend","scatter-like"],n.meta={},e.exports=n},{"../../plots/ternary":810,"../scatter/marker_colorbar":1032,"../scatter/select":1035,"../scatter/style":1036,"./attributes":1084,"./calc":1085,"./defaults":1086,"./event_data":1087,"./hover":1088,"./plot":1090}],1090:[function(t,e,r){"use strict";var n=t("../scatter/plot");e.exports=function(t,e,r){var i=e.plotContainer;i.select(".scatterlayer").selectAll("*").remove();var a={xaxis:e.xaxis,yaxis:e.yaxis,plot:i,layerClipId:e._hasClipOnAxisFalse?e.clipIdRelative:null},o=e.layers.frontplot.select("g.scatterlayer");n(t,a,r,o)}},{"../scatter/plot":1034}],1091:[function(t,e,r){"use strict";var n=t("../scattergl/attributes"),i=t("../../plots/cartesian/constants").idRegex,a=t("../../plot_api/plot_template").templatedArray;function o(t){return{valType:"info_array",freeLength:!0,editType:"calc",items:{valType:"subplotid",regex:i[t],editType:"plot"}}}e.exports={dimensions:a("dimension",{visible:{valType:"boolean",dflt:!0,editType:"calc"},label:{valType:"string",editType:"calc"},values:{valType:"data_array",editType:"calc+clearAxisTypes"},editType:"calc+clearAxisTypes"}),text:n.text,marker:n.marker,xaxes:o("x"),yaxes:o("y"),diagonal:{visible:{valType:"boolean",dflt:!0,editType:"calc"},editType:"calc"},showupperhalf:{valType:"boolean",dflt:!0,editType:"calc"},showlowerhalf:{valType:"boolean",dflt:!0,editType:"calc"},selected:{marker:n.selected.marker,editType:"calc"},unselected:{marker:n.unselected.marker,editType:"calc"},opacity:n.opacity}},{"../../plot_api/plot_template":722,"../../plots/cartesian/constants":737,"../scattergl/attributes":1062}],1092:[function(t,e,r){"use strict";var n=t("regl-line2d"),i=t("../../registry"),a=t("../../lib"),o=t("../../lib/prepare_regl"),s=t("../../plots/get_data").getModuleCalcData,l=t("../../plots/cartesian"),c=t("../../plots/cartesian/axis_ids"),u="splom";function h(t,e,r){for(var n=e.dimensions,i=r.matrixOptions.data.length,a=new Array(i),o=0,s=0;o<n.length;o++)if(n[o].visible){var l=a[s]=new Array(4),u=c.getFromId(t,e._diag[o][0]);u&&(l[0]=u.r2l(u.range[0]),l[2]=u.r2l(u.range[1]));var h=c.getFromId(t,e._diag[o][1]);h&&(l[1]=h.r2l(h.range[0]),l[3]=h.r2l(h.range[1])),s++}r.selectBatch?(r.matrix.update({ranges:a},{ranges:a}),r.matrix.draw(r.unselectBatch,r.selectBatch)):(r.matrix.update({ranges:a}),r.matrix.draw())}function f(t){var e=t._fullLayout,r=e._glcanvas.data()[0].regl,i=e._splomGrid;i||(i=e._splomGrid=n(r)),i.update(function(t){var e,r=t._fullLayout,n=r._size,i=[0,0,r.width,r.height],a={};function o(t,e,r,n,o,s){var l=e[t+"color"],c=e[t+"width"],u=String(l+c);u in a?a[u].data.push(NaN,NaN,r,n,o,s):a[u]={data:[r,n,o,s],join:"rect",thickness:c,color:l,viewport:i,range:i,overlay:!1}}for(e in r._splomSubplots){var s,l,c=r._plots[e],u=c.xaxis,h=c.yaxis,f=u._vals,d=h._vals,g=n.b+h.domain[0]*n.h,m=-h._m,v=-m*h.r2l(h.range[0],h.calendar);if(u.showgrid)for(e=0;e<f.length;e++)s=u._offset+u.l2p(f[e].x),o("grid",u,s,g,s,g+h._length);if(p(u)&&(s=u._offset+u.l2p(0),o("zeroline",u,s,g,s,g+h._length)),h.showgrid)for(e=0;e<d.length;e++)l=g+v+m*d[e].x,o("grid",h,u._offset,l,u._offset+u._length,l);p(h)&&(l=g+v+0,o("zeroline",h,u._offset,l,u._offset+u._length,l))}var y=[];for(e in a)y.push(a[e]);return y}(t)),i.draw()}function p(t){var e=a.simpleMap(t.range,t.r2l),r=t.l2p(0);return t.zeroline&&t._vals&&t._vals.length&&e[0]*e[1]<=0&&("linear"===t.type||"-"===t.type)&&(r>1&&r<t._length-1||!t.showline)}e.exports={name:u,attr:l.attr,attrRegex:l.attrRegex,layoutAttributes:l.layoutAttributes,supplyLayoutDefaults:l.supplyLayoutDefaults,drawFramework:l.drawFramework,plot:function(t){var e=t._fullLayout,r=i.getModule(u),n=s(t.calcdata,r)[0];o(t,["ANGLE_instanced_arrays","OES_element_index_uint"])&&(e._hasOnlyLargeSploms&&f(t),r.plot(t,{},n))},drag:function(t){var e=t.calcdata;t._fullLayout._hasOnlyLargeSploms&&f(t);for(var r=0;r<e.length;r++){var n=e[r][0],i=n.trace,a=n.t._scene;"splom"===i.type&&a&&a.matrix&&h(t,i,a)}},clean:function(t,e,r,n,i){var a,o,s,c=n._modules||[],u=e._modules||[];for(s=0;s<c.length;s++)if("splom"===c[s].name){a=!0;break}for(s=0;s<u.length;s++)if("splom"===u[s].name){o=!0;break}if(a&&!o)for(s=0;s<i.length;s++){var h=i[s][0],f=h.trace,p=h.t._scene;"splom"===f.type&&p&&p.matrix&&p.matrix.destroy&&(p.matrix.destroy(),h.t._scene=null)}n._splomGrid&&!e._hasOnlyLargeSploms&&n._hasOnlyLargeSploms&&(n._splomGrid.destroy(),n._splomGrid=null),l.clean(t,e,r,n)},updateFx:l.updateFx,toSVG:l.toSVG}},{"../../lib":684,"../../lib/prepare_regl":697,"../../plots/cartesian":743,"../../plots/cartesian/axis_ids":735,"../../plots/get_data":768,"../../registry":817,"regl-line2d":458}],1093:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/array_container_defaults"),a=t("./attributes"),o=t("../scatter/subtypes"),s=t("../scatter/marker_defaults"),l=t("../parcoords/merge_length"),c=/-open/;function u(t,e){function r(r,i){return n.coerce(t,e,a.dimensions,r,i)}r("label");var i=r("values");i&&i.length?r("visible"):e.visible=!1}function h(t,e){for(var r=new Array(e),n=0;n<e;n++)r[n]=t+(n?n+1:"");return r}function f(t,e,r){if(e){var n=e.charAt(0),i=t._splomAxes[n];e in i||(i[e]=(r||{}).label||"")}}function p(t){for(var e={},r=0;r<t.length;r++)e[t[r]]=1;return e}e.exports=function(t,e,r,d){function g(r,i){return n.coerce(t,e,a,r,i)}var m=i(t,e,{name:"dimensions",handleItemDefaults:u}),v=g("diagonal.visible"),y=g("showupperhalf"),x=g("showlowerhalf");if(l(e,m,"values")&&(v||y||x)){g("text"),s(t,e,r,d,g);var b=c.test(e.marker.symbol),_=o.isBubble(e);g("marker.line.width",b||_?1:0),function(t,e,r,n){var i,a,o=e.dimensions,s=o.length,l=e.showupperhalf,c=e.showlowerhalf,u=e.diagonal.visible,d=u||l&&c?s:s-1,g=n("xaxes",h("x",d)),m=n("yaxes",h("y",d));e._xaxes=p(g),e._yaxes=p(m);var v=Math.min(d,g.length,m.length);for(i=0;i<v;i++)for(a=0;a<v;a++){var y=[g[i]+m[a]];i>a&&l?r._splomSubplots[y]=1:i<a&&c?r._splomSubplots[y]=1:i!==a||!u&&c&&l||(r._splomSubplots[y]=1)}var x=e._diag=new Array(s),b=u||c?0:-1,_=u||l?0:-1;for(i=0;i<s;i++){var w=o[i],k=g[i+b],M=m[i+_];f(r,k,w),f(r,M,w),x[i]=[k,M]}c||(r._splomGridDflt.xside="bottom",r._splomGridDflt.yside="left")}(0,e,d,g),n.coerceSelectionMarkerOpacity(e,g)}else e.visible=!1}},{"../../lib":684,"../../plots/array_container_defaults":728,"../parcoords/merge_length":987,"../scatter/marker_defaults":1033,"../scatter/subtypes":1037,"./attributes":1091}],1094:[function(t,e,r){"use strict";var n=t("regl-splom"),i=t("array-range"),a=t("../../registry"),o=t("../../components/grid"),s=t("../../lib"),l=t("../../plots/cartesian/axis_ids"),c=t("../scatter/subtypes"),u=t("../scatter/calc").calcMarkerSize,h=t("../scatter/calc").calcAxisExpansion,f=t("../scatter/colorscale_calc"),p=t("../scattergl/convert").markerSelection,d=t("../scattergl/convert").markerStyle,g=t("../scattergl").calcHover,m=t("../../constants/numerical").BADNUM,v=t("../scattergl/constants").TOO_MANY_POINTS;function y(t,e,r){for(var n=t.makeCalcdata({v:r.values,vcalendar:e.calendar},"v"),i=0;i<n.length;i++)n[i]=n[i]===m?NaN:n[i];return n}function x(t,e){var r,i,a,o,s,c=t._fullLayout,u=c._size,h=e.trace,f=e.t,p=f._scene,d=p.matrixOptions,g=d.cdata,m=c._glcanvas.data()[0].regl,v=c.dragmode;if(0!==g.length){d.lower=h.showupperhalf,d.upper=h.showlowerhalf,d.diagonal=h.diagonal.visible;var y=h.dimensions,x=g.length,b={};for(b.ranges=new Array(x),b.domains=new Array(x),a=0,s=0;a<y.length;a++)if(h.dimensions[a].visible){var _=b.ranges[s]=new Array(4),w=b.domains[s]=new Array(4);(r=l.getFromId(t,h._diag[a][0]))&&(_[0]=r._rl[0],_[2]=r._rl[1],w[0]=r.domain[0],w[2]=r.domain[1]),(i=l.getFromId(t,h._diag[a][1]))&&(_[1]=i._rl[0],_[3]=i._rl[1],w[1]=i.domain[0],w[3]=i.domain[1]),s++}b.viewport=[u.l,u.b,u.w+u.l,u.h+u.b],!0===p.matrix&&(p.matrix=n(m));var k="lasso"===v||"select"===v||!!h.selectedpoints;if(p.selectBatch=null,p.unselectBatch=null,k){var M=h._length;if(p.selectBatch||(p.selectBatch=[],p.unselectBatch=[]),h.selectedpoints){p.selectBatch=h.selectedpoints;var A=h.selectedpoints,T={};for(a=0;a<A.length;a++)T[A[a]]=!0;var S=[];for(a=0;a<M;a++)T[a]||S.push(a);p.unselectBatch=S}var E=f.xpx=new Array(x),C=f.ypx=new Array(x);for(a=0,s=0;a<y.length;a++)if(h.dimensions[a].visible){if(r=l.getFromId(t,h._diag[a][0]))for(E[s]=new Array(M),o=0;o<M;o++)E[s][o]=r.c2p(g[s][o]);if(i=l.getFromId(t,h._diag[a][1]))for(C[s]=new Array(M),o=0;o<M;o++)C[s][o]=i.c2p(g[s][o]);s++}p.selectBatch?(p.matrix.update(d,d),p.matrix.update(p.unselectedOptions,p.selectedOptions),p.matrix.update(b,b)):p.matrix.update(b,null)}else p.matrix.update(d),p.matrix.update(b),f.xpx=f.ypx=null;p.draw()}}function b(t,e){for(var r=e._id,n={x:0,y:1}[r.charAt(0)],i=t.dimensions,a=0,o=0;a<i.length;a++)if(i[a].visible){if(t._diag[a][n]===r)return o;o++}return!1}e.exports={moduleType:"trace",name:"splom",basePlotModule:t("./base_plot"),categories:["gl","regl","cartesian","symbols","showLegend","scatter-like"],attributes:t("./attributes"),supplyDefaults:t("./defaults"),colorbar:t("../scatter/marker_colorbar"),calc:function(t,e){var r,n,i,a=e.dimensions,o=e._length,c={},g={},m=g.cdata=[],x=g.data=[];for(r=0;r<a.length;r++)if((i=a[r]).visible){var b=e._diag[r][0]||e._diag[r][1],_=l.getFromId(t,b);if(_){var w=y(_,e,i),k="log"===_.type?s.simpleMap(w,_.c2l):w;m.push(w),x.push(k)}}f(e),s.extendFlat(g,d(e));var M=m.length*o>v;for(r=0,n=0;r<a.length;r++)if((i=a[r]).visible){var A,T=l.getFromId(t,e._diag[r][0])||{},S=l.getFromId(t,e._diag[r][1])||{};A=M?2*(g.sizeAvg||Math.max(g.size,3)):u(e,o),h(t,e,T,S,m[n],m[n],A),n++}var E=c._scene=function(t,e){var r=e._scene,n={dirty:!0};return r||((r=e._scene=s.extendFlat({},n,{selectBatch:null,unselectBatch:null,matrix:!1,select:null})).draw=function(){r.matrix&&r.selectBatch?r.matrix.draw(r.unselectBatch,r.selectBatch):r.matrix&&r.matrix.draw(),r.dirty=!1},r.destroy=function(){r.matrix&&r.matrix.destroy(),r.matrixOptions=null,r.selectBatch=null,r.unselectBatch=null,e._scene=null}),r.dirty||s.extendFlat(r,n),r}(0,c);return E.matrix||(E.matrix=!0),E.matrixOptions=g,E.selectedOptions=p(e,e.selected),E.unselectedOptions=p(e,e.unselected),[{x:!1,y:!1,t:c,trace:e}]},plot:function(t,e,r){if(r.length)for(var n=0;n<r.length;n++)x(t,r[n][0])},hoverPoints:function(t,e,r){var n=t.cd,i=n[0].trace,a=n[0].t._scene.matrixOptions.cdata,o=t.xa,s=t.ya,l=o.c2p(e),c=s.c2p(r),u=t.distance,h=b(i,o),f=b(i,s);if(!1===h||!1===f)return[t];for(var p,d,m=a[h],v=a[f],y=u,x=0;x<m.length;x++){var _=m[x],w=v[x],k=o.c2p(_)-l,M=s.c2p(w)-c,A=Math.sqrt(k*k+M*M);A<y&&(y=d=A,p=x)}return t.index=p,t.distance=y,t.dxy=d,void 0===p?[t]:(g(t,m,v,i),[t])},selectPoints:function(t,e){var r,n=t.cd,a=n[0].trace,o=n[0].t,s=o._scene,l=s.matrixOptions.cdata,u=t.xaxis,h=t.yaxis,f=[];if(!s)return f;var p=!c.hasMarkers(a)&&!c.hasText(a);if(!0!==a.visible||p)return f;var d=b(a,u),g=b(a,h);if(!1===d||!1===g)return f;var m=o.xpx[d],v=o.ypx[g],y=l[d],x=l[g],_=null,w=null;if(!1===e||e.degenerate)w=i(o.count);else for(_=[],w=[],r=0;r<y.length;r++)e.contains([m[r],v[r]])?(_.push(r),f.push({pointNumber:r,x:y[r],y:x[r]})):w.push(r);if(s.selectBatch||(s.selectBatch=[],s.unselectBatch=[]),!s.selectBatch){for(r=0;r<s.count;r++)s.selectBatch=[],s.unselectBatch=[];s.matrix.update(s.unselectedOptions,s.selectedOptions)}return s.selectBatch=_,s.unselectBatch=w,f},style:function(t,e){if(e){var r=t._fullLayout;e[0][0].t._scene.matrix.regl.clear({color:!0,depth:!0}),r._splomGrid&&r._splomGrid.draw();for(var n=0;n<e.length;n++)e[n][0].t._scene.draw();if(r._has("cartesian"))for(var i in r._plots){var a=r._plots[i];a._scene&&a._scene.draw()}}},meta:{}},a.register(o)},{"../../components/grid":604,"../../constants/numerical":661,"../../lib":684,"../../plots/cartesian/axis_ids":735,"../../registry":817,"../scatter/calc":1016,"../scatter/colorscale_calc":1019,"../scatter/marker_colorbar":1032,"../scatter/subtypes":1037,"../scattergl":1066,"../scattergl/constants":1063,"../scattergl/convert":1064,"./attributes":1091,"./base_plot":1092,"./defaults":1093,"array-range":58,"regl-splom":461}],1095:[function(t,e,r){"use strict";var n=t("../../components/colorscale/attributes"),i=t("../../components/colorbar/attributes"),a=t("../mesh3d/attributes"),o=t("../../plots/attributes"),s=t("../../lib/extend").extendFlat,l={x:{valType:"data_array",editType:"calc+clearAxisTypes"},y:{valType:"data_array",editType:"calc+clearAxisTypes"},z:{valType:"data_array",editType:"calc+clearAxisTypes"},u:{valType:"data_array",editType:"calc"},v:{valType:"data_array",editType:"calc"},w:{valType:"data_array",editType:"calc"},starts:{x:{valType:"data_array",editType:"calc"},y:{valType:"data_array",editType:"calc"},z:{valType:"data_array",editType:"calc"},editType:"calc"},maxdisplayed:{valType:"integer",min:0,dflt:1e3,editType:"calc"},sizeref:{valType:"number",editType:"calc",min:0,dflt:1},text:{valType:"string",dflt:"",editType:"calc"}};s(l,n("",{colorAttr:"u/v/w norm",showScaleDflt:!0,editTypeOverride:"calc"}),{colorbar:i});["opacity","lightposition","lighting"].forEach(function(t){l[t]=a[t]}),l.hoverinfo=s({},o.hoverinfo,{editType:"calc",flags:["x","y","z","u","v","w","norm","divergence","text","name"],dflt:"x+y+z+norm+text+name"}),e.exports=l},{"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../../plots/attributes":729,"../mesh3d/attributes":965}],1096:[function(t,e,r){"use strict";var n=t("../../components/colorscale/calc");e.exports=function(t,e){var r,i,a,o,s=e.u,l=e.v,c=e.w,u=e.x,h=e.y,f=e.z,p=Math.min(u.length,h.length,f.length,s.length,l.length,c.length),d=0;e.starts&&(i=e.starts.x||[],a=e.starts.y||[],o=e.starts.z||[],d=Math.min(i.length,a.length,o.length));var g=0,m=1/0;for(r=0;r<p;r++){var v=s[r],y=l[r],x=c[r],b=Math.sqrt(v*v+y*y+x*x);g=Math.max(g,b),m=Math.min(m,b)}n(e,[m,g],"","c");var _=-1/0,w=1/0,k=-1/0,M=1/0,A=-1/0,T=1/0;for(r=0;r<p;r++){var S=u[r];_=Math.max(_,S),w=Math.min(w,S);var E=h[r];k=Math.max(k,E),M=Math.min(M,E);var C=f[r];A=Math.max(A,C),T=Math.min(T,C)}for(r=0;r<d;r++){var L=i[r];_=Math.max(_,L),w=Math.min(w,L);var z=a[r];k=Math.max(k,z),M=Math.min(M,z);var P=o[r];A=Math.max(A,P),T=Math.min(T,P)}e._len=p,e._slen=d,e._normMax=g,e._xbnds=[w,_],e._ybnds=[M,k],e._zbnds=[T,A]}},{"../../components/colorscale/calc":566}],1097:[function(t,e,r){"use strict";var n=t("gl-streamtube3d"),i=n.createTubeMesh,a=t("../../lib"),o=t("../../lib/gl_format_color").parseColorScale,s=t("../../plots/gl3d/zip3"),l={xaxis:0,yaxis:1,zaxis:2};function c(t,e){this.scene=t,this.uid=e,this.mesh=null,this.data=null}var u=c.prototype;function h(t){return a.distinctVals(t).vals}function f(t){var e=t.length;return e>2?t.slice(1,e-1):2===e?[(t[0]+t[1])/2]:t}function p(t){var e=t.length;return 1===e?[.5,.5]:[t[1]-t[0],t[e-1]-t[e-2]]}function d(t,e){var r=t.fullSceneLayout,i=t.dataScale,c=e._len,u={};function d(t,e){var n=r[e],o=i[l[e]];return a.simpleMap(t,function(t){return n.d2l(t)*o})}u.vectors=s(d(e.u,"xaxis"),d(e.v,"yaxis"),d(e.w,"zaxis"),c);var g=h(e.x.slice(0,c)),m=h(e.y.slice(0,c)),v=h(e.z.slice(0,c));if(g.length*m.length*v.length>c)return{positions:[],cells:[]};var y=d(g,"xaxis"),x=d(m,"yaxis"),b=d(v,"zaxis");if(u.meshgrid=[y,x,b],e.starts){var _=e._slen;u.startingPositions=s(d(e.starts.x.slice(0,_),"xaxis"),d(e.starts.y.slice(0,_),"yaxis"),d(e.starts.z.slice(0,_),"zaxis"))}else{for(var w=x[0],k=f(y),M=f(b),A=new Array(k.length*M.length),T=0,S=0;S<k.length;S++)for(var E=0;E<M.length;E++)A[T++]=[k[S],w,M[E]];u.startingPositions=A}u.colormap=o(e.colorscale),u.tubeSize=e.sizeref,u.maxLength=e.maxdisplayed;var C=d(e._xbnds,"xaxis"),L=d(e._ybnds,"yaxis"),z=d(e._zbnds,"zaxis"),P=p(y),I=p(x),O=p(b),D=[[C[0]-P[0],L[0]-I[0],z[0]-O[0]],[C[1]+P[1],L[1]+I[1],z[1]+O[1]]],R=n(u,D);R.vertexIntensityBounds=[e.cmin/e._normMax,e.cmax/e._normMax];var B=e.lightposition;return R.lightPosition=[B.x,B.y,B.z],R.ambient=e.lighting.ambient,R.diffuse=e.lighting.diffuse,R.specular=e.lighting.specular,R.roughness=e.lighting.roughness,R.fresnel=e.lighting.fresnel,R.opacity=e.opacity,e._pad=R.tubeScale*e.sizeref*2,R}u.handlePick=function(t){var e=this.scene.fullSceneLayout,r=this.scene.dataScale;function n(t,n){var i=e[n],a=r[l[n]];return i.l2c(t)/a}if(t.object===this.mesh){var i=t.data.position,a=t.data.velocity;return t.traceCoordinate=[n(i[0],"xaxis"),n(i[1],"yaxis"),n(i[2],"zaxis"),n(a[0],"xaxis"),n(a[1],"yaxis"),n(a[2],"zaxis"),t.data.intensity*this.data._normMax,t.data.divergence],t.textLabel=this.data.text,!0}},u.update=function(t){this.data=t;var e=d(this.scene,t);this.mesh.update(e)},u.dispose=function(){this.scene.glplot.remove(this.mesh),this.mesh.dispose()},e.exports=function(t,e){var r=t.glplot.gl,n=d(t,e),a=i(r,n),o=new c(t,e.uid);return o.mesh=a,o.data=e,a._trace=o,t.glplot.add(a),o}},{"../../lib":684,"../../lib/gl_format_color":680,"../../plots/gl3d/zip3":785,"gl-streamtube3d":300}],1098:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../components/colorscale/defaults"),a=t("./attributes");e.exports=function(t,e,r,o){function s(r,i){return n.coerce(t,e,a,r,i)}var l=s("u"),c=s("v"),u=s("w"),h=s("x"),f=s("y"),p=s("z");l&&l.length&&c&&c.length&&u&&u.length&&h&&h.length&&f&&f.length&&p&&p.length?(s("starts.x"),s("starts.y"),s("starts.z"),s("maxdisplayed"),s("sizeref"),s("lighting.ambient"),s("lighting.diffuse"),s("lighting.specular"),s("lighting.roughness"),s("lighting.fresnel"),s("lightposition.x"),s("lightposition.y"),s("lightposition.z"),i(t,e,o,s,{prefix:"",cLetter:"c"}),s("text"),e._length=null):e.visible=!1}},{"../../components/colorscale/defaults":568,"../../lib":684,"./attributes":1095}],1099:[function(t,e,r){"use strict";e.exports={moduleType:"trace",name:"streamtube",basePlotModule:t("../../plots/gl3d"),categories:["gl3d"],attributes:t("./attributes"),supplyDefaults:t("./defaults"),colorbar:{min:"cmin",max:"cmax"},calc:t("./calc"),plot:t("./convert"),eventData:function(t,e){return t.tubex=t.x,t.tubey=t.y,t.tubez=t.z,t.tubeu=e.traceCoordinate[3],t.tubev=e.traceCoordinate[4],t.tubew=e.traceCoordinate[5],t.norm=e.traceCoordinate[6],t.divergence=e.traceCoordinate[7],delete t.x,delete t.y,delete t.z,t},meta:{}}},{"../../plots/gl3d":774,"./attributes":1095,"./calc":1096,"./convert":1097,"./defaults":1098}],1100:[function(t,e,r){"use strict";var n=t("../../components/color"),i=t("../../components/colorscale/attributes"),a=t("../../components/colorbar/attributes"),o=t("../../plots/attributes"),s=t("../../lib/extend").extendFlat,l=t("../../plot_api/edit_types").overrideAll;function c(t){return{show:{valType:"boolean",dflt:!1},project:{x:{valType:"boolean",dflt:!1},y:{valType:"boolean",dflt:!1},z:{valType:"boolean",dflt:!1}},color:{valType:"color",dflt:n.defaultLine},usecolormap:{valType:"boolean",dflt:!1},width:{valType:"number",min:1,max:16,dflt:2},highlight:{valType:"boolean",dflt:!0},highlightcolor:{valType:"color",dflt:n.defaultLine},highlightwidth:{valType:"number",min:1,max:16,dflt:2}}}var u=e.exports=l(s({z:{valType:"data_array"},x:{valType:"data_array"},y:{valType:"data_array"},text:{valType:"string",dflt:"",arrayOk:!0},surfacecolor:{valType:"data_array"}},i("",{colorAttr:"z or surfacecolor",showScaleDflt:!0,autoColorDflt:!1,editTypeOverride:"calc"}),{colorbar:a,contours:{x:c(),y:c(),z:c()},hidesurface:{valType:"boolean",dflt:!1},lightposition:{x:{valType:"number",min:-1e5,max:1e5,dflt:10},y:{valType:"number",min:-1e5,max:1e5,dflt:1e4},z:{valType:"number",min:-1e5,max:1e5,dflt:0}},lighting:{ambient:{valType:"number",min:0,max:1,dflt:.8},diffuse:{valType:"number",min:0,max:1,dflt:.8},specular:{valType:"number",min:0,max:2,dflt:.05},roughness:{valType:"number",min:0,max:1,dflt:.5},fresnel:{valType:"number",min:0,max:5,dflt:.2}},opacity:{valType:"number",min:0,max:1,dflt:1},_deprecated:{zauto:s({},i.zauto,{}),zmin:s({},i.zmin,{}),zmax:s({},i.zmax,{})},hoverinfo:s({},o.hoverinfo)}),"calc","nested");u.x.editType=u.y.editType=u.z.editType="calc+clearAxisTypes"},{"../../components/color":558,"../../components/colorbar/attributes":559,"../../components/colorscale/attributes":565,"../../lib/extend":673,"../../plot_api/edit_types":715,"../../plots/attributes":729}],1101:[function(t,e,r){"use strict";var n=t("../../components/colorscale/calc");e.exports=function(t,e){e.surfacecolor?n(e,e.surfacecolor,"","c"):n(e,e.z,"","c")}},{"../../components/colorscale/calc":566}],1102:[function(t,e,r){"use strict";var n=t("gl-surface3d"),i=t("ndarray"),a=t("ndarray-homography"),o=t("ndarray-fill"),s=t("ndarray-ops"),l=t("../../lib").isArrayOrTypedArray,c=t("../../lib/gl_format_color").parseColorScale,u=t("../../lib/str2rgbarray"),h=128;function f(t,e,r){this.scene=t,this.uid=r,this.surface=e,this.data=null,this.showContour=[!1,!1,!1],this.dataScale=1}var p=f.prototype;function d(t){var e=t.shape,r=[e[0]+2,e[1]+2],n=i(new Float32Array(r[0]*r[1]),r);return s.assign(n.lo(1,1).hi(e[0],e[1]),t),s.assign(n.lo(1).hi(e[0],1),t.hi(e[0],1)),s.assign(n.lo(1,r[1]-1).hi(e[0],1),t.lo(0,e[1]-1).hi(e[0],1)),s.assign(n.lo(0,1).hi(1,e[1]),t.hi(1)),s.assign(n.lo(r[0]-1,1).hi(1,e[1]),t.lo(e[0]-1)),n.set(0,0,t.get(0,0)),n.set(0,r[1]-1,t.get(0,e[1]-1)),n.set(r[0]-1,0,t.get(e[0]-1,0)),n.set(r[0]-1,r[1]-1,t.get(e[0]-1,e[1]-1)),n}p.handlePick=function(t){if(t.object===this.surface){var e=t.index=[Math.min(0|Math.round(t.data.index[0]/this.dataScale-1),this.data.z[0].length-1),Math.min(0|Math.round(t.data.index[1]/this.dataScale-1),this.data.z.length-1)],r=[0,0,0];l(this.data.x)?l(this.data.x[0])?r[0]=this.data.x[e[1]][e[0]]:r[0]=this.data.x[e[0]]:r[0]=e[0],l(this.data.y)?l(this.data.y[0])?r[1]=this.data.y[e[1]][e[0]]:r[1]=this.data.y[e[1]]:r[1]=e[1],r[2]=this.data.z[e[1]][e[0]],t.traceCoordinate=r;var n=this.scene.fullSceneLayout;t.dataCoordinate=[n.xaxis.d2l(r[0],0,this.data.xcalendar)*this.scene.dataScale[0],n.yaxis.d2l(r[1],0,this.data.ycalendar)*this.scene.dataScale[1],n.zaxis.d2l(r[2],0,this.data.zcalendar)*this.scene.dataScale[2]];var i=this.data.text;return Array.isArray(i)&&i[e[1]]&&void 0!==i[e[1]][e[0]]?t.textLabel=i[e[1]][e[0]]:t.textLabel=i||"",t.data.dataCoordinate=t.dataCoordinate.slice(),this.surface.highlight(t.data),this.scene.glplot.spikes.position=t.dataCoordinate,!0}},p.setContourLevels=function(){for(var t=[[],[],[]],e=!1,r=0;r<3;++r)this.showContour[r]&&(e=!0,t[r]=this.scene.contourLevels[r]);e&&this.surface.update({levels:t})},p.update=function(t){var e,r=this.scene,n=r.fullSceneLayout,s=this.surface,f=t.opacity,p=c(t.colorscale,f),g=t.z,m=t.x,v=t.y,y=n.xaxis,x=n.yaxis,b=n.zaxis,_=r.dataScale,w=g[0].length,k=t._ylength,M=[i(new Float32Array(w*k),[w,k]),i(new Float32Array(w*k),[w,k]),i(new Float32Array(w*k),[w,k])],A=M[0],T=M[1],S=r.contourLevels;this.data=t;var E=t.xcalendar,C=t.ycalendar,L=t.zcalendar;o(M[2],function(t,e){return b.d2l(g[e][t],0,L)*_[2]}),l(m)?l(m[0])?o(A,function(t,e){return y.d2l(m[e][t],0,E)*_[0]}):o(A,function(t){return y.d2l(m[t],0,E)*_[0]}):o(A,function(t){return y.d2l(t,0,E)*_[0]}),l(m)?l(v[0])?o(T,function(t,e){return x.d2l(v[e][t],0,C)*_[1]}):o(T,function(t,e){return x.d2l(v[e],0,C)*_[1]}):o(T,function(t,e){return x.d2l(e,0,E)*_[1]});var z={colormap:p,levels:[[],[],[]],showContour:[!0,!0,!0],showSurface:!t.hidesurface,contourProject:[[!1,!1,!1],[!1,!1,!1],[!1,!1,!1]],contourWidth:[1,1,1],contourColor:[[1,1,1,1],[1,1,1,1],[1,1,1,1]],contourTint:[1,1,1],dynamicColor:[[1,1,1,1],[1,1,1,1],[1,1,1,1]],dynamicWidth:[1,1,1],dynamicTint:[1,1,1],opacity:t.opacity};if(z.intensityBounds=[t.cmin,t.cmax],t.surfacecolor){var P=i(new Float32Array(w*k),[w,k]);o(P,function(e,r){return t.surfacecolor[r][e]}),M.push(P)}else z.intensityBounds[0]*=_[2],z.intensityBounds[1]*=_[2];this.dataScale=function(t){var e=Math.max(t[0].shape[0],t[0].shape[1]);if(e<h){for(var r=h/e,n=[0|Math.floor(t[0].shape[0]*r+1),0|Math.floor(t[0].shape[1]*r+1)],o=n[0]*n[1],s=0;s<t.length;++s){var l=d(t[s]),c=i(new Float32Array(o),n);a(c,l,[r,0,0,0,r,0,0,0,1]),t[s]=c}return r}return 1}(M),t.surfacecolor&&(z.intensity=M.pop());var I=[!0,!0,!0],O=["x","y","z"];for(e=0;e<3;++e){var D=t.contours[O[e]];I[e]=D.highlight,z.showContour[e]=D.show||D.highlight,z.showContour[e]&&(z.contourProject[e]=[D.project.x,D.project.y,D.project.z],D.show?(this.showContour[e]=!0,z.levels[e]=S[e],s.highlightColor[e]=z.contourColor[e]=u(D.color),D.usecolormap?s.highlightTint[e]=z.contourTint[e]=0:s.highlightTint[e]=z.contourTint[e]=1,z.contourWidth[e]=D.width):this.showContour[e]=!1,D.highlight&&(z.dynamicColor[e]=u(D.highlightcolor),z.dynamicWidth[e]=D.highlightwidth))}(function(t){var e=t[0].rgb,r=t[t.length-1].rgb;return e[0]===r[0]&&e[1]===r[1]&&e[2]===r[2]&&e[3]===r[3]})(p)&&(z.vertexColor=!0),z.coords=M,s.update(z),s.visible=t.visible,s.enableDynamic=I,s.enableHighlight=I,s.snapToData=!0,"lighting"in t&&(s.ambientLight=t.lighting.ambient,s.diffuseLight=t.lighting.diffuse,s.specularLight=t.lighting.specular,s.roughness=t.lighting.roughness,s.fresnel=t.lighting.fresnel),"lightposition"in t&&(s.lightPosition=[t.lightposition.x,t.lightposition.y,t.lightposition.z]),f&&f<1&&(s.supportsTransparency=!0)},p.dispose=function(){this.scene.glplot.remove(this.surface),this.surface.dispose()},e.exports=function(t,e){var r=t.glplot.gl,i=n({gl:r}),a=new f(t,i,e.uid);return i._trace=a,a.update(e),t.glplot.add(i),a}},{"../../lib":684,"../../lib/gl_format_color":680,"../../lib/str2rgbarray":707,"gl-surface3d":302,ndarray:417,"ndarray-fill":407,"ndarray-homography":409,"ndarray-ops":411}],1103:[function(t,e,r){"use strict";var n=t("../../registry"),i=t("../../lib"),a=t("../../components/colorscale/defaults"),o=t("./attributes");function s(t,e,r){e in t&&!(r in t)&&(t[r]=t[e])}e.exports=function(t,e,r,l){var c,u;function h(r,n){return i.coerce(t,e,o,r,n)}var f=h("z");if(f){var p=h("x");h("y"),e._xlength=Array.isArray(p)&&i.isArrayOrTypedArray(p[0])?f.length:f[0].length,e._ylength=f.length,n.getComponentMethod("calendars","handleTraceDefaults")(t,e,["x","y","z"],l),h("text"),["lighting.ambient","lighting.diffuse","lighting.specular","lighting.roughness","lighting.fresnel","lightposition.x","lightposition.y","lightposition.z","hidesurface","opacity"].forEach(function(t){h(t)});var d=h("surfacecolor");h("colorscale");var g=["x","y","z"];for(c=0;c<3;++c){var m="contours."+g[c],v=h(m+".show"),y=h(m+".highlight");if(v||y)for(u=0;u<3;++u)h(m+".project."+g[u]);v&&(h(m+".color"),h(m+".width"),h(m+".usecolormap")),y&&(h(m+".highlightcolor"),h(m+".highlightwidth"))}d||(s(t,"zmin","cmin"),s(t,"zmax","cmax"),s(t,"zauto","cauto")),a(t,e,l,h,{prefix:"",cLetter:"c"}),e._length=null}else e.visible=!1}},{"../../components/colorscale/defaults":568,"../../lib":684,"../../registry":817,"./attributes":1100}],1104:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.colorbar={min:"cmin",max:"cmax"},n.calc=t("./calc"),n.plot=t("./convert"),n.moduleType="trace",n.name="surface",n.basePlotModule=t("../../plots/gl3d"),n.categories=["gl3d","2dMap","noOpacity"],n.meta={},e.exports=n},{"../../plots/gl3d":774,"./attributes":1100,"./calc":1101,"./convert":1102,"./defaults":1103}],1105:[function(t,e,r){"use strict";var n=t("../../components/annotations/attributes"),i=t("../../lib/extend").extendFlat,a=t("../../plot_api/edit_types").overrideAll,o=t("../../plots/font_attributes"),s=t("../../plots/domain").attributes;e.exports=a({domain:s({name:"table",trace:!0}),columnwidth:{valType:"number",arrayOk:!0,dflt:null},columnorder:{valType:"data_array"},header:{values:{valType:"data_array",dflt:[]},format:{valType:"data_array",dflt:[]},prefix:{valType:"string",arrayOk:!0,dflt:null},suffix:{valType:"string",arrayOk:!0,dflt:null},height:{valType:"number",dflt:28},align:i({},n.align,{arrayOk:!0}),line:{width:{valType:"number",arrayOk:!0,dflt:1},color:{valType:"color",arrayOk:!0,dflt:"grey"}},fill:{color:{valType:"color",arrayOk:!0,dflt:"white"}},font:i({},o({arrayOk:!0}))},cells:{values:{valType:"data_array",dflt:[]},format:{valType:"data_array",dflt:[]},prefix:{valType:"string",arrayOk:!0,dflt:null},suffix:{valType:"string",arrayOk:!0,dflt:null},height:{valType:"number",dflt:20},align:i({},n.align,{arrayOk:!0}),line:{width:{valType:"number",arrayOk:!0,dflt:1},color:{valType:"color",arrayOk:!0,dflt:"grey"}},fill:{color:{valType:"color",arrayOk:!0,dflt:"white"}},font:i({},o({arrayOk:!0}))}},"calc","from-root")},{"../../components/annotations/attributes":541,"../../lib/extend":673,"../../plot_api/edit_types":715,"../../plots/domain":757,"../../plots/font_attributes":758}],1106:[function(t,e,r){"use strict";var n=t("../../plots/get_data").getModuleCalcData,i=t("./plot");r.name="table",r.plot=function(t){var e=n(t.calcdata,"table")[0];e.length&&i(t,e)},r.clean=function(t,e,r,n){var i=n._has&&n._has("table"),a=e._has&&e._has("table");i&&!a&&n._paperdiv.selectAll(".table").remove()}},{"../../plots/get_data":768,"./plot":1113}],1107:[function(t,e,r){"use strict";var n=t("../../lib/gup").wrap;e.exports=function(){return n({})}},{"../../lib/gup":681}],1108:[function(t,e,r){"use strict";e.exports={cellPad:8,columnExtentOffset:10,columnTitleOffset:28,emptyHeaderHeight:16,latexCheck:/^\$.*\$$/,goldenRatio:1.618,lineBreaker:"<br>",maxDimensionCount:60,overdrag:45,releaseTransitionDuration:120,releaseTransitionEase:"cubic-out",scrollbarCaptureWidth:18,scrollbarHideDelay:1e3,scrollbarHideDuration:1e3,scrollbarOffset:5,scrollbarWidth:8,transitionDuration:100,transitionEase:"cubic-out",uplift:5,wrapSpacer:" ",wrapSplitCharacter:" ",cn:{table:"table",tableControlView:"table-control-view",scrollBackground:"scroll-background",yColumn:"y-column",columnBlock:"column-block",scrollAreaClip:"scroll-area-clip",scrollAreaClipRect:"scroll-area-clip-rect",columnBoundary:"column-boundary",columnBoundaryClippath:"column-boundary-clippath",columnBoundaryRect:"column-boundary-rect",columnCells:"column-cells",columnCell:"column-cell",cellRect:"cell-rect",cellText:"cell-text",cellTextHolder:"cell-text-holder",scrollbarKit:"scrollbar-kit",scrollbar:"scrollbar",scrollbarSlider:"scrollbar-slider",scrollbarGlyph:"scrollbar-glyph",scrollbarCaptureZone:"scrollbar-capture-zone"}}},{}],1109:[function(t,e,r){"use strict";var n=t("./constants"),i=t("../../lib/extend").extendFlat,a=t("fast-isnumeric");function o(t){if(Array.isArray(t)){for(var e=0,r=0;r<t.length;r++)e=Math.max(e,o(t[r]));return e}return t}function s(t,e){return t+e}function l(t){var e,r=t.slice(),n=1/0,i=0;for(e=0;e<r.length;e++)Array.isArray(r[e])||(r[e]=[r[e]]),n=Math.min(n,r[e].length),i=Math.max(i,r[e].length);if(n!==i)for(e=0;e<r.length;e++){var a=i-r[e].length;a&&(r[e]=r[e].concat(c(a)))}return r}function c(t){for(var e=new Array(t),r=0;r<t;r++)e[r]="";return e}function u(t){return t.calcdata.columns.reduce(function(e,r){return r.xIndex<t.xIndex?e+r.columnWidth:e},0)}function h(t,e){return Object.keys(t).map(function(r){return i({},t[r],{auxiliaryBlocks:e})})}function f(t,e){for(var r,n={},i=0,a=0,o={firstRowIndex:null,lastRowIndex:null,rows:[]},s=0,l=0,c=0;c<t.length;c++)r=t[c],o.rows.push({rowIndex:c,rowHeight:r}),((a+=r)>=e||c===t.length-1)&&(n[i]=o,o.key=l++,o.firstRowIndex=s,o.lastRowIndex=c,o={firstRowIndex:null,lastRowIndex:null,rows:[]},i+=a,s=c+1,a=0);return n}e.exports=function(t,e){var r=l(e.cells.values),p=function(t){return t.slice(e.header.values.length,t.length)},d=l(e.header.values);d.length&&!d[0].length&&(d[0]=[""],d=l(d));var g=d.concat(p(r).map(function(){return c((d[0]||[""]).length)})),m=e.domain,v=Math.floor(t._fullLayout._size.w*(m.x[1]-m.x[0])),y=Math.floor(t._fullLayout._size.h*(m.y[1]-m.y[0])),x=e.header.values.length?g[0].map(function(){return e.header.height}):[n.emptyHeaderHeight],b=r.length?r[0].map(function(){return e.cells.height}):[],_=x.reduce(s,0),w=f(b,y-_+n.uplift),k=h(f(x,_),[]),M=h(w,k),A={},T=e._fullInput.columnorder.concat(p(r.map(function(t,e){return e}))),S=g.map(function(t,r){var n=Array.isArray(e.columnwidth)?e.columnwidth[Math.min(r,e.columnwidth.length-1)]:e.columnwidth;return a(n)?Number(n):1}),E=S.reduce(s,0);S=S.map(function(t){return t/E*v});var C=Math.max(o(e.header.line.width),o(e.cells.line.width)),L={key:e.index,translateX:m.x[0]*t._fullLayout._size.w,translateY:t._fullLayout._size.h*(1-m.y[1]),size:t._fullLayout._size,width:v,maxLineWidth:C,height:y,columnOrder:T,groupHeight:y,rowBlocks:M,headerRowBlocks:k,scrollY:0,cells:i({},e.cells,{values:r}),headerCells:i({},e.header,{values:g}),gdColumns:g.map(function(t){return t[0]}),gdColumnsOriginalOrder:g.map(function(t){return t[0]}),prevPages:[0,0],scrollbarState:{scrollbarScrollInProgress:!1},columns:g.map(function(t,e){var r=A[t];return A[t]=(r||0)+1,{key:t+"__"+A[t],label:t,specIndex:e,xIndex:T[e],xScale:u,x:void 0,calcdata:void 0,columnWidth:S[e]}})};return L.columns.forEach(function(t){t.calcdata=L,t.x=u(t)}),L}},{"../../lib/extend":673,"./constants":1108,"fast-isnumeric":214}],1110:[function(t,e,r){"use strict";var n=t("../../lib/extend").extendFlat;r.splitToPanels=function(t){var e=[0,0],r=n({},t,{key:"header",type:"header",page:0,prevPages:e,currentRepaint:[null,null],dragHandle:!0,values:t.calcdata.headerCells.values[t.specIndex],rowBlocks:t.calcdata.headerRowBlocks,calcdata:n({},t.calcdata,{cells:t.calcdata.headerCells})});return[n({},t,{key:"cells1",type:"cells",page:0,prevPages:e,currentRepaint:[null,null],dragHandle:!1,values:t.calcdata.cells.values[t.specIndex],rowBlocks:t.calcdata.rowBlocks}),n({},t,{key:"cells2",type:"cells",page:1,prevPages:e,currentRepaint:[null,null],dragHandle:!1,values:t.calcdata.cells.values[t.specIndex],rowBlocks:t.calcdata.rowBlocks}),r]},r.splitToCells=function(t){var e=function(t){var e=t.rowBlocks[t.page],r=e?e.rows[0].rowIndex:0,n=e?r+e.rows.length:0;return[r,n]}(t);return(t.values||[]).slice(e[0],e[1]).map(function(r,n){return{keyWithinBlock:n+("string"==typeof r&&r.match(/[<$&> ]/)?"_keybuster_"+Math.random():""),key:e[0]+n,column:t,calcdata:t.calcdata,page:t.page,rowBlocks:t.rowBlocks,value:r}})}},{"../../lib/extend":673}],1111:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./attributes"),a=t("../../plots/domain").defaults;e.exports=function(t,e,r,o){function s(r,a){return n.coerce(t,e,i,r,a)}a(e,o,s),s("columnwidth"),s("header.values"),s("header.format"),s("header.align"),s("header.prefix"),s("header.suffix"),s("header.height"),s("header.line.width"),s("header.line.color"),s("header.fill.color"),n.coerceFont(s,"header.font",n.extendFlat({},o.font)),function(t,e){for(var r=t.columnorder||[],n=t.header.values.length,i=r.slice(0,n),a=i.slice().sort(function(t,e){return t-e}),o=i.map(function(t){return a.indexOf(t)}),s=o.length;s<n;s++)o.push(s);e("columnorder",o)}(e,s),s("cells.values"),s("cells.format"),s("cells.align"),s("cells.prefix"),s("cells.suffix"),s("cells.height"),s("cells.line.width"),s("cells.line.color"),s("cells.fill.color"),n.coerceFont(s,"cells.font",n.extendFlat({},o.font)),e._length=null}},{"../../lib":684,"../../plots/domain":757,"./attributes":1105}],1112:[function(t,e,r){"use strict";var n={};n.attributes=t("./attributes"),n.supplyDefaults=t("./defaults"),n.calc=t("./calc"),n.plot=t("./plot"),n.moduleType="trace",n.name="table",n.basePlotModule=t("./base_plot"),n.categories=["noOpacity"],n.meta={},e.exports=n},{"./attributes":1105,"./base_plot":1106,"./calc":1107,"./defaults":1111,"./plot":1113}],1113:[function(t,e,r){"use strict";var n=t("./constants"),i=t("d3"),a=t("../../lib/gup"),o=t("../../components/drawing"),s=t("../../lib/svg_text_utils"),l=t("../../lib").raiseToTop,c=t("../../lib").cancelTransition,u=t("./data_preparation_helper"),h=t("./data_split_helpers"),f=t("../../components/color");function p(t){return Math.ceil(t.calcdata.maxLineWidth/2)}function d(t,e){return"clip"+t._fullLayout._uid+"_scrollAreaBottomClip_"+e.key}function g(t,e){return"clip"+t._fullLayout._uid+"_columnBoundaryClippath_"+e.calcdata.key+"_"+e.specIndex}function m(t){return[].concat.apply([],t.map(function(t){return t})).map(function(t){return t.__data__})}function v(t,e,r){var o=t.selectAll("."+n.cn.scrollbarKit).data(a.repeat,a.keyFun);o.enter().append("g").classed(n.cn.scrollbarKit,!0).style("shape-rendering","geometricPrecision"),o.each(function(t){var e=t.scrollbarState;e.totalHeight=function(t){var e=t.rowBlocks;return I(e,e.length-1)+(e.length?O(e[e.length-1],1/0):1)}(t),e.scrollableAreaHeight=t.groupHeight-A(t),e.currentlyVisibleHeight=Math.min(e.totalHeight,e.scrollableAreaHeight),e.ratio=e.currentlyVisibleHeight/e.totalHeight,e.barLength=Math.max(e.ratio*e.currentlyVisibleHeight,n.goldenRatio*n.scrollbarWidth),e.barWiggleRoom=e.currentlyVisibleHeight-e.barLength,e.wiggleRoom=Math.max(0,e.totalHeight-e.scrollableAreaHeight),e.topY=0===e.barWiggleRoom?0:t.scrollY/e.wiggleRoom*e.barWiggleRoom,e.bottomY=e.topY+e.barLength,e.dragMultiplier=e.wiggleRoom/e.barWiggleRoom}).attr("transform",function(t){return"translate("+(t.width+n.scrollbarWidth/2+n.scrollbarOffset)+" "+A(t)+")"});var s=o.selectAll("."+n.cn.scrollbar).data(a.repeat,a.keyFun);s.enter().append("g").classed(n.cn.scrollbar,!0);var l=s.selectAll("."+n.cn.scrollbarSlider).data(a.repeat,a.keyFun);l.enter().append("g").classed(n.cn.scrollbarSlider,!0),l.attr("transform",function(t){return"translate(0 "+(t.scrollbarState.topY||0)+")"});var c=l.selectAll("."+n.cn.scrollbarGlyph).data(a.repeat,a.keyFun);c.enter().append("line").classed(n.cn.scrollbarGlyph,!0).attr("stroke","black").attr("stroke-width",n.scrollbarWidth).attr("stroke-linecap","round").attr("y1",n.scrollbarWidth/2),c.attr("y2",function(t){return t.scrollbarState.barLength-n.scrollbarWidth/2}).attr("stroke-opacity",function(t){return t.columnDragInProgress||!t.scrollbarState.barWiggleRoom||r?0:.4}),c.transition().delay(0).duration(0),c.transition().delay(n.scrollbarHideDelay).duration(n.scrollbarHideDuration).attr("stroke-opacity",0);var u=s.selectAll("."+n.cn.scrollbarCaptureZone).data(a.repeat,a.keyFun);u.enter().append("line").classed(n.cn.scrollbarCaptureZone,!0).attr("stroke","white").attr("stroke-opacity",.01).attr("stroke-width",n.scrollbarCaptureWidth).attr("stroke-linecap","butt").attr("y1",0).on("mousedown",function(r){var n=i.event.y,a=this.getBoundingClientRect(),o=r.scrollbarState,s=n-a.top,l=i.scale.linear().domain([0,o.scrollableAreaHeight]).range([0,o.totalHeight]).clamp(!0);o.topY<=s&&s<=o.bottomY||S(e,t,null,l(s-o.barLength/2))(r)}).call(i.behavior.drag().origin(function(t){return i.event.stopPropagation(),t.scrollbarState.scrollbarScrollInProgress=!0,t}).on("drag",S(e,t)).on("dragend",function(){})),u.attr("y2",function(t){return t.scrollbarState.scrollableAreaHeight})}function y(t,e,r,s){var l=function(t){var e=t.selectAll("."+n.cn.columnCell).data(h.splitToCells,function(t){return t.keyWithinBlock});return e.enter().append("g").classed(n.cn.columnCell,!0),e.exit().remove(),e}(function(t){var e=t.selectAll("."+n.cn.columnCells).data(a.repeat,a.keyFun);return e.enter().append("g").classed(n.cn.columnCells,!0),e.exit().remove(),e}(r));!function(t){t.each(function(t,e){var r=t.calcdata.cells.font,n=t.column.specIndex,i={size:_(r.size,n,e),color:_(r.color,n,e),family:_(r.family,n,e)};t.rowNumber=t.key,t.align=_(t.calcdata.cells.align,n,e),t.cellBorderWidth=_(t.calcdata.cells.line.width,n,e),t.font=i})}(l),function(t){t.attr("width",function(t){return t.column.columnWidth}).attr("stroke-width",function(t){return t.cellBorderWidth}).each(function(t){var e=i.select(this);f.stroke(e,_(t.calcdata.cells.line.color,t.column.specIndex,t.rowNumber)),f.fill(e,_(t.calcdata.cells.fill.color,t.column.specIndex,t.rowNumber))})}(function(t){var e=t.selectAll("."+n.cn.cellRect).data(a.repeat,function(t){return t.keyWithinBlock});return e.enter().append("rect").classed(n.cn.cellRect,!0),e}(l));var c=function(t){var e=t.selectAll("."+n.cn.cellText).data(a.repeat,function(t){return t.keyWithinBlock});return e.enter().append("text").classed(n.cn.cellText,!0).style("cursor",function(){return"auto"}).on("mousedown",function(){i.event.stopPropagation()}),e}(function(t){var e=t.selectAll("."+n.cn.cellTextHolder).data(a.repeat,function(t){return t.keyWithinBlock});return e.enter().append("g").classed(n.cn.cellTextHolder,!0).style("shape-rendering","geometricPrecision"),e}(l));!function(t){t.each(function(t){o.font(i.select(this),t.font)})}(c),x(c,e,s,t),P(l)}function x(t,e,r,a){t.text(function(t){var e=t.column.specIndex,r=t.rowNumber,a=t.value,o="string"==typeof a,s=o&&a.match(/<br>/i),l=!o||s;t.mayHaveMarkup=o&&a.match(/[<&>]/);var c,u="string"==typeof(c=a)&&c.match(n.latexCheck);t.latex=u;var h,f,p=u?"":_(t.calcdata.cells.prefix,e,r)||"",d=u?"":_(t.calcdata.cells.suffix,e,r)||"",g=u?null:_(t.calcdata.cells.format,e,r)||null,m=p+(g?i.format(g)(t.value):t.value)+d;if(t.wrappingNeeded=!t.wrapped&&!l&&!u&&(h=b(m)),t.cellHeightMayIncrease=s||u||t.mayHaveMarkup||(void 0===h?b(m):h),t.needsConvertToTspans=t.mayHaveMarkup||t.wrappingNeeded||t.latex,t.wrappingNeeded){var v=(" "===n.wrapSplitCharacter?m.replace(/<a href=/ig,"<a_href="):m).split(n.wrapSplitCharacter),y=" "===n.wrapSplitCharacter?v.map(function(t){return t.replace(/<a_href=/ig,"<a href=")}):v;t.fragments=y.map(function(t){return{text:t,width:null}}),t.fragments.push({fragment:n.wrapSpacer,width:null}),f=y.join(n.lineBreaker)+n.lineBreaker+n.wrapSpacer}else delete t.fragments,f=m;return f}).attr("dy",function(t){return t.needsConvertToTspans?0:"0.75em"}).each(function(t){var o=i.select(this),l=t.wrappingNeeded?C:L;t.needsConvertToTspans?s.convertToTspans(o,a,l(r,this,e,a,t)):i.select(this.parentNode).attr("transform",function(t){return"translate("+z(t)+" "+n.cellPad+")"}).attr("text-anchor",function(t){return{left:"start",center:"middle",right:"end"}[t.align]})})}function b(t){return-1!==t.indexOf(n.wrapSplitCharacter)}function _(t,e,r){if(Array.isArray(t)){var n=t[Math.min(e,t.length-1)];return Array.isArray(n)?n[Math.min(r,n.length-1)]:n}return t}function w(t,e,r){t.transition().ease(n.releaseTransitionEase).duration(n.releaseTransitionDuration).attr("transform","translate("+e.x+" "+r+")")}function k(t){return"cells"===t.type}function M(t){return"header"===t.type}function A(t){return(t.rowBlocks.length?t.rowBlocks[0].auxiliaryBlocks:[]).reduce(function(t,e){return t+O(e,1/0)},0)}function T(t,e,r){var n=m(e)[0];if(void 0!==n){var i=n.rowBlocks,a=n.calcdata,o=I(i,i.length),s=n.calcdata.groupHeight-A(n),l=a.scrollY=Math.max(0,Math.min(o-s,a.scrollY)),c=function(t,e,r){for(var n=[],i=0,a=0;a<t.length;a++){for(var o=t[a],s=o.rows,l=0,c=0;c<s.length;c++)l+=s[c].rowHeight;o.allRowsHeight=l,e<i+l&&e+r>i&&n.push(a),i+=l}return n}(i,l,s);1===c.length&&(c[0]===i.length-1?c.unshift(c[0]-1):c.push(c[0]+1)),c[0]%2&&c.reverse(),e.each(function(t,e){t.page=c[e],t.scrollY=l}),e.attr("transform",function(t){return"translate(0 "+(I(t.rowBlocks,t.page)-t.scrollY)+")"}),t&&(E(t,r,e,c,n.prevPages,n,0),E(t,r,e,c,n.prevPages,n,1),v(r,t))}}function S(t,e,r,a){return function(o){var s=o.calcdata?o.calcdata:o,l=e.filter(function(t){return s.key===t.key}),c=r||s.scrollbarState.dragMultiplier;s.scrollY=void 0===a?s.scrollY+c*i.event.dy:a;var u=l.selectAll("."+n.cn.yColumn).selectAll("."+n.cn.columnBlock).filter(k);T(t,u,l)}}function E(t,e,r,n,i,a,o){n[o]!==i[o]&&(clearTimeout(a.currentRepaint[o]),a.currentRepaint[o]=setTimeout(function(){var a=r.filter(function(t,e){return e===o&&n[e]!==i[e]});y(t,e,a,r),i[o]=n[o]}))}function C(t,e,r){return function(){var a=i.select(e.parentNode);a.each(function(t){var e=t.fragments;a.selectAll("tspan.line").each(function(t,r){e[r].width=this.getComputedTextLength()});var r,i,o=e[e.length-1].width,s=e.slice(0,-1),l=[],c=0,u=t.column.columnWidth-2*n.cellPad;for(t.value="";s.length;)c+(i=(r=s.shift()).width+o)>u&&(t.value+=l.join(n.wrapSpacer)+n.lineBreaker,l=[],c=0),l.push(r.text),c+=i;c&&(t.value+=l.join(n.wrapSpacer)),t.wrapped=!0}),a.selectAll("tspan.line").remove(),x(a.select("."+n.cn.cellText),r,t),i.select(e.parentNode.parentNode).call(P)}}function L(t,e,r,a,o){return function(){if(!o.settledY){var s=i.select(e.parentNode),l=R(o),c=o.key-l.firstRowIndex,u=l.rows[c].rowHeight,h=o.cellHeightMayIncrease?e.parentNode.getBoundingClientRect().height+2*n.cellPad:u,f=Math.max(h,u);f-l.rows[c].rowHeight&&(l.rows[c].rowHeight=f,t.selectAll("."+n.cn.columnCell).call(P),T(null,t.filter(k),0),v(r,a,!0)),s.attr("transform",function(){var t=this.parentNode.getBoundingClientRect(),e=i.select(this.parentNode).select("."+n.cn.cellRect).node().getBoundingClientRect(),r=this.transform.baseVal.consolidate(),a=e.top-t.top+(r?r.matrix.f:n.cellPad);return"translate("+z(o,i.select(this.parentNode).select("."+n.cn.cellTextHolder).node().getBoundingClientRect().width)+" "+a+")"}),o.settledY=!0}}}function z(t,e){switch(t.align){case"left":return n.cellPad;case"right":return t.column.columnWidth-(e||0)-n.cellPad;case"center":return(t.column.columnWidth-(e||0))/2;default:return n.cellPad}}function P(t){t.attr("transform",function(t){var e=t.rowBlocks[0].auxiliaryBlocks.reduce(function(t,e){return t+O(e,1/0)},0);return"translate(0 "+(O(R(t),t.key)+e)+")"}).selectAll("."+n.cn.cellRect).attr("height",function(t){return(e=R(t),r=t.key,e.rows[r-e.firstRowIndex]).rowHeight;var e,r})}function I(t,e){for(var r=0,n=e-1;n>=0;n--)r+=D(t[n]);return r}function O(t,e){for(var r=0,n=0;n<t.rows.length&&t.rows[n].rowIndex<e;n++)r+=t.rows[n].rowHeight;return r}function D(t){var e=t.allRowsHeight;if(void 0!==e)return e;for(var r=0,n=0;n<t.rows.length;n++)r+=t.rows[n].rowHeight;return t.allRowsHeight=r,r}function R(t){return t.rowBlocks[t.page]}e.exports=function(t,e){var r=t._fullLayout._paper.selectAll("."+n.cn.table).data(e.map(function(e){var r=a.unwrap(e).trace;return u(t,r)}),a.keyFun);r.exit().remove(),r.enter().append("g").classed(n.cn.table,!0).attr("overflow","visible").style("box-sizing","content-box").style("position","absolute").style("left",0).style("overflow","visible").style("shape-rendering","crispEdges").style("pointer-events","all"),r.attr("width",function(t){return t.width+t.size.l+t.size.r}).attr("height",function(t){return t.height+t.size.t+t.size.b}).attr("transform",function(t){return"translate("+t.translateX+","+t.translateY+")"});var s=r.selectAll("."+n.cn.tableControlView).data(a.repeat,a.keyFun);s.enter().append("g").classed(n.cn.tableControlView,!0).style("box-sizing","content-box").on("mousemove",function(e){s.filter(function(t){return e===t}).call(v,t)}).on("mousewheel",function(e){e.scrollbarState.wheeling||(e.scrollbarState.wheeling=!0,i.event.stopPropagation(),i.event.preventDefault(),S(t,s,null,e.scrollY+i.event.deltaY)(e),e.scrollbarState.wheeling=!1)}).call(v,t,!0),s.attr("transform",function(t){return"translate("+t.size.l+" "+t.size.t+")"});var f=s.selectAll("."+n.cn.scrollBackground).data(a.repeat,a.keyFun);f.enter().append("rect").classed(n.cn.scrollBackground,!0).attr("fill","none"),f.attr("width",function(t){return t.width}).attr("height",function(t){return t.height}),s.each(function(e){o.setClipUrl(i.select(this),d(t,e))});var x=s.selectAll("."+n.cn.yColumn).data(function(t){return t.columns},a.keyFun);x.enter().append("g").classed(n.cn.yColumn,!0),x.exit().remove(),x.attr("transform",function(t){return"translate("+t.x+" 0)"}).call(i.behavior.drag().origin(function(e){return w(i.select(this),e,-n.uplift),l(this),e.calcdata.columnDragInProgress=!0,v(s.filter(function(t){return e.calcdata.key===t.key}),t),e}).on("drag",function(t){var e=i.select(this),r=function(e){return(t===e?i.event.x:e.x)+e.columnWidth/2};t.x=Math.max(-n.overdrag,Math.min(t.calcdata.width+n.overdrag-t.columnWidth,i.event.x)),m(x).filter(function(e){return e.calcdata.key===t.calcdata.key}).sort(function(t,e){return r(t)-r(e)}).forEach(function(e,r){e.xIndex=r,e.x=t===e?e.x:e.xScale(e)}),x.filter(function(e){return t!==e}).transition().ease(n.transitionEase).duration(n.transitionDuration).attr("transform",function(t){return"translate("+t.x+" 0)"}),e.call(c).attr("transform","translate("+t.x+" -"+n.uplift+" )")}).on("dragend",function(e){var r=i.select(this),n=e.calcdata;e.x=e.xScale(e),e.calcdata.columnDragInProgress=!1,w(r,e,0),function(t,e,r){var n=e.gdColumnsOriginalOrder;e.gdColumns.sort(function(t,e){return r[n.indexOf(t)]-r[n.indexOf(e)]}),e.columnorder=r,t.emit("plotly_restyle")}(t,n,n.columns.map(function(t){return t.xIndex}))})),x.each(function(e){o.setClipUrl(i.select(this),g(t,e))});var b=x.selectAll("."+n.cn.columnBlock).data(h.splitToPanels,a.keyFun);b.enter().append("g").classed(n.cn.columnBlock,!0).attr("id",function(t){return t.key}),b.style("cursor",function(t){return t.dragHandle?"ew-resize":t.calcdata.scrollbarState.barWiggleRoom?"ns-resize":"default"});var _=b.filter(M),A=b.filter(k);A.call(i.behavior.drag().origin(function(t){return i.event.stopPropagation(),t}).on("drag",S(t,s,-1)).on("dragend",function(){})),y(t,s,_,b),y(t,s,A,b);var E=s.selectAll("."+n.cn.scrollAreaClip).data(a.repeat,a.keyFun);E.enter().append("clipPath").classed(n.cn.scrollAreaClip,!0).attr("id",function(e){return d(t,e)});var C=E.selectAll("."+n.cn.scrollAreaClipRect).data(a.repeat,a.keyFun);C.enter().append("rect").classed(n.cn.scrollAreaClipRect,!0).attr("x",-n.overdrag).attr("y",-n.uplift).attr("fill","none"),C.attr("width",function(t){return t.width+2*n.overdrag}).attr("height",function(t){return t.height+n.uplift}),x.selectAll("."+n.cn.columnBoundary).data(a.repeat,a.keyFun).enter().append("g").classed(n.cn.columnBoundary,!0);var L=x.selectAll("."+n.cn.columnBoundaryClippath).data(a.repeat,a.keyFun);L.enter().append("clipPath").classed(n.cn.columnBoundaryClippath,!0),L.attr("id",function(e){return g(t,e)});var z=L.selectAll("."+n.cn.columnBoundaryRect).data(a.repeat,a.keyFun);z.enter().append("rect").classed(n.cn.columnBoundaryRect,!0).attr("fill","none"),z.attr("width",function(t){return t.columnWidth+2*p(t)}).attr("height",function(t){return t.calcdata.height+2*p(t)+n.uplift}).attr("x",function(t){return-p(t)}).attr("y",function(t){return-p(t)}),T(null,A,s)}},{"../../components/color":558,"../../components/drawing":583,"../../lib":684,"../../lib/gup":681,"../../lib/svg_text_utils":708,"./constants":1108,"./data_preparation_helper":1109,"./data_split_helpers":1110,d3:147}],1114:[function(t,e,r){"use strict";var n=t("../box/attributes"),i=t("../../lib/extend").extendFlat;e.exports={y:n.y,x:n.x,x0:n.x0,y0:n.y0,name:n.name,orientation:i({},n.orientation,{}),bandwidth:{valType:"number",min:0,editType:"calc"},scalegroup:{valType:"string",dflt:"",editType:"calc"},scalemode:{valType:"enumerated",values:["width","count"],dflt:"width",editType:"calc"},spanmode:{valType:"enumerated",values:["soft","hard","manual"],dflt:"soft",editType:"calc"},span:{valType:"info_array",items:[{valType:"any",editType:"calc"},{valType:"any",editType:"calc"}],editType:"calc"},line:{color:{valType:"color",editType:"style"},width:{valType:"number",min:0,dflt:2,editType:"style"},editType:"plot"},fillcolor:n.fillcolor,points:i({},n.boxpoints,{}),jitter:i({},n.jitter,{}),pointpos:i({},n.pointpos,{}),marker:n.marker,text:n.text,box:{visible:{valType:"boolean",dflt:!1,editType:"plot"},width:{valType:"number",min:0,max:1,dflt:.25,editType:"plot"},fillcolor:{valType:"color",editType:"style"},line:{color:{valType:"color",editType:"style"},width:{valType:"number",min:0,editType:"style"},editType:"style"},editType:"plot"},meanline:{visible:{valType:"boolean",dflt:!1,editType:"plot"},color:{valType:"color",editType:"style"},width:{valType:"number",min:0,editType:"style"},editType:"plot"},side:{valType:"enumerated",values:["both","positive","negative"],dflt:"both",editType:"plot"},selected:n.selected,unselected:n.unselected,hoveron:{valType:"flaglist",flags:["violins","points","kde"],dflt:"violins+points+kde",extras:["all"],editType:"style"}}},{"../../lib/extend":673,"../box/attributes":840}],1115:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes"),a=t("../box/calc"),o=t("./helpers"),s=t("../../constants/numerical").BADNUM;function l(t,e,r){var i=e.max-e.min;if(!i)return 1;if(t.bandwidth)return Math.max(t.bandwidth,i/1e4);var a=r.length,o=n.stdev(r,a-1,e.mean);return Math.max(function(t,e,r){return 1.059*Math.min(e,r/1.349)*Math.pow(t,-.2)}(a,o,e.q3-e.q1),i/100)}function c(t,e,r,n){var a,o=t.spanmode,l=t.span||[],c=[e.min,e.max],u=[e.min-2*n,e.max+2*n];function h(n){var i=l[n],a=r.d2c(i,0,t[e.valLetter+"calendar"]);return a===s?u[n]:a}var f={type:"linear",range:a="soft"===o?u:"hard"===o?c:[h(0),h(1)]};return i.setConvert(f),f.cleanRange(),a}e.exports=function(t,e){var r=a(t,e);if(r[0].t.empty)return r;var s=t._fullLayout,u=i.getFromId(t,e["h"===e.orientation?"xaxis":"yaxis"]),h=s._violinScaleGroupStats,f=e.scalegroup,p=h[f];p||(p=h[f]={maxWidth:0,maxCount:0});for(var d=0;d<r.length;d++){var g=r[d],m=g.pts.map(o.extractVal),v=g.bandwidth=l(e,g,m),y=g.span=c(e,g,u,v),x=y[1]-y[0],b=Math.ceil(x/(v/3)),_=x/b;if(!isFinite(_)||!isFinite(b))return n.error("Something went wrong with computing the violin span"),r[0].t.empty=!0,r;var w=o.makeKDE(g,e,m);g.density=new Array(b);for(var k=0,M=y[0];M<y[1]+_/2;k++,M+=_){var A=w(M);p.maxWidth=Math.max(p.maxWidth,A),g.density[k]={v:A,t:M}}i.expand(u,y,{padded:!0}),p.maxCount=Math.max(p.maxCount,m.length)}return r[0].t.labels.kde=n._(t,"kde:"),r}},{"../../constants/numerical":661,"../../lib":684,"../../plots/cartesian/axes":732,"../box/calc":841,"./helpers":1117}],1116:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../components/color"),a=t("../box/defaults"),o=t("./attributes");e.exports=function(t,e,r,s){function l(r,i){return n.coerce(t,e,o,r,i)}function c(r,i){return n.coerce2(t,e,o,r,i)}if(a.handleSampleDefaults(t,e,l,s),!1!==e.visible){l("bandwidth"),l("scalegroup",e.name),l("scalemode"),l("side");var u,h=l("span");Array.isArray(h)&&(u="manual"),l("spanmode",u);var f=l("line.color",(t.marker||{}).color||r),p=l("line.width"),d=l("fillcolor",i.addOpacity(e.line.color,.5));a.handlePointsDefaults(t,e,l,{prefix:""});var g=c("box.width"),m=c("box.fillcolor",d),v=c("box.line.color",f),y=c("box.line.width",p);l("box.visible",Boolean(g||m||v||y))||delete e.box;var x=c("meanline.color",f),b=c("meanline.width",p);l("meanline.visible",Boolean(x||b))||delete e.meanline}}},{"../../components/color":558,"../../lib":684,"../box/defaults":842,"./attributes":1114}],1117:[function(t,e,r){"use strict";var n=t("../../lib"),i=function(t){return 1/Math.sqrt(2*Math.PI)*Math.exp(-.5*t*t)};r.makeKDE=function(t,e,r){var n=r.length,a=i,o=t.bandwidth,s=1/(n*o);return function(t){for(var e=0,i=0;i<n;i++)e+=a((t-r[i])/o);return s*e}},r.getPositionOnKdePath=function(t,e,r){var i,a;"h"===e.orientation?(i="y",a="x"):(i="x",a="y");var o=n.findPointOnPath(t.path,r,a,{pathLength:t.pathLength}),s=t.posCenterPx,l=o[i];return[l,"both"===e.side?2*s-l:s]},r.getKdeValue=function(t,e,n){var i=t.pts.map(r.extractVal);return r.makeKDE(t,e,i)(n)/t.posDensityScale},r.extractVal=function(t){return t.v}},{"../../lib":684}],1118:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("../../plots/cartesian/axes"),a=t("../box/hover"),o=t("./helpers");e.exports=function(t,e,r,s,l){var c,u,h=t.cd,f=h[0].trace,p=f.hoveron,d=-1!==p.indexOf("violins"),g=-1!==p.indexOf("kde"),m=[];if(d||g){var v=a.hoverOnBoxes(t,e,r,s);if(d&&(m=m.concat(v)),g&&v.length>0){var y,x,b,_,w,k=t.xa,M=t.ya;"h"===f.orientation?(w=e,y="y",b=M,x="x",_=k):(w=r,y="x",b=k,x="y",_=M);var A=h[t.index];if(w>=A.span[0]&&w<=A.span[1]){var T=n.extendFlat({},t),S=_.c2p(w,!0),E=o.getKdeValue(A,f,w),C=o.getPositionOnKdePath(A,f,S),L=b._offset,z=b._length;T[y+"0"]=C[0],T[y+"1"]=C[1],T[x+"0"]=T[x+"1"]=S,T[x+"Label"]=x+": "+i.hoverLabelText(_,w)+", "+h[0].t.labels.kde+" "+E.toFixed(3),T.spikeDistance=v[0].spikeDistance;var P=y+"Spike";T[P]=v[0][P],v[0].spikeDistance=void 0,v[0][P]=void 0,m.push(T),(u={stroke:t.color})[y+"1"]=n.constrain(L+C[0],L,L+z),u[y+"2"]=n.constrain(L+C[1],L,L+z),u[x+"1"]=u[x+"2"]=_._offset+S}}}-1!==p.indexOf("points")&&(c=a.hoverOnPoints(t,e,r));var I=l.selectAll(".violinline-"+f.uid).data(u?[0]:[]);return I.enter().append("line").classed("violinline-"+f.uid,!0).attr("stroke-width",1.5),I.exit().remove(),I.attr(u),"closest"===s?c?[c]:m:c?(m.push(c),m):m}},{"../../lib":684,"../../plots/cartesian/axes":732,"../box/hover":843,"./helpers":1117}],1119:[function(t,e,r){"use strict";e.exports={attributes:t("./attributes"),layoutAttributes:t("./layout_attributes"),supplyDefaults:t("./defaults"),supplyLayoutDefaults:t("./layout_defaults"),calc:t("./calc"),setPositions:t("./set_positions"),plot:t("./plot"),style:t("./style"),styleOnSelect:t("../scatter/style").styleOnSelect,hoverPoints:t("./hover"),selectPoints:t("../box/select"),moduleType:"trace",name:"violin",basePlotModule:t("../../plots/cartesian"),categories:["cartesian","svg","symbols","oriented","box-violin","showLegend","violinLayout","zoomScale"],meta:{}}},{"../../plots/cartesian":743,"../box/select":848,"../scatter/style":1036,"./attributes":1114,"./calc":1115,"./defaults":1116,"./hover":1118,"./layout_attributes":1120,"./layout_defaults":1121,"./plot":1122,"./set_positions":1123,"./style":1124}],1120:[function(t,e,r){"use strict";var n=t("../box/layout_attributes"),i=t("../../lib").extendFlat;e.exports={violinmode:i({},n.boxmode,{}),violingap:i({},n.boxgap,{}),violingroupgap:i({},n.boxgroupgap,{})}},{"../../lib":684,"../box/layout_attributes":845}],1121:[function(t,e,r){"use strict";var n=t("../../lib"),i=t("./layout_attributes"),a=t("../box/layout_defaults");e.exports=function(t,e,r){a._supply(t,e,r,function(r,a){return n.coerce(t,e,i,r,a)},"violin")}},{"../../lib":684,"../box/layout_defaults":846,"./layout_attributes":1120}],1122:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../lib"),a=t("../../components/drawing"),o=t("../box/plot"),s=t("../scatter/line_points"),l=t("./helpers");e.exports=function(t,e,r,c){var u=t._fullLayout,h=e.xaxis,f=e.yaxis;function p(t){var e=s(t,{xaxis:h,yaxis:f,connectGaps:!0,baseTolerance:.75,shape:"spline",simplify:!0});return a.smoothopen(e[0],1)}var d=c.selectAll("g.trace.violins").data(r,function(t){return t[0].trace.uid});d.enter().append("g").attr("class","trace violins"),d.exit().remove(),d.order(),d.each(function(t){var r=t[0],a=r.t,s=r.trace,c=n.select(this);e.isRangePlot||(r.node3=c);var d=u._numViolins,g="group"===u.violinmode&&d>1,m=1-u.violingap,v=a.bdPos=a.dPos*m*(1-u.violingroupgap)/(g?d:1),y=a.bPos=g?2*a.dPos*((a.num+.5)/d-.5)*m:0;if(a.wHover=a.dPos*(g?m/d:1),!0!==s.visible||a.empty)n.select(this).remove();else{var x=e[a.valLetter+"axis"],b=e[a.posLetter+"axis"],_="both"===s.side,w=_||"positive"===s.side,k=_||"negative"===s.side,M=u._violinScaleGroupStats[s.scalegroup],A=c.selectAll("path.violin").data(i.identity);A.enter().append("path").style("vector-effect","non-scaling-stroke").attr("class","violin"),A.exit().remove(),A.each(function(t){var e,r,i,o,l,c,u,h,f=n.select(this),d=t.density,g=d.length,m=t.pos+y,A=b.c2p(m);switch(s.scalemode){case"width":e=M.maxWidth/v;break;case"count":e=M.maxWidth/v*(M.maxCount/t.pts.length)}if(w){for(u=new Array(g),l=0;l<g;l++)(h=u[l]={})[a.posLetter]=m+d[l].v/e,h[a.valLetter]=d[l].t;r=p(u)}if(k){for(u=new Array(g),c=0,l=g-1;c<g;c++,l--)(h=u[c]={})[a.posLetter]=m-d[l].v/e,h[a.valLetter]=d[l].t;i=p(u)}if(_)o=r+"L"+i.substr(1)+"Z";else{var T=[A,x.c2p(d[0].t)],S=[A,x.c2p(d[g-1].t)];"h"===s.orientation&&(T.reverse(),S.reverse()),o=w?"M"+T+"L"+r.substr(1)+"L"+S:"M"+S+"L"+i.substr(1)+"L"+T}f.attr("d",o),t.posCenterPx=A,t.posDensityScale=e*v,t.path=f.node(),t.pathLength=t.path.getTotalLength()/(_?2:1)});var T,S,E,C=s.box||{},L=C.width,z=(C.line||{}).width;_?(T=v*L,S=0):w?(T=[0,v*L/2],S=-z):(T=[v*L/2,0],S=z),o.plotBoxAndWhiskers(c,{pos:b,val:x},s,{bPos:y,bdPos:T,bPosPxOffset:S}),o.plotBoxMean(c,{pos:b,val:x},s,{bPos:y,bdPos:T,bPosPxOffset:S}),!(s.box||{}).visible&&(s.meanline||{}).visible&&(E=i.identity);var P=c.selectAll("path.meanline").data(E||[]);P.enter().append("path").attr("class","meanline").style("fill","none").style("vector-effect","non-scaling-stroke"),P.exit().remove(),P.each(function(t){var e=x.c2p(t.mean,!0),r=l.getPositionOnKdePath(t,s,e);n.select(this).attr("d","h"===s.orientation?"M"+e+","+r[0]+"V"+r[1]:"M"+r[0]+","+e+"H"+r[1])}),o.plotPoints(c,{x:h,y:f},s,a)}})}},{"../../components/drawing":583,"../../lib":684,"../box/plot":847,"../scatter/line_points":1028,"./helpers":1117,d3:147}],1123:[function(t,e,r){"use strict";var n=t("../box/set_positions").setPositionOffset,i=["v","h"];e.exports=function(t,e){for(var r=t.calcdata,a=e.xaxis,o=e.yaxis,s=0;s<i.length;s++){for(var l=i[s],c="h"===l?o:a,u=[],h=0,f=0,p=0;p<r.length;p++){var d=r[p],g=d[0].t,m=d[0].trace;!0!==m.visible||"violin"!==m.type||g.empty||m.orientation!==l||m.xaxis!==a._id||m.yaxis!==o._id||(u.push(p),!1!==m.points&&(h=Math.max(h,m.jitter-m.pointpos-1),f=Math.max(f,m.jitter+m.pointpos-1)))}n("violin",t,u,c,[h,f])}}},{"../box/set_positions":849}],1124:[function(t,e,r){"use strict";var n=t("d3"),i=t("../../components/color"),a=t("../scatter/style").stylePoints;e.exports=function(t,e){var r=e?e[0].node3:n.select(t).selectAll("g.trace.violins");r.style("opacity",function(t){return t[0].trace.opacity}),r.each(function(e){var r=e[0].trace,o=n.select(this),s=r.box||{},l=s.line||{},c=r.meanline||{},u=c.width;o.selectAll("path.violin").style("stroke-width",r.line.width+"px").call(i.stroke,r.line.color).call(i.fill,r.fillcolor),o.selectAll("path.box").style("stroke-width",l.width+"px").call(i.stroke,l.color).call(i.fill,s.fillcolor);var h={"stroke-width":u+"px","stroke-dasharray":2*u+"px,"+u+"px"};o.selectAll("path.mean").style(h).call(i.stroke,c.color),o.selectAll("path.meanline").style(h).call(i.stroke,c.color),a(o,r,t)})}},{"../../components/color":558,"../scatter/style":1036,d3:147}],1125:[function(t,e,r){"use strict";var n=t("../plots/cartesian/axes"),i=t("../lib"),a=t("../plot_api/plot_schema"),o=t("./helpers").pointsAccessorFunction,s=t("../constants/numerical").BADNUM;r.moduleType="transform",r.name="aggregate";var l=r.attributes={enabled:{valType:"boolean",dflt:!0,editType:"calc"},groups:{valType:"string",strict:!0,noBlank:!0,arrayOk:!0,dflt:"x",editType:"calc"},aggregations:{_isLinkedToArray:"aggregation",target:{valType:"string",editType:"calc"},func:{valType:"enumerated",values:["count","sum","avg","median","mode","rms","stddev","min","max","first","last","change","range"],dflt:"first",editType:"calc"},funcmode:{valType:"enumerated",values:["sample","population"],dflt:"sample",editType:"calc"},enabled:{valType:"boolean",dflt:!0,editType:"calc"},editType:"calc"},editType:"calc"},c=l.aggregations;function u(t,e,r,a){if(a.enabled){for(var o=a.target,l=i.nestedProperty(e,o),c=l.get(),u=function(t,e){var r=t.func,n=e.d2c,i=e.c2d;switch(r){case"count":return h;case"first":return f;case"last":return p;case"sum":return function(t,e){for(var r=0,a=0;a<e.length;a++){var o=n(t[e[a]]);o!==s&&(r+=o)}return i(r)};case"avg":return function(t,e){for(var r=0,a=0,o=0;o<e.length;o++){var l=n(t[e[o]]);l!==s&&(r+=l,a++)}return a?i(r/a):s};case"min":return function(t,e){for(var r=1/0,a=0;a<e.length;a++){var o=n(t[e[a]]);o!==s&&(r=Math.min(r,o))}return r===1/0?s:i(r)};case"max":return function(t,e){for(var r=-1/0,a=0;a<e.length;a++){var o=n(t[e[a]]);o!==s&&(r=Math.max(r,o))}return r===-1/0?s:i(r)};case"range":return function(t,e){for(var r=1/0,a=-1/0,o=0;o<e.length;o++){var l=n(t[e[o]]);l!==s&&(r=Math.min(r,l),a=Math.max(a,l))}return a===-1/0||r===1/0?s:i(a-r)};case"change":return function(t,e){var r=n(t[e[0]]),a=n(t[e[e.length-1]]);return r===s||a===s?s:i(a-r)};case"median":return function(t,e){for(var r=[],a=0;a<e.length;a++){var o=n(t[e[a]]);o!==s&&r.push(o)}if(!r.length)return s;r.sort();var l=(r.length-1)/2;return i((r[Math.floor(l)]+r[Math.ceil(l)])/2)};case"mode":return function(t,e){for(var r={},a=0,o=s,l=0;l<e.length;l++){var c=n(t[e[l]]);if(c!==s){var u=r[c]=(r[c]||0)+1;u>a&&(a=u,o=c)}}return a?i(o):s};case"rms":return function(t,e){for(var r=0,a=0,o=0;o<e.length;o++){var l=n(t[e[o]]);l!==s&&(r+=l*l,a++)}return a?i(Math.sqrt(r/a)):s};case"stddev":return function(e,r){var i,a=0,o=0,l=1,c=s;for(i=0;i<r.length&&c===s;i++)c=n(e[r[i]]);if(c===s)return s;for(;i<r.length;i++){var u=n(e[r[i]]);if(u!==s){var h=u-c;a+=h,o+=h*h,l++}}var f="sample"===t.funcmode?l-1:l;return f?Math.sqrt((o-a*a/l)/f):0}}}(a,n.getDataConversions(t,e,o,c)),d=new Array(r.length),g=0;g<r.length;g++)d[g]=u(c,r[g]);l.set(d),"count"===a.func&&i.pushUnique(e._arrayAttrs,o)}}function h(t,e){return e.length}function f(t,e){return t[e[0]]}function p(t,e){return t[e[e.length-1]]}r.supplyDefaults=function(t,e){var r,n={};function o(e,r){return i.coerce(t,n,l,e,r)}if(!o("enabled"))return n;var s=a.findArrayAttributes(e),u={};for(r=0;r<s.length;r++)u[s[r]]=1;var h=o("groups");if(!Array.isArray(h)){if(!u[h])return void(n.enabled=!1);u[h]=0}var f,p=t.aggregations||[],d=n.aggregations=new Array(p.length);function g(t,e){return i.coerce(p[r],f,c,t,e)}for(r=0;r<p.length;r++){f={_index:r};var m=g("target"),v=g("func");g("enabled")&&m&&(u[m]||"count"===v&&void 0===u[m])?("stddev"===v&&g("funcmode"),u[m]=0,d[r]=f):d[r]={enabled:!1,_index:r}}for(r=0;r<s.length;r++)u[s[r]]&&d.push({target:s[r],func:c.func.dflt,enabled:!0,_index:-1});return n},r.calcTransform=function(t,e,r){if(r.enabled){var n=r.groups,a=i.getTargetArray(e,{target:n});if(a){var s,l,c,h,f={},p={},d=[],g=o(e.transforms,r),m=a.length;for(e._length&&(m=Math.min(m,e._length)),s=0;s<m;s++)void 0===(c=f[l=a[s]])?(f[l]=d.length,h=[s],d.push(h),p[f[l]]=g(s)):(d[c].push(s),p[f[l]]=(p[f[l]]||[]).concat(g(s)));r._indexToPoints=p;var v=r.aggregations;for(s=0;s<v.length;s++)u(t,e,d,v[s]);"string"==typeof n&&u(t,e,d,{target:n,func:"first",enabled:!0}),e._length=d.length}}}},{"../constants/numerical":661,"../lib":684,"../plot_api/plot_schema":721,"../plots/cartesian/axes":732,"./helpers":1128}],1126:[function(t,e,r){"use strict";var n=t("../lib"),i=t("../registry"),a=t("../plots/cartesian/axes"),o=t("./helpers").pointsAccessorFunction,s=t("../constants/filter_ops"),l=s.COMPARISON_OPS,c=s.INTERVAL_OPS,u=s.SET_OPS;r.moduleType="transform",r.name="filter",r.attributes={enabled:{valType:"boolean",dflt:!0,editType:"calc"},target:{valType:"string",strict:!0,noBlank:!0,arrayOk:!0,dflt:"x",editType:"calc"},operation:{valType:"enumerated",values:[].concat(l).concat(c).concat(u),dflt:"=",editType:"calc"},value:{valType:"any",dflt:0,editType:"calc"},preservegaps:{valType:"boolean",dflt:!1,editType:"calc"},editType:"calc"},r.supplyDefaults=function(t){var e={};function a(i,a){return n.coerce(t,e,r.attributes,i,a)}if(a("enabled")){a("preservegaps"),a("operation"),a("value"),a("target");var o=i.getComponentMethod("calendars","handleDefaults");o(t,e,"valuecalendar",null),o(t,e,"targetcalendar",null)}return e},r.calcTransform=function(t,e,r){if(r.enabled){var i=n.getTargetArray(e,r);if(i){var s=r.target,h=i.length;e._length&&(h=Math.min(h,e._length));var f=r.targetcalendar,p=e._arrayAttrs,d=r.preservegaps;if("string"==typeof s){var g=n.nestedProperty(e,s+"calendar").get();g&&(f=g)}var m,v,y=function(t,e,r){var n=t.operation,i=t.value,a=Array.isArray(i);function o(t){return-1!==t.indexOf(n)}var s,h=function(r){return e(r,0,t.valuecalendar)},f=function(t){return e(t,0,r)};o(l)?s=h(a?i[0]:i):o(c)?s=a?[h(i[0]),h(i[1])]:[h(i),h(i)]:o(u)&&(s=a?i.map(h):[h(i)]);switch(n){case"=":return function(t){return f(t)===s};case"!=":return function(t){return f(t)!==s};case"<":return function(t){return f(t)<s};case"<=":return function(t){return f(t)<=s};case">":return function(t){return f(t)>s};case">=":return function(t){return f(t)>=s};case"[]":return function(t){var e=f(t);return e>=s[0]&&e<=s[1]};case"()":return function(t){var e=f(t);return e>s[0]&&e<s[1]};case"[)":return function(t){var e=f(t);return e>=s[0]&&e<s[1]};case"(]":return function(t){var e=f(t);return e>s[0]&&e<=s[1]};case"][":return function(t){var e=f(t);return e<=s[0]||e>=s[1]};case")(":return function(t){var e=f(t);return e<s[0]||e>s[1]};case"](":return function(t){var e=f(t);return e<=s[0]||e>s[1]};case")[":return function(t){var e=f(t);return e<s[0]||e>=s[1]};case"{}":return function(t){return-1!==s.indexOf(f(t))};case"}{":return function(t){return-1===s.indexOf(f(t))}}}(r,a.getDataToCoordFunc(t,e,s,i),f),x={},b={},_=0;d?(m=function(t){x[t.astr]=n.extendDeep([],t.get()),t.set(new Array(h))},v=function(t,e){var r=x[t.astr][e];t.get()[e]=r}):(m=function(t){x[t.astr]=n.extendDeep([],t.get()),t.set([])},v=function(t,e){var r=x[t.astr][e];t.get().push(r)}),M(m);for(var w=o(e.transforms,r),k=0;k<h;k++){y(i[k])?(M(v,k),b[_++]=w(k)):d&&_++}r._indexToPoints=b,e._length=_}}function M(t,r){for(var i=0;i<p.length;i++){t(n.nestedProperty(e,p[i]),r)}}}},{"../constants/filter_ops":657,"../lib":684,"../plots/cartesian/axes":732,"../registry":817,"./helpers":1128}],1127:[function(t,e,r){"use strict";var n=t("../lib"),i=t("../plot_api/plot_schema"),a=t("../plots/plots"),o=t("./helpers").pointsAccessorFunction;function s(t,e){var r,s,c,u,h,f,p,d,g,m,v=e.transform,y=e.transformIndex,x=t.transforms[y].groups,b=o(t.transforms,v);if(!Array.isArray(x)||0===x.length)return[t];var _=n.filterUnique(x),w=new Array(_.length),k=x.length,M=i.findArrayAttributes(t),A=v.styles||[],T={};for(r=0;r<A.length;r++)T[A[r].target]=A[r].value;v.styles&&(m=n.keyedContainer(v,"styles","target","value.name"));var S={},E={};for(r=0;r<_.length;r++){S[f=_[r]]=r,E[f]=0,(p=w[r]=n.extendDeepNoArrays({},t))._group=f,p.updateStyle=l(f,y),p.transforms[y]._indexToPoints={};var C=null;for(m&&(C=m.get(f)),p.name=C||""===C?C:n.templateString(v.nameformat,{trace:t.name,group:f}),d=p.transforms,p.transforms=[],s=0;s<d.length;s++)p.transforms[s]=n.extendDeepNoArrays({},d[s]);for(s=0;s<M.length;s++)n.nestedProperty(p,M[s]).set([])}for(c=0;c<M.length;c++){for(u=M[c],s=0,g=[];s<_.length;s++)g[s]=n.nestedProperty(w[s],u).get();for(h=n.nestedProperty(t,u).get(),s=0;s<k;s++)g[S[x[s]]].push(h[s])}for(s=0;s<k;s++){(p=w[S[x[s]]]).transforms[y]._indexToPoints[E[x[s]]]=b(s),E[x[s]]++}for(r=0;r<_.length;r++)f=_[r],p=w[r],a.clearExpandedTraceDefaultColors(p),p=n.extendDeepNoArrays(p,T[f]||{});return w}function l(t,e){return function(r,i,a){n.keyedContainer(r,"transforms["+e+"].styles","target","value."+i).set(String(t),a)}}r.moduleType="transform",r.name="groupby",r.attributes={enabled:{valType:"boolean",dflt:!0,editType:"calc"},groups:{valType:"data_array",dflt:[],editType:"calc"},nameformat:{valType:"string",editType:"calc"},styles:{_isLinkedToArray:"style",target:{valType:"string",editType:"calc"},value:{valType:"any",dflt:{},editType:"calc",_compareAsJSON:!0},editType:"calc"},editType:"calc"},r.supplyDefaults=function(t,e,i){var a,o={};function s(e,i){return n.coerce(t,o,r.attributes,e,i)}if(!s("enabled"))return o;s("groups"),s("nameformat",i._dataLength>1?"%{group} (%{trace})":"%{group}");var l=t.styles,c=o.styles=[];if(l)for(a=0;a<l.length;a++){var u=c[a]={};n.coerce(l[a],c[a],r.attributes.styles,"target");var h=n.coerce(l[a],c[a],r.attributes.styles,"value");n.isPlainObject(h)?u.value=n.extendDeep({},h):h&&delete u.value}return o},r.transform=function(t,e){var r,n,i,a=[];for(n=0;n<t.length;n++)for(r=s(t[n],e),i=0;i<r.length;i++)a.push(r[i]);return a}},{"../lib":684,"../plot_api/plot_schema":721,"../plots/plots":795,"./helpers":1128}],1128:[function(t,e,r){"use strict";r.pointsAccessorFunction=function(t,e){for(var r,n,i=0;i<t.length&&(r=t[i])!==e;i++)r._indexToPoints&&!1!==r.enabled&&(n=r._indexToPoints);return n?function(t){return n[t]}:function(t){return[t]}}},{}],1129:[function(t,e,r){"use strict";var n=t("../lib"),i=t("../plots/cartesian/axes"),a=t("./helpers").pointsAccessorFunction;r.moduleType="transform",r.name="sort",r.attributes={enabled:{valType:"boolean",dflt:!0,editType:"calc"},target:{valType:"string",strict:!0,noBlank:!0,arrayOk:!0,dflt:"x",editType:"calc"},order:{valType:"enumerated",values:["ascending","descending"],dflt:"ascending",editType:"calc"},editType:"calc"},r.supplyDefaults=function(t){var e={};function i(i,a){return n.coerce(t,e,r.attributes,i,a)}return i("enabled")&&(i("target"),i("order")),e},r.calcTransform=function(t,e,r){if(r.enabled){var o=n.getTargetArray(e,r);if(o){var s=r.target,l=o.length;e._length&&(l=Math.min(l,e._length));var c,u,h=e._arrayAttrs,f=function(t,e,r,n){var i,a=new Array(n),o=new Array(n);for(i=0;i<n;i++)a[i]={v:e[i],i:i};for(a.sort(function(t,e){switch(t.order){case"ascending":return function(t,r){return e(t.v)-e(r.v)};case"descending":return function(t,r){return e(r.v)-e(t.v)}}}(t,r)),i=0;i<n;i++)o[i]=a[i].i;return o}(r,o,i.getDataToCoordFunc(t,e,s,o),l),p=a(e.transforms,r),d={};for(c=0;c<h.length;c++){var g=n.nestedProperty(e,h[c]),m=g.get(),v=new Array(l);for(u=0;u<l;u++)v[u]=m[f[u]];g.set(v)}for(u=0;u<l;u++)d[u]=p(f[u]);r._indexToPoints=d,e._length=l}}}},{"../lib":684,"../plots/cartesian/axes":732,"./helpers":1128}]},{},[21])(21)});
+		</script>
+
+  
+	
+	</head>
+
+
+	<body>
+	<div class="container">
+		<div class="header">
+		  	<img alt="Bismark" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANYAAADbCAYAAAARfW/wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEwAACxMBAJqcGAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAACAASURBVHic7Z13mCRV9f4/ZxOb02xiMywsOecsSUDJQSQJSFRAERH4GlBRUBAQRCQnCSIKgiBJUZDsyg8kCUqSKHEBgWXZcH5/vLe2q+6t2Znp6Z60/T5PPzNVXV1d3V3nnvwec3ca6ByY2TBgDWAtYElgBDAy/M3+HwzMBv4HfBj+/yj8/0/gAeBB4Clv/JhdBtb4LToOZrYUsCWwAbA68AHwV+A/wJvAG+HxHhKgT8JjtrvPM7PewERgCSSIS4THcsBU4CHgXuAe4AF3/7CjPlsDRTQEq84wsxWBLwHbICH4M3AucLu7v1fD9xkGbAxsCnwKWAF4FLgV+KW7/7tW79VAy2gIVp1gZp8GjgK2At4Hfgn8wt3/2UHvPwLYGtg1/P1/wKXANe7+v464hkUZDcGqIcysH7AnEqiVgCeAXyCN8UEnXtcg4DNIyDYEzgbOcPePOuuaejoaglUDmNlIZO4dDgwBrgUucfc7O/O6ymBmU4ErkI92HnC1uz/dmdfUE9EQrHbAzJYGjgT2Axxpgp+4+1udeV2tgZmtDOwD7As8Bxzt7vd07lX1HDQEqwqY2VjgHGAH4OPw/ynu/kanXlgVCJ/ldGA74A7gceCs9n4WM1sW+NjdX2j3RXYwglbfDZhRtdXh7o1HKx9ALxQIeAnlkk4Hxnb2ddXos/UD9gDeAt4FjgYGteN830Ba/CXgYmDJzv6Mbbj2lcK1O4rg9m7rOXpVJY2LIMzsQJRv+h1wHTDN3Y9y99c798pqA3f/xN1/hW6qK4DvAC+a2XfNbLEqTpmZlTcBqwFPmtmPzGxwba64rpgZ/r4BHAJcEwJTrUbDFGwBZtYHOAX4Clq9TnL3Vzv3quqPEEncE/gmSmTv4+6PtPEcDyO/8x1gEvBVlPze0ruwHxo++wfA5cC/gB8A17r7rq09R0NjLQShUuJuYCNgLXc/fFEQKgB3/9DdL0Aa7F7gQTP7v1D90Vq8B6wM/M7dz0SlWzOBO4Nv1yXhqlj5BF3/T4A5wC5mtkprz9EQrBKYWR8zOxa4D7gaWNfdH+7ky+oUuPsH7n4oyoNtCzxmZgeb2YBWvPxJYC8UCMDd3w7n+RC4y8zG1+mya4GZqJRsNnAyErSvtPbFDcGKYGZrAn8H1gfWcPcz3X1eJ19Wp8Pd73D3DYAvomqSF83sBDMbspCXXYoKiffMnedj4EpgAvBXM5scvyiYYp2NxVBOEuCHwI3AnmY2qjUvbghWgJkNMrPTUWDiB+6+g7u/1NnX1dXg7g+4+y7AF4D9gafMbOdmjv0bijDGjv99wKqogv/8/BNm1jec8/O1vvbWIiwWw4Gh2S7gMqA/cHDJ8aPjfQ3BAsxsG+AxtEqt6O7XdvIldXm4+y2o0Pcy4GQzu8bMxpQc+hIwN9q3krs/i8q91jOz/H24Barg/3kL2rCeyLToL8Pf9YGHUZRw3/yBZrYM8JKZXZzfv0gLlpmNNrMrgbNQ1Oswd3+/s6+ru8Dd33f3bwLLooXpUTPbIzrsZVLBym7cS5BWWDb33K7Ai0ATOROygzEFXfPtYftIZLpeBUwPCeQMJwN9gf3MbHi2c5EVrGBq/BM1EK7q7vd28iV1W7j7PHf/AbATcJKZ3WBmi4enXyEVrHXD655DCel1AUIwYwcU8AD4lpk11fv6SzAZeDnnW9+NzMC/hu2NAczss8CawPHIXFwnO8EiJ1hmNsrMfoPCqHu5+6HeiZXnPQnufj+wClqsnjSz/ZDGWhD8Cc7/f3Iv+zuwrpkZ0mB3oKbPB4BxhIhiB2M54IXc9vtAH6RJAYaY2XYokb4LcHPYv2gKlpnthFo5PkC+1G2dfEk9DsE83BtV+/8UOIyixpoHfDu3PQNprCOAzYBT0ep/Jvqtptb/qhNsCfwptz0eLQZvh+2dgd8AB7r7gyEVcwBBk8EiIlhmtqyZ3QD8HDjA3ff3GnbvNpDC3a9GyeFXKQrWKGD33PYrKAhyIrIgZiBT7E1UEDypQy44wMwmIY3129zuq9z9GeR7gRaAy6Ig10vA+lnpU48WrBCcOBtFdJ4FlnP3mzr5shYZhHTFAxQFa+vosH7oPjzY3a8J+zZFgjUP2C3QDnQUtgJe92KP2qGh4mRpZNrujDRqHm8BAwjmYJ8OuNBOgZkdBpyEhGotd3+8ky9pUcV8cj4W4v24M9tw97PMbMNQAJzBkGD1D6/vSCqBrZAJmscaKPJ3kbtfGL/AzNZBmheUt+uZgmVmm6PgxMHufkVnX88ijteQoGQYicymPOIGS0caoD/wnLvPr9/lVWBmQ5FGjRPe7wJ9Q9VIGWZQSYIPgB5oCprZAah6Yo+GUHUJzEd+VobJyJzK481oe567z6GisToK+yPauD9G+2cijbUAoUIEgCD4S6MFYT70IMEyswFmdg2KQm3t7jd09jU1AMiMeg3AzKYD67j7AkEKYfadotcsE/6OQIniuiNcx+HAaSX7NyEnWKGV6JDc9iDUJGqEMqgeIVihEe96FEZfK+RTGugamEJFYy1PUXvhagi8LnrNq+FmXQ21rGBmTWZ2XUjK1gOfBaZRyVVlaEKfIa+xBiLS1QxbAseE194JPUCwwg9wLfA0CqUv8pXoXQzzKApTwQwMdYKxj/VfdOP2Bc4Ox1yKNNtQagwzG4g6pv/l7k/mnwsNma+Qk5VQ9pZfvDcEegOXZv5gtxaswDL7d+Af7v4Vb7RDdymEqu+lqfhQA0kDFwcBK+Ze0wvluTZF/Vz3A9fkjqlHlcwVyJ9rrk50MdSPlcfE3P8bhb+3ZDu6rWCZ2dbA34DL3f1bnX09DZRiG+CDXFTvY1LBAkXVMkxFCeMtUf7rBTQYYtvwfE0Fy8xWR/WJB6I2/Ph5Q5HMOdFTfwnPD0Em67vkPke3DLeb2brI/DvF3U+q4vWZQ/q2uz9W6+trYAF60XJEsMnd38ltj0T35Rph+xPgAhR+B3Uf1wTBNz8P5admmFn/ksP6o88RC9awcB9diEzWw/JuSLcSrPDBv49Wl7Pc/XtVnGMEIglZBq2Iy9XyGhsoYAuKgjUAeCY6Zh0z65XTasPQTXwJ6vUaC7yOIoRQrvGqxWnIpMuqQcrIcuYiHys2BbdB99DngDPd/arQj7Yn8Gqnc7i15YFq/Tx8kGpevzrqsVkP2c03dPZn6qkP1E7hwFG5fWcBq+S2Fwd+E71ua2D73PYByL/aFZUa1er6dkTckGvn9l3czD3j5LgFUVj9aZSzehdVa/wIaVMHXu42PlYo0z8MON/dv1rF6/cGvgXs6grHH0QI5TZQF0wFZrr76bAgKLEnRVNwFXQjxsi3lTQhrbcm5RqlzQiFthcC+7voAzJMKTl8KMXeLFBj5nQkYMMQH8aKqGLjAuCDbiFYoWnuYmQaHFrF6/dFIdHPufv7wbY+BFFD54/rZ2YN07A2OAQV4AILqhP6uJiaMrxIUYgy5I/5j8sHW4MaCJaZLYmid39z919HT8d+FEhw/hDta0JTNLcGRrh7P+BQVxtSE/BGlxes4CBejro3D/Cgi5s5ds2SffsAk1wNjdmq80XgSg9zosysVzjuVuACM7uzGf6GBloB07CILYDjcvv6oBldeawKlA3EywczBgZt127BMvHJ/w0N/5tiOXbbUEG/QcnL+gPPR/vuA+5z99vc/d3w2TL2ppWB17u8YCGTrRewp7ec/D0s+8fM+ppooc9D9m+2vxewN6HsP9wEf0Zq/XDgy8DayP5uoDqsgwYiPJrbtye6qfNYlTTE3cuLc7s+QRHcwai7uCoEIboK+dVfQaZqvh3lfTR1JUYvioIOanxcMrc9CfggFCtMA57t0oIVyDlOBL7hIk5sCfnIzV6ohGaXSCA3Ap5291lmtivwK+BL7v5LgHAzPOSNdv2qEH6zb1Jpo8jwMBrdmsdqpBprhWj7j+i3vMmrnIBiZpugZPNbwCHBCnrQczWLSMhWDNonj2VJc2dvUlx430PRww3QAn1llxYsFFrvA/wjv9PMRubISvK4PvvH3S9196NQ5CmPocBYM7sJccRt6WF8qbs/GcLxZbZ2A63DOSiFEYfFjya9QZd291gAl4q25yNeiYuquRjTHLDr0W+6m7vPRWH/2KycDdwans9jfMl19ybXsxV8wDdQxcjf3f2xLitYZrYCClRsV/JhP3L310peVojymVhWy6ZEfIhyGNu4+8xw7Ljw3OpEq60J65rZRjTQLAJRzC7ALFJNtBK5QIWZTSA0BUZ4PXfMGGQqfoT837Zez+rIzB8OHOIVOob+8Xu7+yzKF9T7iQQrmKqn5t7nWFQpsg8KsnXpkqYzUY3YAyXPTY93mIZpLx3t3gOZAHk8jRog/xKZiBnl1sbkVtvggz2Kcmg/DDdEA+U4CCWATyfVCAMpmoJLkBbkGqHFJKAvSgz/ohX+dQGhq/cOdB9dGL3XAKJ7P/hgCaMtivLNLNm/fu7/ScileAMF2rqmYJnZtugGPx6FyWN8umTfeojXIo9NEXdgHrPdvWylzBzUDQkrq5mtj1bKw919TeR8f781n2FRg2kyy3cQA9Ms5FNlz/VBfm2+aXECRSECmVIfhNf0Q8WxfwJ+3MZr2QT5Zme5+A77UwxAjKDCy55hcST8MUaRtpJA0TpaPbz2a5lv3uUEK5B2nIwSwc+jJGKMsikV/UoEZnjkoIIYduL3HIxWHJDz+bKZfQGp9Z3c/a7w3PsU28wbYEE37WWoCPV6FFXNt3csCzwUvaxMsD4NPBPugUtRwnb31morM+ttZscjYfyJux8fnmqiWGM4kVSw3qJCyJnHCEo0lrt/Et7zOLSoH+/uv8me73KChXJMU9GEB6jwZ+cxq2RfrNr7EBVshhtgtZLXfpcKk9B/w3vvCGwahYw3BO6igRinorq5PZFjvxnFGsH1SBPBE0kFqxe6iW9D3/+OXizQbRYm2ue7kNY8OGiqDKMoMkVNJHBT5NAbRfdi9C/LnZrZFmZ2LYpaHxa9X9cSrJAHOAHVAv437C6bOlHQQkFgYvt4CqkDvS7lDvP0XIDkQHdfDSU3F7ADhQLgtUi7XRdpmLjajwD2DRG+NYHXvNg1UCZYE4i6idHNfwuwObrR/0sLCJQMhyOfbh7i+7skOmx4JByjSXk2DqUZSyh6v2mBAuKPKGCxl7v/In5RlxIsFJLtjxiWMoEZWXJc/IOsSLr6LUUauFiW6AcOzXgLzIJccnJZihpvbeCvmQ1tZpubOMovb+Ez9ViY2UqoNu4X7p6V/YwlrVRoTrBeM7OhZvZ5M/s1WkSnhuf7oS6G5t57tJl9D/k/BwObuPsmlGud2Ox7l/QeGtTMa0eEqPCqZvYXFJzZGY0fWtpFTJqgy7SNmNkSaNL6UVkIHEX5XoqOm0zEmIMq1ePARZlgLUNa9zWGtCIA4Gh3/31ue03gqXANJyCNeClwvpmt5WJw7bEws8XySfqQR/wDuiFPzR06AjU0ZseNQL/FS2F7CDK9VwPOQKVKzQ3OPtTMTs58LDObgqyOzVH1zADUQb6Zu/8v+GYFsy0szrHAvF2yz1CpUoxVUDXFWVQCaX8N5zjAzD5GhQlX5c3WLiFYIcx6EfBbd88PIovJ6UGRvjgD34tywbo+2jedoA1z6Its+vz19EPCmsckNMvpceAud983HLs+6m7tsYIVHPRVUPoiC/b8AeWXjqVYhTACmXEZlkamYWZqr4V43QciTbYwTALOC/mxddCQhLeROZ5pt0lZzScKmMSNkE2kpUqLl+zrRbnv3jscuyMijFkPLcZboaTyJCRHhYLuLiFYyL5dHzHl5JEVTeaRNZ7lsQZFrm2A0SVZ/SZ3fz3adwwKmOSxPGkU6xz0hT6GopYZbket3T0SZrY7qrXMEunTgF8jrbQl6lPKL3QjKHIBOjkz0N3/HELz/0IafzSaS9zckLkDwt+3UFT2YHe/LlzLV8gllJFgxVUSZYI1hdTHWkBdtmCH6kr/FdIEb6NFJH7+CeCWOHLZ6T5WiOaciEpB4hVjOqkQrUpqH29UUolR6PgMUcKyFWkxTxlOd0JtAXlMA77s7j+OHOEPKBZz9hiYJl1egLRxrxCoeBiZxJujRe7k6GUjKJrb80j9q8EoWXwUCjqUzRyei3JF30H+7VgkXE/ljhlGUbCGUK6x1oj2vUPK9pT1VuUxiMhfNI3UzVqL9kL36MXR6zpXYwUT8ELEsT6u5JDFPaUXXtpFSZVHIbEXVpJYWJYkqqQO9n9cLgVqu94/2re6azxo9trRKNDyCeUC220QTN/PAc+4+wNh36fQqJr9kfm9FrqBvuLuF4RjRpF+zyMo+i8FjRUwBi1IKyBtOCu85hxklv8XdRGfFV3jBIqt/bFglWmsONQOci+GR/v6kCaIB5F+vpWBwWY2C/gBypclcwE6W2OdDvzP3U8l/aBQ6XHJIxYqSBN4E0nV/3TgXVOTY35frP1AQh63M8RJyr3QKjqY8hB+t0AQjrtQKc54U2/a15DW+VZIer6Jom/bZEIVMJvUVB8RbQ8jFazRSFB/j6JrRyL/+gR3fxD5bHGAaknE4563RIaTClaZxoopo4eR+t/9kZmfR5lgPYEE9UFkmh5PCTpNY5nZQcD2qBwEIjUcHOT50b5+aM7tSejHyR7LmFlWmzYcCcZiZhYHKgC+YWZPoYr5viiqlH+PLYH3XNzh2b4BpJxzW6Lh1FtRXkvWpRGshX3RjTE17O6Hik7XRivxmQDu/t1wfNz2sRKprzKYYjR2LKlgrU7FZDwU+ApF031xigEQkCke+71lGiuO9o2iOEQO5EPHPvkA0s83mFSwLkSBjKvRwhOTzACdJFgmDu8TgM+4+3shTBqvUBPI3bBmthWqSM/6df6LhONetOq9i0yK+DEbfUEj0Y85Ivf/EaQ5l9lo4FkeaxEJIHLaPzF1nnYrwTLN9b0M3eCHoeDBgcCVyBRbj3TlH0eqmTdG1eN5xA2OYwltP+F3PgX5VvehZLybmGjfjl4TW1PvkutADj7zKhQFewipT95EWiiwHGmIfzZpJLigsczsO2h065/d/QssBB0uWOFG/D3wXdeISdAKFZtkE4CZQVvcjnIId6LI4YySGsBqruV14Odmdm0uD3Uk6cq4ProRs9eNpCKQQyneFF0KQdNsBDzi4vtYH622byCe+1dCOH0+CkR8G/H/xX1sA0v83cm0TKA5NlzGN1BbxUph/0G5vNggim0hZay0G5Lzr9x9rpndE0XjmtNY8YIwpuT8r5FqyUHo4g9A98WKwE0oXbBQdKiPFYIKvwImR/mqCaSNcRPQ6vNzZJrs5u6buvvNtRCqgAuQ+s9XrK9AqrHWpbgybkpFgw2jhiSSdcCFBKJ+MzsG+VMzUCT1lZBAfRAY5u7fDMLzVdJcYbyag8LW8VC4xc1sPzPb38xOQfWDTyBNtRLSDHMpmoeDKN78fUmT+y+SG54dEF9jmWANyJv1AXM9HZX7IrnWEjNbFeXtvom+w7nA5u6+nbvHpKMJOkxjhZXzHMq7NydSLljjkerd1t1vpsZw9/kh+nW1me3k7r9DkaE4A79M1Gy5D6oeAJmZcUFnl4CZfQnl6GYivofPosXqu7nUxorAs16kIliF9KYtSylMIaexQmBoCbRgNXdv/RTYwd3zi9FwpNmyBe0Bd48tmH+T8pDEI36Gkmqi2MUAGGpmd4XzZR3FI4BtTf12SyKN/R/gXOQL3lKisZtFR2qsM1B36aGkq8oEUurhcSgEfFU9hCpDyNo7cImZjQfu9eL8pqVJO0vHUWnNzgoyuxRMPW2noe91BLpZ1kfh4rzPsSapKTssV82QCUwcXDK0IOY11gjkc01F5maMN6iMr81jBEUf9p0QvMpjPGpSzd5/KOmCNphUg8bnAQnga4i+bFu0mL6BtPKDqLRuGXef6u5fdvc/tEWooIMEy8y+jIRkE9fQ5DJ/KrbVs/D7d6k/folunNNJQ64rokqDPF7KNJi7/6OZxslOgZkNNLPfATcgM2wG8ptWdRGVnuNFYp7lKc/l5TGeNN2wONIGseZ5Czn895Lm9y5EN3V8riGRabYzigLmsRxFbfQpSqonSgSgrKLjXXf/PEpy/wtpvu+5+47u/nV3v9LdkwEJbUHdTUEzOxqFUzdx93+FkHksRGUELsNQ3iKuAawHbkDm0u6kJtB05LACC9pHWrSxOwMmhqQ/oCqCjd39XjMb5O5XhufLyP2XIldlErRTLBDjCcJnIrw8lkooepqZzUOm3K5IA+xNuQn2TRTij4lhYg7HKYRpHjm8Q9EP25I0AhgX4PZGgZAYL8OC8qrV0MJ6v5n9DVkgl3mRWLTNqKvGMrPTUNHrgbkVYCSpsz+ElHR+GGlZUV0QVvCrwuYF0dP5+U4g/yOeqt7pCNXmd6GbLROqXhTD4Z8mXRSWoriYjEPtHCPMbDdTa8h4Kr/FTFSNsScyxf6FCqDvQ2H00ZQL1UykscYCx5vZw2Z2fDh/nCtajbQQYLgX+QbXpZjDgpSuegSRdWRRA2w454+Rhl2HZhK+bUXdBMvMNkMhysfd/fbcU3GbNEiw4pV0KOUcBPVCVu+1erR/MkXBqgnVca1gwkFI2JcGLskFWnpFNZRvkEslBMF7J6zce5rZDJTHGoMipdegqOlFwEgz255yHpGWcAvyWQ5Cua//oJrP74fzTzGzU81sk3DjP1MSyYt9pTuRtsz368WCNYqcXxZQGBhuYuf6Ggrn340if+1Pn3h9Jk0MQiVFxwEnRc9tDHw12ncXMCXa9280VK4jJ2Tci5J/+X1XRNvno3btDruuhVzvcmjM6Ksot/ITYFTu+eOi408BlshtLwmcGP4fj4IK3obHzFYccxXQN7qOEchvLTv+HST8O0SfZbXoHLuG4+ehxPF5KGDSL3fMBohTPdvuhRbKp5D590R4/eOIZq9mv029fKwTUfj8FFI+uDKNNZRyHysuRak3TgWuM7Pl3P2fpqa8OGs/2NNq+A6HicX3UhScWNrdPzSzG7xYoLwtgeHIzDYEtgOWMrO5SCutDfzPNB3zY9qeNvgJmuDSnGXxY+CbHu7qDK5G1t2Dv7o9+u3PRRUaA1BgItOS/0Rm5hJm9kMqTYr/Q0n7fZF5ORSZcrPNbA7y4+fpo9sPwzVmn282qty5Bvly93gbo34toeaCFTL7X0BRqPmRqobmfax8bd6qlGfM6wp3/52ZnYs07b7ItMqXVfWnC7DkmiZaXo1uuG2DUA0GZplG1AxCAYxXrDLUbSnU37ZsdLoBpMGD1uI/SFvEFHVzkaZoib32GCRYR3qRN+LnIZw/KTwykppfICEagXJQr6Pv4F53PwbAzMYic34oMvv6o/v8DeR/vgq84qmpWVPUVLBCHuhSxMP3Ysjqx1G9JtIwaZmPZbRDsMIPMw2FkycjE+NOTxOPMY4AHjazPZEt/kLuuZXpGoGLGcDvUE3fiSGa1Q/lgm6jOKVyWzN7lOoXhGfQ4rJWyXPzSaNu76EZZC1aG+7+tJk9AexrZle4ptFnzzmqhniRlOG4V3MaxtXIekvZcx2JmglWKKz9E1KrWYRtIinTTmuCF5n5tSYt0I2FOrf8KtwLaZqVSBvoZoYKi2bP6apBOwvV151Osf9nDSIe+c6Au88zsywPswfwPbSIvEil1ebPKILZhCJoMf5EZZFoQpRlZSxFo0inbWR4k2JN4X9QYXVcjrQwXIeaGS9A6Y4WUWuzrS6ooSN9PXImN8zt+xTwo+i4CymOp8w6e3tFx71CyejKkve9m7Y53K8DQ1tx3r4l+y4GxtbSya3h9z8ICdDBiOQSZOYdhJzz/HcwD9Vr5l/fB0Xo2vJdrpD7/4FqvhsUHcwCIb3b+z10lUdNwu2mgV7bI57s/Ao2mTTZ2ESxLnAw8G9PV6HXaZ0z3ZrP8B5qyJuJ/IljWnqBRzZ4MC3X95Qzo0vA3T909wfc/XwPkwrdfZa7X+DuK6KkaxYuX9bdY9rk71GpPG8N3qNCTXcJKgBo83fj7o+gCPJwFEzpEahVHuvHyO7/O8XepLGkhZODKJqHQ0lzDSDTsDVcEmWjNjO8jshIRrv7OqhdBVQZUA26XE1ga+HuL7r7je5+p7sXIp1mtgPwf2085R1o0VzL3b/orZtf1hyOCH9bbMfoLmi3YJnZYSjncBpaFfPh3kGkgvWhBxsgYAhFgpAMc4F1gqZYGJoLJvwD/egX57TP/eHvFNOIl1bDhSNaPrLrwswODXWb+X0HAddSuRdubMWpnkQNkj+nnNqgrbgPmf57Buun26NdgmUiYzkNRc6uRYKVF6TBpKZgXH08hLQ0BSRYI2nZPClzlH8PbODucStKXgh3buG8PQZm1t/MLgZ+RrEu8AiU8M4a/P6NFskyXpEMr6N82LkouNRu09hVxPx55GtdHqLL3Rrt1VjroVL7M1ydnFMotiAMpkRjRdtDSGvFoBLRa2mKfWxGnocmhJQ1H+Y/b8xh2CNhZhugAM9kYF13fyjsX46UvPS1YE3cRDlmIWq4Y5EAvu4lk0DMbDEzO9DMbgk1gevHx8Rw93tQg+UawEOteU1XRnsF6+co15QlAidR9LHKTMG4E7U5wcqOW6aFa3iWSo3YjWiecHPh2Hxx6BItnLfbwswmm9m3zezfiDTlJnffwt3/X3jeUHg7/i0yrr1DSPupXkWDz09GkUdIJ1/2NrMjkQWzG6Ji3tvdy6ibE7iSxDuiBfkvwUztnmhHeHd5dEOfktv3cnTM74Atctv9gUujY/ZDbffx+S9Fptv/gEELuY7+VEK+41q45s9RDBcP7OywbC0fKGR+MkrcOgowDI2OyWaBlYXP56K2k/3QpPqN0I2+NRKq16Ljj82dd2UUwHoccam353OsgEx8Ry09S3b2d9vmz9COD/+N8MFXCtsjUNg8f8ztKESdbY8sEawjKCmARDmjQ8OPPWAh1zElXMeLrbjm06IbY1pn/wA1+RGVxP0/ph5nnwAAIABJREFUVHXuSIsfT64gNRy3MjKdW5un2g1VdDxR8tzMTGhRn9UnYTFM8n9VfqZBqBbQkQl6QndaCNtjCm6EeK2zjtsm0hbvwRS7PgeQlvYPQUWRCxCaISeiCuT3WTg3ehaEiKmOyxDb7TETUbdDaHu4G7W8f4SCNtNc5JfZ1MEJZvZ9lMRN5jcHPAmcjeok90cL5m/COZ4vOf5sVMD7M1R0faK77+c1qsFz5eX2RemS+ag6I6ag67JoT0nT6miFyjCKVLBi9p2BpP5UGSniUKSlPjKzq5BpknAomNkaiKL4y+5+Tvx8dOxipL1WMd1Vt4KJSu7PqKTrYhQCX8rMlkfVFWsSyHjQZ52NSogeRQne99HvM8PTCGoecaL+dhT4uBCR1ezn7pclr6oB3P3iUAt5G92Iv7EqwQoVxBNQL1CGMsEaQFGwBpASyfQlFay+VDpfbwVuMLMJnk4PmQjs4WJXagmrk5I0xow+3QahSfFKFDX9lrufFPZ/HS1EGeajessrEY1z2XC1lpBfkP6IIqqnIaG6pl5ClcHdHzezD6H7zH+uVmNlplleIEaRUpj19SKt1kBSwcpW0jzepDKh8S/Iz9qHaHq6u9/QhmsuC99Wc5N1FWyNbvDnKYbNf4S+z3dRG/713goevOZgZitTIfZ5D5lmOyMekzm0vWKjmmsYgIqM68bWVWtUK1j7hr95gWgiTdbGPBYDSPNYfUg11khCYtnVa/Q0ac9Pq2FmE1H7dYxuq7GomGc35v0aF7fIoTV8n6yu8h4UZh+ITEBQGD8ePlEP7IJ+qxM64L1qgjYLlmloWLb65wVnFCmPd6yJBpLmj3qTCtanKA5EeJHyMT8tIvghtyDTNY836EY2ewky/7Bu9NZmtgyqiPgDslIWQ8XMGaVYXMhbLxwFXOe5UaRdHdVEBXeh0juV/6BzSdvYY4EZgEK+efQhFcBe0b6XqCKCF6KLv0PcgDFO9ZKqgW6E7Lsuo35uNcxsieCvxftXRD1bD6M2lHmoqmWF3GF176Y2s10Qa9N19X6vWqIawdoIVTjMplhZ/jo5My+0scc+zEBStp0yjQVFbfgxMKYVBbkLEG6Wy1GbRIy3UJt3t4VroMTjwM5t+V5KsDbwppn9zMzWN7PdTWOS7kG/71bBHD+ESldANkDijna8b4sIvtVpqEigo/lP2oU2CVbWk4RKWZ7xYunQTA+ZvYA4IpjteybaVyZYAylqrDWRoLUlPH4eqrQow5leXkvY3XA+CrV/tdoTuHq3foAifLegruldUePqFu7+TkhVnBJe8igV7RGPG601jkMFADd7+9pSOhxt1VjLowqLy0nbteOK5IGkgjWQcsGKv7TRBI0VeObWAO7w4mCCZmFmp6J5T2WYR8nM2O4I1yjRHYHTzOx5MzuxyvOc4e6D3X2Yu09w9+kh2ZsteNtQEaIzqPz2q7TrAwBmtpKZXWlmr5jZo6YZVJjZEihw8jaq7OhWaGvwYiXkS/2XlO10SrQ9nDQ4UCZY8yNNB+ryzdpLVkaa7g8sBEGbboAiYnst5NBbvWVCmW4Dd7/BzAahAuh4wHmrsTCCFirzmN9APIHZsOzYX27rex6GKOcyQprxKLr8A7Qw9kc0ZieEJPGDaM5Xl9debdVYU1EG/ANSwZoabZdNABxA6xrjxlARyowIpaUcxgmotGdhQgXduAu4Obj7x+7+7yhn2CqY2eamkTalIXoz2w619AP8wt1nu6rVbwY2DsUCbX3PwWZ2A+qO6I/886MRE9S00ISaTUzsh7Tymagk6w0zO8fM1mzr+3Yk2ipYU9CqYaQTKmJTcCzlpmDs25Rdw2gqgrUe8NjCSm6C2dDaRGVr2v17PMzs02Z2L/KXrvAir192zAQ002w+CiKcmXv6PGQe/qiN79sXuRLbI6vkO6gY+jTU9X0cuscmonvsDEQ488fwmtuRBp0Rer02b8v7dxSq0VgfI20VT+WI0ZzGarVgBfNuC1owA1HPVmsDG59v5XE9FmZ2PLI8nkY3dTwIAjNbAVEZTAAOcfejgTlmtpaZ7Y2iwwD7mVmLJDAmfB31au2IWGinu/sPgfkmHse/obFNmYvSB1Xp/xuNTrrR3XdDqZffIoH7k5n9yjQUosugGo01G33guGU+9pPKBKu1GmtAyJusHM7TkhkY1wAuDMuZ2R5tOL5Hwcy+hYYRXO4igUna8M1sI2RWT0Ih/cFm9kcUtLgWmdsZN4UBt5rZMSE8XvaeQ1C1xqnIsnkWaaKdzexy5LNfiQSlOXwxCNBwF0X1a0hznYu6mh/tUuZhG3tkPkTdpVNQDVr+uYej7V+S68UK+64hakYEri55n6fC32OQubBQvjkUqZxH28j8J9WjD6crP5C5nH0HI5o5Zk9UTpYd9x4Spv8Seu/CcZuF/b9EJpujNMwRqIZxJ2QdXIh88tb+Ni09XkJEpb8kDEpASesXUNnTJp39Pbu3odERmWeOKqenAV+Jnv9HtH07sHy076b4BwV+FW0PA+4K/98RC+xCrq+56RXNPfbv7C+/Q39oCUL22b9f8vzU8Ptkx3wAfJ3QuAicFR2/LXB6+H8a0kAf1VCAFvaYj7TntNz1jEWLwCyU1+tU8s+2mIJZOH02IiaJS2liH6fMFOxDWpgbh3jHAC+EyokNKW+yK8MXaRv984yWD+kZCAGDn4fNvyJyzgXPmWi6n0CBojNQQOFEdz/NKwW+k6PTDiLUfbr7s+5+JPqtfo6G0dUThqyUzM/DRRb6JNJkZ6DgRjxutcPQFsHKSGFmo9q7uDQpPtco0jxWWTI49s1Go1Kaoch3apVguSoptqfloAqIBqwrDDfoKHwN9W19iDS1w4LRPg8jE/FgYIK7fw0Fp+K6z4nR9qCSYxZz9yPcfRmkAQ+mvoXOF5rZXgAhl/eBux+CiD+XRcK1Xh3fv1m0RbBeCH8HoJtygWCF6F18rjnuPit3TG9gBU+rJ0o1FpUeoNZqLFy0yTuRCm8eJ7v7V7Obq6cjhMyz8Z/HuvtzZtZkZheh+rtrgNtcA62zSouVSGnlRkXbU8lppvD75ttX/oNC+XOQD/SdknO2F72By4JwjUHJZdz9XBSgGQH82jSbuUPRasFyzWp9A93w71LUWGXnKfQ6uaJ8j5adOtoegxodsy+jTTwHruTlYc08/V13P64t5+sB+CrSLn8GfhHC2k+hm30NVIwct3+MR9FAAMysrCZwbYomX9l4pu2At939SXf/obsvizRkLdEbkc4cGZ37dUTnMAnl4joUbQ23P48GmK1GcUROWQ6prK6vbIJ5mcYaSmUMZzVjcy4lNQm/4e7dplGuFjCzgag06H3kg+4FXIHSFxu6+xOo2uGR3GsWA16INPoY0nKp1SmagmNIWXFXIP0dZqE0ytmkLMnVYhYquM7XLr6Cqjl+BXw+5N46DG0VrBdRCPUBioJTdp6yyellghVrrEkocvgfFOVZvo3XmGnHjHzG0SC8U9t6nh6AvZE5dCRKol+MHPv9ciZ5QbBQkCKeaTamZN97XhwcPppUsD7K7wuab5a7P+buh6M5Zr9s64cqwYtIOz6Y2zcZRTb3R1bP2WYW17PWDW0VrDfQF7g6xURvmcYqS9q2RmM9R6WN5FFSZqXW4tsoBL+Pu59d5Tm6O45AhJePooVmhrsfFWmjlSgOpZhC2sZTprFiE71MY31EcSLmRMTDAYCLHOhkFKyKOf3bguURN0qeGmIK8JGrYHdXpAguL2vqrAfa+iYvoy+9P0XBaq3GKut2jTXW8ijrD2IX+lTbLjGc1P1/7v55d7+ymtd3Z4QQ+iUocHACMv1+SM5vyqF/FFCaQhouLwiWaa50vEiWCVY/RCKaoaxOcxjq8p5C+7TXYIosThOyVEGwfr6PwvPHtuM9Wo22CtadyLfamSIne+E8oYfKon39Kfe7Yo01x92z6NHPgM8Eno0GWoEcx8cyyDy6DHUDn0klIJQd+xnSLu8ppKRAYygGOJYi4m1HlkxsLq5BUbDWI/WZh6EAx0wXQWc2d6u1eIfK4vz16HryyBTB9wPzVF3RVsGagdo+tmbhpmCZGTgU2bwxYsFa0FbiqmM7D5l1DbSAwFNxD9JUW6EAQX/kZyxOmpwfQ5rEn0xRGEA36bW57SbSNEiZxlqTYoDjU6SJ+WEUm2ZnoZrBVg1SQCbkakgbTzKzpcP+kdFxvVGF/tuISq+uaJNghaDAdujD5HNF8XmaE6yydvjYFIyF9EFgHxPrbbthZiPNbPuWj+xeMLNz0Wp/PvAZVGf5GTTB/n0qznweg5BvkkdfT0k93d3zPtAoUq1SECyrkLrmrY25pDnGYRSZpsa7KNw2Rv5XS/nGKSjaORRY0SvTKmOzszfSlmcDuwWiobqhzY6caxTMJcBBoVQGUmEYQophlAtWjHilmY5W4XNr5HheRIUXsUfAzJrQDTPO1a6/M9LyP3X3zPQqi/Yti9pH8ij7jWJN10T6m8dRwQmo2/dvuX19S841jGJ1xjDQIh5yjr+nHEehCSifhP8nocBXZg7H6IOso3PQIrB/yTE1Q7U36s2orClzBOPzlCUUW9RYoacmjkgthVakqVTmMlWF0A27I92IUbU1cPe3QwjbQxXMj1EVeD5vN5k0ObscuZU9LFytFayY7HRAvtIGCVrMwNtEqrGGUCw2iDvMDZm1mwB7UOGu3MLF178yuj+e8DAEAiW447lsvRANxNvI79yPOqJawbodJd6+Y2YZ4X6eo69MsKZR7mPlsSxpQtFcFMmHA98LNWHV4mAqM6B6KrZGi9HXvMhEVSZYy1A0tcaTCgOkwjCdyjznDGWJ/niRfJlUSIcSyqVCgCsue+qPOif+6u5Xu/vmSIsdBuDuT7uYpvLvtTjpAjGPyj36U2BtM6ubr1WVYIU8yH7IRLsOrST5hrky7TSqZF+M6ZRn6glf3pNI7bcZwVzaBtEixyZRT8LhqO3m2mj/FM/RG4Rk7TNeJNZZmigoEXylfM2nob6sfJ1gXxbCtJXDmJJ9Q6kI/AjSaGP/knO7u7+Qe/+RFO+tJlKNNY8g/OHa/4LqF+uCqn2WoHZ3Qjf7KRQ//FCUm4hRJlj5lW4waWQpb14cA3zdzOKC0NZga6RZz6/itd0CISK2DeX5qrjtY1mKkT5QDvGFaN82FG/2lUjvm9GkdYKj8+cKxcCbkArJICqVHyNKrnsxUmGM86Ex38r9pII1l+K9djN1nI/WrmBAiDZtAzwGbJlreR9Gec6qYAqGVu684PQh1VgLviB3/ztytr9VxeXuhcyeu1s6sBvjEOSTlFUxxGxKy5FS0Q0nDaOvT9E8XIGUWnoMKc/kaIqMWO9SmcmVx8e5nq8ywSpoLDMbQ5p7iwUk1mBQNAVBub7BZrYwOoCq0e4oW6gXWx91n15uZpeS8mFkiD/sYIrC1oeW+3fuBr7UliY2M9sZLQAveRUUYd0IWRFq4eYNnBNPRccuR1rV/r6LTyKP0RTHMzUhlqX4mPh1Yygurh8DN3jKCZjXRmWC9ZoXOfbXJS2vWpyir7gq6b02meL3kmnhdgXEmkN7JjougLt/YGY7oBDvsYg05gYzG+nFCRFlgpVfXRcjDXzE15hxE/7LzJ5Eav9+VG/2IdJws4AlgXXCY5Pw2m7N174whIjeCsjEibXCZNJ81XKk88x2A86K9o2gGKkbRRpgyPNAZsgmk2SYSmpmQlH7lQnWjdH2ZqR+2OKIjCbDgxSHN4DC69fntrNIZNXjoRaGmggWgItF9QQzuxDVZe0PvGhm5yE+cEijgrHGGk3aUBfXHA5AmfN7UMh/ReCgFi5vHmo1b82c4u6KrZG5dy7pDTqZVDuNi5K+kPq3oFrCvFYpmzVdJljjotctQ2QuhsUgv5AOJucHhdK4wykuiP+jXGPlhxCWVfk8SbHKJPPTplIH1LzS191fdfeDkHN8BUriPYcELX6/WLDGkoZ7ywTrcVKHtjk8BKzt7j29LOowtNjMolxjxcJQCI+HesyJ0b5+pL9ZmWCVmYJTouqGZUgtliaKi3t8P4wiTUT3oVyw8tin5L0GR9f4Agq4DAlRxZqibiX07v6Mux+KVoQfhve6yszuMbNvm9l+qHYsH73pR1oAGmvVjM+7pTGnH6KizHVCtUiPhZktiTTWtWi1jjXRZHLaImiKmE9wPKlwTC3ZVzZruqCxQoPlw5HGmk4aqYsDKoOiax9FGm38NGkSOS4saCIVrInkFpyQMsoEdCo1Rs1MweYQ2HN+APzAzDZAnNw7oQ8zEphrZv9EmmoZwuQMFAkaBqxmZgciYZqOvtg/ElVql2Brd7+nhWN6Cg5E0cDrEHNw7DuNo6jFBpUc8wmpJphGKkRlLfixKTiOdOEbRSpYY6LtwdF1lgnWyiXX2Z/irLYRpIL1TAnPSRa9ngrUdPGtu2Dl4e73Avdm22Y2GBVRTkUrypjw2DD8HYdMytjBbKmr+L5FSKggdM+6+8sh8RtrrDHRvsGkgvUZ0sqMaaSarbens8ViU3AcKYPTENJK+rEUI4f5nBZIsOL0y7vuHp/nxUhoygSrrJjXkZsyteS5dqFDBStGCH0/QTNUZKG2r7kizIXh9JYP6Rkws0kogPONsGsYqY81Nto3gdScmkBaQzmUnMZaSGK+TGM9VHKuOIAyhmI7/Ue5XjyINFaoJS0IVVhI4omWw0kFq9CYGVilPqROgtUhbcrtwJFVvOZ5yqs+eio+E/7eFP6WaazRFAVrVdJK9yaK2oJwnrzG2pw01J2dP3/Dlw1iLzM/Z1PUbHFRQayxNqPcvxoY7StorFByFXdcDArnfopFSbBCl+dmVbz0am9+gFpPxDbAq+6eJYDjyBrIV8/ni1Yl9VPezvEKZliSoo+1DFHUNhTOErX3j6OYwwLoE10DpGZePGw9Fqwyrbc4GrKQxwiKof0mUq22fjj30yxKgkX1c3VvaPmQnoEQzt6cSisFQK+8vxFMpTgAsAqpxiobEL4JRY01hFTrlOWwxpKGwKeGCpA8ViMVpjxGUdRQA0revyBYISL5mrvnu6CbSs49BeXtFh2NZWaj0dSLtuI10pWyJ2MjpKHyghULSMxXAQqtLxCYULFeNk84jgoOJs0zlgnWMHI+VtBqs0oS0qtl1xEEIm4JGhW9X3OC9VxuewTiZsmjiVQ7vkBFY9U8l9UlBQuN7SyjSmsJfygJqfZkbBP+3pHbF/+mY0lvxncic7mJyC8Lzv0QWtZYhYhgoHMeGpmVTTTDEEXlhn+atMa0iaJPVyZY2bytDBlTc3yeOD/6GeCNwKvyNjXWWl1OsEL18tdbPLAccV6kp2Mb4FkXZ32GmMthLDmNFRpFY19nHKKay2MY0n6xxiozBfN0aatTXq3xWMn1L4ZmCo9E6ZbkfoyKdgdSUppFqrFiH3MEaeR5EhWhfp6eLlhopm21c4LLat16JMxsOZTPuyN6KhasCRRvxq1JV/RxpNG24ailI5/UbU6wrsltl/GdNJEGS0Dh9TlUNG+MMn6M+P0HRNc4gjQqWhb0WIzKAvMxPVmwzGwt2k7y8RBivIXWzyHuCTgE1ftdGO1vSbBWIc1zjSP1QUaQLlSfRLwWkHJbxOOdoLzmDyrh9V3iJ4LPFfd49cu3tZjZ8qT8gaNJBWsYKfHrXFSlAhKwmrCAZejUBHEewYE+i/LoVB6OAhS/BX7r7i8Ef2AVxGPX4xEaRL8AnO/uM3L7h5CaeRMprvIjSUuLxpHy+A0n1YZl9ZlZkjXDYNJIXxNRMXX4vbP77xMk/Hn/eDRpziw28eZE7w36vC9E+4aRRkZnU2n0nEPa9NkudCWNtS/qnSrDW8BV4Zjx7r6uu5+a8R6ERri/oMHdXWaxqCN2Rxrl1mj/SNLSnTgiVsYHMZZUY42kknTOWjjKvttYQw0hFYgmytv5PwzTTT6Nevksej6OQMbVFC+TCsQEyk3BuNFzNpVE9lxarj1tE7rSTfh/uf8dNS/egm6eh1oR7XsErYpLUv9RnZ2C4OQfQIVQ54XokLKQsUff3UjKi3RjwRqNpspkWKrkGFAdZ8xbEmuRJtKGxYlIAHZAEcPYhC3TWEuYWa9cRHNayXtl581jGGl1xmwqGnkOYexrrdBpgmVmX0YFtr9HJsZ09GFPAi4OlGdtwdWoRnBzuqBgBZ9hMHKaF0NmzeutSQ+EroAD0QiljAP/XFLtNJKUrCU2y0aSFtYOD/wleYymKEgrkvo8oHb+/HsMJo3ANZFWj2+Brv9U9Lv1ja61oLHMbCMkhFOpCNNSpFUXE0kr8oehUH0es6kEWuYgIa0ZOkWwQuHoKSgheETuqTOBy6oQKtz9fTO7CjjJzH5VUgHdoQim0zrIzPk0mkMVO/BzzOwVpEFeCY//IpMoq2/bCZUS5XExqkSPc31N5LSRmY0gvcmGU5kdtuDQko/QRDF4sQSR0AY/KfbpBpNq0iZSjZQRivZC7S4HU+SMH03geTfNtboWCV7+3phGrlsiYDbp5NChpOmErC0JtFDV1C3qLI11JmmWHURvdkzox7oIODcwl7YW56A2/b0Q5XKHI7TCHIkGareUze+LVuCpbXiLWYj64ABSwRpJMQIYRwQB/hnlvSD1uUClUXmhGUZ54jW+h5pI/ZW33D0OHmyENPeR7v5imHxyWu750cArIeGclanl2W5BGis2+56JNGh27fFn7JvbN4caWzkdHrwIX+BOLRy2BOo6fsnMzjOzmBikFO7+MKJH+46ZTW3PdbYVZjbAzL6Oko0/oGWhqhY/CySb40g14EIFK0RPyygNYjMQUk00jJTZdixpQGECadChLJq4LOqbO9PMxqPyprxPtxjScnegxtafkvaLFcY7mdlklPiNMZD0Xt+cSunTILpzVDDUjMUsQAvDAGQiPG5mt5vZZ4P5sTAcgr7IW1pxbE0QTJUZyF+ohky0tXgXTeAACVHc8zSZYiftBIoBgJFEwhG+o9bMoxoevxYJVhymLxOsghkY0gUrIGEBlRe94+55f2kQuvHfQDyS00n9tAkUF4CMtiFGvzwLcMCdVAhlJtF6DpVWoaM11v+hqF012BKFf582s72aExrX9L5j0Iq4bpXv1WqEpHYZ3VY9cHIuQdpUEnBYilRj5QMVZTmspYi0jpmtRGrONaexFnRqh99kYL7YNvBrxPfZsSjocF3Y/gy5kicz2xKNN70J+Gww/6aT01ihsv/FyOzrS0oKW0YCC/Kxsu+mTMu1Cx0mWCFg8Y0WD2wZSyP2p7+Z2cbNHHMeMiF+Y2YTmzmmXQim3zeQUxyTotQDr6EJlxmmhpaQPEZEbfMTSQUr1k5rk954ZSVIZZ3JYyiG7suGgI8kd7MH7X4kcFAubL4S8K4J3wZ+Axzq7sfljlma4jTIqaQRzziyCApcxIP0FhwbBHQs5bWMVaMjNdaPSUOe7cGawF1mdp1VpvgBCxh4Po9WpZtNvOE1gZn1MbNDkE1+CrX9TAvDCVFN3Md5jRXM7Dj8Pp5ixUETqZnWm/IayzLBiveNpdgyUmYGNlEMepyK/MQnwnVvh0y4QSjXtRWwmrsvqD8MGvTtaNGYRtqpXBaMa246zerhPpmAoqJxdLFd6BDBMrN10ESSemAn4AkzOyPfUxPaAbZDDW3/MI0bqhpmNszMvoraG84lJeKvJ54hVxMYfJSYY30v0pt6aESpPZJ0hNEQUo01nHLBirXRsKh2MNZgkGv9MLNtUD7sxLA9ETHYzkTBi7uBTdw9/mynkwYuRpFWU/Qlje611E2emYE17TrvKI11Ci3XALYHfVHH8TNmdlRQ77j7k6j8Zzhwo5ndYGZtohQ2s+XN7Bfopj2D6n3E9uDHUev7WMpZh2JhiL/zkaQ30OqkgrUmabX7UFLNFuem+lGusV4MEbvLkAmY5cM2RmbfucAS7n5yTKsQCGQ2Iw1cDCMdFN6XNJgSRzczXzD7/iahXF+cDmgX6p7HCjZ1c75QrTEC5UK+bGbHuftv3f1WM1sf5cW2B7Y3s4dRqdRf0Er4fpYfCf1KqyBeiF2ojnejOcxHDXfPIn/lPSoTON6L9vVG7RhNpCtzGVnLKqQ3fllfVIxBJa9bG31fecyNckiQshT3pVywHkJF09fmaenc/SpUA7owfB59jjjpO5x0UHh8PVA+9WY4lSqSScD9tW6Q7YgEcd2Gey0E01Dg4u/IN7nRzFZHSduvIbNjNXL1iWb2CXKyh1M7Tf46ihg+EP7OKGlPT2BiFboVCeA80hu/LFiyBDkn3dIRSVCeWxtIWuI0gZz2C0nvshU91lh9S841Ejgafa/H0gaEvNuhYbNs5FDMKlUmWGWL0GJUtPQy1Ni/gjoLlpntjSoEOgtrAr83s/8HfN/dTzGzMxCfxuHIDMrMpX60L6n7HjJNHiIIUwj9V4NzEJFLlmKITbVxpCbdoOi4MaQ3eZnGGhWZmQCzo9b64aT+FaQ3cj9SH2sUGja+bkl6oCXsgcLs75BWkHhgWY6vJzb9Vi85r1FZOLZA5mhNUW+NVdVY0zpgdTRW6GFUn3aZu18aaAA2D48tUKCjNXgL2fKPZI8Sh7sqmNkxqNdqd7SS9i65IceSjuVZnKJmG0259oiFqIxbJC5dSiKCwWeKNWJfigSfWb3kvlkUsLUI2urbKEWzWonwl5lua6BUSx6rkVbA9wL+Eyp6yvq32o26CZaZrY0+VFfCaojM8xEzOwG43t1/hQaVYxpm9ymkEYaGRy90o81EK+fDqI2l5tyFZrYTEvwd3f3mIPhlyc1x5IZrm9mKKCGeF6wxpObbq+4em1QxFTSkJUhlEcFVSNmZhhMEKwjGFch/uY62Yw90f/4MlYjFKAuG3ecahJjHFFJ/0VCFylZhu1rLolnUU2Md2vIhnYZVUdb/0SBg17nwLGkbQofAzHZBkxIPdveM6nkE5YIVU0ZnNXOxYMUaqzC7N0THyioVyjRWawRrHeCMUG1xOQrlH1/6GeKCAAASQElEQVRy/QtFTlsdgXzMuBUmu/xNgCXd/ZKwbzpwe3TcHFIfNROsryNro6Wh821GXcLtISH7+Xqcu8ZYGUWrnjKz42qZSG4LzOz/CGFnd/9l7qnhlCdv4+kh4xExS35fc6ZgHlMoUjGvjrRcrOmGlVzHcFLBmh5KjE5C/u1eVWr2rwFPuvstyD8rq75fBTXC5n2oFUuOm03aOgP6jBtTpymf9cpjdWRFQi0wHbFDvWhmt5jZ7qGSoe4IwZSvohU+npCyMI2VN9fGAz+PjilorKCJ4hKouHP4JzSfHI6bHF8lFazZZrY7Gja4UzU9ccGF+BYVJuRliHwkM8t84sUomnlxlzCouDYWrLdQf9xsiiNWa4aaC5ap27UaFtuugF6IHuxq4FUz27eeb2Zm30EFqBmPeBykaE6wyjRWnNOJW9tHkvolC6ouQlXEKsjfjBfFMsGaQipYTSjZu1tbgxXhGoah7/4nuWr04QTBMrNeZnYYanoEONXd8yH3Mr+rt6cD3bdFpVWXRmViNUNNBSvY1j9r8cDugRHApWZ2bUgw1wzhBjmOIFTu/hyKTsV1bcOJKiBC4e0AihXp40kjX6MpOuUjSUPRQ4B3TOxOZyGyngeBz5ZcR6zFlqc4JXIcyn8d7O63UR0uQMKRH8M0CXjO1Mf3d6SZh6Gk+QL/Ldx7rTU7VwiPug17r7XGOojyvEF3xs7AvWb2sJkdaOKuqBohgncvcpw3CzWNoBsoXnHjifWgKu/no0qBMsHyKBc1EvmTeQxG98DPUIT0D6hyYl1T526GQaQVFYMIGstEHnofcIS7tzknZGZ9QxBpN+CK6LqXQHO7/oBSAwcjrvpfl7DklmmfsrD8cOAOd68bN0rNBMvMmgjFlT0Uq6IV9RUz+6mZTW/rCUwjX+9ADX5/igpYm0jpzBKNhQTr5GjfgBJ/JhbSJtIkay/gOGA5KlUor4T9+Xab/5W0u/cBZgZ/56/Ad909Jg9tESEf9hhK2P8JLWJLmtlOZvYg8oX+h7T7CkioPkXKYTGYtJsZogbGcJ/uT+qT1hS11FgnUp7Z72kYjvqJnjKzm0JLQ4sI/tQhqPnyZtJh23M8nU9VprGmk6NxNvHyFXydUOUf+2tl+yYijfD5HL9FpkHzDLPNkc3sAVwPHOjul5cc0xqsj0rQhiKBuQWlPM5BbE+ruPuW7n5L0NJfRvftg9F54sHgGWLz8Bik3auZFNpq1CSPFfqhDqrFuboRDPki25jZZcB33D2Zdhh8g6+jfNGG7j7bzNaj2N4wllSAoNy32QxVT2R+yHjSJr2lKeccXDBxw8yWQVpqbw/EpwFl/UuFMH0Q5jEocbu9u8eMua2Gu19tZvehZG026+r+4HcWEAqkv4hSC7HZN5goBxm0U74SZBzSjLvXuug2Rq0SxEfRtVh1OxK9kGmxl5n9Ba2EN6IAw6loRb4f0WFnPsGqFCvWmyurKfhJZrYpqiHMJ2snkvpXS5P2azURQvQh9H4FcJG7x2NlM0qw/CzgBTWBoQzoyvC5t3P3/GyuqhBYoy5oxaHfQ1qpLIk/nLQLYCJF3/BbwGPufhN1RruFwTQkrq5h6W6CfmjVPRv5MnejEPgSqOUhr1VWpdguPonyspoFPljw6bLhD/kE7tSS1y5FucZ6P4S0f4NM0aNL3nMo8qnyGvQ5MxtjZiehyNwsFHhpt1C1Fma2KkocH0bU9BgqSE6lXLCyJssVUeDj23W/WGqjZb5G90oGdwSuBFZ09x+ENpF1KQrSUhSrwJvTWB+ZcABqPcn8njxN2FRSwRpXcr4m5Ms8hMqEtivprwL5dU9H+7YJ59sa2NXd13P32MepG4IPegEqPbuRNNI3BBhXkq8aiSj0hqIStvvd/U91v2CqNAVD8+LewD6kLK2LMmagFf97HggqQ2/V8Cg0PD+y8SciTRBjHKLpihtFL879P5VUsJpK9o1EEckrUa4pmf0brvVrqBN7c6SBt0ZNl/sQaipLrrPe+B6idtsubC8fPT+QcsKY8SjF8Cv0PX2hPpdXAndv1QOtZAegH3o+WjUaDz3uQYEJgL9E39s6wNW57SHAldExv0JTVLLtzVHkcV7Jez0QvfY2VF2Q33dVtP1ZVOv37RZ+412i97qL0MHb2vuk1g8UefwY2CBsDwX+Fh0zDTir5LXnobrFOajEqsOue6EaK/hPO1JpUS/r0ARFvGahla030oR9STtMexrmolDzZbCgJCeuAl8R3fwZppL6AmMI0T8zOxrlqZoz02PC074l2ueDcK6B6MZaFZG0xO8b40n0e88CnvO0xaRDYSIhuhj4srtnXb5jSSnOBlLO5jsKKYP9PQ3S1BWlgmVmuwFfQiZIRmM8HzX13YOIPV4Oj1e8mc5QE5fgsigBuRxK8k2u4fV3Bh5BOZY/A1/IhCpgDdJC2qWRY51hKqnZ0g84xDSBZWF5sdfJdbsupIxnnJmdiGrizgS+1hoTzt3/WXJtnYJw79wA3ODuedN3DGmz5iCi78E0EGJd4EavPsdWNRYIVviRtkah883D7jeRmXILaiJrU2u1q5DyJcS9nXHfZZGdTmnRaCM+RBG9fyCB2srdd86etMAGlcNaKPmbx5teKVsCCdZfQk5lZ+BzwAZozlRLuMyLAYfxFLkpJqM+uM8if+Ts6KbsFjBxbNyIgjWx1hxDml4YSE7YTFzwtyHt1powfs3RJ1zI3sB3UbTqExRBuQy4xYsTJ9oFV07mR2b2Y9SvcygK1XeF2cFzUDj7Zyg0/nXg5+6e5X4GAZtmB5vZyqQm3TQ0RC2Pp0Lj3hT0/W6F/IZ1aHtU9s5oeypqddkMJT63p/hdPkA3Q1jgr0T5tPNJudjHkFZNDKRiSi9Ppa5wC3e/s57X2xz6mNnBKOl4HsoP/D27meqFYJbMAGaY2enIp4grqjsafVGkc2+0Is5BdYGvolzIahTzJ9sRzLKQRxmAFqq1QxJ1BeRfrYBuhub809bgGZQYfTC83wQ0BmcP1Jf0zWZe1+0EC40oWgdp8GNI6/+WIuUTHIQWmC8js/t+YE9PyWY6Dp0V7SmJ4GyKhK2zI3wtPV5FydVsey71jZK+RmCbAi5FVQeted2bnf2bVnEP7BC+21XC9q3AptExtwBTo337I2Gbj8qsOi2KueCaOvsCoi/IEFXyO628eRqP5h83dfbv2cbffpWwiGyQ2/cginrmj3sJ6J/bnoSS3u8jEp5O/yzu3rXq+1y4knQIWQNtR7f5/sxsPxRN3d8rYXWAZz3n44cescEe6ieDb/kQyg2u6+7Xd9xVLxxdSrAyuIguN0Z00d7Jl9NdUde2iFrAzIaa2aXAJcB/3P3W3HMTSSssRgP/NbM1zewmVElyN7C2i6e/y6CzZhC3iLBSHW1md6IIZb1Gj/ZEzHD3mOu8SyFwbJyPCGH2othYCSqViwlB30OR1xnI1/ysV6jiuhS6pMbKw1XivyrpFIkGmkebO3k7EoHv42YUvVsWpTkGR4dl+zOOkINRGmQu4rpYoasKFXQDwQJwJZo3Rrm2sukRDVTwIYHZt6shcFscjsLoB7v759z9HZSSiJtEl0U5wOMRW++P0GSS5V1dA2Uknl0HnR09qSJ6tBZqa+jsqFtXfVzS2b9RM7/bTqhrehaaAJN/7gvAp3Lbo1C1/3xEvLMPuUhgd3h0C42Vh7vPQFHDmPy+AWGamV1sZl+phvCm1jCzdczsbpSDOx118cZD5FZEQwq2MrOLUKPov4CV3X0Dd7/cUz6Qro3Olux2roJfQqZhZ2uJrvx4HhUN7wAM6cDfZkXkIzkaRDE+7D8XmJI7bjBqT/kwHHsXsFZn31vt/vydfQE1+AG3RsnBzr6Bu8JjTgvPf4LqDY8D1gP61eH32AoNJpiLWmgOiZ6/BXU4fBlVVsxGBQHXImKaTr+nGoJV+bFWQvV9nX1jd+bjERSyPg0lWx9FBcFPU9EG8WMWygP9GNU+NlX5/S+G+p4eR71Sl6Fw+SlBiAagBfCniFTTw9/rUStR71reD13hYeGL6fYILRz7oXGcnTGAuzPxAbCGN8PsGoqExyNOwuloysoq4e+Q6PCnUMDgHuA2T+dN5c+bVenvgQqNZyMBehT5wRciU3Q9pMH+iDTm/Wh8Ts06J7oaeoxgZQjUXqegvq9FBXu5BmW3CUHglkBCtgryi5ZCC9MQpFluBj7nEY+faeTPQ82cei7i3HgGCeptwJ+9q4fIa4geJ1gZwmr6C8Q315PxO881X9YKgZZhSVTp8LK7/7XkmAnI5GtC2moWYnN6oSdro9agxwoWLKBa/jbqWO6J/BvvooRps+ZaA52DbpfHagvc/R13Pwpl8X+FTJuegnnAYQ2h6pro0RorhpmtgfyvzTr7WtqJV1GHbDxxo4EugroIViCjXw45sXNRfqXs/2y7movIaNZa+xgIPOPu/w6V1SezcEakropbETtUPCe4gS6EegnWN+mas7IW+CSBtGQ7NCUlY3vtypiL/MVTfFEyM7op6iVYfybHaFRnzEYC8y6aE/Vu9HgbzXz6L3CPp/zeWVPdF1GSsyvyHjqwh7v/usUjG+gSqLlgmdkAdIMv1sqXOGIgmtnCIxaYmcC7XsPizEBTthtKMq9aq/O2E8+j2Vt1me7eQH1QD8FaHBV8vo84t2dHf/P/f4SEIyHo70wEM/EbwAl0Xpj+XlQCdH1X+34aaBn1EKwd0JDnLWp64k6AmS2JmGp3Qn1gZSNDa4lHUUX4Nd7JvOkNtA/1EKyd0LTADdz9kZqevBMRqgx2REK2CbXjC3FU8vNNd3+4pYMb6B5ot2CF2rxNEN/7pohcsg/wLXc/qZXnmIiqnAeispiPgefLymi6AgLh/rYomrg6KmxtTbLd0dCB+8LjEeDpuA6vge6Pdq26YXD1ZaiVOkbZtMD8a/sgfvRdEefB31Dh5ghEezXNzP6JRo/+0jUZsUvA3WcCl4dHxuu+MipiHY4KWAeHv2+i1o2ngX96nem7G+gaaK85cyzlQgUpndUChBvxt6jl4CzgM3HCM2ixzYBDgMPNbO2uJFx5uPuHqBXi/s6+lga6BtplCprZEsicGVry9JvAhLjKOcyD/RNqftve3Z9v4T3GINqru91916ovtoEGOhDtKsINQnFKM0+PpjwX9GnU87NeS0IV3uMNNO18FzP7arXX2kADHYlaVLefh4INZXi7ZN8GaFRQUgHRHNz9BuTPHB1yTA000KXR7pvUNa3wt808HVMEg+YelU2IbwnnIb9tqype20ADHYparf7NCVah7i4Mm16V6gTrflTzd1gIfjTQQJdFrZKctyFCk5h/ewphCmHAOuE9m+NKaBbuPt/Mbkasqe+Y2f1oVtL7aFriMBTqHp77fwCiJ97B3WMK4wYaqBtqIlju/rGZ/QHYPXpqUrS9HvCWa0xPNbgJCVY/lJQuw8tout9jSNifawhVAx2NWo7x+S2pYI2NtoeRDmtuC17O/T8HVTE8QmWq/T/cvSxg0kADHYpaCtaNaNTl4rl9sWD1QoOYq0XmE2YT7Rda3dFAA52FmoWuA2fcT6LdY6JtI/XD2oKsuvzVhlA10JVR65zQpYg9KEOZxhpgZktVef7sehut6Q10adRUsEJxaj53FQtWVsW9XpVvkQVDnq3y9Q000CGoRxXD2bn/Rwca4wwZt/g2VZ57J1Tl8Y8qX99AAx2CegjW1bn/+6I2kAxPh7+7m1k8EX2hMLOlUQ/U/Ys6fXEDXR/1EKwsf5QhH8DIBKsXcGogb2kRoWIjm7D+u1pcZAMN1BM1F6xAfPK33K7RuefepTImcxvgGjNbKJuTma2LfKpPhV3X1+xiG2igTqhXpXi+4S9mOfoiSu4C7Azca2ZfNLNh+YPMbLyZ/RDlx8aF3X9395fqccENNFBLdIRgFZLQ7v4P4Ae5XWsAFwGvm9m/zexFM3sDjYP5FsUO5Yvqc7kNNFBb1LLyIo88O1PZe/wIzVT6CpWk72KoAbIMHwIHVzNcrYEGOgP10livUml+TATL3ee6+5GImen1Fs71L2DdhlA10J1QF8EKpP1Z232zWtHdb0VTSY4Cnoye/gfwHWAtd3+8HtfZQAP1Qr1MQVAkb7mW3iNUa/wU+GkYzzkfmOPu79fx2hpooK6op2A919b3aMx8aqCnoJ7ELPeEv/UU3gYa6JKop2D9KfxtCFYDixzqJljBd/oQ6F+v92igga6KenP0PUnXnJDYQAN1Rb3NtDMQz0UDDSxS+P/SuwD4nierXwAAAABJRU5ErkJggg==" />
+
+
+			<h1>Bismark Processing Report</h1>
+	
+			<div class="subtitle">
+				<h3>/private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmpDiq_J8/files/000/dataset_2.dat</h3>
+				<p>Data processed at 14:27 on 2018-08-21</p>
+			</div>
+			
+		</div>
+	
+		<hr id="header_hr">
+	
+	
+
+	<h2>Alignment Stats</h2>
+		<table>
+			<tbody>
+				<tr>
+					<td style="vertical-align:top">
+						<table class="data">
+							<tbody>
+								<tr>
+									<th>Sequences analysed in total</th>
+									<td>44115</td>
+								</tr>
+							</tbody>
+							<tbody>
+								<tr>
+									<th>Single-end alignments with a unique best hit</th>
+									<td>554</td>
+								</tr>
+								<tr>
+									<th>Sequences without alignments under any condition</th>
+									<td>43115</td>
+								</tr>
+								<tr>
+									<th>Sequences that did not map uniquely</th>
+									<td>446</td>
+								</tr>
+								<tr>
+									<th>Genomic sequence context not extractable (edges of chromosomes)</th>
+									<td>0</td>
+								</tr>
+							</tbody>
+						</table>
+					</td>
+					<td>
+						<div id="Bismark_Processing_Report"><!-- Plotly chart will be drawn inside this DIV --> </div>
+					</td>						
+				</tr>
+			</tbody>
+		</table>
+					
+	<hr>
+	
+	<h2>Cytosine Methylation</h2>
+	
+	<table>
+		<tbody>
+			<tr>
+				<td>
+					<table class="data">
+						<tbody>
+							<tr>
+								<th>Total C's analysed</th>
+								<td>8563</td>
+							</tr>
+						</tbody>
+						<tbody>
+							<tr>
+								<th>Methylated C's in CpG context</th>
+								<td>245</td>
+							</tr>
+							<tr>
+								<th>Methylated C's in CHG context</th>
+								<td>51</td>
+							</tr>
+							<tr>
+								<th>Methylated C's in CHH context</th>
+								<td>114</td>
+							</tr>
+							     <tr>
+                                <th>Methylated C's in Unknown context</th>
+    				<td>1</td>
+    			</tr>
+						</tbody>
+						<tbody>
+							<tr>
+								<th>Unmethylated C's in CpG context</th>
+								<td>133</td>
+							</tr>
+							<tr>
+								<th>Unmethylated C's in CHG context</th>
+								<td>1762</td>
+							</tr>
+							<tr>
+								<th>Unmethylated C's in CHH context</th>
+								<td>6258</td>
+							</tr>
+							     <tr>
+                                <th>Unmethylated C's in Unknown context</th>
+    				<td>5</td>
+    			</tr>
+						</tbody>
+						<tbody>
+							<tr>
+								<th>Percentage methylation (CpG context)</th>
+								<td>64.8%</td>
+							</tr>
+							<tr>
+								<th>Percentage methylation (CHG context)</th>
+								<td>2.8%</td>
+							</tr>
+							<tr>
+								<th>Percentage methylation (CHH context)</th>
+								<td>1.8%</td>
+							</tr>
+							     <tr>
+                                <th>Methylated C's in Unknown context</th>
+    				<td>N/A%</td>
+    			</tr>
+						</tbody>
+					</table>				
+				</td>
+				<td>
+					<div id="Cytosine_Methylation" class="bargraph"><!-- Plotly chart will be drawn inside this DIV --></div>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+			
+	<hr>
+
+	<h2>Alignment to Individual Bisulfite Strands</h2>
+	<table>
+		<tbody>
+			<tr>
+				<td style="vertical-align:top">
+					<table class="data">
+						<tbody>
+							<tr>
+								<th>OT</th>
+								<td>230</td>
+								<td>original top strand</td>
+							</tr>
+							<tr>
+								<th>CTOT</th>
+								<td>0</td>
+								<td>complementary to original top strand</td>
+							</tr>
+							<tr>
+								<th>CTOB</th>
+								<td>0</td>
+								<td>complementary to original bottom strand</td>
+							</tr>
+							<tr>
+								<th>OB</th>
+								<td>324</td>
+								<td>original bottom strand</td>
+							</tr>
+						</tbody>
+					</table>			
+				</td>
+				<td>
+					<div id="Strand_Plot" class="bargraph"> <!--Plotly chart will be drawn inside this DIV --> </div>
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	
+	<hr>
+	
+	<!-- This section is optional -->
+	
+	<h2>Deduplication</h2>
+	<table>
+		<tbody>
+			<tr>
+				<td style="vertical-align:top">
+					
+					<table class="data">
+						<tbody>
+						<tr>
+							<th>Alignments analysed</th>
+							<td>554</td>
+						</tr>
+						<tr>
+							<th>Unique alignments</th>
+							<td>504</td>
+						</tr>
+						<tr>
+							<th>Duplicates removed</th>
+							<td>50</td>
+						</tr>
+						</tbody>
+						<tbody>
+							<tr>
+								<td colspan="2" style="text-align:left;">Duplicated alignments were found at <strong>44</strong> different positions</td>
+							</tr>
+						</tbody>
+					</table>			
+				</td>
+				<td>
+				 	<div id="Duplication_Plot"> <!--Plotly chart will be drawn inside this DIV --> </div>	
+				</td>
+			</tr>
+		</tbody>
+	</table>
+		
+	<hr>
+	
+	
+	<!-- This section is optional -->
+	
+	<h2>Cytosine Methylation after Extraction</h2>
+
+	<table>
+		<tbody>
+			<tr>
+				<td>
+					<table class="data">
+						<tbody>
+							<tr>
+								<th>Total C's analysed</th>
+								<td>8563</td>
+							</tr>
+						</tbody>
+						<tbody>
+							<tr>
+								<th>Methylated C's in CpG context</th>
+								<td>245</td>
+							</tr>
+							<tr>
+								<th>Methylated C's in CHG context</th>
+								<td>51</td>
+							</tr>
+							<tr>
+								<th>Methylated C's in CHH context</th>
+								<td>114</td>
+							</tr>
+							
+						</tbody>
+						<tbody>
+							<tr>
+								<th>Unmethylated C's in CpG context</th>
+								<td>133</td>
+							</tr>
+							<tr>
+								<th>Unmethylated C's in CHG context</th>
+								<td>1762</td>
+							</tr>
+							<tr>
+								<th>Unmethylated C's in CHH context</th>
+								<td>6258</td>
+							</tr>
+								
+						</tbody>
+						<tbody>
+							<tr>
+								<th>Percentage methylation (CpG context)</th>
+								<td>64.8%</td>
+							</tr>
+							<tr>
+								<th>Percentage methylation (CHG context)</th>
+								<td>2.8%</td>
+							</tr>
+							<tr>
+								<th>Percentage methylation (CHH context)</th>
+								<td>1.8%</td>
+							</tr>
+							
+						</tbody>
+					</table>				
+				</td>
+				<td>
+					<div id="Cytosine_Methylation_postDuplication" class="bargraph"> <!--Plotly chart will be drawn inside this DIV --> </div>	
+				</td>
+			</tr>
+		</tbody>
+	</table>	
+
+	<hr>
+	
+		
+	<!-- This section is optional -->
+	
+	
+	
+	<!-- This section is optional -->
+	
+	<h2>M-Bias Plot</h2>
+	
+	<table>
+		<tbody>
+			<tr>
+				<td>
+				 	<div id="mbias1_plot"> <!--Plotly chart will be drawn inside this DIV --> </div>	
+				</td>
+			</tr>
+		</tbody>
+	</table>
+	
+
+	<hr>
+	
+	
+	<!-- This section is optional -->
+	
+
+
+	
+	<!-- ######################### PLOT.LY plotting code below ################################################################# -->
+
+	<!-- Alignment Stats Plot -->	
+	<script>
+		<!-- JAVASCRIPT CODE GOES HERE -->
+		
+		var data = [{
+			values: [554,43115,446,0],
+			labels: ['Unique Alignments', 'No Alignment', 'Multiple Alignments', 'No Genomic Sequence'],
+			type: 'pie',
+			name: 'Alignment Statistics',
+			hoverinfo: 'label+value+percent',
+			direction: 'clockwise',
+			pull: [0.05,0,0,0],
+			sort: false,
+			marker: {
+    			colors: ['#0d233a', '#2f7ed8','#8bbc21','#910000','#1aadce','#492970','#f28f43','#77a1e5','#c42525','#a6c96a'],
+    			line:{
+					width: 1,
+					color:'black',
+				},
+  			},
+		}];
+
+		var layout = {
+			margin: {
+			    l: 50,
+			    r: 0,
+			    b: 0,
+			    t: 50,
+			    pad: 0,
+			},
+			font: {
+        		size: 16,
+      		},
+			<!-- paper_bgcolor: '#7f7f7f', --> 
+  			<!-- plot_bgcolor: '#c7c7c7',  -->
+			height: 450,
+			width:  600,
+			showlegend: true,
+  			legend: {
+    			x: 0.9,
+    			y: 1.05,
+  				font: {
+        			size: 14,
+        			color: 'black',
+      			},	
+  			},
+		};
+
+		Plotly.newPlot('Bismark_Processing_Report', data, layout, {displaylogo: false}, {modeBarButtonsToRemove: ['toImage',
+					'sendDataToCloud',
+					'resetScale2d',
+					'hoverClosestCartesian',
+                    'hoverCompareCartesian',
+                    'toggleSpikelines']},
+					);
+	</script>
+
+	<!-- Duplication Plot (Donut Plot)-->	
+	<script>
+		
+		var data = [{
+			values: [504,50],
+			labels: ['Unique Alignments', 'Duplicate Alignments' ],
+			textinfo: ['Unique Alignments', 'Duplicate Alignments' ],
+			name: 'Degree of Duplication',
+			hoverinfo: 'label+value+percent',
+			hole: .3,	
+			type: 'pie',
+			direction: 'clockwise',
+			pull: [0.05,0],
+			sort: false,
+			marker: {
+				line:{
+					width: 1,
+					color:'black',
+				},
+				colors: ['#0d233a', '#2f7ed8'],
+			}
+	 	}];
+
+		var layout = {
+			<!-- paper_bgcolor: '#7f7f7f', -->
+  			<!-- plot_bgcolor: '#c7c7c7',  -->
+  			font: {
+        		size: 16,
+        		color: 'white',
+      		},
+      		margin: {
+			    l: 0,
+			    r: 0,
+			    b: 0,
+			    t: 0,
+			    pad: 0,
+			},
+			showlegend: true,
+  			legend: {
+    			x: .25,
+    			y: -0.05,
+  			        "orientation": "h",
+  				font: {
+        			size: 14,
+        			color: 'black',
+      			},	
+  			},
+		};
+
+		Plotly.newPlot('Duplication_Plot', data, layout, {displaylogo: false}, {modeBarButtonsToRemove: ['toImage',
+					'sendDataToCloud',
+					'resetScale2d',
+					'hoverClosestCartesian',
+                    'hoverCompareCartesian',
+                    'toggleSpikelines']});
+	</script>
+
+	<!-- Cytosine Methylation Plot -->
+	<script>
+		var data = [
+		  {
+			x: ['CpG context', 'CHG context', 'CHH context'],
+			y: [64.8,2.8,1.8],
+			type: 'bar',
+			marker: {
+				color: ['#0d233a', '#2f7ed8','#2f7ed8'],
+	 			<!-- colors: ['#0d233a', '#2f7ed8','#8bbc21','#910000','#1aadce','#492970','#f28f43','#77a1e5','#c42525','#a6c96a'], -->
+   				line: {
+     				color: 'black',
+      				width: 1
+    			},
+   			}	
+		  }
+		];
+		
+		var layout = {
+			<!-- paper_bgcolor: '#7f7f7f', -->
+  			<!-- plot_bgcolor: '#c7c7c7',  -->
+  			width: 600,
+  			margin: {
+			    l: 100,
+			    r: 50,
+			    b: 50,
+			    t: 50,
+			    pad: 0,
+			},
+			yaxis: {
+				range: [0, 100],
+				title:' % Methylation',
+			}
+		};
+
+		Plotly.newPlot('Cytosine_Methylation', data, layout, {displaylogo: false}, {modeBarButtonsToRemove: ['toImage',
+					'sendDataToCloud',
+					'resetScale2d',
+					'hoverClosestCartesian',
+                    'hoverCompareCartesian',
+                    'toggleSpikelines']});
+	</script>
+
+	<!-- Cytosine Methylation Plot post duplication-->
+	<script>
+
+		var data = [
+		  	{
+				x: ['CpG context', 'CHH context', 'CHG context'],
+				y: [64.8,2.8,1.8],
+				type: 'bar',
+				marker: {
+					color: ['#0d233a', '#2f7ed8','#2f7ed8'],
+	 				line: {
+     					color: 'black',
+      					width: 1
+    				},
+				}	
+		  	}
+		];
+
+		var layout = {
+			width: 600,
+			<!-- paper_bgcolor: '#7f7f7f', -->
+  			<!-- plot_bgcolor: '#c7c7c7',  -->
+  			margin: {
+			    l: 100,
+			    r: 50,
+			    b: 50,
+			    t: 50,
+			    pad: 0,
+			},
+			yaxis: {
+				range: [0, 100],
+				title:' % Methylation',
+			}
+		};
+
+		Plotly.newPlot('Cytosine_Methylation_postDuplication', data, layout, 
+					{displaylogo: false}, 
+					{modeBarButtonsToRemove: 
+					['toImage',
+					'sendDataToCloud',
+					'resetScale2d',
+					'hoverClosestCartesian',
+                    'hoverCompareCartesian',
+                    'toggleSpikelines']
+					}
+		);
+	</script>
+
+	<!-- Strand Alignment Plot-->
+	<script>
+		var data = [
+		  {
+			x: ['OT', 'CTOT', 'CTOB', 'OB'],
+			<!-- y: [49, 1, 2, 48], hardcoded for testing purposes -->
+			y: [230,0,0,324],
+			type: 'bar',
+			marker: {
+				color: ['#0d233a', '#2f7ed8','#2f7ed8','#0d233a'],
+	 			line: {
+     				color: 'black',
+      				width: 1
+    			},
+   			}	
+		  }
+		];
+
+		var layout = {
+			<!-- paper_bgcolor: '#7f7f7f',  -->
+  			<!-- plot_bgcolor: '#c7c7c7',   -->
+  			margin: {
+			    l: 100,
+			    r: 50,
+			    b: 50,
+			    t: 15,
+			    pad: 5,
+			},
+			yaxis: {
+				title: 'Number of Alignments',
+				zeroline:true, 
+				<!-- hoverformat: '.2r', -->
+			}
+		};
+
+
+		Plotly.newPlot('Strand_Plot', data, layout, {displaylogo: false}, {modeBarButtonsToRemove: ['toImage',
+					'sendDataToCloud',
+					'resetScale2d',
+					'hoverClosestCartesian',
+                    'hoverCompareCartesian',
+                    'toggleSpikelines']});
+	</script>
+
+	<!-- Nucleotide Stats Plot-->
+	<script>
+	  	var trace1 = {
+	  		x: [{{nucleo_sample_x}}], 
+	  		y: [{{nucleo_sample_y}}],
+	  
+	  		name: 'Percent Sample', 
+			marker: {
+				color: '#2f7ed8',
+				line:{
+					width: 1,
+					color:'black',
+				},
+			}, 
+		  	type: 'bar',
+		  	orientation: 'h'
+	  	};
+	  
+		 
+		var trace2 = {
+	  		<!-- x: [20, 14, 23, 7], testing -->
+	  		<!-- y: ['A', 'T', 'C', 'G'], testing -->
+	 		x: [{{nucleo_genomic_x}}], 
+	  		y: [{{nucleo_genomic_y}}],
+
+	  		name: 'Percent Genomic', 
+	  		marker: {
+	  			color: '#0d233a',
+	  			line:{
+					width: 1,
+					color:'black',
+				},
+			}, 
+	  		type: 'bar',
+	  		orientation: 'h'
+	  	};
+	  
+	  	var data = [trace1, trace2];
+	  
+	  	var layout = {
+	  		height: 700,
+	  		width:  700,
+ 
+	  		xaxis: {
+	  			tickfont: {
+	  				size: 14, 
+	  			}
+	  		}, 
+	  		yaxis: {
+	  			title: '(Di-)Nucleotide',
+	  			autorange: 'reversed',
+	  			titlefont: {
+	  				size: 18, 
+	  			},
+	  			tickfont: {
+	  				<!-- family: 'Courier New, monospace', -->	
+	  				size: 14, 
+		  		}
+	  		}, 
+	  		showlegend: true,
+	  		legend: {
+	  			"orientation": "h",
+	  			x: 0.15, 
+	  			y: -0.05, 
+	  			font: {
+        			size: 16,
+        			color: 'black',
+      			},	
+			},
+	  
+	  		barmode: 'group', 
+	  		bargap: 0.15, 
+	  		bargroupgap: 0.1
+	  	};
+	  
+	  	Plotly.newPlot('nucleo_plot', data, layout, {displaylogo: false},{modeBarButtonsToRemove: ['toImage',
+					'sendDataToCloud',
+					'resetScale2d',
+					'hoverClosestCartesian',
+                    'hoverCompareCartesian',
+                    'zoom',
+                    'toggleSpikelines']});
+	
+	</script>
+
+	<!-- M-bias Plot 1 -->
+	<script>
+		var trace1 = {
+	  		<!-- x: [1, 2, 3,4,5,6,7,8,9,10], just for testing -->
+	  		<!-- y: [40, 50, 60,50,35,40,45,61,55,33], just for testing -->
+	  		<!-- colors: ['#0d233a', '#2f7ed8','#8bbc21','#910000','#1aadce','#492970','#f28f43','#77a1e5','#c42525','#a6c96a'], -->
+	  		<!-- colors: [ '#CCF0E1','#EDD3A8','#69798A','#21BCA2','#F29D13','#0d233a','#f28f43','#77a1e5','#c42525','#a6c96a'], -->
+	  		x: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85],
+	  		y: [75.00,80.00,77.78,71.43,75.00,50.00,55.56,87.50,60.00,100.00,80.00,66.67,50.00,100.00,75.00,66.67,60.00,62.50,80.00,66.67,25.00,33.33,50.00,100.00,100.00,66.67,60.00,66.67,75.00,75.00,100.00,75.00,66.67,75.00,66.67,40.00,63.64,80.00,80.00,44.44,55.56,71.43,25.00,0.00,80.00,100.00,60.00,50.00,50.00,60.00,33.33,100.00,66.67,100.00,100.00,50.00,100.00,0.00,57.14,50.00,0.00,40.00,100.00,66.67,,75.00,100.00,66.67,100.00,60.00,60.00,75.00,100.00,63.64,75.00,100.00,25.00,0.00,0.00,25.00,50.00,0.00,60.00,75.00,50.00],
+	  		name: 'CpG methylation',
+	  		line: {
+	  			width: 5,
+	  			color: '#0d233a',
+	  		},
+	  		type: 'scatter',
+	  		yaxis: 'y',
+		};
+
+		var trace2 = {
+			x: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85],
+	  		y: [32.26,31.43,20.00,16.67,7.14,0.00,0.00,0.00,0.00,0.00,0.00,7.14,0.00,4.17,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,7.69,0.00,0.00,0.00,0.00,0.00,0.00,0.00,3.33,4.00,0.00,0.00,0.00,5.00,8.33,0.00,0.00,4.35,0.00,4.55,3.03,5.88,7.14,0.00,0.00,0.00,2.86,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,6.25,5.00,5.56,0.00,0.00,0.00,0.00,0.00,0.00,6.67,0.00,0.00,0.00,0.00,5.56,0.00,5.56],
+	  		name: 'CHG methylation',
+	  		yaxis: 'y',
+	  		type: 'scatter',
+	  		line: {
+	  			width: 5,
+	  			color: '#F29D13',
+	  		},
+		};
+
+		var trace3 = {
+			x: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85],
+	  		y: [36.73,16.67,11.43,9.68,12.20,6.52,3.70,1.59,3.70,1.72,1.67,0.00,6.78,0.00,1.52,1.33,1.22,1.39,1.37,1.27,0.00,1.43,0.00,1.05,1.27,1.11,0.00,0.00,0.00,1.61,0.00,0.00,3.61,1.16,0.00,2.86,1.59,0.00,1.14,1.28,0.00,2.82,0.00,2.56,3.41,2.82,0.00,0.00,0.00,0.00,0.00,1.52,0.00,3.23,1.23,1.20,1.28,0.00,1.18,1.04,1.18,0.00,1.12,0.00,1.28,3.26,1.43,2.00,2.13,0.00,1.14,1.19,0.00,2.63,1.27,0.00,3.66,1.39,0.00,0.00,1.18,0.00,2.47,2.41,3.08],
+	  		name: 'CHH methylation',
+	  		yaxis: 'y',
+	  		type: 'scatter',
+	  		line: {
+	  			width: 5,
+	  			color: '#21BCA2',
+	  		},
+		};
+
+		var trace4 = {
+	  		
+	  		x: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85],
+	  		y: [12,5,9,7,4,4,9,8,5,2,5,6,2,4,4,3,5,8,5,3,4,3,2,5,3,6,5,3,8,4,1,4,6,4,3,5,11,5,5,9,9,7,4,1,5,5,5,2,4,5,6,1,3,1,3,2,2,1,7,8,1,10,4,3,0,4,2,3,4,5,5,4,3,11,4,1,4,1,3,4,2,2,5,4,2],
+	  		name: 'CpG total calls',
+	  		type: 'scatter',
+	  		yaxis: 'y2',
+	  		opacity: 0.4,
+	  		line: {
+	  			width: 1.5,
+	  			color: '#0d233a',
+	  		},
+		};
+
+		var trace5 = {
+			x: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85],
+	  		y: [31,35,25,12,14,17,27,22,22,26,22,14,14,24,30,17,24,23,14,26,23,25,22,18,20,17,26,22,24,21,21,22,25,15,30,25,30,16,27,20,24,20,20,23,25,22,33,17,28,19,18,20,35,27,24,14,19,19,21,20,25,25,29,21,26,19,20,7,16,20,18,10,22,25,14,24,18,15,16,17,12,17,18,25,18],
+	  		name: 'CHG total calls',
+	  		yaxis: 'y2',
+	  		type: 'scatter',
+	  		opacity: 0.4,
+	  		line: {
+	  			width: 1.5,
+	  			color: '#F29D13',
+	  		},
+		};
+
+		var trace6 = {
+			x: [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85],
+	  		y: [49,30,35,31,41,46,54,63,54,58,60,70,59,68,66,75,82,72,73,79,82,70,85,95,79,90,72,84,72,62,79,88,83,86,79,70,63,77,88,78,70,71,66,78,88,71,68,81,73,79,81,66,79,93,81,83,78,71,85,96,85,95,89,89,78,92,70,100,94,94,88,84,87,76,79,74,82,72,66,71,85,88,81,83,65],
+	  		name: 'CHH total calls',
+	  		yaxis: 'y2',
+	  		type: 'scatter',
+	  		opacity: 0.4,
+	  		line: {
+	  			width: 1.5,
+	  			color: '#21BCA2',
+	  		},
+		};
+
+		var data = [trace1, trace2, trace3, trace4, trace5, trace6];
+
+		var layout = {
+	  		title: 'Read 1',
+	  		titlefont: {
+			      	size: 24,
+			      	color: 'black'
+			},
+	  		yaxis: {
+	  			title: '% Methylation',
+	  			range: [0, 100],
+	  			visible: true,
+	  			titlefont: {
+			      	size: 18,
+			      	color: 'black'
+			    },
+			    showline: true,
+	  		},
+	  		width: 1200,
+	  		height: 600,
+	  		yaxis2: {
+	    		title: '# Methylation Calls',
+	    		tickfont: {color: 'black'},
+	    		overlaying: 'y',
+	    		side: 'right',
+	    		separatethousands: 'y',
+	    		zeroline: false,
+	    		visible: true,
+	    		showgrid: false,
+	    		showline: true,
+	    		titlefont: {
+			      	size: 18,
+			      	color: 'black'
+			    },
+	  		},
+	  		xaxis: {
+	  			title: 'Position in Read [bp]',
+	  			titlefont: {
+			      	size: 18,
+			      	color: 'black'
+			    },
+			    showline: true,
+	  		},
+	  		showlegend: true,
+		  	legend: {
+		    	x: 0.85,
+		    	y: 1.2
+		  	},
+		};
+
+		Plotly.newPlot('mbias1_plot', data, layout,{displaylogo: false}, {modeBarButtonsToRemove: ['toImage',
+					'sendDataToCloud',
+					'resetScale2d',
+					'hoverClosestCartesian',
+                    'hoverCompareCartesian',
+                    'toggleZoom',
+                    'toggleSpikelines']});
+	</script>
+
+	<!-- M-bias Plot 2-->
+	<script>
+		var trace1 = {
+	  		<!-- x: [1, 2, 3,4,5,6,7,8,9,10], just for testing -->
+	  		<!-- y: [40, 50, 60,50,35,40,45,61,55,33], just for testing -->
+
+	  		x: [{{mbias2_CpG_meth_x}}],
+	  		y: [{{mbias2_CpG_meth_y}}],
+	  		name: 'CpG methylation',
+	  		type: 'scatter',
+	  		yaxis: 'y',
+	  		line: {
+	  			width: 5,
+	  			color: '#0d233a',
+	  		},
+		};
+
+		var trace2 = {
+			x: [{{mbias2_CHG_meth_x}}],
+	  		y: [{{mbias2_CHG_meth_y}}],
+	  		name: 'CHG methylation',
+	  		yaxis: 'y',
+	  		type: 'scatter',
+	  		line: {
+	  			width: 5,
+	  			color: '#F29D13',
+	  		},
+		};
+
+		var trace3 = {
+			x: [{{mbias2_CHH_meth_x}}],
+	  		y: [{{mbias2_CHH_meth_y}}],
+	  		name: 'CHH methylation',
+	  		yaxis: 'y',
+	  		type: 'scatter',
+	  		line: {
+	  			width: 5,
+	  			color: '#21BCA2',
+	  		},
+		};
+
+		var trace4 = {		
+	  		x: [{{mbias2_CpG_coverage_x}}],
+	  		y: [{{mbias2_CpG_coverage_y}}],
+	  		name: 'CpG total calls',
+	  		type: 'scatter',
+	  		yaxis: 'y2',
+	  		opacity: 0.4,
+	  		line: {
+	  			width: 1.5,
+	  			color: '#0d233a',
+	  		},
+		};
+
+		var trace5 = {
+			x: [{{mbias2_CHG_coverage_x}}],
+	  		y: [{{mbias2_CHG_coverage_y}}],
+	  		name: 'CHG total calls',
+	  		yaxis: 'y2',
+	  		type: 'scatter',
+	  		opacity: 0.4,
+	  		line: {
+	  			width: 1.5,
+	  			color: '#F29D13',
+	  		},
+		};
+
+		var trace6 = {
+			x: [{{mbias2_CHH_coverage_x}}],
+	  		y: [{{mbias2_CHH_coverage_y}}],
+	  		name: 'CHH total calls',
+	  		yaxis: 'y2',
+	  		type: 'scatter',
+	  		opacity: 0.4,
+	  		line: {
+	  			width: 1.5,
+	  			color: '#21BCA2',
+	  		},
+		};
+
+		var data = [trace1, trace2, trace3, trace4, trace5, trace6];
+
+		var layout = {
+	  		title: 'Read 2',
+	  		titlefont: {
+			      	size: 24,
+			      	color: 'black'
+			},
+	  		yaxis: {
+	  			title: '% Methylation',
+	  			range: [0, 100],
+	  			titlefont: {
+			      	size: 18,
+			      	color: 'black'
+			    },
+			    showline: true,
+	  		},
+	  		width: 1200,
+	  		height: 600,
+	  		yaxis2: {
+	    		title: '# Methylation Calls',
+	    		overlaying: 'y',
+	    		side: 'right',
+	    		separatethousands: 'y',
+	    		zeroline: false,
+	    		showgrid: false,
+	    		showline: true,
+	    		titlefont: {
+			      	size: 18,
+			      	color: 'black'
+			    },
+	  		},
+	  		xaxis: {
+	  			title: 'Position in read [bp]',
+	  			showline: true,	
+	  			titlefont: {
+			      size: 18,
+			      color: 'black'
+			    },
+	  		},
+	  		showlegend: true,
+		  	legend: {
+		    	x: 0.85,
+		    	y: 1.2,
+		  	},
+		};
+
+		Plotly.newPlot('mbias2_plot', data, layout, {displaylogo: false}, {modeBarButtonsToRemove: ['toImage',
+					'sendDataToCloud',
+					'resetScale2d',
+					'hoverClosestCartesian',
+                    'hoverCompareCartesian',
+                    'toggleZoom',
+                    'toggleSpikelines']});
+
+	</script>
+
+	<footer>
+		<a style="float:right;" href="https://www.bioinformatics.babraham.ac.uk/">
+		  <img alt="Babraham Bioinformatics" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAABHCAYAAABCvgiTAAAACXBIWXMAAC4jAAAuIwF4pT92AAAKT2lDQ1BQaG90b3Nob3AgSUNDIHByb2ZpbGUAAHjanVNnVFPpFj333vRCS4iAlEtvUhUIIFJCi4AUkSYqIQkQSoghodkVUcERRUUEG8igiAOOjoCMFVEsDIoK2AfkIaKOg6OIisr74Xuja9a89+bN/rXXPues852zzwfACAyWSDNRNYAMqUIeEeCDx8TG4eQuQIEKJHAAEAizZCFz/SMBAPh+PDwrIsAHvgABeNMLCADATZvAMByH/w/qQplcAYCEAcB0kThLCIAUAEB6jkKmAEBGAYCdmCZTAKAEAGDLY2LjAFAtAGAnf+bTAICd+Jl7AQBblCEVAaCRACATZYhEAGg7AKzPVopFAFgwABRmS8Q5ANgtADBJV2ZIALC3AMDOEAuyAAgMADBRiIUpAAR7AGDIIyN4AISZABRG8lc88SuuEOcqAAB4mbI8uSQ5RYFbCC1xB1dXLh4ozkkXKxQ2YQJhmkAuwnmZGTKBNA/g88wAAKCRFRHgg/P9eM4Ors7ONo62Dl8t6r8G/yJiYuP+5c+rcEAAAOF0ftH+LC+zGoA7BoBt/qIl7gRoXgugdfeLZrIPQLUAoOnaV/Nw+H48PEWhkLnZ2eXk5NhKxEJbYcpXff5nwl/AV/1s+X48/Pf14L7iJIEyXYFHBPjgwsz0TKUcz5IJhGLc5o9H/LcL//wd0yLESWK5WCoU41EScY5EmozzMqUiiUKSKcUl0v9k4t8s+wM+3zUAsGo+AXuRLahdYwP2SycQWHTA4vcAAPK7b8HUKAgDgGiD4c93/+8//UegJQCAZkmScQAAXkQkLlTKsz/HCAAARKCBKrBBG/TBGCzABhzBBdzBC/xgNoRCJMTCQhBCCmSAHHJgKayCQiiGzbAdKmAv1EAdNMBRaIaTcA4uwlW4Dj1wD/phCJ7BKLyBCQRByAgTYSHaiAFiilgjjggXmYX4IcFIBBKLJCDJiBRRIkuRNUgxUopUIFVIHfI9cgI5h1xGupE7yAAygvyGvEcxlIGyUT3UDLVDuag3GoRGogvQZHQxmo8WoJvQcrQaPYw2oefQq2gP2o8+Q8cwwOgYBzPEbDAuxsNCsTgsCZNjy7EirAyrxhqwVqwDu4n1Y8+xdwQSgUXACTYEd0IgYR5BSFhMWE7YSKggHCQ0EdoJNwkDhFHCJyKTqEu0JroR+cQYYjIxh1hILCPWEo8TLxB7iEPENyQSiUMyJ7mQAkmxpFTSEtJG0m5SI+ksqZs0SBojk8naZGuyBzmULCAryIXkneTD5DPkG+Qh8lsKnWJAcaT4U+IoUspqShnlEOU05QZlmDJBVaOaUt2ooVQRNY9aQq2htlKvUYeoEzR1mjnNgxZJS6WtopXTGmgXaPdpr+h0uhHdlR5Ol9BX0svpR+iX6AP0dwwNhhWDx4hnKBmbGAcYZxl3GK+YTKYZ04sZx1QwNzHrmOeZD5lvVVgqtip8FZHKCpVKlSaVGyovVKmqpqreqgtV81XLVI+pXlN9rkZVM1PjqQnUlqtVqp1Q61MbU2epO6iHqmeob1Q/pH5Z/YkGWcNMw09DpFGgsV/jvMYgC2MZs3gsIWsNq4Z1gTXEJrHN2Xx2KruY/R27iz2qqaE5QzNKM1ezUvOUZj8H45hx+Jx0TgnnKKeX836K3hTvKeIpG6Y0TLkxZVxrqpaXllirSKtRq0frvTau7aedpr1Fu1n7gQ5Bx0onXCdHZ4/OBZ3nU9lT3acKpxZNPTr1ri6qa6UbobtEd79up+6Ynr5egJ5Mb6feeb3n+hx9L/1U/W36p/VHDFgGswwkBtsMzhg8xTVxbzwdL8fb8VFDXcNAQ6VhlWGX4YSRudE8o9VGjUYPjGnGXOMk423GbcajJgYmISZLTepN7ppSTbmmKaY7TDtMx83MzaLN1pk1mz0x1zLnm+eb15vft2BaeFostqi2uGVJsuRaplnutrxuhVo5WaVYVVpds0atna0l1rutu6cRp7lOk06rntZnw7Dxtsm2qbcZsOXYBtuutm22fWFnYhdnt8Wuw+6TvZN9un2N/T0HDYfZDqsdWh1+c7RyFDpWOt6azpzuP33F9JbpL2dYzxDP2DPjthPLKcRpnVOb00dnF2e5c4PziIuJS4LLLpc+Lpsbxt3IveRKdPVxXeF60vWdm7Obwu2o26/uNu5p7ofcn8w0nymeWTNz0MPIQ+BR5dE/C5+VMGvfrH5PQ0+BZ7XnIy9jL5FXrdewt6V3qvdh7xc+9j5yn+M+4zw33jLeWV/MN8C3yLfLT8Nvnl+F30N/I/9k/3r/0QCngCUBZwOJgUGBWwL7+Hp8Ib+OPzrbZfay2e1BjKC5QRVBj4KtguXBrSFoyOyQrSH355jOkc5pDoVQfujW0Adh5mGLw34MJ4WHhVeGP45wiFga0TGXNXfR3ENz30T6RJZE3ptnMU85ry1KNSo+qi5qPNo3ujS6P8YuZlnM1VidWElsSxw5LiquNm5svt/87fOH4p3iC+N7F5gvyF1weaHOwvSFpxapLhIsOpZATIhOOJTwQRAqqBaMJfITdyWOCnnCHcJnIi/RNtGI2ENcKh5O8kgqTXqS7JG8NXkkxTOlLOW5hCepkLxMDUzdmzqeFpp2IG0yPTq9MYOSkZBxQqohTZO2Z+pn5mZ2y6xlhbL+xW6Lty8elQfJa7OQrAVZLQq2QqboVFoo1yoHsmdlV2a/zYnKOZarnivN7cyzytuQN5zvn//tEsIS4ZK2pYZLVy0dWOa9rGo5sjxxedsK4xUFK4ZWBqw8uIq2Km3VT6vtV5eufr0mek1rgV7ByoLBtQFr6wtVCuWFfevc1+1dT1gvWd+1YfqGnRs+FYmKrhTbF5cVf9go3HjlG4dvyr+Z3JS0qavEuWTPZtJm6ebeLZ5bDpaql+aXDm4N2dq0Dd9WtO319kXbL5fNKNu7g7ZDuaO/PLi8ZafJzs07P1SkVPRU+lQ27tLdtWHX+G7R7ht7vPY07NXbW7z3/T7JvttVAVVN1WbVZftJ+7P3P66Jqun4lvttXa1ObXHtxwPSA/0HIw6217nU1R3SPVRSj9Yr60cOxx++/p3vdy0NNg1VjZzG4iNwRHnk6fcJ3/ceDTradox7rOEH0x92HWcdL2pCmvKaRptTmvtbYlu6T8w+0dbq3nr8R9sfD5w0PFl5SvNUyWna6YLTk2fyz4ydlZ19fi753GDborZ752PO32oPb++6EHTh0kX/i+c7vDvOXPK4dPKy2+UTV7hXmq86X23qdOo8/pPTT8e7nLuarrlca7nuer21e2b36RueN87d9L158Rb/1tWeOT3dvfN6b/fF9/XfFt1+cif9zsu72Xcn7q28T7xf9EDtQdlD3YfVP1v+3Njv3H9qwHeg89HcR/cGhYPP/pH1jw9DBY+Zj8uGDYbrnjg+OTniP3L96fynQ89kzyaeF/6i/suuFxYvfvjV69fO0ZjRoZfyl5O/bXyl/erA6xmv28bCxh6+yXgzMV70VvvtwXfcdx3vo98PT+R8IH8o/2j5sfVT0Kf7kxmTk/8EA5jz/GMzLdsAAAAgY0hSTQAAeiUAAICDAAD5/wAAgOkAAHUwAADqYAAAOpgAABdvkl/FRgAAJ5pJREFUeNrsnXeYXVW5xn/vPmX6ZIIhgUAKIRAChFBiKAIiSBCQqtIRVOCC7VquogJS1KuiqFzFiyJ2EQVRVC5VqSogUqXHkECAITGFydTTvvvHWvucffYpc2YmwaiznuckM3N2WeV7v76+JTNjvI238Va9BeNTMN7G2zhAxtt4GwfIeBtv4wAZb+PtNWzJkVw8bedTQNW/E8Ko/LqqE0CV15sBstIFNVstp4JGPHgRebkUebqhyPNcP42yoQgw+YdYgNEiqQVoBmsBTTSsU6gDaANa3Xc0AQnDEkIB5c/MY5ZH5EBDBgNAv6APbB2mHhOvCgaBIdz3g0DOMN/R0sy6YcXm1Fy3w3EHAwOseee7WHf4wfBcH+Qyfmz4OfGrZLWmuM6ahfMaTpwUXWz/ntLcx9fCPdoiROKf0QiZhPMRvrfYh+iN1WnJjpo4OoCMNwS0AJsBUxFTBJOALRFb+L93gdqAdv+/Bw3pqvBUfFmL0MwIMh4AA6ABFIKFfmAdsAJ4BegGVgJr/P+vAKuB3PiSvYYS5N+sdQDTge2BGaCtJWZhbIKYAEzw1/WDPBGT8Zy92xNnBih4VhXy4ISf97T/NPtPG9Au0eGlTPh9e8PSUMoBa0FrgNWCl4HF/vMy8BywFOgtY5/SuLI9DpC6rcUT/DYeEDO9NEgAWTniXw78GfESsAqjD7MB5TIDwJAlUxmZZYGsKSQ+w8pEhJcPTosI5J6fwiwNShs0IZoFTaagw6RJgsnAFLApoC6wzUGbA1t4UKUjEEniJNqkSnUCgFWIVYJlBo8ATwFPKZNZQibfSbppCsnEJuSyE8nnWzw4nYooWvy7YjSjrGcK/Tjp9qr/uQdY5SVatwMuQ55h/POoDCMJFP6L2SDy6tFUD4ZJ5hZ2NWYrQGskW2NoSOXGiLt5cAgC0b/TAjCj+W9PYglHO1YkzPiMOICYWXEOojq5eX1bCgj6+9BAL1Lg7QlDTjdPGtYuowO0CWKWYVsLTQNmUChsI7PJFgRpRCsKkpZMYkHCjbhM3wewgUJT05rs1GlNQ9O2bstuPq15aOqWFCZsgqWbXN9yWff/yIPKuQhw1nkmsxhsCaaliMcxew6pb2O1Qf6dAZIU1oopieg1I1N8v/kRycrN9dC2zOUY3HoOPfsexOCcHUQub0FfbxVjk5KByzDji16fTJFeupimZc9CMhXHZkkuFe3n4vOalc1OVT67mwWJwwiCtyZ6Xp2YeuUlUqtXoqEBgmzGgSWRxBIJd1ehgPI5KBSwZJJCazvZTTdnaPosMjO2ZmjLmRQ6JkAqBbkc5HPlRFYYrVCwPtBK4DHgQeAhzO5D6h4HyHoHyMhBoog3pez99QBieQpNrbz80QspTJgIAwMJpGYUtHiVbABIYoU8og+CXGmhCrW961bw3Q/ci4KkI0h3cwCkIjbJFCf1bGpE3ZqOMQNpCqKFgrn+5LIOGOt6SHcvJ/3yC6SXLyPdvZxgoL8qUGUFyOdRPk8hlSbfMYGh6bMss8WMdZktpt+VnTpjKYU8wGSkyYUJEzdFmkxmqI1CoRmzMVg0tgb4C8adoNvAHkIMjQPknwkgLe28/KFPU2hp9dxTgdfNmz2xvg7o9LbApt7odu5gSICGgLzXx/MeAOkICEKjvdN/JgKb+Oe1+ec1Zj86tSqDtIZEYgkKniKfW5LsfnHppj/5Vl9y1YpdSSb3B3YKHQIWc4GrUIB8DhUK2UJzy+pCU/M9FOxGpFsslXyhf+fdKTS3tvTNf/3kfEfXDFpbtyKbmUE2O5uC7YiY4cfQ+AI5VSsH9iToRrDrMe5Dyo8DZAwAkZVrNRsMIP95HoXWthAg9TxhHR4wM8GmY5qC2MwDaTMvDdq9oyA9CpabjXjPhryRvBxY5j1WLwBPeN1/HZAjlSaxZhWTv3spyb93QzKVAGZh7AcsMrG3XN9qSBgLzaa1mN0SZIauNnRrvq2tNzNrDpktZpDZYhoDc3eGZFOa3NBEstmdPQj3AHYDpjEy31ke437EtRi/AJaNA2SjBUgHL579OWhrjwBEkM86Hb2mQWuR4CJ4lawJIwXWhTTBSQxzgUVTMyLtVZakj/rlwXIYQ6B+p8ZZD2g1xhpkg05ClVFE+dwlUyRW/53J3/96CJDiIvgZ2Qxpf+AwYD9qgaV8bE9TsGuUy16lbPbJQjrNwNz55KbOYHD6TAZ3WgiZIchmwGwCsBDYCzgImNeoO9u3lcAvge8C940DZJQA0TB3jgogGJZK0bv7G7FUqhQVzmUZmjmbzPTZFFIpSCYdWOoDJOatiS2cRaLN4UKXLX4xkh8ZtEU8aKMGCEhht6YLDka8HXiDl3T12lrgegp2BdnMHxK5DLnOLnoX7sPgVtsxuN1OkAgcWAoGWBJpPrAIOAJsV1CqQT0sA/wa9A3gznGAjBEg8Sc0ApCypxR/LRAMDpZJCbMChZY2lEozMGs7Vh99MoXOLscx8/l/ZoBEFtj2lHQcxpEmpg1jUHji5VIKhXuCwX4KqSYGt9medfssYnDbHZzplhmM3pMG9gaOAw71LvhG3cm/Ar4K/HEcIGMBSJTYojlY/v2qcrOZ1coMidG4EZhBPk++s4vehfuybuG+FCZ0QTbrPFWvJUAU0zUDf39zK1q7hs2+dTHJlS83ChBnf7gvZxocIzgVmDsM2QyCXQV8GeNJMkMoCBjcdgfW7b2Igdlz3bMrpC2zPVBOBrZtkET7gR8Dl4A9Mw6QUQDESotcljNX8YrRAIRS8E/5PMoOke+cyKojT2Jg3m6QSkL/YHkwOQjczckEJNOUslIoZRVmBstjDXJSgETazZmZU1mCpHtHeM3gAKSaioxAPWtRIkH6hedoefJRWv/6F4L+XggSIwVIOOrJoBOBs3BZCPVaN/Blg8tkNhhkhkCib95urD7qZArtnaF9Ep/YzRAnAv/RwDvC9iLYJZguBxv4dwFIl/OAWOA9N3/0EdqNASALzaWEIPSU8xj563M5wBicM4/BWXNYt3BfrLXNSZRUGvWsQUGC9LLFNC37m7NdwmzcgkEqSd/83cl3dvm4iIuZND/xME3PPweJBJZK0rtgH9LLl9K09FksmUKJBKnly8hP6GJw9vakVrxE+x9vR4U8wUA/wdAg+eZmn/2r0QIk7OrmoPcC7/Pu3Hr87VbEh4HHMXNMpK2T1Ued7JiIFcqlSVEg2ubA6UhnAps3SLJ3gH0c9OfXCiCb45LpcpXedpm51OxXfbBs1ABRmQ5dbHuC7vL+/14zWwA8HQUoDWRnjx0gVSFyG3CAH8engc+UD9dQNkOQGaJv7s707H8o2c23pP1Pt9N+/90EVoCBfoKB/sjYhcmll+RbOxiathU9B7wVgM7f3UDzs08QhKnpCsh1TSQYHCDo73eOBeEi5bkcheYWlMuihAOfKYAgcKktsTGZ2cgBUiK8nQ0+JzhkGOP6JdAHgOvAIJsDK9A/bwFrjjqJQluHkyblAAkpbVvgY8B7GoyrvApchNlXNjhApu9y6rXAIsNHNitDdDlcktr9wPeA369HgOwFusffMmTGzrhkuwr1fMMBRLVW5HfA/v7W8zG7qNSv2B2Dg1g6TaG1leSrq7Fkk+uvAs9miADEgYu8QTaDNTW7Zw4NYukmFJSerULOPyMoT2eK2C+K2WDVABIJ0o0GIGAmkz4kuGgY120G+AjYZWb+2dkMhbYOVr3jVAZ3ej0M9FcBSNGJciDi8z6m0oDDi6vBPohYORKAjDQl4HVAh2BS/OOjvJt5g+okM7vFTcBoW1WyLRSDRiUztcK2/Qe0QjUjqQIcgDW5oHrQ30uhqcVx+TCRsFYLAgcOH1+xpuaK663eMzTCPDVpLHNhgq8aHAw8U+e6NPAN4P1FwKabCPr7mPSTb9H86APQ3lmvL7d6pnRxEen1yek4xM3ADiMZzEgBkosRwlJcotlfPTdfG+lRAvgiaJexgST6qfIVG2fZItUjMqlkGI+UcMdGvGNjUSNr9wBvwSUh1kkE1tckHeksIUEqTZAvsOnV36Hzxl84myyoRabWA3Y2cDjG0gb6tItLW2HhhgJItOW9UfZ6YAGwC2bzMftphAklJQ6tQeJjbPYPA0fdtxbVkH+NplEvnIHboHU48HCdCxPA/yJmhERiqSTKZem6+Zd0/u43kKgHEkD8FnEgcFcDkJ/m4zN7NTKKsW6YCvN/wva8N9LeUvJm2Kble5GLbQLwZlx0dopEyqU+22O4NIJX6s6+0QeaiDjc++L7EX/y9kA8/7rFq34ppCGwx1x6B0cIdgV+ADwdMT0WAovAZoK6JK0zeF5wI3BvFTMlChxvObMzsI9XO3udR4U/1Vm6mcBBiHmgybiNWiuAu4Hfep09+tItgK38z68Az/qfd0DM9+rwMj8fobevHTEfYztcQuTjnqgKjUiSUbKjFw07XuI20BY1rtkMuAjslOJcJhJI0HXb9QD0vOmQyB75qm2xB+NlwInD9GkKcA1ODXx0QwIkKLfrhNwusnUlgGhdjICSQscDZ6uqPiiAj+KCUH+oqepJpwjeGQsiGXALcKZX/8I2C7gZlxH7shmHC/uypDcX1QGzpz1xXuBBl6xCJJ9yaiPn1iGnqcDXgPfisnOj6ukl/hlRgpzkjdXTQJtWed6HEDcJ3gXWHUHICcDnPVR/CTrfERmHKZL0KOluw04EdgedC9optMrl8u9/DZyJ1WVI9ZwnjQiTp5A+ClxVR2s5FuOLuMRKxwODBAIm3nQd2c22YGDn3WGgbziP1bv8/+8dpldTQT/G5YK9vCFUrNATUawE4n/YlnDLpxvm7aEnRRKSZgNXRIyll4C/gEUNutnA5QYtNZajQ/BZsG2Bv0XcvfIDvkoubhJtKSCFMRHpCkrgAMh5iXAecLQHRz/oMa8e9EcYyjmCt6qKUi0wibOA//TvWxtjRmdLOiwkNq91vw34ZAQcz7r5KFu0twAfr8JJEt7W2we4HfeseEbwPkK3CF0DzI8JvgA4EvhyQ4qUGrdMop4xb49d48FYqzUhHV60s8IMhyCBpZuYdPV3aHn0z5AaNuE5C3wQuLyBbs7zzCyxIQAiYDtzk76rM4A4DJcP0+qv+R7G72P3PYtxEdBj2HkG+xi2p4tzcHGERc31C1qr38txkmgPM/Yw478inHlPgzOs0mbCF0V4vSf6Rzwx9nr35ReAlw272bBFwEKM3c04HBcJDtuBdeYkBfwK7BAz2w+XKrEqcs1hMQP+GozfAc+Z2bEY4Vy8EafShW1fXyWlmik0xf/+cYNDDTvLsBWR77fDWGnGJ3ExihOjLnKDA01sZXIuqJqfBuSHeddylU8B7NvhOtRoVde7kEigXJZNfvEDgp61ziYZ3j7+MNgvGqDjY4BTNoSKlfDoyzsmobAkDgbdgq8b9kXn9lN552WXALdgPFD6SquBr+BSCiYACcwm1XA7FjyXvi7yt0twiW5H+t+PA75OJGgZWcVnwE5Desgwk3k7SjzoufXzRe7vtIrfGdziVTqAjjqW+H0YJ6Ki1HnEE/tp/vfJsc6sBr3HzFJEIvBmPAtcKXGw/1OrjytU0zHWGRxBeep3p1cHAbLm+n5ThJD75OYvEDSbUz+XjMZVYdG5iKZ1VNyhe+WAWcvVOrEW17FUmuSra+n48928evDbobd3uP4NYpwFzEIM50k9F7gJ46X1rWI1C9rkFq8lMiDhNgptVcP1M2SmB4SKGbWhfWLmOIzV93wNmdkjJdWtiKHrI33YRrBjjcn7LHC3OeO5L+a+flRobRmoXSZrrkbcI97uAPodWygmC66q6wSTLQMtlnxmcYlXW7l/zKyGy3+x4L6St1AIPRn5fiXYn2P3/C0y7lBI0MinzCqLMQqVVOnKj6vb9VyduVtbl+Sbmum86xaaH/sLpNO1HZtGOJqVYGeBDYemrYB3r28JYs5DYi+Ckp5opuA22EwBPiF0kolTimpWeZGBVsT+wDy5+lNTgS2lYr2pei825PoeJSOJp/yiJ4F2g+mCOGHkJT1TVqmqYlja1Rm1bO29RZtLtcBW4ebttcpYSFDDIxyltS29pJkDbCk01cTWI3C5p7z+HZXw4YgK7vvSgGWWqCGdRxwpGeET6lnZj9RT4iwISKx7lebFTzI47/WQHWrkffd5zeTTw1x3AuKbuIJ76wUgeeCzbnN9WSLYgQbflVvwLQU/wm2zfCGyQIsQnwNbEC2JWc60rQrTjeZ/qJqffm0EIGBWXRUyRzzyz4lUr5oC+oI5Y7dDNckgTOpTNfCOhuI+huz9oOlFA7dKCoxqP1oNUXLdP4/QO1Ulbd/iaSFV4yrqqPHVINj1w7HGfEsr7fffzeDWfvNVmLNVc5TC28UneW9mrTYXZwvfsP5ULCNVpVe3gl0UmfGpJk6NXLZIZtcJQnD0edXoQjPOGYbD1JiHqioJilrDVjug4r/uAq4GTlUJHA8YfN2cvXNP45G1xuSvB95nBReH4ABbbvA9Mz4OfJv13EKjeTSsv0LyVZXtdYE22Xseq63DD8x4ItytXPOjgKBnDU3PPVPKbh6+rW3Mq6X940JjjHGQKBsv43T3ey9Rmx/9bn4DTzPGBUVvjNuEfzrGo57zdJnpoxJtoxH13u5JNijO4/ef4tVDgB6wjwA/wooBuh1Ae683QnVSa6Gkj0Zkw+VmnI+8B8o4DOkMNqJm9bi1IsCvzigO8C78eHsaOE8NMBcDFCTcfpiRFbK7CheD6qpzzWyM1xEJUo9NgtSwos3p7s1VNNWZiAWUCqmfj5UimXJlN6usQMWLhCxfVpzBCZHtQoAYDBoRr0StBXWGsSTeFHnUrw2uNMiUsmCjc6V66s5I5u4NkXlajnNVr4j0I7W+CTw0mCsJuEHz3BrlNxbLIbQ273mMt27gRLkCco09OgiwECBGYx94kWFTUZjssxjWlxdL/VUob3vBBWVGonjST1pn7O8FU1Rr1ywi0qOO370JV0M3Jsvs7ZGJXAI8ZrXVsShZBJSnZlsplFc0dBrbzdYgV3NP1sQyz5gsxGtIyNvWVI9GxfbHqp6N6fZPesdHtC0DjjLsLw1TnBXIt7XTN38hZLIjnYN7h7kqSYwpjUXFCnDp7Ef7h+Zx+T+H+P/DjmUR13ijttupL3R52vyc/30xrmbS1ygWWav/bqGLgW5fhLkTeC/S4ZH3Xi94dThGb6FnKyJt5GIKZ+FywjqBDyDeuAE0lqjLc7rBpYLPe/X0EFzKzcahWo0NHKeDPhl3h5txplTa9NYQQDIZMltt6wpiFPIj7cezw3w/iMrjZslRgCL689EN3HO+fMqz92T9HDjD89AFoLs9SDah0p8V17Oi758D3CMHkClyWZphexIXJKzW96BMTpTe8CNcflPCg+KbHsCtHrS5yHypzrxoGL9CEHEO/J/QsxT3Wus9hh0j55adUOcdVZ85wu+rz0kNw370TmA+gAviBn5l1xp8VcaXgIG65WcqpIdhEj37HISl0zA0OFJHwyrqF7zpxqx7LCpWozO1Brdn/ES/6yvUbAwXtbwxBtJNgMVmdnrUQFLkMCT/hLz/qdt7eAZwqfbTIp27HzgW8XIsqlWRHFTql4HZrbitnFHDfqIHzBeAHzbkWKtuaaqqimW8gnEGLmgXBvk6gAmG3QR8mEYPwanUR20Yx5pG4CYeDTwmAv/jPylc1vfVZhzgU40GRvzEwX765y1gcJvtYWhoDJit2R5BvDoWCXIO8A2wXM33GznEy2b2BJCtpBetNOxtGEdJ7Ok7/ajBbyS9bLAErF1QQLo/KhXM7FBBAqnH4A9gl8vYH2kG0IfZI8CNSK/GuN8ypOOENeO48xNVQwDGVw37E9IhrvSmvYDp98j+gIu2/sbdr6WV82Jh0YYnqlDk98Du8fe+FKPiOwQHgB0FmovLRL0Xl+IO2GLPyHr8d2F/r0X2tP9tNQpznIrvvhfsCC8nByStiXG4JYIjXREMZYikuawHV9chiC9i2hGxzo/lcsRdo7KHCgUS/b307bI7q459j6/wUhgFru11dfzwGYxbiWVJjHRP+jCCpLQZPJrBW+6j84LESoXZrNxLSKmgvypEfVlBAcxVvVExOlzBMsv3ZNeomhIJaVuknpQUFnqzBhjRcCWLKr+3sBxP+eQU5yieXl4KX4RpHjYMk6zyzoorq2sckfNIqqpYVbcTY28QfBR0OLAU41rEzwx7qDjK2NZyd9Sj1fQKKpfD0ml69llEzz4HYql07PiFEQHkPNBFNb68DeNQIGNHd43VSNeIrioudrhF1lgvQn296QWRAmsqO8xTG0T52NjbCG2OduCNhp0gNA/sCeAYzO4ErRqLba98Hksk+PsxpzGw6x7Q3+tKAhXpaKTro31qyShns1qmmltrvbkNo8X+VKyasR63xfpMUYtz/PWvRG/q7Z11QHY0e+qMjRtb8XrD1JEWVVp4kOlCXEJoGpcNcTZo+UiWs+aUWgELAv5+/BkM7LQAenvG6rqeg9u9Wq39HLPf1vL7jsa9WwuFFYZoLPu0rWgEh3mpqrZwqsnRIk9L+E+GSI5rhShXvE5t3Zk9ADjfYCdE3uAMwS9qya1QMlodpUt15J28qtgwmKTK0rt1QamKUxJF9chQDT9ueODoUGQUXYa2AjrAnjLjVkmrGw2cKpZ6Fx5fXZGlXChQaOtgcNZ2zltVC+UVNZVrvvgMSvuUom2JA3b1DO2RAmRHXBBw0zLvkBv0Kxi340L6a6oQ1DG4nKPvIy4szkxcMS3T0Wvp2WwC/ASxheAoM+cFapS5RPXrSDf3wO2PkLArzLQa8WjZ02yY+qMxODR2BAPRmlLu7VYCT81trqpGKdUGq9KR5yNju50GPxXMEHob8LRP0RwAHsbMrAFMlDG8kYpVXyvLGs65qmGbGXMxTqvy7rVg78Z4vtYTRwQQgy7Bm/0xyHlKu8PcTjrxNsHpBsfKb4ON9GlvsBmggwUXOVamhghaqjjwYzPEIifNNFvyALERzX3cn3EaLv5xMq4AMqq2oNpYVKmGjlkqQqdGPyfgApLXALmYUT4Jt3ksQMwl3NZsZdIEQ5G5tCK4i3ZdlYl+jVuAi8N0xv6+DuMUFD82YWwSpOB0cgp+8h7w05KScaikz4PNF7oMeCswSEmMXiK0AnFjVXE2sjl80sxOQpootxd7fbRpno4ex5fuLLNz7F/BXq84FuEAZOc4NbJidM8Jjsft7bmxzHsW8xTW1vXsHzjOYjuX0q7MsIMrQacC/zfck8aSarKG8kJx3/cq+ZXA/uZysh6MzOcy4LNxJahhh0nM44n007EYbVVKlea9EpX5N3FWNRn2MZWOcCupNW6CDPj5BvUebvh2Kq4QR7Q9iqt88mAjDxgLQJJRY9zP2h9Ba7yNsFnx2GT35U7Oi2D34Koxxic9CToaVyurC1iDuAl3MEqc/FsER/g//pLy2lx7AtsKfmsutWA/XKWTCbhg23W4aHvY9gKmye1olJeM2+CCcncRLTIgDsIVpphs0Cu40xwRxaPCzcA7vEPiOlx288m4TN1v4t61CFeR8gFcJZijfMAzK3EXJedAm48r7OX7cC/wM6pE2OUSKo/EFbzo8GO4G+xqf3Bo2F4HfEmwh6FnBG+nWCWFP+DONUz6Mciwa7zmEI9XTAGOldjNjVkv+fHeXYVeFvhTqmYAWcweQrqaOiV3xpgA9k4/11EavxL4FGhFw4x0RNXddzl1Lzl33iZ+wWLnw9nuoDu822++GX+NSOJzcVXPzzH47+gESJqKO2/uIC+ZVuNK3LfiNjH9hyfu0NsxRehxry/PIbLnW9IP/OR8HLeT8Wiv0oXet3VmdiLwGx+kK1Zmj6nqD2Ps7c4ApN2Mr0uciovYv4I0EZeKcocjflteLIgNkyWW41JILgW+aEanZHc6wOpQXHT5KlxZofM8qIxS2Z73OYbDD3HlaQpA4Dt4Bdj7Ii7oNK4m1gf8z90enNOBFkfgOkUw4NLOdXPR5WkUfBReYEmMY5F+jotvPA8kzWxLoCe2T39/4Du4DIOXvBSa6SfxfLmK6uGinO3XPsDVK0thNh3pl373ZgURKpsh395J94cupNDc4o5FKBqPlB8JrdiBQy6J9vORuXwCswtA11TEUWUVb7ejR1+8OtqGrGJXrE7xC/0rM3s69uZ87P+oT/1KD44vGWwHbG9mO4Jdi6tO8pkqWm7Gf+KTG+ZAf85P0DEYC8D2AH6G0SHpY76eFOYqf5xuTvS6PSpwGsZ55raBAnzZg+OnGDsCc81srif+/YDLDDVZef96Pbe8BHhA4ksG/xvr7DtwWcPnOuZi84BL/Yg+A9wMtgTsUGA+xvFyzON00L6lV5m8FLoasz3MbLbBjmbMBx4WegdwkLeZc2AXevUDb3wf4iSnDkK6kxInqj7Hbn/+T70EOQVjG2AOZnvhqpZcaHC8OWP9AIMvGCzB7PVgc4E5SKfgtsJWgiOXw5Ip1hx1MoXW9vLDg+q3SbgcvUsijOJCsP28I2L0atII3ScyY4cIZ24HjjV4t+AuzD5MeQGBqJVgZUqBONKrNbdSXhztOeBMc3sIThdcaeHOwwasDl8C9cLyi+0zQkfh9sunMQYkbvWXHGGwo5zK9FQkiL4ncIZhfxM6wxM+wCsG/yUXLDscVwPr5lgILu29Y9+vob0/hSuXuTTy/QXAO83YBHGuHNDD9ldcRfPTwbbBlRXFq5gnGAzGvL/P4or0XYY7JuBX/tpbvXQBWQ9wW60D6yjbk2ZhNOYTuO2zHwFFkzj/hHGqxLnAUqed6BD/6CtBD/nHZamV/BlGz084k8F5C4arpBhtByG+gtsn1A38BLNvo7DC/Ogsp9EAxNfB4sfRMI2vWHOf58bPS/GAXRXnpPvbcf5PPy87yMzdsAq4QQ4oB+BK8gznuAgsXKxKeK7wKlOVgy2KG2ViZ1roaG9JXVcCRxgCtZzTubWnxBFm3BzpS9oT/g/qGLd/hFhVcmPAnWFBHuzSWCULgOW+54X4ySPhRJfVTVBR/WyK5ff7oJkCsGSZTVNf657p7Zxu4NqyKLz79z45Oy10z4enmOyCCEAFD5yQZiJjL0XPGweHzQHO8UUEl3kN4Cps/SRfjiWSfqM3OhN+6bbGcdPfgC7wIni4NhFjOx8j+2u1c85UqgC4WyPu9EjmRFP0rxqhSukJLCEXQETwRJxwPGd43P+2nS9FlIupeylqe8ZKETCLlAhy2x4CUGdEYtVVi6080pHwhvgWuCqSyB+6XDuCMnxEx7OSnZzjwB40Z8z7+a0eIDK4AeODEsd7dfpbwO+LcxLR0+Wj50P1ouelti3wLsQRoBcwTgW7CWnV+nSDjRYgBecNcGXtPf9oxjgJ9A2J73sX8I3FQntWHnnz4nqyUJd/3poai/V3T4ybNyYlbVTVmuLZVipJgfAo4tU1HtlXBLuTPmtjjx2tV3Q0926Pi10cJpiCaI5IRGuIvVgdh66blLAY4MqyJIMauS+C20yc4WwBjgSOlPPEXeodMBWcyUXPq9bgbQZmO1vJ5mK2FOk4hqnQ/loDJGzxEQwivgPMNjhbZh9Dug3IRk8ojp2EEDixaxZNErLyCj45L64T0WVQrRD3mGNTFapX4HK9VFDVQ0aL57MFI8Fm3XPcVeXswHKiq5Lpp7PA/hvHcG4wuFrGY4i9gU8YdRJDqmTT1BlGuO6Fsn1nfnuA+ap+5d2zK53do2Odh1F7OKeJ5nqVqAyElkxWYxZTnZaiLlxw+LKiWrkB21gAohq//skdFKndMDYBXql2eq2f3LVAr6FJYK3lKlYxAa3Fo2oNDdYSsdiqqzY91BlU0Zhca06Xbrfq3DXwdNIrMUBFeuAYcDo8sYaDOVTim96//yawOyKKz4QKDlImJhvZ61LW/u4797pK4aJyX0x5bt3zYF8y+BamTyHOFpyDuA63bRoLAoKBPppeXMbgtjvCUNThaWsdbSn7Wub3BOvlKeVzPKFYKEaRZNrqg3olLBgsNBPzUobI8QDSVI+XJxoL2Ywuxb7GXdkwqCnZjFKfSgqQVDzq4QWwDc7RSvuQo0xH7/F67CU+LhNVE1MNr94w2yuccW2P+atmYUxpZLpVri32AJ+Q6U4gYbBnqSicIDNEx103u4IMKvMI9lXxjG7UAMlbRe0jAuAEPxkPhAG8Yi2mGDEaVkDc6jG0X4337OF13HvCWkvV9V3zx5+FhZIVLdwzAh5ZUab5Vq837W+RP0d+3M/373bXBTWETw1DUPFsY6tlXLshTvFK2UtuKhS9p+x83khJoXAkKUQuUjPZja1aArHjDI/j0jRmIN5c5eJOwQdxKfFVrMMig3nR+7KSxdk0Yelmmp99nOanHm3kLJCNEiChLGhzrkO1+Z+3pRTwK2B8pRHEm8ucXS14J2LnGOUcjHMZPoC487VOAvIEdr2PVyzClQOKtvneKH7Ree9e+2aOrS/19L4oiiIZO4J9MLQZYreu856kramsV1Wv9Xv9H1wGwMyofSJxsTfAT/MS/2Bc4mp0YrfBeJNnjPeX16cTymZpXvJ0/XMJX6M2mrI/KT+UHwn1ekM7hYsaJ3D5P58AuyGyESH6rmSMjy7GVRO5Uu78im/iUjTm444IXgt8RKb+0tEAiFL9LNVwnSZqMO4mqtfeSvnxxVelB+wsTL+SuBZXu+thT1hn4dJuThR6idLRGPIel6ZhGFMt9Sfso+qsWSIy/O/i4kknAx0ST4K2MdhPKBt9V2QbTreka4ATQb8F+7V/2TJfdcR8H5Lxfnimtr/cQTx3GLpazmA+yBng/NmMS/0cfAWXHfELwYMGXYjjcKlE/1PlWAYKzU20PPYAPfu+hUJL22jqX/3DANLniWNTwiPNSueXPwLcZdgPgYdU6RR6BRcdr3YW3nc9sM71Xo3Ae6/uBT6BVZxVmMNFlUtertJ3z+MKhK2luk3xqNeD4yb3c8DjYP1RNPmL7kAcgsvv+ZCfN/P2yfup2HVIzs9Hdw0NfZ3B3+QCW9W8A0/4eaomgbs9U1kV0S5/J/E+4FO4zIQjgaXIPuLPiLyEaFKge1fO4MNycZa3+IDoAO7sckyY3Bwn8OlB4UYzQcaMMxEv4rInzvZPXgNcYW4NV0gKcDll5xi8VfA2P8wlwMcxvlZ1iyOgXHbM1erWi8k3omTFnU9pRZquEjCiUz4ELDW/8V3xKsdiUy9llhmsrOE5mutzjCY7o5fbPUcrc3/iDgLdxi/aM7jKiKGeOw2YJLHYqxHRiU4izQHyLlcMi+j6s5yqaIuJZOdGTtQAl57xJj+OFYbdHSZNlr+GpMQcT+DPUtzVWrygE3dW4wrB8irSZRsPwmdCkEQ0pymYbWGwVGK1leqHy2CRjIUG6yTuMuxBORV4O4MX3SGgcfNcHcBcqRjDWQz0mDt5ao6nkadCFS2aISHRgrE/YlcgZ8bDkt1jaF2sKN+WuJSdmZ7JPgDc7+ouVKG/Qp5CazvdHzjf52LlyxMSQwKLaiixvfWl32P+6xEmK8o2ApSOt/G2sbZgfArG23gbB8h4G2/jABlv420cIONtvI0DZLyNt3GAjLfxttG3/x8AscyrBFrkMAcAAAAASUVORK5CYII=" />
+
+		</a>
+
+		<p>Analysis produced by <a href="https://github.com/FelixKrueger/Bismark"><strong>Bismark</strong></a> (version v0.19.1) - a tool to map bisulfite converted sequence reads and determine cytosine methylation states</p>
+		<p>Report graphs rendered using <a href="https://plot.ly/">plot.ly</a>, design last changed 07 Aug 2018</p>
+	</footer>
+
+	</div>
+</html>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output_mbias_report.txt	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,267 @@
+CpG context
+===========
+position	count methylated	count unmethylated	% methylation	coverage
+1	9	3	75.00	12
+2	4	1	80.00	5
+3	7	2	77.78	9
+4	5	2	71.43	7
+5	3	1	75.00	4
+6	2	2	50.00	4
+7	5	4	55.56	9
+8	7	1	87.50	8
+9	3	2	60.00	5
+10	2	0	100.00	2
+11	4	1	80.00	5
+12	4	2	66.67	6
+13	1	1	50.00	2
+14	4	0	100.00	4
+15	3	1	75.00	4
+16	2	1	66.67	3
+17	3	2	60.00	5
+18	5	3	62.50	8
+19	4	1	80.00	5
+20	2	1	66.67	3
+21	1	3	25.00	4
+22	1	2	33.33	3
+23	1	1	50.00	2
+24	5	0	100.00	5
+25	3	0	100.00	3
+26	4	2	66.67	6
+27	3	2	60.00	5
+28	2	1	66.67	3
+29	6	2	75.00	8
+30	3	1	75.00	4
+31	1	0	100.00	1
+32	3	1	75.00	4
+33	4	2	66.67	6
+34	3	1	75.00	4
+35	2	1	66.67	3
+36	2	3	40.00	5
+37	7	4	63.64	11
+38	4	1	80.00	5
+39	4	1	80.00	5
+40	4	5	44.44	9
+41	5	4	55.56	9
+42	5	2	71.43	7
+43	1	3	25.00	4
+44	0	1	0.00	1
+45	4	1	80.00	5
+46	5	0	100.00	5
+47	3	2	60.00	5
+48	1	1	50.00	2
+49	2	2	50.00	4
+50	3	2	60.00	5
+51	2	4	33.33	6
+52	1	0	100.00	1
+53	2	1	66.67	3
+54	1	0	100.00	1
+55	3	0	100.00	3
+56	1	1	50.00	2
+57	2	0	100.00	2
+58	0	1	0.00	1
+59	4	3	57.14	7
+60	4	4	50.00	8
+61	0	1	0.00	1
+62	4	6	40.00	10
+63	4	0	100.00	4
+64	2	1	66.67	3
+65	0	0		0
+66	3	1	75.00	4
+67	2	0	100.00	2
+68	2	1	66.67	3
+69	4	0	100.00	4
+70	3	2	60.00	5
+71	3	2	60.00	5
+72	3	1	75.00	4
+73	3	0	100.00	3
+74	7	4	63.64	11
+75	3	1	75.00	4
+76	1	0	100.00	1
+77	1	3	25.00	4
+78	0	1	0.00	1
+79	0	3	0.00	3
+80	1	3	25.00	4
+81	1	1	50.00	2
+82	0	2	0.00	2
+83	3	2	60.00	5
+84	3	1	75.00	4
+85	1	1	50.00	2
+
+CHG context
+===========
+position	count methylated	count unmethylated	% methylation	coverage
+1	10	21	32.26	31
+2	11	24	31.43	35
+3	5	20	20.00	25
+4	2	10	16.67	12
+5	1	13	7.14	14
+6	0	17	0.00	17
+7	0	27	0.00	27
+8	0	22	0.00	22
+9	0	22	0.00	22
+10	0	26	0.00	26
+11	0	22	0.00	22
+12	1	13	7.14	14
+13	0	14	0.00	14
+14	1	23	4.17	24
+15	0	30	0.00	30
+16	0	17	0.00	17
+17	0	24	0.00	24
+18	0	23	0.00	23
+19	0	14	0.00	14
+20	0	26	0.00	26
+21	0	23	0.00	23
+22	0	25	0.00	25
+23	0	22	0.00	22
+24	0	18	0.00	18
+25	0	20	0.00	20
+26	0	17	0.00	17
+27	2	24	7.69	26
+28	0	22	0.00	22
+29	0	24	0.00	24
+30	0	21	0.00	21
+31	0	21	0.00	21
+32	0	22	0.00	22
+33	0	25	0.00	25
+34	0	15	0.00	15
+35	1	29	3.33	30
+36	1	24	4.00	25
+37	0	30	0.00	30
+38	0	16	0.00	16
+39	0	27	0.00	27
+40	1	19	5.00	20
+41	2	22	8.33	24
+42	0	20	0.00	20
+43	0	20	0.00	20
+44	1	22	4.35	23
+45	0	25	0.00	25
+46	1	21	4.55	22
+47	1	32	3.03	33
+48	1	16	5.88	17
+49	2	26	7.14	28
+50	0	19	0.00	19
+51	0	18	0.00	18
+52	0	20	0.00	20
+53	1	34	2.86	35
+54	0	27	0.00	27
+55	0	24	0.00	24
+56	0	14	0.00	14
+57	0	19	0.00	19
+58	0	19	0.00	19
+59	0	21	0.00	21
+60	0	20	0.00	20
+61	0	25	0.00	25
+62	0	25	0.00	25
+63	0	29	0.00	29
+64	0	21	0.00	21
+65	0	26	0.00	26
+66	0	19	0.00	19
+67	0	20	0.00	20
+68	0	7	0.00	7
+69	1	15	6.25	16
+70	1	19	5.00	20
+71	1	17	5.56	18
+72	0	10	0.00	10
+73	0	22	0.00	22
+74	0	25	0.00	25
+75	0	14	0.00	14
+76	0	24	0.00	24
+77	0	18	0.00	18
+78	1	14	6.67	15
+79	0	16	0.00	16
+80	0	17	0.00	17
+81	0	12	0.00	12
+82	0	17	0.00	17
+83	1	17	5.56	18
+84	0	25	0.00	25
+85	1	17	5.56	18
+
+CHH context
+===========
+position	count methylated	count unmethylated	% methylation	coverage
+1	18	31	36.73	49
+2	5	25	16.67	30
+3	4	31	11.43	35
+4	3	28	9.68	31
+5	5	36	12.20	41
+6	3	43	6.52	46
+7	2	52	3.70	54
+8	1	62	1.59	63
+9	2	52	3.70	54
+10	1	57	1.72	58
+11	1	59	1.67	60
+12	0	70	0.00	70
+13	4	55	6.78	59
+14	0	68	0.00	68
+15	1	65	1.52	66
+16	1	74	1.33	75
+17	1	81	1.22	82
+18	1	71	1.39	72
+19	1	72	1.37	73
+20	1	78	1.27	79
+21	0	82	0.00	82
+22	1	69	1.43	70
+23	0	85	0.00	85
+24	1	94	1.05	95
+25	1	78	1.27	79
+26	1	89	1.11	90
+27	0	72	0.00	72
+28	0	84	0.00	84
+29	0	72	0.00	72
+30	1	61	1.61	62
+31	0	79	0.00	79
+32	0	88	0.00	88
+33	3	80	3.61	83
+34	1	85	1.16	86
+35	0	79	0.00	79
+36	2	68	2.86	70
+37	1	62	1.59	63
+38	0	77	0.00	77
+39	1	87	1.14	88
+40	1	77	1.28	78
+41	0	70	0.00	70
+42	2	69	2.82	71
+43	0	66	0.00	66
+44	2	76	2.56	78
+45	3	85	3.41	88
+46	2	69	2.82	71
+47	0	68	0.00	68
+48	0	81	0.00	81
+49	0	73	0.00	73
+50	0	79	0.00	79
+51	0	81	0.00	81
+52	1	65	1.52	66
+53	0	79	0.00	79
+54	3	90	3.23	93
+55	1	80	1.23	81
+56	1	82	1.20	83
+57	1	77	1.28	78
+58	0	71	0.00	71
+59	1	84	1.18	85
+60	1	95	1.04	96
+61	1	84	1.18	85
+62	0	95	0.00	95
+63	1	88	1.12	89
+64	0	89	0.00	89
+65	1	77	1.28	78
+66	3	89	3.26	92
+67	1	69	1.43	70
+68	2	98	2.00	100
+69	2	92	2.13	94
+70	0	94	0.00	94
+71	1	87	1.14	88
+72	1	83	1.19	84
+73	0	87	0.00	87
+74	2	74	2.63	76
+75	1	78	1.27	79
+76	0	74	0.00	74
+77	3	79	3.66	82
+78	1	71	1.39	72
+79	0	66	0.00	66
+80	0	71	0.00	71
+81	1	84	1.18	85
+82	0	88	0.00	88
+83	2	79	2.47	81
+84	2	81	2.41	83
+85	2	63	3.08	65
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/output_splitting_report.txt	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,28 @@
+dataset_11.dat
+
+Parameters used to extract methylation information:
+Bismark Extractor Version: v0.20.0
+Bismark result file: single-end (SAM format)
+Output specified: comprehensive
+
+
+Processed 554 lines in total
+Total number of methylation call strings processed: 554
+
+Final Cytosine Methylation Report
+=================================
+Total number of C's analysed:	8563
+
+Total methylated C's in CpG context:	245
+Total methylated C's in CHG context:	51
+Total methylated C's in CHH context:	114
+
+Total C to T conversions in CpG context:	133
+Total C to T conversions in CHG context:	1762
+Total C to T conversions in CHH context:	6258
+
+C methylated in CpG context:	64.8%
+C methylated in CHG context:	2.8%
+C methylated in CHH context:	1.8%
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test-data/summary.txt	Wed Aug 22 08:09:42 2018 -0400
@@ -0,0 +1,495 @@
+Create a temporary index with the offered files from the user. Utilizing the script: bismark_genome_preparation
+Generating index with: 'bismark_genome_preparation --bowtie2 /var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmp4_4hiluf'
+Writing bisulfite genomes out into a single MFA (multi FastA) file
+
+Bisulfite Genome Indexer version v0.20.0 (last modified 26 April 2018)
+
+Step I - Prepare genome folders - completed
+
+
+
+Total number of conversions performed:
+C->T:	146875
+G->A:	150504
+
+Step II - Genome bisulfite conversions - completed
+
+
+Bismark Genome Preparation - Step III: Launching the Bowtie 2 indexer
+Please be aware that this process can - depending on genome size - take several hours!
+Settings:
+  Output files: "BS_CT.*.bt2"
+  Line rate: 6 (line is 64 bytes)
+  Lines per side: 1 (side is 64 bytes)
+  Offset rate: 4 (one in 16)
+  FTable chars: 10
+  Strings: unpacked
+  Max bucket size: default
+  Max bucket size, sqrt multiplier: default
+  Max bucket size, len divisor: 4
+  Difference-cover sample period: 1024
+  Endianness: little
+  Actual local endianness: little
+  Sanity checking: disabled
+  Assertions: disabled
+  Random seed: 0
+  Sizeofs: void*:8, int:4, long:8, size_t:8
+Input files DNA, FASTA:
+  genome_mfa.CT_conversion.fa
+Building a SMALL index
+Reading reference sizes
+  Time reading reference sizes: 00:00:00
+Calculating joined length
+Writing header
+Reserving space for joined string
+Joining reference sequences
+  Time to join reference sequences: 00:00:00
+bmax according to bmaxDivN setting: 189039
+Using parameters --bmax 141780 --dcv 1024
+  Doing ahead-of-time memory usage test
+  Passed!  Constructing with these parameters: --bmax 141780 --dcv 1024
+Constructing suffix-array element generator
+Building DifferenceCoverSample
+  Building sPrime
+  Building sPrimeOrder
+  V-Sorting samples
+  V-Sorting samples time: 00:00:00
+  Allocating rank array
+  Ranking v-sort output
+  Ranking v-sort output time: 00:00:00
+  Invoking Larsson-Sadakane on ranks
+  Invoking Larsson-Sadakane on ranks time: 00:00:00
+  Sanity-checking and returning
+Building samples
+Reserving space for 12 sample suffixes
+Generating random suffixes
+QSorting 12 sample offsets, eliminating duplicates
+QSorting sample offsets, eliminating duplicates time: 00:00:00
+Multikey QSorting 12 samples
+  (Using difference cover)
+  Multikey QSorting samples time: 00:00:00
+Calculating bucket sizes
+Splitting and merging
+  Splitting and merging time: 00:00:00
+Avg bucket size: 756159 (target: 141779)
+Converting suffix-array elements to index image
+Allocating ftab, absorbFtab
+Entering Ebwt loop
+Getting block 1 of 1
+  No samples; assembling all-inclusive block
+  Sorting block of length 756159 for bucket 1
+  (Using difference cover)
+  Sorting block time: 00:00:01
+Returning block of 756160 for bucket 1
+Exited Ebwt loop
+fchr[A]: 0
+fchr[C]: 235897
+fchr[G]: 235897
+fchr[T]: 386401
+fchr[$]: 756159
+Exiting Ebwt::buildToDisk()
+Returning from initFromVector
+Wrote 4446745 bytes to primary EBWT file: BS_CT.1.bt2
+Wrote 189044 bytes to secondary EBWT file: BS_CT.2.bt2
+Re-opening _in1 and _in2 as input streams
+Returning from Ebwt constructor
+Headers:
+    len: 756159
+    bwtLen: 756160
+    sz: 189040
+    bwtSz: 189040
+    lineRate: 6
+    offRate: 4
+    offMask: 0xfffffff0
+    ftabChars: 10
+    eftabLen: 20
+    eftabSz: 80
+    ftabLen: 1048577
+    ftabSz: 4194308
+    offsLen: 47260
+    offsSz: 189040
+    lineSz: 64
+    sideSz: 64
+    sideBwtSz: 48
+    sideBwtLen: 192
+    numSides: 3939
+    numLines: 3939
+    ebwtTotLen: 252096
+    ebwtTotSz: 252096
+    color: 0
+    reverse: 0
+Total time for call to driver() for forward index: 00:00:01
+Reading reference sizes
+  Time reading reference sizes: 00:00:00
+Calculating joined length
+Writing header
+Reserving space for joined string
+Joining reference sequences
+  Time to join reference sequences: 00:00:00
+  Time to reverse reference sequence: 00:00:00
+bmax according to bmaxDivN setting: 189039
+Using parameters --bmax 141780 --dcv 1024
+  Doing ahead-of-time memory usage test
+  Passed!  Constructing with these parameters: --bmax 141780 --dcv 1024
+Constructing suffix-array element generator
+Building DifferenceCoverSample
+  Building sPrime
+  Building sPrimeOrder
+  V-Sorting samples
+  V-Sorting samples time: 00:00:00
+  Allocating rank array
+  Ranking v-sort output
+  Ranking v-sort output time: 00:00:00
+  Invoking Larsson-Sadakane on ranks
+  Invoking Larsson-Sadakane on ranks time: 00:00:00
+  Sanity-checking and returning
+Building samples
+Reserving space for 12 sample suffixes
+Generating random suffixes
+QSorting 12 sample offsets, eliminating duplicates
+QSorting sample offsets, eliminating duplicates time: 00:00:00
+Multikey QSorting 12 samples
+  (Using difference cover)
+  Multikey QSorting samples time: 00:00:00
+Calculating bucket sizes
+Splitting and merging
+  Splitting and merging time: 00:00:00
+Avg bucket size: 756159 (target: 141779)
+Converting suffix-array elements to index image
+Allocating ftab, absorbFtab
+Entering Ebwt loop
+Getting block 1 of 1
+  No samples; assembling all-inclusive block
+  Sorting block of length 756159 for bucket 1
+  (Using difference cover)
+  Sorting block time: 00:00:00
+Returning block of 756160 for bucket 1
+Exited Ebwt loop
+fchr[A]: 0
+fchr[C]: 235897
+fchr[G]: 235897
+fchr[T]: 386401
+fchr[$]: 756159
+Exiting Ebwt::buildToDisk()
+Returning from initFromVector
+Wrote 4446745 bytes to primary EBWT file: BS_CT.rev.1.bt2
+Wrote 189044 bytes to secondary EBWT file: BS_CT.rev.2.bt2
+Re-opening _in1 and _in2 as input streams
+Returning from Ebwt constructor
+Headers:
+    len: 756159
+    bwtLen: 756160
+    sz: 189040
+    bwtSz: 189040
+    lineRate: 6
+    offRate: 4
+    offMask: 0xfffffff0
+    ftabChars: 10
+    eftabLen: 20
+    eftabSz: 80
+    ftabLen: 1048577
+    ftabSz: 4194308
+    offsLen: 47260
+    offsSz: 189040
+    lineSz: 64
+    sideSz: 64
+    sideBwtSz: 48
+    sideBwtLen: 192
+    numSides: 3939
+    numLines: 3939
+    ebwtTotLen: 252096
+    ebwtTotSz: 252096
+    color: 0
+    reverse: 1
+Total time for backward call to driver() for mirror index: 00:00:00
+Settings:
+  Output files: "BS_GA.*.bt2"
+  Line rate: 6 (line is 64 bytes)
+  Lines per side: 1 (side is 64 bytes)
+  Offset rate: 4 (one in 16)
+  FTable chars: 10
+  Strings: unpacked
+  Max bucket size: default
+  Max bucket size, sqrt multiplier: default
+  Max bucket size, len divisor: 4
+  Difference-cover sample period: 1024
+  Endianness: little
+  Actual local endianness: little
+  Sanity checking: disabled
+  Assertions: disabled
+  Random seed: 0
+  Sizeofs: void*:8, int:4, long:8, size_t:8
+Input files DNA, FASTA:
+  genome_mfa.GA_conversion.fa
+Building a SMALL index
+Reading reference sizes
+  Time reading reference sizes: 00:00:00
+Calculating joined length
+Writing header
+Reserving space for joined string
+Joining reference sequences
+  Time to join reference sequences: 00:00:00
+bmax according to bmaxDivN setting: 189039
+Using parameters --bmax 141780 --dcv 1024
+  Doing ahead-of-time memory usage test
+  Passed!  Constructing with these parameters: --bmax 141780 --dcv 1024
+Constructing suffix-array element generator
+Building DifferenceCoverSample
+  Building sPrime
+  Building sPrimeOrder
+  V-Sorting samples
+  V-Sorting samples time: 00:00:00
+  Allocating rank array
+  Ranking v-sort output
+  Ranking v-sort output time: 00:00:00
+  Invoking Larsson-Sadakane on ranks
+  Invoking Larsson-Sadakane on ranks time: 00:00:00
+  Sanity-checking and returning
+Building samples
+Reserving space for 12 sample suffixes
+Generating random suffixes
+QSorting 12 sample offsets, eliminating duplicates
+QSorting sample offsets, eliminating duplicates time: 00:00:00
+Multikey QSorting 12 samples
+  (Using difference cover)
+  Multikey QSorting samples time: 00:00:00
+Calculating bucket sizes
+Splitting and merging
+  Splitting and merging time: 00:00:00
+Avg bucket size: 756159 (target: 141779)
+Converting suffix-array elements to index image
+Allocating ftab, absorbFtab
+Entering Ebwt loop
+Getting block 1 of 1
+  No samples; assembling all-inclusive block
+  Sorting block of length 756159 for bucket 1
+  (Using difference cover)
+  Sorting block time: 00:00:01
+Returning block of 756160 for bucket 1
+Exited Ebwt loop
+fchr[A]: 0
+fchr[C]: 386401
+fchr[G]: 533276
+fchr[T]: 533276
+fchr[$]: 756159
+Exiting Ebwt::buildToDisk()
+Returning from initFromVector
+Wrote 4446745 bytes to primary EBWT file: BS_GA.1.bt2
+Wrote 189044 bytes to secondary EBWT file: BS_GA.2.bt2
+Re-opening _in1 and _in2 as input streams
+Returning from Ebwt constructor
+Headers:
+    len: 756159
+    bwtLen: 756160
+    sz: 189040
+    bwtSz: 189040
+    lineRate: 6
+    offRate: 4
+    offMask: 0xfffffff0
+    ftabChars: 10
+    eftabLen: 20
+    eftabSz: 80
+    ftabLen: 1048577
+    ftabSz: 4194308
+    offsLen: 47260
+    offsSz: 189040
+    lineSz: 64
+    sideSz: 64
+    sideBwtSz: 48
+    sideBwtLen: 192
+    numSides: 3939
+    numLines: 3939
+    ebwtTotLen: 252096
+    ebwtTotSz: 252096
+    color: 0
+    reverse: 0
+Total time for call to driver() for forward index: 00:00:01
+Reading reference sizes
+  Time reading reference sizes: 00:00:00
+Calculating joined length
+Writing header
+Reserving space for joined string
+Joining reference sequences
+  Time to join reference sequences: 00:00:00
+  Time to reverse reference sequence: 00:00:00
+bmax according to bmaxDivN setting: 189039
+Using parameters --bmax 141780 --dcv 1024
+  Doing ahead-of-time memory usage test
+  Passed!  Constructing with these parameters: --bmax 141780 --dcv 1024
+Constructing suffix-array element generator
+Building DifferenceCoverSample
+  Building sPrime
+  Building sPrimeOrder
+  V-Sorting samples
+  V-Sorting samples time: 00:00:00
+  Allocating rank array
+  Ranking v-sort output
+  Ranking v-sort output time: 00:00:00
+  Invoking Larsson-Sadakane on ranks
+  Invoking Larsson-Sadakane on ranks time: 00:00:00
+  Sanity-checking and returning
+Building samples
+Reserving space for 12 sample suffixes
+Generating random suffixes
+QSorting 12 sample offsets, eliminating duplicates
+QSorting sample offsets, eliminating duplicates time: 00:00:00
+Multikey QSorting 12 samples
+  (Using difference cover)
+  Multikey QSorting samples time: 00:00:00
+Calculating bucket sizes
+Splitting and merging
+  Splitting and merging time: 00:00:00
+Avg bucket size: 756159 (target: 141779)
+Converting suffix-array elements to index image
+Allocating ftab, absorbFtab
+Entering Ebwt loop
+Getting block 1 of 1
+  No samples; assembling all-inclusive block
+  Sorting block of length 756159 for bucket 1
+  (Using difference cover)
+  Sorting block time: 00:00:00
+Returning block of 756160 for bucket 1
+Exited Ebwt loop
+fchr[A]: 0
+fchr[C]: 386401
+fchr[G]: 533276
+fchr[T]: 533276
+fchr[$]: 756159
+Exiting Ebwt::buildToDisk()
+Returning from initFromVector
+Wrote 4446745 bytes to primary EBWT file: BS_GA.rev.1.bt2
+Wrote 189044 bytes to secondary EBWT file: BS_GA.rev.2.bt2
+Re-opening _in1 and _in2 as input streams
+Returning from Ebwt constructor
+Headers:
+    len: 756159
+    bwtLen: 756160
+    sz: 189040
+    bwtSz: 189040
+    lineRate: 6
+    offRate: 4
+    offMask: 0xfffffff0
+    ftabChars: 10
+    eftabLen: 20
+    eftabSz: 80
+    ftabLen: 1048577
+    ftabSz: 4194308
+    offsLen: 47260
+    offsSz: 189040
+    lineSz: 64
+    sideSz: 64
+    sideBwtSz: 48
+    sideBwtLen: 192
+    numSides: 3939
+    numLines: 3939
+    ebwtTotLen: 252096
+    ebwtTotSz: 252096
+    color: 0
+    reverse: 1
+Total time for backward call to driver() for mirror index: 00:00:00
+Running bismark with: 'bismark --bam --gzip --temp_dir /var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me -o /var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/results --quiet --fastq -L 20 -D 15 -R 2 --un --ambiguous /var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmp4_4hiluf /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmpywNSSM/files/000/dataset_2.dat'
+Path to Bowtie 2 specified as: bowtie2
+Bowtie seems to be working fine (tested command 'bowtie2 --version' [2.3.4])
+Output format is BAM (default)
+Alignments will be written out in BAM format. Samtools found here: '/Users/scholtalbers/miniconda3/envs/mulled-v1-7f230b3d24f9f00e91e72af479ffae49907f4592b1a7a4b05436e0a99567150a/bin/samtools'
+Reference genome folder provided is /var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmp4_4hiluf/	(absolute path is '/private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmp4_4hiluf/)'
+FastQ format specified
+
+Input files to be analysed (in current folder '/private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmpywNSSM/job_working_directory/000/3/working'):
+/private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmpywNSSM/files/000/dataset_2.dat
+Library is assumed to be strand-specific (directional), alignments to strands complementary to the original top or bottom strands will be ignored (i.e. not performed!)
+Created output directory /var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/results/!
+
+Output will be written into the directory: /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/results/
+
+Using temp directory: /var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me
+Temporary files will be written into the directory: /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/
+Setting parallelization to single-threaded (default)
+
+Current working directory is: /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmpywNSSM/job_working_directory/000/3/working
+
+Now reading in and storing sequence information of the genome specified in: /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmp4_4hiluf/
+
+chr chrY_JH584300_random (182347 bp)
+chr chrY_JH584301_random (259875 bp)
+chr chrY_JH584302_random (155838 bp)
+chr chrY_JH584303_random (158099 bp)
+
+Single-core mode: setting pid to 1
+
+Single-end alignments will be performed
+=======================================
+
+Input file is in FastQ format
+Writing a C -> T converted version of the input file dataset_2.dat to /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/dataset_2.dat_C_to_T.fastq.gz
+
+Created C -> T converted version of the FastQ file dataset_2.dat (44115 sequences in total)
+
+Input file is dataset_2.dat_C_to_T.fastq.gz (FastQ)
+
+Now running 2 instances of Bowtie 2 against the bisulfite genome of /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmp4_4hiluf/ with the specified options: -q -L 20 -D 15 -R 2 --score-min L,0,-0.2 --ignore-quals --quiet
+
+Now starting the Bowtie 2 aligner for CTreadCTgenome (reading in sequences from /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/dataset_2.dat_C_to_T.fastq.gz with options -q -L 20 -D 15 -R 2 --score-min L,0,-0.2 --ignore-quals --quiet --norc)
+Using Bowtie 2 index: /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmp4_4hiluf/Bisulfite_Genome/CT_conversion/BS_CT
+
+Found first alignment:	1_1	4	*	0	0	*	*	0	0	TTGTATATATTAGATAAATTAATTTTTTTTGTTTGTATGTTAAATTTTTTAATTAATTTATTAATATTTTGTGAATTTTTAGATA	AAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAEEAEEEEEE	YT:Z:UU
+Now starting the Bowtie 2 aligner for CTreadGAgenome (reading in sequences from /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/dataset_2.dat_C_to_T.fastq.gz with options -q -L 20 -D 15 -R 2 --score-min L,0,-0.2 --ignore-quals --quiet --nofw)
+Using Bowtie 2 index: /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmp4_4hiluf/Bisulfite_Genome/GA_conversion/BS_GA
+
+Found first alignment:	1_1	4	*	0	0	*	*	0	0	TTGTATATATTAGATAAATTAATTTTTTTTGTTTGTATGTTAAATTTTTTAATTAATTTATTAATATTTTGTGAATTTTTAGATA	AAAAAEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEAEEAEEEEEE	YT:Z:UU
+
+>>> Writing bisulfite mapping results to /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/results/dataset_2.dat_bismark_bt2.bam <<<
+
+Unmapped sequences will be written to /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/results/dataset_2.dat_unmapped_reads.fq.gz
+Ambiguously mapping sequences will be written to /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/results/dataset_2.dat_ambiguous_reads.fq.gz
+
+Reading in the sequence file /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmpywNSSM/files/000/dataset_2.dat
+Processed 44115 sequences in total
+
+
+Successfully deleted the temporary file /private/var/folders/cf/k7c5rjhj1sggk6x8z1jnw4b80000gp/T/tmprjiux3me/dataset_2.dat_C_to_T.fastq.gz
+
+Final Alignment report
+======================
+Sequences analysed in total:	44115
+Number of alignments with a unique best hit from the different alignments:	554
+Mapping efficiency:	1.3%
+
+Sequences with no alignments under any condition:	43115
+Sequences did not map uniquely:	446
+Sequences which were discarded because genomic sequence could not be extracted:	0
+
+Number of sequences with unique best (first) alignment came from the bowtie output:
+CT/CT:	230	((converted) top strand)
+CT/GA:	324	((converted) bottom strand)
+GA/CT:	0	(complementary to (converted) top strand)
+GA/GA:	0	(complementary to (converted) bottom strand)
+
+Number of alignments to (merely theoretical) complementary strands being rejected in total:	0
+
+Final Cytosine Methylation Report
+=================================
+Total number of C's analysed:	8563
+
+Total methylated C's in CpG context:	245
+Total methylated C's in CHG context:	51
+Total methylated C's in CHH context:	114
+Total methylated C's in Unknown context:	1
+
+Total unmethylated C's in CpG context:	133
+Total unmethylated C's in CHG context:	1762
+Total unmethylated C's in CHH context:	6258
+Total unmethylated C's in Unknown context:	5
+
+C methylated in CpG context:	64.8%
+C methylated in CHG context:	2.8%
+C methylated in CHH context:	1.8%
+C methylated in Unknown context (CN or CHN):	16.7%
+
+
+Bismark completed in 0d 0h 0m 8s
+
+====================
+Bismark run complete
+====================
+
--- a/tool_dependencies.xml	Sat May 06 13:18:09 2017 -0400
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,41 +0,0 @@
-<?xml version="1.0"?>
-<tool_dependency>
-	<!-- from test tool shed-->
-    <!--<package name="samtools" version="0.1.19">
-        <repository changeset_revision="a0ab0fae27e5" name="package_samtools_0_1_19" owner="iuc" toolshed="https://testtoolshed.g2.bx.psu.edu" />
-    </package>-->
-    <!--from main tool shed-->
-    <package name="samtools" version="0.1.19">
-        <repository changeset_revision="c9bd782f5342" name="package_samtools_0_1_19" owner="iuc" toolshed="https://toolshed.g2.bx.psu.edu" />
-    </package>
-    <package name="bowtie2" version="2.1.0">
-         <repository changeset_revision="017a00c265f1" name="package_bowtie2_2_1_0" owner="devteam" toolshed="https://toolshed.g2.bx.psu.edu" />
-     </package>
-    <!--<package name="bowtie2" version="2.1.0">
-        <install version="1.0">
-            <actions>
-                <action type="download_by_url">http://downloads.sourceforge.net/project/bowtie-bio/bowtie2/2.1.0/bowtie2-2.1.0-source.zip</action>
-                <action type="shell_command">make</action>
-                <action type="move_file">
-                    <source>bowtie2</source>
-                    <destination>$INSTALL_DIR/bin</destination>
-                </action>
-                <action type="move_file">
-                    <source>bowtie2-align</source>
-                    <destination>$INSTALL_DIR/bin</destination>
-                </action>
-                <action type="move_file">
-                    <source>bowtie2-build</source>
-                    <destination>$INSTALL_DIR/bin</destination>
-                </action>
-                <action type="shell_command">chmod +x $INSTALL_DIR/bin/bowtie2</action>
-                <action type="set_environment">
-                    <environment_variable action="prepend_to" name="PATH">$INSTALL_DIR/bin</environment_variable>
-                </action>
-            </actions>
-        </install>
-        <readme>
-Compiling bowtie2 requires zlib and libpthread to be present on your system.
-        </readme>
-    </package>-->
-</tool_dependency>